More Info
Private Name Tags
ContractCreator:
Latest 25 from a total of 145,291 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 78398470 | 4 mins ago | IN | 0 FTM | 0.05575665 | ||||
Harvest All | 78398456 | 4 mins ago | IN | 0 FTM | 0.05697743 | ||||
Harvest All | 78397685 | 21 mins ago | IN | 0 FTM | 0.03859776 | ||||
Withdraw | 78395656 | 1 hr ago | IN | 0 FTM | 0.02704549 | ||||
Withdraw | 78393582 | 1 hr ago | IN | 0 FTM | 0.01175142 | ||||
Harvest All | 78393503 | 1 hr ago | IN | 0 FTM | 0.03706314 | ||||
Withdraw | 78393393 | 1 hr ago | IN | 0 FTM | 0.02653763 | ||||
Withdraw | 78393177 | 1 hr ago | IN | 0 FTM | 0.02662026 | ||||
Harvest All | 78393062 | 1 hr ago | IN | 0 FTM | 0.03511183 | ||||
Harvest All | 78392892 | 2 hrs ago | IN | 0 FTM | 0.03661723 | ||||
Withdraw | 78392820 | 2 hrs ago | IN | 0 FTM | 0.02539819 | ||||
Harvest All | 78392798 | 2 hrs ago | IN | 0 FTM | 0.03529618 | ||||
Withdraw | 78391826 | 2 hrs ago | IN | 0 FTM | 0.02491956 | ||||
Withdraw | 78388604 | 3 hrs ago | IN | 0 FTM | 0.00644575 | ||||
Withdraw | 78388109 | 3 hrs ago | IN | 0 FTM | 0.01773049 | ||||
Withdraw | 78387720 | 3 hrs ago | IN | 0 FTM | 0.01855761 | ||||
Withdraw | 78387692 | 3 hrs ago | IN | 0 FTM | 0.01763569 | ||||
Withdraw | 78387660 | 3 hrs ago | IN | 0 FTM | 0.01763569 | ||||
Withdraw | 78381875 | 5 hrs ago | IN | 0 FTM | 0.02452094 | ||||
Harvest All | 78381766 | 5 hrs ago | IN | 0 FTM | 0.03409352 | ||||
Withdraw | 78380009 | 6 hrs ago | IN | 0 FTM | 0.02684368 | ||||
Withdraw | 78379923 | 6 hrs ago | IN | 0 FTM | 0.02722027 | ||||
Withdraw | 78377832 | 7 hrs ago | IN | 0 FTM | 0.02825413 | ||||
Withdraw | 78376900 | 7 hrs ago | IN | 0 FTM | 0.02813787 | ||||
Harvest All | 78373633 | 8 hrs ago | IN | 0 FTM | 0.0346798 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
34757343 | 729 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
MasterChefV2
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import "./interfaces/IRewarder.sol"; import "./interfaces/IMasterChef.sol"; /// @notice The (older) MasterChef contract gives out a constant number of BOO tokens per second. /// It is the only address with minting rights for BOO. /// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token /// that is deposited into the MasterChef V1 (MCV1) contract. /// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives. contract MasterChefV2 is Ownable { using SafeERC20 for IERC20; /// @notice Info of each MCV2 user. /// `amount` LP token amount the user has provided. /// `rewardDebt` The amount of BOO entitled to the user. struct UserInfo { uint amount; uint rewardDebt; } /// @notice Info of each MCV2 pool. /// `allocPoint` The amount of allocation points assigned to the pool. /// Also known as the amount of BOO to distribute per second. struct PoolInfo { uint128 accBooPerShare; uint64 lastRewardTime; uint64 allocPoint; } /// @notice Address of MCV1 contract. IMasterChef public immutable MASTER_CHEF; /// @notice Address of BOO contract. IERC20 public immutable BOO; /// @notice The index of MCV2 master pool in MCV1. uint public immutable MASTER_PID; /// @notice Info of each MCV2 pool. mapping (uint => PoolInfo) public poolInfo; /// @notice Address of the LP token for each MCV2 pool. mapping (uint => IERC20) public lpToken; /// @notice Amount of pool infos and their respective lpToken entries I.E stores last ID + 1, for above two mappings uint public poolInfoAmount; /// @notice Is an address contained in the above `lpToken` array mapping(address => bool) public isLpToken; /// @notice Address of each `IRewarder` contract in MCV2. mapping(uint => IRewarder) public rewarder; /// @notice Info of each user that stakes LP tokens. mapping (uint => mapping (address => UserInfo)) public userInfo; /// @dev Total allocation points. Must be the sum of all allocation points in all pools. uint public totalAllocPoint; uint private constant ACC_BOO_PRECISION = 1e12; /// @dev Last MCV1 harvest timestamp. uint public lastV1HarvestTimestamp; /// @dev How often v1 harvest should be called by the query function uint public V1_HARVEST_QUERY_TIME = 1 days; event Deposit(address indexed user, uint indexed pid, uint amount, address indexed to); event Withdraw(address indexed user, uint indexed pid, uint amount, address indexed to); event EmergencyWithdraw(address indexed user, uint indexed pid, uint amount, address indexed to); event Harvest(address indexed user, uint indexed pid, uint amount); event LogPoolAddition(uint indexed pid, uint allocPoint, IERC20 indexed lpToken, IRewarder rewarder, bool update); event LogSetPool(uint indexed pid, uint allocPoint, IRewarder rewarder, bool overwrite, bool update); event LogUpdatePool(uint indexed pid, uint lastRewardTime, uint lpSupply, uint accBooPerShare); event LogInit(); /// @param _MASTER_CHEF The SpookySwap MCV1 contract address. /// @param _boo The BOO token contract address. /// @param _MASTER_PID The pool ID of the dummy token on the base MCV1 contract. constructor(IMasterChef _MASTER_CHEF, IERC20 _boo, uint _MASTER_PID) { MASTER_CHEF = _MASTER_CHEF; BOO = _boo; MASTER_PID = _MASTER_PID; } /// @notice Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for BOO. /// Any balance of transaction sender in `dummyToken` is transferred. /// The allocation point for the pool on MCV1 is the total allocation point for all pools that receive double incentives. /// @param dummyToken The address of the ERC-20 token to deposit into MCV1. function init(IERC20 dummyToken) external { uint balance = dummyToken.balanceOf(msg.sender); require(balance != 0, "MasterChefV2: Balance must exceed 0"); dummyToken.safeTransferFrom(msg.sender, address(this), balance); dummyToken.approve(address(MASTER_CHEF), balance); MASTER_CHEF.deposit(MASTER_PID, balance); emit LogInit(); } /// @notice Returns the number of MCV2 pools. function poolLength() public view returns (uint pools) { pools = poolInfoAmount; } function checkForDuplicate(IERC20 _lpToken) internal view { require(!isLpToken[address(_lpToken)], "add: pool already exists!!!!"); } function getFarmData(uint pid) external view returns (PoolInfo memory, uint, IRewarder) { return (poolInfo[pid], totalAllocPoint, rewarder[pid]); } modifier validatePid(uint256 pid) { require(pid < poolInfoAmount, "pid doesn't exist..."); _; } /// @notice View function to see pending BOO on frontend. /// @param _pid The index of the pool. See `poolInfo`. /// @param _user Address of user. /// @return pending BOO reward for a given user. function pendingBOO(uint _pid, address _user) external view validatePid(_pid) returns (uint pending) { PoolInfo memory pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint accBooPerShare = pool.accBooPerShare; uint lpSupply = lpToken[_pid].balanceOf(address(this)); if (block.timestamp > pool.lastRewardTime && lpSupply != 0) { uint multiplier = block.timestamp - pool.lastRewardTime; uint booReward = totalAllocPoint == 0 ? 0 : ((multiplier * booPerSecond() * pool.allocPoint) / totalAllocPoint); accBooPerShare = accBooPerShare + (booReward * ACC_BOO_PRECISION / lpSupply); } pending = (user.amount * accBooPerShare / ACC_BOO_PRECISION) - user.rewardDebt; } /// @notice Update reward variables for an array of pools. Be careful of gas spending! /// @param pids Pool IDs of all to be updated. Make sure to update all active pools. function massUpdatePools(uint256[] calldata pids) external { harvestFromMasterChef(); uint256 len = pids.length; for (uint256 i = 0; i < len; ++i) { _updatePool(pids[i]); } } /// @notice Update reward variables for all pools. Be careful of gas spending! /// @dev This function should never be called from a smart contract as it has an unbounded gas cost. function massUpdateAllPools() public { harvestFromMasterChef(); uint len = poolInfoAmount; for (uint pid = 0; pid < len; ++pid) { _updatePool(pid); } } /// @notice Calculates and returns the `amount` of BOO per second allocated to this contract function booPerSecond() public view returns (uint amount) { amount = MASTER_CHEF.booPerSecond() * MASTER_CHEF.poolInfo(MASTER_PID).allocPoint / MASTER_CHEF.totalAllocPoint(); } /// @notice 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(uint pid) internal validatePid(pid) returns (PoolInfo memory pool) { pool = poolInfo[pid]; if (block.timestamp > pool.lastRewardTime) { uint lpSupply = lpToken[pid].balanceOf(address(this)); if (lpSupply > 0) { uint multiplier = block.timestamp - pool.lastRewardTime; uint booReward = totalAllocPoint == 0 ? 0 : ((multiplier * booPerSecond() * pool.allocPoint) / totalAllocPoint); queryHarvestFromMasterChef(); pool.accBooPerShare = uint128(pool.accBooPerShare + ((booReward * ACC_BOO_PRECISION) / lpSupply)); } pool.lastRewardTime = uint64(block.timestamp); poolInfo[pid] = pool; emit LogUpdatePool(pid, pool.lastRewardTime, lpSupply, pool.accBooPerShare); } } function updatePool(uint pid) external returns (PoolInfo memory pool) { return _updatePool(pid); } function deposit(uint pid, uint amount, address to) external validatePid(pid) { _deposit(pid, amount, to); } function deposit(uint pid, uint amount) external validatePid(pid) { _deposit(pid, amount, msg.sender); } /// @notice Deposit LP tokens to MCV2 for BOO allocation. /// @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(uint pid, uint amount, address to) internal { PoolInfo memory pool = _updatePool(pid); UserInfo storage user = userInfo[pid][to]; // Effects uint256 _pendingBoo = (user.amount * pool.accBooPerShare / ACC_BOO_PRECISION) - user.rewardDebt; user.amount += amount; user.rewardDebt = user.amount * pool.accBooPerShare / ACC_BOO_PRECISION; // Interactions if (_pendingBoo != 0) { BOO.safeTransfer(to, _pendingBoo); } IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward(pid, to, to, _pendingBoo, user.amount); } lpToken[pid].safeTransferFrom(msg.sender, address(this), amount); emit Deposit(msg.sender, pid, amount, to); emit Harvest(msg.sender, pid, _pendingBoo); } function withdraw(uint pid, uint amount, address to) external validatePid(pid) { _withdraw(pid, amount, to); } function withdraw(uint pid, uint amount) external validatePid(pid) { _withdraw(pid, amount, msg.sender); } /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender 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 BOO rewards. function _withdraw(uint pid, uint amount, address to) internal { PoolInfo memory pool = _updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; require(user.amount >= amount, "withdraw: not good"); // Effects uint256 _pendingBoo = (user.amount * pool.accBooPerShare / ACC_BOO_PRECISION) - user.rewardDebt; user.amount -= amount; user.rewardDebt = user.amount * pool.accBooPerShare / ACC_BOO_PRECISION; // Interactions if (_pendingBoo != 0) { BOO.safeTransfer(to, _pendingBoo); } IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward(pid, msg.sender, to, _pendingBoo, user.amount); } lpToken[pid].safeTransfer(to, amount); emit Withdraw(msg.sender, pid, amount, to); emit Harvest(msg.sender, pid, _pendingBoo); } /// @notice Batch harvest all rewards from all staked pools /// @dev This function has an unbounded gas cost. Take care not to call it from other smart contracts if you don't know what you're doing. function harvestAll() external { uint256 length = poolInfoAmount; uint calc; uint pending; UserInfo storage user; PoolInfo memory pool; uint totalPending; for (uint256 pid = 0; pid < length; ++pid) { user = userInfo[pid][msg.sender]; if (user.amount > 0) { pool = _updatePool(pid); calc = user.amount * pool.accBooPerShare / ACC_BOO_PRECISION; pending = calc - user.rewardDebt; user.rewardDebt = calc; if(pending > 0) { totalPending+=pending; } IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward(pid, msg.sender, msg.sender, pending, user.amount); } } } if (totalPending > 0) { BOO.safeTransfer(msg.sender, totalPending); } } /// @notice Batch harvest rewards from specified staked pools /// @param pids[] The array of pids of the pools you wish to harvest. See `poolInfo`. function harvestMultiple(uint[] memory pids) external { uint256 length = pids.length; uint calc; uint pending; UserInfo storage user; PoolInfo memory pool; uint totalPending; uint pid; for (uint256 i = 0; i < length; ++i) { pid = pids[i]; user = userInfo[pid][msg.sender]; if (user.amount > 0) { pool = _updatePool(pid); calc = user.amount * pool.accBooPerShare / ACC_BOO_PRECISION; pending = calc - user.rewardDebt; user.rewardDebt = calc; if(pending > 0) { totalPending+=pending; } IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward(pid, msg.sender, msg.sender, pending, user.amount); } } } if (totalPending > 0) { BOO.safeTransfer(msg.sender, totalPending); } } /// @notice Harvests BOO from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract. function harvestFromMasterChef() public { lastV1HarvestTimestamp = block.timestamp; MASTER_CHEF.deposit(MASTER_PID, 0); } /// @notice calls harvestFromMasterChef() if its been more than `V1_HARVEST_QUERY_TIME` since last v1 harvest function queryHarvestFromMasterChef() public { if(block.timestamp - lastV1HarvestTimestamp > V1_HARVEST_QUERY_TIME) harvestFromMasterChef(); } /// @notice 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(uint pid, address to) external validatePid(pid) { UserInfo storage user = userInfo[pid][msg.sender]; uint 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); } // ADMIN FUNCTIONS /// @notice Add a new LP to the pool. Can only be called by the owner. /// @param allocPoint AP of the new pool. /// @param _lpToken Address of the LP ERC-20 token. /// @param _rewarder Addresses of the rewarder delegate(s). function add(uint64 allocPoint, IERC20 _lpToken, IRewarder _rewarder, bool update) external onlyOwner { checkForDuplicate(_lpToken); if (update) { massUpdateAllPools(); } uint pid = poolInfoAmount; uint64 lastRewardTime = uint64(block.timestamp); totalAllocPoint = totalAllocPoint + allocPoint; lpToken[pid] = _lpToken; isLpToken[address(_lpToken)] = true; rewarder[pid] = _rewarder; PoolInfo storage poolinfo = poolInfo[pid]; poolinfo.allocPoint = allocPoint; poolinfo.lastRewardTime = lastRewardTime; poolinfo.accBooPerShare = 0; poolInfoAmount = poolInfoAmount + 1; emit LogPoolAddition(poolInfoAmount - 1, allocPoint, _lpToken, _rewarder, update); } /// @notice Update the given pool's BOO allocation point and `IRewarder` contract. Can only be called by the owner. /// @param _pid The index of the pool. See `poolInfo`. /// @param _allocPoint New AP of the pool. /// @param _rewarder Addresses of the rewarder delegates. /// @param overwrite True if _rewarders should be `set`. Otherwise `_rewarders` is ignored. function set(uint _pid, uint64 _allocPoint, IRewarder _rewarder, bool overwrite, bool update) external onlyOwner { _set(_pid, _allocPoint, _rewarder, overwrite, update); } /// @notice Batch update the given pool's BOO allocation point and `IRewarder` contract. Can only be called by the owner. /// @param _pid The index of the pool. See `poolInfo`. /// @param _allocPoint New AP of the pool. /// @param _rewarders Addresses of the rewarder delegates. /// @param overwrite True if _rewarders should be `set`. Otherwise `_rewarders` is ignored. function setBatch(uint[] memory _pid, uint64[] memory _allocPoint, IRewarder[] memory _rewarders, bool[] memory overwrite, bool update) external onlyOwner { require(_pid.length == _allocPoint.length && _allocPoint.length == _rewarders.length && _rewarders.length == overwrite.length, "MCV2: all arrays need to be the same length"); if(update) massUpdateAllPools(); uint len = _pid.length; for(uint i = 0; i < len; i++) _set(_pid[i], _allocPoint[i], _rewarders[i], overwrite[i], false); } function _set(uint _pid, uint64 _allocPoint, IRewarder _rewarder, bool overwrite, bool update) internal validatePid(_pid) { if (update) { massUpdateAllPools(); } totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; if (overwrite) rewarder[_pid] = _rewarder; emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite, update); } function setV1HarvestQueryTime(uint256 newTime, bool inDays) external onlyOwner { V1_HARVEST_QUERY_TIME = newTime * (inDays ? 1 days : 1); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; interface IRewarder { function onReward(uint256 pid, address user, address recipient, uint256 Booamount, uint256 newLpAmount) external; function pendingTokens(uint256 pid, address user, uint256 rewardAmount) external view returns (IERC20[] memory, uint256[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; interface IMasterChef { struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. BOO to distribute per second. uint256 lastRewardBlock; // Last block number that SUSHI distribution occurs. uint256 accBooPerShare; // Accumulated BOO per share, times 1e12. See below. } function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory); function totalAllocPoint() external view returns (uint256); function booPerSecond() external view returns (uint256); function deposit(uint256 _pid, uint256 _amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IMasterChef","name":"_MASTER_CHEF","type":"address"},{"internalType":"contract IERC20","name":"_boo","type":"address"},{"internalType":"uint256","name":"_MASTER_PID","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"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":[],"name":"LogInit","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":false,"internalType":"contract IRewarder","name":"rewarder","type":"address"},{"indexed":false,"internalType":"bool","name":"update","type":"bool"}],"name":"LogPoolAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"contract IRewarder","name":"rewarder","type":"address"},{"indexed":false,"internalType":"bool","name":"overwrite","type":"bool"},{"indexed":false,"internalType":"bool","name":"update","type":"bool"}],"name":"LogSetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accBooPerShare","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":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":[],"name":"BOO","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MASTER_CHEF","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MASTER_PID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V1_HARVEST_QUERY_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"allocPoint","type":"uint64"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"},{"internalType":"bool","name":"update","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"booPerSecond","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"amount","type":"uint256"}],"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"}],"name":"getFarmData","outputs":[{"components":[{"internalType":"uint128","name":"accBooPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"internalType":"struct MasterChefV2.PoolInfo","name":"","type":"tuple"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"contract IRewarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestFromMasterChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"harvestMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"dummyToken","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLpToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastV1HarvestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdateAllPools","outputs":[],"stateMutability":"nonpayable","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":"pendingBOO","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint128","name":"accBooPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolInfoAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"queryHarvestFromMasterChef","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint64","name":"_allocPoint","type":"uint64"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"},{"internalType":"bool","name":"overwrite","type":"bool"},{"internalType":"bool","name":"update","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pid","type":"uint256[]"},{"internalType":"uint64[]","name":"_allocPoint","type":"uint64[]"},{"internalType":"contract IRewarder[]","name":"_rewarders","type":"address[]"},{"internalType":"bool[]","name":"overwrite","type":"bool[]"},{"internalType":"bool","name":"update","type":"bool"}],"name":"setBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"},{"internalType":"bool","name":"inDays","type":"bool"}],"name":"setV1HarvestQueryTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","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":"accBooPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"internalType":"struct MasterChefV2.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":"uint256","name":"rewardDebt","type":"uint256"}],"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"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e0604052620151806009553480156200001857600080fd5b506040516200399c3803806200399c8339810160408190526200003b91620000cb565b620000463362000062565b6001600160a01b03928316608052911660a05260c05262000113565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000c857600080fd5b50565b600080600060608486031215620000e157600080fd5b8351620000ee81620000b2565b60208501519093506200010181620000b2565b80925050604084015190509250925092565b60805160a05160c0516137fe6200019e60003960008181610423015281816109be0152818161105d01526115b501526000818161044a01528181610e38015281816114cd01528181611ffb01526129ef0152600081816105e501528181610919015281816109eb0152818161108a01528181611500015281816115db015261166101526137fe6000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c8063715018a611610145578063a279b07f116100bd578063edd8b1701161008c578063f0488fac11610071578063f0488fac1461061a578063f2fde38b146106f2578063f7d0626b1461070557600080fd5b8063edd8b170146105e0578063ee59a2ac1461060757600080fd5b8063a279b07f1461057c578063c1bcb4931461058f578063c346253d14610597578063e2bbb158146105cd57600080fd5b80638da5cb5b116101145780638ed955b9116100f95780638ed955b9146105255780638f990b8b1461052d57806393f1a40b1461053557600080fd5b80638da5cb5b146104f45780638dbdbe6d1461051257600080fd5b8063715018a61461049a57806378ed5d1f146104a2578063822a75d8146104d85780638aa15ac7146104eb57600080fd5b80633ddc94a4116101d857806351eb05a6116101a757806361621aaa1161018c57806361621aaa1461041e578063624c7762146104455780636f7c62fa1461049157600080fd5b806351eb05a6146103eb57806357a5b58c1461040b57600080fd5b80633ddc94a4146103bf578063441a3e70146103c85780634c319fea146103db5780634f70b15a146103e357600080fd5b806317caf6f11161022f57806319cb9baf1161021457806319cb9baf14610386578063218e0f73146103995780632f940c70146103ac57600080fd5b806317caf6f11461036a57806319ab453c1461037357600080fd5b8063081e3eda146102615780630ad58d2f146102785780630f24ca7d1461028d5780631526fe27146102c0575b600080fd5b6003545b6040519081526020015b60405180910390f35b61028b610286366004612f1e565b610718565b005b6102b061029b366004612f57565b60046020526000908152604090205460ff1681565b604051901515815260200161026f565b6103316102ce366004612f74565b6001602052600090815260409020546fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161026f565b61026560075481565b61028b610381366004612f57565b61079a565b61028b610394366004613198565b610a89565b61028b6103a73660046132b1565b610c5d565b61028b6103ba3660046132ee565b610e69565b61026560095481565b61028b6103d636600461331e565b610f95565b61028b611011565b61028b611031565b6103fe6103f9366004612f74565b6110f7565b60405161026f9190613340565b61028b610419366004613384565b611123565b6102657f000000000000000000000000000000000000000000000000000000000000000081565b61046c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161026f565b61026560035481565b61028b611169565b61046c6104b0366004612f74565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61028b6104e63660046133f9565b6111f4565b61026560085481565b60005473ffffffffffffffffffffffffffffffffffffffff1661046c565b61028b610520366004612f1e565b61129c565b61028b611313565b6102656114fc565b6105676105433660046132ee565b60066020908152600092835260408084209091529082529020805460019091015482565b6040805192835260208301919091520161026f565b61026561058a3660046132ee565b611707565b61028b611998565b61046c6105a5366004612f74565b60056020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61028b6105db36600461331e565b6119cc565b61046c7f000000000000000000000000000000000000000000000000000000000000000081565b61028b61061536600461341e565b611a43565b6106e3610628366004612f74565b604080516060808201835260008083526020808401829052928401819052938452600182528284206007546005845294849020548451928301855290546fffffffffffffffffffffffffffffffff8116835267ffffffffffffffff70010000000000000000000000000000000082048116948401949094527801000000000000000000000000000000000000000000000000900490921692810192909252909273ffffffffffffffffffffffffffffffffffffffff90911690565b60405161026f93929190613484565b61028b610700366004612f57565b611ad8565b61028b6107133660046134f2565b611c08565b826003548110610789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e00000000000000000000000060448201526064015b60405180910390fd5b610794848484611eb1565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082b919061354c565b9050806108ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4d61737465724368656656323a2042616c616e6365206d75737420657863656560448201527f64203000000000000000000000000000000000000000000000000000000000006064820152608401610780565b6108dc73ffffffffffffffffffffffffffffffffffffffff83163330846121ba565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820183905283169063095ea7b3906044016020604051808303816000875af1158015610971573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109959190613565565b506040517fe2bbb1580000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e2bbb15890604401600060405180830381600087803b158015610a4457600080fd5b505af1158015610a58573d6000803e3d6000fd5b50506040517f98a9bd3b7a617581fc53b1e2992534e0e0cb5091c9d44aa1a7fc978f706caa83925060009150a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610780565b83518551148015610b1c575082518451145b8015610b29575081518351145b610bb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4d4356323a20616c6c20617272617973206e65656420746f206265207468652060448201527f73616d65206c656e6774680000000000000000000000000000000000000000006064820152608401610780565b8015610bc357610bc3611998565b845160005b81811015610c5457610c42878281518110610be557610be5613582565b6020026020010151878381518110610bff57610bff613582565b6020026020010151878481518110610c1957610c19613582565b6020026020010151878581518110610c3357610c33613582565b60200260200101516000612296565b80610c4c816135e0565b915050610bc8565b50505050505050565b8051604080516060810182526000808252602082018190529181018290528190819060008060005b87811015610e1757888181518110610c9f57610c9f613582565b602090810291909101810151600081815260068352604080822033835290935291909120805490965090925015610e0757610cd9826124b1565b8051865491955064e8d4a5100091610d03916fffffffffffffffffffffffffffffffff1690613619565b610d0d9190613656565b9650846001015487610d1f9190613691565b6001860188905595508515610d3b57610d3886846136a8565b92505b60008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff168015610e055785546040517f44af0fa7000000000000000000000000000000000000000000000000000000008152600481018590523360248201819052604482015260648101899052608481019190915273ffffffffffffffffffffffffffffffffffffffff8216906344af0fa79060a401600060405180830381600087803b158015610dec57600080fd5b505af1158015610e00573d6000803e3d6000fd5b505050505b505b610e10816135e0565b9050610c85565b508115610e5f57610e5f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163384612830565b5050505050505050565b816003548110610ed5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b600083815260066020908152604080832033845282528083208054848255600182018590558785526002909352922054610f269073ffffffffffffffffffffffffffffffffffffffff168583612830565b8373ffffffffffffffffffffffffffffffffffffffff16853373ffffffffffffffffffffffffffffffffffffffff167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b84604051610f8691815260200190565b60405180910390a45050505050565b816003548110611001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b61100c838333611eb1565b505050565b6009546008546110219042613691565b111561102f5761102f611031565b565b426008556040517fe2bbb1580000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152600060248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e2bbb15890604401600060405180830381600087803b1580156110e357600080fd5b505af1158015610794573d6000803e3d6000fd5b604080516060810182526000808252602082018190529181019190915261111d826124b1565b92915050565b61112b611031565b8060005b818110156107945761115884848381811061114c5761114c613582565b905060200201356124b1565b50611162816135e0565b905061112f565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610780565b61102f6000612886565b60005473ffffffffffffffffffffffffffffffffffffffff163314611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610780565b80611281576001611286565b620151805b6112959062ffffff1683613619565b6009555050565b826003548110611308576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b6107948484846128fb565b60035460408051606081018252600080825260208201819052918101829052819081906000805b868110156114ac576000818152600660209081526040808320338452909152902080549094501561149c5761136e816124b1565b8051855491945064e8d4a5100091611398916fffffffffffffffffffffffffffffffff1690613619565b6113a29190613656565b95508360010154866113b49190613691565b60018501879055945084156113d0576113cd85836136a8565b91505b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff16801561149a5784546040517f44af0fa7000000000000000000000000000000000000000000000000000000008152600481018490523360248201819052604482015260648101889052608481019190915273ffffffffffffffffffffffffffffffffffffffff8216906344af0fa79060a401600060405180830381600087803b15801561148157600080fd5b505af1158015611495573d6000803e3d6000fd5b505050505b505b6114a5816135e0565b905061133a565b5080156114f4576114f473ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163383612830565b505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166317caf6f16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611569573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158d919061354c565b6040517f1526fe270000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690631526fe2790602401608060405180830381865afa158015611637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165b91906136c0565b602001517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638f990b8b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ee919061354c565b6116f89190613619565b6117029190613656565b905090565b6000826003548110611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b6000848152600160209081526040808320815160608101835290546fffffffffffffffffffffffffffffffff808216835267ffffffffffffffff70010000000000000000000000000000000083048116848701527801000000000000000000000000000000000000000000000000909204909116828401528885526006845282852073ffffffffffffffffffffffffffffffffffffffff898116875290855283862083518b885260029096528487205494517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152939690959092169391929116906370a0823190602401602060405180830381865afa158015611883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a7919061354c565b9050836020015167ffffffffffffffff16421180156118c557508015155b1561195f576000846020015167ffffffffffffffff16426118e69190613691565b9050600060075460001461193157600754866040015167ffffffffffffffff1661190e6114fc565b6119189085613619565b6119229190613619565b61192c9190613656565b611934565b60005b90508261194664e8d4a5100083613619565b6119509190613656565b61195a90856136a8565b935050505b6001830154835464e8d4a5100090611978908590613619565b6119829190613656565b61198c9190613691565b98975050505050505050565b6119a0611031565b60035460005b818110156119c8576119b7816124b1565b506119c1816135e0565b90506119a6565b5050565b816003548110611a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b61100c8383336128fb565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ac4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610780565b611ad18585858585612296565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610780565b73ffffffffffffffffffffffffffffffffffffffff8116611bfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610780565b611c0581612886565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610780565b611c9283612b74565b8015611ca057611ca0611998565b6003546007544290611cbd9067ffffffffffffffff8816906136a8565b600755600082815260026020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8b811691821790935585526004845282852080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155878652600585528386208054909216928a169290921790559182905290912080546fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8a8116919091027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff169190911770010000000000000000000000000000000091851691909102177fffffffffffffffffffffffffffffffff000000000000000000000000000000001681556003549091611e1a91906136a8565b600381905573ffffffffffffffffffffffffffffffffffffffff871690611e4390600190613691565b6040805167ffffffffffffffff8b16815273ffffffffffffffffffffffffffffffffffffffff89166020820152871515918101919091527f2a027f5d63d4a66c542b1a2e7ba7bccebb9637ed316ff578fa006164d31e85cf906060015b60405180910390a350505050505050565b6000611ebc846124b1565b60008581526006602090815260408083203384529091529020805491925090841115611f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f77697468647261773a206e6f7420676f6f6400000000000000000000000000006044820152606401610780565b6001810154825182546000929164e8d4a5100091611f74916fffffffffffffffffffffffffffffffff1690613619565b611f7e9190613656565b611f889190613691565b905084826000016000828254611f9e9190613691565b90915550508251825464e8d4a5100091611fcc916fffffffffffffffffffffffffffffffff90911690613619565b611fd69190613656565b600183015580156120225761202273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168583612830565b60008681526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1680156120ee5782546040517f44af0fa70000000000000000000000000000000000000000000000000000000081526004810189905233602482015273ffffffffffffffffffffffffffffffffffffffff8781166044830152606482018590526084820192909252908216906344af0fa79060a401600060405180830381600087803b1580156120d557600080fd5b505af11580156120e9573d6000803e3d6000fd5b505050505b60008781526002602052604090205461211e9073ffffffffffffffffffffffffffffffffffffffff168688612830565b8473ffffffffffffffffffffffffffffffffffffffff16873373ffffffffffffffffffffffffffffffffffffffff167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328960405161217e91815260200190565b60405180910390a4604051828152879033907f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495490602001611ea0565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526107949085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612c04565b846003548110612302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b811561231057612310611998565b60008681526001602052604090205460075467ffffffffffffffff8088169261235992780100000000000000000000000000000000000000000000000090910490911690613691565b61236391906136a8565b6007556000868152600160205260409020805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff881602179055821561240c57600086815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b857fa7b9d0a4f426ff3e36f9ba45dcefdba1072c65541cc4dbff14897f8a70d7c9d4868561245e5760008981526005602052604090205473ffffffffffffffffffffffffffffffffffffffff16612460565b865b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015286151590820152841515606082015260800160405180910390a2505050505050565b604080516060810182526000808252602082018190529181019190915281600354811061253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b600083815260016020908152604091829020825160608101845290546fffffffffffffffffffffffffffffffff8116825267ffffffffffffffff700100000000000000000000000000000000820481169383018490527801000000000000000000000000000000000000000000000000909104169281019290925290925042111561282a576000838152600260205260408082205490517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015612639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265d919061354c565b90508015612728576000836020015167ffffffffffffffff16426126819190613691565b905060006007546000146126cc57600754856040015167ffffffffffffffff166126a96114fc565b6126b39085613619565b6126bd9190613619565b6126c79190613656565b6126cf565b60005b90506126d9611011565b826126e964e8d4a5100083613619565b6126f39190613656565b855161271191906fffffffffffffffffffffffffffffffff166136a8565b6fffffffffffffffffffffffffffffffff16855250505b4267ffffffffffffffff9081166020858101918252600087815260018252604090819020875181549451838a01516fffffffffffffffffffffffffffffffff9092167fffffffffffffffff00000000000000000000000000000000000000000000000090961686177001000000000000000000000000000000009188169182021777ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000009290971691909102959095179055805193845290830184905282015284907fcb7325664a4a3b7c7223eefc492a97ca4fdf94d46884621e5a8fae5a04b2b9d29060600160405180910390a2505b50919050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261100c9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612214565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612906846124b1565b600085815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281206001810154835182549495509193909164e8d4a5100091612968916fffffffffffffffffffffffffffffffff1690613619565b6129729190613656565b61297c9190613691565b90508482600001600082825461299291906136a8565b90915550508251825464e8d4a51000916129c0916fffffffffffffffffffffffffffffffff90911690613619565b6129ca9190613656565b60018301558015612a1657612a1673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168583612830565b60008681526005602052604090205473ffffffffffffffffffffffffffffffffffffffff168015612ae35782546040517f44af0fa70000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff878116602483018190526044830152606482018590526084820192909252908216906344af0fa79060a401600060405180830381600087803b158015612aca57600080fd5b505af1158015612ade573d6000803e3d6000fd5b505050505b600087815260026020526040902054612b149073ffffffffffffffffffffffffffffffffffffffff163330896121ba565b8473ffffffffffffffffffffffffffffffffffffffff16873373ffffffffffffffffffffffffffffffffffffffff167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478960405161217e91815260200190565b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604090205460ff1615611c05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6164643a20706f6f6c20616c72656164792065786973747321212121000000006044820152606401610780565b6000612c66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d109092919063ffffffff16565b80519091501561100c5780806020019051810190612c849190613565565b61100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610780565b6060612d1f8484600085612d29565b90505b9392505050565b606082471015612dbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610780565b843b612e23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610780565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e4c919061375b565b60006040518083038185875af1925050503d8060008114612e89576040519150601f19603f3d011682016040523d82523d6000602084013e612e8e565b606091505b5091509150612e9e828286612ea9565b979650505050505050565b60608315612eb8575081612d22565b825115612ec85782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107809190613777565b73ffffffffffffffffffffffffffffffffffffffff81168114611c0557600080fd5b600080600060608486031215612f3357600080fd5b83359250602084013591506040840135612f4c81612efc565b809150509250925092565b600060208284031215612f6957600080fd5b8135612d2281612efc565b600060208284031215612f8657600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561300357613003612f8d565b604052919050565b600067ffffffffffffffff82111561302557613025612f8d565b5060051b60200190565b600082601f83011261304057600080fd5b813560206130556130508361300b565b612fbc565b82815260059290921b8401810191818101908684111561307457600080fd5b8286015b8481101561308f5780358352918301918301613078565b509695505050505050565b803567ffffffffffffffff811681146130b257600080fd5b919050565b600082601f8301126130c857600080fd5b813560206130d86130508361300b565b82815260059290921b840181019181810190868411156130f757600080fd5b8286015b8481101561308f57803561310e81612efc565b83529183019183016130fb565b8015158114611c0557600080fd5b80356130b28161311b565b600082601f83011261314557600080fd5b813560206131556130508361300b565b82815260059290921b8401810191818101908684111561317457600080fd5b8286015b8481101561308f57803561318b8161311b565b8352918301918301613178565b600080600080600060a086880312156131b057600080fd5b853567ffffffffffffffff808211156131c857600080fd5b6131d489838a0161302f565b96506020915081880135818111156131eb57600080fd5b8801601f81018a136131fc57600080fd5b803561320a6130508261300b565b81815260059190911b8201840190848101908c83111561322957600080fd5b928501925b8284101561324e5761323f8461309a565b8252928501929085019061322e565b9850505050604088013591508082111561326757600080fd5b61327389838a016130b7565b9450606088013591508082111561328957600080fd5b5061329688828901613134565b9250506132a560808701613129565b90509295509295909350565b6000602082840312156132c357600080fd5b813567ffffffffffffffff8111156132da57600080fd5b6132e68482850161302f565b949350505050565b6000806040838503121561330157600080fd5b82359150602083013561331381612efc565b809150509250929050565b6000806040838503121561333157600080fd5b50508035926020909101359150565b6060810161111d828480516fffffffffffffffffffffffffffffffff16825260208082015167ffffffffffffffff9081169184019190915260409182015116910152565b6000806020838503121561339757600080fd5b823567ffffffffffffffff808211156133af57600080fd5b818501915085601f8301126133c357600080fd5b8135818111156133d257600080fd5b8660208260051b85010111156133e757600080fd5b60209290920196919550909350505050565b6000806040838503121561340c57600080fd5b8235915060208301356133138161311b565b600080600080600060a0868803121561343657600080fd5b853594506134466020870161309a565b9350604086013561345681612efc565b925060608601356134668161311b565b915060808601356134768161311b565b809150509295509295909350565b60a081016134c8828680516fffffffffffffffffffffffffffffffff16825260208082015167ffffffffffffffff9081169184019190915260409182015116910152565b83606083015273ffffffffffffffffffffffffffffffffffffffff83166080830152949350505050565b6000806000806080858703121561350857600080fd5b6135118561309a565b9350602085013561352181612efc565b9250604085013561353181612efc565b915060608501356135418161311b565b939692955090935050565b60006020828403121561355e57600080fd5b5051919050565b60006020828403121561357757600080fd5b8151612d228161311b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613612576136126135b1565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613651576136516135b1565b500290565b60008261368c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000828210156136a3576136a36135b1565b500390565b600082198211156136bb576136bb6135b1565b500190565b6000608082840312156136d257600080fd5b6040516080810181811067ffffffffffffffff821117156136f5576136f5612f8d565b604052825161370381612efc565b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b60005b8381101561374a578181015183820152602001613732565b838111156107945750506000910152565b6000825161376d81846020870161372f565b9190910192915050565b602081526000825180602084015261379681604085016020870161372f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea2646970667358221220913790539fd99bc5ac5bacc972cb28443f979c36ced3399323fb5db117bfe50b64736f6c634300080a00330000000000000000000000002b2929e785374c651a81a63878ab22742656dcdd000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe0000000000000000000000000000000000000000000000000000000000000049
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025c5760003560e01c8063715018a611610145578063a279b07f116100bd578063edd8b1701161008c578063f0488fac11610071578063f0488fac1461061a578063f2fde38b146106f2578063f7d0626b1461070557600080fd5b8063edd8b170146105e0578063ee59a2ac1461060757600080fd5b8063a279b07f1461057c578063c1bcb4931461058f578063c346253d14610597578063e2bbb158146105cd57600080fd5b80638da5cb5b116101145780638ed955b9116100f95780638ed955b9146105255780638f990b8b1461052d57806393f1a40b1461053557600080fd5b80638da5cb5b146104f45780638dbdbe6d1461051257600080fd5b8063715018a61461049a57806378ed5d1f146104a2578063822a75d8146104d85780638aa15ac7146104eb57600080fd5b80633ddc94a4116101d857806351eb05a6116101a757806361621aaa1161018c57806361621aaa1461041e578063624c7762146104455780636f7c62fa1461049157600080fd5b806351eb05a6146103eb57806357a5b58c1461040b57600080fd5b80633ddc94a4146103bf578063441a3e70146103c85780634c319fea146103db5780634f70b15a146103e357600080fd5b806317caf6f11161022f57806319cb9baf1161021457806319cb9baf14610386578063218e0f73146103995780632f940c70146103ac57600080fd5b806317caf6f11461036a57806319ab453c1461037357600080fd5b8063081e3eda146102615780630ad58d2f146102785780630f24ca7d1461028d5780631526fe27146102c0575b600080fd5b6003545b6040519081526020015b60405180910390f35b61028b610286366004612f1e565b610718565b005b6102b061029b366004612f57565b60046020526000908152604090205460ff1681565b604051901515815260200161026f565b6103316102ce366004612f74565b6001602052600090815260409020546fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161026f565b61026560075481565b61028b610381366004612f57565b61079a565b61028b610394366004613198565b610a89565b61028b6103a73660046132b1565b610c5d565b61028b6103ba3660046132ee565b610e69565b61026560095481565b61028b6103d636600461331e565b610f95565b61028b611011565b61028b611031565b6103fe6103f9366004612f74565b6110f7565b60405161026f9190613340565b61028b610419366004613384565b611123565b6102657f000000000000000000000000000000000000000000000000000000000000004981565b61046c7f000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe81565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161026f565b61026560035481565b61028b611169565b61046c6104b0366004612f74565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61028b6104e63660046133f9565b6111f4565b61026560085481565b60005473ffffffffffffffffffffffffffffffffffffffff1661046c565b61028b610520366004612f1e565b61129c565b61028b611313565b6102656114fc565b6105676105433660046132ee565b60066020908152600092835260408084209091529082529020805460019091015482565b6040805192835260208301919091520161026f565b61026561058a3660046132ee565b611707565b61028b611998565b61046c6105a5366004612f74565b60056020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61028b6105db36600461331e565b6119cc565b61046c7f0000000000000000000000002b2929e785374c651a81a63878ab22742656dcdd81565b61028b61061536600461341e565b611a43565b6106e3610628366004612f74565b604080516060808201835260008083526020808401829052928401819052938452600182528284206007546005845294849020548451928301855290546fffffffffffffffffffffffffffffffff8116835267ffffffffffffffff70010000000000000000000000000000000082048116948401949094527801000000000000000000000000000000000000000000000000900490921692810192909252909273ffffffffffffffffffffffffffffffffffffffff90911690565b60405161026f93929190613484565b61028b610700366004612f57565b611ad8565b61028b6107133660046134f2565b611c08565b826003548110610789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e00000000000000000000000060448201526064015b60405180910390fd5b610794848484611eb1565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082b919061354c565b9050806108ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4d61737465724368656656323a2042616c616e6365206d75737420657863656560448201527f64203000000000000000000000000000000000000000000000000000000000006064820152608401610780565b6108dc73ffffffffffffffffffffffffffffffffffffffff83163330846121ba565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002b2929e785374c651a81a63878ab22742656dcdd811660048301526024820183905283169063095ea7b3906044016020604051808303816000875af1158015610971573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109959190613565565b506040517fe2bbb1580000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000496004820152602481018290527f0000000000000000000000002b2929e785374c651a81a63878ab22742656dcdd73ffffffffffffffffffffffffffffffffffffffff169063e2bbb15890604401600060405180830381600087803b158015610a4457600080fd5b505af1158015610a58573d6000803e3d6000fd5b50506040517f98a9bd3b7a617581fc53b1e2992534e0e0cb5091c9d44aa1a7fc978f706caa83925060009150a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610780565b83518551148015610b1c575082518451145b8015610b29575081518351145b610bb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4d4356323a20616c6c20617272617973206e65656420746f206265207468652060448201527f73616d65206c656e6774680000000000000000000000000000000000000000006064820152608401610780565b8015610bc357610bc3611998565b845160005b81811015610c5457610c42878281518110610be557610be5613582565b6020026020010151878381518110610bff57610bff613582565b6020026020010151878481518110610c1957610c19613582565b6020026020010151878581518110610c3357610c33613582565b60200260200101516000612296565b80610c4c816135e0565b915050610bc8565b50505050505050565b8051604080516060810182526000808252602082018190529181018290528190819060008060005b87811015610e1757888181518110610c9f57610c9f613582565b602090810291909101810151600081815260068352604080822033835290935291909120805490965090925015610e0757610cd9826124b1565b8051865491955064e8d4a5100091610d03916fffffffffffffffffffffffffffffffff1690613619565b610d0d9190613656565b9650846001015487610d1f9190613691565b6001860188905595508515610d3b57610d3886846136a8565b92505b60008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff168015610e055785546040517f44af0fa7000000000000000000000000000000000000000000000000000000008152600481018590523360248201819052604482015260648101899052608481019190915273ffffffffffffffffffffffffffffffffffffffff8216906344af0fa79060a401600060405180830381600087803b158015610dec57600080fd5b505af1158015610e00573d6000803e3d6000fd5b505050505b505b610e10816135e0565b9050610c85565b508115610e5f57610e5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe163384612830565b5050505050505050565b816003548110610ed5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b600083815260066020908152604080832033845282528083208054848255600182018590558785526002909352922054610f269073ffffffffffffffffffffffffffffffffffffffff168583612830565b8373ffffffffffffffffffffffffffffffffffffffff16853373ffffffffffffffffffffffffffffffffffffffff167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b84604051610f8691815260200190565b60405180910390a45050505050565b816003548110611001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b61100c838333611eb1565b505050565b6009546008546110219042613691565b111561102f5761102f611031565b565b426008556040517fe2bbb1580000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000496004820152600060248201527f0000000000000000000000002b2929e785374c651a81a63878ab22742656dcdd73ffffffffffffffffffffffffffffffffffffffff169063e2bbb15890604401600060405180830381600087803b1580156110e357600080fd5b505af1158015610794573d6000803e3d6000fd5b604080516060810182526000808252602082018190529181019190915261111d826124b1565b92915050565b61112b611031565b8060005b818110156107945761115884848381811061114c5761114c613582565b905060200201356124b1565b50611162816135e0565b905061112f565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610780565b61102f6000612886565b60005473ffffffffffffffffffffffffffffffffffffffff163314611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610780565b80611281576001611286565b620151805b6112959062ffffff1683613619565b6009555050565b826003548110611308576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b6107948484846128fb565b60035460408051606081018252600080825260208201819052918101829052819081906000805b868110156114ac576000818152600660209081526040808320338452909152902080549094501561149c5761136e816124b1565b8051855491945064e8d4a5100091611398916fffffffffffffffffffffffffffffffff1690613619565b6113a29190613656565b95508360010154866113b49190613691565b60018501879055945084156113d0576113cd85836136a8565b91505b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff16801561149a5784546040517f44af0fa7000000000000000000000000000000000000000000000000000000008152600481018490523360248201819052604482015260648101889052608481019190915273ffffffffffffffffffffffffffffffffffffffff8216906344af0fa79060a401600060405180830381600087803b15801561148157600080fd5b505af1158015611495573d6000803e3d6000fd5b505050505b505b6114a5816135e0565b905061133a565b5080156114f4576114f473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe163383612830565b505050505050565b60007f0000000000000000000000002b2929e785374c651a81a63878ab22742656dcdd73ffffffffffffffffffffffffffffffffffffffff166317caf6f16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611569573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158d919061354c565b6040517f1526fe270000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000004960048201527f0000000000000000000000002b2929e785374c651a81a63878ab22742656dcdd73ffffffffffffffffffffffffffffffffffffffff1690631526fe2790602401608060405180830381865afa158015611637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165b91906136c0565b602001517f0000000000000000000000002b2929e785374c651a81a63878ab22742656dcdd73ffffffffffffffffffffffffffffffffffffffff16638f990b8b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ee919061354c565b6116f89190613619565b6117029190613656565b905090565b6000826003548110611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b6000848152600160209081526040808320815160608101835290546fffffffffffffffffffffffffffffffff808216835267ffffffffffffffff70010000000000000000000000000000000083048116848701527801000000000000000000000000000000000000000000000000909204909116828401528885526006845282852073ffffffffffffffffffffffffffffffffffffffff898116875290855283862083518b885260029096528487205494517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152939690959092169391929116906370a0823190602401602060405180830381865afa158015611883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a7919061354c565b9050836020015167ffffffffffffffff16421180156118c557508015155b1561195f576000846020015167ffffffffffffffff16426118e69190613691565b9050600060075460001461193157600754866040015167ffffffffffffffff1661190e6114fc565b6119189085613619565b6119229190613619565b61192c9190613656565b611934565b60005b90508261194664e8d4a5100083613619565b6119509190613656565b61195a90856136a8565b935050505b6001830154835464e8d4a5100090611978908590613619565b6119829190613656565b61198c9190613691565b98975050505050505050565b6119a0611031565b60035460005b818110156119c8576119b7816124b1565b506119c1816135e0565b90506119a6565b5050565b816003548110611a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b61100c8383336128fb565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ac4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610780565b611ad18585858585612296565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610780565b73ffffffffffffffffffffffffffffffffffffffff8116611bfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610780565b611c0581612886565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610780565b611c9283612b74565b8015611ca057611ca0611998565b6003546007544290611cbd9067ffffffffffffffff8816906136a8565b600755600082815260026020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8b811691821790935585526004845282852080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155878652600585528386208054909216928a169290921790559182905290912080546fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8a8116919091027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff169190911770010000000000000000000000000000000091851691909102177fffffffffffffffffffffffffffffffff000000000000000000000000000000001681556003549091611e1a91906136a8565b600381905573ffffffffffffffffffffffffffffffffffffffff871690611e4390600190613691565b6040805167ffffffffffffffff8b16815273ffffffffffffffffffffffffffffffffffffffff89166020820152871515918101919091527f2a027f5d63d4a66c542b1a2e7ba7bccebb9637ed316ff578fa006164d31e85cf906060015b60405180910390a350505050505050565b6000611ebc846124b1565b60008581526006602090815260408083203384529091529020805491925090841115611f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f77697468647261773a206e6f7420676f6f6400000000000000000000000000006044820152606401610780565b6001810154825182546000929164e8d4a5100091611f74916fffffffffffffffffffffffffffffffff1690613619565b611f7e9190613656565b611f889190613691565b905084826000016000828254611f9e9190613691565b90915550508251825464e8d4a5100091611fcc916fffffffffffffffffffffffffffffffff90911690613619565b611fd69190613656565b600183015580156120225761202273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe168583612830565b60008681526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1680156120ee5782546040517f44af0fa70000000000000000000000000000000000000000000000000000000081526004810189905233602482015273ffffffffffffffffffffffffffffffffffffffff8781166044830152606482018590526084820192909252908216906344af0fa79060a401600060405180830381600087803b1580156120d557600080fd5b505af11580156120e9573d6000803e3d6000fd5b505050505b60008781526002602052604090205461211e9073ffffffffffffffffffffffffffffffffffffffff168688612830565b8473ffffffffffffffffffffffffffffffffffffffff16873373ffffffffffffffffffffffffffffffffffffffff167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328960405161217e91815260200190565b60405180910390a4604051828152879033907f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495490602001611ea0565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526107949085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612c04565b846003548110612302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b811561231057612310611998565b60008681526001602052604090205460075467ffffffffffffffff8088169261235992780100000000000000000000000000000000000000000000000090910490911690613691565b61236391906136a8565b6007556000868152600160205260409020805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff881602179055821561240c57600086815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b857fa7b9d0a4f426ff3e36f9ba45dcefdba1072c65541cc4dbff14897f8a70d7c9d4868561245e5760008981526005602052604090205473ffffffffffffffffffffffffffffffffffffffff16612460565b865b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015286151590820152841515606082015260800160405180910390a2505050505050565b604080516060810182526000808252602082018190529181019190915281600354811061253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f70696420646f65736e27742065786973742e2e2e0000000000000000000000006044820152606401610780565b600083815260016020908152604091829020825160608101845290546fffffffffffffffffffffffffffffffff8116825267ffffffffffffffff700100000000000000000000000000000000820481169383018490527801000000000000000000000000000000000000000000000000909104169281019290925290925042111561282a576000838152600260205260408082205490517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015612639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265d919061354c565b90508015612728576000836020015167ffffffffffffffff16426126819190613691565b905060006007546000146126cc57600754856040015167ffffffffffffffff166126a96114fc565b6126b39085613619565b6126bd9190613619565b6126c79190613656565b6126cf565b60005b90506126d9611011565b826126e964e8d4a5100083613619565b6126f39190613656565b855161271191906fffffffffffffffffffffffffffffffff166136a8565b6fffffffffffffffffffffffffffffffff16855250505b4267ffffffffffffffff9081166020858101918252600087815260018252604090819020875181549451838a01516fffffffffffffffffffffffffffffffff9092167fffffffffffffffff00000000000000000000000000000000000000000000000090961686177001000000000000000000000000000000009188169182021777ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000009290971691909102959095179055805193845290830184905282015284907fcb7325664a4a3b7c7223eefc492a97ca4fdf94d46884621e5a8fae5a04b2b9d29060600160405180910390a2505b50919050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261100c9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612214565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612906846124b1565b600085815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281206001810154835182549495509193909164e8d4a5100091612968916fffffffffffffffffffffffffffffffff1690613619565b6129729190613656565b61297c9190613691565b90508482600001600082825461299291906136a8565b90915550508251825464e8d4a51000916129c0916fffffffffffffffffffffffffffffffff90911690613619565b6129ca9190613656565b60018301558015612a1657612a1673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe168583612830565b60008681526005602052604090205473ffffffffffffffffffffffffffffffffffffffff168015612ae35782546040517f44af0fa70000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff878116602483018190526044830152606482018590526084820192909252908216906344af0fa79060a401600060405180830381600087803b158015612aca57600080fd5b505af1158015612ade573d6000803e3d6000fd5b505050505b600087815260026020526040902054612b149073ffffffffffffffffffffffffffffffffffffffff163330896121ba565b8473ffffffffffffffffffffffffffffffffffffffff16873373ffffffffffffffffffffffffffffffffffffffff167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478960405161217e91815260200190565b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604090205460ff1615611c05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6164643a20706f6f6c20616c72656164792065786973747321212121000000006044820152606401610780565b6000612c66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d109092919063ffffffff16565b80519091501561100c5780806020019051810190612c849190613565565b61100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610780565b6060612d1f8484600085612d29565b90505b9392505050565b606082471015612dbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610780565b843b612e23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610780565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e4c919061375b565b60006040518083038185875af1925050503d8060008114612e89576040519150601f19603f3d011682016040523d82523d6000602084013e612e8e565b606091505b5091509150612e9e828286612ea9565b979650505050505050565b60608315612eb8575081612d22565b825115612ec85782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107809190613777565b73ffffffffffffffffffffffffffffffffffffffff81168114611c0557600080fd5b600080600060608486031215612f3357600080fd5b83359250602084013591506040840135612f4c81612efc565b809150509250925092565b600060208284031215612f6957600080fd5b8135612d2281612efc565b600060208284031215612f8657600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561300357613003612f8d565b604052919050565b600067ffffffffffffffff82111561302557613025612f8d565b5060051b60200190565b600082601f83011261304057600080fd5b813560206130556130508361300b565b612fbc565b82815260059290921b8401810191818101908684111561307457600080fd5b8286015b8481101561308f5780358352918301918301613078565b509695505050505050565b803567ffffffffffffffff811681146130b257600080fd5b919050565b600082601f8301126130c857600080fd5b813560206130d86130508361300b565b82815260059290921b840181019181810190868411156130f757600080fd5b8286015b8481101561308f57803561310e81612efc565b83529183019183016130fb565b8015158114611c0557600080fd5b80356130b28161311b565b600082601f83011261314557600080fd5b813560206131556130508361300b565b82815260059290921b8401810191818101908684111561317457600080fd5b8286015b8481101561308f57803561318b8161311b565b8352918301918301613178565b600080600080600060a086880312156131b057600080fd5b853567ffffffffffffffff808211156131c857600080fd5b6131d489838a0161302f565b96506020915081880135818111156131eb57600080fd5b8801601f81018a136131fc57600080fd5b803561320a6130508261300b565b81815260059190911b8201840190848101908c83111561322957600080fd5b928501925b8284101561324e5761323f8461309a565b8252928501929085019061322e565b9850505050604088013591508082111561326757600080fd5b61327389838a016130b7565b9450606088013591508082111561328957600080fd5b5061329688828901613134565b9250506132a560808701613129565b90509295509295909350565b6000602082840312156132c357600080fd5b813567ffffffffffffffff8111156132da57600080fd5b6132e68482850161302f565b949350505050565b6000806040838503121561330157600080fd5b82359150602083013561331381612efc565b809150509250929050565b6000806040838503121561333157600080fd5b50508035926020909101359150565b6060810161111d828480516fffffffffffffffffffffffffffffffff16825260208082015167ffffffffffffffff9081169184019190915260409182015116910152565b6000806020838503121561339757600080fd5b823567ffffffffffffffff808211156133af57600080fd5b818501915085601f8301126133c357600080fd5b8135818111156133d257600080fd5b8660208260051b85010111156133e757600080fd5b60209290920196919550909350505050565b6000806040838503121561340c57600080fd5b8235915060208301356133138161311b565b600080600080600060a0868803121561343657600080fd5b853594506134466020870161309a565b9350604086013561345681612efc565b925060608601356134668161311b565b915060808601356134768161311b565b809150509295509295909350565b60a081016134c8828680516fffffffffffffffffffffffffffffffff16825260208082015167ffffffffffffffff9081169184019190915260409182015116910152565b83606083015273ffffffffffffffffffffffffffffffffffffffff83166080830152949350505050565b6000806000806080858703121561350857600080fd5b6135118561309a565b9350602085013561352181612efc565b9250604085013561353181612efc565b915060608501356135418161311b565b939692955090935050565b60006020828403121561355e57600080fd5b5051919050565b60006020828403121561357757600080fd5b8151612d228161311b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613612576136126135b1565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613651576136516135b1565b500290565b60008261368c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000828210156136a3576136a36135b1565b500390565b600082198211156136bb576136bb6135b1565b500190565b6000608082840312156136d257600080fd5b6040516080810181811067ffffffffffffffff821117156136f5576136f5612f8d565b604052825161370381612efc565b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b60005b8381101561374a578181015183820152602001613732565b838111156107945750506000910152565b6000825161376d81846020870161372f565b9190910192915050565b602081526000825180602084015261379681604085016020870161372f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea2646970667358221220913790539fd99bc5ac5bacc972cb28443f979c36ced3399323fb5db117bfe50b64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002b2929e785374c651a81a63878ab22742656dcdd000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe0000000000000000000000000000000000000000000000000000000000000049
-----Decoded View---------------
Arg [0] : _MASTER_CHEF (address): 0x2b2929E785374c651a81A63878Ab22742656DcDd
Arg [1] : _boo (address): 0x841FAD6EAe12c286d1Fd18d1d525DFfA75C7EFFE
Arg [2] : _MASTER_PID (uint256): 73
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000002b2929e785374c651a81a63878ab22742656dcdd
Arg [1] : 000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000049
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
FTM | 100.00% | $2.73 | 95,578.9986 | $260,930.67 |
[ Download: CSV Export ]
[ 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.