Contract 0xa003bFBE51CeB23a57C82128bC0c5B2422B63CE1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x00a87add9b1e0a39c3f0aca457aedf6505455d9adefe1561427145bd9855eb9fWithdraw699733002022-07-16 14:05:3678 days 3 hrs ago0x93390c4d2233c2e96d88c687c4f0717ff79d259b IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000321006
0xef64324d90876117210e5df83aed4ba7fd38be1282c738e99bd940670102e944Withdraw672832662022-06-08 12:51:12116 days 4 hrs ago0x830042499331a3c71e066b0f4b4da1c4f95dc284 IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x6295dd98eae9c3495b3554e937959453d8c1dffc501935106a2252b3fdc5c11fSet Operator671777492022-06-06 22:38:35117 days 18 hrs agoPolaris Finance: DEV Wallet IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000065613
0x4094316cb0cd62fcba99424c5debad5c11ecc342a7d7e2cf81244f41054779e5Withdraw671685692022-06-06 19:23:57117 days 21 hrs ago0x7d25aeead90286e0ae5b40c13eef7ca340c557ec IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0xa362ff6e5c7e092edae54457ece1baf1c72f30f8d74b7bc68dae38facda3246bWithdraw663462802022-05-25 14:55:21130 days 2 hrs ago0xe7ece3af2f8100b2e6844d5be8a07ecce8d4864a IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0xc367a7b47622f6cd1a09848cf4c04e5361d6b946822c2d686dee5f707d42fff1Withdraw662756782022-05-24 13:25:09131 days 3 hrs ago0x92927a8c9ded7577aa5da4c4b601ae54c408bbe1 IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x489cd2d3ba827cb36053d5cb3dc55eade9518af4e1eb0b3313046851c5cdf920Withdraw662083482022-05-23 14:12:00132 days 3 hrs ago0x5e062432d15aa85ee0ba88c24a1054d9ff5b3981 IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x1f73eb62459c6b995664f8c5d1df957dc0f12f1c2b005fee9c69de47b2bb78abWithdraw661075122022-05-22 4:21:46133 days 12 hrs ago0x81ad16bc7d117d9ad6e162947ef2d78ceadcb0e6 IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0xa03df5276489ec198df2b2625c0f5d83c8fb9e746fe787e26244e4d3777456d6Withdraw660570312022-05-21 11:38:13134 days 5 hrs ago0xddd2e443a5570bc1fc4e07d600d3fcc7229bde03 IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0xc0007b645b6d58fc42e8bb06589c522b92e3f6f7f59db626ede25e99b81828a7Withdraw657425622022-05-17 0:39:59138 days 16 hrs ago0x840bdc61e0ee676a32a617f27bc611b5036de1dc IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x6c1d3fd568fd402e20f659a5411fd38691473109341ea93d4abb9798408ca3b5Withdraw657218472022-05-16 17:27:55138 days 23 hrs ago0x978e475e298f69171bdfa2444998f06380b79eb5 IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x28ba63e4aed68bc86e1ee5de8da3fe69faee37ddfe05a9adab3e46151f475d5aWithdraw657121252022-05-16 14:08:53139 days 3 hrs ago0x4903cb9e427ded0e36598bc65c815052c98afeac IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x2d6635344f1d7e6532c9dc5d00d53ee0a46f97c79bd38e2e27c6915ebf621bd6Withdraw657120922022-05-16 14:08:13139 days 3 hrs ago0x4903cb9e427ded0e36598bc65c815052c98afeac IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x577d025243997cd986db4431c3e5fef1724e9ca17a2c4be5ed5771f6103cd17dWithdraw657036322022-05-16 11:16:03139 days 6 hrs ago0x285fa818ff70e350325f2cb01d5daae55a44feac IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0xb9efc87aadcf1dcca27cbd0b634071b7eed45dd729a50dab1aa5ae08d192b492Withdraw657023172022-05-16 10:49:33139 days 6 hrs ago0x4f48383ad4f305d3064927bb6d2af92867b863d4 IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0xde2bbe77985e8980aea1101985b43ae5aa64f6ac15b541577e84926ca0b0e1abWithdraw657002102022-05-16 10:06:58139 days 7 hrs ago0x27083fe3f32c09af66a78cf3baa2be76eb873f9c IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x6c60e5bee817e4697a228fc669f15feacb565cbb3dd581e44ce856fac88dbc10Withdraw656533262022-05-15 18:13:18139 days 23 hrs ago0xe7a4b8f1a428ef9756926b3e325a849f391f8ec6 IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x16d217188b643aeb8a33d795c5a4150bc0beb0b43fc5f83fa952fc999f14a988Withdraw656509132022-05-15 17:23:28139 days 23 hrs ago0xbda9d3f364589933d69ec861720739e91208af58 IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x46f1e085cd52da94c71517d1ce9d1385d381ce08201c1e848235374e01d1f270Withdraw656359122022-05-15 12:15:18140 days 5 hrs ago0xceb427d8478e8b9e28fbbd9eea740c25bb121ad2 IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0xd156c3ce286e6ee3b9d293ca7c9c2f09cf3cc06cd1b9b9475a24d91079a81410Withdraw656085352022-05-15 3:00:50140 days 14 hrs ago0x73e4ba99e920060b972c0881d700f47dd1c8d2a3 IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0xcffdbb5d64a79b10ac7ebeb111d83d7030405a3019904e5263962728555b05f0Withdraw656002362022-05-15 0:12:45140 days 17 hrs ago0xddd6a5839560f36ef13d473eb425a80547bedbde IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x70b96a0793ec7820cc2283b8970fe5f654cf3073c20eb97ad2d14fff5d86cb88Withdraw655910082022-05-14 21:04:33140 days 20 hrs ago0xf2cdb8348da8c75b4e2cf730c6e9aa5527f92c5a IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0xc8b5c9608e65494f0f2632dedff5e5feed83e37afe9264344174b5f69dd78e19Withdraw655904122022-05-14 20:52:10140 days 20 hrs ago0x16c5d7862f5e42b578c5b86bdf1f3887fdc0f412 IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x1f9f245c8d442e2f17f7157c52d42ba1b36cc8ef590d02765e507db4726d758cWithdraw655846292022-05-14 18:52:46140 days 22 hrs ago0x84e7ec6842f0467a3d66085c17200c4753603d4b IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
0x2d53a446c5cff0eedc4e1fd2d13ba455ed78265073326d72089ce4705b1c28f7Withdraw655843542022-05-14 18:46:57140 days 22 hrs ago0x84e7ec6842f0467a3d66085c17200c4753603d4b IN  0xa003bfbe51ceb23a57c82128bc0c5b2422b63ce10 ETH0.00000137574
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
TripolarGenesisRewardPool

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 5 : TripolarGenesisRewardPool.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import "IERC20.sol";
import "SafeERC20.sol";
import "SafeMath.sol";

// Note that this pool has no minter key of TRIPOLAR (rewards).
// Instead, the governance will call TRIPOLAR distributeReward method and send reward to this pool at the beginning.
contract TripolarGenesisRewardPool {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // governance
    address public operator;

    // Info of each user.
    struct UserInfo {
        uint256 amount; // How many tokens the user has provided.
        uint256 rewardDebt; // Reward debt. See explanation below.
    }

    // Info of each pool.
    struct PoolInfo {
        IERC20 token; // Address of LP token contract.
        uint256 allocPoint; // How many allocation points assigned to this pool. TRIPOLAR to distribute.
        uint256 lastRewardTime; // Last time that TRIPOLAR distribution occurs.
        uint256 accTripolarPerShare; // Accumulated TRIPOLAR per share, times 1e18. See below.
        bool isStarted; // if lastRewardBlock has passed
    }

    IERC20 public tripolar;

    // Info of each pool.
    PoolInfo[] public poolInfo;

    // Info of each user that stakes LP tokens.
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;

    // Total allocation points. Must be the sum of all allocation points in all pools.
    uint256 public totalAllocPoint = 0;

    // The time when TRIPOLAR mining starts.
    uint256 public poolStartTime;

    // The time when TRIPOLAR mining ends.
    uint256 public poolEndTime;

    // TESTNET
    // uint256 public tripolarPerSecond = 3.0555555e18; // 11000 TRIPOLAR / (1h * 60min * 60s)
    // uint256 public runningTime = 24 hours; // 1 hours
    // uint256 public constant TOTAL_REWARDS = 11000e18;
    // END TESTNET

    // MAINNET
    uint256 public tripolarPerSecond = 0.5787037037e18; // 50000 TRIPOLAR / (24h * 60min * 60s)
    uint256 public runningTime = 1 days; // 1 days
    uint256 public constant TOTAL_REWARDS = 50000e18;
    // END MAINNET

    event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event RewardPaid(address indexed user, uint256 amount);

    constructor(
        address _tripolar,
        uint256 _poolStartTime
        ) public {
        require(block.timestamp < _poolStartTime, "late");
        if (_tripolar != address(0)) tripolar = IERC20(_tripolar);
        poolStartTime = _poolStartTime;
        poolEndTime = poolStartTime + runningTime;
        operator = msg.sender;
    }

    modifier onlyOperator() {
        require(operator == msg.sender, "TripolarGenesisPool: caller is not the operator");
        _;
    }

    function checkPoolDuplicate(IERC20 _token) internal view {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            require(poolInfo[pid].token != _token, "TripolarGenesisPool: existing pool?");
        }
    }

    // Add a new token to the pool. Can only be called by the owner.
    function add(
        uint256 _allocPoint,
        IERC20 _token,
        bool _withUpdate,
        uint256 _lastRewardTime
    ) public onlyOperator {
        checkPoolDuplicate(_token);
        if (_withUpdate) {
            massUpdatePools();
        }
        if (block.timestamp < poolStartTime) {
            // chef is sleeping
            if (_lastRewardTime == 0) {
                _lastRewardTime = poolStartTime;
            } else {
                if (_lastRewardTime < poolStartTime) {
                    _lastRewardTime = poolStartTime;
                }
            }
        } else {
            // chef is cooking
            if (_lastRewardTime == 0 || _lastRewardTime < block.timestamp) {
                _lastRewardTime = block.timestamp;
            }
        }
        bool _isStarted =
        (_lastRewardTime <= poolStartTime) ||
        (_lastRewardTime <= block.timestamp);
        poolInfo.push(PoolInfo({
            token : _token,
            allocPoint : _allocPoint,
            lastRewardTime : _lastRewardTime,
            accTripolarPerShare : 0,
            isStarted : _isStarted
            }));
        if (_isStarted) {
            totalAllocPoint = totalAllocPoint.add(_allocPoint);
        }
    }

    // Update the given pool's TRIPOLAR allocation point. Can only be called by the owner.
    function set(uint256 _pid, uint256 _allocPoint) public onlyOperator {
        massUpdatePools();
        PoolInfo storage pool = poolInfo[_pid];
        if (pool.isStarted) {
            totalAllocPoint = totalAllocPoint.sub(pool.allocPoint).add(
                _allocPoint
            );
        }
        pool.allocPoint = _allocPoint;
    }

    // Return accumulate rewards over the given _from to _to block.
    function getGeneratedReward(uint256 _fromTime, uint256 _toTime) public view returns (uint256) {
        if (_fromTime >= _toTime) return 0;
        if (_toTime >= poolEndTime) {
            if (_fromTime >= poolEndTime) return 0;
            if (_fromTime <= poolStartTime) return poolEndTime.sub(poolStartTime).mul(tripolarPerSecond);
            return poolEndTime.sub(_fromTime).mul(tripolarPerSecond);
        } else {
            if (_toTime <= poolStartTime) return 0;
            if (_fromTime <= poolStartTime) return _toTime.sub(poolStartTime).mul(tripolarPerSecond);
            return _toTime.sub(_fromTime).mul(tripolarPerSecond);
        }
    }

    // View function to see pending TRIPOLAR on frontend.
    function pendingTripolar(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accTripolarPerShare = pool.accTripolarPerShare;
        uint256 tokenSupply = pool.token.balanceOf(address(this));
        if (block.timestamp > pool.lastRewardTime && tokenSupply != 0) {
            uint256 _generatedReward = getGeneratedReward(pool.lastRewardTime, block.timestamp);
            uint256 _tripolarReward = _generatedReward.mul(pool.allocPoint).div(totalAllocPoint);
            accTripolarPerShare = accTripolarPerShare.add(_tripolarReward.mul(1e18).div(tokenSupply));
        }
        return user.amount.mul(accTripolarPerShare).div(1e18).sub(user.rewardDebt);
    }

    // Update reward variables for all pools. Be careful of gas spending!
    function massUpdatePools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            updatePool(pid);
        }
    }

    // Update reward variables of the given pool to be up-to-date.
    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        if (block.timestamp <= pool.lastRewardTime) {
            return;
        }
        uint256 tokenSupply = pool.token.balanceOf(address(this));
        if (tokenSupply == 0) {
            pool.lastRewardTime = block.timestamp;
            return;
        }
        if (!pool.isStarted) {
            pool.isStarted = true;
            totalAllocPoint = totalAllocPoint.add(pool.allocPoint);
        }
        if (totalAllocPoint > 0) {
            uint256 _generatedReward = getGeneratedReward(pool.lastRewardTime, block.timestamp);
            uint256 _tripolarReward = _generatedReward.mul(pool.allocPoint).div(totalAllocPoint);
            pool.accTripolarPerShare = pool.accTripolarPerShare.add(_tripolarReward.mul(1e18).div(tokenSupply));
        }
        pool.lastRewardTime = block.timestamp;
    }

    // Deposit LP tokens.
    function deposit(uint256 _pid, uint256 _amount) public {
        address _sender = msg.sender;
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_sender];
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 _pending = user.amount.mul(pool.accTripolarPerShare).div(1e18).sub(user.rewardDebt);
            if (_pending > 0) {
                safeTripolarTransfer(_sender, _pending);
                emit RewardPaid(_sender, _pending);
            }
        }
        if (_amount > 0) {
            pool.token.safeTransferFrom(_sender, address(this), _amount);
            user.amount = user.amount.add(_amount);
            
        }
        user.rewardDebt = user.amount.mul(pool.accTripolarPerShare).div(1e18);
        emit Deposit(_sender, _pid, _amount);
    }

    // Withdraw LP tokens.
    function withdraw(uint256 _pid, uint256 _amount) public {
        address _sender = msg.sender;
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_sender];
        require(user.amount >= _amount, "withdraw: not good");
        updatePool(_pid);
        uint256 _pending = user.amount.mul(pool.accTripolarPerShare).div(1e18).sub(user.rewardDebt);
        if (_pending > 0) {
            safeTripolarTransfer(_sender, _pending);
            emit RewardPaid(_sender, _pending);
        }
        if (_amount > 0) {
            user.amount = user.amount.sub(_amount);
            pool.token.safeTransfer(_sender, _amount);
        }
        user.rewardDebt = user.amount.mul(pool.accTripolarPerShare).div(1e18);
        emit Withdraw(_sender, _pid, _amount);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        uint256 _amount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;
        pool.token.safeTransfer(msg.sender, _amount);
        emit EmergencyWithdraw(msg.sender, _pid, _amount);
    }

    // Safe TRIPOLAR transfer function, just in case if rounding error causes pool to not have enough TRIPOLARs.
    function safeTripolarTransfer(address _to, uint256 _amount) internal {
        uint256 _tripolarBalance = tripolar.balanceOf(address(this));
        if (_tripolarBalance > 0) {
            if (_amount > _tripolarBalance) {
                tripolar.safeTransfer(_to, _tripolarBalance);
            } else {
                tripolar.safeTransfer(_to, _amount);
            }
        }
    }

    function setOperator(address _operator) external onlyOperator {
        operator = _operator;
    }

    function governanceRecoverUnsupported(IERC20 _token, uint256 amount, address to) external onlyOperator {
        if (block.timestamp < poolEndTime + 90 days) {
            // do not allow to drain core token (TRIPOLAR or lps) if less than 90 days after pool ends
            require(_token != tripolar, "tripolar");
            uint256 length = poolInfo.length;
            for (uint256 pid = 0; pid < length; ++pid) {
                PoolInfo storage pool = poolInfo[pid];
                require(_token != pool.token, "pool.token");
            }
        }
        _token.safeTransfer(to, amount);
    }

}

File 2 of 5 : IERC20.sol
// 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);
}

File 3 of 5 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

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

File 4 of 5 : SafeMath.sol
// 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;
    }
}

File 5 of 5 : Address.sol
// 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);
            }
        }
    }
}

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_tripolar","type":"address"},{"internalType":"uint256","name":"_poolStartTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"TOTAL_REWARDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint256","name":"_lastRewardTime","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromTime","type":"uint256"},{"internalType":"uint256","name":"_toTime","type":"uint256"}],"name":"getGeneratedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTripolar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accTripolarPerShare","type":"uint256"},{"internalType":"bool","name":"isStarted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"runningTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tripolar","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tripolarPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600455670807f7f3d13dcd006007556201518060085534801561002857600080fd5b506040516118693803806118698339818101604052604081101561004b57600080fd5b508051602090910151428111610091576040805162461bcd60e51b815260206004808301919091526024820152636c61746560e01b604482015290519081900360640190fd5b6001600160a01b038216156100bc57600180546001600160a01b0319166001600160a01b0384161790555b60058190556008540160065550600080546001600160a01b0319163317905561177f806100ea6000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635f96dc11116100b8578063943f013d1161007c578063943f013d1461033a57806396805e5414610342578063b3ab15fb1461037c578063bc14caad146103a2578063dff1bddd146103aa578063e2bbb158146103b257610137565b80635f96dc11146102b1578063630b5ba1146102b95780636e271dd5146102c157806382bc88b7146102c957806393f1a40b146102f557610137565b8063441a3e70116100ff578063441a3e70146101fa57806351eb05a61461021d5780635312ea8e1461023a57806354575af414610257578063570ca7351461028d57610137565b806309cf60911461013c5780631526fe271461015657806317caf6f1146101aa5780631ab06ee5146101b2578063231f0c6a146101d7575b600080fd5b6101446103d5565b60408051918252519081900360200190f35b6101736004803603602081101561016c57600080fd5b50356103e3565b604080516001600160a01b039096168652602086019490945284840192909252606084015215156080830152519081900360a00190f35b61014461042e565b6101d5600480360360408110156101c857600080fd5b5080359060200135610434565b005b610144600480360360408110156101ed57600080fd5b50803590602001356104e2565b6101d56004803603604081101561021057600080fd5b50803590602001356105a7565b6101d56004803603602081101561023357600080fd5b5035610764565b6101d56004803603602081101561025057600080fd5b50356108c2565b6101d56004803603606081101561026d57600080fd5b506001600160a01b0381358116916020810135916040909101351661095e565b610295610aa8565b604080516001600160a01b039092168252519081900360200190f35b610144610ab7565b6101d5610abd565b610144610ae0565b610144600480360360408110156102df57600080fd5b50803590602001356001600160a01b0316610ae6565b6103216004803603604081101561030b57600080fd5b50803590602001356001600160a01b0316610c42565b6040805192835260208301919091528051918290030190f35b610144610c66565b6101d56004803603608081101561035857600080fd5b508035906001600160a01b0360208201351690604081013515159060600135610c6c565b6101d56004803603602081101561039257600080fd5b50356001600160a01b0316610e69565b610295610ed4565b610144610ee3565b6101d5600480360360408110156103c857600080fd5b5080359060200135610ee9565b690a968163f0a57b40000081565b600281815481106103f057fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909160ff1685565b60045481565b6000546001600160a01b0316331461047d5760405162461bcd60e51b815260040180806020018281038252602f815260200180611687602f913960400191505060405180910390fd5b610485610abd565b60006002838154811061049457fe5b60009182526020909120600590910201600481015490915060ff16156104db576104d7826104d1836001015460045461105990919063ffffffff16565b906110b6565b6004555b6001015550565b60008183106104f3575060006105a1565b600654821061055b57600654831061050d575060006105a1565b60055483116105405761053960075461053360055460065461105990919063ffffffff16565b90611117565b90506105a1565b6105396007546105338560065461105990919063ffffffff16565b600554821161056c575060006105a1565b6005548311610590576105396007546105336005548561105990919063ffffffff16565b600754610539906105338486611059565b92915050565b60003390506000600284815481106105bb57fe5b600091825260208083208784526003825260408085206001600160a01b03881686529092529220805460059092029092019250841115610637576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b61064085610764565b600061067d8260010154610677670de0b6b3a76400006106718760030154876000015461111790919063ffffffff16565b90611170565b90611059565b905080156106cf5761068f84826111d7565b6040805182815290516001600160a01b038616917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b84156106f95781546106e19086611059565b825582546106f9906001600160a01b0316858761128d565b6003830154825461071791670de0b6b3a76400009161067191611117565b600183015560408051868152905187916001600160a01b038716917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505050505050565b60006002828154811061077357fe5b906000526020600020906005020190508060020154421161079457506108bf565b8054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156107de57600080fd5b505afa1580156107f2573d6000803e3d6000fd5b505050506040513d602081101561080857600080fd5b505190508061081e5750426002909101556108bf565b600482015460ff1661084f576004808301805460ff19166001908117909155830154905461084b916110b6565b6004555b600454156108b65760006108678360020154426104e2565b9050600061088860045461067186600101548561111790919063ffffffff16565b90506108ae6108a38461067184670de0b6b3a7640000611117565b6003860154906110b6565b600385015550505b50426002909101555b50565b6000600282815481106108d157fe5b600091825260208083208584526003825260408085203380875293528420805485825560018201959095556005909302018054909450919291610921916001600160a01b0391909116908361128d565b604080518281529051859133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a350505050565b6000546001600160a01b031633146109a75760405162461bcd60e51b815260040180806020018281038252602f815260200180611687602f913960400191505060405180910390fd5b6006546276a70001421015610a8f576001546001600160a01b0384811691161415610a04576040805162461bcd60e51b81526020600482015260086024820152673a3934b837b630b960c11b604482015290519081900360640190fd5b60025460005b81811015610a8c57600060028281548110610a2157fe5b6000918252602090912060059091020180549091506001600160a01b0387811691161415610a83576040805162461bcd60e51b815260206004820152600a6024820152693837b7b6173a37b5b2b760b11b604482015290519081900360640190fd5b50600101610a0a565b50505b610aa36001600160a01b038416828461128d565b505050565b6000546001600160a01b031681565b60055481565b60025460005b81811015610adc57610ad481610764565b600101610ac3565b5050565b60065481565b60008060028481548110610af657fe5b60009182526020808320878452600380835260408086206001600160a01b03808b168852908552818720600590960290930191820154825482516370a0823160e01b815230600482015292519398509596909590949316926370a0823192602480840193829003018186803b158015610b6e57600080fd5b505afa158015610b82573d6000803e3d6000fd5b505050506040513d6020811015610b9857600080fd5b5051600285015490915042118015610baf57508015155b15610c0c576000610bc48560020154426104e2565b90506000610be560045461067188600101548561111790919063ffffffff16565b9050610c07610c008461067184670de0b6b3a7640000611117565b85906110b6565b935050505b610c378360010154610677670de0b6b3a764000061067186886000015461111790919063ffffffff16565b979650505050505050565b60036020908152600092835260408084209091529082529020805460019091015482565b60085481565b6000546001600160a01b03163314610cb55760405162461bcd60e51b815260040180806020018281038252602f815260200180611687602f913960400191505060405180910390fd5b610cbe836112df565b8115610ccc57610ccc610abd565b600554421015610cf85780610ce45750600554610cf3565b600554811015610cf357506005545b610d0c565b801580610d0457504281105b15610d0c5750425b600060055482111580610d1f5750428211155b6040805160a0810182526001600160a01b03878116825260208201898152928201868152600060608401818152861580156080870190815260028054600181018255945295517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600590940293840180546001600160a01b031916919096161790945594517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf82015590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad082015592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad184015590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad2909201805460ff191692151592909217909155909150610e6257600454610e5e90866110b6565b6004555b5050505050565b6000546001600160a01b03163314610eb25760405162461bcd60e51b815260040180806020018281038252602f815260200180611687602f913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b60075481565b6000339050600060028481548110610efd57fe5b600091825260208083208784526003825260408085206001600160a01b0388168652909252922060059091029091019150610f3785610764565b805415610fc3576000610f6f8260010154610677670de0b6b3a76400006106718760030154876000015461111790919063ffffffff16565b90508015610fc157610f8184826111d7565b6040805182815290516001600160a01b038616917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b505b8315610fef578154610fe0906001600160a01b0316843087611363565b8054610fec90856110b6565b81555b6003820154815461100d91670de0b6b3a76400009161067191611117565b600182015560408051858152905186916001600160a01b038616917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050505050565b6000828211156110b0576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611110576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082611126575060006105a1565b8282028284828161113357fe5b04146111105760405162461bcd60e51b81526004018080602001828103825260218152602001806116dc6021913960400191505060405180910390fd5b60008082116111c6576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816111cf57fe5b049392505050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d602081101561124c57600080fd5b505190508015610aa3578082111561127a57600154611275906001600160a01b0316848361128d565b610aa3565b600154610aa3906001600160a01b031684845b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610aa39084906113c3565b60025460005b81811015610aa357826001600160a01b03166002828154811061130457fe5b60009182526020909120600590910201546001600160a01b0316141561135b5760405162461bcd60e51b81526004018080602001828103825260238152602001806117276023913960400191505060405180910390fd5b6001016112e5565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526113bd9085906113c3565b50505050565b6060611418826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114749092919063ffffffff16565b805190915015610aa35780806020019051602081101561143757600080fd5b5051610aa35760405162461bcd60e51b815260040180806020018281038252602a8152602001806116fd602a913960400191505060405180910390fd5b6060611483848460008561148b565b949350505050565b6060824710156114cc5760405162461bcd60e51b81526004018080602001828103825260268152602001806116b66026913960400191505060405180910390fd5b6114d5856115dc565b611526576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106115655780518252601f199092019160209182019101611546565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146115c7576040519150601f19603f3d011682016040523d82523d6000602084013e6115cc565b606091505b5091509150610c378282866115e2565b3b151590565b606083156115f1575081611110565b8251156116015782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561164b578181015183820152602001611633565b50505050905090810190601f1680156116785780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe547269706f6c617247656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f70657261746f72416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564547269706f6c617247656e65736973506f6f6c3a206578697374696e6720706f6f6c3fa26469706673582212200154399ef8bf7c8fe214004a2fecfeaed82b80326a83ea9b2d74bdf71101094a64736f6c634300060c003300000000000000000000000060527a2751a827ec0adf861efcacbf111587d74800000000000000000000000000000000000000000000000000000000625acbe0

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

00000000000000000000000060527a2751a827ec0adf861efcacbf111587d74800000000000000000000000000000000000000000000000000000000625acbe0

-----Decoded View---------------
Arg [0] : _tripolar (address): 0x60527a2751a827ec0adf861efcacbf111587d748
Arg [1] : _poolStartTime (uint256): 1650117600

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000060527a2751a827ec0adf861efcacbf111587d748
Arg [1] : 00000000000000000000000000000000000000000000000000000000625acbe0


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