Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 384 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exit | 13484097 | 1038 days ago | IN | 0 ETH | 0.0046355 | ||||
Exit | 13469206 | 1040 days ago | IN | 0 ETH | 0.01163914 | ||||
Withdraw | 13461368 | 1041 days ago | IN | 0 ETH | 0.00843286 | ||||
Get Reward | 13362030 | 1057 days ago | IN | 0 ETH | 0.00772173 | ||||
Withdraw | 13362030 | 1057 days ago | IN | 0 ETH | 0.00826237 | ||||
Get Reward | 13248606 | 1074 days ago | IN | 0 ETH | 0.00429336 | ||||
Withdraw | 13248298 | 1074 days ago | IN | 0 ETH | 0.00696576 | ||||
Get Reward | 13226742 | 1078 days ago | IN | 0 ETH | 0.00233011 | ||||
Exit | 13223841 | 1078 days ago | IN | 0 ETH | 0.00310134 | ||||
Withdraw | 13204482 | 1081 days ago | IN | 0 ETH | 0.00513432 | ||||
Get Reward | 13204471 | 1081 days ago | IN | 0 ETH | 0.00460553 | ||||
Get Reward | 13193958 | 1083 days ago | IN | 0 ETH | 0.00716174 | ||||
Withdraw | 13193945 | 1083 days ago | IN | 0 ETH | 0.00925601 | ||||
Withdraw | 13076599 | 1101 days ago | IN | 0 ETH | 0.00303778 | ||||
Exit | 13042793 | 1106 days ago | IN | 0 ETH | 0.00230072 | ||||
Get Reward | 12984125 | 1115 days ago | IN | 0 ETH | 0.00195375 | ||||
Withdraw | 12984119 | 1115 days ago | IN | 0 ETH | 0.00300769 | ||||
Withdraw | 12860443 | 1135 days ago | IN | 0 ETH | 0.00121229 | ||||
Withdraw | 12860443 | 1135 days ago | IN | 0 ETH | 0.00192896 | ||||
Get Reward | 12860431 | 1135 days ago | IN | 0 ETH | 0.00256515 | ||||
Withdraw | 12793328 | 1145 days ago | IN | 0 ETH | 0.00341017 | ||||
Withdraw | 12710325 | 1158 days ago | IN | 0 ETH | 0.00138382 | ||||
Get Reward | 12710318 | 1158 days ago | IN | 0 ETH | 0.00151689 | ||||
Withdraw | 12710116 | 1158 days ago | IN | 0 ETH | 0.00092268 | ||||
Get Reward | 12710107 | 1158 days ago | IN | 0 ETH | 0.00104286 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AlunaBoostPool
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-23 */ // File: @openzeppelin/contracts/GSN/Context.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/interfaces/IERC20Burnable.sol /* * MIT License * =========== * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */ pragma solidity ^0.6.2; interface IERC20Burnable { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function burn(uint256 amount) external; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/interfaces/ITreasury.sol pragma solidity ^0.6.2; interface ITreasury { function defaultToken() external view returns (IERC20); function deposit(IERC20 token, uint256 amount) external; function withdraw(uint256 amount, address withdrawAddress) external; } // File: contracts/interfaces/ISwapRouter.sol pragma solidity ^0.6.2; interface SwapRouter { function WETH() external pure returns (address); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.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, 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) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * 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); uint256 c = a - b; return c; } /** * @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) { // 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; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned 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(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/LPTokenWrapper.sol /* * MIT License * =========== * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */ pragma solidity 0.6.2; contract LPTokenWrapper { using SafeMath for uint256; using SafeERC20 for IERC20; uint256 private _totalSupply; IERC20 public stakeToken; mapping(address => uint256) private _balances; constructor(IERC20 _stakeToken) public { stakeToken = _stakeToken; } function totalSupply() public view returns (uint256) { return _totalSupply; } function balanceOf(address account) public view returns (uint256) { return _balances[account]; } function stake(uint256 amount) public virtual { _totalSupply = _totalSupply.add(amount); _balances[msg.sender] = _balances[msg.sender].add(amount); // safeTransferFrom shifted to last line of overridden method } function withdraw(uint256 amount) public virtual { _totalSupply = _totalSupply.sub(amount); _balances[msg.sender] = _balances[msg.sender].sub(amount); // safeTransfer shifted to last line of overridden method } } // File: contracts/AdditionalMath.sol pragma solidity 0.6.2; /* # Copyright (C) 2017 alianse777 # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # https://github.com/alianse777/solidity-standard-library.git */ library AdditionalMath { using SafeMath for uint256; /** * @dev Compute square root of x * @param x num to sqrt * @return sqrt(x) */ function sqrt(uint x) internal pure returns (uint){ uint n = x / 2; uint lstX = 0; while (n != lstX){ lstX = n; n = (n + x/n) / 2; } return uint(n); } } // File: @openzeppelin/contracts/math/Math.sol pragma solidity ^0.6.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: contracts/AlunaBoostPool.sol /* * MIT License * =========== * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */ pragma solidity 0.6.2; contract AlunaBoostPool is LPTokenWrapper, Ownable { using AdditionalMath for uint256; IERC20 public rewardToken; IERC20 public boostToken; ITreasury public treasury; SwapRouter public swapRouter; IERC20 public stablecoin; uint256 public tokenCapAmount; uint256 public starttime; uint256 public duration; uint256 public periodFinish; uint256 public rewardRate; uint256 public lastUpdateTime; uint256 public rewardPerTokenStored; uint256 public constant SECONDS_IN_A_DAY = 86400; mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public rewards; // booster variables // variables to keep track of totalSupply and balances (after accounting for multiplier) uint256 public boostedTotalSupply; uint256 public lastBoostPurchase; // timestamp of lastBoostPurchase mapping(address => uint256) public boostedBalances; mapping(address => uint256) public numBoostersBought; // each booster = 5% increase in stake amt mapping(address => uint256) public nextBoostPurchaseTime; // timestamp for which user is eligible to purchase another booster uint256 public globalBoosterPrice = 1e18; uint256 public boostThreshold = 10; uint256 public boostScaleFactor = 20; uint256 public scaleFactor = 320; event RewardAdded(uint256 reward); event RewardPaid(address indexed user, uint256 reward); modifier checkStart() { require(block.timestamp >= starttime,"not start"); _; } modifier updateReward(address account) { rewardPerTokenStored = rewardPerToken(); lastUpdateTime = lastTimeRewardApplicable(); if (account != address(0)) { rewards[account] = earned(account); userRewardPerTokenPaid[account] = rewardPerTokenStored; } _; } constructor( uint256 _tokenCapAmount, IERC20 _stakeToken, IERC20 _rewardToken, IERC20 _boostToken, address _treasury, SwapRouter _swapRouter, uint256 _starttime, uint256 _duration ) public LPTokenWrapper(_stakeToken) { tokenCapAmount = _tokenCapAmount; boostToken = _boostToken; rewardToken = _rewardToken; treasury = ITreasury(_treasury); stablecoin = treasury.defaultToken(); swapRouter = _swapRouter; starttime = _starttime; lastBoostPurchase = _starttime; duration = _duration; boostToken.safeApprove(address(_swapRouter), uint256(-1)); stablecoin.safeApprove(address(treasury), uint256(-1)); } function lastTimeRewardApplicable() public view returns (uint256) { return Math.min(block.timestamp, periodFinish); } function rewardPerToken() public view returns (uint256) { if (boostedTotalSupply == 0) { return rewardPerTokenStored; } return rewardPerTokenStored.add( lastTimeRewardApplicable() .sub(lastUpdateTime) .mul(rewardRate) .mul(1e18) .div(boostedTotalSupply) ); } function earned(address account) public view returns (uint256) { return boostedBalances[account] .mul(rewardPerToken().sub(userRewardPerTokenPaid[account])) .div(1e18) .add(rewards[account]); } function getBoosterPrice(address user) public view returns (uint256 boosterPrice, uint256 newBoostBalance) { if (boostedTotalSupply == 0) return (0,0); // each previously user-purchased booster will increase price in 5%, // that is, 1 booster means 5% increase, 2 boosters mean 10% and so on uint256 boostersBought = numBoostersBought[user]; boosterPrice = globalBoosterPrice.mul(boostersBought.mul(5).add(100)).div(100); // increment boostersBought by 1 boostersBought = boostersBought.add(1); // if no. of boosters exceed threshold, increase booster price by boostScaleFactor // for each exceeded booster if (boostersBought >= boostThreshold) { boosterPrice = boosterPrice .mul((boostersBought.sub(boostThreshold)).mul(boostScaleFactor).add(100)) .div(100); } // 2.5% decrease for every 2 hour interval since last global boost purchase boosterPrice = calculateBoostDevaluation(boosterPrice, 975, 1000, (block.timestamp.sub(lastBoostPurchase)).div(2 hours)); // adjust price based on expected increase in boost supply // each booster will increase balance in an order of 5% // boostersBought has been incremented by 1 already newBoostBalance = balanceOf(user) .mul(boostersBought.mul(5).add(100)) .div(100); uint256 boostBalanceIncrease = newBoostBalance.sub(boostedBalances[user]); boosterPrice = boosterPrice .mul(boostBalanceIncrease) .mul(scaleFactor) .div(boostedTotalSupply); } // stake visibility is public as overriding LPTokenWrapper's stake() function function stake(uint256 amount) public updateReward(msg.sender) override checkStart { require(amount != 0, "Cannot stake 0"); super.stake(amount); // check user cap require( balanceOf(msg.sender) <= tokenCapAmount || block.timestamp >= starttime.add(SECONDS_IN_A_DAY), "token cap exceeded" ); // boosters do not affect new amounts boostedBalances[msg.sender] = boostedBalances[msg.sender].add(amount); boostedTotalSupply = boostedTotalSupply.add(amount); _getReward(msg.sender); // transfer token last, to follow CEI pattern stakeToken.safeTransferFrom(msg.sender, address(this), amount); } function withdraw(uint256 amount) public updateReward(msg.sender) override checkStart { require(amount != 0, "Cannot withdraw 0"); super.withdraw(amount); // reset boosts :( numBoostersBought[msg.sender] = 0; // update boosted balance and supply updateBoostBalanceAndSupply(msg.sender, 0); // in case _getReward function fails, continue //(bool success, ) = address(this).call( // abi.encodeWithSignature( // "_getReward(address)", // msg.sender // ) //); // to remove compiler warning //success; // transfer token last, to follow CEI pattern stakeToken.safeTransfer(msg.sender, amount); } function getReward() external updateReward(msg.sender) checkStart { _getReward(msg.sender); } function exit() external { withdraw(balanceOf(msg.sender)); } function setScaleFactorsAndThreshold( uint256 _boostThreshold, uint256 _boostScaleFactor, uint256 _scaleFactor ) external onlyOwner { boostThreshold = _boostThreshold; boostScaleFactor = _boostScaleFactor; scaleFactor = _scaleFactor; } function boost() external updateReward(msg.sender) checkStart { require( block.timestamp > nextBoostPurchaseTime[msg.sender], "early boost purchase" ); // save current booster price, since transfer is done last // since getBoosterPrice() returns new boost balance, avoid re-calculation (uint256 boosterAmount, uint256 newBoostBalance) = getBoosterPrice(msg.sender); // user's balance and boostedSupply will be changed in this function applyBoost(msg.sender, newBoostBalance); _getReward(msg.sender); boostToken.safeTransferFrom(msg.sender, address(this), boosterAmount); IERC20Burnable burnableBoostToken = IERC20Burnable(address(boostToken)); // burn 25% uint256 burnAmount = boosterAmount.div(4); burnableBoostToken.burn(burnAmount); boosterAmount = boosterAmount.sub(burnAmount); // swap to stablecoin address[] memory routeDetails = new address[](3); routeDetails[0] = address(boostToken); routeDetails[1] = swapRouter.WETH(); routeDetails[2] = address(stablecoin); uint[] memory amounts = swapRouter.swapExactTokensForTokens( boosterAmount, 0, routeDetails, address(this), block.timestamp + 100 ); // transfer to treasury // index 2 = final output amt treasury.deposit(stablecoin, amounts[2]); } function notifyRewardAmount(uint256 reward) external onlyOwner updateReward(address(0)) { rewardRate = reward.div(duration); lastUpdateTime = starttime; periodFinish = starttime.add(duration); emit RewardAdded(reward); } function updateBoostBalanceAndSupply(address user, uint256 newBoostBalance) internal { // subtract existing balance from boostedSupply boostedTotalSupply = boostedTotalSupply.sub(boostedBalances[user]); // when applying boosts, // newBoostBalance has already been calculated in getBoosterPrice() if (newBoostBalance == 0) { // each booster adds 5% to current stake amount, that is 1 booster means 5%, // two boosters mean 10% and so on newBoostBalance = balanceOf(user).mul(numBoostersBought[user].mul(5).add(100)).div(100); } // update user's boosted balance boostedBalances[user] = newBoostBalance; // update boostedSupply boostedTotalSupply = boostedTotalSupply.add(newBoostBalance); } function applyBoost(address user, uint256 newBoostBalance) internal { // increase no. of boosters bought numBoostersBought[user] = numBoostersBought[user].add(1); updateBoostBalanceAndSupply(user, newBoostBalance); // increase next purchase eligibility by an hour nextBoostPurchaseTime[user] = block.timestamp.add(3600); // increase global booster price by 1% globalBoosterPrice = globalBoosterPrice.mul(101).div(100); lastBoostPurchase = block.timestamp; } function _getReward(address user) internal { uint256 reward = earned(user); if (reward != 0) { rewards[user] = 0; emit RewardPaid(user, reward); rewardToken.safeTransfer(user, reward); } } /// Imported from: https://forum.openzeppelin.com/t/does-safemath-library-need-a-safe-power-function/871/7 /// Modified so that it takes in 3 arguments for base /// @return the eventually newly calculated boost price function calculateBoostDevaluation(uint256 a, uint256 b, uint256 c, uint256 exponent) internal pure returns (uint256) { if (exponent == 0) { return a; } else if (exponent == 1) { return a.mul(b).div(c); } else if (a == 0 && exponent != 0) { return 0; } else { uint256 z = a.mul(b).div(c); for (uint256 i = 1; i < exponent; i++) z = z.mul(b).div(c); return z; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_tokenCapAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_stakeToken","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"contract IERC20","name":"_boostToken","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"contract SwapRouter","name":"_swapRouter","type":"address"},{"internalType":"uint256","name":"_starttime","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"inputs":[],"name":"SECONDS_IN_A_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"boostScaleFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boostThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boostToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boostedBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boostedTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getBoosterPrice","outputs":[{"internalType":"uint256","name":"boosterPrice","type":"uint256"},{"internalType":"uint256","name":"newBoostBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"globalBoosterPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBoostPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nextBoostPurchaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numBoostersBought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scaleFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boostThreshold","type":"uint256"},{"internalType":"uint256","name":"_boostScaleFactor","type":"uint256"},{"internalType":"uint256","name":"_scaleFactor","type":"uint256"}],"name":"setScaleFactorsAndThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stablecoin","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"starttime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract SwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"contract ITreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052670de0b6b3a7640000601755600a6018556014601955610140601a553480156200002d57600080fd5b50604051620027c9380380620027c983398181016040526101008110156200005457600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e090970151600180546001600160a01b0319166001600160a01b0388161790559596949593949293919290916000620000ae62000238565b600380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506009889055600580546001600160a01b038088166001600160a01b03199283161790925560048054898416908316178155600680548885169316929092179182905560408051633a609fed60e11b8152905192909316926374c13fda9281830192602092829003018186803b1580156200017557600080fd5b505afa1580156200018a573d6000803e3d6000fd5b505050506040513d6020811015620001a157600080fd5b5051600880546001600160a01b03199081166001600160a01b039384161790915560078054909116858316179055600a8390556013839055600b829055600554620001fd9116846000196200023c602090811b62001f1d17901c565b6006546008546200022a916001600160a01b0391821691166000196200023c602090811b62001f1d17901c565b505050505050505062000605565b3390565b801580620002c6575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156200029657600080fd5b505afa158015620002ab573d6000803e3d6000fd5b505050506040513d6020811015620002c257600080fd5b5051155b620003035760405162461bcd60e51b8152600401808060200182810382526036815260200180620027936036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200035b9185916200036016565b505050565b6060620003bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200041c60201b62001d82179092919060201c565b8051909150156200035b57808060200190516020811015620003dd57600080fd5b50516200035b5760405162461bcd60e51b815260040180806020018281038252602a81526020018062002769602a913960400191505060405180910390fd5b60606200043684846000856001600160e01b036200043e16565b949350505050565b606062000454856001600160e01b03620005ff16565b620004a6576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310620004e75780518252601f199092019160209182019101620004c6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146200054b576040519150601f19603f3d011682016040523d82523d6000602084013e62000550565b606091505b5091509150811562000566579150620004369050565b805115620005775780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620005c3578181015183820152602001620005a9565b50505050905090810190601f168015620005f15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b3b151590565b61215480620006156000396000f3fe608060405234801561001057600080fd5b50600436106102d25760003560e01c806380faa57d11610186578063c675ccc1116100e3578063e9cbd82211610097578063f2fde38b11610071578063f2fde38b146105a0578063f7c618c1146105c6578063f9cfa06f146105ce576102d2565b8063e9cbd82214610588578063e9fad8ee14610590578063ebe2b12b14610598576102d2565b8063cd3daf9d116100c8578063cd3daf9d14610552578063df136d651461055a578063e72c3c4214610562576102d2565b8063c675ccc114610542578063c8f33c911461054a576102d2565b80638da588971161013a578063a66f42c01161011f578063a66f42c014610515578063a694fc3a1461051d578063c31c9c071461053a576102d2565b80638da58897146105055780638da5cb5b1461050d576102d2565b80638b8763471161016b5780638b876347146104ae5780638b8d67d5146104d45780638c445cab146104dc576102d2565b806380faa57d1461049e5780638112643c146104a6576102d2565b80633d18b9121161023457806364044fd9116101e857806370a08231116101cd57806370a0823114610468578063715018a61461048e5780637b0a47ee14610496576102d2565b806364044fd91461043a578063683dd19114610460576102d2565b806351ed6a301161021957806351ed6a30146104225780635be4d8001461042a57806361d027b314610432576102d2565b80633d18b912146104125780634c5be6f31461041a576102d2565b80632e1a7d4d1161028b5780633a589b97116102705780633a589b97146103ab5780633ba35551146103cf5780633c6b16ab146103f5576102d2565b80632e1a7d4d146103845780633004b466146103a3576102d2565b80630d7373a7116102bc5780630d7373a7146103355780630fb5a6b41461037457806318160ddd1461037c576102d2565b80628cc262146102d75780630700037d1461030f575b600080fd5b6102fd600480360360208110156102ed57600080fd5b50356001600160a01b03166105d6565b60408051918252519081900360200190f35b6102fd6004803603602081101561032557600080fd5b50356001600160a01b031661066c565b61035b6004803603602081101561034b57600080fd5b50356001600160a01b031661067e565b6040805192835260208301919091528051918290030190f35b6102fd6107e9565b6102fd6107ef565b6103a16004803603602081101561039a57600080fd5b50356107f6565b005b6102fd610940565b6103b3610946565b604080516001600160a01b039092168252519081900360200190f35b6102fd600480360360208110156103e557600080fd5b50356001600160a01b0316610955565b6103a16004803603602081101561040b57600080fd5b5035610967565b6103a1610a99565b6102fd610b57565b6103b3610b5d565b6102fd610b6c565b6103b3610b72565b6102fd6004803603602081101561045057600080fd5b50356001600160a01b0316610b81565b6102fd610b93565b6102fd6004803603602081101561047e57600080fd5b50356001600160a01b0316610b99565b6103a1610bb4565b6102fd610c80565b6102fd610c86565b6102fd610c99565b6102fd600480360360208110156104c457600080fd5b50356001600160a01b0316610c9f565b6102fd610cb1565b6103a1600480360360608110156104f257600080fd5b5080359060208101359060400135610cb7565b6102fd610d2f565b6103b3610d35565b6103a1610d44565b6103a16004803603602081101561053357600080fd5b50356112ac565b6103b36114a5565b6102fd6114b4565b6102fd6114ba565b6102fd6114c0565b6102fd61150e565b6102fd6004803603602081101561057857600080fd5b50356001600160a01b0316611514565b6103b3611526565b6103a1611535565b6102fd611548565b6103a1600480360360208110156105b657600080fd5b50356001600160a01b031661154e565b6103b3611671565b6102fd611680565b6001600160a01b0381166000908152601160209081526040808320546010909252822054610666919061065a90670de0b6b3a76400009061064e906106299061061d6114c0565b9063ffffffff61168716565b6001600160a01b0388166000908152601460205260409020549063ffffffff6116d016565b9063ffffffff61172916565b9063ffffffff61176b16565b92915050565b60116020526000908152604090205481565b60008060125460001415610697575060009050806107e4565b6001600160a01b0383166000908152601560205260409020546106dc606461064e6106cd8261065a86600563ffffffff6116d016565b6017549063ffffffff6116d016565b92506106ef81600163ffffffff61176b16565b9050601854811061073e5761073b606461064e61072e606461065a6019546107226018548961168790919063ffffffff16565b9063ffffffff6116d016565b869063ffffffff6116d016565b92505b610768836103cf6103e8610763611c2061064e6013544261168790919063ffffffff16565b6117c5565b9250610790606461064e6107878261065a86600563ffffffff6116d016565b61072288610b99565b6001600160a01b038516600090815260146020526040812054919350906107be90849063ffffffff61168716565b90506107df60125461064e601a5461072285896116d090919063ffffffff16565b935050505b915091565b600b5481565b6000545b90565b336107ff6114c0565b600f5561080a610c86565b600e556001600160a01b0381161561085157610825816105d6565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600a544210156108a8576040805162461bcd60e51b815260206004820152600960248201527f6e6f742073746172740000000000000000000000000000000000000000000000604482015290519081900360640190fd5b816108fa576040805162461bcd60e51b815260206004820152601160248201527f43616e6e6f742077697468647261772030000000000000000000000000000000604482015290519081900360640190fd5b6109038261185e565b33600081815260156020526040812081905561091f91906118a6565b60015461093c906001600160a01b0316338463ffffffff61195516565b5050565b60135481565b6005546001600160a01b031681565b60146020526000908152604090205481565b61096f6119da565b6003546001600160a01b039081169116146109d1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60006109db6114c0565b600f556109e6610c86565b600e556001600160a01b03811615610a2d57610a01816105d6565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600b54610a4190839063ffffffff61172916565b600d55600a54600e819055600b54610a5f919063ffffffff61176b16565b600c556040805183815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b33610aa26114c0565b600f55610aad610c86565b600e556001600160a01b03811615610af457610ac8816105d6565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600a54421015610b4b576040805162461bcd60e51b815260206004820152600960248201527f6e6f742073746172740000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610b54336119de565b50565b60185481565b6001546001600160a01b031681565b60095481565b6006546001600160a01b031681565b60166020526000908152604090205481565b601a5481565b6001600160a01b031660009081526002602052604090205490565b610bbc6119da565b6003546001600160a01b03908116911614610c1e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600d5481565b6000610c9442600c54611a5e565b905090565b60125481565b60106020526000908152604090205481565b60195481565b610cbf6119da565b6003546001600160a01b03908116911614610d21576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601892909255601955601a55565b600a5481565b6003546001600160a01b031690565b33610d4d6114c0565b600f55610d58610c86565b600e556001600160a01b03811615610d9f57610d73816105d6565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600a54421015610df6576040805162461bcd60e51b815260206004820152600960248201527f6e6f742073746172740000000000000000000000000000000000000000000000604482015290519081900360640190fd5b336000908152601660205260409020544211610e59576040805162461bcd60e51b815260206004820152601460248201527f6561726c7920626f6f7374207075726368617365000000000000000000000000604482015290519081900360640190fd5b600080610e653361067e565b91509150610e733382611a74565b610e7c336119de565b600554610e9a906001600160a01b031633308563ffffffff611b1216565b6005546001600160a01b03166000610eb984600463ffffffff61172916565b9050816001600160a01b03166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0157600080fd5b505af1158015610f15573d6000803e3d6000fd5b50505050610f2c818561168790919063ffffffff16565b6040805160038082526080820190925291955060609190602082018380388339505060055482519293506001600160a01b031691839150600090610f6c57fe5b6001600160a01b03928316602091820292909201810191909152600754604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015610fd957600080fd5b505afa158015610fed573d6000803e3d6000fd5b505050506040513d602081101561100357600080fd5b505181518290600190811061101457fe5b6001600160a01b03928316602091820292909201015260085482519116908290600290811061103f57fe5b6001600160a01b039283166020918202929092018101919091526007546040517f38ed17390000000000000000000000000000000000000000000000000000000081526004810189815260006024830181905230606484810182905242016084850181905260a060448601908152895160a4870152895160609997909716976338ed1739978f9795968c9690939260c49091019187820191028083838b5b838110156110f55781810151838201526020016110dd565b505050509050019650505050505050600060405180830381600087803b15801561111e57600080fd5b505af1158015611132573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052602081101561117957600080fd5b810190808051604051939291908464010000000082111561119957600080fd5b9083019060208201858111156111ae57600080fd5b82518660208202830111640100000000821117156111cb57600080fd5b82525081516020918201928201910280838360005b838110156111f85781810151838201526020016111e0565b5050505091909101604052505060065460085484519495506001600160a01b03918216946347e7ef249450911691508490600290811061123457fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561128b57600080fd5b505af115801561129f573d6000803e3d6000fd5b5050505050505050505050565b336112b56114c0565b600f556112c0610c86565b600e556001600160a01b03811615611307576112db816105d6565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600a5442101561135e576040805162461bcd60e51b815260206004820152600960248201527f6e6f742073746172740000000000000000000000000000000000000000000000604482015290519081900360640190fd5b816113b0576040805162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b6113b982611ba0565b6009546113c533610b99565b1115806113e75750600a546113e3906201518063ffffffff61176b16565b4210155b611438576040805162461bcd60e51b815260206004820152601260248201527f746f6b656e206361702065786365656465640000000000000000000000000000604482015290519081900360640190fd5b33600090815260146020526040902054611458908363ffffffff61176b16565b3360009081526014602052604090205560125461147b908363ffffffff61176b16565b601255611487336119de565b60015461093c906001600160a01b031633308563ffffffff611b1216565b6007546001600160a01b031681565b60175481565b600e5481565b6000601254600014156114d65750600f546107f3565b610c946114ff60125461064e670de0b6b3a7640000610722600d54610722600e5461061d610c86565b600f549063ffffffff61176b16565b600f5481565b60156020526000908152604090205481565b6008546001600160a01b031681565b61154661154133610b99565b6107f6565b565b600c5481565b6115566119da565b6003546001600160a01b039081169116146115b8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166115fd5760405162461bcd60e51b81526004018080602001828103825260268152602001806120786026913960400191505060405180910390fd5b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b6201518081565b60006116c983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611bd5565b9392505050565b6000826116df57506000610666565b828202828482816116ec57fe5b04146116c95760405162461bcd60e51b815260040180806020018281038252602181526020018061209e6021913960400191505060405180910390fd5b60006116c983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611c6c565b6000828201838110156116c9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000816117d3575083611856565b81600114156117f7576117f08361064e878763ffffffff6116d016565b9050611856565b8415801561180457508115155b1561181157506000611856565b60006118278461064e888863ffffffff6116d016565b905060015b83811015611852576118488561064e848963ffffffff6116d016565b915060010161182c565b5090505b949350505050565b600054611871908263ffffffff61168716565b600090815533815260026020526040902054611893908263ffffffff61168716565b3360009081526002602052604090205550565b6001600160a01b0382166000908152601460205260409020546012546118d19163ffffffff61168716565b60125580611920576001600160a01b03821660009081526015602052604090205461191d9060649061064e9061191490839061065a90600563ffffffff6116d016565b61072286610b99565b90505b6001600160a01b038216600090815260146020526040902081905560125461194e908263ffffffff61176b16565b6012555050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526119d5908490611cd1565b505050565b3390565b60006119e9826105d6565b9050801561093c576001600160a01b038216600081815260116020908152604080832092909255815184815291517fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04869281900390910190a260045461093c906001600160a01b0316838363ffffffff61195516565b6000818310611a6d57816116c9565b5090919050565b6001600160a01b038216600090815260156020526040902054611a9e90600163ffffffff61176b16565b6001600160a01b038316600090815260156020526040902055611ac182826118a6565b611ad342610e1063ffffffff61176b16565b6001600160a01b038316600090815260166020526040902055601754611b079060649061064e90606563ffffffff6116d016565b601755505042601355565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052611b9a908590611cd1565b50505050565b600054611bb3908263ffffffff61176b16565b600090815533815260026020526040902054611893908263ffffffff61176b16565b60008184841115611c645760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c29578181015183820152602001611c11565b50505050905090810190601f168015611c565780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611cbb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611c29578181015183820152602001611c11565b506000838581611cc757fe5b0495945050505050565b6060611d26826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d829092919063ffffffff16565b8051909150156119d557808060200190516020811015611d4557600080fd5b50516119d55760405162461bcd60e51b815260040180806020018281038252602a8152602001806120bf602a913960400191505060405180910390fd5b606061185684846000856060611d9785611f17565b611de8576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611e4557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611e08565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611ea7576040519150601f19603f3d011682016040523d82523d6000602084013e611eac565b606091505b50915091508115611ec05791506118569050565b805115611ed05780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315611c29578181015183820152602001611c11565b3b151590565b801580611fbc5750604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611f8e57600080fd5b505afa158015611fa2573d6000803e3d6000fd5b505050506040513d6020811015611fb857600080fd5b5051155b611ff75760405162461bcd60e51b81526004018080602001828103825260368152602001806120e96036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526119d5908490611cd156fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220aebec683234a84bf28a4adda222f1321f0a7516c674bc019cfad5a10313c4a2c64736f6c634300060200335361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000000000000000000000000000000ad78ebc5ac6200000000000000000000000000000dc3f6f4c00b55f56d5ef6293b762c6483af24a820000000000000000000000008185bc4757572da2a610f887561c32298f1a57480000000000000000000000003e780920601d61cedb860fe9c4a90c9ea6a35e780000000000000000000000003a3235949a22b5c0bb42a42fd225a5fe7d18ef520000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000000000605c7b4000000000000000000000000000000000000000000000000000000000006ebe00
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102d25760003560e01c806380faa57d11610186578063c675ccc1116100e3578063e9cbd82211610097578063f2fde38b11610071578063f2fde38b146105a0578063f7c618c1146105c6578063f9cfa06f146105ce576102d2565b8063e9cbd82214610588578063e9fad8ee14610590578063ebe2b12b14610598576102d2565b8063cd3daf9d116100c8578063cd3daf9d14610552578063df136d651461055a578063e72c3c4214610562576102d2565b8063c675ccc114610542578063c8f33c911461054a576102d2565b80638da588971161013a578063a66f42c01161011f578063a66f42c014610515578063a694fc3a1461051d578063c31c9c071461053a576102d2565b80638da58897146105055780638da5cb5b1461050d576102d2565b80638b8763471161016b5780638b876347146104ae5780638b8d67d5146104d45780638c445cab146104dc576102d2565b806380faa57d1461049e5780638112643c146104a6576102d2565b80633d18b9121161023457806364044fd9116101e857806370a08231116101cd57806370a0823114610468578063715018a61461048e5780637b0a47ee14610496576102d2565b806364044fd91461043a578063683dd19114610460576102d2565b806351ed6a301161021957806351ed6a30146104225780635be4d8001461042a57806361d027b314610432576102d2565b80633d18b912146104125780634c5be6f31461041a576102d2565b80632e1a7d4d1161028b5780633a589b97116102705780633a589b97146103ab5780633ba35551146103cf5780633c6b16ab146103f5576102d2565b80632e1a7d4d146103845780633004b466146103a3576102d2565b80630d7373a7116102bc5780630d7373a7146103355780630fb5a6b41461037457806318160ddd1461037c576102d2565b80628cc262146102d75780630700037d1461030f575b600080fd5b6102fd600480360360208110156102ed57600080fd5b50356001600160a01b03166105d6565b60408051918252519081900360200190f35b6102fd6004803603602081101561032557600080fd5b50356001600160a01b031661066c565b61035b6004803603602081101561034b57600080fd5b50356001600160a01b031661067e565b6040805192835260208301919091528051918290030190f35b6102fd6107e9565b6102fd6107ef565b6103a16004803603602081101561039a57600080fd5b50356107f6565b005b6102fd610940565b6103b3610946565b604080516001600160a01b039092168252519081900360200190f35b6102fd600480360360208110156103e557600080fd5b50356001600160a01b0316610955565b6103a16004803603602081101561040b57600080fd5b5035610967565b6103a1610a99565b6102fd610b57565b6103b3610b5d565b6102fd610b6c565b6103b3610b72565b6102fd6004803603602081101561045057600080fd5b50356001600160a01b0316610b81565b6102fd610b93565b6102fd6004803603602081101561047e57600080fd5b50356001600160a01b0316610b99565b6103a1610bb4565b6102fd610c80565b6102fd610c86565b6102fd610c99565b6102fd600480360360208110156104c457600080fd5b50356001600160a01b0316610c9f565b6102fd610cb1565b6103a1600480360360608110156104f257600080fd5b5080359060208101359060400135610cb7565b6102fd610d2f565b6103b3610d35565b6103a1610d44565b6103a16004803603602081101561053357600080fd5b50356112ac565b6103b36114a5565b6102fd6114b4565b6102fd6114ba565b6102fd6114c0565b6102fd61150e565b6102fd6004803603602081101561057857600080fd5b50356001600160a01b0316611514565b6103b3611526565b6103a1611535565b6102fd611548565b6103a1600480360360208110156105b657600080fd5b50356001600160a01b031661154e565b6103b3611671565b6102fd611680565b6001600160a01b0381166000908152601160209081526040808320546010909252822054610666919061065a90670de0b6b3a76400009061064e906106299061061d6114c0565b9063ffffffff61168716565b6001600160a01b0388166000908152601460205260409020549063ffffffff6116d016565b9063ffffffff61172916565b9063ffffffff61176b16565b92915050565b60116020526000908152604090205481565b60008060125460001415610697575060009050806107e4565b6001600160a01b0383166000908152601560205260409020546106dc606461064e6106cd8261065a86600563ffffffff6116d016565b6017549063ffffffff6116d016565b92506106ef81600163ffffffff61176b16565b9050601854811061073e5761073b606461064e61072e606461065a6019546107226018548961168790919063ffffffff16565b9063ffffffff6116d016565b869063ffffffff6116d016565b92505b610768836103cf6103e8610763611c2061064e6013544261168790919063ffffffff16565b6117c5565b9250610790606461064e6107878261065a86600563ffffffff6116d016565b61072288610b99565b6001600160a01b038516600090815260146020526040812054919350906107be90849063ffffffff61168716565b90506107df60125461064e601a5461072285896116d090919063ffffffff16565b935050505b915091565b600b5481565b6000545b90565b336107ff6114c0565b600f5561080a610c86565b600e556001600160a01b0381161561085157610825816105d6565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600a544210156108a8576040805162461bcd60e51b815260206004820152600960248201527f6e6f742073746172740000000000000000000000000000000000000000000000604482015290519081900360640190fd5b816108fa576040805162461bcd60e51b815260206004820152601160248201527f43616e6e6f742077697468647261772030000000000000000000000000000000604482015290519081900360640190fd5b6109038261185e565b33600081815260156020526040812081905561091f91906118a6565b60015461093c906001600160a01b0316338463ffffffff61195516565b5050565b60135481565b6005546001600160a01b031681565b60146020526000908152604090205481565b61096f6119da565b6003546001600160a01b039081169116146109d1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60006109db6114c0565b600f556109e6610c86565b600e556001600160a01b03811615610a2d57610a01816105d6565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600b54610a4190839063ffffffff61172916565b600d55600a54600e819055600b54610a5f919063ffffffff61176b16565b600c556040805183815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b33610aa26114c0565b600f55610aad610c86565b600e556001600160a01b03811615610af457610ac8816105d6565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600a54421015610b4b576040805162461bcd60e51b815260206004820152600960248201527f6e6f742073746172740000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610b54336119de565b50565b60185481565b6001546001600160a01b031681565b60095481565b6006546001600160a01b031681565b60166020526000908152604090205481565b601a5481565b6001600160a01b031660009081526002602052604090205490565b610bbc6119da565b6003546001600160a01b03908116911614610c1e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600d5481565b6000610c9442600c54611a5e565b905090565b60125481565b60106020526000908152604090205481565b60195481565b610cbf6119da565b6003546001600160a01b03908116911614610d21576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601892909255601955601a55565b600a5481565b6003546001600160a01b031690565b33610d4d6114c0565b600f55610d58610c86565b600e556001600160a01b03811615610d9f57610d73816105d6565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600a54421015610df6576040805162461bcd60e51b815260206004820152600960248201527f6e6f742073746172740000000000000000000000000000000000000000000000604482015290519081900360640190fd5b336000908152601660205260409020544211610e59576040805162461bcd60e51b815260206004820152601460248201527f6561726c7920626f6f7374207075726368617365000000000000000000000000604482015290519081900360640190fd5b600080610e653361067e565b91509150610e733382611a74565b610e7c336119de565b600554610e9a906001600160a01b031633308563ffffffff611b1216565b6005546001600160a01b03166000610eb984600463ffffffff61172916565b9050816001600160a01b03166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0157600080fd5b505af1158015610f15573d6000803e3d6000fd5b50505050610f2c818561168790919063ffffffff16565b6040805160038082526080820190925291955060609190602082018380388339505060055482519293506001600160a01b031691839150600090610f6c57fe5b6001600160a01b03928316602091820292909201810191909152600754604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015610fd957600080fd5b505afa158015610fed573d6000803e3d6000fd5b505050506040513d602081101561100357600080fd5b505181518290600190811061101457fe5b6001600160a01b03928316602091820292909201015260085482519116908290600290811061103f57fe5b6001600160a01b039283166020918202929092018101919091526007546040517f38ed17390000000000000000000000000000000000000000000000000000000081526004810189815260006024830181905230606484810182905242016084850181905260a060448601908152895160a4870152895160609997909716976338ed1739978f9795968c9690939260c49091019187820191028083838b5b838110156110f55781810151838201526020016110dd565b505050509050019650505050505050600060405180830381600087803b15801561111e57600080fd5b505af1158015611132573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052602081101561117957600080fd5b810190808051604051939291908464010000000082111561119957600080fd5b9083019060208201858111156111ae57600080fd5b82518660208202830111640100000000821117156111cb57600080fd5b82525081516020918201928201910280838360005b838110156111f85781810151838201526020016111e0565b5050505091909101604052505060065460085484519495506001600160a01b03918216946347e7ef249450911691508490600290811061123457fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561128b57600080fd5b505af115801561129f573d6000803e3d6000fd5b5050505050505050505050565b336112b56114c0565b600f556112c0610c86565b600e556001600160a01b03811615611307576112db816105d6565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600a5442101561135e576040805162461bcd60e51b815260206004820152600960248201527f6e6f742073746172740000000000000000000000000000000000000000000000604482015290519081900360640190fd5b816113b0576040805162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b6113b982611ba0565b6009546113c533610b99565b1115806113e75750600a546113e3906201518063ffffffff61176b16565b4210155b611438576040805162461bcd60e51b815260206004820152601260248201527f746f6b656e206361702065786365656465640000000000000000000000000000604482015290519081900360640190fd5b33600090815260146020526040902054611458908363ffffffff61176b16565b3360009081526014602052604090205560125461147b908363ffffffff61176b16565b601255611487336119de565b60015461093c906001600160a01b031633308563ffffffff611b1216565b6007546001600160a01b031681565b60175481565b600e5481565b6000601254600014156114d65750600f546107f3565b610c946114ff60125461064e670de0b6b3a7640000610722600d54610722600e5461061d610c86565b600f549063ffffffff61176b16565b600f5481565b60156020526000908152604090205481565b6008546001600160a01b031681565b61154661154133610b99565b6107f6565b565b600c5481565b6115566119da565b6003546001600160a01b039081169116146115b8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166115fd5760405162461bcd60e51b81526004018080602001828103825260268152602001806120786026913960400191505060405180910390fd5b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b6201518081565b60006116c983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611bd5565b9392505050565b6000826116df57506000610666565b828202828482816116ec57fe5b04146116c95760405162461bcd60e51b815260040180806020018281038252602181526020018061209e6021913960400191505060405180910390fd5b60006116c983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611c6c565b6000828201838110156116c9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000816117d3575083611856565b81600114156117f7576117f08361064e878763ffffffff6116d016565b9050611856565b8415801561180457508115155b1561181157506000611856565b60006118278461064e888863ffffffff6116d016565b905060015b83811015611852576118488561064e848963ffffffff6116d016565b915060010161182c565b5090505b949350505050565b600054611871908263ffffffff61168716565b600090815533815260026020526040902054611893908263ffffffff61168716565b3360009081526002602052604090205550565b6001600160a01b0382166000908152601460205260409020546012546118d19163ffffffff61168716565b60125580611920576001600160a01b03821660009081526015602052604090205461191d9060649061064e9061191490839061065a90600563ffffffff6116d016565b61072286610b99565b90505b6001600160a01b038216600090815260146020526040902081905560125461194e908263ffffffff61176b16565b6012555050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526119d5908490611cd1565b505050565b3390565b60006119e9826105d6565b9050801561093c576001600160a01b038216600081815260116020908152604080832092909255815184815291517fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04869281900390910190a260045461093c906001600160a01b0316838363ffffffff61195516565b6000818310611a6d57816116c9565b5090919050565b6001600160a01b038216600090815260156020526040902054611a9e90600163ffffffff61176b16565b6001600160a01b038316600090815260156020526040902055611ac182826118a6565b611ad342610e1063ffffffff61176b16565b6001600160a01b038316600090815260166020526040902055601754611b079060649061064e90606563ffffffff6116d016565b601755505042601355565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052611b9a908590611cd1565b50505050565b600054611bb3908263ffffffff61176b16565b600090815533815260026020526040902054611893908263ffffffff61176b16565b60008184841115611c645760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c29578181015183820152602001611c11565b50505050905090810190601f168015611c565780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611cbb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611c29578181015183820152602001611c11565b506000838581611cc757fe5b0495945050505050565b6060611d26826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d829092919063ffffffff16565b8051909150156119d557808060200190516020811015611d4557600080fd5b50516119d55760405162461bcd60e51b815260040180806020018281038252602a8152602001806120bf602a913960400191505060405180910390fd5b606061185684846000856060611d9785611f17565b611de8576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611e4557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611e08565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611ea7576040519150601f19603f3d011682016040523d82523d6000602084013e611eac565b606091505b50915091508115611ec05791506118569050565b805115611ed05780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315611c29578181015183820152602001611c11565b3b151590565b801580611fbc5750604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611f8e57600080fd5b505afa158015611fa2573d6000803e3d6000fd5b505050506040513d6020811015611fb857600080fd5b5051155b611ff75760405162461bcd60e51b81526004018080602001828103825260368152602001806120e96036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526119d5908490611cd156fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220aebec683234a84bf28a4adda222f1321f0a7516c674bc019cfad5a10313c4a2c64736f6c63430006020033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000ad78ebc5ac6200000000000000000000000000000dc3f6f4c00b55f56d5ef6293b762c6483af24a820000000000000000000000008185bc4757572da2a610f887561c32298f1a57480000000000000000000000003e780920601d61cedb860fe9c4a90c9ea6a35e780000000000000000000000003a3235949a22b5c0bb42a42fd225a5fe7d18ef520000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000000000605c7b4000000000000000000000000000000000000000000000000000000000006ebe00
-----Decoded View---------------
Arg [0] : _tokenCapAmount (uint256): 200000000000000000000
Arg [1] : _stakeToken (address): 0xdc3f6f4C00B55F56d5Ef6293b762c6483af24A82
Arg [2] : _rewardToken (address): 0x8185Bc4757572Da2a610f887561c32298f1A5748
Arg [3] : _boostToken (address): 0x3e780920601D61cEdb860fe9c4a90c9EA6A35E78
Arg [4] : _treasury (address): 0x3a3235949A22b5C0Bb42A42FD225a5FE7D18Ef52
Arg [5] : _swapRouter (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [6] : _starttime (uint256): 1616673600
Arg [7] : _duration (uint256): 7257600
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000ad78ebc5ac6200000
Arg [1] : 000000000000000000000000dc3f6f4c00b55f56d5ef6293b762c6483af24a82
Arg [2] : 0000000000000000000000008185bc4757572da2a610f887561c32298f1a5748
Arg [3] : 0000000000000000000000003e780920601d61cedb860fe9c4a90c9ea6a35e78
Arg [4] : 0000000000000000000000003a3235949a22b5c0bb42a42fd225a5fe7d18ef52
Arg [5] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [6] : 00000000000000000000000000000000000000000000000000000000605c7b40
Arg [7] : 00000000000000000000000000000000000000000000000000000000006ebe00
Deployed Bytecode Sourcemap
29330:11723:0:-:0;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29330:11723:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32641:271;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32641:271:0;-1:-1:-1;;;;;32641:271:0;;:::i;:::-;;;;;;;;;;;;;;;;29972:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29972:42:0;-1:-1:-1;;;;;29972:42:0;;:::i;32920:1696::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32920:1696:0;-1:-1:-1;;;;;32920:1696:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;29679:23;;;:::i;25321:91::-;;;:::i;35443:790::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35443:790:0;;:::i;:::-;;30187:32;;;:::i;29471:24::-;;;:::i;:::-;;;;-1:-1:-1;;;;;29471:24:0;;;;;;;;;;;;;;30260:50;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30260:50:0;-1:-1:-1;;;;;30260:50:0;;:::i;38313:293::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38313:293:0;;:::i;36241:107::-;;;:::i;30597:34::-;;;:::i;25144:24::-;;;:::i;29612:29::-;;;:::i;29502:25::-;;;:::i;30419:56::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30419:56:0;-1:-1:-1;;;;;30419:56:0;;:::i;30681:32::-;;;:::i;25420:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25420:110:0;-1:-1:-1;;;;;25420:110:0;;:::i;2743:148::-;;;:::i;29743:25::-;;;:::i;32064:131::-;;;:::i;30147:33::-;;;:::i;29908:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29908:57:0;-1:-1:-1;;;;;29908:57:0;;:::i;30638:36::-;;;:::i;36439:304::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36439:304:0;;;;;;;;;;;;:::i;29648:24::-;;;:::i;2101:79::-;;;:::i;36755:1550::-;;;:::i;34707:728::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34707:728:0;;:::i;29534:28::-;;;:::i;30550:40::-;;;:::i;29775:29::-;;;:::i;32203:430::-;;;:::i;29811:35::-;;;:::i;30317:52::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30317:52:0;-1:-1:-1;;;;;30317:52:0;;:::i;29569:24::-;;;:::i;36356:75::-;;;:::i;29709:27::-;;;:::i;3046:244::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3046:244:0;-1:-1:-1;;;;;3046:244:0;;:::i;29439:25::-;;;:::i;29853:48::-;;;:::i;32641:271::-;-1:-1:-1;;;;;32887:16:0;;32695:7;32887:16;;;:7;:16;;;;;;;;;32803:22;:31;;;;;;32735:169;;32887:16;32735:129;;32859:4;;32735:101;;32782:53;;:16;:14;:16::i;:::-;:20;:53;:20;:53;:::i;:::-;-1:-1:-1;;;;;32735:24:0;;;;;;:15;:24;;;;;;;:101;:46;:101;:::i;:::-;:123;:129;:123;:129;:::i;:::-;:151;:169;:151;:169;:::i;:::-;32715:189;32641:271;-1:-1:-1;;32641:271:0:o;29972:42::-;;;;;;;;;;;;;:::o;32920:1696::-;32989:20;33011:23;33056:18;;33078:1;33056:23;33052:41;;;-1:-1:-1;33089:1:0;;-1:-1:-1;33089:1:0;33081:12;;33052:41;-1:-1:-1;;;;;33289:23:0;;33264:22;33289:23;;;:17;:23;;;;;;33338:63;33397:3;33338:54;33361:30;33397:3;33361:21;33289:23;33380:1;33361:21;:18;:21;:::i;:30::-;33338:18;;;:54;:22;:54;:::i;:63::-;33323:78;-1:-1:-1;33473:21:0;:14;33492:1;33473:21;:18;:21;:::i;:::-;33456:38;;33659:14;;33641;:32;33637:210;;33705:130;33831:3;33705:103;33740:67;33803:3;33740:58;33781:16;;33741:34;33760:14;;33741;:18;;:34;;;;:::i;:::-;33740:40;:58;:40;:58;:::i;:67::-;33705:12;;:103;:34;:103;:::i;:130::-;33690:145;;33637:210;33959:105;33985:12;33999:3;34004:4;34010:53;34055:7;34011:38;34031:17;;34011:15;:19;;:38;;;;:::i;34010:53::-;33959:25;:105::i;:::-;33944:120;-1:-1:-1;34289:88:0;34373:3;34289:65;34323:30;34373:3;34323:21;:14;34342:1;34323:21;:18;:21;:::i;:30::-;34289:15;34299:4;34289:9;:15::i;:88::-;-1:-1:-1;;;;;34439:21:0;;34388:28;34439:21;;;:15;:21;;;;;;34271:106;;-1:-1:-1;34388:28:0;34419:42;;34271:106;;34419:42;:19;:42;:::i;:::-;34388:73;;34487:121;34589:18;;34487:83;34558:11;;34487:52;34518:20;34487:12;:30;;:52;;;;:::i;:121::-;34472:136;;32920:1696;;;;;;:::o;29679:23::-;;;;:::o;25321:91::-;25365:7;25392:12;25321:91;;:::o;35443:790::-;35497:10;31008:16;:14;:16::i;:::-;30985:20;:39;31052:26;:24;:26::i;:::-;31035:14;:43;-1:-1:-1;;;;;31093:21:0;;;31089:157;;31150:15;31157:7;31150:6;:15::i;:::-;-1:-1:-1;;;;;31131:16:0;;;;;;:7;:16;;;;;;;;:34;;;;31214:20;;31180:22;:31;;;;;;:54;31089:157;30885:9:::1;;30866:15;:28;;30858:49;;;::::0;;-1:-1:-1;;;30858:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;35548:11:::0;35540:41:::2;;;::::0;;-1:-1:-1;;;35540:41:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;35592:22;35607:6;35592:14;:22::i;:::-;35681:10;35695:1;35663:29:::0;;;:17:::2;:29;::::0;;;;:33;;;35755:42:::2;::::0;35681:10;35755:27:::2;:42::i;:::-;36182:10;::::0;:43:::2;::::0;-1:-1:-1;;;;;36182:10:0::2;36206;36218:6:::0;36182:43:::2;:23;:43;:::i;:::-;35443:790:::0;;:::o;30187:32::-;;;;:::o;29471:24::-;;;-1:-1:-1;;;;;29471:24:0;;:::o;30260:50::-;;;;;;;;;;;;;:::o;38313:293::-;2323:12;:10;:12::i;:::-;2313:6;;-1:-1:-1;;;;;2313:6:0;;;:22;;;2305:67;;;;;-1:-1:-1;;;2305:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38424:1:::1;31008:16;:14;:16::i;:::-;30985:20;:39:::0;31052:26:::1;:24;:26::i;:::-;31035:14;:43:::0;-1:-1:-1;;;;;31093:21:0;::::1;::::0;31089:157:::1;;31150:15;31157:7;31150:6;:15::i;:::-;-1:-1:-1::0;;;;;31131:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;31214:20:::1;::::0;31180:22:::1;:31:::0;;;;;;:54;31089:157:::1;38468:8:::2;::::0;38457:20:::2;::::0;:6;;:20:::2;:10;:20;:::i;:::-;38444:10;:33:::0;38505:9:::2;::::0;38488:14:::2;:26:::0;;;38554:8:::2;::::0;38540:23:::2;::::0;38505:9;38540:23:::2;:13;:23;:::i;:::-;38525:12;:38:::0;38579:19:::2;::::0;;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;2383:1:::1;38313:293:::0;:::o;36241:107::-;36284:10;31008:16;:14;:16::i;:::-;30985:20;:39;31052:26;:24;:26::i;:::-;31035:14;:43;-1:-1:-1;;;;;31093:21:0;;;31089:157;;31150:15;31157:7;31150:6;:15::i;:::-;-1:-1:-1;;;;;31131:16:0;;;;;;:7;:16;;;;;;;;:34;;;;31214:20;;31180:22;:31;;;;;;:54;31089:157;30885:9:::1;;30866:15;:28;;30858:49;;;::::0;;-1:-1:-1;;;30858:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36318:22:::2;36329:10;36318;:22::i;:::-;36241:107:::0;:::o;30597:34::-;;;;:::o;25144:24::-;;;-1:-1:-1;;;;;25144:24:0;;:::o;29612:29::-;;;;:::o;29502:25::-;;;-1:-1:-1;;;;;29502:25:0;;:::o;30419:56::-;;;;;;;;;;;;;:::o;30681:32::-;;;;:::o;25420:110::-;-1:-1:-1;;;;;25504:18:0;25477:7;25504:18;;;:9;:18;;;;;;;25420:110::o;2743:148::-;2323:12;:10;:12::i;:::-;2313:6;;-1:-1:-1;;;;;2313:6:0;;;:22;;;2305:67;;;;;-1:-1:-1;;;2305:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2834:6:::1;::::0;2813:40:::1;::::0;2850:1:::1;::::0;-1:-1:-1;;;;;2834:6:0::1;::::0;2813:40:::1;::::0;2850:1;;2813:40:::1;2864:6;:19:::0;;;::::1;::::0;;2743:148::o;29743:25::-;;;;:::o;32064:131::-;32121:7;32148:39;32157:15;32174:12;;32148:8;:39::i;:::-;32141:46;;32064:131;:::o;30147:33::-;;;;:::o;29908:57::-;;;;;;;;;;;;;:::o;30638:36::-;;;;:::o;36439:304::-;2323:12;:10;:12::i;:::-;2313:6;;-1:-1:-1;;;;;2313:6:0;;;:22;;;2305:67;;;;;-1:-1:-1;;;2305:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36619:14:::1;:32:::0;;;;36662:16:::1;:36:::0;36709:11:::1;:26:::0;36439:304::o;29648:24::-;;;;:::o;2101:79::-;2166:6;;-1:-1:-1;;;;;2166:6:0;2101:79;:::o;36755:1550::-;36794:10;31008:16;:14;:16::i;:::-;30985:20;:39;31052:26;:24;:26::i;:::-;31035:14;:43;-1:-1:-1;;;;;31093:21:0;;;31089:157;;31150:15;31157:7;31150:6;:15::i;:::-;-1:-1:-1;;;;;31131:16:0;;;;;;:7;:16;;;;;;;;:34;;;;31214:20;;31180:22;:31;;;;;;:54;31089:157;30885:9:::1;;30866:15;:28;;30858:49;;;::::0;;-1:-1:-1;;;30858:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36890:10:::2;36868:33;::::0;;;:21:::2;:33;::::0;;;;;36850:15:::2;:51;36828:121;;;::::0;;-1:-1:-1;;;36828:121:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;37115:21;37138:23:::0;37165:27:::2;37181:10;37165:15;:27::i;:::-;37114:78;;;;37281:39;37292:10;37304:15;37281:10;:39::i;:::-;37341:22;37352:10;37341;:22::i;:::-;37376:10;::::0;:69:::2;::::0;-1:-1:-1;;;;;37376:10:0::2;37404;37424:4;37431:13:::0;37376:69:::2;:27;:69;:::i;:::-;37525:10;::::0;-1:-1:-1;;;;;37525:10:0::2;37466:33;37592:20;:13:::0;37610:1:::2;37592:20;:17;:20;:::i;:::-;37571:41;;37623:18;-1:-1:-1::0;;;;;37623:23:0::2;;37647:10;37623:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::2;5:2;37623:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;37623:35:0;;;;37685:29;37703:10;37685:13;:17;;:29;;;;:::i;:::-;37798:16;::::0;;37812:1:::2;37798:16:::0;;;;;::::2;::::0;;;37669:45;;-1:-1:-1;37766:29:0::2;::::0;37798:16;::::2;::::0;::::2;37766:29:::0;;105:10:-1::2;37798:16:0::0;88:34:-1::2;-1:-1:::0;;37851:10:0::2;::::0;37825:15;;;;-1:-1:-1;;;;;;37851:10:0::2;::::0;37825:15;;-1:-1:-1;37851:10:0::2;::::0;37825:15:::2;;;;-1:-1:-1::0;;;;;37825:37:0;;::::2;:15;::::0;;::::2;::::0;;;;;;:37;;;;37891:10:::2;::::0;:17:::2;::::0;;;;;;;:10;;;::::2;::::0;:15:::2;::::0;:17:::2;::::0;;::::2;::::0;37825:15;;37891:17;;;;;:10;:17;::::2;;5:2:-1::0;::::2;;;30:1;27::::0;20:12:::2;5:2;37891:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;37891:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::2;2:2;-1:-1:::0;37891:17:0;37873:15;;:12;;37886:1:::2;::::0;37873:15;::::2;;;;;-1:-1:-1::0;;;;;37873:35:0;;::::2;:15;::::0;;::::2;::::0;;;;;:35;37945:10:::2;::::0;37919:15;;37945:10;::::2;::::0;37919:12;;37932:1:::2;::::0;37919:15;::::2;;;;;-1:-1:-1::0;;;;;37919:37:0;;::::2;:15;::::0;;::::2;::::0;;;;;;:37;;;;37991:10:::2;::::0;:181:::2;::::0;;;;::::2;::::0;::::2;::::0;;;:10:::2;:181:::0;;;;;;38120:4:::2;38158:3;37991:181:::0;;;;;;38140:15:::2;:21;37991:181:::0;;;;;;;;;;;;;;;;;;;;;37967:21:::2;::::0;37991:10;;;::::2;::::0;:35:::2;::::0;38041:13;;37991:10;;38085:12;;37991:181;;;;;;;;;;::::2;::::0;::::2;::::0;;;:10;8:100:-1::2;33:3;30:1;27:10;8:100;;;90:11:::0;;::::2;84:18:::0;71:11;;::::2;64:39:::0;52:2:::2;45:10;8:100;;;12:14;37991:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::2;5:2;37991:181:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;37991:181:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;37991:181:0;80:15:-1::0;;::::2;97:9:::0;76:31:::2;65:43:::0;::::2;120:4;113:20:::0;13:2:::2;5:11:::0;::::2;2:2;;;29:1;26::::0;19:12:::2;2:2;37991:181:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41::::0;34:12:::2;8:2;62:21:::0;;::::2;::::0;123:4:::2;114:14:::0;::::2;138:31:::0;;::::2;135:2;;;182:1;179::::0;172:12:::2;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359::::0;352:12:::2;230:2;373:25:::0;;-1:-1;37991:181:0;;421:4:-1::2;412:14:::0;;::::2;::::0;37991:181:0;::::2;::::0;::::2;::::0;412:14:-1;37991:181:0;23:1:-1::2;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::2;84:18:::0;71:11;;::::2;64:39:::0;52:2:::2;45:10;8:100;;;-1:-1:::0;;;;37991:181:0;;;::::2;;::::0;-1:-1:-1;;38257:8:0::2;::::0;38274:10:::2;::::0;38286;;37967:205;;-1:-1:-1;;;;;;38257:8:0;;::::2;::::0;:16:::2;::::0;-1:-1:-1;38274:10:0;::::2;::::0;-1:-1:-1;37967:205:0;;38294:1:::2;::::0;38286:10;::::2;;;;;;;;;;;38257:40;;;;;;;;;;;;;-1:-1:-1::0;;;;;38257:40:0::2;-1:-1:-1::0;;;;;38257:40:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::2;5:2;38257:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;38257:40:0;;;;30918:1;;;;;;36755:1550:::0;:::o;34707:728::-;34758:10;31008:16;:14;:16::i;:::-;30985:20;:39;31052:26;:24;:26::i;:::-;31035:14;:43;-1:-1:-1;;;;;31093:21:0;;;31089:157;;31150:15;31157:7;31150:6;:15::i;:::-;-1:-1:-1;;;;;31131:16:0;;;;;;:7;:16;;;;;;;;:34;;;;31214:20;;31180:22;:31;;;;;;:54;31089:157;30885:9:::1;;30866:15;:28;;30858:49;;;::::0;;-1:-1:-1;;;30858:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;34810:11:::0;34802:38:::2;;;::::0;;-1:-1:-1;;;34802:38:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;34851:19;34863:6;34851:11;:19::i;:::-;34957:14;;34932:21;34942:10;34932:9;:21::i;:::-;:39;;:93;;;-1:-1:-1::0;34994:9:0::2;::::0;:31:::2;::::0;29896:5:::2;34994:31;:13;:31;:::i;:::-;34975:15;:50;;34932:93;34910:161;;;::::0;;-1:-1:-1;;;34910:161:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;35177:10;35161:27;::::0;;;:15:::2;:27;::::0;;;;;:39:::2;::::0;35193:6;35161:39:::2;:31;:39;:::i;:::-;35147:10;35131:27;::::0;;;:15:::2;:27;::::0;;;;:69;35232:18:::2;::::0;:30:::2;::::0;35255:6;35232:30:::2;:22;:30;:::i;:::-;35211:18;:51:::0;35275:22:::2;35286:10;35275;:22::i;:::-;35365:10;::::0;:62:::2;::::0;-1:-1:-1;;;;;35365:10:0::2;35393;35413:4;35420:6:::0;35365:62:::2;:27;:62;:::i;29534:28::-:0;;;-1:-1:-1;;;;;29534:28:0;;:::o;30550:40::-;;;;:::o;29775:29::-;;;;:::o;32203:430::-;32250:7;32274:18;;32296:1;32274:23;32270:83;;;-1:-1:-1;32321:20:0;;32314:27;;32270:83;32383:242;32426:184;32591:18;;32426:138;32559:4;32426:106;32521:10;;32426:68;32479:14;;32426:26;:24;:26::i;:184::-;32383:20;;;:242;:24;:242;:::i;29811:35::-;;;;:::o;30317:52::-;;;;;;;;;;;;;:::o;29569:24::-;;;-1:-1:-1;;;;;29569:24:0;;:::o;36356:75::-;36392:31;36401:21;36411:10;36401:9;:21::i;:::-;36392:8;:31::i;:::-;36356:75::o;29709:27::-;;;;:::o;3046:244::-;2323:12;:10;:12::i;:::-;2313:6;;-1:-1:-1;;;;;2313:6:0;;;:22;;;2305:67;;;;;-1:-1:-1;;;2305:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3135:22:0;::::1;3127:73;;;;-1:-1:-1::0;;;3127:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3237:6;::::0;3216:38:::1;::::0;-1:-1:-1;;;;;3216:38:0;;::::1;::::0;3237:6:::1;::::0;3216:38:::1;::::0;3237:6:::1;::::0;3216:38:::1;3265:6;:17:::0;;;::::1;-1:-1:-1::0;;;;;3265:17:0;;;::::1;::::0;;;::::1;::::0;;3046:244::o;29439:25::-;;;-1:-1:-1;;;;;29439:25:0;;:::o;29853:48::-;29896:5;29853:48;:::o;10065:136::-;10123:7;10150:43;10154:1;10157;10150:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;10143:50;10065:136;-1:-1:-1;;;10065:136:0:o;10955:471::-;11013:7;11258:6;11254:47;;-1:-1:-1;11288:1:0;11281:8;;11254:47;11325:5;;;11329:1;11325;:5;:1;11349:5;;;;;:10;11341:56;;;;-1:-1:-1;;;11341:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11902:132;11960:7;11987:39;11991:1;11994;11987:39;;;;;;;;;;;;;;;;;:3;:39::i;9601:181::-;9659:7;9691:5;;;9715:6;;;;9707:46;;;;;-1:-1:-1;;;9707:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;40516:534;40625:7;40649:13;40645:398;;-1:-1:-1;40686:1:0;40679:8;;40645:398;40718:8;40730:1;40718:13;40714:329;;;40755:15;40768:1;40755:8;:1;40761;40755:8;:5;:8;:::i;:15::-;40748:22;;;;40714:329;40801:6;;:23;;;;-1:-1:-1;40811:13:0;;;40801:23;40797:246;;;-1:-1:-1;40848:1:0;40841:8;;40797:246;40891:9;40903:15;40916:1;40903:8;:1;40909;40903:8;:5;:8;:::i;:15::-;40891:27;-1:-1:-1;40950:1:0;40933:75;40957:8;40953:1;:12;40933:75;;;40993:15;41006:1;40993:8;:1;40999;40993:8;:5;:8;:::i;:15::-;40989:19;-1:-1:-1;40967:3:0;;40933:75;;;-1:-1:-1;41030:1:0;-1:-1:-1;40797:246:0;40516:534;;;;;;:::o;25789:242::-;25864:12;;:24;;25881:6;25864:24;:16;:24;:::i;:::-;25849:12;:39;;;25933:10;25923:21;;:9;:21;;;;;;:33;;25949:6;25923:33;:25;:33;:::i;:::-;25909:10;25899:21;;;;:9;:21;;;;;:57;-1:-1:-1;25789:242:0:o;38618:836::-;-1:-1:-1;;;;;38815:21:0;;;;;;:15;:21;;;;;;38792:18;;:45;;;:22;:45;:::i;:::-;38771:18;:66;38969:20;38965:278;;-1:-1:-1;;;;;39182:23:0;;;;;;:17;:23;;;;;;39162:69;;39227:3;;39162:60;;39182:39;;39227:3;;39182:30;;39210:1;39182:30;:27;:30;:::i;:39::-;39162:15;39172:4;39162:9;:15::i;:69::-;39144:87;;38965:278;-1:-1:-1;;;;;39297:21:0;;;;;;:15;:21;;;;;:39;;;39407:18;;:39;;39321:15;39407:39;:22;:39;:::i;:::-;39386:18;:60;-1:-1:-1;;38618:836:0:o;20758:177::-;20868:58;;;-1:-1:-1;;;;;20868:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20868:58:0;;;;;;;;25:18:-1;;61:17;;20868:58:0;182:15:-1;20891:23:0;179:29:-1;160:49;;20841:86:0;;20861:5;;20841:19;:86::i;:::-;20758:177;;;:::o;657:106::-;745:10;657:106;:::o;40020:259::-;40074:14;40091:12;40098:4;40091:6;:12::i;:::-;40074:29;-1:-1:-1;40118:11:0;;40114:158;;-1:-1:-1;;;;;40146:13:0;;40162:1;40146:13;;;:7;:13;;;;;;;;:17;;;;40183:24;;;;;;;;;;;;;;;;;40222:11;;:38;;-1:-1:-1;;;;;40222:11:0;40247:4;40253:6;40222:38;:24;:38;:::i;27722:106::-;27780:7;27811:1;27807;:5;:13;;27819:1;27807:13;;;-1:-1:-1;27815:1:0;;27722:106;-1:-1:-1;27722:106:0:o;39462:550::-;-1:-1:-1;;;;;39611:23:0;;;;;;:17;:23;;;;;;:30;;39639:1;39611:30;:27;:30;:::i;:::-;-1:-1:-1;;;;;39585:23:0;;;;;;:17;:23;;;;;:56;39654:50;39603:4;39688:15;39654:27;:50::i;:::-;39813:25;:15;39833:4;39813:25;:19;:25;:::i;:::-;-1:-1:-1;;;;;39783:27:0;;;;;;:21;:27;;;;;:55;39920:18;;:36;;39952:3;;39920:27;;39943:3;39920:27;:22;:27;:::i;:36::-;39899:18;:57;-1:-1:-1;;39989:15:0;39969:17;:35;39462:550::o;20943:205::-;21071:68;;;-1:-1:-1;;;;;21071:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21071:68:0;;;;;;;;25:18:-1;;61:17;;21071:68:0;182:15:-1;21094:27:0;179:29:-1;160:49;;21044:96:0;;21064:5;;21044:19;:96::i;:::-;20943:205;;;;:::o;25538:243::-;25610:12;;:24;;25627:6;25610:24;:16;:24;:::i;:::-;25595:12;:39;;;25679:10;25669:21;;:9;:21;;;;;;:33;;25695:6;25669:33;:25;:33;:::i;10504:192::-;10590:7;10626:12;10618:6;;;;10610:29;;;;-1:-1:-1;;;10610:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;10610:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10662:5:0;;;10504:192::o;12530:278::-;12616:7;12651:12;12644:5;12636:28;;;;-1:-1:-1;;;12636:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;12636:28:0;;12675:9;12691:1;12687;:5;;;;;;;12530:278;-1:-1:-1;;;;;12530:278:0:o;23063:761::-;23487:23;23513:69;23541:4;23513:69;;;;;;;;;;;;;;;;;23521:5;-1:-1:-1;;;;;23513:27:0;;;:69;;;;;:::i;:::-;23597:17;;23487:95;;-1:-1:-1;23597:21:0;23593:224;;23739:10;23728:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23728:30:0;23720:85;;;;-1:-1:-1;;;23720:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17741:196;17844:12;17876:53;17899:6;17907:4;17913:1;17916:12;19248;19281:18;19292:6;19281:10;:18::i;:::-;19273:60;;;;;-1:-1:-1;;;19273:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19407:12;19421:23;19448:6;-1:-1:-1;;;;;19448:11:0;19468:8;19479:4;19448:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;19448:36:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;19406:78:0;;;;19499:7;19495:595;;;19530:10;-1:-1:-1;19523:17:0;;-1:-1:-1;19523:17:0;19495:595;19644:17;;:21;19640:439;;19907:10;19901:17;19968:15;19955:10;19951:2;19947:19;19940:44;19855:148;20043:20;;-1:-1:-1;;;20043:20:0;;;;;;;;;;;;;;;;;20050:12;;20043:20;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;14823:422:0;15190:20;15229:8;;;14823:422::o;21417:622::-;21787:10;;;21786:62;;-1:-1:-1;21803:39:0;;;;;;21827:4;21803:39;;;;-1:-1:-1;;;;;21803:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;21803:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21803:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21803:39:0;:44;21786:62;21778:152;;;;-1:-1:-1;;;21778:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21968:62;;;-1:-1:-1;;;;;21968:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21968:62:0;;;;;;;;25:18:-1;;61:17;;21968:62:0;182:15:-1;21991:22:0;179:29:-1;160:49;;21941:90:0;;21961:5;;21941:19;:90::i
Swarm Source
ipfs://aebec683234a84bf28a4adda222f1321f0a7516c674bc019cfad5a10313c4a2c
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.