More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,933 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Direct Withdraw | 18968314 | 177 days ago | IN | 0 ETH | 0.00325473 | ||||
Direct Withdraw | 18949418 | 179 days ago | IN | 0 ETH | 0.00383755 | ||||
Direct Withdraw | 18909695 | 185 days ago | IN | 0 ETH | 0.00205146 | ||||
Release | 18553125 | 235 days ago | IN | 0 ETH | 0.00852078 | ||||
Release | 18553118 | 235 days ago | IN | 0 ETH | 0.01089225 | ||||
Direct Withdraw | 18016506 | 310 days ago | IN | 0 ETH | 0.00347246 | ||||
Direct Withdraw | 17653767 | 361 days ago | IN | 0 ETH | 0.00249867 | ||||
Direct Withdraw | 16913649 | 465 days ago | IN | 0 ETH | 0.00373093 | ||||
Direct Withdraw | 16890558 | 468 days ago | IN | 0 ETH | 0.0033411 | ||||
Direct Withdraw | 16858438 | 473 days ago | IN | 0 ETH | 0.00280215 | ||||
Direct Withdraw | 16805494 | 480 days ago | IN | 0 ETH | 0.01065291 | ||||
Direct Withdraw | 16679613 | 498 days ago | IN | 0 ETH | 0.00878505 | ||||
Direct Withdraw | 16597592 | 509 days ago | IN | 0 ETH | 0.00394333 | ||||
Direct Withdraw | 16515390 | 521 days ago | IN | 0 ETH | 0.00357433 | ||||
Direct Withdraw | 16067196 | 584 days ago | IN | 0 ETH | 0.00195439 | ||||
Direct Withdraw | 16060401 | 585 days ago | IN | 0 ETH | 0.00214691 | ||||
Direct Withdraw | 15823761 | 618 days ago | IN | 0 ETH | 0.00219914 | ||||
Direct Withdraw | 15609827 | 647 days ago | IN | 0 ETH | 0.00107275 | ||||
Direct Withdraw | 15568679 | 653 days ago | IN | 0 ETH | 0.00175197 | ||||
Direct Withdraw | 15566106 | 654 days ago | IN | 0 ETH | 0.00095665 | ||||
Direct Withdraw | 15535961 | 658 days ago | IN | 0 ETH | 0.00424952 | ||||
Direct Withdraw | 15499278 | 664 days ago | IN | 0 ETH | 0.00696858 | ||||
Direct Withdraw | 15461384 | 670 days ago | IN | 0 ETH | 0.00283605 | ||||
Direct Withdraw | 15461381 | 670 days ago | IN | 0 ETH | 0.00173944 | ||||
Direct Withdraw | 15190172 | 713 days ago | IN | 0 ETH | 0.00166996 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
12373822 | 1155 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
MLP
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-05 */ // SPDX-License-Identifier: MIT pragma solidity >=0.6.6; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } /* * @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. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer {} 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; } uint256[50] private __gap; } /** * @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 OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { 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; } uint256[49] private __gap; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } } library UniswapV2Library { using SafeMath for uint256; // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "UniswapV2Library: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "UniswapV2Library: ZERO_ADDRESS"); } // calculates the CREATE2 address for a pair without making any external calls function pairFor( address factory, address tokenA, address tokenB ) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address( uint256( keccak256( abi.encodePacked( hex"ff", factory, keccak256(abi.encodePacked(token0, token1)), hex"96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f" // init code hash ) ) ) ); } // fetches and sorts the reserves for a pair function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) internal pure returns (uint256 amountB) { require(amountA > 0, "UniswapV2Library: INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY"); amountB = amountA.mul(reserveB) / reserveA; } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountOut) { require(amountIn > 0, "UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY"); uint256 amountInWithFee = amountIn.mul(997); uint256 numerator = amountInWithFee.mul(reserveOut); uint256 denominator = reserveIn.mul(1000).add(amountInWithFee); amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountIn) { require(amountOut > 0, "UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY"); uint256 numerator = reserveIn.mul(amountOut).mul(1000); uint256 denominator = reserveOut.sub(amountOut).mul(997); amountIn = (numerator / denominator).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint256 amountIn, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "UniswapV2Library: INVALID_PATH"); amounts = new uint256[](path.length); amounts[0] = amountIn; for (uint256 i; i < path.length - 1; i++) { (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut); } } // performs chained getAmountIn calculations on any number of pairs function getAmountsIn( address factory, uint256 amountOut, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "UniswapV2Library: INVALID_PATH"); amounts = new uint256[](path.length); amounts[amounts.length - 1] = amountOut; for (uint256 i = path.length - 1; i > 0; i--) { (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } /** * @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); } /** * @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); } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // 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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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); _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"); } } } abstract contract IMlp { function makeOffer( address _token, uint256 _amount, uint256 _unlockDate, uint256 _endDate, uint256 _slippageTolerancePpm, uint256 _maxPriceVariationPpm ) external virtual returns (uint256 offerId); function takeOffer( uint256 _pendingOfferId, uint256 _amount, uint256 _deadline ) external virtual returns (uint256 activeOfferId); function cancelOffer(uint256 _offerId) external virtual; function release(uint256 _offerId, uint256 _deadline) external virtual; } abstract contract IFeesController { function feesTo() public virtual returns (address); function setFeesTo(address) public virtual; function feesPpm() public virtual returns (uint256); function setFeesPpm(uint256) public virtual; } abstract contract IRewardManager { function add(uint256 _allocPoint, address _newMlp) public virtual; function notifyDeposit(address _account, uint256 _amount) public virtual; function notifyWithdraw(address _account, uint256 _amount) public virtual; function getPoolSupply(address pool) public view virtual returns (uint256); function getUserAmount(address pool, address user) public view virtual returns (uint256); } contract MLP is IMlp { using SafeERC20 for IERC20; using SafeMath for uint256; uint256 public endDate; address public submitter; uint256 public exceedingLiquidity; uint256 public bonusToken0; uint256 public reward0Rate; uint256 public reward0PerTokenStored; uint256 public bonusToken1; uint256 public reward1Rate; uint256 public reward1PerTokenStored; uint256 public lastUpdateTime; uint256 public pendingOfferCount; uint256 public activeOfferCount; IRewardManager public rewardManager; IUniswapV2Pair public uniswapPair; IFeesController public feesController; IUniswapV2Router02 public uniswapRouter; mapping(address => uint256) public userReward0PerTokenPaid; mapping(address => uint256) public userRewards0; mapping(address => uint256) public userReward1PerTokenPaid; mapping(address => uint256) public userRewards1; mapping(address => uint256) public directStakeBalances; mapping(uint256 => PendingOffer) public getPendingOffer; mapping(uint256 => ActiveOffer) public getActiveOffer; enum OfferStatus {PENDING, TAKEN, CANCELED} event OfferMade(uint256 id); event OfferTaken(uint256 pendingOfferId, uint256 activeOfferId); event OfferCanceled(uint256 id); event OfferReleased(uint256 offerId); struct PendingOffer { address owner; address token; uint256 amount; uint256 unlockDate; uint256 endDate; OfferStatus status; uint256 slippageTolerancePpm; uint256 maxPriceVariationPpm; } struct ActiveOffer { address user0; uint256 originalAmount0; address user1; uint256 originalAmount1; uint256 unlockDate; uint256 liquidity; bool released; uint256 maxPriceVariationPpm; } constructor( address _uniswapPair, address _submitter, uint256 _endDate, address _uniswapRouter, address _feesController, IRewardManager _rewardManager, uint256 _bonusToken0, uint256 _bonusToken1 ) public { feesController = IFeesController(_feesController); uniswapPair = IUniswapV2Pair(_uniswapPair); endDate = _endDate; submitter = _submitter; uniswapRouter = IUniswapV2Router02(_uniswapRouter); rewardManager = _rewardManager; uint256 remainingTime = _endDate.sub(block.timestamp); bonusToken0 = _bonusToken0; reward0Rate = _bonusToken0 / remainingTime; bonusToken1 = _bonusToken1; reward1Rate = _bonusToken1 / remainingTime; lastUpdateTime = block.timestamp; } function lastTimeRewardApplicable() public view returns (uint256) { return Math.min(block.timestamp, endDate); } function reward0PerToken() public view returns (uint256) { uint256 totalSupply = rewardManager.getPoolSupply(address(this)); if (totalSupply == 0) { return reward0PerTokenStored; } return reward0PerTokenStored.add(lastTimeRewardApplicable().sub(lastUpdateTime).mul(reward0Rate).mul(1e18) / totalSupply); } function reward1PerToken() public view returns (uint256) { uint256 totalSupply = rewardManager.getPoolSupply(address(this)); if (totalSupply == 0) { return reward1PerTokenStored; } return reward1PerTokenStored.add(lastTimeRewardApplicable().sub(lastUpdateTime).mul(reward1Rate).mul(1e18) / totalSupply); } function rewardEarned(address account) public view returns (uint256 reward0Earned, uint256 reward1Earned) { uint256 balance = rewardManager.getUserAmount(address(this), account); reward0Earned = (balance.mul(reward0PerToken().sub(userReward0PerTokenPaid[account])) / 1e18).add(userRewards0[account]); reward1Earned = (balance.mul(reward1PerToken().sub(userReward1PerTokenPaid[account])) / 1e18).add(userRewards1[account]); } function updateRewards(address account) internal { reward0PerTokenStored = reward0PerToken(); reward1PerTokenStored = reward1PerToken(); lastUpdateTime = lastTimeRewardApplicable(); if (account != address(0)) { (uint256 earned0, uint256 earned1) = rewardEarned(account); userRewards0[account] = earned0; userRewards1[account] = earned1; userReward0PerTokenPaid[account] = reward0PerTokenStored; userReward1PerTokenPaid[account] = reward1PerTokenStored; } } function payRewards(address account) public { updateRewards(account); (uint256 reward0, uint256 reward1) = rewardEarned(account); if (reward0 > 0) { userRewards0[account] = 0; IERC20(uniswapPair.token0()).safeTransfer(account, reward0); } if (reward1 > 0) { userRewards1[account] = 0; IERC20(uniswapPair.token1()).safeTransfer(account, reward1); } } function _notifyDeposit(address account, uint256 amount) internal { updateRewards(account); rewardManager.notifyDeposit(account, amount); } function _notifyWithdraw(address account, uint256 amount) internal { updateRewards(account); rewardManager.notifyWithdraw(account, amount); } function makeOffer( address _token, uint256 _amount, uint256 _unlockDate, uint256 _endDate, uint256 _slippageTolerancePpm, uint256 _maxPriceVariationPpm ) external override returns (uint256 offerId) { require(_amount > 0); require(_endDate > now); require(_endDate <= _unlockDate); offerId = pendingOfferCount; pendingOfferCount++; getPendingOffer[offerId] = PendingOffer( msg.sender, _token, _amount, _unlockDate, _endDate, OfferStatus.PENDING, _slippageTolerancePpm, _maxPriceVariationPpm ); IERC20 token; if (_token == address(uniswapPair.token0())) { token = IERC20(uniswapPair.token0()); } else if (_token == address(uniswapPair.token1())) { token = IERC20(uniswapPair.token1()); } else { require(false, "unknown token"); } token.safeTransferFrom(msg.sender, address(this), _amount); emit OfferMade(offerId); } struct ProviderInfo { address user; uint256 amount; IERC20 token; } struct OfferInfo { uint256 deadline; uint256 slippageTolerancePpm; } function takeOffer( uint256 _pendingOfferId, uint256 _amount, uint256 _deadline ) external override returns (uint256 activeOfferId) { PendingOffer storage pendingOffer = getPendingOffer[_pendingOfferId]; require(pendingOffer.status == OfferStatus.PENDING); require(pendingOffer.endDate > now); pendingOffer.status = OfferStatus.TAKEN; // Sort the users, tokens, and amount ProviderInfo memory provider0; ProviderInfo memory provider1; { if (pendingOffer.token == uniswapPair.token0()) { provider0 = ProviderInfo(pendingOffer.owner, pendingOffer.amount, IERC20(uniswapPair.token0())); provider1 = ProviderInfo(msg.sender, _amount, IERC20(uniswapPair.token1())); provider1.token.safeTransferFrom(provider1.user, address(this), provider1.amount); } else { provider0 = ProviderInfo(msg.sender, _amount, IERC20(uniswapPair.token0())); provider1 = ProviderInfo(pendingOffer.owner, pendingOffer.amount, IERC20(uniswapPair.token1())); provider0.token.safeTransferFrom(provider0.user, address(this), provider0.amount); } } // calculate fees uint256 feesAmount0 = provider0.amount.mul(feesController.feesPpm()) / 1000; uint256 feesAmount1 = provider1.amount.mul(feesController.feesPpm()) / 1000; // take fees provider0.amount = provider0.amount.sub(feesAmount0); provider1.amount = provider1.amount.sub(feesAmount1); // send fees provider0.token.safeTransfer(feesController.feesTo(), feesAmount0); provider1.token.safeTransfer(feesController.feesTo(), feesAmount1); uint256 spentAmount0; uint256 spentAmount1; uint256 liquidity; uint256[] memory returnedValues = new uint256[](3); // send tokens to uniswap { returnedValues = _provideLiquidity(provider0, provider1, OfferInfo(_deadline, pendingOffer.slippageTolerancePpm)); liquidity = returnedValues[0]; spentAmount0 = returnedValues[1]; spentAmount1 = returnedValues[2]; } // stake liquidity _notifyDeposit(provider0.user, liquidity / 2); _notifyDeposit(provider1.user, liquidity / 2); if (liquidity % 2 != 0) { exceedingLiquidity = exceedingLiquidity.add(1); } // Record the active offer activeOfferId = activeOfferCount; activeOfferCount++; getActiveOffer[activeOfferId] = ActiveOffer( provider0.user, spentAmount0, provider1.user, spentAmount1, pendingOffer.unlockDate, liquidity, false, pendingOffer.maxPriceVariationPpm ); emit OfferTaken(_pendingOfferId, activeOfferId); return activeOfferId; } function _provideLiquidity( ProviderInfo memory _provider0, ProviderInfo memory _provider1, OfferInfo memory _info ) internal returns (uint256[] memory) { _provider0.token.safeApprove(address(uniswapRouter), 0); _provider1.token.safeApprove(address(uniswapRouter), 0); _provider0.token.safeApprove(address(uniswapRouter), _provider0.amount); _provider1.token.safeApprove(address(uniswapRouter), _provider1.amount); uint256 amountMin0 = _provider0.amount.sub(_provider0.amount.mul(_info.slippageTolerancePpm) / 1000); uint256 amountMin1 = _provider1.amount.sub(_provider1.amount.mul(_info.slippageTolerancePpm) / 1000); // Add the liquidity to Uniswap uint256 spentAmount0; uint256 spentAmount1; uint256 liquidity; { (spentAmount0, spentAmount1, liquidity) = uniswapRouter.addLiquidity( address(_provider0.token), address(_provider1.token), _provider0.amount, _provider1.amount, amountMin0, amountMin1, address(this), _info.deadline ); } // Give back the exceeding tokens if (spentAmount0 < _provider0.amount) { _provider0.token.safeTransfer(_provider0.user, _provider0.amount - spentAmount0); } if (spentAmount1 < _provider1.amount) { _provider1.token.safeTransfer(_provider1.user, _provider1.amount - spentAmount1); } uint256[] memory liq = new uint256[](3); liq[0] = liquidity; liq[1] = spentAmount0; liq[2] = spentAmount1; return (liq); } function cancelOffer(uint256 _offerId) external override { PendingOffer storage pendingOffer = getPendingOffer[_offerId]; require(pendingOffer.status == OfferStatus.PENDING); pendingOffer.status = OfferStatus.CANCELED; IERC20(pendingOffer.token).safeTransfer(pendingOffer.owner, pendingOffer.amount); emit OfferCanceled(_offerId); } function release(uint256 _offerId, uint256 _deadline) external override { ActiveOffer storage offer = getActiveOffer[_offerId]; require(msg.sender == offer.user0 || msg.sender == offer.user1, "unauthorized"); require(now > offer.unlockDate, "locked"); require(!offer.released, "already released"); offer.released = true; IERC20 token0 = IERC20(uniswapPair.token0()); IERC20 token1 = IERC20(uniswapPair.token1()); IERC20(address(uniswapPair)).safeApprove(address(uniswapRouter), 0); IERC20(address(uniswapPair)).safeApprove(address(uniswapRouter), offer.liquidity); (uint256 amount0, uint256 amount1) = uniswapRouter.removeLiquidity(address(token0), address(token1), offer.liquidity, 0, 0, address(this), _deadline); _notifyWithdraw(offer.user0, offer.liquidity / 2); _notifyWithdraw(offer.user1, offer.liquidity / 2); if (_getPriceVariation(offer.originalAmount0, amount0) > offer.maxPriceVariationPpm) { if (amount0 > offer.originalAmount0) { uint256 toSwap = amount0.sub(offer.originalAmount0); address[] memory path = new address[](2); path[0] = uniswapPair.token0(); path[1] = uniswapPair.token1(); token0.safeApprove(address(uniswapRouter), 0); token0.safeApprove(address(uniswapRouter), toSwap); uint256[] memory newAmounts = uniswapRouter.swapExactTokensForTokens(toSwap, 0, path, address(this), _deadline); amount0 = amount0.sub(toSwap); amount1 = amount1.add(newAmounts[1]); } } if (_getPriceVariation(offer.originalAmount1, amount1) > offer.maxPriceVariationPpm) { if (amount1 > offer.originalAmount1) { uint256 toSwap = amount1.sub(offer.originalAmount1); address[] memory path = new address[](2); path[0] = uniswapPair.token1(); path[1] = uniswapPair.token0(); token1.safeApprove(address(uniswapRouter), 0); token1.safeApprove(address(uniswapRouter), toSwap); uint256[] memory newAmounts = uniswapRouter.swapExactTokensForTokens(toSwap, 0, path, address(this), _deadline); amount1 = amount1.sub(toSwap); amount0 = amount0.add(newAmounts[1]); } } token0.safeTransfer(offer.user0, amount0); payRewards(offer.user0); token1.safeTransfer(offer.user1, amount1); payRewards(offer.user1); emit OfferReleased(_offerId); } function _getPriceVariation(uint256 a, uint256 b) internal pure returns (uint256) { uint256 sub; if (a > b) { sub = a.sub(b); return sub.mul(1000) / a; } else { sub = b.sub(a); return sub.mul(1000) / b; } } function directStake(uint256 _amount) external { require(_amount > 0, "cannot stake 0"); _notifyDeposit(msg.sender, _amount); directStakeBalances[msg.sender] = directStakeBalances[msg.sender].add(_amount); IERC20(address(uniswapPair)).safeTransferFrom(msg.sender, address(this), _amount); } function directWithdraw(uint256 _amount) external { require(_amount > 0, "cannot withdraw 0"); _notifyWithdraw(msg.sender, _amount); directStakeBalances[msg.sender] = directStakeBalances[msg.sender].sub(_amount); IERC20(address(uniswapPair)).safeTransfer(msg.sender, _amount); } function transferExceedingLiquidity() external { require(exceedingLiquidity != 0); IERC20(address(uniswapPair)).safeTransfer(feesController.feesTo(), exceedingLiquidity); exceedingLiquidity = 0; } } abstract contract IMintableERC20 is IERC20 { function mint(uint256 amount) public virtual; function mintTo(address account, uint256 amount) public virtual; function burn(uint256 amount) public virtual; function setMinter(address account, bool isMinter) public virtual; } abstract contract IPopMarketplace { function submitMlp( address _token0, address _token1, uint256 _liquidity, uint256 _endDate, uint256 _bonusToken0, uint256 _bonusToken1 ) public virtual returns (uint256); function endMlp(uint256 _mlpId) public virtual returns (uint256); function cancelMlp(uint256 _mlpId) public virtual; } contract PopMarketplace is IFeesController, IPopMarketplace, Initializable, OwnableUpgradeSafe { using SafeERC20 for IERC20; address public uniswapFactory; address public uniswapRouter; address[] public allMlp; address private _feesTo = msg.sender; uint256 private _feesPpm; uint256 public pendingMlpCount; IRewardManager public rewardManager; IMintableERC20 public popToken; mapping(uint256 => PendingMlp) public getMlp; enum MlpStatus {PENDING, APPROVED, CANCELED, ENDED} struct PendingMlp { address uniswapPair; address submitter; uint256 liquidity; uint256 endDate; MlpStatus status; uint256 bonusToken0; uint256 bonusToken1; } event MlpCreated(uint256 id, address indexed mlp); event MlpSubmitted(uint256 id); event MlpCanceled(uint256 id); event ChangeFeesPpm(uint256 id); event ChangeFeesTo(address indexed feeTo); event MlpEnded(uint256 id); function initialize( address _popToken, address _uniswapFactory, address _uniswapRouter, address _rewardManager ) public initializer { OwnableUpgradeSafe.__Ownable_init(); popToken = IMintableERC20(_popToken); uniswapFactory = _uniswapFactory; uniswapRouter = _uniswapRouter; rewardManager = IRewardManager(_rewardManager); } function submitMlp( address _token0, address _token1, uint256 _liquidity, uint256 _endDate, uint256 _bonusToken0, uint256 _bonusToken1 ) public override returns (uint256) { require(_endDate > now, "!datenow"); IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.pairFor(uniswapFactory, _token0, _token1)); require(address(pair) != address(0), "!address0"); if (_liquidity > 0) { IERC20(address(pair)).safeTransferFrom(msg.sender, address(this), _liquidity); } if (_bonusToken0 > 0) { IERC20(_token0).safeTransferFrom(msg.sender, address(this), _bonusToken0); } if (_bonusToken1 > 0) { IERC20(_token1).safeTransferFrom(msg.sender, address(this), _bonusToken1); } if (_token0 != pair.token0()) { uint256 tmp = _bonusToken0; _bonusToken0 = _bonusToken1; _bonusToken1 = tmp; } getMlp[pendingMlpCount++] = PendingMlp({ uniswapPair: address(pair), submitter: msg.sender, liquidity: _liquidity, endDate: _endDate, status: MlpStatus.PENDING, bonusToken0: _bonusToken0, bonusToken1: _bonusToken1 }); uint256 mlpId = pendingMlpCount - 1; emit MlpSubmitted(mlpId); return mlpId; } function approveMlp(uint256 _mlpId, uint256 _allocPoint) external onlyOwner() returns (address mlpAddress) { PendingMlp storage pendingMlp = getMlp[_mlpId]; require(pendingMlp.status == MlpStatus.PENDING); MLP newMlp = new MLP( pendingMlp.uniswapPair, pendingMlp.submitter, pendingMlp.endDate, uniswapRouter, address(this), rewardManager, pendingMlp.bonusToken0, pendingMlp.bonusToken1 ); mlpAddress = address(newMlp); rewardManager.add(_allocPoint, mlpAddress); allMlp.push(mlpAddress); IERC20(IUniswapV2Pair(pendingMlp.uniswapPair).token0()).safeTransfer(mlpAddress, pendingMlp.bonusToken0); IERC20(IUniswapV2Pair(pendingMlp.uniswapPair).token1()).safeTransfer(mlpAddress, pendingMlp.bonusToken1); pendingMlp.status = MlpStatus.APPROVED; emit MlpCreated(_mlpId, mlpAddress); return mlpAddress; } function cancelMlp(uint256 _mlpId) public override { PendingMlp storage pendingMlp = getMlp[_mlpId]; require(pendingMlp.submitter == msg.sender, "!submitter"); require(pendingMlp.status == MlpStatus.PENDING, "!pending"); if (pendingMlp.liquidity > 0) { IUniswapV2Pair pair = IUniswapV2Pair(pendingMlp.uniswapPair); IERC20(address(pair)).safeTransfer(pendingMlp.submitter, pendingMlp.liquidity); } if (pendingMlp.bonusToken0 > 0) { IERC20(IUniswapV2Pair(pendingMlp.uniswapPair).token0()).safeTransfer(pendingMlp.submitter, pendingMlp.bonusToken0); } if (pendingMlp.bonusToken1 > 0) { IERC20(IUniswapV2Pair(pendingMlp.uniswapPair).token1()).safeTransfer(pendingMlp.submitter, pendingMlp.bonusToken1); } pendingMlp.status = MlpStatus.CANCELED; emit MlpCanceled(_mlpId); } function setFeesTo(address _newFeesTo) public override onlyOwner { require(_newFeesTo != address(0), "!address0"); _feesTo = _newFeesTo; emit ChangeFeesTo(_newFeesTo); } function feesTo() public override returns (address) { return _feesTo; } function feesPpm() public override returns (uint256) { return _feesPpm; } function setFeesPpm(uint256 _newFeesPpm) public override onlyOwner { require(_newFeesPpm > 0, "!<0"); _feesPpm = _newFeesPpm; emit ChangeFeesPpm(_newFeesPpm); } function endMlp(uint256 _mlpId) public override returns (uint256) { PendingMlp storage pendingMlp = getMlp[_mlpId]; require(pendingMlp.submitter == msg.sender, "!submitter"); require(pendingMlp.status == MlpStatus.APPROVED, "!approved"); require(block.timestamp >= pendingMlp.endDate, "not yet ended"); if (pendingMlp.liquidity > 0) { IUniswapV2Pair pair = IUniswapV2Pair(pendingMlp.uniswapPair); IERC20(address(pair)).safeTransfer(pendingMlp.submitter, pendingMlp.liquidity); } pendingMlp.status = MlpStatus.ENDED; emit MlpEnded(_mlpId); return pendingMlp.liquidity; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_uniswapPair","type":"address"},{"internalType":"address","name":"_submitter","type":"address"},{"internalType":"uint256","name":"_endDate","type":"uint256"},{"internalType":"address","name":"_uniswapRouter","type":"address"},{"internalType":"address","name":"_feesController","type":"address"},{"internalType":"contract IRewardManager","name":"_rewardManager","type":"address"},{"internalType":"uint256","name":"_bonusToken0","type":"uint256"},{"internalType":"uint256","name":"_bonusToken1","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"OfferCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"OfferMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"OfferReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pendingOfferId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"activeOfferId","type":"uint256"}],"name":"OfferTaken","type":"event"},{"inputs":[],"name":"activeOfferCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusToken0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusToken1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offerId","type":"uint256"}],"name":"cancelOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"directStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"directStakeBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"directWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exceedingLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesController","outputs":[{"internalType":"contract IFeesController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getActiveOffer","outputs":[{"internalType":"address","name":"user0","type":"address"},{"internalType":"uint256","name":"originalAmount0","type":"uint256"},{"internalType":"address","name":"user1","type":"address"},{"internalType":"uint256","name":"originalAmount1","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bool","name":"released","type":"bool"},{"internalType":"uint256","name":"maxPriceVariationPpm","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getPendingOffer","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"enum MLP.OfferStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"slippageTolerancePpm","type":"uint256"},{"internalType":"uint256","name":"maxPriceVariationPpm","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":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_unlockDate","type":"uint256"},{"internalType":"uint256","name":"_endDate","type":"uint256"},{"internalType":"uint256","name":"_slippageTolerancePpm","type":"uint256"},{"internalType":"uint256","name":"_maxPriceVariationPpm","type":"uint256"}],"name":"makeOffer","outputs":[{"internalType":"uint256","name":"offerId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"payRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingOfferCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offerId","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reward0PerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward0PerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward0Rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward1PerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward1PerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward1Rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"rewardEarned","outputs":[{"internalType":"uint256","name":"reward0Earned","type":"uint256"},{"internalType":"uint256","name":"reward1Earned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardManager","outputs":[{"internalType":"contract IRewardManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"submitter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pendingOfferId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"takeOffer","outputs":[{"internalType":"uint256","name":"activeOfferId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferExceedingLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userReward0PerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userReward1PerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewards0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewards1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620035283803806200352883398181016040526101008110156200003857600080fd5b50805160208083015160408401516060850151608086015160a087015160c088015160e090980151600e80546001600160a01b03199081166001600160a01b0380871691909117909255600d80548216838c161790556000878155600180548316848b16179055600f80548316848916179055600c8054909216928516929092179055979895979496939592949193909190620000e290889042906200011e811b620027a117901c565b60038490559050808381620000f357fe5b0460045560068290558082816200010657fe5b04600755505042600955506200017d95505050505050565b8082038281111562000177576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b92915050565b61339b806200018d6000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c80638244bd1511610145578063c816841b116100bd578063ef706adf1161008c578063f8dd7c1011610071578063f8dd7c10146105d7578063fa42d8c2146105df578063fabc5a561461060857610241565b8063ef706adf146105b2578063f7e45bc7146105cf57610241565b8063c816841b14610574578063c8f33c911461057c578063e1550fde14610584578063e8f62764146105aa57610241565b80639fc26c3a11610114578063a25b6b0d116100f9578063a25b6b0d1461055c578063c24a0f8b14610564578063c6dbfb8a1461056c57610241565b80639fc26c3a1461052e578063a08363ea1461055457610241565b80638244bd15146104f957806383d490291461051657806387dcec951461051e5780638dc45d9a1461052657610241565b806336e707e8116101d85780636d4af7e9116101a757806377322c371161018c57806377322c37146104e15780637eea237a146104e957806380faa57d146104f157610241565b80636d4af7e914610495578063735de9f7146104d957610241565b806336e707e8146103ab5780633903cc72146103d157806341655ee51461045257806364b3e1531461046f57610241565b806310facdd01161021457806310facdd0146102fb57806316ba6bf314610321578063202e909f14610360578063366a41201461038657610241565b806303a28f4c146102465780630e518506146102605780630eaf1036146102cf5780630f4ef8a6146102d7575b600080fd5b61024e610610565b60408051918252519081900360200190f35b61027d6004803603602081101561027657600080fd5b5035610616565b604080516001600160a01b03998a168152602081019890985295909716868601526060860193909352608085019190915260a0840152151560c083015260e08201929092529051908190036101000190f35b61024e61066b565b6102df610671565b604080516001600160a01b039092168252519081900360200190f35b61024e6004803603602081101561031157600080fd5b50356001600160a01b0316610680565b6103476004803603602081101561033757600080fd5b50356001600160a01b0316610692565b6040805192835260208301919091528051918290030190f35b61024e6004803603602081101561037657600080fd5b50356001600160a01b03166107df565b6103a96004803603604081101561039c57600080fd5b50803590602001356107f1565b005b61024e600480360360208110156103c157600080fd5b50356001600160a01b0316611404565b6103ee600480360360208110156103e757600080fd5b5035611416565b60405180896001600160a01b03168152602001886001600160a01b0316815260200187815260200186815260200185815260200184600281111561042e57fe5b81526020018381526020018281526020019850505050505050505060405180910390f35b6103a96004803603602081101561046857600080fd5b503561146a565b6103a96004803603602081101561048557600080fd5b50356001600160a01b0316611513565b61024e600480360360c08110156104ab57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a00135611668565b6102df611a50565b61024e611a5f565b61024e611b48565b61024e611b4e565b6103a96004803603602081101561050f57600080fd5b5035611b61565b61024e611c06565b61024e611c0c565b6102df611c12565b61024e6004803603602081101561054457600080fd5b50356001600160a01b0316611c21565b61024e611c33565b6103a9611c39565b61024e611cef565b61024e611cf5565b6102df611cfb565b61024e611d0a565b61024e6004803603602081101561059a57600080fd5b50356001600160a01b0316611d10565b6102df611d22565b6103a9600480360360208110156105c857600080fd5b5035611d31565b61024e611de7565b61024e611ded565b61024e600480360360608110156105f557600080fd5b5080359060208101359060400135611ec9565b61024e61279b565b60055481565b601660205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b039687169795969094169492939192909160ff9091169088565b60045481565b600c546001600160a01b031681565b60136020526000908152604090205481565b600c54604080517f9f1916590000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038481166024830152915160009384938493911691639f19165991604480820192602092909190829003018186803b15801561070457600080fd5b505afa158015610718573d6000803e3d6000fd5b505050506040513d602081101561072e57600080fd5b50516001600160a01b03851660009081526011602090815260408083205460109092529091205491925061079191670de0b6b3a7640000906107839061077c90610776611a5f565b906127a1565b85906127ff565b8161078a57fe5b049061286b565b6001600160a01b0385166000908152601360209081526040808320546012909252909120549194506107d791670de0b6b3a7640000906107839061077c90610776611ded565b915050915091565b60126020526000908152604090205481565b600082815260166020526040902080546001600160a01b0316331480610823575060028101546001600160a01b031633145b610874576040805162461bcd60e51b815260206004820152600c60248201527f756e617574686f72697a65640000000000000000000000000000000000000000604482015290519081900360640190fd5b806004015442116108cc576040805162461bcd60e51b815260206004820152600660248201527f6c6f636b65640000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600681015460ff1615610926576040805162461bcd60e51b815260206004820152601060248201527f616c72656164792072656c656173656400000000000000000000000000000000604482015290519081900360640190fd5b6006810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600d54604080517f0dfe168100000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691630dfe1681916004808301926020929190829003018186803b1580156109b157600080fd5b505afa1580156109c5573d6000803e3d6000fd5b505050506040513d60208110156109db57600080fd5b5051600d54604080517fd21220a700000000000000000000000000000000000000000000000000000000815290519293506000926001600160a01b039092169163d21220a791600480820192602092909190829003018186803b158015610a4157600080fd5b505afa158015610a55573d6000803e3d6000fd5b505050506040513d6020811015610a6b57600080fd5b5051600f54600d54919250610a8e916001600160a01b03908116911660006128c3565b600f546005840154600d54610ab1926001600160a01b03918216929116906128c3565b600f546005840154604080517fbaa2abde0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015285811660248301526044820193909352600060648201819052608482018190523060a483015260c48201899052825190948594169263baa2abde9260e4808201939182900301818787803b158015610b4757600080fd5b505af1158015610b5b573d6000803e3d6000fd5b505050506040513d6040811015610b7157600080fd5b50805160209091015186546005880154929450909250610ba1916001600160a01b03909116906002905b04612a1d565b6002808601546005870154610bc2926001600160a01b039092169190610b9b565b8460070154610bd5866001015484612ab0565b1115610f95578460010154821115610f95576000610c008660010154846127a190919063ffffffff16565b6040805160028082526060808301845293945090916020830190803683375050600d54604080517f0dfe168100000000000000000000000000000000000000000000000000000000815290519394506001600160a01b0390911692630dfe168192506004808301926020929190829003018186803b158015610c8157600080fd5b505afa158015610c95573d6000803e3d6000fd5b505050506040513d6020811015610cab57600080fd5b505181518290600090610cba57fe5b6001600160a01b03928316602091820292909201810191909152600d54604080517fd21220a70000000000000000000000000000000000000000000000000000000081529051919093169263d21220a7926004808301939192829003018186803b158015610d2757600080fd5b505afa158015610d3b573d6000803e3d6000fd5b505050506040513d6020811015610d5157600080fd5b5051815182906001908110610d6257fe5b6001600160a01b039283166020918202929092010152600f54610d8b91888116911660006128c3565b600f54610da5906001600160a01b038881169116846128c3565b6060600f60009054906101000a90046001600160a01b03166001600160a01b03166338ed173984600085308e6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610e41578181015183820152602001610e29565b505050509050019650505050505050600060405180830381600087803b158015610e6a57600080fd5b505af1158015610e7e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610ec557600080fd5b8101908080516040519392919084640100000000821115610ee557600080fd5b908301906020820185811115610efa57600080fd5b8251866020820283011164010000000082111715610f1757600080fd5b82525081516020918201928201910280838360005b83811015610f44578181015183820152602001610f2c565b505050509050016040525050509050610f6683866127a190919063ffffffff16565b9450610f8f81600181518110610f7857fe5b60200260200101518561286b90919063ffffffff16565b93505050505b8460070154610fa8866003015483612ab0565b1115611368578460030154811115611368576000610fd38660030154836127a190919063ffffffff16565b6040805160028082526060808301845293945090916020830190803683375050600d54604080517fd21220a700000000000000000000000000000000000000000000000000000000815290519394506001600160a01b039091169263d21220a792506004808301926020929190829003018186803b15801561105457600080fd5b505afa158015611068573d6000803e3d6000fd5b505050506040513d602081101561107e57600080fd5b50518151829060009061108d57fe5b6001600160a01b03928316602091820292909201810191909152600d54604080517f0dfe168100000000000000000000000000000000000000000000000000000000815290519190931692630dfe1681926004808301939192829003018186803b1580156110fa57600080fd5b505afa15801561110e573d6000803e3d6000fd5b505050506040513d602081101561112457600080fd5b505181518290600190811061113557fe5b6001600160a01b039283166020918202929092010152600f5461115e91878116911660006128c3565b600f54611178906001600160a01b038781169116846128c3565b6060600f60009054906101000a90046001600160a01b03166001600160a01b03166338ed173984600085308e6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156112145781810151838201526020016111fc565b505050509050019650505050505050600060405180830381600087803b15801561123d57600080fd5b505af1158015611251573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052602081101561129857600080fd5b81019080805160405193929190846401000000008211156112b857600080fd5b9083019060208201858111156112cd57600080fd5b82518660208202830111640100000000821117156112ea57600080fd5b82525081516020918201928201910280838360005b838110156113175781810151838201526020016112ff565b50505050905001604052505050905061133983856127a190919063ffffffff16565b93506113628160018151811061134b57fe5b60200260200101518661286b90919063ffffffff16565b94505050505b8454611381906001600160a01b03868116911684612afd565b8454611395906001600160a01b0316611513565b60028501546113b1906001600160a01b03858116911683612afd565b60028501546113c8906001600160a01b0316611513565b6040805188815290517f59a55455fb2332116ca78fe864f670ef66bae65460339946369d37fc255cbdb89181900360200190a150505050505050565b60146020526000908152604090205481565b601560205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b0396871697959096169593949293919260ff9091169188565b600081116114bf576040805162461bcd60e51b815260206004820152600e60248201527f63616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b6114c93382612b7d565b336000908152601460205260409020546114e3908261286b565b33600081815260146020526040902091909155600d54611510916001600160a01b03909116903084612bf4565b50565b61151c81612c82565b60008061152883610692565b909250905081156115e6576001600160a01b03808416600090815260116020908152604080832092909255600d5482517f0dfe168100000000000000000000000000000000000000000000000000000000815292516115e694889488949390911692630dfe168192600480840193829003018186803b1580156115aa57600080fd5b505afa1580156115be573d6000803e3d6000fd5b505050506040513d60208110156115d457600080fd5b50516001600160a01b03169190612afd565b8015611663576001600160a01b03808416600090815260136020908152604080832092909255600d5482517fd21220a700000000000000000000000000000000000000000000000000000000815292516116639488948794939091169263d21220a792600480840193829003018186803b1580156115aa57600080fd5b505050565b600080861161167657600080fd5b42841161168257600080fd5b8484111561168f57600080fd5b50600a80546001810190915560408051610100810182523381526001600160a01b0389166020820152908101879052606081018690526080810185905260a081016000815260208082018690526040918201859052600084815260158252829020835181546001600160a01b039182167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161783559285015160018084018054929093169190941617905591830151600280840191909155606084015160038401556080840151600484015560a0840151600584018054919390927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691849081111561179c57fe5b021790555060c0820151600682015560e090910151600790910155600d54604080517f0dfe168100000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691630dfe1681916004808301926020929190829003018186803b15801561181557600080fd5b505afa158015611829573d6000803e3d6000fd5b505050506040513d602081101561183f57600080fd5b50516001600160a01b03898116911614156118d557600d60009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156118a257600080fd5b505afa1580156118b6573d6000803e3d6000fd5b505050506040513d60208110156118cc57600080fd5b505190506119fd565b600d60009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561192357600080fd5b505afa158015611937573d6000803e3d6000fd5b505050506040513d602081101561194d57600080fd5b50516001600160a01b03898116911614156119b057600d60009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156118a257600080fd5b6040805162461bcd60e51b815260206004820152600d60248201527f756e6b6e6f776e20746f6b656e00000000000000000000000000000000000000604482015290519081900360640190fd5b611a126001600160a01b03821633308a612bf4565b6040805183815290517f6f302d6e593bbaca357e385ecfa033d5b561c0141df25e8d931b308674fd8fad9181900360200190a1509695505050505050565b600f546001600160a01b031681565b600c54604080517f2f8d3a66000000000000000000000000000000000000000000000000000000008152306004820152905160009283926001600160a01b0390911691632f8d3a6691602480820192602092909190829003018186803b158015611ac857600080fd5b505afa158015611adc573d6000803e3d6000fd5b505050506040513d6020811015611af257600080fd5b5051905080611b05575050600554611b45565b611b4181611b2f670de0b6b3a7640000611b29600454611b29600954610776611b4e565b906127ff565b81611b3657fe5b60055491900461286b565b9150505b90565b60085481565b6000611b5c42600054612d05565b905090565b60008111611bb6576040805162461bcd60e51b815260206004820152601160248201527f63616e6e6f742077697468647261772030000000000000000000000000000000604482015290519081900360640190fd5b611bc03382612a1d565b33600090815260146020526040902054611bda90826127a1565b33600081815260146020526040902091909155600d54611510916001600160a01b039091169083612afd565b60025481565b600b5481565b6001546001600160a01b031681565b60106020526000908152604090205481565b60075481565b600254611c4557600080fd5b600e54604080517ffa8e39b20000000000000000000000000000000000000000000000000000000081529051611ce8926001600160a01b03169163fa8e39b29160048083019260209291908290030181600087803b158015611ca657600080fd5b505af1158015611cba573d6000803e3d6000fd5b505050506040513d6020811015611cd057600080fd5b5051600254600d546001600160a01b03169190612afd565b6000600255565b60005481565b60035481565b600d546001600160a01b031681565b60095481565b60116020526000908152604090205481565b600e546001600160a01b031681565b600081815260156020526040812090600582015460ff166002811115611d5357fe5b14611d5d57600080fd5b6005810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660029081179091558154908201546001830154611db0926001600160a01b0391821692911690612afd565b6040805183815290517f0ff09947dd7d2583091e8cbfb427fecacb697bf895187b243fd0072c0ee9b9519181900360200190a15050565b600a5481565b600c54604080517f2f8d3a66000000000000000000000000000000000000000000000000000000008152306004820152905160009283926001600160a01b0390911691632f8d3a6691602480820192602092909190829003018186803b158015611e5657600080fd5b505afa158015611e6a573d6000803e3d6000fd5b505050506040513d6020811015611e8057600080fd5b5051905080611e93575050600854611b45565b611b4181611eb7670de0b6b3a7640000611b29600754611b29600954610776611b4e565b81611ebe57fe5b60085491900461286b565b600083815260156020526040812081600582015460ff166002811115611eeb57fe5b14611ef557600080fd5b42816004015411611f0557600080fd5b6005810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611f3a6132bf565b611f426132bf565b600d60009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9057600080fd5b505afa158015611fa4573d6000803e3d6000fd5b505050506040513d6020811015611fba57600080fd5b505160018401546001600160a01b0390811691161415612154576040805160608101825284546001600160a01b0390811682526002860154602080840191909152600d5484517f0dfe1681000000000000000000000000000000000000000000000000000000008152855194958601949190931692630dfe1681926004808301939192829003018186803b15801561205157600080fd5b505afa158015612065573d6000803e3d6000fd5b505050506040513d602081101561207b57600080fd5b50516001600160a01b039081169091526040805160608101825233815260208181018b9052600d5483517fd21220a70000000000000000000000000000000000000000000000000000000081528451969850929593860194169263d21220a7926004808201939291829003018186803b1580156120f757600080fd5b505afa15801561210b573d6000803e3d6000fd5b505050506040513d602081101561212157600080fd5b50516001600160a01b0390811690915281516020830151604084015193945061214f93909216913090612bf4565b6122cb565b604080516060810182523381526020808201899052600d5483517f0dfe1681000000000000000000000000000000000000000000000000000000008152845193948501936001600160a01b0390921692630dfe168192600480840193829003018186803b1580156121c457600080fd5b505afa1580156121d8573d6000803e3d6000fd5b505050506040513d60208110156121ee57600080fd5b50516001600160a01b03908116909152604080516060810182528654831681526002870154602082810191909152600d5483517fd21220a70000000000000000000000000000000000000000000000000000000081528451969850929593860194169263d21220a7926004808201939291829003018186803b15801561227357600080fd5b505afa158015612287573d6000803e3d6000fd5b505050506040513d602081101561229d57600080fd5b50516001600160a01b039081169091528351602085015160408601519394506122cb93909216913090612bf4565b60006103e861235a600e60009054906101000a90046001600160a01b03166001600160a01b0316638ace11306040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561232357600080fd5b505af1158015612337573d6000803e3d6000fd5b505050506040513d602081101561234d57600080fd5b50516020860151906127ff565b8161236157fe5b04905060006103e86123bc600e60009054906101000a90046001600160a01b03166001600160a01b0316638ace11306040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561232357600080fd5b816123c357fe5b0490506123dd8285602001516127a190919063ffffffff16565b6020808601919091528301516123f390826127a1565b602080850191909152600e54604080517ffa8e39b2000000000000000000000000000000000000000000000000000000008152905161249c936001600160a01b039093169263fa8e39b292600480820193918290030181600087803b15801561245b57600080fd5b505af115801561246f573d6000803e3d6000fd5b505050506040513d602081101561248557600080fd5b505160408601516001600160a01b03169084612afd565b600e54604080517ffa8e39b2000000000000000000000000000000000000000000000000000000008152905161253e926001600160a01b03169163fa8e39b29160048083019260209291908290030181600087803b1580156124fd57600080fd5b505af1158015612511573d6000803e3d6000fd5b505050506040513d602081101561252757600080fd5b505160408501516001600160a01b03169083612afd565b60408051600380825260808201909252600091829182916060919060208201838036833701905050905061258b888860405180604001604052808f81526020018d60060154815250612d1b565b90508060008151811061259a57fe5b60200260200101519150806001815181106125b157fe5b60200260200101519350806002815181106125c857fe5b602002602001015192506125ea8860000151600284816125e457fe5b04612b7d565b86516125f8906002846125e4565b60028206156126135760025461260f90600161286b565b6002555b600b549950600b6000815480929190600101919050555060405180610100016040528089600001516001600160a01b0316815260200185815260200188600001516001600160a01b031681526020018481526020018a6003015481526020018381526020016000151581526020018a60070154815250601660008c815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555060e082015181600701559050507f6991afcfa70e981e34df7ec69f37073cc382854b4bf5cd72b42a24cdcce4e7568d8b604051808381526020018281526020019250505060405180910390a15050505050505050505b9392505050565b60065481565b808203828111156127f9576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b92915050565b600081158061281a5750508082028282828161281757fe5b04145b6127f9576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b808201828110156127f9576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8015806129625750604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561293457600080fd5b505afa158015612948573d6000803e3d6000fd5b505050506040513d602081101561295e57600080fd5b5051155b61299d5760405162461bcd60e51b81526004018080602001828103825260368152602001806133306036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052611663908490612fd3565b612a2682612c82565b600c54604080517f8600e40b0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526024820185905291519190921691638600e40b91604480830192600092919082900301818387803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b505050505050565b60008082841115612ae457612ac584846127a1565b905083612ad4826103e86127ff565b81612adb57fe5b049150506127f9565b612aee83856127a1565b905082612ad4826103e86127ff565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611663908490612fd3565b612b8682612c82565b600c54604080517fab53bddc0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529151919092169163ab53bddc91604480830192600092919082900301818387803b158015612a9457600080fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052612c7c908590612fd3565b50505050565b612c8a611a5f565b600555612c95611ded565b600855612ca0611b4e565b6009556001600160a01b0381161561151057600080612cbe83610692565b6001600160a01b0385166000908152601160209081526040808320949094556013815283822092909255600554601083528382205560085460129092529190912055505050565b6000818310612d145781612794565b5090919050565b600f546040840151606091612d3e916001600160a01b03908116911660006128c3565b600f546040840151612d5e916001600160a01b03918216911660006128c3565b600f5460208501516040860151612d83926001600160a01b03918216929116906128c3565b600f5460208401516040850151612da8926001600160a01b03918216929116906128c3565b6000612ddf6103e8612dcb856020015188602001516127ff90919063ffffffff16565b81612dd257fe5b60208801519190046127a1565b90506000612e046103e8612dcb866020015188602001516127ff90919063ffffffff16565b600f54604080890151888201516020808c0151908b01518a5185517fe8e337000000000000000000000000000000000000000000000000000000000081526001600160a01b0395861660048201529385166024850152604484019290925260648301526084820188905260a482018690523060c483015260e482015291519394506000938493849392169163e8e337009161010480830192606092919082900301818787803b158015612eb657600080fd5b505af1158015612eca573d6000803e3d6000fd5b505050506040513d6060811015612ee057600080fd5b508051602080830151604090930151908c0151919550919350909150831015612f2757885160208a015160408b0151612f27926001600160a01b0390911691869003612afd565b8760200151821015612f57578751602089015160408a0151612f57926001600160a01b0390911691859003612afd565b604080516003808252608082019092526060916020820183803683370190505090508181600081518110612f8757fe5b6020026020010181815250508381600181518110612fa157fe5b6020026020010181815250508281600281518110612fbb57fe5b60209081029190910101529998505050505050505050565b6060613028826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130849092919063ffffffff16565b8051909150156116635780806020019051602081101561304757600080fd5b50516116635760405162461bcd60e51b815260040180806020018281038252602a815260200180613306602a913960400191505060405180910390fd5b6060613093848460008561309b565b949350505050565b6060824710156130dc5760405162461bcd60e51b81526004018080602001828103825260268152602001806132e06026913960400191505060405180910390fd5b6130e585613215565b613136576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061319357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613156565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131f5576040519150601f19603f3d011682016040523d82523d6000602084013e6131fa565b606091505b509150915061320a82828661321b565b979650505050505050565b3b151590565b6060831561322a575081612794565b82511561323a5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561328457818101518382015260200161326c565b50505050905090810190601f1680156132b15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60408051606081018252600080825260208201819052918101919091529056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220eb0de1f4cb77826c8c839bebed9978af31378c112175b0f4a128e173b625982364736f6c634300060c00330000000000000000000000007e5d0da0f5ba5c24043dceb0da78e97dfddca7df000000000000000000000000286fe087e26d1321e8a4d1b7b22ceba302362483000000000000000000000000000000000000000000000000000000006b4408890000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000005406e1136f423602c0685df8802f8ef28b73570d0000000000000000000000001a13b10c13650ee3c33f0d6488a84cbb8603b47e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102415760003560e01c80638244bd1511610145578063c816841b116100bd578063ef706adf1161008c578063f8dd7c1011610071578063f8dd7c10146105d7578063fa42d8c2146105df578063fabc5a561461060857610241565b8063ef706adf146105b2578063f7e45bc7146105cf57610241565b8063c816841b14610574578063c8f33c911461057c578063e1550fde14610584578063e8f62764146105aa57610241565b80639fc26c3a11610114578063a25b6b0d116100f9578063a25b6b0d1461055c578063c24a0f8b14610564578063c6dbfb8a1461056c57610241565b80639fc26c3a1461052e578063a08363ea1461055457610241565b80638244bd15146104f957806383d490291461051657806387dcec951461051e5780638dc45d9a1461052657610241565b806336e707e8116101d85780636d4af7e9116101a757806377322c371161018c57806377322c37146104e15780637eea237a146104e957806380faa57d146104f157610241565b80636d4af7e914610495578063735de9f7146104d957610241565b806336e707e8146103ab5780633903cc72146103d157806341655ee51461045257806364b3e1531461046f57610241565b806310facdd01161021457806310facdd0146102fb57806316ba6bf314610321578063202e909f14610360578063366a41201461038657610241565b806303a28f4c146102465780630e518506146102605780630eaf1036146102cf5780630f4ef8a6146102d7575b600080fd5b61024e610610565b60408051918252519081900360200190f35b61027d6004803603602081101561027657600080fd5b5035610616565b604080516001600160a01b03998a168152602081019890985295909716868601526060860193909352608085019190915260a0840152151560c083015260e08201929092529051908190036101000190f35b61024e61066b565b6102df610671565b604080516001600160a01b039092168252519081900360200190f35b61024e6004803603602081101561031157600080fd5b50356001600160a01b0316610680565b6103476004803603602081101561033757600080fd5b50356001600160a01b0316610692565b6040805192835260208301919091528051918290030190f35b61024e6004803603602081101561037657600080fd5b50356001600160a01b03166107df565b6103a96004803603604081101561039c57600080fd5b50803590602001356107f1565b005b61024e600480360360208110156103c157600080fd5b50356001600160a01b0316611404565b6103ee600480360360208110156103e757600080fd5b5035611416565b60405180896001600160a01b03168152602001886001600160a01b0316815260200187815260200186815260200185815260200184600281111561042e57fe5b81526020018381526020018281526020019850505050505050505060405180910390f35b6103a96004803603602081101561046857600080fd5b503561146a565b6103a96004803603602081101561048557600080fd5b50356001600160a01b0316611513565b61024e600480360360c08110156104ab57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a00135611668565b6102df611a50565b61024e611a5f565b61024e611b48565b61024e611b4e565b6103a96004803603602081101561050f57600080fd5b5035611b61565b61024e611c06565b61024e611c0c565b6102df611c12565b61024e6004803603602081101561054457600080fd5b50356001600160a01b0316611c21565b61024e611c33565b6103a9611c39565b61024e611cef565b61024e611cf5565b6102df611cfb565b61024e611d0a565b61024e6004803603602081101561059a57600080fd5b50356001600160a01b0316611d10565b6102df611d22565b6103a9600480360360208110156105c857600080fd5b5035611d31565b61024e611de7565b61024e611ded565b61024e600480360360608110156105f557600080fd5b5080359060208101359060400135611ec9565b61024e61279b565b60055481565b601660205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b039687169795969094169492939192909160ff9091169088565b60045481565b600c546001600160a01b031681565b60136020526000908152604090205481565b600c54604080517f9f1916590000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038481166024830152915160009384938493911691639f19165991604480820192602092909190829003018186803b15801561070457600080fd5b505afa158015610718573d6000803e3d6000fd5b505050506040513d602081101561072e57600080fd5b50516001600160a01b03851660009081526011602090815260408083205460109092529091205491925061079191670de0b6b3a7640000906107839061077c90610776611a5f565b906127a1565b85906127ff565b8161078a57fe5b049061286b565b6001600160a01b0385166000908152601360209081526040808320546012909252909120549194506107d791670de0b6b3a7640000906107839061077c90610776611ded565b915050915091565b60126020526000908152604090205481565b600082815260166020526040902080546001600160a01b0316331480610823575060028101546001600160a01b031633145b610874576040805162461bcd60e51b815260206004820152600c60248201527f756e617574686f72697a65640000000000000000000000000000000000000000604482015290519081900360640190fd5b806004015442116108cc576040805162461bcd60e51b815260206004820152600660248201527f6c6f636b65640000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600681015460ff1615610926576040805162461bcd60e51b815260206004820152601060248201527f616c72656164792072656c656173656400000000000000000000000000000000604482015290519081900360640190fd5b6006810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600d54604080517f0dfe168100000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691630dfe1681916004808301926020929190829003018186803b1580156109b157600080fd5b505afa1580156109c5573d6000803e3d6000fd5b505050506040513d60208110156109db57600080fd5b5051600d54604080517fd21220a700000000000000000000000000000000000000000000000000000000815290519293506000926001600160a01b039092169163d21220a791600480820192602092909190829003018186803b158015610a4157600080fd5b505afa158015610a55573d6000803e3d6000fd5b505050506040513d6020811015610a6b57600080fd5b5051600f54600d54919250610a8e916001600160a01b03908116911660006128c3565b600f546005840154600d54610ab1926001600160a01b03918216929116906128c3565b600f546005840154604080517fbaa2abde0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015285811660248301526044820193909352600060648201819052608482018190523060a483015260c48201899052825190948594169263baa2abde9260e4808201939182900301818787803b158015610b4757600080fd5b505af1158015610b5b573d6000803e3d6000fd5b505050506040513d6040811015610b7157600080fd5b50805160209091015186546005880154929450909250610ba1916001600160a01b03909116906002905b04612a1d565b6002808601546005870154610bc2926001600160a01b039092169190610b9b565b8460070154610bd5866001015484612ab0565b1115610f95578460010154821115610f95576000610c008660010154846127a190919063ffffffff16565b6040805160028082526060808301845293945090916020830190803683375050600d54604080517f0dfe168100000000000000000000000000000000000000000000000000000000815290519394506001600160a01b0390911692630dfe168192506004808301926020929190829003018186803b158015610c8157600080fd5b505afa158015610c95573d6000803e3d6000fd5b505050506040513d6020811015610cab57600080fd5b505181518290600090610cba57fe5b6001600160a01b03928316602091820292909201810191909152600d54604080517fd21220a70000000000000000000000000000000000000000000000000000000081529051919093169263d21220a7926004808301939192829003018186803b158015610d2757600080fd5b505afa158015610d3b573d6000803e3d6000fd5b505050506040513d6020811015610d5157600080fd5b5051815182906001908110610d6257fe5b6001600160a01b039283166020918202929092010152600f54610d8b91888116911660006128c3565b600f54610da5906001600160a01b038881169116846128c3565b6060600f60009054906101000a90046001600160a01b03166001600160a01b03166338ed173984600085308e6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610e41578181015183820152602001610e29565b505050509050019650505050505050600060405180830381600087803b158015610e6a57600080fd5b505af1158015610e7e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610ec557600080fd5b8101908080516040519392919084640100000000821115610ee557600080fd5b908301906020820185811115610efa57600080fd5b8251866020820283011164010000000082111715610f1757600080fd5b82525081516020918201928201910280838360005b83811015610f44578181015183820152602001610f2c565b505050509050016040525050509050610f6683866127a190919063ffffffff16565b9450610f8f81600181518110610f7857fe5b60200260200101518561286b90919063ffffffff16565b93505050505b8460070154610fa8866003015483612ab0565b1115611368578460030154811115611368576000610fd38660030154836127a190919063ffffffff16565b6040805160028082526060808301845293945090916020830190803683375050600d54604080517fd21220a700000000000000000000000000000000000000000000000000000000815290519394506001600160a01b039091169263d21220a792506004808301926020929190829003018186803b15801561105457600080fd5b505afa158015611068573d6000803e3d6000fd5b505050506040513d602081101561107e57600080fd5b50518151829060009061108d57fe5b6001600160a01b03928316602091820292909201810191909152600d54604080517f0dfe168100000000000000000000000000000000000000000000000000000000815290519190931692630dfe1681926004808301939192829003018186803b1580156110fa57600080fd5b505afa15801561110e573d6000803e3d6000fd5b505050506040513d602081101561112457600080fd5b505181518290600190811061113557fe5b6001600160a01b039283166020918202929092010152600f5461115e91878116911660006128c3565b600f54611178906001600160a01b038781169116846128c3565b6060600f60009054906101000a90046001600160a01b03166001600160a01b03166338ed173984600085308e6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156112145781810151838201526020016111fc565b505050509050019650505050505050600060405180830381600087803b15801561123d57600080fd5b505af1158015611251573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052602081101561129857600080fd5b81019080805160405193929190846401000000008211156112b857600080fd5b9083019060208201858111156112cd57600080fd5b82518660208202830111640100000000821117156112ea57600080fd5b82525081516020918201928201910280838360005b838110156113175781810151838201526020016112ff565b50505050905001604052505050905061133983856127a190919063ffffffff16565b93506113628160018151811061134b57fe5b60200260200101518661286b90919063ffffffff16565b94505050505b8454611381906001600160a01b03868116911684612afd565b8454611395906001600160a01b0316611513565b60028501546113b1906001600160a01b03858116911683612afd565b60028501546113c8906001600160a01b0316611513565b6040805188815290517f59a55455fb2332116ca78fe864f670ef66bae65460339946369d37fc255cbdb89181900360200190a150505050505050565b60146020526000908152604090205481565b601560205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b0396871697959096169593949293919260ff9091169188565b600081116114bf576040805162461bcd60e51b815260206004820152600e60248201527f63616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b6114c93382612b7d565b336000908152601460205260409020546114e3908261286b565b33600081815260146020526040902091909155600d54611510916001600160a01b03909116903084612bf4565b50565b61151c81612c82565b60008061152883610692565b909250905081156115e6576001600160a01b03808416600090815260116020908152604080832092909255600d5482517f0dfe168100000000000000000000000000000000000000000000000000000000815292516115e694889488949390911692630dfe168192600480840193829003018186803b1580156115aa57600080fd5b505afa1580156115be573d6000803e3d6000fd5b505050506040513d60208110156115d457600080fd5b50516001600160a01b03169190612afd565b8015611663576001600160a01b03808416600090815260136020908152604080832092909255600d5482517fd21220a700000000000000000000000000000000000000000000000000000000815292516116639488948794939091169263d21220a792600480840193829003018186803b1580156115aa57600080fd5b505050565b600080861161167657600080fd5b42841161168257600080fd5b8484111561168f57600080fd5b50600a80546001810190915560408051610100810182523381526001600160a01b0389166020820152908101879052606081018690526080810185905260a081016000815260208082018690526040918201859052600084815260158252829020835181546001600160a01b039182167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161783559285015160018084018054929093169190941617905591830151600280840191909155606084015160038401556080840151600484015560a0840151600584018054919390927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691849081111561179c57fe5b021790555060c0820151600682015560e090910151600790910155600d54604080517f0dfe168100000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691630dfe1681916004808301926020929190829003018186803b15801561181557600080fd5b505afa158015611829573d6000803e3d6000fd5b505050506040513d602081101561183f57600080fd5b50516001600160a01b03898116911614156118d557600d60009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156118a257600080fd5b505afa1580156118b6573d6000803e3d6000fd5b505050506040513d60208110156118cc57600080fd5b505190506119fd565b600d60009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561192357600080fd5b505afa158015611937573d6000803e3d6000fd5b505050506040513d602081101561194d57600080fd5b50516001600160a01b03898116911614156119b057600d60009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156118a257600080fd5b6040805162461bcd60e51b815260206004820152600d60248201527f756e6b6e6f776e20746f6b656e00000000000000000000000000000000000000604482015290519081900360640190fd5b611a126001600160a01b03821633308a612bf4565b6040805183815290517f6f302d6e593bbaca357e385ecfa033d5b561c0141df25e8d931b308674fd8fad9181900360200190a1509695505050505050565b600f546001600160a01b031681565b600c54604080517f2f8d3a66000000000000000000000000000000000000000000000000000000008152306004820152905160009283926001600160a01b0390911691632f8d3a6691602480820192602092909190829003018186803b158015611ac857600080fd5b505afa158015611adc573d6000803e3d6000fd5b505050506040513d6020811015611af257600080fd5b5051905080611b05575050600554611b45565b611b4181611b2f670de0b6b3a7640000611b29600454611b29600954610776611b4e565b906127ff565b81611b3657fe5b60055491900461286b565b9150505b90565b60085481565b6000611b5c42600054612d05565b905090565b60008111611bb6576040805162461bcd60e51b815260206004820152601160248201527f63616e6e6f742077697468647261772030000000000000000000000000000000604482015290519081900360640190fd5b611bc03382612a1d565b33600090815260146020526040902054611bda90826127a1565b33600081815260146020526040902091909155600d54611510916001600160a01b039091169083612afd565b60025481565b600b5481565b6001546001600160a01b031681565b60106020526000908152604090205481565b60075481565b600254611c4557600080fd5b600e54604080517ffa8e39b20000000000000000000000000000000000000000000000000000000081529051611ce8926001600160a01b03169163fa8e39b29160048083019260209291908290030181600087803b158015611ca657600080fd5b505af1158015611cba573d6000803e3d6000fd5b505050506040513d6020811015611cd057600080fd5b5051600254600d546001600160a01b03169190612afd565b6000600255565b60005481565b60035481565b600d546001600160a01b031681565b60095481565b60116020526000908152604090205481565b600e546001600160a01b031681565b600081815260156020526040812090600582015460ff166002811115611d5357fe5b14611d5d57600080fd5b6005810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660029081179091558154908201546001830154611db0926001600160a01b0391821692911690612afd565b6040805183815290517f0ff09947dd7d2583091e8cbfb427fecacb697bf895187b243fd0072c0ee9b9519181900360200190a15050565b600a5481565b600c54604080517f2f8d3a66000000000000000000000000000000000000000000000000000000008152306004820152905160009283926001600160a01b0390911691632f8d3a6691602480820192602092909190829003018186803b158015611e5657600080fd5b505afa158015611e6a573d6000803e3d6000fd5b505050506040513d6020811015611e8057600080fd5b5051905080611e93575050600854611b45565b611b4181611eb7670de0b6b3a7640000611b29600754611b29600954610776611b4e565b81611ebe57fe5b60085491900461286b565b600083815260156020526040812081600582015460ff166002811115611eeb57fe5b14611ef557600080fd5b42816004015411611f0557600080fd5b6005810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611f3a6132bf565b611f426132bf565b600d60009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9057600080fd5b505afa158015611fa4573d6000803e3d6000fd5b505050506040513d6020811015611fba57600080fd5b505160018401546001600160a01b0390811691161415612154576040805160608101825284546001600160a01b0390811682526002860154602080840191909152600d5484517f0dfe1681000000000000000000000000000000000000000000000000000000008152855194958601949190931692630dfe1681926004808301939192829003018186803b15801561205157600080fd5b505afa158015612065573d6000803e3d6000fd5b505050506040513d602081101561207b57600080fd5b50516001600160a01b039081169091526040805160608101825233815260208181018b9052600d5483517fd21220a70000000000000000000000000000000000000000000000000000000081528451969850929593860194169263d21220a7926004808201939291829003018186803b1580156120f757600080fd5b505afa15801561210b573d6000803e3d6000fd5b505050506040513d602081101561212157600080fd5b50516001600160a01b0390811690915281516020830151604084015193945061214f93909216913090612bf4565b6122cb565b604080516060810182523381526020808201899052600d5483517f0dfe1681000000000000000000000000000000000000000000000000000000008152845193948501936001600160a01b0390921692630dfe168192600480840193829003018186803b1580156121c457600080fd5b505afa1580156121d8573d6000803e3d6000fd5b505050506040513d60208110156121ee57600080fd5b50516001600160a01b03908116909152604080516060810182528654831681526002870154602082810191909152600d5483517fd21220a70000000000000000000000000000000000000000000000000000000081528451969850929593860194169263d21220a7926004808201939291829003018186803b15801561227357600080fd5b505afa158015612287573d6000803e3d6000fd5b505050506040513d602081101561229d57600080fd5b50516001600160a01b039081169091528351602085015160408601519394506122cb93909216913090612bf4565b60006103e861235a600e60009054906101000a90046001600160a01b03166001600160a01b0316638ace11306040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561232357600080fd5b505af1158015612337573d6000803e3d6000fd5b505050506040513d602081101561234d57600080fd5b50516020860151906127ff565b8161236157fe5b04905060006103e86123bc600e60009054906101000a90046001600160a01b03166001600160a01b0316638ace11306040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561232357600080fd5b816123c357fe5b0490506123dd8285602001516127a190919063ffffffff16565b6020808601919091528301516123f390826127a1565b602080850191909152600e54604080517ffa8e39b2000000000000000000000000000000000000000000000000000000008152905161249c936001600160a01b039093169263fa8e39b292600480820193918290030181600087803b15801561245b57600080fd5b505af115801561246f573d6000803e3d6000fd5b505050506040513d602081101561248557600080fd5b505160408601516001600160a01b03169084612afd565b600e54604080517ffa8e39b2000000000000000000000000000000000000000000000000000000008152905161253e926001600160a01b03169163fa8e39b29160048083019260209291908290030181600087803b1580156124fd57600080fd5b505af1158015612511573d6000803e3d6000fd5b505050506040513d602081101561252757600080fd5b505160408501516001600160a01b03169083612afd565b60408051600380825260808201909252600091829182916060919060208201838036833701905050905061258b888860405180604001604052808f81526020018d60060154815250612d1b565b90508060008151811061259a57fe5b60200260200101519150806001815181106125b157fe5b60200260200101519350806002815181106125c857fe5b602002602001015192506125ea8860000151600284816125e457fe5b04612b7d565b86516125f8906002846125e4565b60028206156126135760025461260f90600161286b565b6002555b600b549950600b6000815480929190600101919050555060405180610100016040528089600001516001600160a01b0316815260200185815260200188600001516001600160a01b031681526020018481526020018a6003015481526020018381526020016000151581526020018a60070154815250601660008c815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555060e082015181600701559050507f6991afcfa70e981e34df7ec69f37073cc382854b4bf5cd72b42a24cdcce4e7568d8b604051808381526020018281526020019250505060405180910390a15050505050505050505b9392505050565b60065481565b808203828111156127f9576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b92915050565b600081158061281a5750508082028282828161281757fe5b04145b6127f9576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b808201828110156127f9576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8015806129625750604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561293457600080fd5b505afa158015612948573d6000803e3d6000fd5b505050506040513d602081101561295e57600080fd5b5051155b61299d5760405162461bcd60e51b81526004018080602001828103825260368152602001806133306036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052611663908490612fd3565b612a2682612c82565b600c54604080517f8600e40b0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526024820185905291519190921691638600e40b91604480830192600092919082900301818387803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b505050505050565b60008082841115612ae457612ac584846127a1565b905083612ad4826103e86127ff565b81612adb57fe5b049150506127f9565b612aee83856127a1565b905082612ad4826103e86127ff565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611663908490612fd3565b612b8682612c82565b600c54604080517fab53bddc0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529151919092169163ab53bddc91604480830192600092919082900301818387803b158015612a9457600080fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052612c7c908590612fd3565b50505050565b612c8a611a5f565b600555612c95611ded565b600855612ca0611b4e565b6009556001600160a01b0381161561151057600080612cbe83610692565b6001600160a01b0385166000908152601160209081526040808320949094556013815283822092909255600554601083528382205560085460129092529190912055505050565b6000818310612d145781612794565b5090919050565b600f546040840151606091612d3e916001600160a01b03908116911660006128c3565b600f546040840151612d5e916001600160a01b03918216911660006128c3565b600f5460208501516040860151612d83926001600160a01b03918216929116906128c3565b600f5460208401516040850151612da8926001600160a01b03918216929116906128c3565b6000612ddf6103e8612dcb856020015188602001516127ff90919063ffffffff16565b81612dd257fe5b60208801519190046127a1565b90506000612e046103e8612dcb866020015188602001516127ff90919063ffffffff16565b600f54604080890151888201516020808c0151908b01518a5185517fe8e337000000000000000000000000000000000000000000000000000000000081526001600160a01b0395861660048201529385166024850152604484019290925260648301526084820188905260a482018690523060c483015260e482015291519394506000938493849392169163e8e337009161010480830192606092919082900301818787803b158015612eb657600080fd5b505af1158015612eca573d6000803e3d6000fd5b505050506040513d6060811015612ee057600080fd5b508051602080830151604090930151908c0151919550919350909150831015612f2757885160208a015160408b0151612f27926001600160a01b0390911691869003612afd565b8760200151821015612f57578751602089015160408a0151612f57926001600160a01b0390911691859003612afd565b604080516003808252608082019092526060916020820183803683370190505090508181600081518110612f8757fe5b6020026020010181815250508381600181518110612fa157fe5b6020026020010181815250508281600281518110612fbb57fe5b60209081029190910101529998505050505050505050565b6060613028826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130849092919063ffffffff16565b8051909150156116635780806020019051602081101561304757600080fd5b50516116635760405162461bcd60e51b815260040180806020018281038252602a815260200180613306602a913960400191505060405180910390fd5b6060613093848460008561309b565b949350505050565b6060824710156130dc5760405162461bcd60e51b81526004018080602001828103825260268152602001806132e06026913960400191505060405180910390fd5b6130e585613215565b613136576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061319357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613156565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131f5576040519150601f19603f3d011682016040523d82523d6000602084013e6131fa565b606091505b509150915061320a82828661321b565b979650505050505050565b3b151590565b6060831561322a575081612794565b82511561323a5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561328457818101518382015260200161326c565b50505050905090810190601f1680156132b15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60408051606081018252600080825260208201819052918101919091529056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220eb0de1f4cb77826c8c839bebed9978af31378c112175b0f4a128e173b625982364736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007e5d0da0f5ba5c24043dceb0da78e97dfddca7df000000000000000000000000286fe087e26d1321e8a4d1b7b22ceba302362483000000000000000000000000000000000000000000000000000000006b4408890000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000005406e1136f423602c0685df8802f8ef28b73570d0000000000000000000000001a13b10c13650ee3c33f0d6488a84cbb8603b47e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _uniswapPair (address): 0x7E5D0da0f5BA5c24043DcEb0DA78E97dfddCA7Df
Arg [1] : _submitter (address): 0x286fe087E26d1321E8a4d1B7b22ceba302362483
Arg [2] : _endDate (uint256): 1799620745
Arg [3] : _uniswapRouter (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [4] : _feesController (address): 0x5406e1136F423602C0685DF8802f8ef28b73570d
Arg [5] : _rewardManager (address): 0x1A13B10C13650eE3C33F0D6488a84CBB8603B47E
Arg [6] : _bonusToken0 (uint256): 0
Arg [7] : _bonusToken1 (uint256): 0
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000007e5d0da0f5ba5c24043dceb0da78e97dfddca7df
Arg [1] : 000000000000000000000000286fe087e26d1321e8a4d1b7b22ceba302362483
Arg [2] : 000000000000000000000000000000000000000000000000000000006b440889
Arg [3] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [4] : 0000000000000000000000005406e1136f423602c0685df8802f8ef28b73570d
Arg [5] : 0000000000000000000000001a13b10c13650ee3c33f0d6488a84cbb8603b47e
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
36564:15986:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36826:36;;;:::i;:::-;;;;;;;;;;;;;;;;37628:53;;;;;;;;;;;;;;;;-1:-1:-1;37628:53:0;;:::i;:::-;;;;-1:-1:-1;;;;;37628:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37628:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;36793:26;;;:::i;37093:35::-;;;:::i;:::-;;;;-1:-1:-1;;;;;37093:35:0;;;;;;;;;;;;;;37451:47;;;;;;;;;;;;;;;;-1:-1:-1;37451:47:0;-1:-1:-1;;;;;37451:47:0;;:::i;40202:456::-;;;;;;;;;;;;;;;;-1:-1:-1;40202:456:0;-1:-1:-1;;;;;40202:456:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37386:58;;;;;;;;;;;;;;;;-1:-1:-1;37386:58:0;-1:-1:-1;;;;;37386:58:0;;:::i;48645:2693::-;;;;;;;;;;;;;;;;-1:-1:-1;48645:2693:0;;;;;;;:::i;:::-;;37505:54;;;;;;;;;;;;;;;;-1:-1:-1;37505:54:0;-1:-1:-1;;;;;37505:54:0;;:::i;37566:55::-;;;;;;;;;;;;;;;;-1:-1:-1;37566:55:0;;:::i;:::-;;;;-1:-1:-1;;;;;37566:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37566:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51653:331;;;;;;;;;;;;;;;;-1:-1:-1;51653:331:0;;:::i;41245:460::-;;;;;;;;;;;;;;;;-1:-1:-1;41245:460:0;-1:-1:-1;;;;;41245:460:0;;:::i;42055:1150::-;;;;;;;;;;;;;;;;-1:-1:-1;42055:1150:0;;-1:-1:-1;;;;;42055:1150:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42055:1150:0;;;:::i;37219:39::-;;;:::i;39468:359::-;;;:::i;36935:36::-;;;:::i;39334:126::-;;;:::i;51992:319::-;;;;;;;;;;;;;;;;-1:-1:-1;51992:319:0;;:::i;36720:33::-;;;:::i;37053:31::-;;;:::i;36689:24::-;;;:::i;37267:58::-;;;;;;;;;;;;;;;;-1:-1:-1;37267:58:0;-1:-1:-1;;;;;37267:58:0;;:::i;36902:26::-;;;:::i;52319:228::-;;;:::i;36660:22::-;;;:::i;36760:26::-;;;:::i;37135:33::-;;;:::i;36978:29::-;;;:::i;37332:47::-;;;;;;;;;;;;;;;;-1:-1:-1;37332:47:0;-1:-1:-1;;;;;37332:47:0;;:::i;37175:37::-;;;:::i;48255:382::-;;;;;;;;;;;;;;;;-1:-1:-1;48255:382:0;;:::i;37014:32::-;;;:::i;39835:359::-;;;:::i;43419:3050::-;;;;;;;;;;;;;;;;-1:-1:-1;43419:3050:0;;;;;;;;;;;;:::i;36869:26::-;;;:::i;36826:36::-;;;;:::o;37628:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37628:53:0;;;;;;;;;;;;;;;;;;;;;;:::o;36793:26::-;;;;:::o;37093:35::-;;;-1:-1:-1;;;;;37093:35:0;;:::o;37451:47::-;;;;;;;;;;;;;:::o;40202:456::-;40337:13;;:51;;;;;;40373:4;40337:51;;;;-1:-1:-1;;;;;40337:51:0;;;;;;;;;-1:-1:-1;;;;;;40337:13:0;;;:27;;:51;;;;;;;;;;;;;;;:13;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40337:51:0;-1:-1:-1;;;;;40497:21:0;;;;;;:12;40337:51;40497:21;;;;;;;;40450:23;:32;;;;;;;40337:51;;-1:-1:-1;40415:104:0;;40487:4;;40416:68;;40428:55;;:17;:15;:17::i;:::-;:21;;:55::i;:::-;40416:7;;:11;:68::i;:::-;:75;;;;;;;40415:81;:104::i;:::-;-1:-1:-1;;;;;40628:21:0;;;;;;:12;:21;;;;;;;;;40581:23;:32;;;;;;;40399:120;;-1:-1:-1;40546:104:0;;40618:4;;40547:68;;40559:55;;:17;:15;:17::i;40546:104::-;40530:120;;40202:456;;;;:::o;37386:58::-;;;;;;;;;;;;;:::o;48645:2693::-;48728:25;48756:24;;;:14;:24;;;;;48815:11;;-1:-1:-1;;;;;48815:11:0;48801:10;:25;;:54;;-1:-1:-1;48844:11:0;;;;-1:-1:-1;;;;;48844:11:0;48830:10;:25;48801:54;48793:79;;;;;-1:-1:-1;;;48793:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48897:5;:16;;;48891:3;:22;48883:41;;;;;-1:-1:-1;;;48883:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48944:14;;;;;;48943:15;48935:44;;;;;-1:-1:-1;;;48935:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48990:14;;;:21;;;;49007:4;48990:21;;;49047:11;;:20;;;;;;;;-1:-1:-1;;;;;;;49047:11:0;;:18;;:20;;;;;;;;;;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49047:20:0;49102:11;;:20;;;;;;;;49047;;-1:-1:-1;49079:13:0;;-1:-1:-1;;;;;49102:11:0;;;;:18;;:20;;;;;49047;;49102;;;;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49102:20:0;49185:13;;49151:11;;49102:20;;-1:-1:-1;49136:67:0;;-1:-1:-1;;;;;49151:11:0;;;;49185:13;;49136:40;:67::i;:::-;49265:13;;49281:15;;;;49231:11;;49216:81;;-1:-1:-1;;;;;49231:11:0;;;;49265:13;;;49216:40;:81::i;:::-;49345:13;;49409:15;;;;49345:112;;;;;;-1:-1:-1;;;;;49345:112:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49345:112:0;;;;;;;;;;;;49440:4;49345:112;;;;;;;;;;;;-1:-1:-1;;;;49345:13:0;;:29;;:112;;;;;;;;;;;-1:-1:-1;49345:13:0;:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49345:112:0;;;;;;;49486:11;;49499:15;;;;49345:112;;-1:-1:-1;49345:112:0;;-1:-1:-1;49470:49:0;;-1:-1:-1;;;;;49486:11:0;;;;49517:1;;49499:19;;49470:15;:49::i;:::-;49546:11;;;;;49559:15;;;;49530:49;;-1:-1:-1;;;;;49546:11:0;;;;;49559:19;;49530:49;49649:5;:26;;;49596:50;49615:5;:21;;;49638:7;49596:18;:50::i;:::-;:79;49592:757;;;49706:5;:21;;;49696:7;:31;49692:646;;;49748:14;49765:34;49777:5;:21;;;49765:7;:11;;:34;;;;:::i;:::-;49842:16;;;49856:1;49842:16;;;49818:21;49842:16;;;;;49748:51;;-1:-1:-1;49842:16:0;;;;;;;;;;-1:-1:-1;;49887:11:0;;:20;;;;;;;;49818:40;;-1:-1:-1;;;;;;49887:11:0;;;;:18;;-1:-1:-1;49887:20:0;;;;;;;;;;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49887:20:0;49877:7;;:4;;49882:1;;49877:7;;;;-1:-1:-1;;;;;49877:30:0;;;:7;;;;;;;;;;:30;;;;49936:11;;:20;;;;;;;;:11;;;;;:18;;:20;;;;;49877:7;;49936:20;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49936:20:0;49926:7;;:4;;49931:1;;49926:7;;;;;;-1:-1:-1;;;;;49926:30:0;;;:7;;;;;;;;;:30;50002:13;;49975:45;;:18;;;;50002:13;;49975:18;:45::i;:::-;50066:13;;50039:50;;-1:-1:-1;;;;;50039:18:0;;;;50066:13;50082:6;50039:18;:50::i;:::-;50108:27;50138:13;;;;;;;;;-1:-1:-1;;;;;50138:13:0;-1:-1:-1;;;;;50138:38:0;;50177:6;50185:1;50188:4;50202;50209:9;50138:81;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50138:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50138:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50108:111;;50248:19;50260:6;50248:7;:11;;:19;;;;:::i;:::-;50238:29;;50296:26;50308:10;50319:1;50308:13;;;;;;;;;;;;;;50296:7;:11;;:26;;;;:::i;:::-;50286:36;;49692:646;;;;50416:5;:26;;;50363:50;50382:5;:21;;;50405:7;50363:18;:50::i;:::-;:79;50359:757;;;50473:5;:21;;;50463:7;:31;50459:646;;;50515:14;50532:34;50544:5;:21;;;50532:7;:11;;:34;;;;:::i;:::-;50609:16;;;50623:1;50609:16;;;50585:21;50609:16;;;;;50515:51;;-1:-1:-1;50609:16:0;;;;;;;;;;-1:-1:-1;;50654:11:0;;:20;;;;;;;;50585:40;;-1:-1:-1;;;;;;50654:11:0;;;;:18;;-1:-1:-1;50654:20:0;;;;;;;;;;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50654:20:0;50644:7;;:4;;50649:1;;50644:7;;;;-1:-1:-1;;;;;50644:30:0;;;:7;;;;;;;;;;:30;;;;50703:11;;:20;;;;;;;;:11;;;;;:18;;:20;;;;;50644:7;;50703:20;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50703:20:0;50693:7;;:4;;50698:1;;50693:7;;;;;;-1:-1:-1;;;;;50693:30:0;;;:7;;;;;;;;;:30;50769:13;;50742:45;;:18;;;;50769:13;;50742:18;:45::i;:::-;50833:13;;50806:50;;-1:-1:-1;;;;;50806:18:0;;;;50833:13;50849:6;50806:18;:50::i;:::-;50875:27;50905:13;;;;;;;;;-1:-1:-1;;;;;50905:13:0;-1:-1:-1;;;;;50905:38:0;;50944:6;50952:1;50955:4;50969;50976:9;50905:81;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50905:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50905:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50875:111;;51015:19;51027:6;51015:7;:11;;:19;;;;:::i;:::-;51005:29;;51063:26;51075:10;51086:1;51075:13;;;;;;;;;;;;;;51063:7;:11;;:26;;;;:::i;:::-;51053:36;;50459:646;;;;51148:11;;51128:41;;-1:-1:-1;;;;;51128:19:0;;;;51148:11;51161:7;51128:19;:41::i;:::-;51191:11;;51180:23;;-1:-1:-1;;;;;51191:11:0;51180:10;:23::i;:::-;51234:11;;;;51214:41;;-1:-1:-1;;;;;51214:19:0;;;;51234:11;51247:7;51214:19;:41::i;:::-;51277:11;;;;51266:23;;-1:-1:-1;;;;;51277:11:0;51266:10;:23::i;:::-;51307;;;;;;;;;;;;;;;;;48645:2693;;;;;;;:::o;37505:54::-;;;;;;;;;;;;;:::o;37566:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37566:55:0;;;;;;;;;;;;;;;;;;;;;;:::o;51653:331::-;51729:1;51719:7;:11;51711:38;;;;;-1:-1:-1;;;51711:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51760:35;51775:10;51787:7;51760:14;:35::i;:::-;51860:10;51840:31;;;;:19;:31;;;;;;:44;;51876:7;51840:35;:44::i;:::-;51826:10;51806:31;;;;:19;:31;;;;;:78;;;;51910:11;;51895:81;;-1:-1:-1;;;;;51910:11:0;;;;51961:4;51968:7;51895:45;:81::i;:::-;51653:331;:::o;41245:460::-;41300:22;41314:7;41300:13;:22::i;:::-;41334:15;41351;41370:21;41383:7;41370:12;:21::i;:::-;41333:58;;-1:-1:-1;41333:58:0;-1:-1:-1;41406:11:0;;41402:143;;-1:-1:-1;;;;;41434:21:0;;;41458:1;41434:21;;;:12;:21;;;;;;;;:25;;;;41481:11;;:20;;;;;;;41474:59;;41434:21;;41525:7;;41481:11;;;;;:18;;:20;;;;;;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41481:20:0;-1:-1:-1;;;;;41474:41:0;;;;:59::i;:::-;41559:11;;41555:143;;-1:-1:-1;;;;;41587:21:0;;;41611:1;41587:21;;;:12;:21;;;;;;;;:25;;;;41634:11;;:20;;;;;;;41627:59;;41587:21;;41678:7;;41634:11;;;;;:18;;:20;;;;;;;;;;:11;:20;;;;;;;;;;41627:59;41245:460;;;:::o;42055:1150::-;42296:15;42342:1;42332:7;:11;42324:20;;;;;;42374:3;42363:8;:14;42355:23;;;;;;42409:11;42397:8;:23;;42389:32;;;;;;-1:-1:-1;42442:17:0;;;42470:19;;;;;;;42527:246;;;;;;;;42554:10;42527:246;;-1:-1:-1;;;;;42527:246:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42527:246:0;;;;;;;;;;;;;;;;;42500:24;;;:15;:24;;;;;;;:273;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42442:17;;42527:246;;42500:273;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42500:273:0;;;;;;;;;;;;;;;;;;42829:11;;:20;;;;;;;;-1:-1:-1;;;;;;;42829:11:0;;:18;;:20;;;;;;;;;;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42829:20:0;-1:-1:-1;;;;;42811:39:0;;;;;;42807:286;;;42882:11;;:20;;;;;;;;-1:-1:-1;;;;;42882:11:0;;;;:18;;:20;;;;;;;;;;;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42882:20:0;;-1:-1:-1;42807:286:0;;;42943:11;;:20;;;;;;;;-1:-1:-1;;;;;42943:11:0;;;;:18;;:20;;;;;;;;;;;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42943:20:0;-1:-1:-1;;;;;42925:39:0;;;;;;42921:172;;;42996:11;;:20;;;;;;;;-1:-1:-1;;;;;42996:11:0;;;;:18;;:20;;;;;;;;;;;;;;;:11;:20;;;;;;;;;;42921:172;43050:31;;;-1:-1:-1;;;43050:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43105:58;-1:-1:-1;;;;;43105:22:0;;43128:10;43148:4;43155:7;43105:22;:58::i;:::-;43179:18;;;;;;;;;;;;;;;;;42055:1150;;;;;;;;;:::o;37219:39::-;;;-1:-1:-1;;;;;37219:39:0;;:::o;39468:359::-;39558:13;;:42;;;;;;39594:4;39558:42;;;;;;-1:-1:-1;;;;;;;;;39558:13:0;;;;:27;;:42;;;;;;;;;;;;;;;:13;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39558:42:0;;-1:-1:-1;39615:16:0;39611:77;;-1:-1:-1;;39655:21:0;;39648:28;;39611:77;39705:114;39807:11;39731:73;39799:4;39731:63;39782:11;;39731:46;39762:14;;39731:26;:24;:26::i;:46::-;:50;;:63::i;:73::-;:87;;;;;39705:21;;;39731:87;;39705:25;:114::i;:::-;39698:121;;;39468:359;;:::o;36935:36::-;;;;:::o;39334:126::-;39391:7;39418:34;39427:15;39444:7;;39418:8;:34::i;:::-;39411:41;;39334:126;:::o;51992:319::-;52071:1;52061:7;:11;52053:41;;;;;-1:-1:-1;;;52053:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52105:36;52121:10;52133:7;52105:15;:36::i;:::-;52206:10;52186:31;;;;:19;:31;;;;;;:44;;52222:7;52186:35;:44::i;:::-;52172:10;52152:31;;;;:19;:31;;;;;:78;;;;52256:11;;52241:62;;-1:-1:-1;;;;;52256:11:0;;;;52295:7;52241:41;:62::i;36720:33::-;;;;:::o;37053:31::-;;;;:::o;36689:24::-;;;-1:-1:-1;;;;;36689:24:0;;:::o;37267:58::-;;;;;;;;;;;;;:::o;36902:26::-;;;;:::o;52319:228::-;52385:18;;52377:32;;;;;;52462:14;;:23;;;;;;;;52420:86;;-1:-1:-1;;;;;52462:14:0;;:21;;:23;;;;;;;;;;;;;;:14;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52462:23:0;52487:18;;52435:11;;-1:-1:-1;;;;;52435:11:0;;52462:23;52420:41;:86::i;:::-;52538:1;52517:18;:22;52319:228::o;36660:22::-;;;;:::o;36760:26::-;;;;:::o;37135:33::-;;;-1:-1:-1;;;;;37135:33:0;;:::o;36978:29::-;;;;:::o;37332:47::-;;;;;;;;;;;;;:::o;37175:37::-;;;-1:-1:-1;;;;;37175:37:0;;:::o;48255:382::-;48323:33;48359:25;;;:15;:25;;;;;;48403:19;;;;;;:42;;;;;;;;;48395:51;;;;;;48457:19;;;:42;;;;48479:20;48457:42;;;;;;48550:18;;48570:19;;;;-1:-1:-1;48517:18:0;;;48510:80;;-1:-1:-1;;;;;48517:18:0;;;;48550;;;48510:39;:80::i;:::-;48606:23;;;;;;;;;;;;;;;;;48255:382;;:::o;37014:32::-;;;;:::o;39835:359::-;39925:13;;:42;;;;;;39961:4;39925:42;;;;;;-1:-1:-1;;;;;;;;;39925:13:0;;;;:27;;:42;;;;;;;;;;;;;;;:13;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39925:42:0;;-1:-1:-1;39982:16:0;39978:77;;-1:-1:-1;;40022:21:0;;40015:28;;39978:77;40072:114;40174:11;40098:73;40166:4;40098:63;40149:11;;40098:46;40129:14;;40098:26;:24;:26::i;:73::-;:87;;;;;40072:21;;;40098:87;;40072:25;:114::i;43419:3050::-;43560:21;43630:32;;;:15;:32;;;;;43560:21;43681:19;;;;;;:42;;;;;;;;;43673:51;;;;;;43766:3;43743:12;:20;;;:26;43735:35;;;;;;43781:19;;;:39;;;;43803:17;43781:39;;;43880:29;;:::i;:::-;43920;;:::i;:::-;44001:11;;:20;;;;;;;;-1:-1:-1;;;;;44001:11:0;;;;:18;;:20;;;;;;;;;;;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44001:20:0;43979:18;;;;-1:-1:-1;;;;;43979:42:0;;;:18;;:42;43975:706;;;44054:83;;;;;;;;44067:18;;-1:-1:-1;;;;;44067:18:0;;;44054:83;;44087:19;;;;44054:83;;;;;;;;44115:11;;:20;;;;;;;44054:83;;;;;44115:11;;;;;:18;;:20;;;;;44054:83;;44115:20;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44115:20:0;-1:-1:-1;;;;;44054:83:0;;;;;;44168:63;;;;;;;;44181:10;44168:63;;44115:20;44168:63;;;;;;44209:11;;:20;;;;;;;44042:95;;-1:-1:-1;44168:63:0;;;;;;44209:11;;:18;;:20;;;;;44115;44209;;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44209:20:0;-1:-1:-1;;;;;44168:63:0;;;;;;44285:14;;44209:20;44316:16;;;44252:15;;;;44285:14;;-1:-1:-1;44252:81:0;;:32;;;;44309:4;;44252:32;:81::i;:::-;43975:706;;;44386:63;;;;;;;;44399:10;44386:63;;;;;;;;;44427:11;;:20;;;;;;;44386:63;;;;;-1:-1:-1;;;;;44427:11:0;;;;:18;;:20;;;;;;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44427:20:0;-1:-1:-1;;;;;44386:63:0;;;;;;44480:83;;;;;;;;44493:18;;;;44480:83;;44513:19;;;;44427:20;44480:83;;;;;;;44541:11;;:20;;;;;;;44374:75;;-1:-1:-1;44480:83:0;;;;;;44541:11;;:18;;:20;;;;;44427;44541;;;;;;:11;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44541:20:0;-1:-1:-1;;;;;44480:83:0;;;;;;44617:14;;44541:20;44648:16;;;44584:15;;;;44468:95;;-1:-1:-1;44584:81:0;;:32;;;;44641:4;;44584:32;:81::i;:::-;44774:14;;:24;;;;;;;;44731:19;;44802:4;;44753:46;;-1:-1:-1;;;;;44774:14:0;;;;:22;;:24;;;;;;;;;;;;;;;44731:19;44774:14;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44774:24:0;;44753:16;;;;:20;:46::i;:::-;:53;;;;;44860:14;;:24;;;;;;;;44753:53;;;;;-1:-1:-1;44817:19:0;;44888:4;;44839:46;;-1:-1:-1;;;;;44860:14:0;;:22;;:24;;;;;;;;;;;;;;;44817:19;44860:14;:24;;;;;;;;;;44839:46;:53;;;;;;44817:75;;44946:33;44967:11;44946:9;:16;;;:20;;:33;;;;:::i;:::-;44927:16;;;;:52;;;;45009:16;;;:33;;45030:11;45009:20;:33::i;:::-;44990:16;;;;:52;;;;45106:14;;:23;;;;;;;;45077:66;;-1:-1:-1;;;;;45106:14:0;;;;:21;;:23;;;;;;;;;;;:14;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45106:23:0;45077:15;;;;-1:-1:-1;;;;;45077:28:0;;45131:11;45077:28;:66::i;:::-;45183:14;;:23;;;;;;;;45154:66;;-1:-1:-1;;;;;45183:14:0;;:21;;:23;;;;;;;;;;;;;;:14;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45183:23:0;45154:15;;;;-1:-1:-1;;;;;45154:28:0;;45208:11;45154:28;:66::i;:::-;45357:16;;;45371:1;45357:16;;;;;;;;;45233:20;;;;;;45323:31;;45357:16;;;;45323:31;;45357:16;;;;;-1:-1:-1;45357:16:0;45323:50;;45453:96;45471:9;45482;45493:55;;;;;;;;45503:9;45493:55;;;;45514:12;:33;;;45493:55;;;45453:17;:96::i;:::-;45436:113;;45576:14;45591:1;45576:17;;;;;;;;;;;;;;45564:29;;45623:14;45638:1;45623:17;;;;;;;;;;;;;;45608:32;;45670:14;45685:1;45670:17;;;;;;;;;;;;;;45655:32;;45739:45;45754:9;:14;;;45782:1;45770:9;:13;;;;;;45739:14;:45::i;:::-;45810:14;;45795:45;;45838:1;45826:9;:13;;45795:45;45869:1;45857:9;:13;:18;45853:97;;45913:18;;:25;;45936:1;45913:22;:25::i;:::-;45892:18;:46;45853:97;46014:16;;45998:32;;46041:16;;:18;;;;;;;;;;;;;46104:264;;;;;;;;46130:9;:14;;;-1:-1:-1;;;;;46104:264:0;;;;;46159:12;46104:264;;;;46186:9;:14;;;-1:-1:-1;;;;;46104:264:0;;;;;46215:12;46104:264;;;;46242:12;:23;;;46104:264;;;;46280:9;46104:264;;;;46304:5;46104:264;;;;;;46324:12;:33;;;46104:264;;;46072:14;:29;46087:13;46072:29;;;;;;;;;;;:296;;;;;;;;;;;;;-1:-1:-1;;;;;46072:296:0;;;;;-1:-1:-1;;;;;46072:296:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46072:296:0;;;;;-1:-1:-1;;;;;46072:296:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46386:42;46397:15;46414:13;46386:42;;;;;;;;;;;;;;;;;;;;;;;;46441:20;;;;;;;;;43419:3050;;;;;;:::o;36869:26::-;;;;:::o;8976:138::-;9069:5;;;9064:16;;;;9056:50;;;;;-1:-1:-1;;;9056:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8976:138;;;;:::o;9122:151::-;9180:9;9210:6;;;:30;;-1:-1:-1;;9225:5:0;;;9239:1;9234;9225:5;9234:1;9220:15;;;;;:20;9210:30;9202:63;;;;;-1:-1:-1;;;9202:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8831:137;8924:5;;;8919:16;;;;8911:49;;;;;-1:-1:-1;;;8911:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;32777:633;33181:10;;;33180:62;;-1:-1:-1;33197:39:0;;;;;;33221:4;33197:39;;;;-1:-1:-1;;;;;33197:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33197:39:0;:44;33180:62;33172:129;;;;-1:-1:-1;;;33172:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33339:62;;;-1:-1:-1;;;;;33339:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33362:22;33339:62;;;33312:90;;33332:5;;33312:19;:90::i;41883:164::-;41961:22;41975:7;41961:13;:22::i;:::-;41994:13;;:45;;;;;;-1:-1:-1;;;;;41994:45:0;;;;;;;;;;;;;;;:13;;;;;:28;;:45;;;;;-1:-1:-1;;41994:45:0;;;;;;;-1:-1:-1;41994:13:0;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41883:164;;:::o;51346:299::-;51419:7;51439:11;51469:1;51465;:5;51461:177;;;51493:8;:1;51499;51493:5;:8::i;:::-;51487:14;-1:-1:-1;51539:1:0;51523:13;51487:14;51531:4;51523:7;:13::i;:::-;:17;;;;;;51516:24;;;;;51461:177;51579:8;:1;51585;51579:5;:8::i;:::-;51573:14;-1:-1:-1;51625:1:0;51609:13;51573:14;51617:4;51609:7;:13::i;32041:211::-;32185:58;;;-1:-1:-1;;;;;32185:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32208:23;32185:58;;;32158:86;;32178:5;;32158:19;:86::i;41713:162::-;41790:22;41804:7;41790:13;:22::i;:::-;41823:13;;:44;;;;;;-1:-1:-1;;;;;41823:44:0;;;;;;;;;;;;;;;:13;;;;;:27;;:44;;;;;-1:-1:-1;;41823:44:0;;;;;;;-1:-1:-1;41823:13:0;:44;;;;;;;;;;32260:248;32431:68;;;-1:-1:-1;;;;;32431:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32454:27;32431:68;;;32404:96;;32424:5;;32404:19;:96::i;:::-;32260:248;;;;:::o;40666:571::-;40750:17;:15;:17::i;:::-;40726:21;:41;40802:17;:15;:17::i;:::-;40778:21;:41;40847:26;:24;:26::i;:::-;40830:14;:43;-1:-1:-1;;;;;40888:21:0;;;40884:346;;40927:15;40944;40963:21;40976:7;40963:12;:21::i;:::-;-1:-1:-1;;;;;40999:21:0;;;;;;;;:12;:21;;;;;;;;:31;;;;41045:12;:21;;;;;:31;;;;41126:21;;41091:23;:32;;;;;:56;41197:21;;41162:23;:32;;;;:56;;;;-1:-1:-1;;40666:571:0:o;22879:106::-;22937:7;22968:1;22964;:5;:13;;22976:1;22964:13;;;-1:-1:-1;22972:1:0;;22957:20;-1:-1:-1;22879:106:0:o;46477:1770::-;46710:13;;46673:16;;;;46644;;46673:55;;-1:-1:-1;;;;;46673:28:0;;;;46710:13;;46673:28;:55::i;:::-;46776:13;;46739:16;;;;:55;;-1:-1:-1;;;;;46739:28:0;;;;46776:13;;46739:28;:55::i;:::-;46844:13;;46860:17;;;;46807:16;;;;:71;;-1:-1:-1;;;;;46807:28:0;;;;46844:13;;;46807:28;:71::i;:::-;46926:13;;46942:17;;;;46889:16;;;;:71;;-1:-1:-1;;;;;46889:28:0;;;;46926:13;;;46889:28;:71::i;:::-;46973:18;46994:79;47068:4;47016:49;47038:5;:26;;;47016:10;:17;;;:21;;:49;;;;:::i;:::-;:56;;;;;46994:17;;;;;47016:56;;46994:21;:79::i;:::-;46973:100;;47084:18;47105:79;47179:4;47127:49;47149:5;:26;;;47127:10;:17;;;:21;;:49;;;;:::i;47105:79::-;47385:13;;47438:16;;;;;47482;;;;47518:17;;;;;47554;;;;47680:14;;47385:324;;;;;-1:-1:-1;;;;;47385:324:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47656:4;47385:324;;;;;;;;;;;;-1:-1:-1;;;;;;;47385:13:0;;;:26;;:324;;;;;;;;;;;;;;-1:-1:-1;47385:13:0;:324;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47385:324:0;;;;;;;;;;;;47793:17;;;;47385:324;;-1:-1:-1;47385:324:0;;-1:-1:-1;47385:324:0;;-1:-1:-1;47778:32:0;;47774:145;;;47857:15;;47874:17;;;;47827:16;;;;:80;;-1:-1:-1;;;;;47827:29:0;;;;47874:32;;;47827:29;:80::i;:::-;47948:10;:17;;;47933:12;:32;47929:145;;;48012:15;;48029:17;;;;47982:16;;;;:80;;-1:-1:-1;;;;;47982:29:0;;;;48029:32;;;47982:29;:80::i;:::-;48107:16;;;48121:1;48107:16;;;;;;;;;48084:20;;48107:16;;;48084:20;;48107:16;;;;;-1:-1:-1;48107:16:0;48084:39;;48143:9;48134:3;48138:1;48134:6;;;;;;;;;;;;;:18;;;;;48172:12;48163:3;48167:1;48163:6;;;;;;;;;;;;;:21;;;;;48204:12;48195:3;48199:1;48195:6;;;;;;;;;;;;;;;;;:21;48235:3;46477:1770;-1:-1:-1;;;;;;;;;46477:1770:0:o;34457:774::-;34907:69;;;;;;;;;;;;;;;;;;34881:23;;34907:69;;-1:-1:-1;;;;;34907:27:0;;;34935:4;;34907:27;:69::i;:::-;34991:17;;34881:95;;-1:-1:-1;34991:21:0;34987:237;;35146:10;35135:30;;;;;;;;;;;;;;;-1:-1:-1;35135:30:0;35127:85;;;;-1:-1:-1;;;35127:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26929:229;27066:12;27098:52;27120:6;27128:4;27134:1;27137:12;27098:21;:52::i;:::-;27091:59;26929:229;-1:-1:-1;;;;26929:229:0:o;28049:571::-;28219:12;28277:5;28252:21;:30;;28244:81;;;;-1:-1:-1;;;28244:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28344:18;28355:6;28344:10;:18::i;:::-;28336:60;;;;;-1:-1:-1;;;28336:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28470:12;28484:23;28511:6;-1:-1:-1;;;;;28511:11:0;28530:5;28537:4;28511:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28469:73;;;;28560:52;28578:7;28587:10;28599:12;28560:17;:52::i;:::-;28553:59;28049:571;-1:-1:-1;;;;;;;28049:571:0:o;23989:444::-;24369:20;24417:8;;;23989:444::o;30698:777::-;30848:12;30877:7;30873:595;;;-1:-1:-1;30908:10:0;30901:17;;30873:595;31022:17;;:21;31018:439;;31285:10;31279:17;31346:15;31333:10;31329:2;31325:19;31318:44;31233:148;31421:20;;-1:-1:-1;31421:20:0;;;;;;;;;;;;;;;;;31428:12;;31421:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://eb0de1f4cb77826c8c839bebed9978af31378c112175b0f4a128e173b6259823
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.