ETH Price: $1,864.47 (-3.34%)
 

Overview

Max Total Supply

0 ERC20 ***

Holders

0

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
UniStakingSyntheticToken

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
constantinople EvmVersion
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;

import "./UniStaking.sol";

contract UniStakingSyntheticToken is UniStaking {
    uint256 public decimals;
    string public name;
    string public symbol;
    mapping(address => mapping(address => uint256)) internal _allowances;

    function allowance(address owner, address spender) external view returns (uint256) {
        return _allowances[owner][spender];
    }

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

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 decimals_,
        IERC20 rewardsToken_,
        IERC20 stakingToken_,
        address owner_
    ) public UniStaking(rewardsToken_, stakingToken_, owner_) {
        name = name_;
        symbol = symbol_;
        decimals = decimals_;
    }

    function _onMint(address account, uint256 amount) internal override {
        emit Transfer(address(0), account, amount);
    }

    function _onBurn(address account, uint256 amount) internal override {
        emit Transfer(account, address(0), amount);
    }

    function transfer(address recipient, uint256 amount) external onlyPositiveAmount(amount) returns (bool) {
        require(balanceOf(msg.sender) >= amount, "Transfer amount exceeds balance");
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function approve(address spender, uint256 amount) external returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external onlyPositiveAmount(amount) returns (bool) {
        require(_allowances[sender][msg.sender] >= amount, "Transfer amount exceeds allowance");
        require(balanceOf(sender) >= amount, "Transfer amount exceeds balance");
        _transfer(sender, recipient, amount);
        _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount);
        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        _moveStake(sender, recipient, amount);
        emit Transfer(sender, recipient, amount);
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;

import "openzeppelin-solidity/contracts/math/SafeMath.sol";
import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";
import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol";

abstract contract UniStakingTokensStorage {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    uint256 private _rewardPool;
    uint256 private _rewardSupply;
    uint256 private _totalSupply;
    IERC20 private _rewardsToken;
    IERC20 private _stakingToken;
    mapping(address => uint256) private _balances;
    mapping(address => uint256) private _claimed;
    mapping(address => uint256) private _rewards;

    function rewardPool() public view returns (uint256) {
        return _rewardPool;
    }

    function rewardSupply() public view returns (uint256) {
        return _rewardSupply;
    }

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

    function rewardsToken() public view returns (IERC20) {
        return _rewardsToken;
    }

    function stakingToken() public view returns (IERC20) {
        return _stakingToken;
    }

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

    function claimedOf(address account) public view returns (uint256) {
        return _claimed[account];
    }

    function rewardOf(address account) public view returns (uint256) {
        return _rewards[account];
    }

    constructor(IERC20 rewardsToken_, IERC20 stakingToken_) public {
        _rewardsToken = rewardsToken_;
        _stakingToken = stakingToken_;
    }

    function _onMint(address account, uint256 amount) internal virtual {}
    function _onBurn(address account, uint256 amount) internal virtual {}

    function _stake(address account, uint256 amount) internal {
        _stakingToken.safeTransferFrom(account, address(this), amount);
        _balances[account] = _balances[account].add(amount);
        _totalSupply = _totalSupply.add(amount);
        _onMint(account, amount);
    }

    function _unstake(address account, uint256 amount) internal {
        _stakingToken.safeTransfer(account, amount);
        _balances[account] = _balances[account].sub(amount);
        _totalSupply = _totalSupply.sub(amount);
        _onBurn(account, amount);
    }

    function _increaseRewardPool(address owner, uint256 amount) internal {
        _rewardsToken.safeTransferFrom(owner, address(this), amount);
        _rewardSupply = _rewardSupply.add(amount);
        _rewardPool = _rewardPool.add(amount);
    }

    function _reduceRewardPool(address owner, uint256 amount) internal {
        _rewardsToken.safeTransfer(owner, amount);
        _rewardSupply = _rewardSupply.sub(amount);
        _rewardPool = _rewardPool.sub(amount);
    }

    function _addReward(address account, uint256 amount) internal {
        _rewards[account] = _rewards[account].add(amount);
        _rewardPool = _rewardPool.sub(amount);
    }

    function _withdraw(address account, uint256 amount) internal {
        _rewardsToken.safeTransfer(account, amount);
        _claimed[account] = _claimed[account].sub(amount);
    }

    function _claim(address account, uint256 amount) internal {
        _rewards[account] = _rewards[account].sub(amount);
        _rewardSupply = _rewardSupply.sub(amount);
        _claimed[account] = _claimed[account].add(amount);
    }

    function _transferBalance(
        address from,
        address to,
        uint256 amount
    ) internal {
        _balances[from] = _balances[from].sub(amount);
        _balances[to] = _balances[to].add(amount);
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;

import "openzeppelin-solidity/contracts/math/Math.sol";
import "openzeppelin-solidity/contracts/math/SafeMath.sol";
import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";
import "./AttoDecimal.sol";
import "./TwoStageOwnable.sol";
import "./UniStakingTokensStorage.sol";

contract UniStaking is TwoStageOwnable, UniStakingTokensStorage {
    using SafeMath for uint256;
    using AttoDecimalLib for AttoDecimal;

    struct PaidRate {
        AttoDecimal rate;
        bool active;
    }

    function getTimestamp() internal virtual view returns (uint256) {
        return block.timestamp;
    }

    uint256 public constant MAX_DISTRIBUTION_DURATION = 90 days;

    mapping(address => uint256) public rewardUnlockingTime;

    uint256 private _lastUpdatedAt;
    uint256 private _perSecondReward;
    uint256 private _distributionEndsAt;
    uint256 private _initialStrategyStartsAt;
    AttoDecimal private _initialStrategyRewardPerToken;
    AttoDecimal private _rewardPerToken;
    mapping(address => PaidRate) private _paidRates;

    function getRewardUnlockingTime() public virtual pure returns (uint256) {
        return 8 days;
    }

    function lastUpdatedAt() public view returns (uint256) {
        return _lastUpdatedAt;
    }

    function perSecondReward() public view returns (uint256) {
        return _perSecondReward;
    }

    function distributionEndsAt() public view returns (uint256) {
        return _distributionEndsAt;
    }

    function initialStrategyStartsAt() public view returns (uint256) {
        return _initialStrategyStartsAt;
    }

    function getRewardPerToken() internal view returns (AttoDecimal memory) {
        uint256 lastRewardLockedAt = Math.min(getTimestamp(), _distributionEndsAt.add(1));
        if (lastRewardLockedAt <= _lastUpdatedAt) return _rewardPerToken;
        return _getRewardPerToken(lastRewardLockedAt);
    }

    function _getRewardPerToken(uint256 forTimestamp) internal view returns (AttoDecimal memory) {
        if (_initialStrategyStartsAt >= forTimestamp) return AttoDecimal(0);
        uint256 totalSupply_ = totalSupply();
        if (totalSupply_ == 0) return AttoDecimalLib.convert(0);
        uint256 totalReward = forTimestamp
            .sub(Math.max(_lastUpdatedAt, _initialStrategyStartsAt))
            .mul(_perSecondReward);
        AttoDecimal memory newRewardPerToken = AttoDecimalLib.div(totalReward, totalSupply_);
        return _rewardPerToken.add(newRewardPerToken);
    }

    function rewardPerToken()
        external
        view
        returns (
            uint256 mantissa,
            uint256 base,
            uint256 exponentiation
        )
    {
        return (getRewardPerToken().mantissa, AttoDecimalLib.BASE, AttoDecimalLib.EXPONENTIATION);
    }

    function paidRateOf(address account)
        external
        view
        returns (
            uint256 mantissa,
            uint256 base,
            uint256 exponentiation
        )
    {
        return (_paidRates[account].rate.mantissa, AttoDecimalLib.BASE, AttoDecimalLib.EXPONENTIATION);
    }

    function earnedOf(address account) public view returns (uint256) {
        PaidRate memory userRate = _paidRates[account];
        if (getTimestamp() <= _initialStrategyStartsAt || !userRate.active) return 0;
        AttoDecimal memory rewardPerToken_ = getRewardPerToken();
        AttoDecimal memory initRewardPerToken = _initialStrategyRewardPerToken.mantissa > 0
            ? _initialStrategyRewardPerToken
            : _getRewardPerToken(_initialStrategyStartsAt.add(1));
        AttoDecimal memory rate = userRate.rate.lte((initRewardPerToken)) ? initRewardPerToken : userRate.rate;
        uint256 balance = balanceOf(account);
        if (balance == 0) return 0;
        if (rewardPerToken_.lte(rate)) return 0;
        AttoDecimal memory ratesDiff = rewardPerToken_.sub(rate);
        return ratesDiff.mul(balance).floor();
    }

    event RewardStrategyChanged(uint256 perSecondReward, uint256 duration);
    event InitialRewardStrategySetted(uint256 startsAt, uint256 perSecondReward, uint256 duration);
    event Staked(address indexed account, uint256 amount);
    event Unstaked(address indexed account, uint256 amount);
    event Claimed(address indexed account, uint256 amount, uint256 rewardUnlockingTime);
    event Withdrawed(address indexed account, uint256 amount);

    constructor(
        IERC20 rewardsToken_,
        IERC20 stakingToken_,
        address owner_
    ) public TwoStageOwnable(owner_) UniStakingTokensStorage(rewardsToken_, stakingToken_) {
    }

    function stake(uint256 amount) public onlyPositiveAmount(amount) {
        address sender = msg.sender;
        _lockRewards(sender);
        _stake(sender, amount);
        emit Staked(sender, amount);
    }

    function unstake(uint256 amount) public onlyPositiveAmount(amount) {
        address sender = msg.sender;
        require(amount <= balanceOf(sender), "Unstaking amount exceeds staked balance");
        _lockRewards(sender);
        _unstake(sender, amount);
        emit Unstaked(sender, amount);
    }

    function claim(uint256 amount) public onlyPositiveAmount(amount) {
        address sender = msg.sender;
        _lockRewards(sender);
        require(amount <= rewardOf(sender), "Claiming amount exceeds received rewards");
        uint256 rewardUnlockingTime_ = getTimestamp().add(getRewardUnlockingTime());
        rewardUnlockingTime[sender] = rewardUnlockingTime_;
        _claim(sender, amount);
        emit Claimed(sender, amount, rewardUnlockingTime_);
    }

    function withdraw(uint256 amount) public onlyPositiveAmount(amount) {
        address sender = msg.sender;
        require(getTimestamp() >= rewardUnlockingTime[sender], "Reward not unlocked yet");
        require(amount <= claimedOf(sender), "Withdrawing amount exceeds claimed balance");
        _withdraw(sender, amount);
        emit Withdrawed(sender, amount);
    }

    function setInitialRewardStrategy(
        uint256 startsAt,
        uint256 perSecondReward_,
        uint256 duration
    ) public onlyOwner returns (bool succeed) {
        uint256 currentTimestamp = getTimestamp();
        require(_initialStrategyStartsAt == 0, "Initial reward strategy already setted");
        require(currentTimestamp < startsAt, "Initial reward strategy starting timestamp less than current");
        _initialStrategyStartsAt = startsAt;
        _setRewardStrategy(currentTimestamp, startsAt, perSecondReward_, duration);
        emit InitialRewardStrategySetted(startsAt, perSecondReward_, duration);
        return true;
    }

    function setRewardStrategy(uint256 perSecondReward_, uint256 duration) public onlyOwner returns (bool succeed) {
        uint256 currentTimestamp = getTimestamp();
        require(_initialStrategyStartsAt > 0, "Set initial reward strategy first");
        require(currentTimestamp >= _initialStrategyStartsAt, "Wait for initial reward strategy start");
        _setRewardStrategy(currentTimestamp, currentTimestamp, perSecondReward_, duration);
        emit RewardStrategyChanged(perSecondReward_, duration);
        return true;
    }

    function lockRewards() public {
        _lockRewards(msg.sender);
    }

    function _moveStake(
        address from,
        address to,
        uint256 amount
    ) internal {
        _lockRewards(from);
        _lockRewards(to);
        _transferBalance(from, to, amount);
    }

    function _lastRatesLockedAt(uint256 timestamp) private {
        _rewardPerToken = _getRewardPerToken(timestamp);
        _lastUpdatedAt = timestamp;
    }

    function _lockRates(uint256 timestamp) private {
        uint256 totalSupply_ = totalSupply();
        if (_initialStrategyStartsAt <= timestamp && _initialStrategyRewardPerToken.mantissa == 0 && totalSupply_ > 0)
            _initialStrategyRewardPerToken = AttoDecimalLib.div(_perSecondReward, totalSupply_);
        if (_perSecondReward > 0 && timestamp >= _distributionEndsAt) {
            _lastRatesLockedAt(_distributionEndsAt);
            _perSecondReward = 0;
        }
        _lastRatesLockedAt(timestamp);
    }

    function _lockRewards(address account) private {
        uint256 currentTimestamp = getTimestamp();
        _lockRates(currentTimestamp);
        uint256 earned = earnedOf(account);
        if (earned > 0) _addReward(account, earned);
        _paidRates[account].rate = _rewardPerToken;
        _paidRates[account].active = true;
    }

    function _setRewardStrategy(
        uint256 currentTimestamp,
        uint256 startsAt,
        uint256 perSecondReward_,
        uint256 duration
    ) private {
        require(duration > 0, "Duration is zero");
        require(duration <= MAX_DISTRIBUTION_DURATION, "Distribution duration too long");
        _lockRates(currentTimestamp);
        uint256 nextDistributionRequiredPool = perSecondReward_.mul(duration);
        uint256 notDistributedReward = _distributionEndsAt <= currentTimestamp
            ? 0
            : _distributionEndsAt.sub(currentTimestamp).mul(_perSecondReward);
        if (nextDistributionRequiredPool > notDistributedReward) {
            _increaseRewardPool(owner, nextDistributionRequiredPool.sub(notDistributedReward));
        } else if (nextDistributionRequiredPool < notDistributedReward) {
            _reduceRewardPool(owner, notDistributedReward.sub(nextDistributionRequiredPool));
        }
        _perSecondReward = perSecondReward_;
        _distributionEndsAt = startsAt.add(duration);
    }

    modifier onlyPositiveAmount(uint256 amount) {
        require(amount > 0, "Amount is not positive");
        _;
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;

abstract contract TwoStageOwnable {
    address public nominatedOwner;
    address public owner;

    event OwnerChanged(address newOwner);
    event OwnerNominated(address nominatedOwner);

    constructor(address _owner) internal {
        require(_owner != address(0), "Owner address cannot be 0");
        owner = _owner;
        emit OwnerChanged(_owner);
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        owner = nominatedOwner;
        nominatedOwner = address(0);
        emit OwnerChanged(owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    modifier onlyOwner {
        require(msg.sender == owner, "Only the contract owner may perform this action");
        _;
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;

import "openzeppelin-solidity/contracts/math/SafeMath.sol";

struct AttoDecimal {
    uint256 mantissa;
}

library AttoDecimalLib {
    using SafeMath for uint256;

    uint256 internal constant BASE = 10;
    uint256 internal constant EXPONENTIATION = 18;
    uint256 internal constant ONE_MANTISSA = BASE**EXPONENTIATION;

    function convert(uint256 integer) internal pure returns (AttoDecimal memory) {
        return AttoDecimal({mantissa: integer.mul(ONE_MANTISSA)});
    }

    function add(AttoDecimal memory a, uint256 b) internal pure returns (AttoDecimal memory) {
        return  AttoDecimal({mantissa: a.mantissa.add(b.mul(ONE_MANTISSA))});
    }

    function add(AttoDecimal memory a, AttoDecimal memory b) internal pure returns (AttoDecimal memory) {
        return AttoDecimal({mantissa: a.mantissa.add(b.mantissa)});
    }

    function sub(AttoDecimal memory a, AttoDecimal memory b) internal pure returns (AttoDecimal memory) {
        return AttoDecimal({mantissa: a.mantissa.sub(b.mantissa)});
    }

    function mul(AttoDecimal memory a, uint256 b) internal pure returns (AttoDecimal memory) {
        return AttoDecimal({mantissa: a.mantissa.mul(b)});
    }

    function div(uint256 a, uint256 b) internal pure returns (AttoDecimal memory) {
        return AttoDecimal({mantissa: a.mul(ONE_MANTISSA).div(b)});
    }

    function div(AttoDecimal memory a, uint256 b) internal pure returns (AttoDecimal memory) {
        return AttoDecimal({mantissa: a.mantissa.div(b)});
    }

    function div(AttoDecimal memory a, AttoDecimal memory b) internal pure returns (AttoDecimal memory) {
        return AttoDecimal({mantissa: a.mantissa.mul(ONE_MANTISSA).div(b.mantissa)});
    }

    function idiv(uint256 a, AttoDecimal memory b) internal pure returns (uint256) {
        return a.mul(ONE_MANTISSA).div(b.mantissa);
    }

    function idivCeil(uint256 a, AttoDecimal memory b) internal pure returns (uint256) {
        uint256 dividend = a.mul(ONE_MANTISSA);
        bool addOne = dividend.mod(b.mantissa) > 0;
        return dividend.div(b.mantissa).add(addOne ? 1 : 0);
    }

    function ceil(AttoDecimal memory a) internal pure returns (uint256) {
        uint256 integer = floor(a);
        uint256 modulo = a.mantissa.mod(ONE_MANTISSA);
        return integer.add(modulo >= ONE_MANTISSA.div(2) ? 1 : 0);
    }

    function floor(AttoDecimal memory a) internal pure returns (uint256) {
        return a.mantissa.div(ONE_MANTISSA);
    }

    function lte(AttoDecimal memory a, AttoDecimal memory b) internal pure returns (bool) {
        return a.mantissa <= b.mantissa;
    }

    function toTuple(AttoDecimal memory a)
        internal
        pure
        returns (
            uint256 mantissa,
            uint256 base,
            uint256 exponentiation
        )
    {
        return (a.mantissa, BASE, EXPONENTIATION);
    }
}

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "./IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/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 SafeMath for uint256;
    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'
        // solhint-disable-next-line max-line-length
        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).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _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
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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);
}

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @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, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @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);
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"decimals_","type":"uint256"},{"internalType":"contract IERC20","name":"rewardsToken_","type":"address"},{"internalType":"contract IERC20","name":"stakingToken_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardUnlockingTime","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startsAt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"perSecondReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"InitialRewardStrategySetted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nominatedOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"perSecondReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"RewardStrategyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawed","type":"event"},{"inputs":[],"name":"MAX_DISTRIBUTION_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimedOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributionEndsAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earnedOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardUnlockingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"initialStrategyStartsAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"paidRateOf","outputs":[{"internalType":"uint256","name":"mantissa","type":"uint256"},{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"uint256","name":"exponentiation","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perSecondReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"rewardOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"mantissa","type":"uint256"},{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"uint256","name":"exponentiation","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardUnlockingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startsAt","type":"uint256"},{"internalType":"uint256","name":"perSecondReward_","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"setInitialRewardStrategy","outputs":[{"internalType":"bool","name":"succeed","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"perSecondReward_","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"setRewardStrategy","outputs":[{"internalType":"bool","name":"succeed","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162003f8a38038062003f8a833981810160405260c08110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b838201915060208201858111156200006f57600080fd5b82518660018202830111640100000000821117156200008d57600080fd5b8083526020830192505050908051906020019080838360005b83811015620000c3578082015181840152602081019050620000a6565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b838201915060208201858111156200012c57600080fd5b82518660018202830111640100000000821117156200014a57600080fd5b8083526020830192505050908051906020019080838360005b838110156200018057808201518184015260208101905062000163565b50505050905090810190601f168015620001ae5780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805190602001909291908051906020019092919080519060200190929190505050828282828282600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200028a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f776e657220616464726573732063616e6e6f7420626520300000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050508560139080519060200190620003b8929190620003e5565b508460149080519060200190620003d1929190620003e5565b50836012819055505050505050506200048b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200042857805160ff191683800117855562000459565b8280016001018555821562000459579182015b82811115620004585782518255916020019190600101906200043b565b5b5090506200046891906200046c565b5090565b5b80821115620004875760008160009055506001016200046d565b5090565b613aef806200049b6000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c806358d6bc1511610125578063a9059cbb116100ad578063cd3daf9d1161007c578063cd3daf9d14610999578063d1af0c7d146109c5578063dd62ed3e146109f9578063e3c5729d14610a71578063f0f6a9d414610ac95761021c565b8063a9059cbb14610867578063ba43265f146108cb578063baa3f7ee146108e9578063be79a0cb146109415761021c565b806372f702f3116100f457806372f702f31461074457806379ba5097146107785780638da5cb5b1461078257806395d89b41146107b6578063a694fc3a146108395761021c565b806358d6bc151461066257806366666aa9146106b05780636b0c341b146106ce57806370a08231146106ec5761021c565b80632e1a7d4d116101a8578063379607f511610177578063379607f5146105245780633ba1356c1461055257806353a47bb7146105aa57806354aea127146105de578063574c7e9d146105fc5761021c565b80632e1a7d4d146104b0578063313ce567146104de57806333a8545f146104fc578063376d771a1461051a5761021c565b806318160ddd116101ef57806318160ddd1461036a5780631d62ebd91461038857806323895555146103e057806323b872dd146103fe5780632e17de78146104825761021c565b806306fdde0314610221578063095ea7b3146102a45780630a5c6786146103085780631627540c14610326575b600080fd5b610229610ae7565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561026957808201518184015260208101905061024e565b50505050905090810190601f1680156102965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f0600480360360408110156102ba57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b85565b60405180821515815260200191505060405180910390f35b610310610c77565b6040518082815260200191505060405180910390f35b6103686004803603602081101561033c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c81565b005b610372610db7565b6040518082815260200191505060405180910390f35b6103ca6004803603602081101561039e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dc1565b6040518082815260200191505060405180910390f35b6103e8610e0a565b6040518082815260200191505060405180910390f35b61046a6004803603606081101561041457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e11565b60405180821515815260200191505060405180910390f35b6104ae6004803603602081101561049857600080fd5b8101908080359060200190929190505050611103565b005b6104dc600480360360208110156104c657600080fd5b8101908080359060200190929190505050611246565b005b6104e661143c565b6040518082815260200191505060405180910390f35b610504611442565b6040518082815260200191505060405180910390f35b61052261144c565b005b6105506004803603602081101561053a57600080fd5b8101908080359060200190929190505050611457565b005b6105946004803603602081101561056857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061160c565b6040518082815260200191505060405180910390f35b6105b26117e9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105e661180d565b6040518082815260200191505060405180910390f35b61063e6004803603602081101561061257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611817565b60405180848152602001838152602001828152602001935050505060405180910390f35b6106986004803603604081101561067857600080fd5b810190808035906020019092919080359060200190929190505050611873565b60405180821515815260200191505060405180910390f35b6106b8611a33565b6040518082815260200191505060405180910390f35b6106d6611a3d565b6040518082815260200191505060405180910390f35b61072e6004803603602081101561070257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a47565b6040518082815260200191505060405180910390f35b61074c611a90565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610780611aba565b005b61078a611c71565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107be611c97565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107fe5780820151818401526020810190506107e3565b50505050905090810190601f16801561082b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6108656004803603602081101561084f57600080fd5b8101908080359060200190929190505050611d35565b005b6108b36004803603604081101561087d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e17565b60405180821515815260200191505060405180910390f35b6108d3611f24565b6040518082815260200191505060405180910390f35b61092b600480360360208110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f2f565b6040518082815260200191505060405180910390f35b6109816004803603606081101561095757600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611f78565b60405180821515815260200191505060405180910390f35b6109a1612145565b60405180848152602001838152602001828152602001935050505060405180910390f35b6109cd612165565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a5b60048036036040811015610a0f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061218f565b6040518082815260200191505060405180910390f35b610ab360048036036020811015610a8757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612216565b6040518082815260200191505060405180910390f35b610ad161222e565b6040518082815260200191505060405180910390f35b60138054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b7d5780601f10610b5257610100808354040283529160200191610b7d565b820191906000526020600020905b815481529060010190602001808311610b6057829003601f168201915b505050505081565b600081601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600e54905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806139b9602f913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2281604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b6000600454905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6276a70081565b60008160008111610e8a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e74206973206e6f7420706f7369746976650000000000000000000081525060200191505060405180910390fd5b82601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610f5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806139246021913960400191505060405180910390fd5b82610f6986611a47565b1015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5472616e7366657220616d6f756e7420657863656564732062616c616e63650081525060200191505060405180910390fd5b610fe8858585612238565b61107783601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122ad90919063ffffffff16565b601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060019150509392505050565b806000811161117a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e74206973206e6f7420706f7369746976650000000000000000000081525060200191505060405180910390fd5b600033905061118881611a47565b8311156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806138fd6027913960400191505060405180910390fd5b6111e981612330565b6111f38184612417565b8073ffffffffffffffffffffffffffffffffffffffff167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75846040518082815260200191505060405180910390a2505050565b80600081116112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e74206973206e6f7420706f7369746976650000000000000000000081525060200191505060405180910390fd5b6000339050600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461130a612522565b101561137e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f526577617264206e6f7420756e6c6f636b65642079657400000000000000000081525060200191505060405180910390fd5b61138781611f2f565b8311156113df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613a66602a913960400191505060405180910390fd5b6113e9818461252a565b8073ffffffffffffffffffffffffffffffffffffffff167f6cca423c6ffc06e62a0acc433965e074b11c28479b0449250ce3ff65ac9e39fe846040518082815260200191505060405180910390a2505050565b60125481565b6000600c54905090565b61145533612330565b565b80600081116114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e74206973206e6f7420706f7369746976650000000000000000000081525060200191505060405180910390fd5b60003390506114dc81612330565b6114e581610dc1565b83111561153d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806139456028913960400191505060405180910390fd5b600061156061154a611f24565b611552612522565b61261090919063ffffffff16565b905080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115b08285612698565b8173ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a8583604051808381526020018281526020019250505060405180910390a250505050565b600061161661386c565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160405180602001604052908160008201548152505081526020016001820160009054906101000a900460ff1615151515815250509050600e546116a6612522565b1115806116b557508060200151155b156116c45760009150506117e4565b6116cc61388e565b6116d46127e1565b90506116de61388e565b6000600f600001541161170e576117096117046001600e5461261090919063ffffffff16565b61284b565b611726565b600f6040518060200160405290816000820154815250505b905061173061388e565b61174782856000015161291a90919063ffffffff16565b611755578360000151611757565b815b9050600061176487611a47565b9050600081141561177d576000955050505050506117e4565b611790828561291a90919063ffffffff16565b156117a3576000955050505050506117e4565b6117ab61388e565b6117be838661293090919063ffffffff16565b90506117db6117d6838361296990919063ffffffff16565b61299e565b96505050505050505b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b54905090565b6000806000601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160000154600a60129250925092509193909250565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806139b9602f913960400191505060405180910390fd5b6000611925612522565b90506000600e5411611982576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613a456021913960400191505060405180910390fd5b600e548110156119dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806138d76026913960400191505060405180910390fd5b6119e9818286866129c2565b7fbc1de98124926348fe8e6959ee37194f931c09201dda22e160a9943ca1b66db98484604051808381526020018281526020019250505060405180910390a1600191505092915050565b6000600254905090565b6000600354905090565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b5e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806138a26035913960400191505060405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf36600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60148054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d2d5780601f10611d0257610100808354040283529160200191611d2d565b820191906000526020600020905b815481529060010190602001808311611d1057829003601f168201915b505050505081565b8060008111611dac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e74206973206e6f7420706f7369746976650000000000000000000081525060200191505060405180910390fd5b6000339050611dba81612330565b611dc48184612bcb565b8073ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d846040518082815260200191505060405180910390a2505050565b60008160008111611e90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e74206973206e6f7420706f7369746976650000000000000000000081525060200191505060405180910390fd5b82611e9a33611a47565b1015611f0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5472616e7366657220616d6f756e7420657863656564732062616c616e63650081525060200191505060405180910390fd5b611f19338585612238565b600191505092915050565b6000620a8c00905090565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806139b9602f913960400191505060405180910390fd5b600061202a612522565b90506000600e5414612087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061396d6026913960400191505060405180910390fd5b8481106120df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613a09603c913960400191505060405180910390fd5b84600e819055506120f2818686866129c2565b7fa0bb26644c5db4dbb27b45959ef4533e48a805c4767e6c9ef123bd98e3c63ce085858560405180848152602001838152602001828152602001935050505060405180910390a160019150509392505050565b60008060006121526127e1565b60000151600a6012925092509250909192565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a6020528060005260406000206000915090505481565b6000600d54905090565b612243838383612cd8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600082821115612325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b600061233a612522565b905061234581612cfa565b60006123508361160c565b90506000811115612366576123658382612d84565b5b6010601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082015481600001559050506001601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550505050565b6124648282600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612e389092919063ffffffff16565b6124b681600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122ad90919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061250e816004546122ad90919063ffffffff16565b60048190555061251e8282612eda565b5050565b600042905090565b6125778282600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612e389092919063ffffffff16565b6125c981600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122ad90919063ffffffff16565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008082840190508381101561268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6126ea81600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122ad90919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612742816003546122ad90919063ffffffff16565b60038190555061279a81600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461261090919063ffffffff16565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6127e961388e565b60006128116127f6612522565b61280c6001600d5461261090919063ffffffff16565b612f44565b9050600b54811161283b576010604051806020016040529081600082015481525050915050612848565b6128448161284b565b9150505b90565b61285361388e565b81600e541061287357604051806020016040528060008152509050612915565b600061287d610db7565b9050600081141561289a576128926000612f5d565b915050612915565b60006128d0600c546128c26128b3600b54600e54612f91565b876122ad90919063ffffffff16565b612fab90919063ffffffff16565b90506128da61388e565b6128e48284613031565b905061290f81601060405180602001604052908160008201548152505061307890919063ffffffff16565b93505050505b919050565b6000816000015183600001511115905092915050565b61293861388e565b604051806020016040528061295e846000015186600001516122ad90919063ffffffff16565b815250905092915050565b61297161388e565b6040518060200160405280612993848660000151612fab90919063ffffffff16565b815250905092915050565b60006129bb6012600a0a83600001516130b190919063ffffffff16565b9050919050565b60008111612a38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4475726174696f6e206973207a65726f0000000000000000000000000000000081525060200191505060405180910390fd5b6276a700811115612ab1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f446973747269627574696f6e206475726174696f6e20746f6f206c6f6e67000081525060200191505060405180910390fd5b612aba84612cfa565b6000612acf8284612fab90919063ffffffff16565b9050600085600d541115612b0b57612b06600c54612af888600d546122ad90919063ffffffff16565b612fab90919063ffffffff16565b612b0e565b60005b905080821115612b5b57612b56600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612b5183856122ad90919063ffffffff16565b61313a565b612ba3565b80821015612ba257612ba1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612b9c84846122ad90919063ffffffff16565b6131c3565b5b5b83600c81905550612bbd838661261090919063ffffffff16565b600d81905550505050505050565b612c1a823083600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661324a909392919063ffffffff16565b612c6c81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461261090919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612cc48160045461261090919063ffffffff16565b600481905550612cd4828261330b565b5050565b612ce183612330565b612cea82612330565b612cf5838383613375565b505050565b6000612d04610db7565b905081600e5411158015612d1d57506000600f60000154145b8015612d295750600081115b15612d4a57612d3a600c5482613031565b600f600082015181600001559050505b6000600c54118015612d5e5750600d548210155b15612d7757612d6e600d546134a4565b6000600c819055505b612d80826134a4565b5050565b612dd681600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461261090919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e2e816002546122ad90919063ffffffff16565b6002819055505050565b612ed58363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506134c6565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000818310612f535781612f55565b825b905092915050565b612f6561388e565b6040518060200160405280612f876012600a0a85612fab90919063ffffffff16565b8152509050919050565b600081831015612fa15781612fa3565b825b905092915050565b600080831415612fbe576000905061302b565b6000828402905082848281612fcf57fe5b0414613026576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806139e86021913960400191505060405180910390fd5b809150505b92915050565b61303961388e565b604051806020016040528061306d8461305f6012600a0a88612fab90919063ffffffff16565b6130b190919063ffffffff16565b815250905092915050565b61308061388e565b60405180602001604052806130a68460000151866000015161261090919063ffffffff16565b815250905092915050565b6000808211613128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b81838161313157fe5b04905092915050565b613189823083600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661324a909392919063ffffffff16565b61319e8160035461261090919063ffffffff16565b6003819055506131b98160025461261090919063ffffffff16565b6002819055505050565b6132108282600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612e389092919063ffffffff16565b613225816003546122ad90919063ffffffff16565b600381905550613240816002546122ad90919063ffffffff16565b6002819055505050565b613305846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506134c6565b50505050565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6133c781600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122ad90919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061345c81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461261090919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6134ad8161284b565b60106000820151816000015590505080600b8190555050565b6060613528826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135b59092919063ffffffff16565b90506000815111156135b05780806020019051602081101561354957600080fd5b81019080805190602001909291905050506135af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613a90602a913960400191505060405180910390fd5b5b505050565b60606135c484846000856135cd565b90509392505050565b6060823073ffffffffffffffffffffffffffffffffffffffff1631101561363f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806139936026913960400191505060405180910390fd5b6136488561378d565b6136ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061370a57805182526020820191506020810190506020830392506136e7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461376c576040519150601f19603f3d011682016040523d82523d6000602084013e613771565b606091505b50915091506137818282866137a0565b92505050949350505050565b600080823b905060008111915050919050565b606083156137b057829050613865565b6000835111156137c35782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561382a57808201518184015260208101905061380f565b50505050905090810190601f1680156138575780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b604051806040016040528061387f61388e565b81526020016000151581525090565b604051806020016040528060008152509056fe596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e6572736869705761697420666f7220696e697469616c20726577617264207374726174656779207374617274556e7374616b696e6720616d6f756e742065786365656473207374616b65642062616c616e63655472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436c61696d696e6720616d6f756e7420657863656564732072656365697665642072657761726473496e697469616c2072657761726420737472617465677920616c726561647920736574746564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77496e697469616c20726577617264207374726174656779207374617274696e672074696d657374616d70206c657373207468616e2063757272656e7453657420696e697469616c207265776172642073747261746567792066697273745769746864726177696e6720616d6f756e74206578636565647320636c61696d65642062616c616e63655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212205c484071fe00416368af558c4897888a66f7cbc20cf9fefb1b2251d8a892879764736f6c634300060c003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000defac16715671b7b6aeefe012125f1e19ee4b7d700000000000000000000000034771e38e414026d2a680f42f28d4773379fc2af000000000000000000000000d4eee3d50588d7dee8dcc42635e50093e0aa8cc0000000000000000000000000000000000000000000000000000000000000001a46414354522d57455448204c50205374616b696e6720506f6f6c00000000000000000000000000000000000000000000000000000000000000000000000000147374616b65642d46414354522d57455448204c50000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c806358d6bc1511610125578063a9059cbb116100ad578063cd3daf9d1161007c578063cd3daf9d14610999578063d1af0c7d146109c5578063dd62ed3e146109f9578063e3c5729d14610a71578063f0f6a9d414610ac95761021c565b8063a9059cbb14610867578063ba43265f146108cb578063baa3f7ee146108e9578063be79a0cb146109415761021c565b806372f702f3116100f457806372f702f31461074457806379ba5097146107785780638da5cb5b1461078257806395d89b41146107b6578063a694fc3a146108395761021c565b806358d6bc151461066257806366666aa9146106b05780636b0c341b146106ce57806370a08231146106ec5761021c565b80632e1a7d4d116101a8578063379607f511610177578063379607f5146105245780633ba1356c1461055257806353a47bb7146105aa57806354aea127146105de578063574c7e9d146105fc5761021c565b80632e1a7d4d146104b0578063313ce567146104de57806333a8545f146104fc578063376d771a1461051a5761021c565b806318160ddd116101ef57806318160ddd1461036a5780631d62ebd91461038857806323895555146103e057806323b872dd146103fe5780632e17de78146104825761021c565b806306fdde0314610221578063095ea7b3146102a45780630a5c6786146103085780631627540c14610326575b600080fd5b610229610ae7565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561026957808201518184015260208101905061024e565b50505050905090810190601f1680156102965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f0600480360360408110156102ba57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b85565b60405180821515815260200191505060405180910390f35b610310610c77565b6040518082815260200191505060405180910390f35b6103686004803603602081101561033c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c81565b005b610372610db7565b6040518082815260200191505060405180910390f35b6103ca6004803603602081101561039e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dc1565b6040518082815260200191505060405180910390f35b6103e8610e0a565b6040518082815260200191505060405180910390f35b61046a6004803603606081101561041457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e11565b60405180821515815260200191505060405180910390f35b6104ae6004803603602081101561049857600080fd5b8101908080359060200190929190505050611103565b005b6104dc600480360360208110156104c657600080fd5b8101908080359060200190929190505050611246565b005b6104e661143c565b6040518082815260200191505060405180910390f35b610504611442565b6040518082815260200191505060405180910390f35b61052261144c565b005b6105506004803603602081101561053a57600080fd5b8101908080359060200190929190505050611457565b005b6105946004803603602081101561056857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061160c565b6040518082815260200191505060405180910390f35b6105b26117e9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105e661180d565b6040518082815260200191505060405180910390f35b61063e6004803603602081101561061257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611817565b60405180848152602001838152602001828152602001935050505060405180910390f35b6106986004803603604081101561067857600080fd5b810190808035906020019092919080359060200190929190505050611873565b60405180821515815260200191505060405180910390f35b6106b8611a33565b6040518082815260200191505060405180910390f35b6106d6611a3d565b6040518082815260200191505060405180910390f35b61072e6004803603602081101561070257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a47565b6040518082815260200191505060405180910390f35b61074c611a90565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610780611aba565b005b61078a611c71565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107be611c97565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107fe5780820151818401526020810190506107e3565b50505050905090810190601f16801561082b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6108656004803603602081101561084f57600080fd5b8101908080359060200190929190505050611d35565b005b6108b36004803603604081101561087d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e17565b60405180821515815260200191505060405180910390f35b6108d3611f24565b6040518082815260200191505060405180910390f35b61092b600480360360208110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f2f565b6040518082815260200191505060405180910390f35b6109816004803603606081101561095757600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611f78565b60405180821515815260200191505060405180910390f35b6109a1612145565b60405180848152602001838152602001828152602001935050505060405180910390f35b6109cd612165565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a5b60048036036040811015610a0f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061218f565b6040518082815260200191505060405180910390f35b610ab360048036036020811015610a8757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612216565b6040518082815260200191505060405180910390f35b610ad161222e565b6040518082815260200191505060405180910390f35b60138054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b7d5780601f10610b5257610100808354040283529160200191610b7d565b820191906000526020600020905b815481529060010190602001808311610b6057829003601f168201915b505050505081565b600081601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600e54905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806139b9602f913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2281604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b6000600454905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6276a70081565b60008160008111610e8a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e74206973206e6f7420706f7369746976650000000000000000000081525060200191505060405180910390fd5b82601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610f5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806139246021913960400191505060405180910390fd5b82610f6986611a47565b1015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5472616e7366657220616d6f756e7420657863656564732062616c616e63650081525060200191505060405180910390fd5b610fe8858585612238565b61107783601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122ad90919063ffffffff16565b601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060019150509392505050565b806000811161117a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e74206973206e6f7420706f7369746976650000000000000000000081525060200191505060405180910390fd5b600033905061118881611a47565b8311156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806138fd6027913960400191505060405180910390fd5b6111e981612330565b6111f38184612417565b8073ffffffffffffffffffffffffffffffffffffffff167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75846040518082815260200191505060405180910390a2505050565b80600081116112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e74206973206e6f7420706f7369746976650000000000000000000081525060200191505060405180910390fd5b6000339050600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461130a612522565b101561137e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f526577617264206e6f7420756e6c6f636b65642079657400000000000000000081525060200191505060405180910390fd5b61138781611f2f565b8311156113df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613a66602a913960400191505060405180910390fd5b6113e9818461252a565b8073ffffffffffffffffffffffffffffffffffffffff167f6cca423c6ffc06e62a0acc433965e074b11c28479b0449250ce3ff65ac9e39fe846040518082815260200191505060405180910390a2505050565b60125481565b6000600c54905090565b61145533612330565b565b80600081116114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e74206973206e6f7420706f7369746976650000000000000000000081525060200191505060405180910390fd5b60003390506114dc81612330565b6114e581610dc1565b83111561153d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806139456028913960400191505060405180910390fd5b600061156061154a611f24565b611552612522565b61261090919063ffffffff16565b905080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115b08285612698565b8173ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a8583604051808381526020018281526020019250505060405180910390a250505050565b600061161661386c565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160405180602001604052908160008201548152505081526020016001820160009054906101000a900460ff1615151515815250509050600e546116a6612522565b1115806116b557508060200151155b156116c45760009150506117e4565b6116cc61388e565b6116d46127e1565b90506116de61388e565b6000600f600001541161170e576117096117046001600e5461261090919063ffffffff16565b61284b565b611726565b600f6040518060200160405290816000820154815250505b905061173061388e565b61174782856000015161291a90919063ffffffff16565b611755578360000151611757565b815b9050600061176487611a47565b9050600081141561177d576000955050505050506117e4565b611790828561291a90919063ffffffff16565b156117a3576000955050505050506117e4565b6117ab61388e565b6117be838661293090919063ffffffff16565b90506117db6117d6838361296990919063ffffffff16565b61299e565b96505050505050505b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b54905090565b6000806000601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160000154600a60129250925092509193909250565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806139b9602f913960400191505060405180910390fd5b6000611925612522565b90506000600e5411611982576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613a456021913960400191505060405180910390fd5b600e548110156119dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806138d76026913960400191505060405180910390fd5b6119e9818286866129c2565b7fbc1de98124926348fe8e6959ee37194f931c09201dda22e160a9943ca1b66db98484604051808381526020018281526020019250505060405180910390a1600191505092915050565b6000600254905090565b6000600354905090565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b5e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806138a26035913960400191505060405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf36600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60148054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d2d5780601f10611d0257610100808354040283529160200191611d2d565b820191906000526020600020905b815481529060010190602001808311611d1057829003601f168201915b505050505081565b8060008111611dac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e74206973206e6f7420706f7369746976650000000000000000000081525060200191505060405180910390fd5b6000339050611dba81612330565b611dc48184612bcb565b8073ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d846040518082815260200191505060405180910390a2505050565b60008160008111611e90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e74206973206e6f7420706f7369746976650000000000000000000081525060200191505060405180910390fd5b82611e9a33611a47565b1015611f0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5472616e7366657220616d6f756e7420657863656564732062616c616e63650081525060200191505060405180910390fd5b611f19338585612238565b600191505092915050565b6000620a8c00905090565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806139b9602f913960400191505060405180910390fd5b600061202a612522565b90506000600e5414612087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061396d6026913960400191505060405180910390fd5b8481106120df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613a09603c913960400191505060405180910390fd5b84600e819055506120f2818686866129c2565b7fa0bb26644c5db4dbb27b45959ef4533e48a805c4767e6c9ef123bd98e3c63ce085858560405180848152602001838152602001828152602001935050505060405180910390a160019150509392505050565b60008060006121526127e1565b60000151600a6012925092509250909192565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a6020528060005260406000206000915090505481565b6000600d54905090565b612243838383612cd8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600082821115612325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b600061233a612522565b905061234581612cfa565b60006123508361160c565b90506000811115612366576123658382612d84565b5b6010601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082015481600001559050506001601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550505050565b6124648282600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612e389092919063ffffffff16565b6124b681600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122ad90919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061250e816004546122ad90919063ffffffff16565b60048190555061251e8282612eda565b5050565b600042905090565b6125778282600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612e389092919063ffffffff16565b6125c981600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122ad90919063ffffffff16565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008082840190508381101561268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6126ea81600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122ad90919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612742816003546122ad90919063ffffffff16565b60038190555061279a81600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461261090919063ffffffff16565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6127e961388e565b60006128116127f6612522565b61280c6001600d5461261090919063ffffffff16565b612f44565b9050600b54811161283b576010604051806020016040529081600082015481525050915050612848565b6128448161284b565b9150505b90565b61285361388e565b81600e541061287357604051806020016040528060008152509050612915565b600061287d610db7565b9050600081141561289a576128926000612f5d565b915050612915565b60006128d0600c546128c26128b3600b54600e54612f91565b876122ad90919063ffffffff16565b612fab90919063ffffffff16565b90506128da61388e565b6128e48284613031565b905061290f81601060405180602001604052908160008201548152505061307890919063ffffffff16565b93505050505b919050565b6000816000015183600001511115905092915050565b61293861388e565b604051806020016040528061295e846000015186600001516122ad90919063ffffffff16565b815250905092915050565b61297161388e565b6040518060200160405280612993848660000151612fab90919063ffffffff16565b815250905092915050565b60006129bb6012600a0a83600001516130b190919063ffffffff16565b9050919050565b60008111612a38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4475726174696f6e206973207a65726f0000000000000000000000000000000081525060200191505060405180910390fd5b6276a700811115612ab1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f446973747269627574696f6e206475726174696f6e20746f6f206c6f6e67000081525060200191505060405180910390fd5b612aba84612cfa565b6000612acf8284612fab90919063ffffffff16565b9050600085600d541115612b0b57612b06600c54612af888600d546122ad90919063ffffffff16565b612fab90919063ffffffff16565b612b0e565b60005b905080821115612b5b57612b56600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612b5183856122ad90919063ffffffff16565b61313a565b612ba3565b80821015612ba257612ba1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612b9c84846122ad90919063ffffffff16565b6131c3565b5b5b83600c81905550612bbd838661261090919063ffffffff16565b600d81905550505050505050565b612c1a823083600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661324a909392919063ffffffff16565b612c6c81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461261090919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612cc48160045461261090919063ffffffff16565b600481905550612cd4828261330b565b5050565b612ce183612330565b612cea82612330565b612cf5838383613375565b505050565b6000612d04610db7565b905081600e5411158015612d1d57506000600f60000154145b8015612d295750600081115b15612d4a57612d3a600c5482613031565b600f600082015181600001559050505b6000600c54118015612d5e5750600d548210155b15612d7757612d6e600d546134a4565b6000600c819055505b612d80826134a4565b5050565b612dd681600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461261090919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e2e816002546122ad90919063ffffffff16565b6002819055505050565b612ed58363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506134c6565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000818310612f535781612f55565b825b905092915050565b612f6561388e565b6040518060200160405280612f876012600a0a85612fab90919063ffffffff16565b8152509050919050565b600081831015612fa15781612fa3565b825b905092915050565b600080831415612fbe576000905061302b565b6000828402905082848281612fcf57fe5b0414613026576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806139e86021913960400191505060405180910390fd5b809150505b92915050565b61303961388e565b604051806020016040528061306d8461305f6012600a0a88612fab90919063ffffffff16565b6130b190919063ffffffff16565b815250905092915050565b61308061388e565b60405180602001604052806130a68460000151866000015161261090919063ffffffff16565b815250905092915050565b6000808211613128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b81838161313157fe5b04905092915050565b613189823083600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661324a909392919063ffffffff16565b61319e8160035461261090919063ffffffff16565b6003819055506131b98160025461261090919063ffffffff16565b6002819055505050565b6132108282600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612e389092919063ffffffff16565b613225816003546122ad90919063ffffffff16565b600381905550613240816002546122ad90919063ffffffff16565b6002819055505050565b613305846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506134c6565b50505050565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6133c781600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122ad90919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061345c81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461261090919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6134ad8161284b565b60106000820151816000015590505080600b8190555050565b6060613528826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135b59092919063ffffffff16565b90506000815111156135b05780806020019051602081101561354957600080fd5b81019080805190602001909291905050506135af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613a90602a913960400191505060405180910390fd5b5b505050565b60606135c484846000856135cd565b90509392505050565b6060823073ffffffffffffffffffffffffffffffffffffffff1631101561363f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806139936026913960400191505060405180910390fd5b6136488561378d565b6136ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061370a57805182526020820191506020810190506020830392506136e7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461376c576040519150601f19603f3d011682016040523d82523d6000602084013e613771565b606091505b50915091506137818282866137a0565b92505050949350505050565b600080823b905060008111915050919050565b606083156137b057829050613865565b6000835111156137c35782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561382a57808201518184015260208101905061380f565b50505050905090810190601f1680156138575780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b604051806040016040528061387f61388e565b81526020016000151581525090565b604051806020016040528060008152509056fe596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e6572736869705761697420666f7220696e697469616c20726577617264207374726174656779207374617274556e7374616b696e6720616d6f756e742065786365656473207374616b65642062616c616e63655472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436c61696d696e6720616d6f756e7420657863656564732072656365697665642072657761726473496e697469616c2072657761726420737472617465677920616c726561647920736574746564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77496e697469616c20726577617264207374726174656779207374617274696e672074696d657374616d70206c657373207468616e2063757272656e7453657420696e697469616c207265776172642073747261746567792066697273745769746864726177696e6720616d6f756e74206578636565647320636c61696d65642062616c616e63655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212205c484071fe00416368af558c4897888a66f7cbc20cf9fefb1b2251d8a892879764736f6c634300060c0033

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

00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000defac16715671b7b6aeefe012125f1e19ee4b7d700000000000000000000000034771e38e414026d2a680f42f28d4773379fc2af000000000000000000000000d4eee3d50588d7dee8dcc42635e50093e0aa8cc0000000000000000000000000000000000000000000000000000000000000001a46414354522d57455448204c50205374616b696e6720506f6f6c00000000000000000000000000000000000000000000000000000000000000000000000000147374616b65642d46414354522d57455448204c50000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): FACTR-WETH LP Staking Pool
Arg [1] : symbol_ (string): staked-FACTR-WETH LP
Arg [2] : decimals_ (uint256): 18
Arg [3] : rewardsToken_ (address): 0xdefac16715671b7b6aeeFE012125f1E19Ee4b7d7
Arg [4] : stakingToken_ (address): 0x34771e38e414026D2a680f42F28d4773379fc2AF
Arg [5] : owner_ (address): 0xd4eeE3D50588D7dee8Dcc42635E50093E0AA8Cc0

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 000000000000000000000000defac16715671b7b6aeefe012125f1e19ee4b7d7
Arg [4] : 00000000000000000000000034771e38e414026d2a680f42f28d4773379fc2af
Arg [5] : 000000000000000000000000d4eee3d50588d7dee8dcc42635e50093e0aa8cc0
Arg [6] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [7] : 46414354522d57455448204c50205374616b696e6720506f6f6c000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [9] : 7374616b65642d46414354522d57455448204c50000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.