Source Code
Latest 25 from a total of 1,156 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw And Har... | 13299359 | 1610 days ago | IN | 0 ETH | 0.00381976 | ||||
| Harvest | 13299354 | 1610 days ago | IN | 0 ETH | 0.003025 | ||||
| Withdraw And Har... | 13296381 | 1611 days ago | IN | 0 ETH | 0.00474319 | ||||
| Withdraw And Har... | 13293710 | 1611 days ago | IN | 0 ETH | 0.00433602 | ||||
| Harvest | 13293625 | 1611 days ago | IN | 0 ETH | 0.00482214 | ||||
| Harvest | 13293616 | 1611 days ago | IN | 0 ETH | 0.00350025 | ||||
| Withdraw And Har... | 13275686 | 1614 days ago | IN | 0 ETH | 0.0037817 | ||||
| Withdraw And Har... | 13274745 | 1614 days ago | IN | 0 ETH | 0.00445091 | ||||
| Harvest | 13274737 | 1614 days ago | IN | 0 ETH | 0.0033328 | ||||
| Withdraw And Har... | 13262085 | 1616 days ago | IN | 0 ETH | 0.0044199 | ||||
| Withdraw And Har... | 13247290 | 1618 days ago | IN | 0 ETH | 0.00560691 | ||||
| Harvest | 13247270 | 1618 days ago | IN | 0 ETH | 0.00553468 | ||||
| Withdraw And Har... | 13236897 | 1620 days ago | IN | 0 ETH | 0.00722484 | ||||
| Withdraw And Har... | 13235772 | 1620 days ago | IN | 0 ETH | 0.00600372 | ||||
| Harvest | 13235762 | 1620 days ago | IN | 0 ETH | 0.00585415 | ||||
| Withdraw And Har... | 13232912 | 1620 days ago | IN | 0 ETH | 0.01935405 | ||||
| Withdraw And Har... | 13232773 | 1621 days ago | IN | 0 ETH | 0.01287537 | ||||
| Set Early End Bl... | 13232692 | 1621 days ago | IN | 0 ETH | 0.01026713 | ||||
| Harvest | 13232633 | 1621 days ago | IN | 0 ETH | 0.012876 | ||||
| Deposit | 13232065 | 1621 days ago | IN | 0 ETH | 0.01101114 | ||||
| Withdraw And Har... | 13232061 | 1621 days ago | IN | 0 ETH | 0.01088116 | ||||
| Harvest | 13230933 | 1621 days ago | IN | 0 ETH | 0.00764392 | ||||
| Harvest | 13219851 | 1623 days ago | IN | 0 ETH | 0.00489288 | ||||
| Deposit | 13215836 | 1623 days ago | IN | 0 ETH | 0.00583812 | ||||
| Withdraw And Har... | 13215809 | 1623 days ago | IN | 0 ETH | 0.00610374 |
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
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
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(!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: 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: 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.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.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);
}
}// 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: 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;
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: 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;
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"libraries": {}
}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
60c060405260006006553480156200001657600080fd5b5060405162004b2538038062004b2583398181016040528101906200003c919062000181565b60006200004e6200016260201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050505062000210565b600033905090565b6000815190506200017b81620001f6565b92915050565b600080604083850312156200019557600080fd5b6000620001a5858286016200016a565b9250506020620001b8858286016200016a565b9150509250929050565b6000620001cf82620001d6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6200020181620001c2565b81146200020d57600080fd5b50565b60805160601c60a05160601c6148be6200026760003980610e7e5280611eb9528061210d5280612a1b5280612a575280612b7e525080610a085280611dea52806123b352806125f25280612c1552506148be6000f3fe6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063c346253d11610095578063d1af0c7d11610064578063d1af0c7d14610651578063d2423b511461067c578063f2fde38b146106ad578063f787f16e146106d6576101c2565b8063c346253d14610583578063cd4b17fe146105c0578063d18df53c146105eb578063d1abb90714610628576101c2565b806393f1a40b116100d157806393f1a40b146104b65780639bfade83146104f4578063ab7de09814610531578063beceed391461055a576101c2565b80638da5cb5b146104375780638dbdbe6d146104625780638fd827891461048b576101c2565b806351eb05a61161016457806378ed5d1f1161013e57806378ed5d1f1461037f5780637c516e94146103bc57806388bba42f146103e55780638b90934f1461040e576101c2565b806351eb05a61461030257806357a5b58c1461033f578063715018a614610368576101c2565b806317caf6f1116101a057806317caf6f11461025a57806318fccc76146102855780632f940c70146102ae5780634d5428a7146102d7576101c2565b8063081e3eda146101c75780630ad58d2f146101f25780631526fe271461021b575b600080fd5b3480156101d357600080fd5b506101dc6106ff565b6040516101e9919061437f565b60405180910390f35b3480156101fe57600080fd5b5061021960048036038101906102149190613796565b61070c565b005b34801561022757600080fd5b50610242600480360381019061023d91906136b9565b6108b2565b60405161025193929190614348565b60405180910390f35b34801561026657600080fd5b5061026f610929565b60405161027c919061437f565b60405180910390f35b34801561029157600080fd5b506102ac60048036038101906102a7919061370b565b61092f565b005b3480156102ba57600080fd5b506102d560048036038101906102d0919061370b565b610b80565b005b3480156102e357600080fd5b506102ec610cbb565b6040516102f9919061437f565b60405180910390f35b34801561030e57600080fd5b50610329600480360381019061032491906136b9565b610cc1565b604051610336919061432d565b60405180910390f35b34801561034b57600080fd5b5061036660048036038101906103619190613558565b61110b565b005b34801561037457600080fd5b5061037d61114b565b005b34801561038b57600080fd5b506103a660048036038101906103a191906136b9565b611285565b6040516103b391906140fa565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de91906135c6565b6112b8565b005b3480156103f157600080fd5b5061040c600480360381019061040791906137e5565b611339565b005b34801561041a57600080fd5b50610435600480360381019061043091906134d7565b6115a3565b005b34801561044357600080fd5b5061044c61169a565b6040516104599190613fbe565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613796565b6116c3565b005b34801561049757600080fd5b506104a061186b565b6040516104ad9190613fbe565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d8919061370b565b611891565b6040516104eb9291906143fa565b60405180910390f35b34801561050057600080fd5b5061051b600480360381019061051691906134d7565b6118c2565b60405161052891906140df565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613747565b6118e2565b005b34801561056657600080fd5b50610581600480360381019061057c91906136b9565b611d15565b005b34801561058f57600080fd5b506105aa60048036038101906105a591906136b9565b611e84565b6040516105b79190614115565b60405180910390f35b3480156105cc57600080fd5b506105d5611eb7565b6040516105e29190614130565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d919061370b565b611edb565b60405161061f919061437f565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a9190613796565b612273565b005b34801561065d57600080fd5b506106666125f0565b60405161067391906140fa565b60405180910390f35b61069660048036038101906106919190613500565b612614565b6040516106a49291906140a8565b60405180910390f35b3480156106b957600080fd5b506106d460048036038101906106cf91906134d7565b6127f2565b005b3480156106e257600080fd5b506106fd60048036038101906106f891906136b9565b61299b565b005b6000600280549050905090565b6107146132eb565b61071d84610cc1565b905060006005600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506107c064e8d4a510006107a584600001516fffffffffffffffffffffffffffffffff1687612c5e90919063ffffffff16565b816107ac57fe5b048260010154612cc090919063ffffffff16565b81600101819055506107df848260000154612d3890919063ffffffff16565b816000018190555061084583856003600089815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d889092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff16853373ffffffffffffffffffffffffffffffffffffffff167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec2132876040516108a3919061437f565b60405180910390a45050505050565b600281815481106108bf57fe5b906000526020600020016000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16908060000160189054906101000a900467ffffffffffffffff16905083565b60065481565b6109376132eb565b61094083610cc1565b905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600064e8d4a510006109cb84600001516fffffffffffffffffffffffffffffffff168460000154612c5e90919063ffffffff16565b816109d257fe5b04905060006109f66109f1846001015484612cc090919063ffffffff16565b612ebf565b9050818360010181905550610a4c85827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612d889092919063ffffffff16565b60006004600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b28578073ffffffffffffffffffffffffffffffffffffffff16637ee5fe228833856040518463ffffffff1660e01b8152600401610af59392919061439a565b600060405180830381600087803b158015610b0f57600080fd5b505af1158015610b23573d6000803e3d6000fd5b505050505b863373ffffffffffffffffffffffffffffffffffffffff167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051610b6f919061437f565b60405180910390a350505050505050565b60006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506000826000018190555060008260010181905550610c4f83826003600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d889092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff16843373ffffffffffffffffffffffffffffffffffffffff167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b84604051610cad919061437f565b60405180910390a450505050565b60085481565b610cc96132eb565b60028281548110610cd657fe5b906000526020600020016040518060600160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050806020015167ffffffffffffffff164311156111065760006003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1f9190613fbe565b60206040518083038186803b158015610e3757600080fd5b505afa158015610e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6f91906136e2565b90506000811115610fe05760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a27783118460200151436040518363ffffffff1660e01b8152600401610edb92919061444c565b60206040518083038186803b158015610ef357600080fd5b505afa158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136e2565b90506000600654610f53856040015167ffffffffffffffff1684612c5e90919063ffffffff16565b81610f5a57fe5b049050610fae610f8984610f7c64e8d4a5100085612c5e90919063ffffffff16565b81610f8357fe5b04612f0c565b85600001516fffffffffffffffffffffffffffffffff16612f8b90919063ffffffff16565b84600001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505050505b610fe943612fff565b826020019067ffffffffffffffff16908167ffffffffffffffff1681525050816002848154811061101657fe5b9060005260206000200160008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050827f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35383602001518385600001516040516110fc93929190614475565b60405180910390a2505b919050565b600082829050905060005b818110156111455761113984848381811061112d57fe5b90506020020135610cc1565b50806001019050611116565b50505050565b611153613076565b73ffffffffffffffffffffffffffffffffffffffff1661117161169a565b73ffffffffffffffffffffffffffffffffffffffff16146111c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111be9061428d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8773ffffffffffffffffffffffffffffffffffffffff1663d505accf888888888888886040518863ffffffff1660e01b81526004016112fd9796959493929190614010565b600060405180830381600087803b15801561131757600080fd5b505af115801561132b573d6000803e3d6000fd5b505050505050505050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113c7575061139861169a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fd906141cd565b60405180910390fd5b611465836114576002878154811061141a57fe5b9060005260206000200160000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff16600654612d3890919063ffffffff16565b61307e90919063ffffffff16565b60068190555061147483612fff565b6002858154811061148157fe5b9060005260206000200160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550801561150d57816004600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8061154b576004600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661154d565b815b73ffffffffffffffffffffffffffffffffffffffff16847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e186585846040516115959291906143d1565b60405180910390a350505050565b6115ab613076565b73ffffffffffffffffffffffffffffffffffffffff166115c961169a565b73ffffffffffffffffffffffffffffffffffffffff161461161f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116169061428d565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ffbd9f7b3f09a4e02b45dc9a4edc998ccb59c7ad8a617ac1321574aaafb39573a8160405161168f9190613fbe565b60405180910390a150565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116cb6132eb565b6116d484610cc1565b905060006005600086815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061174184826000015461307e90919063ffffffff16565b816000018190555061179664e8d4a5100061177b84600001516fffffffffffffffffffffffffffffffff1687612c5e90919063ffffffff16565b8161178257fe5b0482600101546130ce90919063ffffffff16565b81600101819055506117fe333086600360008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613146909392919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff16853373ffffffffffffffffffffffffffffffffffffffff167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478760405161185c919061437f565b60405180910390a45050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b60016020528060005260406000206000915054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611970575061194161169a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a6906141cd565b60405180910390fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a339061418d565b60405180910390fd5b60006002805490509050611a5b8460065461307e90919063ffffffff16565b600681905550826003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611b3a57816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6002604051806060016040528060006fffffffffffffffffffffffffffffffff168152602001611b6943612fff565b67ffffffffffffffff168152602001611b8187612fff565b67ffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505060018060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16827f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e587604051611d07919061437f565b60405180910390a450505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611da35750611d7461169a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd9906141cd565b60405180910390fd5b611e2f3330837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16613146909392919063ffffffff16565b611e448160085461307e90919063ffffffff16565b6008819055507ff8fad42e780bfa5459be3fe691e8ba1aec70342250112139c5771c3fd155f31281604051611e79919061437f565b60405180910390a150565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611ee56132eb565b60028481548110611ef257fe5b906000526020600020016040518060600160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600001516fffffffffffffffffffffffffffffffff16905060006003600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120949190613fbe565b60206040518083038186803b1580156120ac57600080fd5b505afa1580156120c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e491906136e2565b9050836020015167ffffffffffffffff1643118015612104575060008114155b156122245760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a27783118660200151436040518363ffffffff1660e01b815260040161216a92919061444c565b60206040518083038186803b15801561218257600080fd5b505afa158015612196573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ba91906136e2565b905060006006546121e2876040015167ffffffffffffffff1684612c5e90919063ffffffff16565b816121e957fe5b04905061221f8361220864e8d4a5100084612c5e90919063ffffffff16565b8161220f57fe5b048561307e90919063ffffffff16565b935050505b612267612262846001015464e8d4a5100061224c868860000154612c5e90919063ffffffff16565b8161225357fe5b04612cc090919063ffffffff16565b612ebf565b94505050505092915050565b61227b6132eb565b61228484610cc1565b905060006005600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600064e8d4a5100061230f84600001516fffffffffffffffffffffffffffffffff168460000154612c5e90919063ffffffff16565b8161231657fe5b049050600061233a612335846001015484612cc090919063ffffffff16565b612ebf565b905061238564e8d4a5100061236e86600001516fffffffffffffffffffffffffffffffff1689612c5e90919063ffffffff16565b8161237557fe5b0483612cc090919063ffffffff16565b83600101819055506123a4868460000154612d3890919063ffffffff16565b83600001819055506123f785827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612d889092919063ffffffff16565b6124558587600360008b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d889092919063ffffffff16565b60006004600089815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612531578073ffffffffffffffffffffffffffffffffffffffff16637ee5fe228933856040518463ffffffff1660e01b81526004016124fe9392919061439a565b600060405180830381600087803b15801561251857600080fd5b505af115801561252c573d6000803e3d6000fd5b505050505b873373ffffffffffffffffffffffffffffffffffffffff167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051612578919061437f565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff16883373ffffffffffffffffffffffffffffffffffffffff167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a6040516125de919061437f565b60405180910390a45050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060808484905067ffffffffffffffff8111801561263157600080fd5b506040519080825280602002602001820160405280156126605781602001602082028036833780820191505090505b5091508484905067ffffffffffffffff8111801561267d57600080fd5b506040519080825280602002602001820160405280156126b157816020015b606081526020019060019003908161269c5790505b50905060005b858590508110156127e957600060603073ffffffffffffffffffffffffffffffffffffffff168888858181106126e957fe5b90506020028101906126fb91906144ac565b604051612709929190613f8e565b600060405180830381855af49150503d8060008114612744576040519150601f19603f3d011682016040523d82523d6000602084013e612749565b606091505b50915091508180612758575085155b61276182613280565b906127a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612799919061414b565b60405180910390fd5b50818584815181106127b057fe5b602002602001019015159081151581525050808484815181106127cf57fe5b6020026020010181905250505080806001019150506126b7565b50935093915050565b6127fa613076565b73ffffffffffffffffffffffffffffffffffffffff1661281861169a565b73ffffffffffffffffffffffffffffffffffffffff161461286e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128659061428d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d59061420d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6129a3613076565b73ffffffffffffffffffffffffffffffffffffffff166129c161169a565b73ffffffffffffffffffffffffffffffffffffffff1614612a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0e9061428d565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a27783117f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348cd4cb16040518163ffffffff1660e01b815260040160206040518083038186803b158015612abb57600080fd5b505afa158015612acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af391906136e2565b846040518363ffffffff1660e01b8152600401612b11929190614423565b60206040518083038186803b158015612b2957600080fd5b505afa158015612b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6191906136e2565b90506000612b7a82600854612d3890919063ffffffff16565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f787f16e846040518263ffffffff1660e01b8152600401612bd5919061437f565b600060405180830381600087803b158015612bef57600080fd5b505af1158015612c03573d6000803e3d6000fd5b50505050612c59612c1261169a565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612d889092919063ffffffff16565b505050565b600080821480612c7b5750828283850292508281612c7857fe5b04145b612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb19061430d565b60405180910390fd5b92915050565b600080828403905060008312158015612cd95750838113155b80612cef5750600083128015612cee57508381135b5b612d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d25906142cd565b60405180910390fd5b8091505092915050565b6000828284039150811115612d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d799061416d565b60405180910390fd5b92915050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612dbb92919061407f565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612e099190613fa7565b6000604051808303816000865af19150503d8060008114612e46576040519150601f19603f3d011682016040523d82523d6000602084013e612e4b565b606091505b5091509150818015612e795750600081511480612e78575080806020019051810190612e77919061359d565b5b5b612eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eaf906141ed565b60405180910390fd5b5050505050565b600080821215612f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efb906141ad565b60405180910390fd5b819050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff16821115612f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7a9061424d565b60405180910390fd5b819050919050565b6000816fffffffffffffffffffffffffffffffff168284019150816fffffffffffffffffffffffffffffffff161015612ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff09061426d565b60405180910390fd5b92915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff1682111561306e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613065906142ad565b60405180910390fd5b819050919050565b600033905090565b60008182840191508110156130c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130bf9061426d565b60405180910390fd5b92915050565b6000808284019050600083121580156130e75750838112155b806130fd57506000831280156130fc57508381125b5b61313c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131339061422d565b60405180910390fd5b8091505092915050565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161317b93929190613fd9565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516131c99190613fa7565b6000604051808303816000865af19150503d8060008114613206576040519150601f19603f3d011682016040523d82523d6000602084013e61320b565b606091505b50915091508180156132395750600081511480613238575080806020019051810190613237919061359d565b5b5b613278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326f906142ed565b60405180910390fd5b505050505050565b60606044825110156132c9576040518060400160405280601d81526020017f5472616e73616374696f6e2072657665727465642073696c656e746c7900000081525090506132e6565b600482019150818060200190518101906132e39190613678565b90505b919050565b604051806060016040528060006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681525090565b600081359050613341816147e7565b92915050565b60008083601f84011261335957600080fd5b8235905067ffffffffffffffff81111561337257600080fd5b60208301915083602082028301111561338a57600080fd5b9250929050565b60008083601f8401126133a357600080fd5b8235905067ffffffffffffffff8111156133bc57600080fd5b6020830191508360208202830111156133d457600080fd5b9250929050565b6000813590506133ea816147fe565b92915050565b6000815190506133ff816147fe565b92915050565b60008135905061341481614815565b92915050565b6000813590506134298161482c565b92915050565b60008135905061343e81614843565b92915050565b600082601f83011261345557600080fd5b815161346861346382614530565b614503565b9150808252602083016020830185838301111561348457600080fd5b61348f8382846147a3565b50505092915050565b6000813590506134a78161485a565b92915050565b6000815190506134bc8161485a565b92915050565b6000813590506134d181614871565b92915050565b6000602082840312156134e957600080fd5b60006134f784828501613332565b91505092915050565b60008060006040848603121561351557600080fd5b600084013567ffffffffffffffff81111561352f57600080fd5b61353b86828701613347565b9350935050602061354e868287016133db565b9150509250925092565b6000806020838503121561356b57600080fd5b600083013567ffffffffffffffff81111561358557600080fd5b61359185828601613391565b92509250509250929050565b6000602082840312156135af57600080fd5b60006135bd848285016133f0565b91505092915050565b600080600080600080600080610100898b0312156135e357600080fd5b60006135f18b828c0161341a565b98505060206136028b828c01613332565b97505060406136138b828c01613332565b96505060606136248b828c01613498565b95505060806136358b828c01613498565b94505060a06136468b828c016134c2565b93505060c06136578b828c01613405565b92505060e06136688b828c01613405565b9150509295985092959890939650565b60006020828403121561368a57600080fd5b600082015167ffffffffffffffff8111156136a457600080fd5b6136b084828501613444565b91505092915050565b6000602082840312156136cb57600080fd5b60006136d984828501613498565b91505092915050565b6000602082840312156136f457600080fd5b6000613702848285016134ad565b91505092915050565b6000806040838503121561371e57600080fd5b600061372c85828601613498565b925050602061373d85828601613332565b9150509250929050565b60008060006060848603121561375c57600080fd5b600061376a86828701613498565b935050602061377b8682870161341a565b925050604061378c8682870161342f565b9150509250925092565b6000806000606084860312156137ab57600080fd5b60006137b986828701613498565b93505060206137ca86828701613498565b92505060406137db86828701613332565b9150509250925092565b600080600080608085870312156137fb57600080fd5b600061380987828801613498565b945050602061381a87828801613498565b935050604061382b8782880161342f565b925050606061383c878288016133db565b91505092959194509250565b60006138548383613965565b60208301905092915050565b600061386c83836139b7565b905092915050565b61387d816146ce565b82525050565b61388c81614611565b82525050565b600061389d8261457c565b6138a781856145c2565b93506138b28361455c565b8060005b838110156138e35781516138ca8882613848565b97506138d5836145a8565b9250506001810190506138b6565b5085935050505092915050565b60006138fb82614587565b61390581856145d3565b9350836020820285016139178561456c565b8060005b8581101561395357848403895281516139348582613860565b945061393f836145b5565b925060208a0199505060018101905061391b565b50829750879550505050505092915050565b61396e81614623565b82525050565b61397d81614623565b82525050565b61398c8161462f565b82525050565b600061399e83856145f5565b93506139ab838584614794565b82840190509392505050565b60006139c282614592565b6139cc81856145e4565b93506139dc8185602086016147a3565b6139e5816147d6565b840191505092915050565b60006139fb82614592565b613a0581856145f5565b9350613a158185602086016147a3565b80840191505092915050565b613a2a816146e0565b82525050565b613a3981614704565b82525050565b613a4881614728565b82525050565b613a578161465d565b82525050565b6000613a688261459d565b613a728185614600565b9350613a828185602086016147a3565b613a8b816147d6565b840191505092915050565b6000613aa3601583614600565b91507f426f72696e674d6174683a20556e646572666c6f7700000000000000000000006000830152602082019050919050565b6000613ae3602f83614600565b91507f4d756c7469546f6b656e5374616b696e673a205374616b696e6720706f6f6c2060008301527f616c7265616479206578697374732e00000000000000000000000000000000006020830152604082019050919050565b6000613b49600b83614600565b91507f496e7465676572203c20300000000000000000000000000000000000000000006000830152602082019050919050565b6000613b89603483614600565b91507f4d756c7469546f6b656e5374616b696e673a206e6f7420617574686f72697a6560008301527f6420746f20616c6c6f6361746520706f696e74730000000000000000000000006020830152604082019050919050565b6000613bef601c83614600565b91507f426f72696e6745524332303a205472616e73666572206661696c6564000000006000830152602082019050919050565b6000613c2f602683614600565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c95602183614600565b91507f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cfb601c83614600565b91507f426f72696e674d6174683a2075696e74313238204f766572666c6f77000000006000830152602082019050919050565b6000613d3b601883614600565b91507f426f72696e674d6174683a20416464204f766572666c6f7700000000000000006000830152602082019050919050565b6000613d7b602083614600565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613dbb601b83614600565b91507f426f72696e674d6174683a2075696e743634204f766572666c6f7700000000006000830152602082019050919050565b6000613dfb602483614600565b91507f5369676e6564536166654d6174683a207375627472616374696f6e206f76657260008301527f666c6f77000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e61602083614600565b91507f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646000830152602082019050919050565b6000613ea1601883614600565b91507f426f72696e674d6174683a204d756c204f766572666c6f7700000000000000006000830152602082019050919050565b606082016000820151613eea6000850182613f16565b506020820151613efd6020850182613f61565b506040820151613f106040850182613f61565b50505050565b613f1f81614667565b82525050565b613f2e81614667565b82525050565b613f3d8161474c565b82525050565b613f4c816146a3565b82525050565b613f5b81614782565b82525050565b613f6a816146ad565b82525050565b613f79816146ad565b82525050565b613f88816146c1565b82525050565b6000613f9b828486613992565b91508190509392505050565b6000613fb382846139f0565b915081905092915050565b6000602082019050613fd36000830184613883565b92915050565b6000606082019050613fee6000830186613883565b613ffb6020830185613883565b6140086040830184613f43565b949350505050565b600060e082019050614025600083018a613883565b6140326020830189613883565b61403f6040830188613f43565b61404c6060830187613f43565b6140596080830186613f7f565b61406660a0830185613983565b61407360c0830184613983565b98975050505050505050565b60006040820190506140946000830185613883565b6140a16020830184613f43565b9392505050565b600060408201905081810360008301526140c28185613892565b905081810360208301526140d681846138f0565b90509392505050565b60006020820190506140f46000830184613974565b92915050565b600060208201905061410f6000830184613a21565b92915050565b600060208201905061412a6000830184613a30565b92915050565b60006020820190506141456000830184613a3f565b92915050565b600060208201905081810360008301526141658184613a5d565b905092915050565b6000602082019050818103600083015261418681613a96565b9050919050565b600060208201905081810360008301526141a681613ad6565b9050919050565b600060208201905081810360008301526141c681613b3c565b9050919050565b600060208201905081810360008301526141e681613b7c565b9050919050565b6000602082019050818103600083015261420681613be2565b9050919050565b6000602082019050818103600083015261422681613c22565b9050919050565b6000602082019050818103600083015261424681613c88565b9050919050565b6000602082019050818103600083015261426681613cee565b9050919050565b6000602082019050818103600083015261428681613d2e565b9050919050565b600060208201905081810360008301526142a681613d6e565b9050919050565b600060208201905081810360008301526142c681613dae565b9050919050565b600060208201905081810360008301526142e681613dee565b9050919050565b6000602082019050818103600083015261430681613e54565b9050919050565b6000602082019050818103600083015261432681613e94565b9050919050565b60006060820190506143426000830184613ed4565b92915050565b600060608201905061435d6000830186613f25565b61436a6020830185613f70565b6143776040830184613f70565b949350505050565b60006020820190506143946000830184613f43565b92915050565b60006060820190506143af6000830186613f43565b6143bc6020830185613874565b6143c96040830184613f43565b949350505050565b60006040820190506143e66000830185613f43565b6143f36020830184613974565b9392505050565b600060408201905061440f6000830185613f43565b61441c6020830184613a4e565b9392505050565b60006040820190506144386000830185613f43565b6144456020830184613f43565b9392505050565b60006040820190506144616000830185613f52565b61446e6020830184613f43565b9392505050565b600060608201905061448a6000830186613f70565b6144976020830185613f43565b6144a46040830184613f34565b949350505050565b600080833560016020038436030381126144c557600080fd5b80840192508235915067ffffffffffffffff8211156144e357600080fd5b6020830192506001820236038313156144fb57600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff8211171561452657600080fd5b8060405250919050565b600067ffffffffffffffff82111561454757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061461c82614683565b9050919050565b60008115159050919050565b6000819050919050565b600061464482614611565b9050919050565b600061465682614611565b9050919050565b6000819050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006146d98261475e565b9050919050565b60006146eb826146f2565b9050919050565b60006146fd82614683565b9050919050565b600061470f82614716565b9050919050565b600061472182614683565b9050919050565b60006147338261473a565b9050919050565b600061474582614683565b9050919050565b600061475782614667565b9050919050565b600061476982614770565b9050919050565b600061477b82614683565b9050919050565b600061478d826146ad565b9050919050565b82818337600083830152505050565b60005b838110156147c15780820151818401526020810190506147a6565b838111156147d0576000848401525b50505050565b6000601f19601f8301169050919050565b6147f081614611565b81146147fb57600080fd5b50565b61480781614623565b811461481257600080fd5b50565b61481e8161462f565b811461482957600080fd5b50565b61483581614639565b811461484057600080fd5b50565b61484c8161464b565b811461485757600080fd5b50565b614863816146a3565b811461486e57600080fd5b50565b61487a816146c1565b811461488557600080fd5b5056fea26469706673582212201eba1f37157ae279ec40ed9362010fce30b2c58fc718c6519227bf6d1f6862c364736f6c634300060c003300000000000000000000000000a55375002f3cda400383f479e7cd57bad029a900000000000000000000000045a68c45bdc4cccac5e1dc097258dc62cb44d659
Deployed Bytecode
0x6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063c346253d11610095578063d1af0c7d11610064578063d1af0c7d14610651578063d2423b511461067c578063f2fde38b146106ad578063f787f16e146106d6576101c2565b8063c346253d14610583578063cd4b17fe146105c0578063d18df53c146105eb578063d1abb90714610628576101c2565b806393f1a40b116100d157806393f1a40b146104b65780639bfade83146104f4578063ab7de09814610531578063beceed391461055a576101c2565b80638da5cb5b146104375780638dbdbe6d146104625780638fd827891461048b576101c2565b806351eb05a61161016457806378ed5d1f1161013e57806378ed5d1f1461037f5780637c516e94146103bc57806388bba42f146103e55780638b90934f1461040e576101c2565b806351eb05a61461030257806357a5b58c1461033f578063715018a614610368576101c2565b806317caf6f1116101a057806317caf6f11461025a57806318fccc76146102855780632f940c70146102ae5780634d5428a7146102d7576101c2565b8063081e3eda146101c75780630ad58d2f146101f25780631526fe271461021b575b600080fd5b3480156101d357600080fd5b506101dc6106ff565b6040516101e9919061437f565b60405180910390f35b3480156101fe57600080fd5b5061021960048036038101906102149190613796565b61070c565b005b34801561022757600080fd5b50610242600480360381019061023d91906136b9565b6108b2565b60405161025193929190614348565b60405180910390f35b34801561026657600080fd5b5061026f610929565b60405161027c919061437f565b60405180910390f35b34801561029157600080fd5b506102ac60048036038101906102a7919061370b565b61092f565b005b3480156102ba57600080fd5b506102d560048036038101906102d0919061370b565b610b80565b005b3480156102e357600080fd5b506102ec610cbb565b6040516102f9919061437f565b60405180910390f35b34801561030e57600080fd5b50610329600480360381019061032491906136b9565b610cc1565b604051610336919061432d565b60405180910390f35b34801561034b57600080fd5b5061036660048036038101906103619190613558565b61110b565b005b34801561037457600080fd5b5061037d61114b565b005b34801561038b57600080fd5b506103a660048036038101906103a191906136b9565b611285565b6040516103b391906140fa565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de91906135c6565b6112b8565b005b3480156103f157600080fd5b5061040c600480360381019061040791906137e5565b611339565b005b34801561041a57600080fd5b50610435600480360381019061043091906134d7565b6115a3565b005b34801561044357600080fd5b5061044c61169a565b6040516104599190613fbe565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613796565b6116c3565b005b34801561049757600080fd5b506104a061186b565b6040516104ad9190613fbe565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d8919061370b565b611891565b6040516104eb9291906143fa565b60405180910390f35b34801561050057600080fd5b5061051b600480360381019061051691906134d7565b6118c2565b60405161052891906140df565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613747565b6118e2565b005b34801561056657600080fd5b50610581600480360381019061057c91906136b9565b611d15565b005b34801561058f57600080fd5b506105aa60048036038101906105a591906136b9565b611e84565b6040516105b79190614115565b60405180910390f35b3480156105cc57600080fd5b506105d5611eb7565b6040516105e29190614130565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d919061370b565b611edb565b60405161061f919061437f565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a9190613796565b612273565b005b34801561065d57600080fd5b506106666125f0565b60405161067391906140fa565b60405180910390f35b61069660048036038101906106919190613500565b612614565b6040516106a49291906140a8565b60405180910390f35b3480156106b957600080fd5b506106d460048036038101906106cf91906134d7565b6127f2565b005b3480156106e257600080fd5b506106fd60048036038101906106f891906136b9565b61299b565b005b6000600280549050905090565b6107146132eb565b61071d84610cc1565b905060006005600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506107c064e8d4a510006107a584600001516fffffffffffffffffffffffffffffffff1687612c5e90919063ffffffff16565b816107ac57fe5b048260010154612cc090919063ffffffff16565b81600101819055506107df848260000154612d3890919063ffffffff16565b816000018190555061084583856003600089815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d889092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff16853373ffffffffffffffffffffffffffffffffffffffff167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec2132876040516108a3919061437f565b60405180910390a45050505050565b600281815481106108bf57fe5b906000526020600020016000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16908060000160189054906101000a900467ffffffffffffffff16905083565b60065481565b6109376132eb565b61094083610cc1565b905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600064e8d4a510006109cb84600001516fffffffffffffffffffffffffffffffff168460000154612c5e90919063ffffffff16565b816109d257fe5b04905060006109f66109f1846001015484612cc090919063ffffffff16565b612ebf565b9050818360010181905550610a4c85827f00000000000000000000000000a55375002f3cda400383f479e7cd57bad029a973ffffffffffffffffffffffffffffffffffffffff16612d889092919063ffffffff16565b60006004600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b28578073ffffffffffffffffffffffffffffffffffffffff16637ee5fe228833856040518463ffffffff1660e01b8152600401610af59392919061439a565b600060405180830381600087803b158015610b0f57600080fd5b505af1158015610b23573d6000803e3d6000fd5b505050505b863373ffffffffffffffffffffffffffffffffffffffff167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051610b6f919061437f565b60405180910390a350505050505050565b60006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506000826000018190555060008260010181905550610c4f83826003600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d889092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff16843373ffffffffffffffffffffffffffffffffffffffff167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b84604051610cad919061437f565b60405180910390a450505050565b60085481565b610cc96132eb565b60028281548110610cd657fe5b906000526020600020016040518060600160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050806020015167ffffffffffffffff164311156111065760006003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1f9190613fbe565b60206040518083038186803b158015610e3757600080fd5b505afa158015610e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6f91906136e2565b90506000811115610fe05760007f00000000000000000000000045a68c45bdc4cccac5e1dc097258dc62cb44d65973ffffffffffffffffffffffffffffffffffffffff1663a27783118460200151436040518363ffffffff1660e01b8152600401610edb92919061444c565b60206040518083038186803b158015610ef357600080fd5b505afa158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136e2565b90506000600654610f53856040015167ffffffffffffffff1684612c5e90919063ffffffff16565b81610f5a57fe5b049050610fae610f8984610f7c64e8d4a5100085612c5e90919063ffffffff16565b81610f8357fe5b04612f0c565b85600001516fffffffffffffffffffffffffffffffff16612f8b90919063ffffffff16565b84600001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505050505b610fe943612fff565b826020019067ffffffffffffffff16908167ffffffffffffffff1681525050816002848154811061101657fe5b9060005260206000200160008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050827f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35383602001518385600001516040516110fc93929190614475565b60405180910390a2505b919050565b600082829050905060005b818110156111455761113984848381811061112d57fe5b90506020020135610cc1565b50806001019050611116565b50505050565b611153613076565b73ffffffffffffffffffffffffffffffffffffffff1661117161169a565b73ffffffffffffffffffffffffffffffffffffffff16146111c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111be9061428d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8773ffffffffffffffffffffffffffffffffffffffff1663d505accf888888888888886040518863ffffffff1660e01b81526004016112fd9796959493929190614010565b600060405180830381600087803b15801561131757600080fd5b505af115801561132b573d6000803e3d6000fd5b505050505050505050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113c7575061139861169a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fd906141cd565b60405180910390fd5b611465836114576002878154811061141a57fe5b9060005260206000200160000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff16600654612d3890919063ffffffff16565b61307e90919063ffffffff16565b60068190555061147483612fff565b6002858154811061148157fe5b9060005260206000200160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550801561150d57816004600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8061154b576004600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661154d565b815b73ffffffffffffffffffffffffffffffffffffffff16847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e186585846040516115959291906143d1565b60405180910390a350505050565b6115ab613076565b73ffffffffffffffffffffffffffffffffffffffff166115c961169a565b73ffffffffffffffffffffffffffffffffffffffff161461161f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116169061428d565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ffbd9f7b3f09a4e02b45dc9a4edc998ccb59c7ad8a617ac1321574aaafb39573a8160405161168f9190613fbe565b60405180910390a150565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116cb6132eb565b6116d484610cc1565b905060006005600086815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061174184826000015461307e90919063ffffffff16565b816000018190555061179664e8d4a5100061177b84600001516fffffffffffffffffffffffffffffffff1687612c5e90919063ffffffff16565b8161178257fe5b0482600101546130ce90919063ffffffff16565b81600101819055506117fe333086600360008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613146909392919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff16853373ffffffffffffffffffffffffffffffffffffffff167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478760405161185c919061437f565b60405180910390a45050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b60016020528060005260406000206000915054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611970575061194161169a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a6906141cd565b60405180910390fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a339061418d565b60405180910390fd5b60006002805490509050611a5b8460065461307e90919063ffffffff16565b600681905550826003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611b3a57816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6002604051806060016040528060006fffffffffffffffffffffffffffffffff168152602001611b6943612fff565b67ffffffffffffffff168152602001611b8187612fff565b67ffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505060018060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16827f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e587604051611d07919061437f565b60405180910390a450505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611da35750611d7461169a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd9906141cd565b60405180910390fd5b611e2f3330837f00000000000000000000000000a55375002f3cda400383f479e7cd57bad029a973ffffffffffffffffffffffffffffffffffffffff16613146909392919063ffffffff16565b611e448160085461307e90919063ffffffff16565b6008819055507ff8fad42e780bfa5459be3fe691e8ba1aec70342250112139c5771c3fd155f31281604051611e79919061437f565b60405180910390a150565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f00000000000000000000000045a68c45bdc4cccac5e1dc097258dc62cb44d65981565b6000611ee56132eb565b60028481548110611ef257fe5b906000526020600020016040518060600160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600001516fffffffffffffffffffffffffffffffff16905060006003600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120949190613fbe565b60206040518083038186803b1580156120ac57600080fd5b505afa1580156120c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e491906136e2565b9050836020015167ffffffffffffffff1643118015612104575060008114155b156122245760007f00000000000000000000000045a68c45bdc4cccac5e1dc097258dc62cb44d65973ffffffffffffffffffffffffffffffffffffffff1663a27783118660200151436040518363ffffffff1660e01b815260040161216a92919061444c565b60206040518083038186803b15801561218257600080fd5b505afa158015612196573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ba91906136e2565b905060006006546121e2876040015167ffffffffffffffff1684612c5e90919063ffffffff16565b816121e957fe5b04905061221f8361220864e8d4a5100084612c5e90919063ffffffff16565b8161220f57fe5b048561307e90919063ffffffff16565b935050505b612267612262846001015464e8d4a5100061224c868860000154612c5e90919063ffffffff16565b8161225357fe5b04612cc090919063ffffffff16565b612ebf565b94505050505092915050565b61227b6132eb565b61228484610cc1565b905060006005600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600064e8d4a5100061230f84600001516fffffffffffffffffffffffffffffffff168460000154612c5e90919063ffffffff16565b8161231657fe5b049050600061233a612335846001015484612cc090919063ffffffff16565b612ebf565b905061238564e8d4a5100061236e86600001516fffffffffffffffffffffffffffffffff1689612c5e90919063ffffffff16565b8161237557fe5b0483612cc090919063ffffffff16565b83600101819055506123a4868460000154612d3890919063ffffffff16565b83600001819055506123f785827f00000000000000000000000000a55375002f3cda400383f479e7cd57bad029a973ffffffffffffffffffffffffffffffffffffffff16612d889092919063ffffffff16565b6124558587600360008b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d889092919063ffffffff16565b60006004600089815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612531578073ffffffffffffffffffffffffffffffffffffffff16637ee5fe228933856040518463ffffffff1660e01b81526004016124fe9392919061439a565b600060405180830381600087803b15801561251857600080fd5b505af115801561252c573d6000803e3d6000fd5b505050505b873373ffffffffffffffffffffffffffffffffffffffff167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051612578919061437f565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff16883373ffffffffffffffffffffffffffffffffffffffff167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a6040516125de919061437f565b60405180910390a45050505050505050565b7f00000000000000000000000000a55375002f3cda400383f479e7cd57bad029a981565b6060808484905067ffffffffffffffff8111801561263157600080fd5b506040519080825280602002602001820160405280156126605781602001602082028036833780820191505090505b5091508484905067ffffffffffffffff8111801561267d57600080fd5b506040519080825280602002602001820160405280156126b157816020015b606081526020019060019003908161269c5790505b50905060005b858590508110156127e957600060603073ffffffffffffffffffffffffffffffffffffffff168888858181106126e957fe5b90506020028101906126fb91906144ac565b604051612709929190613f8e565b600060405180830381855af49150503d8060008114612744576040519150601f19603f3d011682016040523d82523d6000602084013e612749565b606091505b50915091508180612758575085155b61276182613280565b906127a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612799919061414b565b60405180910390fd5b50818584815181106127b057fe5b602002602001019015159081151581525050808484815181106127cf57fe5b6020026020010181905250505080806001019150506126b7565b50935093915050565b6127fa613076565b73ffffffffffffffffffffffffffffffffffffffff1661281861169a565b73ffffffffffffffffffffffffffffffffffffffff161461286e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128659061428d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d59061420d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6129a3613076565b73ffffffffffffffffffffffffffffffffffffffff166129c161169a565b73ffffffffffffffffffffffffffffffffffffffff1614612a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0e9061428d565b60405180910390fd5b60007f00000000000000000000000045a68c45bdc4cccac5e1dc097258dc62cb44d65973ffffffffffffffffffffffffffffffffffffffff1663a27783117f00000000000000000000000045a68c45bdc4cccac5e1dc097258dc62cb44d65973ffffffffffffffffffffffffffffffffffffffff166348cd4cb16040518163ffffffff1660e01b815260040160206040518083038186803b158015612abb57600080fd5b505afa158015612acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af391906136e2565b846040518363ffffffff1660e01b8152600401612b11929190614423565b60206040518083038186803b158015612b2957600080fd5b505afa158015612b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6191906136e2565b90506000612b7a82600854612d3890919063ffffffff16565b90507f00000000000000000000000045a68c45bdc4cccac5e1dc097258dc62cb44d65973ffffffffffffffffffffffffffffffffffffffff1663f787f16e846040518263ffffffff1660e01b8152600401612bd5919061437f565b600060405180830381600087803b158015612bef57600080fd5b505af1158015612c03573d6000803e3d6000fd5b50505050612c59612c1261169a565b827f00000000000000000000000000a55375002f3cda400383f479e7cd57bad029a973ffffffffffffffffffffffffffffffffffffffff16612d889092919063ffffffff16565b505050565b600080821480612c7b5750828283850292508281612c7857fe5b04145b612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb19061430d565b60405180910390fd5b92915050565b600080828403905060008312158015612cd95750838113155b80612cef5750600083128015612cee57508381135b5b612d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d25906142cd565b60405180910390fd5b8091505092915050565b6000828284039150811115612d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d799061416d565b60405180910390fd5b92915050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612dbb92919061407f565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612e099190613fa7565b6000604051808303816000865af19150503d8060008114612e46576040519150601f19603f3d011682016040523d82523d6000602084013e612e4b565b606091505b5091509150818015612e795750600081511480612e78575080806020019051810190612e77919061359d565b5b5b612eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eaf906141ed565b60405180910390fd5b5050505050565b600080821215612f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efb906141ad565b60405180910390fd5b819050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff16821115612f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7a9061424d565b60405180910390fd5b819050919050565b6000816fffffffffffffffffffffffffffffffff168284019150816fffffffffffffffffffffffffffffffff161015612ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff09061426d565b60405180910390fd5b92915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff1682111561306e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613065906142ad565b60405180910390fd5b819050919050565b600033905090565b60008182840191508110156130c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130bf9061426d565b60405180910390fd5b92915050565b6000808284019050600083121580156130e75750838112155b806130fd57506000831280156130fc57508381125b5b61313c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131339061422d565b60405180910390fd5b8091505092915050565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161317b93929190613fd9565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516131c99190613fa7565b6000604051808303816000865af19150503d8060008114613206576040519150601f19603f3d011682016040523d82523d6000602084013e61320b565b606091505b50915091508180156132395750600081511480613238575080806020019051810190613237919061359d565b5b5b613278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326f906142ed565b60405180910390fd5b505050505050565b60606044825110156132c9576040518060400160405280601d81526020017f5472616e73616374696f6e2072657665727465642073696c656e746c7900000081525090506132e6565b600482019150818060200190518101906132e39190613678565b90505b919050565b604051806060016040528060006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681525090565b600081359050613341816147e7565b92915050565b60008083601f84011261335957600080fd5b8235905067ffffffffffffffff81111561337257600080fd5b60208301915083602082028301111561338a57600080fd5b9250929050565b60008083601f8401126133a357600080fd5b8235905067ffffffffffffffff8111156133bc57600080fd5b6020830191508360208202830111156133d457600080fd5b9250929050565b6000813590506133ea816147fe565b92915050565b6000815190506133ff816147fe565b92915050565b60008135905061341481614815565b92915050565b6000813590506134298161482c565b92915050565b60008135905061343e81614843565b92915050565b600082601f83011261345557600080fd5b815161346861346382614530565b614503565b9150808252602083016020830185838301111561348457600080fd5b61348f8382846147a3565b50505092915050565b6000813590506134a78161485a565b92915050565b6000815190506134bc8161485a565b92915050565b6000813590506134d181614871565b92915050565b6000602082840312156134e957600080fd5b60006134f784828501613332565b91505092915050565b60008060006040848603121561351557600080fd5b600084013567ffffffffffffffff81111561352f57600080fd5b61353b86828701613347565b9350935050602061354e868287016133db565b9150509250925092565b6000806020838503121561356b57600080fd5b600083013567ffffffffffffffff81111561358557600080fd5b61359185828601613391565b92509250509250929050565b6000602082840312156135af57600080fd5b60006135bd848285016133f0565b91505092915050565b600080600080600080600080610100898b0312156135e357600080fd5b60006135f18b828c0161341a565b98505060206136028b828c01613332565b97505060406136138b828c01613332565b96505060606136248b828c01613498565b95505060806136358b828c01613498565b94505060a06136468b828c016134c2565b93505060c06136578b828c01613405565b92505060e06136688b828c01613405565b9150509295985092959890939650565b60006020828403121561368a57600080fd5b600082015167ffffffffffffffff8111156136a457600080fd5b6136b084828501613444565b91505092915050565b6000602082840312156136cb57600080fd5b60006136d984828501613498565b91505092915050565b6000602082840312156136f457600080fd5b6000613702848285016134ad565b91505092915050565b6000806040838503121561371e57600080fd5b600061372c85828601613498565b925050602061373d85828601613332565b9150509250929050565b60008060006060848603121561375c57600080fd5b600061376a86828701613498565b935050602061377b8682870161341a565b925050604061378c8682870161342f565b9150509250925092565b6000806000606084860312156137ab57600080fd5b60006137b986828701613498565b93505060206137ca86828701613498565b92505060406137db86828701613332565b9150509250925092565b600080600080608085870312156137fb57600080fd5b600061380987828801613498565b945050602061381a87828801613498565b935050604061382b8782880161342f565b925050606061383c878288016133db565b91505092959194509250565b60006138548383613965565b60208301905092915050565b600061386c83836139b7565b905092915050565b61387d816146ce565b82525050565b61388c81614611565b82525050565b600061389d8261457c565b6138a781856145c2565b93506138b28361455c565b8060005b838110156138e35781516138ca8882613848565b97506138d5836145a8565b9250506001810190506138b6565b5085935050505092915050565b60006138fb82614587565b61390581856145d3565b9350836020820285016139178561456c565b8060005b8581101561395357848403895281516139348582613860565b945061393f836145b5565b925060208a0199505060018101905061391b565b50829750879550505050505092915050565b61396e81614623565b82525050565b61397d81614623565b82525050565b61398c8161462f565b82525050565b600061399e83856145f5565b93506139ab838584614794565b82840190509392505050565b60006139c282614592565b6139cc81856145e4565b93506139dc8185602086016147a3565b6139e5816147d6565b840191505092915050565b60006139fb82614592565b613a0581856145f5565b9350613a158185602086016147a3565b80840191505092915050565b613a2a816146e0565b82525050565b613a3981614704565b82525050565b613a4881614728565b82525050565b613a578161465d565b82525050565b6000613a688261459d565b613a728185614600565b9350613a828185602086016147a3565b613a8b816147d6565b840191505092915050565b6000613aa3601583614600565b91507f426f72696e674d6174683a20556e646572666c6f7700000000000000000000006000830152602082019050919050565b6000613ae3602f83614600565b91507f4d756c7469546f6b656e5374616b696e673a205374616b696e6720706f6f6c2060008301527f616c7265616479206578697374732e00000000000000000000000000000000006020830152604082019050919050565b6000613b49600b83614600565b91507f496e7465676572203c20300000000000000000000000000000000000000000006000830152602082019050919050565b6000613b89603483614600565b91507f4d756c7469546f6b656e5374616b696e673a206e6f7420617574686f72697a6560008301527f6420746f20616c6c6f6361746520706f696e74730000000000000000000000006020830152604082019050919050565b6000613bef601c83614600565b91507f426f72696e6745524332303a205472616e73666572206661696c6564000000006000830152602082019050919050565b6000613c2f602683614600565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c95602183614600565b91507f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cfb601c83614600565b91507f426f72696e674d6174683a2075696e74313238204f766572666c6f77000000006000830152602082019050919050565b6000613d3b601883614600565b91507f426f72696e674d6174683a20416464204f766572666c6f7700000000000000006000830152602082019050919050565b6000613d7b602083614600565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613dbb601b83614600565b91507f426f72696e674d6174683a2075696e743634204f766572666c6f7700000000006000830152602082019050919050565b6000613dfb602483614600565b91507f5369676e6564536166654d6174683a207375627472616374696f6e206f76657260008301527f666c6f77000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e61602083614600565b91507f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646000830152602082019050919050565b6000613ea1601883614600565b91507f426f72696e674d6174683a204d756c204f766572666c6f7700000000000000006000830152602082019050919050565b606082016000820151613eea6000850182613f16565b506020820151613efd6020850182613f61565b506040820151613f106040850182613f61565b50505050565b613f1f81614667565b82525050565b613f2e81614667565b82525050565b613f3d8161474c565b82525050565b613f4c816146a3565b82525050565b613f5b81614782565b82525050565b613f6a816146ad565b82525050565b613f79816146ad565b82525050565b613f88816146c1565b82525050565b6000613f9b828486613992565b91508190509392505050565b6000613fb382846139f0565b915081905092915050565b6000602082019050613fd36000830184613883565b92915050565b6000606082019050613fee6000830186613883565b613ffb6020830185613883565b6140086040830184613f43565b949350505050565b600060e082019050614025600083018a613883565b6140326020830189613883565b61403f6040830188613f43565b61404c6060830187613f43565b6140596080830186613f7f565b61406660a0830185613983565b61407360c0830184613983565b98975050505050505050565b60006040820190506140946000830185613883565b6140a16020830184613f43565b9392505050565b600060408201905081810360008301526140c28185613892565b905081810360208301526140d681846138f0565b90509392505050565b60006020820190506140f46000830184613974565b92915050565b600060208201905061410f6000830184613a21565b92915050565b600060208201905061412a6000830184613a30565b92915050565b60006020820190506141456000830184613a3f565b92915050565b600060208201905081810360008301526141658184613a5d565b905092915050565b6000602082019050818103600083015261418681613a96565b9050919050565b600060208201905081810360008301526141a681613ad6565b9050919050565b600060208201905081810360008301526141c681613b3c565b9050919050565b600060208201905081810360008301526141e681613b7c565b9050919050565b6000602082019050818103600083015261420681613be2565b9050919050565b6000602082019050818103600083015261422681613c22565b9050919050565b6000602082019050818103600083015261424681613c88565b9050919050565b6000602082019050818103600083015261426681613cee565b9050919050565b6000602082019050818103600083015261428681613d2e565b9050919050565b600060208201905081810360008301526142a681613d6e565b9050919050565b600060208201905081810360008301526142c681613dae565b9050919050565b600060208201905081810360008301526142e681613dee565b9050919050565b6000602082019050818103600083015261430681613e54565b9050919050565b6000602082019050818103600083015261432681613e94565b9050919050565b60006060820190506143426000830184613ed4565b92915050565b600060608201905061435d6000830186613f25565b61436a6020830185613f70565b6143776040830184613f70565b949350505050565b60006020820190506143946000830184613f43565b92915050565b60006060820190506143af6000830186613f43565b6143bc6020830185613874565b6143c96040830184613f43565b949350505050565b60006040820190506143e66000830185613f43565b6143f36020830184613974565b9392505050565b600060408201905061440f6000830185613f43565b61441c6020830184613a4e565b9392505050565b60006040820190506144386000830185613f43565b6144456020830184613f43565b9392505050565b60006040820190506144616000830185613f52565b61446e6020830184613f43565b9392505050565b600060608201905061448a6000830186613f70565b6144976020830185613f43565b6144a46040830184613f34565b949350505050565b600080833560016020038436030381126144c557600080fd5b80840192508235915067ffffffffffffffff8211156144e357600080fd5b6020830192506001820236038313156144fb57600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff8211171561452657600080fd5b8060405250919050565b600067ffffffffffffffff82111561454757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061461c82614683565b9050919050565b60008115159050919050565b6000819050919050565b600061464482614611565b9050919050565b600061465682614611565b9050919050565b6000819050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006146d98261475e565b9050919050565b60006146eb826146f2565b9050919050565b60006146fd82614683565b9050919050565b600061470f82614716565b9050919050565b600061472182614683565b9050919050565b60006147338261473a565b9050919050565b600061474582614683565b9050919050565b600061475782614667565b9050919050565b600061476982614770565b9050919050565b600061477b82614683565b9050919050565b600061478d826146ad565b9050919050565b82818337600083830152505050565b60005b838110156147c15780820151818401526020810190506147a6565b838111156147d0576000848401525b50505050565b6000601f19601f8301169050919050565b6147f081614611565b81146147fb57600080fd5b50565b61480781614623565b811461481257600080fd5b50565b61481e8161462f565b811461482957600080fd5b50565b61483581614639565b811461484057600080fd5b50565b61484c8161464b565b811461485757600080fd5b50565b614863816146a3565b811461486e57600080fd5b50565b61487a816146c1565b811461488557600080fd5b5056fea26469706673582212201eba1f37157ae279ec40ed9362010fce30b2c58fc718c6519227bf6d1f6862c364736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000a55375002f3cda400383f479e7cd57bad029a900000000000000000000000045a68c45bdc4cccac5e1dc097258dc62cb44d659
-----Decoded View---------------
Arg [0] : _rewardsToken (address): 0x00A55375002f3cDa400383F479e7Cd57Bad029A9
Arg [1] : _rewardsSchedule (address): 0x45A68c45BDc4cCCaC5e1dC097258DC62Cb44d659
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000a55375002f3cda400383f479e7cd57bad029a9
Arg [1] : 00000000000000000000000045a68c45bdc4cccac5e1dc097258dc62cb44d659
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.