Contract 0xc150cbdDC5932258fAc768bEB4d2352D127039fd 1

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x694ccbc9ac47b8e44698e718fa6d521e12894084005f8eb26e812533690d94b5Withdraw651144812023-02-27 14:55:16207 days 17 hrs ago0xb07cc36fa7d15fe4eeb90e301f200c93b4f4e732 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.00003941 0.1
0x47e4ea6d935c819bd43e9c79789fa885e1bcd0b4989dcca9cfd433283c148883Withdraw644938392023-02-25 16:41:33209 days 16 hrs ago0x9e363a66866beff93a1268ce8311f7c08fdc0444 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000046 0.1
0x6ae301a26da22b6e4d196de28924fd33257c84076c6854d6f13b451bcff08a2eWithdraw638873812023-02-23 20:24:45211 days 12 hrs ago0x9f314b077f92dd74f9f3a1a65d3a7322773754ad IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.00008162 0.1
0x46176515ba4791646e9108abc3deff63d9f6850a40422892d7e33c82dc38a953Withdraw638873412023-02-23 20:24:35211 days 12 hrs ago0x9f314b077f92dd74f9f3a1a65d3a7322773754ad IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.00008316 0.1
0xc0803cffc11991f2329a589f4d1668072229b02ff37cb423a51f701fd46f18ddWithdraw516464912023-01-08 14:54:32257 days 17 hrs ago0x414017aa9b1180567fff3c352a240b2ebeb618ce IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.00002767 0.1
0x6a1478b4e27d95c3d9dc0cbffaf93ba6c07522223272da351c9b48d2f81888f5Withdraw259954272022-09-22 15:32:29365 days 17 hrs ago0xaf6b011e71fa58e04fa0e5473ad8031f1ac2a43e IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.00003367 0.1
0xdc305492e03938c2fbe34a951fec534be1e1713640955c71527b87378773aa3cWithdraw211624942022-08-24 14:49:30394 days 17 hrs ago0x9edc773e6b082cde832af5bd0913725d07daf9ac IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000053195146 ETH0.109050245
0xccafed6738498b4ecce4007ba49696f036210a571ac5ad0b00e183b7d20acc33Withdraw194560382022-08-05 13:05:48413 days 19 hrs ago0x8634b5534c29cbd1ceeddfd30721b95bff31202d IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000057512517 ETH0.118264051
0xf9da7e6a849e248c4a417a5050fa487093790ed597b4b030e4a29ed73dcc17d4Withdraw190090922022-07-31 6:34:29419 days 2 hrs ago0x3b138fc7ec06b2a44565994cfde5134a75915995 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000033241489 ETH0.075787917
0x2f671d3b37c66acc020788492f6c03c8a7e7c0f3b21ebb673a178cfcd50fa201Withdraw180442192022-07-19 19:43:36430 days 13 hrs ago0x04295a370a1470ddf2e08e0dfd87c8c56d60cbb6 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000164704939 ETH0.338656557
0x6e38df0d39186784b25fa41e2f955e43a5c3c23c09f4a1507a3250068820b670Withdraw152688112022-06-21 16:02:07458 days 16 hrs ago0x8d0de7df0e25e70017a666b5cd090a4055e13f83 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000151697231 ETH0.347690991
0xa0f33ec3ede34a65aeb61a994b2042be8e7c991118d48c1d4a89ebf44fc31236Withdraw152687992022-06-21 16:02:07458 days 16 hrs ago0x8d0de7df0e25e70017a666b5cd090a4055e13f83 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000151707314 ETH0.347690991
0xc1df4e490d472cfc90343b6b038aa0221f50a0b969e018d5919bfc4cbb685b9bWithdraw148979402022-06-17 13:30:52462 days 19 hrs ago0xeaef3312763673f96f54b22505241e1dbaf48cff IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000160400732 ETH0.328911772
0xfe4dd5add805cd07a36246caa008df961387c97bcfdb100d89eca16355b4d7fdWithdraw148607772022-06-17 4:38:58463 days 4 hrs ago0xf62919f79b7e37ba467072e13057a607d17b225e IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000173512047 ETH0.397671543
0x434cc4a7310348022f342391b178e6672e5adac0a43d519842bc2a45fabcd003Withdraw148607572022-06-17 4:38:57463 days 4 hrs ago0xf62919f79b7e37ba467072e13057a607d17b225e IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000193955148 ETH0.397671543
0xd6e9b5e5d0052e0333ca63f348bd76fef10b0ea249832ed2a78b2ce415161ee9Withdraw132201512022-05-29 17:42:46481 days 15 hrs ago0x55be24c9b88ae5d25d47d1bfe61a48463e058649 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000097654825 ETH0.201365932
0x9361b3d631f4f4a64fe2930525d1977abb3626f1c7860df0ebe61a7af2a7841fWithdraw123187032022-05-17 13:47:16493 days 18 hrs ago0xdc3b2dce95ebd1e7c18eaa37780d10d240146660 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000124870526 ETH0.256033327
0xcd1cffea457832318ddbb9b5502b83146c8c02cf4e91eb83ce5b6a69c92a9567Withdraw120882122022-05-15 0:06:17496 days 8 hrs ago0x06472a111d8e212c3f99bef3cd7880c1886cb9a9 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000177819937 ETH0.364575624
0xd622b212e4e53da7fe5705f0c5c9d752e59f34df2939cb51534492325d4666efWithdraw120023482022-05-13 20:26:22497 days 12 hrs ago0x01d26bc375b92bb08ad7522b51b1bac5a9d13a50 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000458982336 ETH0.943844899
0xd90127e6ccb3021f4939cfc688eb5b3724375a2a1d6491023f0b44a9c8c85eabWithdraw119331502022-05-12 19:51:21498 days 12 hrs ago0x60b8349170dbe1b5ae508d4b986171b5fb2070df IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.001206978776 ETH2.481315338
0xe5f995496a352cc67644b310be52f25ffd6b642383b99f10f0a1d9c3907ac809Withdraw117183952022-05-10 17:08:43500 days 15 hrs ago0x6cbc124e6cc101d082340f7a1381e5cf1a9f55a8 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000336763416 ETH0.694393354
0x1032e588f72aab01fe7d1550e6abd883ec30b43a9828d11ddcc0e6e2e022079aWithdraw116601792022-05-10 2:35:38501 days 6 hrs ago0x62fff30c4732f0b3b7da8177dc4168dabcd1868d IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000302947849 ETH0.694393354
0xeee097889093e50b55ed716a039e0bc53b7c4f7f60bb5221bd5e5e46d5d66693Withdraw115003222022-05-08 12:24:11502 days 20 hrs ago0x0567b5f386f968ed2c35f79579d2ecdc288e9e1e IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000137800708 ETH0.282544089
0xc60a9238c4689f5f4eb7003a4ef1393258dde67d8174b75956f96a21f3f3eeafWithdraw113930582022-05-07 7:28:20504 days 1 hr ago0xdc152aa3b4a53d0550752d50c868917dca49ef22 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.000160524128 ETH0.367873388
0xc0d0846e6cf96dbd0a53fefbca425216754ea4e23a1e40f32c87487f350218e9Withdraw113929622022-05-07 7:27:47504 days 1 hr ago0xdc152aa3b4a53d0550752d50c868917dca49ef22 IN  0xc150cbddc5932258fac768beb4d2352d127039fd0 ETH0.00017940339 ETH0.367873388
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x694ccbc9ac47b8e44698e718fa6d521e12894084005f8eb26e812533690d94b5651144812023-02-27 14:55:16207 days 17 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0x47e4ea6d935c819bd43e9c79789fa885e1bcd0b4989dcca9cfd433283c148883644938392023-02-25 16:41:33209 days 16 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0x6ae301a26da22b6e4d196de28924fd33257c84076c6854d6f13b451bcff08a2e638873812023-02-23 20:24:45211 days 12 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0x46176515ba4791646e9108abc3deff63d9f6850a40422892d7e33c82dc38a953638873412023-02-23 20:24:35211 days 12 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xc0803cffc11991f2329a589f4d1668072229b02ff37cb423a51f701fd46f18dd516464912023-01-08 14:54:32257 days 17 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0x6a1478b4e27d95c3d9dc0cbffaf93ba6c07522223272da351c9b48d2f81888f5259954272022-09-22 15:32:29365 days 17 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xdc305492e03938c2fbe34a951fec534be1e1713640955c71527b87378773aa3c211624942022-08-24 14:49:30394 days 17 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xccafed6738498b4ecce4007ba49696f036210a571ac5ad0b00e183b7d20acc33194560382022-08-05 13:05:48413 days 19 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xf9da7e6a849e248c4a417a5050fa487093790ed597b4b030e4a29ed73dcc17d4190090922022-07-31 6:34:29419 days 2 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0x2f671d3b37c66acc020788492f6c03c8a7e7c0f3b21ebb673a178cfcd50fa201180442192022-07-19 19:43:36430 days 13 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0x6e38df0d39186784b25fa41e2f955e43a5c3c23c09f4a1507a3250068820b670152688112022-06-21 16:02:07458 days 16 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xa0f33ec3ede34a65aeb61a994b2042be8e7c991118d48c1d4a89ebf44fc31236152687992022-06-21 16:02:07458 days 16 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xc1df4e490d472cfc90343b6b038aa0221f50a0b969e018d5919bfc4cbb685b9b148979402022-06-17 13:30:52462 days 19 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xfe4dd5add805cd07a36246caa008df961387c97bcfdb100d89eca16355b4d7fd148607772022-06-17 4:38:58463 days 4 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0x434cc4a7310348022f342391b178e6672e5adac0a43d519842bc2a45fabcd003148607572022-06-17 4:38:57463 days 4 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xd6e9b5e5d0052e0333ca63f348bd76fef10b0ea249832ed2a78b2ce415161ee9132201512022-05-29 17:42:46481 days 15 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0x9361b3d631f4f4a64fe2930525d1977abb3626f1c7860df0ebe61a7af2a7841f123187032022-05-17 13:47:16493 days 18 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xcd1cffea457832318ddbb9b5502b83146c8c02cf4e91eb83ce5b6a69c92a9567120882122022-05-15 0:06:17496 days 8 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xd622b212e4e53da7fe5705f0c5c9d752e59f34df2939cb51534492325d4666ef120023482022-05-13 20:26:22497 days 12 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xd90127e6ccb3021f4939cfc688eb5b3724375a2a1d6491023f0b44a9c8c85eab119331502022-05-12 19:51:21498 days 12 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xe5f995496a352cc67644b310be52f25ffd6b642383b99f10f0a1d9c3907ac809117183952022-05-10 17:08:43500 days 15 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0x1032e588f72aab01fe7d1550e6abd883ec30b43a9828d11ddcc0e6e2e022079a116601792022-05-10 2:35:38501 days 6 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xeee097889093e50b55ed716a039e0bc53b7c4f7f60bb5221bd5e5e46d5d66693115003222022-05-08 12:24:11502 days 20 hrs ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xc60a9238c4689f5f4eb7003a4ef1393258dde67d8174b75956f96a21f3f3eeaf113930582022-05-07 7:28:20504 days 1 hr ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
0xc0d0846e6cf96dbd0a53fefbca425216754ea4e23a1e40f32c87487f350218e9113929622022-05-07 7:27:47504 days 1 hr ago 0xc150cbddc5932258fac768beb4d2352d127039fd Sperax: SPA Token0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Staking

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, MIT license
File 1 of 7 : Staking.sol
pragma solidity 0.8.7;

import "ReentrancyGuard.sol";
import "Ownable.sol";
import "SafeERC20.sol";

contract Staking is Ownable, ReentrancyGuard {
    using SafeERC20 for IERC20;
    // 30 day, 6% APR; 60 days, 12% APR
    uint256[] public lockupPeriods = [30 days, 60 days];
    uint256[] public multipliers = [100, 200];
    uint256 public constant BASE_APR = 6; // represent in percent
    bool public allowStaking = true;

    address public immutable SPA;
    address public immutable rewardAccount;
    uint256 public immutable endTime;

    uint256 public totalStakedSPA;
    mapping(address => bool) public isRewardFrozen; // track if a user's reward is frozen due to malicious attempts

    struct DepositProof {
        uint256 amount;
        uint256 liability;
        uint256 startTime;
        uint256 expiryTime;
    }
    mapping(address => DepositProof[]) balances;

    /// Events
    event Staked(
        address indexed account,
        uint256 amount,
        uint256 totalStakedSPA
    );
    event Withdrawn(
        address indexed account,
        uint256 amount,
        uint256 totalStakedSPA
    );
    event WithdrawnWithPenalty(
        address indexed account,
        uint256 amount,
        uint256 totalStakedSPA
    );
    event RewardFrozen(address indexed account, bool status);
    event StakingEnabled(bool status);

    /**
     * @param _SPA Address of SPA contract
     * @param _rewardAccount Address of reward account
     * @param _endTime Time in seconds
     */
    constructor(
        address _SPA,
        address _rewardAccount,
        uint256 _endTime
    ) {
        assert(lockupPeriods.length == multipliers.length);
        require(_endTime != 0, "_endTime is zero");
        require(_SPA != address(0), "_SPA is zero address");
        require(_rewardAccount != address(0), "_rewardAccount is zero address");
        SPA = _SPA;
        rewardAccount = _rewardAccount;
        endTime = block.timestamp + _endTime;
    }

    /**
     * @dev get number of deposits for an account
     */
    function getNumDeposits(address account) external view returns (uint256) {
        return balances[account].length;
    }

    /**
     * @dev get N-th deposit for an account
     */
    function getDeposits(address account, uint256 index)
        external
        view
        returns (DepositProof memory)
    {
        return balances[account][index];
    }

    function getLiability(
        uint256 deposit,
        uint256 multiplier,
        uint256 lockupPeriod
    ) public view returns (uint256) {
        // calc liability
        return
            (deposit * BASE_APR * multiplier * lockupPeriod) /
            (1 days) /
            (100 * 100 * 365); // remember to div by 100 // remember to div by 100
    }

    function setRewardFrozen(address account, bool status) external onlyOwner {
        isRewardFrozen[account] = status;
        emit RewardFrozen(account, status);
    }

    /**
     * @dev allow owner to enable and disable staking.
     */
    function toggleStaking() external onlyOwner {
        allowStaking = !allowStaking;
        emit StakingEnabled(allowStaking);
    }

    function stake(uint256 amount, uint256 lockPeriod) external nonReentrant {
        require(amount > 0, "cannot stake 0"); // don't allow staking 0

        // check if staking is enabled
        require(allowStaking, "staking is disabled");

        // check whether lockTime passed the endTime or not
        require(
            block.timestamp + lockPeriod < endTime,
            "lockTime has passed endTime"
        );

        address account = _msgSender();
        uint256 multiplier = 0;
        for (uint256 i = 0; i < lockupPeriods.length; i++) {
            if (lockPeriod == lockupPeriods[i]) {
                multiplier = multipliers[i];
                break;
            }
        }
        require(multiplier > 0, "invalid lock period");

        uint256 liability = getLiability(amount, multiplier, lockPeriod);
        require(
            IERC20(SPA).balanceOf(rewardAccount) >= liability,
            "insufficient budget"
        );

        DepositProof memory deposit = DepositProof({
            amount: amount,
            liability: liability,
            startTime: block.timestamp,
            expiryTime: block.timestamp + lockPeriod
        });
        balances[account].push(deposit);

        totalStakedSPA += deposit.amount;

        // Transferring the spa amount from User -> contract
        IERC20(SPA).safeTransferFrom(account, address(this), amount);
        // Locking the liability amount in the contract
        IERC20(SPA).safeTransferFrom(rewardAccount, address(this), liability);

        emit Staked(account, amount, totalStakedSPA);
    }

    function withdraw(uint256 index) external nonReentrant {
        address account = _msgSender();
        require(index < balances[account].length, "invalid account or index");
        DepositProof memory deposit = balances[account][index];
        require(deposit.expiryTime <= block.timestamp, "not expired");

        // destroy deposit by:
        // replacing index with last one, and pop out the last element
        uint256 last = balances[account].length;
        balances[account][index] = balances[account][last - 1];
        balances[account].pop();

        totalStakedSPA -= deposit.amount;

        if (!isRewardFrozen[account]) {
            uint256 withdrawAmount = deposit.liability + deposit.amount;
            // Transfer the amount and reward to account
            IERC20(SPA).safeTransfer(account, withdrawAmount);
            emit Withdrawn(account, withdrawAmount, totalStakedSPA);
        } else {
            // user forfeits reward and reward is sent to reward pool
            IERC20(SPA).safeTransfer(rewardAccount, deposit.liability);
            IERC20(SPA).safeTransfer(account, deposit.amount);
            emit WithdrawnWithPenalty(account, deposit.amount, totalStakedSPA);
        }
    }
}

File 2 of 7 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 3 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "Context.sol";

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

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 4 of 7 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 5 of 7 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "IERC20.sol";
import "Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 6 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 7 of 7 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @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) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @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].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

Settings
{
  "evmVersion": "istanbul",
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "libraries": {
    "Staking.sol": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_SPA","type":"address"},{"internalType":"address","name":"_rewardAccount","type":"address"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"RewardFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStakedSPA","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"StakingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStakedSPA","type":"uint256"}],"name":"Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStakedSPA","type":"uint256"}],"name":"WithdrawnWithPenalty","type":"event"},{"inputs":[],"name":"BASE_APR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SPA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getDeposits","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"liability","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"expiryTime","type":"uint256"}],"internalType":"struct Staking.DepositProof","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"multiplier","type":"uint256"},{"internalType":"uint256","name":"lockupPeriod","type":"uint256"}],"name":"getLiability","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNumDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isRewardFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockupPeriods","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multipliers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setRewardFrozen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockPeriod","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStakedSPA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61012060405262278d0060e0908152624f1a006101005262000025906002908162000227565b50604080518082019091526064815260c860208201526200004b9060039060026200027e565b506004805460ff191660011790553480156200006657600080fd5b50604051620018a0380380620018a08339810160408190526200008991620002f5565b6200009433620001d7565b6001805560035460025414620000ae57620000ae6200035d565b80620000f45760405162461bcd60e51b815260206004820152601060248201526f5f656e6454696d65206973207a65726f60801b60448201526064015b60405180910390fd5b6001600160a01b0383166200014c5760405162461bcd60e51b815260206004820152601460248201527f5f535041206973207a65726f20616464726573730000000000000000000000006044820152606401620000eb565b6001600160a01b038216620001a45760405162461bcd60e51b815260206004820152601e60248201527f5f7265776172644163636f756e74206973207a65726f206164647265737300006044820152606401620000eb565b6001600160601b0319606084811b821660805283901b1660a052620001ca814262000336565b60c0525062000373915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280548282559060005260206000209081019282156200026c579160200282015b828111156200026c578251829062ffffff1690559160200191906001019062000248565b506200027a929150620002c1565b5090565b8280548282559060005260206000209081019282156200026c579160200282015b828111156200026c578251829060ff169055916020019190600101906200029f565b5b808211156200027a5760008155600101620002c2565b80516001600160a01b0381168114620002f057600080fd5b919050565b6000806000606084860312156200030b57600080fd5b6200031684620002d8565b92506200032660208501620002d8565b9150604084015190509250925092565b600082198211156200035857634e487b7160e01b600052601160045260246000fd5b500190565b634e487b7160e01b600052600160045260246000fd5b60805160601c60a05160601c60c0516114b1620003ef600039600081816101b801526109e301526000818161012b0152818161077e01528181610b2f0152610d1f0152600081816101fa015281816106cd0152818161075b015281816107b301528181610b5c01528181610cc80152610cfd01526114b16000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063758f857e116100ad578063e4fd18c911610071578063e4fd18c9146102b7578063e62f9814146102bf578063edc7c00f146102cc578063f2fde38b146102d5578063f5b842f7146102e857600080fd5b8063758f857e146102245780637b0472f0146102575780638da5cb5b1461026a578063ac7fc2631461027b578063d6e91e911461028e57600080fd5b80633197cbb6116100f45780633197cbb6146101b35780633b8105b3146101da578063492723ff146101e2578063538daac4146101f5578063715018a61461021c57600080fd5b80630e70820314610126578063128163ce1461016a5780632cc4100f1461017f5780632e1a7d4d146101a0575b600080fd5b61014d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61017d6101783660046111f2565b61032e565b005b61019261018d3660046112c4565b6103c0565b604051908152602001610161565b61017d6101ae366004611270565b610409565b6101927f000000000000000000000000000000000000000000000000000000000000000081565b61017d610835565b6101926101f0366004611270565b6108ac565b61014d7f000000000000000000000000000000000000000000000000000000000000000081565b61017d6108cd565b6102476102323660046111d7565b60066020526000908152604090205460ff1681565b6040519015158152602001610161565b61017d6102653660046112a2565b610903565b6000546001600160a01b031661014d565b610192610289366004611270565b610d9f565b61019261029c3660046111d7565b6001600160a01b031660009081526007602052604090205490565b610192600681565b6004546102479060ff1681565b61019260055481565b61017d6102e33660046111d7565b610daf565b6102fb6102f6366004611229565b610e4a565b60405161016191908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b6000546001600160a01b031633146103615760405162461bcd60e51b81526004016103589061133f565b60405180910390fd5b6001600160a01b038216600081815260066020908152604091829020805460ff191685151590811790915591519182527f0d2452eed2b03b7a5701af17cf2f35c3fadb6aebe469265838e90121c51fbdd0910160405180910390a25050565b60006237b1d06201518083856103d76006896113ae565b6103e191906113ae565b6103eb91906113ae565b6103f5919061138c565b6103ff919061138c565b90505b9392505050565b6002600154141561045c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610358565b60026001553360008181526007602052604090205482106104bf5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206163636f756e74206f7220696e64657800000000000000006044820152606401610358565b6001600160a01b03811660009081526007602052604081208054849081106104e9576104e9611457565b90600052602060002090600402016040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050428160600151111561056e5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08195e1c1a5c995960aa1b6044820152606401610358565b6001600160a01b03821660009081526007602052604090208054906105946001836113cd565b815481106105a4576105a4611457565b906000526020600020906004020160076000856001600160a01b03166001600160a01b0316815260200190815260200160002085815481106105e8576105e8611457565b600091825260208083208454600490930201918255600180850154908301556002808501549083015560039384015493909101929092556001600160a01b038516815260079091526040902080548061064357610643611441565b60008281526020812060046000199093019283020181815560018101829055600281018290556003018190559155825160058054919290916106869084906113cd565b90915550506001600160a01b03831660009081526006602052604090205460ff1661074857815160208301516000916106be91611374565b90506106f46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168583610ee8565b836001600160a01b03167f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc68260055460405161073a929190918252602082015260400190565b60405180910390a25061082b565b60208201516107a3906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016907f000000000000000000000000000000000000000000000000000000000000000090610ee8565b81516107db906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016908590610ee8565b81516005546040516001600160a01b038616927f6002ec7d95fce40d3191d1d43a8cd07b01555ece987f53ea3244337fcba89ab59261082292918252602082015260400190565b60405180910390a25b5050600180555050565b6000546001600160a01b0316331461085f5760405162461bcd60e51b81526004016103589061133f565b6004805460ff8082161560ff1990921682179092556040519116151581527f280cb161002275204369941f9802ee155e35a137f91f719acae275cbed8a50929060200160405180910390a1565b600281815481106108bc57600080fd5b600091825260209091200154905081565b6000546001600160a01b031633146108f75760405162461bcd60e51b81526004016103589061133f565b6109016000610f50565b565b600260015414156109565760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610358565b6002600155816109995760405162461bcd60e51b815260206004820152600e60248201526d063616e6e6f74207374616b6520360941b6044820152606401610358565b60045460ff166109e15760405162461bcd60e51b81526020600482015260136024820152721cdd185ada5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610358565b7f0000000000000000000000000000000000000000000000000000000000000000610a0c8242611374565b10610a595760405162461bcd60e51b815260206004820152601b60248201527f6c6f636b54696d65206861732070617373656420656e6454696d6500000000006044820152606401610358565b336000805b600254811015610ac45760028181548110610a7b57610a7b611457565b9060005260206000200154841415610ab25760038181548110610aa057610aa0611457565b90600052602060002001549150610ac4565b80610abc81611410565b915050610a5e565b5060008111610b0b5760405162461bcd60e51b81526020600482015260136024820152721a5b9d985b1a59081b1bd8dac81c195c9a5bd9606a1b6044820152606401610358565b6000610b188583866103c0565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015291925082917f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b158015610b9e57600080fd5b505afa158015610bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd69190611289565b1015610c1a5760405162461bcd60e51b81526020600482015260136024820152721a5b9cdd59999a58da595b9d08189d5919d95d606a1b6044820152606401610358565b600060405180608001604052808781526020018381526020014281526020018642610c459190611374565b90526001600160a01b0385166000908152600760209081526040808320805460018181018355918552838520865160049092020181815593860151918401919091559084015160028301556060840151600390920191909155600580549394509092909190610cb5908490611374565b90915550610cf090506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016853089610fa0565b610d456001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000003085610fa0565b836001600160a01b03167f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9087600554604051610d8b929190918252602082015260400190565b60405180910390a250506001805550505050565b600381815481106108bc57600080fd5b6000546001600160a01b03163314610dd95760405162461bcd60e51b81526004016103589061133f565b6001600160a01b038116610e3e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610358565b610e4781610f50565b50565b610e756040518060800160405280600081526020016000815260200160008152602001600081525090565b6001600160a01b0383166000908152600760205260409020805483908110610e9f57610e9f611457565b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905092915050565b6040516001600160a01b038316602482015260448101829052610f4b90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610fde565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052610fd89085906323b872dd60e01b90608401610f14565b50505050565b6000611033826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166110b09092919063ffffffff16565b805190915015610f4b57808060200190518101906110519190611253565b610f4b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610358565b60606103ff848460008585843b6111095760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610358565b600080866001600160a01b0316858760405161112591906112f0565b60006040518083038185875af1925050503d8060008114611162576040519150601f19603f3d011682016040523d82523d6000602084013e611167565b606091505b5091509150611177828286611182565b979650505050505050565b60608315611191575081610402565b8251156111a15782518084602001fd5b8160405162461bcd60e51b8152600401610358919061130c565b80356001600160a01b03811681146111d257600080fd5b919050565b6000602082840312156111e957600080fd5b610402826111bb565b6000806040838503121561120557600080fd5b61120e836111bb565b9150602083013561121e8161146d565b809150509250929050565b6000806040838503121561123c57600080fd5b611245836111bb565b946020939093013593505050565b60006020828403121561126557600080fd5b81516104028161146d565b60006020828403121561128257600080fd5b5035919050565b60006020828403121561129b57600080fd5b5051919050565b600080604083850312156112b557600080fd5b50508035926020909101359150565b6000806000606084860312156112d957600080fd5b505081359360208301359350604090920135919050565b600082516113028184602087016113e4565b9190910192915050565b602081526000825180602084015261132b8160408501602087016113e4565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156113875761138761142b565b500190565b6000826113a957634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156113c8576113c861142b565b500290565b6000828210156113df576113df61142b565b500390565b60005b838110156113ff5781810151838201526020016113e7565b83811115610fd85750506000910152565b60006000198214156114245761142461142b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b8015158114610e4757600080fdfea264697066735822122080994cb32755e354e911e7b135b573f00091bd27e44e86476dc9987963cb15f364736f6c634300080700330000000000000000000000005575552988a3a80504bbaeb1311674fcfd40ad4b000000000000000000000000852aff031bb282c054b26628a799d7f3a896873e000000000000000000000000000000000000000000000000000000000062e080

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

0000000000000000000000005575552988a3a80504bbaeb1311674fcfd40ad4b000000000000000000000000852aff031bb282c054b26628a799d7f3a896873e000000000000000000000000000000000000000000000000000000000062e080

-----Decoded View---------------
Arg [0] : _SPA (address): 0x5575552988a3a80504bbaeb1311674fcfd40ad4b
Arg [1] : _rewardAccount (address): 0x852aff031bb282c054b26628a799d7f3a896873e
Arg [2] : _endTime (uint256): 6480000

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000005575552988a3a80504bbaeb1311674fcfd40ad4b
Arg [1] : 000000000000000000000000852aff031bb282c054b26628a799d7f3a896873e
Arg [2] : 000000000000000000000000000000000000000000000000000000000062e080


Deployed ByteCode Sourcemap

101:5882:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;466:38;;;;;;;;-1:-1:-1;;;;;2603:32:7;;;2585:51;;2573:2;2558:18;466:38:6;;;;;;;;2782:167;;;;;;:::i;:::-;;:::i;:::-;;2418:358;;;;;;:::i;:::-;;:::i;:::-;;;9209:25:7;;;9197:2;9182:18;2418:358:6;9063:177:7;4758:1223:6;;;;;;:::i;:::-;;:::i;510:32::-;;;;;3026:132;;;:::i;224:51::-;;;;;;:::i;:::-;;:::i;432:28::-;;;;;1659:101:3;;;:::i;584:46:6:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3471:14:7;;3464:22;3446:41;;3434:2;3419:18;584:46:6;3306:187:7;3164:1588:6;;;;;;:::i;:::-;;:::i;1027:85:3:-;1073:7;1099:6;-1:-1:-1;;;;;1099:6:3;1027:85;;281:41:6;;;;;;:::i;:::-;;:::i;2052:121::-;;;;;;:::i;:::-;-1:-1:-1;;;;;2142:17:6;2116:7;2142:17;;;:8;:17;;;;;:24;;2052:121;328:36;;363:1;328:36;;394:31;;;;;;;;;549:29;;;;;;1909:198:3;;;;;;:::i;:::-;;:::i;2239:173:6:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;8849:13:7;;8831:32;;8919:4;8907:17;;;8901:24;8879:20;;;8872:54;8982:4;8970:17;;;8964:24;8942:20;;;8935:54;9045:4;9033:17;;;9027:24;9005:20;;;8998:54;;;;8818:3;8803:19;;8626:432;2782:167:6;1073:7:3;1099:6;-1:-1:-1;;;;;1099:6:3;719:10:1;1239:23:3;1231:68;;;;-1:-1:-1;;;1231:68:3;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;2866:23:6;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;;:32;;-1:-1:-1;;2866:32:6::1;::::0;::::1;;::::0;;::::1;::::0;;;2913:29;;3446:41:7;;;2913:29:6::1;::::0;3419:18:7;2913:29:6::1;;;;;;;2782:167:::0;;:::o;2418:358::-;2550:7;2701:15;2678:6;2649:12;2636:10;2615:18;363:1;2615:7;:18;:::i;:::-;:31;;;;:::i;:::-;:46;;;;:::i;:::-;2614:71;;;;:::i;:::-;:103;;;;:::i;:::-;2595:122;;2418:358;;;;;;:::o;4758:1223::-;1744:1:4;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:4;;8468:2:7;2317:63:4;;;8450:21:7;8507:2;8487:18;;;8480:30;8546:33;8526:18;;;8519:61;8597:18;;2317:63:4;8266:355:7;2317:63:4;1744:1;2455:7;:18;719:10:1;4823:15:6::1;4879:17:::0;;;:8:::1;:17;::::0;;;;:24;4871:32;::::1;4863:69;;;::::0;-1:-1:-1;;;4863:69:6;;6294:2:7;4863:69:6::1;::::0;::::1;6276:21:7::0;6333:2;6313:18;;;6306:30;6372:26;6352:18;;;6345:54;6416:18;;4863:69:6::1;6092:348:7::0;4863:69:6::1;-1:-1:-1::0;;;;;4972:17:6;::::1;4942:27;4972:17:::0;;;:8:::1;:17;::::0;;;;:24;;4990:5;;4972:24;::::1;;;;;:::i;:::-;;;;;;;;;;;4942:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;5036:15;5014:7;:18;;;:37;;5006:61;;;::::0;-1:-1:-1;;;5006:61:6;;4843:2:7;5006:61:6::1;::::0;::::1;4825:21:7::0;4882:2;4862:18;;;4855:30;-1:-1:-1;;;4901:18:7;;;4894:41;4952:18;;5006:61:6::1;4641:335:7::0;5006:61:6::1;-1:-1:-1::0;;;;;5195:17:6;::::1;5180:12;5195:17:::0;;;:8:::1;:17;::::0;;;;:24;;;5274:8:::1;5281:1;5195:24:::0;5274:8:::1;:::i;:::-;5256:27;;;;;;;;:::i;:::-;;;;;;;;;;;5229:8;:17;5238:7;-1:-1:-1::0;;;;;5229:17:6::1;-1:-1:-1::0;;;;;5229:17:6::1;;;;;;;;;;;;5247:5;5229:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:54;;:24:::1;::::0;;::::1;;:54:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;;-1:-1:-1;;;;;5293:17:6;::::1;::::0;;:8:::1;:17:::0;;;;;;:23;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;5293:23:6;;;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;;5345:14;;5327::::1;:32:::0;;5345:14;;5327;;:32:::1;::::0;5345:14;;5327:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;5375:23:6;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;5370:605;;5459:14:::0;;5439:17:::1;::::0;::::1;::::0;5414:22:::1;::::0;5439:34:::1;::::0;::::1;:::i;:::-;5414:59:::0;-1:-1:-1;5544:49:6::1;-1:-1:-1::0;;;;;5551:3:6::1;5544:24;5569:7:::0;5414:59;5544:24:::1;:49::i;:::-;5622:7;-1:-1:-1::0;;;;;5612:50:6::1;;5631:14;5647;;5612:50;;;;;;9419:25:7::0;;;9475:2;9460:18;;9453:34;9407:2;9392:18;;9245:248;5612:50:6::1;;;;;;;;5400:273;5370:605;;;5803:17;::::0;::::1;::::0;5763:58:::1;::::0;-1:-1:-1;;;;;5770:3:6::1;5763:24;::::0;5788:13:::1;::::0;5763:24:::1;:58::i;:::-;5869:14:::0;;5835:49:::1;::::0;-1:-1:-1;;;;;5842:3:6::1;5835:24;::::0;5860:7;;5835:24:::1;:49::i;:::-;5933:14:::0;;5949::::1;::::0;5903:61:::1;::::0;-1:-1:-1;;;;;5903:61:6;::::1;::::0;::::1;::::0;::::1;::::0;9419:25:7;;;9475:2;9460:18;;9453:34;9407:2;9392:18;;9245:248;5903:61:6::1;;;;;;;;5370:605;-1:-1:-1::0;;1701:1:4;2628:22;;-1:-1:-1;;4758:1223:6:o;3026:132::-;1073:7:3;1099:6;-1:-1:-1;;;;;1099:6:3;719:10:1;1239:23:3;1231:68;;;;-1:-1:-1;;;1231:68:3;;;;;;;:::i;:::-;3096:12:6::1;::::0;;::::1;::::0;;::::1;3095:13;-1:-1:-1::0;;3080:28:6;;::::1;::::0;::::1;::::0;;;3123::::1;::::0;3138:12;;3471:14:7;3464:22;3446:41;;3123:28:6::1;::::0;3434:2:7;3419:18;3123:28:6::1;;;;;;;3026:132::o:0;224:51::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;224:51:6;:::o;1659:101:3:-;1073:7;1099:6;-1:-1:-1;;;;;1099:6:3;719:10:1;1239:23:3;1231:68;;;;-1:-1:-1;;;1231:68:3;;;;;;;:::i;:::-;1723:30:::1;1750:1;1723:18;:30::i;:::-;1659:101::o:0;3164:1588:6:-;1744:1:4;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:4;;8468:2:7;2317:63:4;;;8450:21:7;8507:2;8487:18;;;8480:30;8546:33;8526:18;;;8519:61;8597:18;;2317:63:4;8266:355:7;2317:63:4;1744:1;2455:7;:18;3255:10:6;3247:37:::1;;;::::0;-1:-1:-1;;;3247:37:6;;7356:2:7;3247:37:6::1;::::0;::::1;7338:21:7::0;7395:2;7375:18;;;7368:30;-1:-1:-1;;;7414:18:7;;;7407:44;7468:18;;3247:37:6::1;7154:338:7::0;3247:37:6::1;3367:12;::::0;::::1;;3359:44;;;::::0;-1:-1:-1;;;3359:44:6;;4088:2:7;3359:44:6::1;::::0;::::1;4070:21:7::0;4127:2;4107:18;;;4100:30;-1:-1:-1;;;4146:18:7;;;4139:49;4205:18;;3359:44:6::1;3886:343:7::0;3359:44:6::1;3526:7;3495:28;3513:10:::0;3495:15:::1;:28;:::i;:::-;:38;3474:112;;;::::0;-1:-1:-1;;;3474:112:6;;5183:2:7;3474:112:6::1;::::0;::::1;5165:21:7::0;5222:2;5202:18;;;5195:30;5261:29;5241:18;;;5234:57;5308:18;;3474:112:6::1;4981:351:7::0;3474:112:6::1;719:10:1::0;3597:15:6::1;::::0;3669:194:::1;3693:13;:20:::0;3689:24;::::1;3669:194;;;3752:13;3766:1;3752:16;;;;;;;;:::i;:::-;;;;;;;;;3738:10;:30;3734:119;;;3801:11;3813:1;3801:14;;;;;;;;:::i;:::-;;;;;;;;;3788:27;;3833:5;;3734:119;3715:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3669:194;;;;3893:1;3880:10;:14;3872:46;;;::::0;-1:-1:-1;;;3872:46:6;;5539:2:7;3872:46:6::1;::::0;::::1;5521:21:7::0;5578:2;5558:18;;;5551:30;-1:-1:-1;;;5597:18:7;;;5590:49;5656:18;;3872:46:6::1;5337:343:7::0;3872:46:6::1;3929:17;3949:44;3962:6;3970:10;3982;3949:12;:44::i;:::-;4024:36;::::0;-1:-1:-1;;;4024:36:6;;-1:-1:-1;;;;;4046:13:6::1;2603:32:7::0;;4024:36:6::1;::::0;::::1;2585:51:7::0;3929:64:6;;-1:-1:-1;3929:64:6;;4031:3:::1;4024:21;::::0;::::1;::::0;2558:18:7;;4024:36:6::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;4003:115;;;::::0;-1:-1:-1;;;4003:115:6;;6647:2:7;4003:115:6::1;::::0;::::1;6629:21:7::0;6686:2;6666:18;;;6659:30;-1:-1:-1;;;6705:18:7;;;6698:49;6764:18;;4003:115:6::1;6445:343:7::0;4003:115:6::1;4129:27;4159:180;;;;;;;;4194:6;4159:180;;;;4225:9;4159:180;;;;4259:15;4159:180;;;;4318:10;4300:15;:28;;;;:::i;:::-;4159:180:::0;;-1:-1:-1;;;;;4349:17:6;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;:31;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;4391:14:::1;:32:::0;;4129:210;;-1:-1:-1;4349:31:6;;4391:14;;4349:17;4391:32:::1;::::0;4349:31;;4391:32:::1;:::i;:::-;::::0;;;-1:-1:-1;4495:60:6::1;::::0;-1:-1:-1;;;;;;4502:3:6::1;4495:28;4524:7:::0;4541:4:::1;4548:6:::0;4495:28:::1;:60::i;:::-;4621:69;-1:-1:-1::0;;;;;4628:3:6::1;4621:28;4650:13;4673:4;4680:9:::0;4621:28:::1;:69::i;:::-;4713:7;-1:-1:-1::0;;;;;4706:39:6::1;;4722:6;4730:14;;4706:39;;;;;;9419:25:7::0;;;9475:2;9460:18;;9453:34;9407:2;9392:18;;9245:248;4706:39:6::1;;;;;;;;-1:-1:-1::0;;1701:1:4;2628:22;;-1:-1:-1;;;;3164:1588:6:o;281:41::-;;;;;;;;;;;;1909:198:3;1073:7;1099:6;-1:-1:-1;;;;;1099:6:3;719:10:1;1239:23:3;1231:68;;;;-1:-1:-1;;;1231:68:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;1997:22:3;::::1;1989:73;;;::::0;-1:-1:-1;;;1989:73:3;;4436:2:7;1989:73:3::1;::::0;::::1;4418:21:7::0;4475:2;4455:18;;;4448:30;4514:34;4494:18;;;4487:62;-1:-1:-1;;;4565:18:7;;;4558:36;4611:19;;1989:73:3::1;4234:402:7::0;1989:73:3::1;2072:28;2091:8;2072:18;:28::i;:::-;1909:198:::0;:::o;2239:173:6:-;2339:19;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2339:19:6;-1:-1:-1;;;;;2381:17:6;;;;;;:8;:17;;;;;:24;;2399:5;;2381:24;;;;;;:::i;:::-;;;;;;;;;;;2374:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2239:173;;;;:::o;683:205:5:-;822:58;;-1:-1:-1;;;;;3219:32:7;;822:58:5;;;3201:51:7;3268:18;;;3261:34;;;795:86:5;;815:5;;-1:-1:-1;;;845:23:5;3174:18:7;;822:58:5;;;;-1:-1:-1;;822:58:5;;;;;;;;;;;;;;-1:-1:-1;;;;;822:58:5;-1:-1:-1;;;;;;822:58:5;;;;;;;;;;795:19;:86::i;:::-;683:205;;;:::o;2261:187:3:-;2334:16;2353:6;;-1:-1:-1;;;;;2369:17:3;;;-1:-1:-1;;;;;;2369:17:3;;;;;;2401:40;;2353:6;;;;;;;2401:40;;2334:16;2401:40;2324:124;2261:187;:::o;894:241:5:-;1059:68;;-1:-1:-1;;;;;2905:15:7;;;1059:68:5;;;2887:34:7;2957:15;;2937:18;;;2930:43;2989:18;;;2982:34;;;1032:96:5;;1052:5;;-1:-1:-1;;;1082:27:5;2822:18:7;;1059:68:5;2647:375:7;1032:96:5;894:241;;;;:::o;3189:706::-;3608:23;3634:69;3662:4;3634:69;;;;;;;;;;;;;;;;;3642:5;-1:-1:-1;;;;;3634:27:5;;;:69;;;;;:::i;:::-;3717:17;;3608:95;;-1:-1:-1;3717:21:5;3713:176;;3812:10;3801:30;;;;;;;;;;;;:::i;:::-;3793:85;;;;-1:-1:-1;;;3793:85:5;;8057:2:7;3793:85:5;;;8039:21:7;8096:2;8076:18;;;8069:30;8135:34;8115:18;;;8108:62;-1:-1:-1;;;8186:18:7;;;8179:40;8236:19;;3793:85:5;7855:406:7;3514:223:0;3647:12;3678:52;3700:6;3708:4;3714:1;3717:12;3647;1087:20;;4881:60;;;;-1:-1:-1;;;4881:60:0;;7699:2:7;4881:60:0;;;7681:21:7;7738:2;7718:18;;;7711:30;7777:31;7757:18;;;7750:59;7826:18;;4881:60:0;7497:353:7;4881:60:0;4953:12;4967:23;4994:6;-1:-1:-1;;;;;4994:11:0;5013:5;5020:4;4994:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4952:73;;;;5042:51;5059:7;5068:10;5080:12;5042:16;:51::i;:::-;5035:58;4601:499;-1:-1:-1;;;;;;;4601:499:0:o;7214:692::-;7360:12;7388:7;7384:516;;;-1:-1:-1;7418:10:0;7411:17;;7384:516;7529:17;;:21;7525:365;;7723:10;7717:17;7783:15;7770:10;7766:2;7762:19;7755:44;7525:365;7862:12;7855:20;;-1:-1:-1;;;7855:20:0;;;;;;;;:::i;14:173:7:-;82:20;;-1:-1:-1;;;;;131:31:7;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:315::-;448:6;456;509:2;497:9;488:7;484:23;480:32;477:52;;;525:1;522;515:12;477:52;548:29;567:9;548:29;:::i;:::-;538:39;;627:2;616:9;612:18;599:32;640:28;662:5;640:28;:::i;:::-;687:5;677:15;;;383:315;;;;;:::o;703:254::-;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;871:29;890:9;871:29;:::i;:::-;861:39;947:2;932:18;;;;919:32;;-1:-1:-1;;;703:254:7:o;962:245::-;1029:6;1082:2;1070:9;1061:7;1057:23;1053:32;1050:52;;;1098:1;1095;1088:12;1050:52;1130:9;1124:16;1149:28;1171:5;1149:28;:::i;1212:180::-;1271:6;1324:2;1312:9;1303:7;1299:23;1295:32;1292:52;;;1340:1;1337;1330:12;1292:52;-1:-1:-1;1363:23:7;;1212:180;-1:-1:-1;1212:180:7:o;1397:184::-;1467:6;1520:2;1508:9;1499:7;1495:23;1491:32;1488:52;;;1536:1;1533;1526:12;1488:52;-1:-1:-1;1559:16:7;;1397:184;-1:-1:-1;1397:184:7:o;1586:248::-;1654:6;1662;1715:2;1703:9;1694:7;1690:23;1686:32;1683:52;;;1731:1;1728;1721:12;1683:52;-1:-1:-1;;1754:23:7;;;1824:2;1809:18;;;1796:32;;-1:-1:-1;1586:248:7:o;1839:316::-;1916:6;1924;1932;1985:2;1973:9;1964:7;1960:23;1956:32;1953:52;;;2001:1;1998;1991:12;1953:52;-1:-1:-1;;2024:23:7;;;2094:2;2079:18;;2066:32;;-1:-1:-1;2145:2:7;2130:18;;;2117:32;;1839:316;-1:-1:-1;1839:316:7:o;2160:274::-;2289:3;2327:6;2321:13;2343:53;2389:6;2384:3;2377:4;2369:6;2365:17;2343:53;:::i;:::-;2412:16;;;;;2160:274;-1:-1:-1;;2160:274:7:o;3498:383::-;3647:2;3636:9;3629:21;3610:4;3679:6;3673:13;3722:6;3717:2;3706:9;3702:18;3695:34;3738:66;3797:6;3792:2;3781:9;3777:18;3772:2;3764:6;3760:15;3738:66;:::i;:::-;3865:2;3844:15;-1:-1:-1;;3840:29:7;3825:45;;;;3872:2;3821:54;;3498:383;-1:-1:-1;;3498:383:7:o;6793:356::-;6995:2;6977:21;;;7014:18;;;7007:30;7073:34;7068:2;7053:18;;7046:62;7140:2;7125:18;;6793:356::o;9498:128::-;9538:3;9569:1;9565:6;9562:1;9559:13;9556:39;;;9575:18;;:::i;:::-;-1:-1:-1;9611:9:7;;9498:128::o;9631:217::-;9671:1;9697;9687:132;;9741:10;9736:3;9732:20;9729:1;9722:31;9776:4;9773:1;9766:15;9804:4;9801:1;9794:15;9687:132;-1:-1:-1;9833:9:7;;9631:217::o;9853:168::-;9893:7;9959:1;9955;9951:6;9947:14;9944:1;9941:21;9936:1;9929:9;9922:17;9918:45;9915:71;;;9966:18;;:::i;:::-;-1:-1:-1;10006:9:7;;9853:168::o;10026:125::-;10066:4;10094:1;10091;10088:8;10085:34;;;10099:18;;:::i;:::-;-1:-1:-1;10136:9:7;;10026:125::o;10156:258::-;10228:1;10238:113;10252:6;10249:1;10246:13;10238:113;;;10328:11;;;10322:18;10309:11;;;10302:39;10274:2;10267:10;10238:113;;;10369:6;10366:1;10363:13;10360:48;;;-1:-1:-1;;10404:1:7;10386:16;;10379:27;10156:258::o;10419:135::-;10458:3;-1:-1:-1;;10479:17:7;;10476:43;;;10499:18;;:::i;:::-;-1:-1:-1;10546:1:7;10535:13;;10419:135::o;10559:127::-;10620:10;10615:3;10611:20;10608:1;10601:31;10651:4;10648:1;10641:15;10675:4;10672:1;10665:15;10691:127;10752:10;10747:3;10743:20;10740:1;10733:31;10783:4;10780:1;10773:15;10807:4;10804:1;10797:15;10823:127;10884:10;10879:3;10875:20;10872:1;10865:31;10915:4;10912:1;10905:15;10939:4;10936:1;10929:15;10955:118;11041:5;11034:13;11027:21;11020:5;11017:32;11007:60;;11063:1;11060;11053:12

Metadata Hash

80994cb32755e354e911e7b135b573f00091bd27e44e86476dc9987963cb15f3
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
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.