Overview
FTM Balance
0 FTM
FTM Value
$0.00More Info
Private Name Tags
ContractCreator:
Sponsored
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14181469 | 961 days ago | IN | Create: MasterChefV2 | 0 FTM | 0.18632217 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
14181469 | 961 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
MasterChefV2
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; pragma experimental ABIEncoderV2; import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol"; import "@boringcrypto/boring-solidity/contracts/BoringBatchable.sol"; import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "./libraries/SignedSafeMath.sol"; import "./interfaces/IRewarder.sol"; import "./interfaces/IMasterChef.sol"; import "./interfaces/ILiquidDepositor.sol"; import "./interfaces/IStrategy.sol"; interface IMigratorChef { // Take the current LP token address and return the new LP token address. // Migrator should have full access to the caller's LP token. function migrate(IERC20 token) external returns (IERC20); } /// @notice The (older) MasterChef contract gives out a constant number of LQDR tokens per block. /// It is the only address with minting rights for LQDR. /// 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 BoringOwnable, BoringBatchable { using SafeMath for uint256; using BoringMath128 for uint128; using BoringERC20 for IERC20; using SignedSafeMath for int256; /// @notice Info of each MCV2 user. /// `amount` LP token amount the user has provided. /// `rewardDebt` The amount of LQDR entitled to the user. struct UserInfo { uint256 amount; int256 rewardDebt; } /// @notice Info of each MCV2 pool. /// `allocPoint` The amount of allocation points assigned to the pool. /// Also known as the amount of LQDR to distribute per block. struct PoolInfo { uint256 accLqdrPerShare; uint256 lastRewardBlock; uint256 allocPoint; uint256 depositFee; } /// @notice Address of MCV1 contract. IMasterChef public MASTER_CHEF; /// @notice Address of LQDR contract. IERC20 public LQDR; /// @notice The index of MCV2 master pool in MCV1. uint256 public MASTER_PID; // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner). IMigratorChef public migrator; /// @notice Info of each MCV2 pool. PoolInfo[] public poolInfo; /// @notice Address of the LP token for each MCV2 pool. IERC20[] public lpToken; /// @notice Address of each `IRewarder` contract in MCV2. IRewarder[] public rewarder; /// @notice Address of each `IStrategy`. IStrategy[] public strategies; /// @notice Info of each user that stakes LP tokens. mapping (uint256 => mapping (address => UserInfo)) public userInfo; /// @dev Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; uint256 public MASTERCHEF_LQDR_PER_BLOCK = 1e20; uint256 public ACC_LQDR_PRECISION = 1e12; // Deposit Fee Address address public feeAddress; // LiquidDepositor address address public liquidDepositor; event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event Harvest(address indexed user, uint256 indexed pid, uint256 amount); event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder); event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite); event LogUpdatePool(uint256 indexed pid, uint256 lastRewardBlock, uint256 lpSupply, uint256 accLqdrPerShare); event LogInit(); event DepositToLiquidDepositor(uint256 amount, address token); event WithdrawFromLiquidDepositor(uint256 amount, address token); constructor(IERC20 _lqdr, address _feeAddress) public { LQDR = _lqdr; feeAddress = _feeAddress; } function setMasterChef(IMasterChef masterChef, uint256 masterPid) external onlyOwner { MASTER_CHEF = masterChef; MASTER_PID = masterPid; } function setFeeAddress(address _feeAddress) public { require(msg.sender == feeAddress || msg.sender == owner, "setFeeAddress: FORBIDDEN"); feeAddress = _feeAddress; } /// @notice Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for LQDR. /// 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 { uint256 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 (uint256 pools) { pools = poolInfo.length; } /// @notice Add a new LP to the pool. Can only be called by the owner. /// DO NOT add the same LP token more than once. Rewards will be messed up if you do. /// @param allocPoint AP of the new pool. /// @param _lpToken Address of the LP ERC-20 token. /// @param _rewarder Address of the rewarder delegate. function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder, IStrategy _strategy, uint256 _depositFee) public onlyOwner { uint256 lastRewardBlock = block.number; totalAllocPoint = totalAllocPoint.add(allocPoint); lpToken.push(_lpToken); rewarder.push(_rewarder); strategies.push(_strategy); poolInfo.push(PoolInfo({ allocPoint: allocPoint, lastRewardBlock: lastRewardBlock, accLqdrPerShare: 0, depositFee: _depositFee })); emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder); } /// @notice Update the given pool's LQDR 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 Address of the rewarder delegate. /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored. function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, IStrategy _strategy, uint256 _depositFee, bool overwrite) public onlyOwner { totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; poolInfo[_pid].depositFee = _depositFee; if (overwrite) { rewarder[_pid] = _rewarder; strategies[_pid] = _strategy; } emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite); } /// @notice Set the `migrator` contract. Can only be called by the owner. /// @param _migrator The contract address to set. function setMigrator(IMigratorChef _migrator) public onlyOwner { migrator = _migrator; } /// @notice Migrate LP token to another LP contract through the `migrator` contract. /// @param _pid The index of the pool. See `poolInfo`. function migrate(uint256 _pid) public { require(address(migrator) != address(0), "MasterChefV2: no migrator set"); IERC20 _lpToken = lpToken[_pid]; uint256 bal = _lpToken.balanceOf(address(this)); _lpToken.approve(address(migrator), bal); IERC20 newLpToken = migrator.migrate(_lpToken); require(bal == newLpToken.balanceOf(address(this)), "MasterChefV2: migrated balance must match"); lpToken[_pid] = newLpToken; } /// @notice View function to see pending LQDR on frontend. /// @param _pid The index of the pool. See `poolInfo`. /// @param _user Address of user. /// @return pending LQDR reward for a given user. function pendingLqdr(uint256 _pid, address _user) external view returns (uint256 pending) { PoolInfo memory pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accLqdrPerShare = pool.accLqdrPerShare; uint256 lpSupply = lpToken[_pid].balanceOf(address(this)).add(strategies[_pid].balanceOf()); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 blocks = block.number.sub(pool.lastRewardBlock); uint256 lqdrReward = blocks.mul(lqdrPerBlock()).mul(pool.allocPoint) / totalAllocPoint; accLqdrPerShare = accLqdrPerShare.add(lqdrReward.mul(ACC_LQDR_PRECISION) / lpSupply); } pending = int256(user.amount.mul(accLqdrPerShare) / ACC_LQDR_PRECISION).sub(user.rewardDebt).toUInt256(); } /// @notice Update reward variables for all 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 { uint256 len = pids.length; for (uint256 i = 0; i < len; ++i) { updatePool(pids[i]); } } /// @notice Calculates and returns the `amount` of LQDR per block. function lqdrPerBlock() public view returns (uint256 amount) { amount = uint256(MASTERCHEF_LQDR_PER_BLOCK) .mul(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(uint256 pid) public returns (PoolInfo memory pool) { pool = poolInfo[pid]; if (block.number > pool.lastRewardBlock) { uint256 lpSupply = lpToken[pid].balanceOf(address(this)).add(strategies[pid].balanceOf()); if (lpSupply > 0) { uint256 blocks = block.number.sub(pool.lastRewardBlock); uint256 lqdrReward = blocks.mul(lqdrPerBlock()).mul(pool.allocPoint) / totalAllocPoint; pool.accLqdrPerShare = pool.accLqdrPerShare.add(lqdrReward.mul(ACC_LQDR_PRECISION) / lpSupply); } pool.lastRewardBlock = block.number; poolInfo[pid] = pool; emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accLqdrPerShare); } } /// @notice Deposit LP tokens to MCV2 for LQDR 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(uint256 pid, uint256 amount, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][to]; // Effects uint256 depositFeeAmount = amount.mul(pool.depositFee).div(10000); user.amount = user.amount.add(amount).sub(depositFeeAmount); user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accLqdrPerShare) / ACC_LQDR_PRECISION)); // Interactions IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onLqdrReward(pid, to, to, 0, user.amount); } lpToken[pid].safeTransferFrom(msg.sender, address(this), amount); lpToken[pid].safeTransfer(feeAddress, depositFeeAmount); IStrategy _strategy = strategies[pid]; if (address(_strategy) != address(0)) { uint256 _amount = lpToken[pid].balanceOf(address(this)); lpToken[pid].safeTransfer(address(_strategy), _amount); _strategy.deposit(); } emit Deposit(msg.sender, pid, amount, to); } function _withdraw(uint256 amount, uint256 pid, address to) internal returns (uint256) { uint256 balance = lpToken[pid].balanceOf(address(this)); IStrategy strategy = strategies[pid]; if (amount > balance) { uint256 missing = amount.sub(balance); uint256 withdrawn = strategy.withdraw(missing); amount = balance.add(withdrawn); } lpToken[pid].safeTransfer(to, amount); return amount; } /// @notice Withdraw LP tokens from MCV2. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to withdraw. /// @param to Receiver of the LP tokens. function withdraw(uint256 pid, uint256 amount, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; // Effects user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accLqdrPerShare) / ACC_LQDR_PRECISION)); user.amount = user.amount.sub(amount); // Interactions IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onLqdrReward(pid, msg.sender, to, 0, user.amount); } // lpToken[pid].safeTransfer(to, amount); amount = _withdraw(amount, pid, to); emit Withdraw(msg.sender, pid, amount, to); } /// @notice Harvest proceeds for transaction sender to `to`. /// @param pid The index of the pool. See `poolInfo`. /// @param to Receiver of LQDR rewards. function harvest(uint256 pid, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedLqdr = int256(user.amount.mul(pool.accLqdrPerShare) / ACC_LQDR_PRECISION); uint256 _pendingLqdr = accumulatedLqdr.sub(user.rewardDebt).toUInt256(); // Effects user.rewardDebt = accumulatedLqdr; // Interactions if (_pendingLqdr != 0) { LQDR.safeTransfer(to, _pendingLqdr); } IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onLqdrReward( pid, msg.sender, to, _pendingLqdr, user.amount); } emit Harvest(msg.sender, pid, _pendingLqdr); } /// @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 LQDR rewards. function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedLqdr = int256(user.amount.mul(pool.accLqdrPerShare) / ACC_LQDR_PRECISION); uint256 _pendingLqdr = accumulatedLqdr.sub(user.rewardDebt).toUInt256(); // Effects user.rewardDebt = accumulatedLqdr.sub(int256(amount.mul(pool.accLqdrPerShare) / ACC_LQDR_PRECISION)); user.amount = user.amount.sub(amount); // Interactions LQDR.safeTransfer(to, _pendingLqdr); IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onLqdrReward(pid, msg.sender, to, _pendingLqdr, user.amount); } // lpToken[pid].safeTransfer(to, amount); _withdraw(amount, pid, to); emit Withdraw(msg.sender, pid, amount, to); emit Harvest(msg.sender, pid, _pendingLqdr); } /// @notice Harvests LQDR from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract. function harvestFromMasterChef() public { MASTER_CHEF.deposit(MASTER_PID, 0); } /// @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(uint256 pid, address to) public { UserInfo storage user = userInfo[pid][msg.sender]; uint256 amount = user.amount; user.amount = 0; user.rewardDebt = 0; IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onLqdrReward(pid, msg.sender, to, 0, 0); } // Note: transfer can fail or succeed if `amount` is zero. amount = _withdraw(amount, pid, to); // lpToken[pid].safeTransfer(to, amount); emit EmergencyWithdraw(msg.sender, pid, amount, to); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; // a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math) library BoringMath { function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, "BoringMath: Underflow");} function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, "BoringMath: Mul Overflow");} function to128(uint256 a) internal pure returns (uint128 c) { require(a <= uint128(-1), "BoringMath: uint128 Overflow"); c = uint128(a); } function to64(uint256 a) internal pure returns (uint64 c) { require(a <= uint64(-1), "BoringMath: uint64 Overflow"); c = uint64(a); } function to32(uint256 a) internal pure returns (uint32 c) { require(a <= uint32(-1), "BoringMath: uint32 Overflow"); c = uint32(a); } } library BoringMath128 { function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, "BoringMath: Underflow");} } library BoringMath64 { function add(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a - b) <= a, "BoringMath: Underflow");} } library BoringMath32 { function add(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a - b) <= a, "BoringMath: Underflow");} }
// SPDX-License-Identifier: UNLICENSED // Audit on 5-Jan-2021 by Keno and BoringCrypto // P1 - P3: OK pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // solhint-disable avoid-low-level-calls import "./libraries/BoringERC20.sol"; // T1 - T4: OK contract BaseBoringBatchable { function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) { // If the _res length is less than 68, then the transaction failed silently (without a revert message) if (_returnData.length < 68) return "Transaction reverted silently"; assembly { // Slice the sighash. _returnData := add(_returnData, 0x04) } return abi.decode(_returnData, (string)); // All that remains is the revert string } // F3 - F9: OK // F1: External is ok here because this is the batch function, adding it to a batch makes no sense // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value // C1 - C21: OK // C3: The length of the loop is fully under user control, so can't be exploited // C7: Delegatecall is only used on the same contract, so it's safe function batch(bytes[] calldata calls, bool revertOnFail) external payable returns(bool[] memory successes, bytes[] memory results) { // Interactions successes = new bool[](calls.length); results = new bytes[](calls.length); for (uint256 i = 0; i < calls.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(calls[i]); require(success || !revertOnFail, _getRevertMsg(result)); successes[i] = success; results[i] = result; } } } // T1 - T4: OK contract BoringBatchable is BaseBoringBatchable { // F1 - F9: OK // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert) // if part of a batch this could be used to grief once as the second call would not need the permit // C1 - C21: OK function permitToken(IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { // Interactions // X1 - X5 token.permit(from, to, amount, deadline, v, r, s); } }
// SPDX-License-Identifier: MIT // Audit on 5-Jan-2021 by Keno and BoringCrypto // P1 - P3: OK pragma solidity 0.6.12; // Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol // Edited by BoringCrypto // T1 - T4: OK contract BoringOwnableData { // V1 - V5: OK address public owner; // V1 - V5: OK address public pendingOwner; } // T1 - T4: OK contract BoringOwnable is BoringOwnableData { // E1: OK event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () public { owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } // F1 - F9: OK // C1 - C21: OK function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner { if (direct) { // Checks require(newOwner != address(0) || renounce, "Ownable: zero address"); // Effects emit OwnershipTransferred(owner, newOwner); owner = newOwner; pendingOwner = address(0); } else { // Effects pendingOwner = newOwner; } } // F1 - F9: OK // C1 - C21: OK function claimOwnership() public { address _pendingOwner = pendingOwner; // Checks require(msg.sender == _pendingOwner, "Ownable: caller != pending owner"); // Effects emit OwnershipTransferred(owner, _pendingOwner); owner = _pendingOwner; pendingOwner = address(0); } // M1 - M5: OK // C1 - C21: OK modifier onlyOwner() { require(msg.sender == owner, "Ownable: caller is not the owner"); _; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; library SignedSafeMath { int256 constant private _INT256_MIN = -2**255; /** * @dev Returns the multiplication of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow"); int256 c = a * b; require(c / a == b, "SignedSafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two signed integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(int256 a, int256 b) internal pure returns (int256) { require(b != 0, "SignedSafeMath: division by zero"); require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow"); int256 c = a / b; return c; } /** * @dev Returns the subtraction of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow"); return c; } /** * @dev Returns the addition of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow"); return c; } function toUInt256(int256 a) internal pure returns (uint256) { require(a >= 0, "Integer < 0"); return uint256(a); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol"; interface IRewarder { using BoringERC20 for IERC20; function onLqdrReward(uint256 pid, address user, address recipient, uint256 lqdrAmount, uint256 newLpAmount) external; function pendingTokens(uint256 pid, address user, uint256 lqdrAmount) external view returns (IERC20[] memory, uint256[] memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; pragma experimental ABIEncoderV2; import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol"; interface IMasterChef { using BoringERC20 for IERC20; 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. SUSHI to distribute per block. uint256 lastRewardBlock; // Last block number that SUSHI distribution occurs. uint256 accSushiPerShare; // Accumulated SUSHI per share, times 1e12. See below. } function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory); function totalAllocPoint() external view returns (uint256); function deposit(uint256 _pid, uint256 _amount) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface ILiquidDepositor { function setMiniChefAddress(address _miniChef) external; function deposit(uint256 amount, address token) external; function withdraw(uint256 amount, address token) external returns (uint256); function withdrawAllToMiniChef(address token) external returns (uint256); function balanceOf(address token) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface IStrategy { function rewards() external view returns (address); function gauge() external view returns (address); function want() external view returns (address); function timelock() external view returns (address); function deposit() external; function withdrawForSwap(uint256) external returns (uint256); function withdraw(address) external returns (uint256); function withdraw(uint256) external returns (uint256); function skim() external; function withdrawAll() external returns (uint256); function balanceOf() external view returns (uint256); function balanceOfWant() external view returns (uint256); function getHarvestable() external view returns (uint256); function harvest() external; function setTimelock(address) external; function setController(address _controller) external; function execute(address _target, bytes calldata _data) external payable returns (bytes memory response); function execute(bytes calldata _data) external payable returns (bytes memory response); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.12; import "../interfaces/IERC20.sol"; library BoringERC20 { function safeSymbol(IERC20 token) internal view returns(string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41)); return success && data.length > 0 ? abi.decode(data, (string)) : "???"; } function safeName(IERC20 token) internal view returns(string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03)); return success && data.length > 0 ? abi.decode(data, (string)) : "???"; } function safeDecimals(IERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567)); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } function safeTransfer(IERC20 token, address to, uint256 amount) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed"); } function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed"); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); // EIP 2612 function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_lqdr","type":"address"},{"internalType":"address","name":"_feeAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"DepositToLiquidDepositor","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":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"}],"name":"LogPoolAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"},{"indexed":false,"internalType":"bool","name":"overwrite","type":"bool"}],"name":"LogSetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accLqdrPerShare","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"WithdrawFromLiquidDepositor","type":"event"},{"inputs":[],"name":"ACC_LQDR_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LQDR","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MASTERCHEF_LQDR_PER_BLOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"},{"internalType":"contract IStrategy","name":"_strategy","type":"address"},{"internalType":"uint256","name":"_depositFee","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"calls","type":"bytes[]"},{"internalType":"bool","name":"revertOnFail","type":"bool"}],"name":"batch","outputs":[{"internalType":"bool[]","name":"successes","type":"bool[]"},{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"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":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestFromMasterChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"dummyToken","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidDepositor","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"lqdrPerBlock","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigratorChef","name":"","type":"address"}],"stateMutability":"view","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":"pendingLqdr","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permitToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"accLqdrPerShare","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"depositFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"},{"internalType":"contract IStrategy","name":"_strategy","type":"address"},{"internalType":"uint256","name":"_depositFee","type":"uint256"},{"internalType":"bool","name":"overwrite","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMasterChef","name":"masterChef","type":"address"},{"internalType":"uint256","name":"masterPid","type":"uint256"}],"name":"setMasterChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigratorChef","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategies","outputs":[{"internalType":"contract IStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accLqdrPerShare","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"depositFee","type":"uint256"}],"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":"int256","name":"rewardDebt","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawAndHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405268056bc75e2d63100000600c5564e8d4a51000600d553480156200002757600080fd5b5060405162003546380380620035468339810160408190526200004a91620000bb565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600380546001600160a01b039384166001600160a01b031991821617909155600e805492909316911617905562000112565b60008060408385031215620000ce578182fd5b8251620000db81620000f9565b6020840151909250620000ee81620000f9565b809150509250929050565b6001600160a01b03811681146200010f57600080fd5b50565b61342480620001226000396000f3fe6080604052600436106102255760003560e01c806361621aaa116101235780638dbdbe6d116100ab578063d1abb9071161006f578063d1abb9071461060b578063d2423b511461062b578063d574ea3d1461064c578063e30c39781461066c578063edd8b1701461068157610225565b80638dbdbe6d1461057357806393f1a40b146105935780639c6b4424146105c1578063b3a4e0c1146105d6578063c346253d146105eb57610225565b80637c516e94116100f25780637c516e94146104f45780637cd07e47146105145780637d5072f1146105295780638705fcd41461053e5780638da5cb5b1461055e57610225565b806361621aaa1461047f578063672f1490146104945780636924736d146104b457806378ed5d1f146104d457610225565b806323cf3118116101b15780634b509a80116101755780634b509a80146103f35780634e71e0c8146104085780634f70b15a1461041d57806351eb05a61461043257806357a5b58c1461045f57610225565b806323cf3118146103515780632f940c701461037157806331411d431461039157806341275358146103b1578063454b0608146103d357610225565b806311ca2d51116101f857806311ca2d51146102b75780631526fe27146102cc57806317caf6f1146102fc57806318fccc761461031157806319ab453c1461033157610225565b8063020a51851461022a578063078dfbe71461024c578063081e3eda1461026c5780630ad58d2f14610297575b600080fd5b34801561023657600080fd5b5061024a610245366004612c64565b610696565b005b34801561025857600080fd5b5061024a610267366004612969565b6108b8565b34801561027857600080fd5b5061028161099e565b60405161028e91906132a9565b60405180910390f35b3480156102a357600080fd5b5061024a6102b2366004612cbe565b6109a4565b3480156102c357600080fd5b50610281610af8565b3480156102d857600080fd5b506102ec6102e7366004612c05565b610c13565b60405161028e9493929190613315565b34801561030857600080fd5b50610281610c4a565b34801561031d57600080fd5b5061024a61032c366004612c35565b610c50565b34801561033d57600080fd5b5061024a61034c36600461294d565b610dc2565b34801561035d57600080fd5b5061024a61036c36600461294d565b610f8e565b34801561037d57600080fd5b5061024a61038c366004612c35565b610fda565b34801561039d57600080fd5b506102816103ac366004612c35565b6110f6565b3480156103bd57600080fd5b506103c661136c565b60405161028e9190612da9565b3480156103df57600080fd5b5061024a6103ee366004612c05565b61137b565b3480156103ff57600080fd5b50610281611627565b34801561041457600080fd5b5061024a61162d565b34801561042957600080fd5b5061024a6116ba565b34801561043e57600080fd5b5061045261044d366004612c05565b611722565b60405161028e919061327e565b34801561046b57600080fd5b5061024a61047a3660046129fd565b611935565b34801561048b57600080fd5b50610281611965565b3480156104a057600080fd5b5061024a6104af366004612afc565b61196b565b3480156104c057600080fd5b5061024a6104cf366004612ceb565b6119bb565b3480156104e057600080fd5b506103c66104ef366004612c05565b611b60565b34801561050057600080fd5b5061024a61050f366004612a75565b611b87565b34801561052057600080fd5b506103c6611bfb565b34801561053557600080fd5b506103c6611c0a565b34801561054a57600080fd5b5061024a61055936600461294d565b611c19565b34801561056a57600080fd5b506103c6611c7a565b34801561057f57600080fd5b5061024a61058e366004612cbe565b611c89565b34801561059f57600080fd5b506105b36105ae366004612c35565b611fb1565b60405161028e9291906132f1565b3480156105cd57600080fd5b50610281611fd5565b3480156105e257600080fd5b506103c6611fdb565b3480156105f757600080fd5b506103c6610606366004612c05565b611fea565b34801561061757600080fd5b5061024a610626366004612cbe565b611ff7565b61063e6106393660046129b3565b6121e8565b60405161028e929190612e3b565b34801561065857600080fd5b506103c6610667366004612c05565b61237a565b34801561067857600080fd5b506103c6612387565b34801561068d57600080fd5b506103c6612396565b6000546001600160a01b031633146106c95760405162461bcd60e51b81526004016106c09061312d565b60405180910390fd5b600b5443906106d890876123a5565b600b5560078054600180820183557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890910180546001600160a01b03199081166001600160a01b038a8116918217909355600880548086019091557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805483168a8516908117909155600980548087019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01805490931693891693909317909155604080516080810182526000808252602082018881529282018d8152606083018a815260068054808a018255935292517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f6004939093029283015592517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4082015591517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d41830155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4290910155925490929161087991906123d3565b7f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e5896040516108a891906132a9565b60405180910390a4505050505050565b6000546001600160a01b031633146108e25760405162461bcd60e51b81526004016106c09061312d565b811561097d576001600160a01b0383161515806108fc5750805b6109185760405162461bcd60e51b81526004016106c090613006565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b031991821617909155600180549091169055610999565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60065490565b6109ac6128dc565b6109b584611722565b6000858152600a602090815260408083203384529091529020600d54825192935090916109fc91906109e89087906123fb565b816109ef57fe5b6001840154919004612435565b60018201558054610a0d90856123d3565b8155600880546000919087908110610a2157fe5b6000918252602090912001546001600160a01b031690508015610aa75781546040516330853be360e21b81526001600160a01b0383169163c214ef8c91610a74918a9133918a91600091906004016132b2565b600060405180830381600087803b158015610a8e57600080fd5b505af1158015610aa2573d6000803e3d6000fd5b505050505b610ab285878661247b565b9450836001600160a01b031686336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec2132886040516108a891906132a9565b600254604080516317caf6f160e01b815290516000926001600160a01b0316916317caf6f1916004808301926020929190829003018186803b158015610b3d57600080fd5b505afa158015610b51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b759190612c1d565b60025460048054604051631526fe2760e01b8152610c06936001600160a01b031692631526fe2792610ba9929091016132a9565b60806040518083038186803b158015610bc157600080fd5b505afa158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf99190612bb3565b60200151600c54906123fb565b81610c0d57fe5b04905090565b60068181548110610c2057fe5b60009182526020909120600490910201805460018201546002830154600390930154919350919084565b600b5481565b610c586128dc565b610c6183611722565b6000848152600a602090815260408083203384529091528120600d548351825494955091939091610c9291906123fb565b81610c9957fe5b0490506000610cbd610cb884600101548461243590919063ffffffff16565b6125ff565b6001840183905590508015610ce357600354610ce3906001600160a01b03168683612625565b600060088781548110610cf257fe5b6000918252602090912001546001600160a01b031690508015610d775783546040516330853be360e21b81526001600160a01b0383169163c214ef8c91610d44918b9133918c918991906004016132b2565b600060405180830381600087803b158015610d5e57600080fd5b505af1158015610d72573d6000803e3d6000fd5b505050505b86336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051610db191906132a9565b60405180910390a350505050505050565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610df1903390600401612da9565b60206040518083038186803b158015610e0957600080fd5b505afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190612c1d565b905080610e605760405162461bcd60e51b81526004016106c090612f14565b610e756001600160a01b038316333084612713565b60025460405163095ea7b360e01b81526001600160a01b038481169263095ea7b392610ea992909116908590600401612e22565b602060405180830381600087803b158015610ec357600080fd5b505af1158015610ed7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efb9190612a3d565b5060025460048054604051631c57762b60e31b81526001600160a01b039093169263e2bbb15892610f2f92918691016132f1565b600060405180830381600087803b158015610f4957600080fd5b505af1158015610f5d573d6000803e3d6000fd5b50506040517f98a9bd3b7a617581fc53b1e2992534e0e0cb5091c9d44aa1a7fc978f706caa83925060009150a15050565b6000546001600160a01b03163314610fb85760405162461bcd60e51b81526004016106c09061312d565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600a60209081526040808320338452909152812080548282556001820183905560088054929391928690811061101157fe5b6000918252602090912001546001600160a01b031690508015611096576040516330853be360e21b81526001600160a01b0382169063c214ef8c906110639088903390899060009081906004016132b2565b600060405180830381600087803b15801561107d57600080fd5b505af1158015611091573d6000803e3d6000fd5b505050505b6110a182868661247b565b9150836001600160a01b031685336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b856040516110e791906132a9565b60405180910390a45050505050565b60006111006128dc565b6006848154811061110d57fe5b6000918252602080832060408051608081018252600490940290910180548452600181015484840152600281015484830152600301546060840152878452600a82528084206001600160a01b0388168552909152822081516009805493955091939092909161129d918990811061118057fe5b600091825260209182902001546040805163722713f760e01b815290516001600160a01b039092169263722713f792600480840193829003018186803b1580156111c957600080fd5b505afa1580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112019190612c1d565b6007898154811061120e57fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a0823190611247903090600401612da9565b60206040518083038186803b15801561125f57600080fd5b505afa158015611273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112979190612c1d565b906123a5565b90508360200151431180156112b157508015155b1561132e5760006112cf8560200151436123d390919063ffffffff16565b90506000600b546112f687604001516112f06112e9610af8565b86906123fb565b906123fb565b816112fd57fe5b04905061132983611319600d54846123fb90919063ffffffff16565b8161132057fe5b869190046123a5565b935050505b611361610cb88460010154600d546113538688600001546123fb90919063ffffffff16565b8161135a57fe5b0490612435565b979650505050505050565b600e546001600160a01b031681565b6005546001600160a01b03166113a35760405162461bcd60e51b81526004016106c0906131ce565b6000600782815481106113b257fe5b60009182526020822001546040516370a0823160e01b81526001600160a01b03909116925082906370a08231906113ed903090600401612da9565b60206040518083038186803b15801561140557600080fd5b505afa158015611419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143d9190612c1d565b60055460405163095ea7b360e01b81529192506001600160a01b038085169263095ea7b3926114729216908590600401612e22565b602060405180830381600087803b15801561148c57600080fd5b505af11580156114a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c49190612a3d565b5060055460405163ce5494bb60e01b81526000916001600160a01b03169063ce5494bb906114f6908690600401612da9565b602060405180830381600087803b15801561151057600080fd5b505af1158015611524573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115489190612a59565b6040516370a0823160e01b81529091506001600160a01b038216906370a0823190611577903090600401612da9565b60206040518083038186803b15801561158f57600080fd5b505afa1580156115a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c79190612c1d565b82146115e55760405162461bcd60e51b81526004016106c09061306c565b80600785815481106115f357fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050505050565b600c5481565b6001546001600160a01b03163381146116585760405162461bcd60e51b81526004016106c090613162565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b60025460048054604051631c57762b60e31b81526001600160a01b039093169263e2bbb158926116ee9291600091016132f1565b600060405180830381600087803b15801561170857600080fd5b505af115801561171c573d6000803e3d6000fd5b50505050565b61172a6128dc565b6006828154811061173757fe5b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905080602001514311156119305760006118266009848154811061179857fe5b600091825260209182902001546040805163722713f760e01b815290516001600160a01b039092169263722713f792600480840193829003018186803b1580156117e157600080fd5b505afa1580156117f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118199190612c1d565b6007858154811061120e57fe5b9050801561189a5760006118478360200151436123d390919063ffffffff16565b90506000600b5461186185604001516112f06112e9610af8565b8161186857fe5b04905061189583611884600d54846123fb90919063ffffffff16565b8161188b57fe5b86519190046123a5565b845250505b43602083015260068054839190859081106118b157fe5b906000526020600020906004020160008201518160000155602082015181600101556040820151816002015560608201518160030155905050827fcb7325664a4a3b7c7223eefc492a97ca4fdf94d46884621e5a8fae5a04b2b9d28360200151838560000151604051611926939291906132ff565b60405180910390a2505b919050565b8060005b8181101561171c5761195c84848381811061195057fe5b90506020020135611722565b50600101611939565b60045481565b6000546001600160a01b031633146119955760405162461bcd60e51b81526004016106c09061312d565b600280546001600160a01b0319166001600160a01b039390931692909217909155600455565b6000546001600160a01b031633146119e55760405162461bcd60e51b81526004016106c09061312d565b611a1c85611297600689815481106119f957fe5b906000526020600020906004020160020154600b546123d390919063ffffffff16565b600b819055508460068781548110611a3057fe5b9060005260206000209060040201600201819055508160068781548110611a5357fe5b9060005260206000209060040201600301819055508015611ae7578360088781548110611a7c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508260098781548110611ab857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80611b135760088681548110611af957fe5b6000918252602090912001546001600160a01b0316611b15565b835b6001600160a01b0316867f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e18658784604051611b509291906132e1565b60405180910390a3505050505050565b60078181548110611b6d57fe5b6000918252602090912001546001600160a01b0316905081565b60405163d505accf60e01b81526001600160a01b0389169063d505accf90611bbf908a908a908a908a908a908a908a90600401612de1565b600060405180830381600087803b158015611bd957600080fd5b505af1158015611bed573d6000803e3d6000fd5b505050505050505050505050565b6005546001600160a01b031681565b600f546001600160a01b031681565b600e546001600160a01b0316331480611c3c57506000546001600160a01b031633145b611c585760405162461bcd60e51b81526004016106c090613197565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b611c916128dc565b611c9a84611722565b6000858152600a602090815260408083206001600160a01b03871684529091528120606083015192935091611cde9061271090611cd89088906123fb565b90612804565b8254909150611cf9908290611cf390886123a5565b906123d3565b8255600d548351611d249190611d109088906123fb565b81611d1757fe5b6001850154919004612836565b8260010181905550600060088781548110611d3b57fe5b6000918252602090912001546001600160a01b031690508015611dc15782546040516330853be360e21b81526001600160a01b0383169163c214ef8c91611d8e918b918a918291600091906004016132b2565b600060405180830381600087803b158015611da857600080fd5b505af1158015611dbc573d6000803e3d6000fd5b505050505b611df133308860078b81548110611dd457fe5b6000918252602090912001546001600160a01b0316929190612713565b600e5460078054611e2e926001600160a01b03169185918b908110611e1257fe5b6000918252602090912001546001600160a01b03169190612625565b600060098881548110611e3d57fe5b6000918252602090912001546001600160a01b031690508015611f5b57600060078981548110611e6957fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a0823190611ea2903090600401612da9565b60206040518083038186803b158015611eba57600080fd5b505afa158015611ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef29190612c1d565b9050611f06828260078c81548110611e1257fe5b816001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611f4157600080fd5b505af1158015611f55573d6000803e3d6000fd5b50505050505b856001600160a01b031688336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478a604051611f9f91906132a9565b60405180910390a45050505050505050565b600a6020908152600092835260408084209091529082529020805460019091015482565b600d5481565b6003546001600160a01b031681565b60088181548110611b6d57fe5b611fff6128dc565b61200884611722565b6000858152600a602090815260408083203384529091528120600d54835182549495509193909161203991906123fb565b8161204057fe5b049050600061205f610cb884600101548461243590919063ffffffff16565b600d548551919250612086916120769089906123fb565b8161207d57fe5b84919004612435565b6001840155825461209790876123d3565b83556003546120b0906001600160a01b03168683612625565b6000600888815481106120bf57fe5b6000918252602090912001546001600160a01b0316905080156121445783546040516330853be360e21b81526001600160a01b0383169163c214ef8c91612111918c9133918c918991906004016132b2565b600060405180830381600087803b15801561212b57600080fd5b505af115801561213f573d6000803e3d6000fd5b505050505b61214f87898861247b565b50856001600160a01b031688336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a60405161219491906132a9565b60405180910390a487336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954846040516121d691906132a9565b60405180910390a35050505050505050565b6060808367ffffffffffffffff8111801561220257600080fd5b5060405190808252806020026020018201604052801561222c578160200160208202803683370190505b5091508367ffffffffffffffff8111801561224657600080fd5b5060405190808252806020026020018201604052801561227a57816020015b60608152602001906001900390816122655790505b50905060005b8481101561237157600060603088888581811061229957fe5b90506020028101906122ab9190613330565b6040516122b9929190612d7d565b600060405180830381855af49150503d80600081146122f4576040519150601f19603f3d011682016040523d82523d6000602084013e6122f9565b606091505b50915091508180612308575085155b6123118261287c565b9061232f5760405162461bcd60e51b81526004016106c09190612ed5565b508185848151811061233d57fe5b6020026020010190151590811515815250508084848151811061235c57fe5b60209081029190910101525050600101612280565b50935093915050565b60098181548110611b6d57fe5b6001546001600160a01b031681565b6002546001600160a01b031681565b6000828201838110156123ca5760405162461bcd60e51b81526004016106c090612f8e565b90505b92915050565b6000828211156123f55760405162461bcd60e51b81526004016106c090613035565b50900390565b60008261240a575060006123cd565b8282028284828161241757fe5b04146123ca5760405162461bcd60e51b81526004016106c0906130ec565b600081830381831280159061244a5750838113155b8061245f575060008312801561245f57508381135b6123ca5760405162461bcd60e51b81526004016106c090613205565b6000806007848154811061248b57fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a08231906124c4903090600401612da9565b60206040518083038186803b1580156124dc57600080fd5b505afa1580156124f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125149190612c1d565b905060006009858154811061252557fe5b6000918252602090912001546001600160a01b03169050818611156125e357600061255087846123d3565b90506000826001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040161258091906132a9565b602060405180830381600087803b15801561259a57600080fd5b505af11580156125ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d29190612c1d565b90506125de84826123a5565b975050505b6125f5848760078881548110611e1257fe5b5093949350505050565b6000808212156126215760405162461bcd60e51b81526004016106c090612eef565b5090565b60006060846001600160a01b031663a9059cbb858560405160240161264b929190612e22565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516126849190612d8d565b6000604051808303816000865af19150503d80600081146126c1576040519150601f19603f3d011682016040523d82523d6000602084013e6126c6565b606091505b50915091508180156126f05750805115806126f05750808060200190518101906126f09190612a3d565b61270c5760405162461bcd60e51b81526004016106c090612f57565b5050505050565b60006060856001600160a01b03166323b872dd86868660405160240161273b93929190612dbd565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516127749190612d8d565b6000604051808303816000865af19150503d80600081146127b1576040519150601f19603f3d011682016040523d82523d6000602084013e6127b6565b606091505b50915091508180156127e05750805115806127e05750808060200190518101906127e09190612a3d565b6127fc5760405162461bcd60e51b81526004016106c090613249565b505050505050565b60008082116128255760405162461bcd60e51b81526004016106c0906130b5565b81838161282e57fe5b049392505050565b600082820181831280159061284b5750838112155b80612860575060008312801561286057508381125b6123ca5760405162461bcd60e51b81526004016106c090612fc5565b60606044825110156128c2575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c790000006020820152611930565b600482019150818060200190518101906123cd9190612b27565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b60008083601f840112612915578182fd5b50813567ffffffffffffffff81111561292c578182fd5b602083019150836020808302850101111561294657600080fd5b9250929050565b60006020828403121561295e578081fd5b81356123ca816133c8565b60008060006060848603121561297d578182fd5b8335612988816133c8565b92506020840135612998816133e0565b915060408401356129a8816133e0565b809150509250925092565b6000806000604084860312156129c7578283fd5b833567ffffffffffffffff8111156129dd578384fd5b6129e986828701612904565b90945092505060208401356129a8816133e0565b60008060208385031215612a0f578182fd5b823567ffffffffffffffff811115612a25578283fd5b612a3185828601612904565b90969095509350505050565b600060208284031215612a4e578081fd5b81516123ca816133e0565b600060208284031215612a6a578081fd5b81516123ca816133c8565b600080600080600080600080610100898b031215612a91578384fd5b8835612a9c816133c8565b97506020890135612aac816133c8565b96506040890135612abc816133c8565b9550606089013594506080890135935060a089013560ff81168114612adf578384fd5b979a969950949793969295929450505060c08201359160e0013590565b60008060408385031215612b0e578081fd5b8235612b19816133c8565b946020939093013593505050565b600060208284031215612b38578081fd5b815167ffffffffffffffff80821115612b4f578283fd5b818401915084601f830112612b62578283fd5b815181811115612b70578384fd5b612b83601f8201601f1916602001613375565b9150808252856020828501011115612b99578384fd5b612baa81602084016020860161339c565b50949350505050565b600060808284031215612bc4578081fd5b612bce6080613375565b8251612bd9816133c8565b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b600060208284031215612c16578081fd5b5035919050565b600060208284031215612c2e578081fd5b5051919050565b60008060408385031215612c47578182fd5b823591506020830135612c59816133c8565b809150509250929050565b600080600080600060a08688031215612c7b578283fd5b853594506020860135612c8d816133c8565b93506040860135612c9d816133c8565b92506060860135612cad816133c8565b949793965091946080013592915050565b600080600060608486031215612cd2578081fd5b833592506020840135915060408401356129a8816133c8565b60008060008060008060c08789031215612d03578384fd5b86359550602087013594506040870135612d1c816133c8565b93506060870135612d2c816133c8565b92506080870135915060a0870135612d43816133e0565b809150509295509295509295565b60008151808452612d6981602086016020860161339c565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251612d9f81846020870161339c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015612e76578151151584529284019290840190600101612e58565b50505083810382850152808551612e8d81846132a9565b91508192508381028201848801865b83811015612ec6578583038552612eb4838351612d51565b94870194925090860190600101612e9c565b50909998505050505050505050565b600060208252612ee86020830184612d51565b9392505050565b6020808252600b908201526a0496e7465676572203c20360ac1b604082015260600190565b60208082526023908201527f4d61737465724368656656323a2042616c616e6365206d75737420657863656560408201526206420360ec1b606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526029908201527f4d61737465724368656656323a206d696772617465642062616c616e6365206d6040820152680eae6e840dac2e8c6d60bb1b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b60208082526018908201527f736574466565416464726573733a20464f5242494444454e0000000000000000604082015260600190565b6020808252601d908201527f4d61737465724368656656323a206e6f206d69677261746f7220736574000000604082015260600190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f766572604082015263666c6f7760e01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b8151815260208083015190820152604080830151908201526060918201519181019190915260800190565b90815260200190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b9182521515602082015260400190565b918252602082015260400190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b6000808335601e19843603018112613346578283fd5b83018035915067ffffffffffffffff821115613360578283fd5b60200191503681900382131561294657600080fd5b60405181810167ffffffffffffffff8111828210171561339457600080fd5b604052919050565b60005b838110156133b757818101518382015260200161339f565b8381111561171c5750506000910152565b6001600160a01b03811681146133dd57600080fd5b50565b80151581146133dd57600080fdfea26469706673582212201c9c79a1596a12c7fbfa3ba3091c9ba818a13fd79a850cf4344a72811d2d81db64736f6c634300060c0033000000000000000000000000d8c61ede8cd9ee7b93855c3f110191e95edf2979000000000000000000000000d04120431a7dda79dc55767ca8e09552bf4df01a
Deployed Bytecode
0x6080604052600436106102255760003560e01c806361621aaa116101235780638dbdbe6d116100ab578063d1abb9071161006f578063d1abb9071461060b578063d2423b511461062b578063d574ea3d1461064c578063e30c39781461066c578063edd8b1701461068157610225565b80638dbdbe6d1461057357806393f1a40b146105935780639c6b4424146105c1578063b3a4e0c1146105d6578063c346253d146105eb57610225565b80637c516e94116100f25780637c516e94146104f45780637cd07e47146105145780637d5072f1146105295780638705fcd41461053e5780638da5cb5b1461055e57610225565b806361621aaa1461047f578063672f1490146104945780636924736d146104b457806378ed5d1f146104d457610225565b806323cf3118116101b15780634b509a80116101755780634b509a80146103f35780634e71e0c8146104085780634f70b15a1461041d57806351eb05a61461043257806357a5b58c1461045f57610225565b806323cf3118146103515780632f940c701461037157806331411d431461039157806341275358146103b1578063454b0608146103d357610225565b806311ca2d51116101f857806311ca2d51146102b75780631526fe27146102cc57806317caf6f1146102fc57806318fccc761461031157806319ab453c1461033157610225565b8063020a51851461022a578063078dfbe71461024c578063081e3eda1461026c5780630ad58d2f14610297575b600080fd5b34801561023657600080fd5b5061024a610245366004612c64565b610696565b005b34801561025857600080fd5b5061024a610267366004612969565b6108b8565b34801561027857600080fd5b5061028161099e565b60405161028e91906132a9565b60405180910390f35b3480156102a357600080fd5b5061024a6102b2366004612cbe565b6109a4565b3480156102c357600080fd5b50610281610af8565b3480156102d857600080fd5b506102ec6102e7366004612c05565b610c13565b60405161028e9493929190613315565b34801561030857600080fd5b50610281610c4a565b34801561031d57600080fd5b5061024a61032c366004612c35565b610c50565b34801561033d57600080fd5b5061024a61034c36600461294d565b610dc2565b34801561035d57600080fd5b5061024a61036c36600461294d565b610f8e565b34801561037d57600080fd5b5061024a61038c366004612c35565b610fda565b34801561039d57600080fd5b506102816103ac366004612c35565b6110f6565b3480156103bd57600080fd5b506103c661136c565b60405161028e9190612da9565b3480156103df57600080fd5b5061024a6103ee366004612c05565b61137b565b3480156103ff57600080fd5b50610281611627565b34801561041457600080fd5b5061024a61162d565b34801561042957600080fd5b5061024a6116ba565b34801561043e57600080fd5b5061045261044d366004612c05565b611722565b60405161028e919061327e565b34801561046b57600080fd5b5061024a61047a3660046129fd565b611935565b34801561048b57600080fd5b50610281611965565b3480156104a057600080fd5b5061024a6104af366004612afc565b61196b565b3480156104c057600080fd5b5061024a6104cf366004612ceb565b6119bb565b3480156104e057600080fd5b506103c66104ef366004612c05565b611b60565b34801561050057600080fd5b5061024a61050f366004612a75565b611b87565b34801561052057600080fd5b506103c6611bfb565b34801561053557600080fd5b506103c6611c0a565b34801561054a57600080fd5b5061024a61055936600461294d565b611c19565b34801561056a57600080fd5b506103c6611c7a565b34801561057f57600080fd5b5061024a61058e366004612cbe565b611c89565b34801561059f57600080fd5b506105b36105ae366004612c35565b611fb1565b60405161028e9291906132f1565b3480156105cd57600080fd5b50610281611fd5565b3480156105e257600080fd5b506103c6611fdb565b3480156105f757600080fd5b506103c6610606366004612c05565b611fea565b34801561061757600080fd5b5061024a610626366004612cbe565b611ff7565b61063e6106393660046129b3565b6121e8565b60405161028e929190612e3b565b34801561065857600080fd5b506103c6610667366004612c05565b61237a565b34801561067857600080fd5b506103c6612387565b34801561068d57600080fd5b506103c6612396565b6000546001600160a01b031633146106c95760405162461bcd60e51b81526004016106c09061312d565b60405180910390fd5b600b5443906106d890876123a5565b600b5560078054600180820183557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890910180546001600160a01b03199081166001600160a01b038a8116918217909355600880548086019091557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805483168a8516908117909155600980548087019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01805490931693891693909317909155604080516080810182526000808252602082018881529282018d8152606083018a815260068054808a018255935292517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f6004939093029283015592517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4082015591517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d41830155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4290910155925490929161087991906123d3565b7f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e5896040516108a891906132a9565b60405180910390a4505050505050565b6000546001600160a01b031633146108e25760405162461bcd60e51b81526004016106c09061312d565b811561097d576001600160a01b0383161515806108fc5750805b6109185760405162461bcd60e51b81526004016106c090613006565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b031991821617909155600180549091169055610999565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60065490565b6109ac6128dc565b6109b584611722565b6000858152600a602090815260408083203384529091529020600d54825192935090916109fc91906109e89087906123fb565b816109ef57fe5b6001840154919004612435565b60018201558054610a0d90856123d3565b8155600880546000919087908110610a2157fe5b6000918252602090912001546001600160a01b031690508015610aa75781546040516330853be360e21b81526001600160a01b0383169163c214ef8c91610a74918a9133918a91600091906004016132b2565b600060405180830381600087803b158015610a8e57600080fd5b505af1158015610aa2573d6000803e3d6000fd5b505050505b610ab285878661247b565b9450836001600160a01b031686336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec2132886040516108a891906132a9565b600254604080516317caf6f160e01b815290516000926001600160a01b0316916317caf6f1916004808301926020929190829003018186803b158015610b3d57600080fd5b505afa158015610b51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b759190612c1d565b60025460048054604051631526fe2760e01b8152610c06936001600160a01b031692631526fe2792610ba9929091016132a9565b60806040518083038186803b158015610bc157600080fd5b505afa158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf99190612bb3565b60200151600c54906123fb565b81610c0d57fe5b04905090565b60068181548110610c2057fe5b60009182526020909120600490910201805460018201546002830154600390930154919350919084565b600b5481565b610c586128dc565b610c6183611722565b6000848152600a602090815260408083203384529091528120600d548351825494955091939091610c9291906123fb565b81610c9957fe5b0490506000610cbd610cb884600101548461243590919063ffffffff16565b6125ff565b6001840183905590508015610ce357600354610ce3906001600160a01b03168683612625565b600060088781548110610cf257fe5b6000918252602090912001546001600160a01b031690508015610d775783546040516330853be360e21b81526001600160a01b0383169163c214ef8c91610d44918b9133918c918991906004016132b2565b600060405180830381600087803b158015610d5e57600080fd5b505af1158015610d72573d6000803e3d6000fd5b505050505b86336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051610db191906132a9565b60405180910390a350505050505050565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610df1903390600401612da9565b60206040518083038186803b158015610e0957600080fd5b505afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190612c1d565b905080610e605760405162461bcd60e51b81526004016106c090612f14565b610e756001600160a01b038316333084612713565b60025460405163095ea7b360e01b81526001600160a01b038481169263095ea7b392610ea992909116908590600401612e22565b602060405180830381600087803b158015610ec357600080fd5b505af1158015610ed7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efb9190612a3d565b5060025460048054604051631c57762b60e31b81526001600160a01b039093169263e2bbb15892610f2f92918691016132f1565b600060405180830381600087803b158015610f4957600080fd5b505af1158015610f5d573d6000803e3d6000fd5b50506040517f98a9bd3b7a617581fc53b1e2992534e0e0cb5091c9d44aa1a7fc978f706caa83925060009150a15050565b6000546001600160a01b03163314610fb85760405162461bcd60e51b81526004016106c09061312d565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600a60209081526040808320338452909152812080548282556001820183905560088054929391928690811061101157fe5b6000918252602090912001546001600160a01b031690508015611096576040516330853be360e21b81526001600160a01b0382169063c214ef8c906110639088903390899060009081906004016132b2565b600060405180830381600087803b15801561107d57600080fd5b505af1158015611091573d6000803e3d6000fd5b505050505b6110a182868661247b565b9150836001600160a01b031685336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b856040516110e791906132a9565b60405180910390a45050505050565b60006111006128dc565b6006848154811061110d57fe5b6000918252602080832060408051608081018252600490940290910180548452600181015484840152600281015484830152600301546060840152878452600a82528084206001600160a01b0388168552909152822081516009805493955091939092909161129d918990811061118057fe5b600091825260209182902001546040805163722713f760e01b815290516001600160a01b039092169263722713f792600480840193829003018186803b1580156111c957600080fd5b505afa1580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112019190612c1d565b6007898154811061120e57fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a0823190611247903090600401612da9565b60206040518083038186803b15801561125f57600080fd5b505afa158015611273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112979190612c1d565b906123a5565b90508360200151431180156112b157508015155b1561132e5760006112cf8560200151436123d390919063ffffffff16565b90506000600b546112f687604001516112f06112e9610af8565b86906123fb565b906123fb565b816112fd57fe5b04905061132983611319600d54846123fb90919063ffffffff16565b8161132057fe5b869190046123a5565b935050505b611361610cb88460010154600d546113538688600001546123fb90919063ffffffff16565b8161135a57fe5b0490612435565b979650505050505050565b600e546001600160a01b031681565b6005546001600160a01b03166113a35760405162461bcd60e51b81526004016106c0906131ce565b6000600782815481106113b257fe5b60009182526020822001546040516370a0823160e01b81526001600160a01b03909116925082906370a08231906113ed903090600401612da9565b60206040518083038186803b15801561140557600080fd5b505afa158015611419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143d9190612c1d565b60055460405163095ea7b360e01b81529192506001600160a01b038085169263095ea7b3926114729216908590600401612e22565b602060405180830381600087803b15801561148c57600080fd5b505af11580156114a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c49190612a3d565b5060055460405163ce5494bb60e01b81526000916001600160a01b03169063ce5494bb906114f6908690600401612da9565b602060405180830381600087803b15801561151057600080fd5b505af1158015611524573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115489190612a59565b6040516370a0823160e01b81529091506001600160a01b038216906370a0823190611577903090600401612da9565b60206040518083038186803b15801561158f57600080fd5b505afa1580156115a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c79190612c1d565b82146115e55760405162461bcd60e51b81526004016106c09061306c565b80600785815481106115f357fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050505050565b600c5481565b6001546001600160a01b03163381146116585760405162461bcd60e51b81526004016106c090613162565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b60025460048054604051631c57762b60e31b81526001600160a01b039093169263e2bbb158926116ee9291600091016132f1565b600060405180830381600087803b15801561170857600080fd5b505af115801561171c573d6000803e3d6000fd5b50505050565b61172a6128dc565b6006828154811061173757fe5b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905080602001514311156119305760006118266009848154811061179857fe5b600091825260209182902001546040805163722713f760e01b815290516001600160a01b039092169263722713f792600480840193829003018186803b1580156117e157600080fd5b505afa1580156117f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118199190612c1d565b6007858154811061120e57fe5b9050801561189a5760006118478360200151436123d390919063ffffffff16565b90506000600b5461186185604001516112f06112e9610af8565b8161186857fe5b04905061189583611884600d54846123fb90919063ffffffff16565b8161188b57fe5b86519190046123a5565b845250505b43602083015260068054839190859081106118b157fe5b906000526020600020906004020160008201518160000155602082015181600101556040820151816002015560608201518160030155905050827fcb7325664a4a3b7c7223eefc492a97ca4fdf94d46884621e5a8fae5a04b2b9d28360200151838560000151604051611926939291906132ff565b60405180910390a2505b919050565b8060005b8181101561171c5761195c84848381811061195057fe5b90506020020135611722565b50600101611939565b60045481565b6000546001600160a01b031633146119955760405162461bcd60e51b81526004016106c09061312d565b600280546001600160a01b0319166001600160a01b039390931692909217909155600455565b6000546001600160a01b031633146119e55760405162461bcd60e51b81526004016106c09061312d565b611a1c85611297600689815481106119f957fe5b906000526020600020906004020160020154600b546123d390919063ffffffff16565b600b819055508460068781548110611a3057fe5b9060005260206000209060040201600201819055508160068781548110611a5357fe5b9060005260206000209060040201600301819055508015611ae7578360088781548110611a7c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508260098781548110611ab857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80611b135760088681548110611af957fe5b6000918252602090912001546001600160a01b0316611b15565b835b6001600160a01b0316867f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e18658784604051611b509291906132e1565b60405180910390a3505050505050565b60078181548110611b6d57fe5b6000918252602090912001546001600160a01b0316905081565b60405163d505accf60e01b81526001600160a01b0389169063d505accf90611bbf908a908a908a908a908a908a908a90600401612de1565b600060405180830381600087803b158015611bd957600080fd5b505af1158015611bed573d6000803e3d6000fd5b505050505050505050505050565b6005546001600160a01b031681565b600f546001600160a01b031681565b600e546001600160a01b0316331480611c3c57506000546001600160a01b031633145b611c585760405162461bcd60e51b81526004016106c090613197565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b611c916128dc565b611c9a84611722565b6000858152600a602090815260408083206001600160a01b03871684529091528120606083015192935091611cde9061271090611cd89088906123fb565b90612804565b8254909150611cf9908290611cf390886123a5565b906123d3565b8255600d548351611d249190611d109088906123fb565b81611d1757fe5b6001850154919004612836565b8260010181905550600060088781548110611d3b57fe5b6000918252602090912001546001600160a01b031690508015611dc15782546040516330853be360e21b81526001600160a01b0383169163c214ef8c91611d8e918b918a918291600091906004016132b2565b600060405180830381600087803b158015611da857600080fd5b505af1158015611dbc573d6000803e3d6000fd5b505050505b611df133308860078b81548110611dd457fe5b6000918252602090912001546001600160a01b0316929190612713565b600e5460078054611e2e926001600160a01b03169185918b908110611e1257fe5b6000918252602090912001546001600160a01b03169190612625565b600060098881548110611e3d57fe5b6000918252602090912001546001600160a01b031690508015611f5b57600060078981548110611e6957fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a0823190611ea2903090600401612da9565b60206040518083038186803b158015611eba57600080fd5b505afa158015611ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef29190612c1d565b9050611f06828260078c81548110611e1257fe5b816001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611f4157600080fd5b505af1158015611f55573d6000803e3d6000fd5b50505050505b856001600160a01b031688336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478a604051611f9f91906132a9565b60405180910390a45050505050505050565b600a6020908152600092835260408084209091529082529020805460019091015482565b600d5481565b6003546001600160a01b031681565b60088181548110611b6d57fe5b611fff6128dc565b61200884611722565b6000858152600a602090815260408083203384529091528120600d54835182549495509193909161203991906123fb565b8161204057fe5b049050600061205f610cb884600101548461243590919063ffffffff16565b600d548551919250612086916120769089906123fb565b8161207d57fe5b84919004612435565b6001840155825461209790876123d3565b83556003546120b0906001600160a01b03168683612625565b6000600888815481106120bf57fe5b6000918252602090912001546001600160a01b0316905080156121445783546040516330853be360e21b81526001600160a01b0383169163c214ef8c91612111918c9133918c918991906004016132b2565b600060405180830381600087803b15801561212b57600080fd5b505af115801561213f573d6000803e3d6000fd5b505050505b61214f87898861247b565b50856001600160a01b031688336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a60405161219491906132a9565b60405180910390a487336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954846040516121d691906132a9565b60405180910390a35050505050505050565b6060808367ffffffffffffffff8111801561220257600080fd5b5060405190808252806020026020018201604052801561222c578160200160208202803683370190505b5091508367ffffffffffffffff8111801561224657600080fd5b5060405190808252806020026020018201604052801561227a57816020015b60608152602001906001900390816122655790505b50905060005b8481101561237157600060603088888581811061229957fe5b90506020028101906122ab9190613330565b6040516122b9929190612d7d565b600060405180830381855af49150503d80600081146122f4576040519150601f19603f3d011682016040523d82523d6000602084013e6122f9565b606091505b50915091508180612308575085155b6123118261287c565b9061232f5760405162461bcd60e51b81526004016106c09190612ed5565b508185848151811061233d57fe5b6020026020010190151590811515815250508084848151811061235c57fe5b60209081029190910101525050600101612280565b50935093915050565b60098181548110611b6d57fe5b6001546001600160a01b031681565b6002546001600160a01b031681565b6000828201838110156123ca5760405162461bcd60e51b81526004016106c090612f8e565b90505b92915050565b6000828211156123f55760405162461bcd60e51b81526004016106c090613035565b50900390565b60008261240a575060006123cd565b8282028284828161241757fe5b04146123ca5760405162461bcd60e51b81526004016106c0906130ec565b600081830381831280159061244a5750838113155b8061245f575060008312801561245f57508381135b6123ca5760405162461bcd60e51b81526004016106c090613205565b6000806007848154811061248b57fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a08231906124c4903090600401612da9565b60206040518083038186803b1580156124dc57600080fd5b505afa1580156124f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125149190612c1d565b905060006009858154811061252557fe5b6000918252602090912001546001600160a01b03169050818611156125e357600061255087846123d3565b90506000826001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040161258091906132a9565b602060405180830381600087803b15801561259a57600080fd5b505af11580156125ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d29190612c1d565b90506125de84826123a5565b975050505b6125f5848760078881548110611e1257fe5b5093949350505050565b6000808212156126215760405162461bcd60e51b81526004016106c090612eef565b5090565b60006060846001600160a01b031663a9059cbb858560405160240161264b929190612e22565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516126849190612d8d565b6000604051808303816000865af19150503d80600081146126c1576040519150601f19603f3d011682016040523d82523d6000602084013e6126c6565b606091505b50915091508180156126f05750805115806126f05750808060200190518101906126f09190612a3d565b61270c5760405162461bcd60e51b81526004016106c090612f57565b5050505050565b60006060856001600160a01b03166323b872dd86868660405160240161273b93929190612dbd565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516127749190612d8d565b6000604051808303816000865af19150503d80600081146127b1576040519150601f19603f3d011682016040523d82523d6000602084013e6127b6565b606091505b50915091508180156127e05750805115806127e05750808060200190518101906127e09190612a3d565b6127fc5760405162461bcd60e51b81526004016106c090613249565b505050505050565b60008082116128255760405162461bcd60e51b81526004016106c0906130b5565b81838161282e57fe5b049392505050565b600082820181831280159061284b5750838112155b80612860575060008312801561286057508381125b6123ca5760405162461bcd60e51b81526004016106c090612fc5565b60606044825110156128c2575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c790000006020820152611930565b600482019150818060200190518101906123cd9190612b27565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b60008083601f840112612915578182fd5b50813567ffffffffffffffff81111561292c578182fd5b602083019150836020808302850101111561294657600080fd5b9250929050565b60006020828403121561295e578081fd5b81356123ca816133c8565b60008060006060848603121561297d578182fd5b8335612988816133c8565b92506020840135612998816133e0565b915060408401356129a8816133e0565b809150509250925092565b6000806000604084860312156129c7578283fd5b833567ffffffffffffffff8111156129dd578384fd5b6129e986828701612904565b90945092505060208401356129a8816133e0565b60008060208385031215612a0f578182fd5b823567ffffffffffffffff811115612a25578283fd5b612a3185828601612904565b90969095509350505050565b600060208284031215612a4e578081fd5b81516123ca816133e0565b600060208284031215612a6a578081fd5b81516123ca816133c8565b600080600080600080600080610100898b031215612a91578384fd5b8835612a9c816133c8565b97506020890135612aac816133c8565b96506040890135612abc816133c8565b9550606089013594506080890135935060a089013560ff81168114612adf578384fd5b979a969950949793969295929450505060c08201359160e0013590565b60008060408385031215612b0e578081fd5b8235612b19816133c8565b946020939093013593505050565b600060208284031215612b38578081fd5b815167ffffffffffffffff80821115612b4f578283fd5b818401915084601f830112612b62578283fd5b815181811115612b70578384fd5b612b83601f8201601f1916602001613375565b9150808252856020828501011115612b99578384fd5b612baa81602084016020860161339c565b50949350505050565b600060808284031215612bc4578081fd5b612bce6080613375565b8251612bd9816133c8565b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b600060208284031215612c16578081fd5b5035919050565b600060208284031215612c2e578081fd5b5051919050565b60008060408385031215612c47578182fd5b823591506020830135612c59816133c8565b809150509250929050565b600080600080600060a08688031215612c7b578283fd5b853594506020860135612c8d816133c8565b93506040860135612c9d816133c8565b92506060860135612cad816133c8565b949793965091946080013592915050565b600080600060608486031215612cd2578081fd5b833592506020840135915060408401356129a8816133c8565b60008060008060008060c08789031215612d03578384fd5b86359550602087013594506040870135612d1c816133c8565b93506060870135612d2c816133c8565b92506080870135915060a0870135612d43816133e0565b809150509295509295509295565b60008151808452612d6981602086016020860161339c565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251612d9f81846020870161339c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015612e76578151151584529284019290840190600101612e58565b50505083810382850152808551612e8d81846132a9565b91508192508381028201848801865b83811015612ec6578583038552612eb4838351612d51565b94870194925090860190600101612e9c565b50909998505050505050505050565b600060208252612ee86020830184612d51565b9392505050565b6020808252600b908201526a0496e7465676572203c20360ac1b604082015260600190565b60208082526023908201527f4d61737465724368656656323a2042616c616e6365206d75737420657863656560408201526206420360ec1b606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526029908201527f4d61737465724368656656323a206d696772617465642062616c616e6365206d6040820152680eae6e840dac2e8c6d60bb1b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b60208082526018908201527f736574466565416464726573733a20464f5242494444454e0000000000000000604082015260600190565b6020808252601d908201527f4d61737465724368656656323a206e6f206d69677261746f7220736574000000604082015260600190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f766572604082015263666c6f7760e01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b8151815260208083015190820152604080830151908201526060918201519181019190915260800190565b90815260200190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b9182521515602082015260400190565b918252602082015260400190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b6000808335601e19843603018112613346578283fd5b83018035915067ffffffffffffffff821115613360578283fd5b60200191503681900382131561294657600080fd5b60405181810167ffffffffffffffff8111828210171561339457600080fd5b604052919050565b60005b838110156133b757818101518382015260200161339f565b8381111561171c5750506000910152565b6001600160a01b03811681146133dd57600080fd5b50565b80151581146133dd57600080fdfea26469706673582212201c9c79a1596a12c7fbfa3ba3091c9ba818a13fd79a850cf4344a72811d2d81db64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d8c61ede8cd9ee7b93855c3f110191e95edf2979000000000000000000000000d04120431a7dda79dc55767ca8e09552bf4df01a
-----Decoded View---------------
Arg [0] : _lqdr (address): 0xD8C61EDe8CD9EE7B93855c3f110191e95eDF2979
Arg [1] : _feeAddress (address): 0xd04120431a7DdA79DC55767Ca8e09552Bf4dF01A
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d8c61ede8cd9ee7b93855c3f110191e95edf2979
Arg [1] : 000000000000000000000000d04120431a7dda79dc55767ca8e09552bf4df01a
Loading...
Loading
Loading...
Loading
[ 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.