Source Code
Latest 25 from a total of 6,594 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 22045141 | 363 days ago | IN | 0 ETH | 0.0000802 | ||||
| Update Pool | 20728242 | 547 days ago | IN | 0 ETH | 0.0002882 | ||||
| Harvest | 20728179 | 547 days ago | IN | 0 ETH | 0.000609 | ||||
| Emergency Withdr... | 20724681 | 548 days ago | IN | 0 ETH | 0.00014298 | ||||
| Withdraw And Har... | 20584022 | 567 days ago | IN | 0 ETH | 0.00011805 | ||||
| Withdraw And Har... | 19506038 | 718 days ago | IN | 0 ETH | 0.00550308 | ||||
| Withdraw And Har... | 19451022 | 726 days ago | IN | 0 ETH | 0.00338781 | ||||
| Withdraw And Har... | 19451010 | 726 days ago | IN | 0 ETH | 0.00350919 | ||||
| Withdraw And Har... | 19297441 | 747 days ago | IN | 0 ETH | 0.00269315 | ||||
| Withdraw And Har... | 19175811 | 764 days ago | IN | 0 ETH | 0.00234858 | ||||
| Harvest | 19175493 | 764 days ago | IN | 0 ETH | 0.00265035 | ||||
| Withdraw And Har... | 19017052 | 787 days ago | IN | 0 ETH | 0.00417595 | ||||
| Withdraw And Har... | 19010581 | 788 days ago | IN | 0 ETH | 0.00164117 | ||||
| Withdraw And Har... | 18915233 | 801 days ago | IN | 0 ETH | 0.00176864 | ||||
| Withdraw And Har... | 18508280 | 858 days ago | IN | 0 ETH | 0.00212654 | ||||
| Withdraw And Har... | 18455569 | 865 days ago | IN | 0 ETH | 0.0017569 | ||||
| Withdraw And Har... | 18438711 | 868 days ago | IN | 0 ETH | 0.00240279 | ||||
| Withdraw And Har... | 17811348 | 956 days ago | IN | 0 ETH | 0.00181468 | ||||
| Withdraw And Har... | 17527930 | 995 days ago | IN | 0 ETH | 0.00316519 | ||||
| Withdraw And Har... | 17418431 | 1011 days ago | IN | 0 ETH | 0.0031334 | ||||
| Withdraw And Har... | 17418397 | 1011 days ago | IN | 0 ETH | 0.0031526 | ||||
| Withdraw And Har... | 17324729 | 1024 days ago | IN | 0 ETH | 0.01192719 | ||||
| Withdraw And Har... | 17143831 | 1049 days ago | IN | 0 ETH | 0.00367116 | ||||
| Withdraw And Har... | 17143750 | 1049 days ago | IN | 0 ETH | 0.00391692 | ||||
| Withdraw And Har... | 16998569 | 1070 days ago | IN | 0 ETH | 0.00264884 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
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 Name:
MultiTokenStaking
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol";
import "@boringcrypto/boring-solidity/contracts/BoringBatchable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./libraries/SignedSafeMath.sol";
import "./interfaces/IRewarder.sol";
import "./interfaces/IRewardsSchedule.sol";
/************************************************************************************************
Originally from
https://github.com/sushiswap/sushiswap/blob/master/contracts/MasterChefV2.sol
and
https://github.com/sushiswap/sushiswap/blob/master/contracts/MasterChef.sol
This source code has been modified from the original, which was copied from the github repository
at commit hash 10148a31d9192bc803dac5d24fe0319b52ae99a4.
*************************************************************************************************/
contract MultiTokenStaking is Ownable, BoringBatchable {
using BoringMath for uint256;
using BoringMath128 for uint128;
using BoringERC20 for IERC20;
using SignedSafeMath for int256;
/** ========== Constants ========== */
uint256 private constant ACC_REWARDS_PRECISION = 1e12;
/**
* @dev ERC20 token used to distribute rewards.
*/
IERC20 public immutable rewardsToken;
/**
* @dev Contract that determines the amount of rewards distributed per block.
* Note: This contract MUST always return the exact same value for any
* combination of `(from, to)` IF `from` is less than `block.number`.
*/
IRewardsSchedule public immutable rewardsSchedule;
/** ========== Structs ========== */
/**
* @dev Info of each user.
* @param amount LP token amount the user has provided.
* @param rewardDebt The amount of rewards entitled to the user.
*/
struct UserInfo {
uint256 amount;
int256 rewardDebt;
}
/**
* @dev Info of each rewards pool.
* @param accRewardsPerShare Total rewards accumulated per staked token.
* @param lastRewardBlock Last time rewards were updated for the pool.
* @param allocPoint The amount of allocation points assigned to the pool.
*/
struct PoolInfo {
uint128 accRewardsPerShare;
uint64 lastRewardBlock;
uint64 allocPoint;
}
/** ========== Events ========== */
event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
event Harvest(address indexed user, uint256 indexed pid, uint256 amount);
event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);
event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);
event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accRewardsPerShare);
event RewardsAdded(uint256 amount);
event PointsAllocatorSet(address pointsAllocator);
/** ========== Storage ========== */
/**
* @dev Indicates whether a staking pool exists for a given staking token.
*/
mapping(address => bool) public stakingPoolExists;
/**
* @dev Info of each staking pool.
*/
PoolInfo[] public poolInfo;
/**
* @dev Address of the LP token for each staking pool.
*/
mapping(uint256 => IERC20) public lpToken;
/**
* @dev Address of each `IRewarder` contract.
*/
mapping(uint256 => IRewarder) public rewarder;
/**
* @dev Info of each user that stakes tokens.
*/
mapping(uint256 => mapping(address => UserInfo)) public userInfo;
/**
* @dev Total allocation points. Must be the sum of all allocation points in all pools.
*/
uint256 public totalAllocPoint = 0;
/**
* @dev Account allowed to allocate points.
*/
address public pointsAllocator;
/**
* @dev Total rewards received from governance for distribution.
* Used to return remaining rewards if staking is canceled.
*/
uint256 public totalRewardsReceived;
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
/** ========== Modifiers ========== */
/**
* @dev Ensure the caller is allowed to allocate points.
*/
modifier onlyPointsAllocatorOrOwner {
require(
msg.sender == pointsAllocator || msg.sender == owner(),
"MultiTokenStaking: not authorized to allocate points"
);
_;
}
/** ========== Constructor ========== */
constructor(address _rewardsToken, address _rewardsSchedule) public {
rewardsToken = IERC20(_rewardsToken);
rewardsSchedule = IRewardsSchedule(_rewardsSchedule);
}
/** ========== Governance ========== */
/**
* @dev Set the address of the points allocator.
* This account will have the ability to set allocation points for LP rewards.
*/
function setPointsAllocator(address _pointsAllocator) external onlyOwner {
pointsAllocator = _pointsAllocator;
emit PointsAllocatorSet(_pointsAllocator);
}
/**
* @dev Add rewards to be distributed.
*
* Note: This function must be used to add rewards if the owner
* wants to retain the option to cancel distribution and reclaim
* undistributed tokens.
*/
function addRewards(uint256 amount) external onlyPointsAllocatorOrOwner {
rewardsToken.safeTransferFrom(msg.sender, address(this), amount);
totalRewardsReceived = totalRewardsReceived.add(amount);
emit RewardsAdded(amount);
}
/**
* @dev Set the early end block for rewards on the rewards
* schedule contract and return any tokens which will not
* be distributed by the early end block.
*/
function setEarlyEndBlock(uint256 earlyEndBlock) external onlyOwner {
// Rewards schedule contract must assert that an early end block has not
// already been set, otherwise this can be used to drain the staking
// contract, meaning users will not receive earned rewards.
uint256 totalRewards = rewardsSchedule.getRewardsForBlockRange(
rewardsSchedule.startBlock(),
earlyEndBlock
);
uint256 undistributedAmount = totalRewardsReceived.sub(totalRewards);
rewardsSchedule.setEarlyEndBlock(earlyEndBlock);
rewardsToken.safeTransfer(owner(), undistributedAmount);
}
/** ========== Pools ========== */
/**
* @dev Add a new LP to the pool.
* Can only be called by the owner or the points allocator.
* @param _allocPoint AP of the new pool.
* @param _lpToken Address of the LP ERC-20 token.
* @param _rewarder Address of the rewarder delegate.
*/
function add(uint256 _allocPoint, IERC20 _lpToken, IRewarder _rewarder) public onlyPointsAllocatorOrOwner {
require(address(_lpToken) != address(rewardsToken), "MultiTokenStaking: Can not add rewards token.");
require(!stakingPoolExists[address(_lpToken)], "MultiTokenStaking: Staking pool already exists.");
uint256 pid = poolInfo.length;
totalAllocPoint = totalAllocPoint.add(_allocPoint);
lpToken[pid] = _lpToken;
if (address(_rewarder) != address(0)) {
rewarder[pid] = _rewarder;
}
poolInfo.push(PoolInfo({
allocPoint: _allocPoint.to64(),
lastRewardBlock: block.number.to64(),
accRewardsPerShare: 0
}));
stakingPoolExists[address(_lpToken)] = true;
emit LogPoolAddition(pid, _allocPoint, _lpToken, _rewarder);
}
/**
* @dev Update the given pool's allocation points.
* Can only be called by the owner or the points allocator.
* @param _pid The index of the pool. See `poolInfo`.
* @param _allocPoint New AP of the pool.
* @param _rewarder Address of the rewarder delegate.
* @param _overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.
*/
function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool _overwrite) public onlyPointsAllocatorOrOwner {
totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
poolInfo[_pid].allocPoint = _allocPoint.to64();
if (_overwrite) {
rewarder[_pid] = _rewarder;
}
emit LogSetPool(_pid, _allocPoint, _overwrite ? _rewarder : rewarder[_pid], _overwrite);
}
/**
* @dev Update reward variables for all pools in `pids`.
* Note: This can become very expensive.
* @param pids Pool IDs of all to be updated. Make sure to update all active pools.
*/
function massUpdatePools(uint256[] calldata pids) external {
uint256 len = pids.length;
for (uint256 i = 0; i < len; ++i) {
updatePool(pids[i]);
}
}
/**
* @dev Update reward variables of the given pool.
* @param _pid The index of the pool. See `poolInfo`.
* @return pool Returns the pool that was updated.
*/
function updatePool(uint256 _pid) public returns (PoolInfo memory pool) {
pool = poolInfo[_pid];
if (block.number > pool.lastRewardBlock) {
uint256 lpSupply = lpToken[_pid].balanceOf(address(this));
if (lpSupply > 0) {
uint256 rewardsTotal = rewardsSchedule.getRewardsForBlockRange(pool.lastRewardBlock, block.number);
uint256 poolReward = rewardsTotal.mul(pool.allocPoint) / totalAllocPoint;
pool.accRewardsPerShare = pool.accRewardsPerShare.add((poolReward.mul(ACC_REWARDS_PRECISION) / lpSupply).to128());
}
pool.lastRewardBlock = block.number.to64();
poolInfo[_pid] = pool;
emit LogUpdatePool(_pid, pool.lastRewardBlock, lpSupply, pool.accRewardsPerShare);
}
}
/** ========== Users ========== */
/**
* @dev View function to see pending rewards on frontend.
* @param _pid The index of the pool. See `poolInfo`.
* @param _user Address of user.
* @return pending rewards for a given user.
*/
function pendingRewards(uint256 _pid, address _user) external view returns (uint256 pending) {
PoolInfo memory pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accRewardsPerShare = pool.accRewardsPerShare;
uint256 lpSupply = lpToken[_pid].balanceOf(address(this));
if (block.number > pool.lastRewardBlock && lpSupply != 0) {
uint256 rewardsTotal = rewardsSchedule.getRewardsForBlockRange(pool.lastRewardBlock, block.number);
uint256 poolReward = rewardsTotal.mul(pool.allocPoint) / totalAllocPoint;
accRewardsPerShare = accRewardsPerShare.add(poolReward.mul(ACC_REWARDS_PRECISION) / lpSupply);
}
pending = int256(user.amount.mul(accRewardsPerShare) / ACC_REWARDS_PRECISION).sub(user.rewardDebt).toUInt256();
}
/**
* @dev Deposit LP tokens to earn rewards.
* @param _pid The index of the pool. See `poolInfo`.
* @param _amount LP token amount to deposit.
* @param _to The receiver of `_amount` deposit benefit.
*/
function deposit(uint256 _pid, uint256 _amount, address _to) public {
PoolInfo memory pool = updatePool(_pid);
UserInfo storage user = userInfo[_pid][_to];
// Effects
user.amount = user.amount.add(_amount);
user.rewardDebt = user.rewardDebt.add(int256(_amount.mul(pool.accRewardsPerShare) / ACC_REWARDS_PRECISION));
// Interactions
lpToken[_pid].safeTransferFrom(msg.sender, address(this), _amount);
emit Deposit(msg.sender, _pid, _amount, _to);
}
/**
* @dev Withdraw LP tokens from the staking contract.
* @param _pid The index of the pool. See `poolInfo`.
* @param _amount LP token amount to withdraw.
* @param _to Receiver of the LP tokens.
*/
function withdraw(uint256 _pid, uint256 _amount, address _to) public {
PoolInfo memory pool = updatePool(_pid);
UserInfo storage user = userInfo[_pid][msg.sender];
// Effects
user.rewardDebt = user.rewardDebt.sub(int256(_amount.mul(pool.accRewardsPerShare) / ACC_REWARDS_PRECISION));
user.amount = user.amount.sub(_amount);
// Interactions
lpToken[_pid].safeTransfer(_to, _amount);
emit Withdraw(msg.sender, _pid, _amount, _to);
}
/**
* @dev Harvest proceeds for transaction sender to `_to`.
* @param _pid The index of the pool. See `poolInfo`.
* @param _to Receiver of rewards.
*/
function harvest(uint256 _pid, address _to) public {
PoolInfo memory pool = updatePool(_pid);
UserInfo storage user = userInfo[_pid][msg.sender];
int256 accumulatedRewards = int256(user.amount.mul(pool.accRewardsPerShare) / ACC_REWARDS_PRECISION);
uint256 _pendingRewards = accumulatedRewards.sub(user.rewardDebt).toUInt256();
// Effects
user.rewardDebt = accumulatedRewards;
// Interactions
rewardsToken.safeTransfer(_to, _pendingRewards);
address _rewarder = address(rewarder[_pid]);
if (_rewarder != address(0)) {
IRewarder(_rewarder).onStakingReward(_pid, msg.sender, _pendingRewards);
}
emit Harvest(msg.sender, _pid, _pendingRewards);
}
/**
* @dev Withdraw LP tokens and harvest accumulated rewards, sending both to `to`.
* @param _pid The index of the pool. See `poolInfo`.
* @param _amount LP token amount to withdraw.
* @param _to Receiver of the LP tokens and rewards.
*/
function withdrawAndHarvest(uint256 _pid, uint256 _amount, address _to) public {
PoolInfo memory pool = updatePool(_pid);
UserInfo storage user = userInfo[_pid][msg.sender];
int256 accumulatedRewards = int256(user.amount.mul(pool.accRewardsPerShare) / ACC_REWARDS_PRECISION);
uint256 _pendingRewards = accumulatedRewards.sub(user.rewardDebt).toUInt256();
// Effects
user.rewardDebt = accumulatedRewards.sub(int256(_amount.mul(pool.accRewardsPerShare) / ACC_REWARDS_PRECISION));
user.amount = user.amount.sub(_amount);
// Interactions
rewardsToken.safeTransfer(_to, _pendingRewards);
lpToken[_pid].safeTransfer(_to, _amount);
address _rewarder = address(rewarder[_pid]);
if (_rewarder != address(0)) {
IRewarder(_rewarder).onStakingReward(_pid, msg.sender, _pendingRewards);
}
emit Harvest(msg.sender, _pid, _pendingRewards);
emit Withdraw(msg.sender, _pid, _amount, _to);
}
/**
* @dev Withdraw without caring about rewards. EMERGENCY ONLY.
* @param _pid The index of the pool. See `poolInfo`.
* @param _to Receiver of the LP tokens.
*/
function emergencyWithdraw(uint256 _pid, address _to) public {
UserInfo storage user = userInfo[_pid][msg.sender];
uint256 amount = user.amount;
user.amount = 0;
user.rewardDebt = 0;
// Note: transfer can fail or succeed if `amount` is zero.
lpToken[_pid].safeTransfer(_to, amount);
emit EmergencyWithdraw(msg.sender, _pid, amount, _to);
}
}// SPDX-License-Identifier: UNLICENSED
// Audit on 5-Jan-2021 by Keno and BoringCrypto
// P1 - P3: OK
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
// solhint-disable avoid-low-level-calls
import "./libraries/BoringERC20.sol";
// T1 - T4: OK
contract BaseBoringBatchable {
function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
// If the _res length is less than 68, then the transaction failed silently (without a revert message)
if (_returnData.length < 68) return "Transaction reverted silently";
assembly {
// Slice the sighash.
_returnData := add(_returnData, 0x04)
}
return abi.decode(_returnData, (string)); // All that remains is the revert string
}
// F3 - F9: OK
// F1: External is ok here because this is the batch function, adding it to a batch makes no sense
// F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value
// C1 - C21: OK
// C3: The length of the loop is fully under user control, so can't be exploited
// C7: Delegatecall is only used on the same contract, so it's safe
function batch(bytes[] calldata calls, bool revertOnFail) external payable returns(bool[] memory successes, bytes[] memory results) {
// Interactions
successes = new bool[](calls.length);
results = new bytes[](calls.length);
for (uint256 i = 0; i < calls.length; i++) {
(bool success, bytes memory result) = address(this).delegatecall(calls[i]);
require(success || !revertOnFail, _getRevertMsg(result));
successes[i] = success;
results[i] = result;
}
}
}
// T1 - T4: OK
contract BoringBatchable is BaseBoringBatchable {
// F1 - F9: OK
// F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)
// if part of a batch this could be used to grief once as the second call would not need the permit
// C1 - C21: OK
function permitToken(IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
// Interactions
// X1 - X5
token.permit(from, to, amount, deadline, v, r, s);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
// EIP 2612
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
import "../interfaces/IERC20.sol";
library BoringERC20 {
function safeSymbol(IERC20 token) internal view returns(string memory) {
(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));
return success && data.length > 0 ? abi.decode(data, (string)) : "???";
}
function safeName(IERC20 token) internal view returns(string memory) {
(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));
return success && data.length > 0 ? abi.decode(data, (string)) : "???";
}
function safeDecimals(IERC20 token) internal view returns (uint8) {
(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));
return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
}
function safeTransfer(IERC20 token, address to, uint256 amount) internal {
(bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));
require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed");
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {
(bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));
require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed");
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
// a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math)
library BoringMath {
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, "BoringMath: Mul Overflow");}
function to128(uint256 a) internal pure returns (uint128 c) {
require(a <= uint128(-1), "BoringMath: uint128 Overflow");
c = uint128(a);
}
function to64(uint256 a) internal pure returns (uint64 c) {
require(a <= uint64(-1), "BoringMath: uint64 Overflow");
c = uint64(a);
}
function to32(uint256 a) internal pure returns (uint32 c) {
require(a <= uint32(-1), "BoringMath: uint32 Overflow");
c = uint32(a);
}
}
library BoringMath128 {
function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
}
library BoringMath64 {
function add(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
}
library BoringMath32 {
function add(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IRewarder {
function onStakingReward(uint256 pid, address user, uint256 rewardAmount) external;
function pendingTokens(uint256 pid, address user, uint256 rewardAmount) external returns (address[] memory, uint256[] memory);
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IRewardsSchedule {
event EarlyEndBlockSet(uint256 earlyEndBlock);
function startBlock() external view returns (uint256);
function endBlock() external view returns (uint256);
function getRewardsForBlockRange(uint256 from, uint256 to) external view returns (uint256);
function setEarlyEndBlock(uint256 earlyEndBlock) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
library SignedSafeMath {
int256 constant private _INT256_MIN = -2**255;
/**
* @dev Returns the multiplication of two signed integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(int256 a, int256 b) internal pure returns (int256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");
int256 c = a * b;
require(c / a == b, "SignedSafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two signed integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(int256 a, int256 b) internal pure returns (int256) {
require(b != 0, "SignedSafeMath: division by zero");
require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");
int256 c = a / b;
return c;
}
/**
* @dev Returns the subtraction of two signed integers, reverting on
* overflow.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b;
require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");
return c;
}
/**
* @dev Returns the addition of two signed integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");
return c;
}
function toUInt256(int256 a) internal pure returns (uint256) {
require(a >= 0, "Integer < 0");
return uint256(a);
}
}{
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "none",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 800
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsSchedule","type":"address"}],"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"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"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"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"EmergencyWithdraw","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":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"lpToken","type":"address"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"}],"name":"LogPoolAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"},{"indexed":false,"internalType":"bool","name":"overwrite","type":"bool"}],"name":"LogSetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"lastRewardBlock","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accRewardsPerShare","type":"uint256"}],"name":"LogUpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pointsAllocator","type":"address"}],"name":"PointsAllocatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsAdded","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"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"calls","type":"bytes[]"},{"internalType":"bool","name":"revertOnFail","type":"bool"}],"name":"batch","outputs":[{"internalType":"bool[]","name":"successes","type":"bool[]"},{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permitToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pointsAllocator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint128","name":"accRewardsPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardBlock","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewarder","outputs":[{"internalType":"contract IRewarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsSchedule","outputs":[{"internalType":"contract IRewardsSchedule","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"},{"internalType":"bool","name":"_overwrite","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"earlyEndBlock","type":"uint256"}],"name":"setEarlyEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pointsAllocator","type":"address"}],"name":"setPointsAllocator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingPoolExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint128","name":"accRewardsPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardBlock","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"internalType":"struct MultiTokenStaking.PoolInfo","name":"pool","type":"tuple"}],"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":"int256","name":"rewardDebt","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawAndHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60c060405260006006553480156200001657600080fd5b5060405162002d4d38038062002d4d8339810160408190526200003991620000b2565b600062000045620000ae565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606092831b8116608052911b1660a05262000109565b3390565b60008060408385031215620000c5578182fd5b8251620000d281620000f0565b6020840151909250620000e581620000f0565b809150509250929050565b6001600160a01b03811681146200010657600080fd5b50565b60805160601c60a05160601c612be862000165600039806109e052806113cb52806115375280611b395280611b685280611c9852508061073552806110c35280611346528061171d52806118825280611d145250612be86000f3fe6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063c346253d11610095578063d1af0c7d11610064578063d1af0c7d146104f6578063d2423b511461050b578063f2fde38b1461052c578063f787f16e1461054c576101c2565b8063c346253d14610481578063cd4b17fe146104a1578063d18df53c146104b6578063d1abb907146104d6576101c2565b806393f1a40b116100d157806393f1a40b146103e65780639bfade8314610414578063ab7de09814610441578063beceed3914610461576101c2565b80638da5cb5b1461039c5780638dbdbe6d146103b15780638fd82789146103d1576101c2565b806351eb05a61161016457806378ed5d1f1161013e57806378ed5d1f1461030f5780637c516e941461033c57806388bba42f1461035c5780638b90934f1461037c576101c2565b806351eb05a6146102ad57806357a5b58c146102da578063715018a6146102fa576101c2565b806317caf6f1116101a057806317caf6f11461024357806318fccc76146102585780632f940c70146102785780634d5428a714610298576101c2565b8063081e3eda146101c75780630ad58d2f146101f25780631526fe2714610214575b600080fd5b3480156101d357600080fd5b506101dc61056c565b6040516101e99190612ab9565b60405180910390f35b3480156101fe57600080fd5b5061021261020d366004612458565b610572565b005b34801561022057600080fd5b5061023461022f3660046123c3565b61065e565b6040516101e993929190612a8e565b34801561024f57600080fd5b506101dc6106a1565b34801561026457600080fd5b506102126102733660046123f3565b6106a7565b34801561028457600080fd5b506102126102933660046123f3565b610828565b3480156102a457600080fd5b506101dc6108be565b3480156102b957600080fd5b506102cd6102c83660046123c3565b6108c4565b6040516101e99190612a54565b3480156102e657600080fd5b506102126102f5366004612245565b610bd6565b34801561030657600080fd5b50610212610c0c565b34801561031b57600080fd5b5061032f61032a3660046123c3565b610c9e565b6040516101e99190612526565b34801561034857600080fd5b506102126103573660046122a1565b610cb9565b34801561036857600080fd5b50610212610377366004612485565b610d2d565b34801561038857600080fd5b506102126103973660046121d4565b610ea1565b3480156103a857600080fd5b5061032f610f36565b3480156103bd57600080fd5b506102126103cc366004612458565b610f45565b3480156103dd57600080fd5b5061032f61102c565b3480156103f257600080fd5b506104066104013660046123f3565b61103b565b6040516101e9929190612af1565b34801561042057600080fd5b5061043461042f3660046121d4565b61105f565b6040516101e99190612652565b34801561044d57600080fd5b5061021261045c366004612422565b611074565b34801561046d57600080fd5b5061021261047c3660046123c3565b6112ec565b34801561048d57600080fd5b5061032f61049c3660046123c3565b6113ae565b3480156104ad57600080fd5b5061032f6113c9565b3480156104c257600080fd5b506101dc6104d13660046123f3565b6113ed565b3480156104e257600080fd5b506102126104f1366004612458565b61164f565b34801561050257600080fd5b5061032f611880565b61051e6105193660046121f0565b6118a4565b6040516101e99291906125b8565b34801561053857600080fd5b506102126105473660046121d4565b611a36565b34801561055857600080fd5b506102126105673660046123c3565b611af6565b60025490565b61057a61216b565b610583846108c4565b600085815260056020908152604080832033845290915290208151919250906105d59064e8d4a51000906105c19087906001600160801b0316611d40565b816105c857fe5b6001840154919004611d7d565b600182015580546105e69085611dca565b815560008581526003602052604090205461060b906001600160a01b03168486611ded565b826001600160a01b031685336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328760405161064f9190612ab9565b60405180910390a45050505050565b6002818154811061066b57fe5b6000918252602090912001546001600160801b038116915067ffffffffffffffff600160801b8204811691600160c01b90041683565b60065481565b6106af61216b565b6106b8836108c4565b6000848152600560209081526040808320338452909152812082518154939450909264e8d4a51000916106f491906001600160801b0316611d40565b816106fb57fe5b049050600061071f61071a846001015484611d7d90919063ffffffff16565b611ef0565b60018401839055905061075c6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683611ded565b6000868152600460205260409020546001600160a01b031680156107dd57604051633f72ff1160e11b81526001600160a01b03821690637ee5fe22906107aa908a9033908790600401612ac2565b600060405180830381600087803b1580156107c457600080fd5b505af11580156107d8573d6000803e3d6000fd5b505050505b86336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954846040516108179190612ab9565b60405180910390a350505050505050565b60008281526005602090815260408083203384528252808320805484825560018201859055868552600390935292205461086c906001600160a01b03168483611ded565b826001600160a01b031684336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b846040516108b09190612ab9565b60405180910390a450505050565b60085481565b6108cc61216b565b600282815481106108d957fe5b60009182526020918290206040805160608101825292909101546001600160801b038116835267ffffffffffffffff600160801b82048116948401859052600160c01b90910416908201529150431115610bd1576000828152600360205260408082205490516370a0823160e01b81526001600160a01b03909116906370a0823190610969903090600401612526565b60206040518083038186803b15801561098157600080fd5b505afa158015610995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b991906123db565b90508015610ad957602082015160405163a277831160e01b81526000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a277831191610a15914390600401612aff565b60206040518083038186803b158015610a2d57600080fd5b505afa158015610a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6591906123db565b90506000600654610a8d856040015167ffffffffffffffff1684611d4090919063ffffffff16565b81610a9457fe5b049050610acb610aba84610aad8464e8d4a51000611d40565b81610ab457fe5b04611f16565b85516001600160801b031690611f3f565b6001600160801b0316845250505b610ae243611f6e565b67ffffffffffffffff1660208301526002805483919085908110610b0257fe5b6000918252602091829020835191018054848401516040958601516fffffffffffffffffffffffffffffffff199092166001600160801b039094169390931767ffffffffffffffff60801b1916600160801b67ffffffffffffffff948516021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b93909116929092029190911790558301518351915185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35392610bc79290918691612b19565b60405180910390a2505b919050565b8060005b81811015610c0657610bfd848483818110610bf157fe5b905060200201356108c4565b50600101610bda565b50505050565b610c14611f98565b6001600160a01b0316610c25610f36565b6001600160a01b031614610c545760405162461bcd60e51b8152600401610c4b90612938565b60405180910390fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6003602052600090815260409020546001600160a01b031681565b60405163d505accf60e01b81526001600160a01b0389169063d505accf90610cf1908a908a908a908a908a908a908a9060040161255e565b600060405180830381600087803b158015610d0b57600080fd5b505af1158015610d1f573d6000803e3d6000fd5b505050505050505050505050565b6007546001600160a01b0316331480610d5e5750610d49610f36565b6001600160a01b0316336001600160a01b0316145b610d7a5760405162461bcd60e51b8152600401610c4b9061273b565b610dba83610db460028781548110610d8e57fe5b60009182526020909120015460065490600160c01b900467ffffffffffffffff16611dca565b90611f9c565b600655610dc683611f6e565b60028581548110610dd357fe5b9060005260206000200160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508015610e3457600084815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b80610e56576000848152600460205260409020546001600160a01b0316610e58565b815b6001600160a01b0316847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e18658584604051610e93929190612ae1565b60405180910390a350505050565b610ea9611f98565b6001600160a01b0316610eba610f36565b6001600160a01b031614610ee05760405162461bcd60e51b8152600401610c4b90612938565b600780546001600160a01b0319166001600160a01b0383161790556040517ffbd9f7b3f09a4e02b45dc9a4edc998ccb59c7ad8a617ac1321574aaafb39573a90610f2b908390612526565b60405180910390a150565b6000546001600160a01b031690565b610f4d61216b565b610f56846108c4565b60008581526005602090815260408083206001600160a01b03871684529091529020805491925090610f889085611f9c565b81558151610fbf9064e8d4a5100090610fab9087906001600160801b0316611d40565b81610fb257fe5b6001840154919004611fbf565b6001820155600085815260036020526040902054610fe8906001600160a01b0316333087612005565b826001600160a01b031685336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478760405161064f9190612ab9565b6007546001600160a01b031681565b60056020908152600092835260408084209091529082529020805460019091015482565b60016020526000908152604090205460ff1681565b6007546001600160a01b03163314806110a55750611090610f36565b6001600160a01b0316336001600160a01b0316145b6110c15760405162461bcd60e51b8152600401610c4b9061273b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156111135760405162461bcd60e51b8152600401610c4b906128a4565b6001600160a01b03821660009081526001602052604090205460ff161561114c5760405162461bcd60e51b8152600401610c4b906126a7565b60025460065461115c9085611f9c565b600655600081815260036020526040902080546001600160a01b0319166001600160a01b03858116919091179091558216156111ba57600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b6002604051806060016040528060006001600160801b031681526020016111e043611f6e565b67ffffffffffffffff1681526020016111f887611f6e565b67ffffffffffffffff90811690915282546001818101855560009485526020808620855193018054828701516040978801518716600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff91909716600160801b0267ffffffffffffffff60801b196001600160801b039097166fffffffffffffffffffffffffffffffff1990931692909217959095161793909316939093179091556001600160a01b038088168086529282905293839020805460ff1916909117905590519184169183907f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e5906108b0908990612ab9565b6007546001600160a01b031633148061131d5750611308610f36565b6001600160a01b0316336001600160a01b0316145b6113395760405162461bcd60e51b8152600401610c4b9061273b565b61136e6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084612005565b60085461137b9082611f9c565b6008556040517ff8fad42e780bfa5459be3fe691e8ba1aec70342250112139c5771c3fd155f31290610f2b908390612ab9565b6004602052600090815260409020546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006113f761216b565b6002848154811061140457fe5b600091825260208083206040805160608101825291909301546001600160801b03808216835267ffffffffffffffff600160801b8304811684860152600160c01b90920490911682850152888552600583528385206001600160a01b03808a16875290845284862083518b885260039095528587205495516370a0823160e01b815293975095939091169316906370a08231906114a5903090600401612526565b60206040518083038186803b1580156114bd57600080fd5b505afa1580156114d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f591906123db565b9050836020015167ffffffffffffffff164311801561151357508015155b1561161657602084015160405163a277831160e01b81526000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a27783119161156c914390600401612aff565b60206040518083038186803b15801561158457600080fd5b505afa158015611598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bc91906123db565b905060006006546115e4876040015167ffffffffffffffff1684611d4090919063ffffffff16565b816115eb57fe5b049050611611836116018364e8d4a51000611d40565b8161160857fe5b86919004611f9c565b935050505b600183015483546116449161071a9164e8d4a51000906116369087611d40565b8161163d57fe5b0490611d7d565b979650505050505050565b61165761216b565b611660846108c4565b6000858152600560209081526040808320338452909152812082518154939450909264e8d4a510009161169c91906001600160801b0316611d40565b816116a357fe5b04905060006116c261071a846001015484611d7d90919063ffffffff16565b90506116fd64e8d4a510006116ed86600001516001600160801b031689611d4090919063ffffffff16565b816116f457fe5b84919004611d7d565b6001840155825461170e9087611dca565b83556117446001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683611ded565b600087815260036020526040902054611767906001600160a01b03168688611ded565b6000878152600460205260409020546001600160a01b031680156117e857604051633f72ff1160e11b81526001600160a01b03821690637ee5fe22906117b5908b9033908790600401612ac2565b600060405180830381600087803b1580156117cf57600080fd5b505af11580156117e3573d6000803e3d6000fd5b505050505b87336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954846040516118229190612ab9565b60405180910390a3856001600160a01b031688336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a60405161186e9190612ab9565b60405180910390a45050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060808367ffffffffffffffff811180156118be57600080fd5b506040519080825280602002602001820160405280156118e8578160200160208202803683370190505b5091508367ffffffffffffffff8111801561190257600080fd5b5060405190808252806020026020018201604052801561193657816020015b60608152602001906001900390816119215790505b50905060005b84811015611a2d57600060603088888581811061195557fe5b90506020028101906119679190612b44565b6040516119759291906124fa565b600060405180830381855af49150503d80600081146119b0576040519150601f19603f3d011682016040523d82523d6000602084013e6119b5565b606091505b509150915081806119c4575085155b6119cd8261210b565b906119eb5760405162461bcd60e51b8152600401610c4b919061265d565b50818584815181106119f957fe5b60200260200101901515908115158152505080848481518110611a1857fe5b6020908102919091010152505060010161193c565b50935093915050565b611a3e611f98565b6001600160a01b0316611a4f610f36565b6001600160a01b031614611a755760405162461bcd60e51b8152600401610c4b90612938565b6001600160a01b038116611a9b5760405162461bcd60e51b8152600401610c4b906127cf565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611afe611f98565b6001600160a01b0316611b0f610f36565b6001600160a01b031614611b355760405162461bcd60e51b8152600401610c4b90612938565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a27783117f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348cd4cb16040518163ffffffff1660e01b815260040160206040518083038186803b158015611bbf57600080fd5b505afa158015611bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf791906123db565b846040518363ffffffff1660e01b8152600401611c15929190612af1565b60206040518083038186803b158015611c2d57600080fd5b505afa158015611c41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6591906123db565b90506000611c7e82600854611dca90919063ffffffff16565b604051637bc3f8b760e11b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f787f16e90611ccd908690600401612ab9565b600060405180830381600087803b158015611ce757600080fd5b505af1158015611cfb573d6000803e3d6000fd5b50505050611d3b611d0a610f36565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169083611ded565b505050565b6000811580611d5b57505080820282828281611d5857fe5b04145b611d775760405162461bcd60e51b8152600401610c4b90612a1d565b92915050565b6000818303818312801590611d925750838113155b80611da75750600083128015611da757508381135b611dc35760405162461bcd60e51b8152600401610c4b906129a4565b9392505050565b80820382811115611d775760405162461bcd60e51b8152600401610c4b90612670565b60006060846001600160a01b031663a9059cbb8585604051602401611e1392919061259f565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611e61919061250a565b6000604051808303816000865af19150503d8060008114611e9e576040519150601f19603f3d011682016040523d82523d6000602084013e611ea3565b606091505b5091509150818015611ecd575080511580611ecd575080806020019051810190611ecd9190612285565b611ee95760405162461bcd60e51b8152600401610c4b90612798565b5050505050565b600080821215611f125760405162461bcd60e51b8152600401610c4b90612704565b5090565b60006001600160801b03821115611f125760405162461bcd60e51b8152600401610c4b9061286d565b8181016001600160801b038083169082161015611d775760405162461bcd60e51b8152600401610c4b90612901565b600067ffffffffffffffff821115611f125760405162461bcd60e51b8152600401610c4b9061296d565b3390565b81810181811015611d775760405162461bcd60e51b8152600401610c4b90612901565b6000828201818312801590611fd45750838112155b80611fe95750600083128015611fe957508381125b611dc35760405162461bcd60e51b8152600401610c4b9061282c565b60006060856001600160a01b03166323b872dd86868660405160240161202d9392919061253a565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161207b919061250a565b6000604051808303816000865af19150503d80600081146120b8576040519150601f19603f3d011682016040523d82523d6000602084013e6120bd565b606091505b50915091508180156120e75750805115806120e75750808060200190518101906120e79190612285565b6121035760405162461bcd60e51b8152600401610c4b906129e8565b505050505050565b6060604482511015612151575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c790000006020820152610bd1565b60048201915081806020019051810190611d779190612328565b604080516060810182526000808252602082018190529181019190915290565b60008083601f84011261219c578182fd5b50813567ffffffffffffffff8111156121b3578182fd5b60208301915083602080830285010111156121cd57600080fd5b9250929050565b6000602082840312156121e5578081fd5b8135611dc381612bb5565b600080600060408486031215612204578182fd5b833567ffffffffffffffff81111561221a578283fd5b6122268682870161218b565b909450925050602084013561223a81612bcd565b809150509250925092565b60008060208385031215612257578182fd5b823567ffffffffffffffff81111561226d578283fd5b6122798582860161218b565b90969095509350505050565b600060208284031215612296578081fd5b8151611dc381612bcd565b600080600080600080600080610100898b0312156122bd578384fd5b88356122c881612bb5565b975060208901356122d881612bb5565b965060408901356122e881612bb5565b9550606089013594506080890135935060a089013560ff8116811461230b578384fd5b979a969950949793969295929450505060c08201359160e0013590565b600060208284031215612339578081fd5b815167ffffffffffffffff80821115612350578283fd5b818401915084601f830112612363578283fd5b815181811115612371578384fd5b604051601f8201601f191681016020018381118282101715612391578586fd5b6040528181528382016020018710156123a8578485fd5b6123b9826020830160208701612b89565b9695505050505050565b6000602082840312156123d4578081fd5b5035919050565b6000602082840312156123ec578081fd5b5051919050565b60008060408385031215612405578182fd5b82359150602083013561241781612bb5565b809150509250929050565b600080600060608486031215612436578283fd5b83359250602084013561244881612bb5565b9150604084013561223a81612bb5565b60008060006060848603121561246c578283fd5b8335925060208401359150604084013561223a81612bb5565b6000806000806080858703121561249a578182fd5b843593506020850135925060408501356124b381612bb5565b915060608501356124c381612bcd565b939692955090935050565b600081518084526124e6816020860160208601612b89565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b6000825161251c818460208701612b89565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156125f35781511515845292840192908401906001016125d5565b5050508381038285015280855161260a8184612ab9565b91508192508381028201848801865b838110156126435785830385526126318383516124ce565b94870194925090860190600101612619565b50909998505050505050505050565b901515815260200190565b600060208252611dc360208301846124ce565b60208082526015908201527f426f72696e674d6174683a20556e646572666c6f770000000000000000000000604082015260600190565b6020808252602f908201527f4d756c7469546f6b656e5374616b696e673a205374616b696e6720706f6f6c2060408201527f616c7265616479206578697374732e0000000000000000000000000000000000606082015260800190565b6020808252600b908201527f496e7465676572203c2030000000000000000000000000000000000000000000604082015260600190565b60208082526034908201527f4d756c7469546f6b656e5374616b696e673a206e6f7420617574686f72697a6560408201527f6420746f20616c6c6f6361746520706f696e7473000000000000000000000000606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b6020808252602d908201527f4d756c7469546f6b656e5374616b696e673a2043616e206e6f7420616464207260408201527f65776172647320746f6b656e2e00000000000000000000000000000000000000606082015260800190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f766572604082015263666c6f7760e01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b0316815260208083015167ffffffffffffffff90811691830191909152604092830151169181019190915260600190565b6001600160801b0393909316835267ffffffffffffffff918216602084015216604082015260600190565b90815260200190565b9283526001600160a01b03919091166020830152604082015260600190565b9182521515602082015260400190565b918252602082015260400190565b67ffffffffffffffff929092168252602082015260400190565b67ffffffffffffffff93909316835260208301919091526001600160801b0316604082015260600190565b6000808335601e19843603018112612b5a578283fd5b83018035915067ffffffffffffffff821115612b74578283fd5b6020019150368190038213156121cd57600080fd5b60005b83811015612ba4578181015183820152602001612b8c565b83811115610c065750506000910152565b6001600160a01b0381168114612bca57600080fd5b50565b8015158114612bca57600080fdfea164736f6c634300060c000a00000000000000000000000086772b1409b61c639eaac9ba0acfbb6e238e5f83000000000000000000000000131ba0fc3e4e866e5daf3d16526846fdd3e67623
Deployed Bytecode
0x6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063c346253d11610095578063d1af0c7d11610064578063d1af0c7d146104f6578063d2423b511461050b578063f2fde38b1461052c578063f787f16e1461054c576101c2565b8063c346253d14610481578063cd4b17fe146104a1578063d18df53c146104b6578063d1abb907146104d6576101c2565b806393f1a40b116100d157806393f1a40b146103e65780639bfade8314610414578063ab7de09814610441578063beceed3914610461576101c2565b80638da5cb5b1461039c5780638dbdbe6d146103b15780638fd82789146103d1576101c2565b806351eb05a61161016457806378ed5d1f1161013e57806378ed5d1f1461030f5780637c516e941461033c57806388bba42f1461035c5780638b90934f1461037c576101c2565b806351eb05a6146102ad57806357a5b58c146102da578063715018a6146102fa576101c2565b806317caf6f1116101a057806317caf6f11461024357806318fccc76146102585780632f940c70146102785780634d5428a714610298576101c2565b8063081e3eda146101c75780630ad58d2f146101f25780631526fe2714610214575b600080fd5b3480156101d357600080fd5b506101dc61056c565b6040516101e99190612ab9565b60405180910390f35b3480156101fe57600080fd5b5061021261020d366004612458565b610572565b005b34801561022057600080fd5b5061023461022f3660046123c3565b61065e565b6040516101e993929190612a8e565b34801561024f57600080fd5b506101dc6106a1565b34801561026457600080fd5b506102126102733660046123f3565b6106a7565b34801561028457600080fd5b506102126102933660046123f3565b610828565b3480156102a457600080fd5b506101dc6108be565b3480156102b957600080fd5b506102cd6102c83660046123c3565b6108c4565b6040516101e99190612a54565b3480156102e657600080fd5b506102126102f5366004612245565b610bd6565b34801561030657600080fd5b50610212610c0c565b34801561031b57600080fd5b5061032f61032a3660046123c3565b610c9e565b6040516101e99190612526565b34801561034857600080fd5b506102126103573660046122a1565b610cb9565b34801561036857600080fd5b50610212610377366004612485565b610d2d565b34801561038857600080fd5b506102126103973660046121d4565b610ea1565b3480156103a857600080fd5b5061032f610f36565b3480156103bd57600080fd5b506102126103cc366004612458565b610f45565b3480156103dd57600080fd5b5061032f61102c565b3480156103f257600080fd5b506104066104013660046123f3565b61103b565b6040516101e9929190612af1565b34801561042057600080fd5b5061043461042f3660046121d4565b61105f565b6040516101e99190612652565b34801561044d57600080fd5b5061021261045c366004612422565b611074565b34801561046d57600080fd5b5061021261047c3660046123c3565b6112ec565b34801561048d57600080fd5b5061032f61049c3660046123c3565b6113ae565b3480156104ad57600080fd5b5061032f6113c9565b3480156104c257600080fd5b506101dc6104d13660046123f3565b6113ed565b3480156104e257600080fd5b506102126104f1366004612458565b61164f565b34801561050257600080fd5b5061032f611880565b61051e6105193660046121f0565b6118a4565b6040516101e99291906125b8565b34801561053857600080fd5b506102126105473660046121d4565b611a36565b34801561055857600080fd5b506102126105673660046123c3565b611af6565b60025490565b61057a61216b565b610583846108c4565b600085815260056020908152604080832033845290915290208151919250906105d59064e8d4a51000906105c19087906001600160801b0316611d40565b816105c857fe5b6001840154919004611d7d565b600182015580546105e69085611dca565b815560008581526003602052604090205461060b906001600160a01b03168486611ded565b826001600160a01b031685336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328760405161064f9190612ab9565b60405180910390a45050505050565b6002818154811061066b57fe5b6000918252602090912001546001600160801b038116915067ffffffffffffffff600160801b8204811691600160c01b90041683565b60065481565b6106af61216b565b6106b8836108c4565b6000848152600560209081526040808320338452909152812082518154939450909264e8d4a51000916106f491906001600160801b0316611d40565b816106fb57fe5b049050600061071f61071a846001015484611d7d90919063ffffffff16565b611ef0565b60018401839055905061075c6001600160a01b037f00000000000000000000000086772b1409b61c639eaac9ba0acfbb6e238e5f83168683611ded565b6000868152600460205260409020546001600160a01b031680156107dd57604051633f72ff1160e11b81526001600160a01b03821690637ee5fe22906107aa908a9033908790600401612ac2565b600060405180830381600087803b1580156107c457600080fd5b505af11580156107d8573d6000803e3d6000fd5b505050505b86336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954846040516108179190612ab9565b60405180910390a350505050505050565b60008281526005602090815260408083203384528252808320805484825560018201859055868552600390935292205461086c906001600160a01b03168483611ded565b826001600160a01b031684336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b846040516108b09190612ab9565b60405180910390a450505050565b60085481565b6108cc61216b565b600282815481106108d957fe5b60009182526020918290206040805160608101825292909101546001600160801b038116835267ffffffffffffffff600160801b82048116948401859052600160c01b90910416908201529150431115610bd1576000828152600360205260408082205490516370a0823160e01b81526001600160a01b03909116906370a0823190610969903090600401612526565b60206040518083038186803b15801561098157600080fd5b505afa158015610995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b991906123db565b90508015610ad957602082015160405163a277831160e01b81526000916001600160a01b037f000000000000000000000000131ba0fc3e4e866e5daf3d16526846fdd3e67623169163a277831191610a15914390600401612aff565b60206040518083038186803b158015610a2d57600080fd5b505afa158015610a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6591906123db565b90506000600654610a8d856040015167ffffffffffffffff1684611d4090919063ffffffff16565b81610a9457fe5b049050610acb610aba84610aad8464e8d4a51000611d40565b81610ab457fe5b04611f16565b85516001600160801b031690611f3f565b6001600160801b0316845250505b610ae243611f6e565b67ffffffffffffffff1660208301526002805483919085908110610b0257fe5b6000918252602091829020835191018054848401516040958601516fffffffffffffffffffffffffffffffff199092166001600160801b039094169390931767ffffffffffffffff60801b1916600160801b67ffffffffffffffff948516021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b93909116929092029190911790558301518351915185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35392610bc79290918691612b19565b60405180910390a2505b919050565b8060005b81811015610c0657610bfd848483818110610bf157fe5b905060200201356108c4565b50600101610bda565b50505050565b610c14611f98565b6001600160a01b0316610c25610f36565b6001600160a01b031614610c545760405162461bcd60e51b8152600401610c4b90612938565b60405180910390fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6003602052600090815260409020546001600160a01b031681565b60405163d505accf60e01b81526001600160a01b0389169063d505accf90610cf1908a908a908a908a908a908a908a9060040161255e565b600060405180830381600087803b158015610d0b57600080fd5b505af1158015610d1f573d6000803e3d6000fd5b505050505050505050505050565b6007546001600160a01b0316331480610d5e5750610d49610f36565b6001600160a01b0316336001600160a01b0316145b610d7a5760405162461bcd60e51b8152600401610c4b9061273b565b610dba83610db460028781548110610d8e57fe5b60009182526020909120015460065490600160c01b900467ffffffffffffffff16611dca565b90611f9c565b600655610dc683611f6e565b60028581548110610dd357fe5b9060005260206000200160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508015610e3457600084815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b80610e56576000848152600460205260409020546001600160a01b0316610e58565b815b6001600160a01b0316847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e18658584604051610e93929190612ae1565b60405180910390a350505050565b610ea9611f98565b6001600160a01b0316610eba610f36565b6001600160a01b031614610ee05760405162461bcd60e51b8152600401610c4b90612938565b600780546001600160a01b0319166001600160a01b0383161790556040517ffbd9f7b3f09a4e02b45dc9a4edc998ccb59c7ad8a617ac1321574aaafb39573a90610f2b908390612526565b60405180910390a150565b6000546001600160a01b031690565b610f4d61216b565b610f56846108c4565b60008581526005602090815260408083206001600160a01b03871684529091529020805491925090610f889085611f9c565b81558151610fbf9064e8d4a5100090610fab9087906001600160801b0316611d40565b81610fb257fe5b6001840154919004611fbf565b6001820155600085815260036020526040902054610fe8906001600160a01b0316333087612005565b826001600160a01b031685336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478760405161064f9190612ab9565b6007546001600160a01b031681565b60056020908152600092835260408084209091529082529020805460019091015482565b60016020526000908152604090205460ff1681565b6007546001600160a01b03163314806110a55750611090610f36565b6001600160a01b0316336001600160a01b0316145b6110c15760405162461bcd60e51b8152600401610c4b9061273b565b7f00000000000000000000000086772b1409b61c639eaac9ba0acfbb6e238e5f836001600160a01b0316826001600160a01b031614156111135760405162461bcd60e51b8152600401610c4b906128a4565b6001600160a01b03821660009081526001602052604090205460ff161561114c5760405162461bcd60e51b8152600401610c4b906126a7565b60025460065461115c9085611f9c565b600655600081815260036020526040902080546001600160a01b0319166001600160a01b03858116919091179091558216156111ba57600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b6002604051806060016040528060006001600160801b031681526020016111e043611f6e565b67ffffffffffffffff1681526020016111f887611f6e565b67ffffffffffffffff90811690915282546001818101855560009485526020808620855193018054828701516040978801518716600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff91909716600160801b0267ffffffffffffffff60801b196001600160801b039097166fffffffffffffffffffffffffffffffff1990931692909217959095161793909316939093179091556001600160a01b038088168086529282905293839020805460ff1916909117905590519184169183907f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e5906108b0908990612ab9565b6007546001600160a01b031633148061131d5750611308610f36565b6001600160a01b0316336001600160a01b0316145b6113395760405162461bcd60e51b8152600401610c4b9061273b565b61136e6001600160a01b037f00000000000000000000000086772b1409b61c639eaac9ba0acfbb6e238e5f8316333084612005565b60085461137b9082611f9c565b6008556040517ff8fad42e780bfa5459be3fe691e8ba1aec70342250112139c5771c3fd155f31290610f2b908390612ab9565b6004602052600090815260409020546001600160a01b031681565b7f000000000000000000000000131ba0fc3e4e866e5daf3d16526846fdd3e6762381565b60006113f761216b565b6002848154811061140457fe5b600091825260208083206040805160608101825291909301546001600160801b03808216835267ffffffffffffffff600160801b8304811684860152600160c01b90920490911682850152888552600583528385206001600160a01b03808a16875290845284862083518b885260039095528587205495516370a0823160e01b815293975095939091169316906370a08231906114a5903090600401612526565b60206040518083038186803b1580156114bd57600080fd5b505afa1580156114d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f591906123db565b9050836020015167ffffffffffffffff164311801561151357508015155b1561161657602084015160405163a277831160e01b81526000916001600160a01b037f000000000000000000000000131ba0fc3e4e866e5daf3d16526846fdd3e67623169163a27783119161156c914390600401612aff565b60206040518083038186803b15801561158457600080fd5b505afa158015611598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bc91906123db565b905060006006546115e4876040015167ffffffffffffffff1684611d4090919063ffffffff16565b816115eb57fe5b049050611611836116018364e8d4a51000611d40565b8161160857fe5b86919004611f9c565b935050505b600183015483546116449161071a9164e8d4a51000906116369087611d40565b8161163d57fe5b0490611d7d565b979650505050505050565b61165761216b565b611660846108c4565b6000858152600560209081526040808320338452909152812082518154939450909264e8d4a510009161169c91906001600160801b0316611d40565b816116a357fe5b04905060006116c261071a846001015484611d7d90919063ffffffff16565b90506116fd64e8d4a510006116ed86600001516001600160801b031689611d4090919063ffffffff16565b816116f457fe5b84919004611d7d565b6001840155825461170e9087611dca565b83556117446001600160a01b037f00000000000000000000000086772b1409b61c639eaac9ba0acfbb6e238e5f83168683611ded565b600087815260036020526040902054611767906001600160a01b03168688611ded565b6000878152600460205260409020546001600160a01b031680156117e857604051633f72ff1160e11b81526001600160a01b03821690637ee5fe22906117b5908b9033908790600401612ac2565b600060405180830381600087803b1580156117cf57600080fd5b505af11580156117e3573d6000803e3d6000fd5b505050505b87336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954846040516118229190612ab9565b60405180910390a3856001600160a01b031688336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a60405161186e9190612ab9565b60405180910390a45050505050505050565b7f00000000000000000000000086772b1409b61c639eaac9ba0acfbb6e238e5f8381565b6060808367ffffffffffffffff811180156118be57600080fd5b506040519080825280602002602001820160405280156118e8578160200160208202803683370190505b5091508367ffffffffffffffff8111801561190257600080fd5b5060405190808252806020026020018201604052801561193657816020015b60608152602001906001900390816119215790505b50905060005b84811015611a2d57600060603088888581811061195557fe5b90506020028101906119679190612b44565b6040516119759291906124fa565b600060405180830381855af49150503d80600081146119b0576040519150601f19603f3d011682016040523d82523d6000602084013e6119b5565b606091505b509150915081806119c4575085155b6119cd8261210b565b906119eb5760405162461bcd60e51b8152600401610c4b919061265d565b50818584815181106119f957fe5b60200260200101901515908115158152505080848481518110611a1857fe5b6020908102919091010152505060010161193c565b50935093915050565b611a3e611f98565b6001600160a01b0316611a4f610f36565b6001600160a01b031614611a755760405162461bcd60e51b8152600401610c4b90612938565b6001600160a01b038116611a9b5760405162461bcd60e51b8152600401610c4b906127cf565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611afe611f98565b6001600160a01b0316611b0f610f36565b6001600160a01b031614611b355760405162461bcd60e51b8152600401610c4b90612938565b60007f000000000000000000000000131ba0fc3e4e866e5daf3d16526846fdd3e676236001600160a01b031663a27783117f000000000000000000000000131ba0fc3e4e866e5daf3d16526846fdd3e676236001600160a01b03166348cd4cb16040518163ffffffff1660e01b815260040160206040518083038186803b158015611bbf57600080fd5b505afa158015611bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf791906123db565b846040518363ffffffff1660e01b8152600401611c15929190612af1565b60206040518083038186803b158015611c2d57600080fd5b505afa158015611c41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6591906123db565b90506000611c7e82600854611dca90919063ffffffff16565b604051637bc3f8b760e11b81529091506001600160a01b037f000000000000000000000000131ba0fc3e4e866e5daf3d16526846fdd3e67623169063f787f16e90611ccd908690600401612ab9565b600060405180830381600087803b158015611ce757600080fd5b505af1158015611cfb573d6000803e3d6000fd5b50505050611d3b611d0a610f36565b6001600160a01b037f00000000000000000000000086772b1409b61c639eaac9ba0acfbb6e238e5f83169083611ded565b505050565b6000811580611d5b57505080820282828281611d5857fe5b04145b611d775760405162461bcd60e51b8152600401610c4b90612a1d565b92915050565b6000818303818312801590611d925750838113155b80611da75750600083128015611da757508381135b611dc35760405162461bcd60e51b8152600401610c4b906129a4565b9392505050565b80820382811115611d775760405162461bcd60e51b8152600401610c4b90612670565b60006060846001600160a01b031663a9059cbb8585604051602401611e1392919061259f565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611e61919061250a565b6000604051808303816000865af19150503d8060008114611e9e576040519150601f19603f3d011682016040523d82523d6000602084013e611ea3565b606091505b5091509150818015611ecd575080511580611ecd575080806020019051810190611ecd9190612285565b611ee95760405162461bcd60e51b8152600401610c4b90612798565b5050505050565b600080821215611f125760405162461bcd60e51b8152600401610c4b90612704565b5090565b60006001600160801b03821115611f125760405162461bcd60e51b8152600401610c4b9061286d565b8181016001600160801b038083169082161015611d775760405162461bcd60e51b8152600401610c4b90612901565b600067ffffffffffffffff821115611f125760405162461bcd60e51b8152600401610c4b9061296d565b3390565b81810181811015611d775760405162461bcd60e51b8152600401610c4b90612901565b6000828201818312801590611fd45750838112155b80611fe95750600083128015611fe957508381125b611dc35760405162461bcd60e51b8152600401610c4b9061282c565b60006060856001600160a01b03166323b872dd86868660405160240161202d9392919061253a565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161207b919061250a565b6000604051808303816000865af19150503d80600081146120b8576040519150601f19603f3d011682016040523d82523d6000602084013e6120bd565b606091505b50915091508180156120e75750805115806120e75750808060200190518101906120e79190612285565b6121035760405162461bcd60e51b8152600401610c4b906129e8565b505050505050565b6060604482511015612151575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c790000006020820152610bd1565b60048201915081806020019051810190611d779190612328565b604080516060810182526000808252602082018190529181019190915290565b60008083601f84011261219c578182fd5b50813567ffffffffffffffff8111156121b3578182fd5b60208301915083602080830285010111156121cd57600080fd5b9250929050565b6000602082840312156121e5578081fd5b8135611dc381612bb5565b600080600060408486031215612204578182fd5b833567ffffffffffffffff81111561221a578283fd5b6122268682870161218b565b909450925050602084013561223a81612bcd565b809150509250925092565b60008060208385031215612257578182fd5b823567ffffffffffffffff81111561226d578283fd5b6122798582860161218b565b90969095509350505050565b600060208284031215612296578081fd5b8151611dc381612bcd565b600080600080600080600080610100898b0312156122bd578384fd5b88356122c881612bb5565b975060208901356122d881612bb5565b965060408901356122e881612bb5565b9550606089013594506080890135935060a089013560ff8116811461230b578384fd5b979a969950949793969295929450505060c08201359160e0013590565b600060208284031215612339578081fd5b815167ffffffffffffffff80821115612350578283fd5b818401915084601f830112612363578283fd5b815181811115612371578384fd5b604051601f8201601f191681016020018381118282101715612391578586fd5b6040528181528382016020018710156123a8578485fd5b6123b9826020830160208701612b89565b9695505050505050565b6000602082840312156123d4578081fd5b5035919050565b6000602082840312156123ec578081fd5b5051919050565b60008060408385031215612405578182fd5b82359150602083013561241781612bb5565b809150509250929050565b600080600060608486031215612436578283fd5b83359250602084013561244881612bb5565b9150604084013561223a81612bb5565b60008060006060848603121561246c578283fd5b8335925060208401359150604084013561223a81612bb5565b6000806000806080858703121561249a578182fd5b843593506020850135925060408501356124b381612bb5565b915060608501356124c381612bcd565b939692955090935050565b600081518084526124e6816020860160208601612b89565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b6000825161251c818460208701612b89565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156125f35781511515845292840192908401906001016125d5565b5050508381038285015280855161260a8184612ab9565b91508192508381028201848801865b838110156126435785830385526126318383516124ce565b94870194925090860190600101612619565b50909998505050505050505050565b901515815260200190565b600060208252611dc360208301846124ce565b60208082526015908201527f426f72696e674d6174683a20556e646572666c6f770000000000000000000000604082015260600190565b6020808252602f908201527f4d756c7469546f6b656e5374616b696e673a205374616b696e6720706f6f6c2060408201527f616c7265616479206578697374732e0000000000000000000000000000000000606082015260800190565b6020808252600b908201527f496e7465676572203c2030000000000000000000000000000000000000000000604082015260600190565b60208082526034908201527f4d756c7469546f6b656e5374616b696e673a206e6f7420617574686f72697a6560408201527f6420746f20616c6c6f6361746520706f696e7473000000000000000000000000606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b6020808252602d908201527f4d756c7469546f6b656e5374616b696e673a2043616e206e6f7420616464207260408201527f65776172647320746f6b656e2e00000000000000000000000000000000000000606082015260800190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f766572604082015263666c6f7760e01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b0316815260208083015167ffffffffffffffff90811691830191909152604092830151169181019190915260600190565b6001600160801b0393909316835267ffffffffffffffff918216602084015216604082015260600190565b90815260200190565b9283526001600160a01b03919091166020830152604082015260600190565b9182521515602082015260400190565b918252602082015260400190565b67ffffffffffffffff929092168252602082015260400190565b67ffffffffffffffff93909316835260208301919091526001600160801b0316604082015260600190565b6000808335601e19843603018112612b5a578283fd5b83018035915067ffffffffffffffff821115612b74578283fd5b6020019150368190038213156121cd57600080fd5b60005b83811015612ba4578181015183820152602001612b8c565b83811115610c065750506000910152565b6001600160a01b0381168114612bca57600080fd5b50565b8015158114612bca57600080fdfea164736f6c634300060c000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000086772b1409b61c639eaac9ba0acfbb6e238e5f83000000000000000000000000131ba0fc3e4e866e5daf3d16526846fdd3e67623
-----Decoded View---------------
Arg [0] : _rewardsToken (address): 0x86772b1409b61c639EaAc9Ba0AcfBb6E238e5F83
Arg [1] : _rewardsSchedule (address): 0x131BA0fC3e4e866E5daF3d16526846FdD3E67623
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000086772b1409b61c639eaac9ba0acfbb6e238e5f83
Arg [1] : 000000000000000000000000131ba0fc3e4e866e5daf3d16526846fdd3e67623
Loading...
Loading
Loading...
Loading
Net Worth in USD
$59,964.84
Net Worth in ETH
28.56822
Token Allocations
UNI-V2
99.83%
NDX
0.16%
DEGEN
0.00%
Multichain Portfolio | 33 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.