Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 6,068 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 12858091 | 1082 days ago | IN | 0 ETH | 0.00114556 | ||||
Toggle Contract ... | 11457382 | 1298 days ago | IN | 0 ETH | 0.00181896 | ||||
Zap Out | 11273288 | 1326 days ago | IN | 0 ETH | 0.01248817 | ||||
Zap In | 11161474 | 1344 days ago | IN | 14 ETH | 0.01023438 | ||||
Zap In | 11161310 | 1344 days ago | IN | 0 ETH | 0.01883483 | ||||
Zap In | 11160789 | 1344 days ago | IN | 0.5 ETH | 0.00888574 | ||||
Zap In | 11160779 | 1344 days ago | IN | 0 ETH | 0.00826708 | ||||
Zap In | 11160762 | 1344 days ago | IN | 0 ETH | 0.01058897 | ||||
Zap Out | 11160612 | 1344 days ago | IN | 0 ETH | 0.0205832 | ||||
Zap Out | 11160493 | 1344 days ago | IN | 0 ETH | 0.00454613 | ||||
Zap In | 11160454 | 1344 days ago | IN | 4.5 ETH | 0.01196194 | ||||
Zap Out | 11160408 | 1344 days ago | IN | 0 ETH | 0.02138721 | ||||
Zap Out | 11160407 | 1344 days ago | IN | 0 ETH | 0.09864823 | ||||
Zap In | 11160276 | 1344 days ago | IN | 0 ETH | 0.00671271 | ||||
Zap Out | 11159990 | 1344 days ago | IN | 0 ETH | 0.00928477 | ||||
Zap Out | 11159883 | 1344 days ago | IN | 0 ETH | 0.03476363 | ||||
Zap Out | 11159800 | 1344 days ago | IN | 0 ETH | 0.01799547 | ||||
Zap In | 11159551 | 1344 days ago | IN | 0 ETH | 0.01392136 | ||||
Zap Out | 11159508 | 1344 days ago | IN | 0 ETH | 0.012501 | ||||
Zap Out | 11159434 | 1344 days ago | IN | 0 ETH | 0.02500415 | ||||
Zap In | 11159371 | 1344 days ago | IN | 0.1248 ETH | 0.01658032 | ||||
Zap Out | 11159110 | 1344 days ago | IN | 0 ETH | 0.12369084 | ||||
Zap Out | 11159081 | 1344 days ago | IN | 0 ETH | 0.199863 | ||||
Zap In | 11158628 | 1344 days ago | IN | 0 ETH | 0.013574 | ||||
Zap Out | 11158302 | 1344 days ago | IN | 0 ETH | 0.00635227 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
11363806 | 1313 days ago | 540 ETH | ||||
11363806 | 1313 days ago | 540 ETH | ||||
11161474 | 1344 days ago | 14 ETH | ||||
11160789 | 1344 days ago | 0.5 ETH | ||||
11160454 | 1344 days ago | 4.5 ETH | ||||
11159371 | 1344 days ago | 0.1248 ETH | ||||
11157087 | 1344 days ago | 2 ETH | ||||
11157010 | 1344 days ago | 15 ETH | ||||
11156556 | 1344 days ago | 31 ETH | ||||
11156370 | 1344 days ago | 7.4 ETH | ||||
11156027 | 1344 days ago | 4.7 ETH | ||||
11154920 | 1345 days ago | 0.3 ETH | ||||
11154920 | 1345 days ago | 0.2 ETH | ||||
11154751 | 1345 days ago | 0.25 ETH | ||||
11146963 | 1346 days ago | 3 ETH | ||||
11146861 | 1346 days ago | 0.5 ETH | ||||
11144341 | 1346 days ago | 14.5 ETH | ||||
11142232 | 1347 days ago | 0.5 ETH | ||||
11142155 | 1347 days ago | 1.8 ETH | ||||
11142103 | 1347 days ago | 0.0858 ETH | ||||
11141790 | 1347 days ago | 96 ETH | ||||
11141474 | 1347 days ago | 1 ETH | ||||
11141212 | 1347 days ago | 1.22 ETH | ||||
11138420 | 1347 days ago | 5 ETH | ||||
11138096 | 1347 days ago | 60 ETH |
Loading...
Loading
Contract Name:
yVault_ZapInOut_General_V1_4
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-02 */ // ███████╗░█████╗░██████╗░██████╗░███████╗██████╗░░░░███████╗██╗ // ╚════██║██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔══██╗░░░██╔════╝██║ // ░░███╔═╝███████║██████╔╝██████╔╝█████╗░░██████╔╝░░░█████╗░░██║ // ██╔══╝░░██╔══██║██╔═══╝░██╔═══╝░██╔══╝░░██╔══██╗░░░██╔══╝░░██║ // ███████╗██║░░██║██║░░░░░██║░░░░░███████╗██║░░██║██╗██║░░░░░██║ // ╚══════╝╚═╝░░╚═╝╚═╝░░░░░╚═╝░░░░░╚══════╝╚═╝░░╚═╝╚═╝╚═╝░░░░░╚═╝ // Copyright (C) 2020 zapper, nodar, suhail, seb, sumit, apoorv // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // ///@author Zapper ///@notice This contract adds/removes liquidity to/from yEarn Vaults using ETH or ERC20 Tokens. // SPDX-License-Identifier: GPLv2 // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.6.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}( data ); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal virtual view returns (address payable) { return msg.sender; } function _msgData() internal virtual view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: yVault_ZapInOut_General_V1_2.sol /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface IUniswapV2Factory { function getPair(address tokenA, address tokenB) external view returns (address); } interface IUniswapRouter02 { //get estimated amountOut 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); //token 2 token 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); //eth 2 token function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); //token 2 eth 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); } interface yVault { function deposit(uint256) external; function withdraw(uint256) external; function getPricePerFullShare() external view returns (uint256); function token() external view returns (address); } interface ICurveZapInGeneral { function ZapIn( address _toWhomToIssue, address _IncomingTokenAddress, address _curvePoolExchangeAddress, uint256 _IncomingTokenQty, uint256 _minPoolTokens ) external payable returns (uint256 crvTokensBought); } interface ICurveZapOutGeneral { function ZapOut( address payable _toWhomToIssue, address _curveExchangeAddress, uint256 _tokenCount, uint256 _IncomingCRV, address _ToTokenAddress, uint256 _minToTokens ) external returns (uint256 ToTokensBought); } interface IAaveLendingPoolAddressesProvider { function getLendingPool() external view returns (address); function getLendingPoolCore() external view returns (address payable); } interface IAaveLendingPool { function deposit( address _reserve, uint256 _amount, uint16 _referralCode ) external payable; } interface IAToken { function redeem(uint256 _amount) external; function underlyingAssetAddress() external returns (address); } interface IWETH { function deposit() external payable; function withdraw(uint256) external; } contract yVault_ZapInOut_General_V1_4 is ReentrancyGuard, Ownable { using SafeMath for uint256; using Address for address; using SafeERC20 for IERC20; bool public stopped = false; uint16 public goodwill; IUniswapV2Factory private constant UniSwapV2FactoryAddress = IUniswapV2Factory( 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f ); IUniswapRouter02 private constant uniswapRouter = IUniswapRouter02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); ICurveZapInGeneral public CurveZapInGeneral = ICurveZapInGeneral( 0xBB7678acd5494cA06d9738DCBD2BdF1c6d58672f ); ICurveZapOutGeneral public CurveZapOutGeneral = ICurveZapOutGeneral( 0x4bF331Aa2BfB0869315fB81a350d109F4839f81b ); IAaveLendingPoolAddressesProvider private constant lendingPoolAddressProvider = IAaveLendingPoolAddressesProvider( 0x24a42fD28C976A61Df5D00D0599C34c4f90748c8 ); address private constant yCurveExchangeAddress = 0xbBC81d23Ea2c3ec7e56D39296F0cbB648873a5d3; address private constant sBtcCurveExchangeAddress = 0x7fC77b5c7614E1533320Ea6DDc2Eb61fa00A9714; address private constant bUSDCurveExchangeAddress = 0xb6c057591E073249F2D9D88Ba59a46CFC9B59EdB; address private constant yCurvePoolTokenAddress = 0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8; address private constant sBtcCurvePoolTokenAddress = 0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3; address private constant bUSDCurvePoolTokenAddress = 0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B; mapping(address => address) internal token2Exchange; address private constant ETHAddress = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address private constant wethTokenAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address private constant zgoodwillAddress = 0xE737b6AfEC2320f616297e59445b60a11e3eF75F; uint256 private constant deadline = 0xf000000000000000000000000000000000000000000000000000000000000000; event Zapin( address _toWhomToIssue, address _toYVaultAddress, uint256 _Outgoing ); event Zapout( address _toWhomToIssue, address _fromYVaultAddress, address _toTokenAddress, uint256 _tokensRecieved ); constructor(uint16 _goodwill) public { goodwill = _goodwill; token2Exchange[yCurvePoolTokenAddress] = yCurveExchangeAddress; token2Exchange[bUSDCurvePoolTokenAddress] = bUSDCurveExchangeAddress; token2Exchange[sBtcCurvePoolTokenAddress] = sBtcCurveExchangeAddress; } // circuit breaker modifiers modifier stopInEmergency { if (stopped) { revert("Temporarily Paused"); } else { _; } } function updateCurveZapIn(address CurveZapInGeneralAddress) public onlyOwner { require(CurveZapInGeneralAddress != address(0), "Invalid Address"); CurveZapInGeneral = ICurveZapInGeneral(CurveZapInGeneralAddress); } function updateCurveZapOut(address CurveZapOutGeneralAddress) public onlyOwner { require(CurveZapOutGeneralAddress != address(0), "Invalid Address"); CurveZapOutGeneral = ICurveZapOutGeneral(CurveZapOutGeneralAddress); } function addNewCurveExchange(address curvePoolToken, address curveExchangeAddress) public onlyOwner { require(curvePoolToken != address(0) && curveExchangeAddress != address(0), "Invalid Address"); token2Exchange[curvePoolToken] = curveExchangeAddress; } /** @notice This function is used to add liquidity to yVaults @param _toWhomToIssue recipient address @param _toYVaultAddress The address of vault to add liquidity to @param _vaultType Type of underlying token: 0 token; 1 aToken; 2 LP token @param _fromTokenAddress The token used for investment (address(0x00) if ether) @param _amount The amount of ERC to invest @param _minTokensSwapped for slippage @return yTokensRec */ function ZapIn( address _toWhomToIssue, address _toYVaultAddress, uint16 _vaultType, address _fromTokenAddress, uint256 _amount, uint256 _minTokensSwapped ) public payable nonReentrant stopInEmergency returns (uint256) { yVault vaultToEnter = yVault(_toYVaultAddress); address underlyingVaultToken = vaultToEnter.token(); if (_fromTokenAddress == address(0)) { require(msg.value > 0, "ERR: No ETH sent"); } else { require(_amount > 0, "Err: No Tokens Sent"); require(msg.value == 0, "ERR: ETH sent with Token"); IERC20(_fromTokenAddress).safeTransferFrom( msg.sender, address(this), _amount ); } if (underlyingVaultToken == _fromTokenAddress) { IERC20(underlyingVaultToken).safeApprove( address(vaultToEnter), _amount ); vaultToEnter.deposit(_amount); } else { // Curve Vaults if (_vaultType == 2) { address curveExchangeAddr = token2Exchange[underlyingVaultToken]; uint256 tokensBought; if (_fromTokenAddress == address(0)) { tokensBought = CurveZapInGeneral.ZapIn{value: msg.value}( address(this), address(0), curveExchangeAddr, msg.value, _minTokensSwapped ); } else { IERC20(_fromTokenAddress).safeApprove( address(CurveZapInGeneral), _amount ); tokensBought = CurveZapInGeneral.ZapIn( address(this), _fromTokenAddress, curveExchangeAddr, _amount, _minTokensSwapped ); } IERC20(underlyingVaultToken).safeApprove( address(vaultToEnter), tokensBought ); vaultToEnter.deposit(tokensBought); } else if (_vaultType == 1) { address underlyingAsset = IAToken(underlyingVaultToken) .underlyingAssetAddress(); uint256 tokensBought; if (_fromTokenAddress == address(0)) { tokensBought = _eth2Token( underlyingAsset, _minTokensSwapped ); } else { tokensBought = _token2Token( _fromTokenAddress, underlyingAsset, _amount, _minTokensSwapped ); } IERC20(underlyingAsset).safeApprove( lendingPoolAddressProvider.getLendingPoolCore(), tokensBought ); IAaveLendingPool(lendingPoolAddressProvider.getLendingPool()) .deposit(underlyingAsset, tokensBought, 0); uint256 aTokensBought = IERC20(underlyingVaultToken).balanceOf( address(this) ); IERC20(underlyingVaultToken).safeApprove( address(vaultToEnter), aTokensBought ); vaultToEnter.deposit(aTokensBought); } else { uint256 tokensBought; if (_fromTokenAddress == address(0)) { tokensBought = _eth2Token( underlyingVaultToken, _minTokensSwapped ); } else { tokensBought = _token2Token( _fromTokenAddress, underlyingVaultToken, _amount, _minTokensSwapped ); } IERC20(underlyingVaultToken).safeApprove( address(vaultToEnter), tokensBought ); vaultToEnter.deposit(tokensBought); } } uint256 yTokensRec = IERC20(address(vaultToEnter)).balanceOf( address(this) ); //transfer goodwill uint256 goodwillPortion = _transferGoodwill( address(vaultToEnter), yTokensRec ); IERC20(address(vaultToEnter)).safeTransfer( _toWhomToIssue, yTokensRec.sub(goodwillPortion) ); emit Zapin( _toWhomToIssue, address(vaultToEnter), yTokensRec.sub(goodwillPortion) ); return (yTokensRec.sub(goodwillPortion)); } /** @notice This function is used to remove liquidity from yVaults @param _toWhomToIssue recipient address @param _ToTokenContractAddress The address of the token to withdraw @param _fromYVaultAddress The address of the vault to exit @param _vaultType Type of underlying token: 0 token; 1 aToken; 2 LP token @param _IncomingAmt The amount of vault tokens removed @param _minTokensRec for slippage @return toTokensReceived */ function ZapOut( address _toWhomToIssue, address _ToTokenContractAddress, address _fromYVaultAddress, uint16 _vaultType, uint256 _IncomingAmt, uint256 _minTokensRec ) public nonReentrant stopInEmergency returns (uint256) { yVault vaultToExit = yVault(_fromYVaultAddress); address underlyingVaultToken = vaultToExit.token(); IERC20(address(vaultToExit)).safeTransferFrom( msg.sender, address(this), _IncomingAmt ); uint256 goodwillPortion = _transferGoodwill( address(vaultToExit), _IncomingAmt ); vaultToExit.withdraw(_IncomingAmt.sub(goodwillPortion)); uint256 underlyingReceived = IERC20(underlyingVaultToken).balanceOf( address(this) ); uint256 toTokensReceived; if(_ToTokenContractAddress == underlyingVaultToken) { IERC20(underlyingVaultToken).safeTransfer( _toWhomToIssue, underlyingReceived ); toTokensReceived = underlyingReceived; } else { if(_vaultType == 2) { toTokensReceived = _withdrawFromCurve( underlyingVaultToken, underlyingReceived, _toWhomToIssue, _ToTokenContractAddress, _minTokensRec ); } else if(_vaultType == 1) { // unwrap atoken IAToken(underlyingVaultToken).redeem(underlyingReceived); address underlyingAsset = IAToken(underlyingVaultToken) .underlyingAssetAddress(); // swap if(_ToTokenContractAddress == address(0)) { toTokensReceived = _token2Eth( underlyingAsset, underlyingReceived, payable(_toWhomToIssue), _minTokensRec ); } else { toTokensReceived = _token2Token( underlyingAsset, _ToTokenContractAddress, underlyingReceived, _minTokensRec ); IERC20(_ToTokenContractAddress).safeTransfer( _toWhomToIssue, toTokensReceived ); } } else { if(_ToTokenContractAddress == address(0)) { toTokensReceived = _token2Eth( underlyingVaultToken, underlyingReceived, payable(_toWhomToIssue), _minTokensRec ); } else { toTokensReceived = _token2Token( underlyingVaultToken, _ToTokenContractAddress, underlyingReceived, _minTokensRec ); IERC20(_ToTokenContractAddress).safeTransfer( _toWhomToIssue, toTokensReceived ); } } } emit Zapout( _toWhomToIssue, _fromYVaultAddress, _ToTokenContractAddress, toTokensReceived ); return toTokensReceived; } function _withdrawFromCurve( address _CurvePoolToken, uint256 _tokenAmt, address _toWhomToIssue, address _ToTokenContractAddress, uint256 _minTokensRec ) internal returns(uint256) { IERC20(_CurvePoolToken).safeApprove( address(CurveZapOutGeneral), _tokenAmt ); address curveExchangeAddr = token2Exchange[_CurvePoolToken]; uint256 tokenCount = 4; if(curveExchangeAddr == sBtcCurveExchangeAddress) { tokenCount = 3; } return( CurveZapOutGeneral.ZapOut( payable(_toWhomToIssue), curveExchangeAddr, tokenCount, _tokenAmt, _ToTokenContractAddress, _minTokensRec ) ); } /** @notice This function is used to swap eth for tokens @param _tokenContractAddress Token address which we want to buy @param minTokens recieved after swap for slippage @return tokensBought The quantity of token bought */ function _eth2Token(address _tokenContractAddress, uint256 minTokens) internal returns (uint256 tokensBought) { if(_tokenContractAddress == wethTokenAddress) { IWETH(wethTokenAddress).deposit{value: msg.value}(); return msg.value; } address[] memory path = new address[](2); path[0] = wethTokenAddress; path[1] = _tokenContractAddress; tokensBought = uniswapRouter.swapExactETHForTokens{value: msg.value}( 1, path, address(this), deadline )[path.length - 1]; require(tokensBought >= minTokens, "ERR: High Slippage"); } /** @notice This function is used to swap tokens @param _FromTokenContractAddress The token address to swap from @param _ToTokenContractAddress The token address to swap to @param tokens2Trade The amount of tokens to swap @param minTokens recieved after swap for slippage @return tokenBought The quantity of tokens bought */ function _token2Token( address _FromTokenContractAddress, address _ToTokenContractAddress, uint256 tokens2Trade, uint256 minTokens ) internal returns (uint256 tokenBought) { if (_FromTokenContractAddress == _ToTokenContractAddress) { return tokens2Trade; } IERC20(_FromTokenContractAddress).safeApprove( address(uniswapRouter), tokens2Trade ); if (_FromTokenContractAddress != wethTokenAddress) { if (_ToTokenContractAddress != wethTokenAddress) { address[] memory path = new address[](3); path[0] = _FromTokenContractAddress; path[1] = wethTokenAddress; path[2] = _ToTokenContractAddress; tokenBought = uniswapRouter.swapExactTokensForTokens( tokens2Trade, 1, path, address(this), deadline )[path.length - 1]; } else { address[] memory path = new address[](2); path[0] = _FromTokenContractAddress; path[1] = wethTokenAddress; tokenBought = uniswapRouter.swapExactTokensForTokens( tokens2Trade, 1, path, address(this), deadline )[path.length - 1]; } } else { address[] memory path = new address[](2); path[0] = wethTokenAddress; path[1] = _ToTokenContractAddress; tokenBought = uniswapRouter.swapExactTokensForTokens( tokens2Trade, 1, path, address(this), deadline )[path.length - 1]; } require(tokenBought > minTokens, "ERR: High Slippage"); } function _token2Eth( address _FromTokenContractAddress, uint256 tokens2Trade, address payable _toWhomToIssue, uint256 minTokens ) internal returns (uint256) { if (_FromTokenContractAddress == wethTokenAddress) { IWETH(wethTokenAddress).withdraw(tokens2Trade); _toWhomToIssue.transfer(tokens2Trade); return tokens2Trade; } IERC20(_FromTokenContractAddress).safeApprove( address(uniswapRouter), tokens2Trade ); address[] memory path = new address[](2); path[0] = _FromTokenContractAddress; path[1] = wethTokenAddress; uint256 ethBought = uniswapRouter.swapExactTokensForETH( tokens2Trade, 1, path, _toWhomToIssue, deadline )[path.length - 1]; require(ethBought > minTokens, "Error: High Slippage"); return ethBought; } /** @notice This function is used to calculate and transfer goodwill @param _tokenContractAddress Token in which goodwill is deducted @param tokens2Trade The total amount of tokens to be zapped in @return goodwillPortion The quantity of goodwill deducted */ function _transferGoodwill( address _tokenContractAddress, uint256 tokens2Trade ) internal returns (uint256 goodwillPortion) { goodwillPortion = SafeMath.div( SafeMath.mul(tokens2Trade, goodwill), 10000 ); if (goodwillPortion == 0) { return 0; } IERC20(_tokenContractAddress).safeTransfer( zgoodwillAddress, goodwillPortion ); } function set_new_goodwill(uint16 _new_goodwill) public onlyOwner { require( _new_goodwill >= 0 && _new_goodwill < 10000, "GoodWill Value not allowed" ); goodwill = _new_goodwill; } function inCaseTokengetsStuck(IERC20 _TokenAddress) public onlyOwner { uint256 qty = _TokenAddress.balanceOf(address(this)); IERC20(address(_TokenAddress)).safeTransfer(owner(), qty); } // - to Pause the contract function toggleContractActive() public onlyOwner { stopped = !stopped; } // - to withdraw any ETH balance sitting in the contract function withdraw() public onlyOwner { uint256 contractBalance = address(this).balance; address payable _to = payable(owner()); _to.transfer(contractBalance); } receive() external payable{} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint16","name":"_goodwill","type":"uint16"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_toWhomToIssue","type":"address"},{"indexed":false,"internalType":"address","name":"_toYVaultAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_Outgoing","type":"uint256"}],"name":"Zapin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_toWhomToIssue","type":"address"},{"indexed":false,"internalType":"address","name":"_fromYVaultAddress","type":"address"},{"indexed":false,"internalType":"address","name":"_toTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokensRecieved","type":"uint256"}],"name":"Zapout","type":"event"},{"inputs":[],"name":"CurveZapInGeneral","outputs":[{"internalType":"contract ICurveZapInGeneral","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CurveZapOutGeneral","outputs":[{"internalType":"contract ICurveZapOutGeneral","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_toYVaultAddress","type":"address"},{"internalType":"uint16","name":"_vaultType","type":"uint16"},{"internalType":"address","name":"_fromTokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minTokensSwapped","type":"uint256"}],"name":"ZapIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_ToTokenContractAddress","type":"address"},{"internalType":"address","name":"_fromYVaultAddress","type":"address"},{"internalType":"uint16","name":"_vaultType","type":"uint16"},{"internalType":"uint256","name":"_IncomingAmt","type":"uint256"},{"internalType":"uint256","name":"_minTokensRec","type":"uint256"}],"name":"ZapOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"curvePoolToken","type":"address"},{"internalType":"address","name":"curveExchangeAddress","type":"address"}],"name":"addNewCurveExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"goodwill","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_TokenAddress","type":"address"}],"name":"inCaseTokengetsStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_new_goodwill","type":"uint16"}],"name":"set_new_goodwill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleContractActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"CurveZapInGeneralAddress","type":"address"}],"name":"updateCurveZapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"CurveZapOutGeneralAddress","type":"address"}],"name":"updateCurveZapOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526001805460ff60a01b19169055600280546001600160a01b031990811673bb7678acd5494ca06d9738dcbd2bdf1c6d58672f1790915560038054909116734bf331aa2bfb0869315fb81a350d109f4839f81b1790553480156200006657600080fd5b50604051620031a3380380620031a3833981810160405260208110156200008c57600080fd5b5051600160009081556200009f620001f3565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001805461ffff909216600160a81b0261ffff60a81b1990921691909117905560046020527fdb0d3319e3aa65f55fe423a9dae5b99f192ba351d568d48d402ccf1ab347382e80546001600160a01b031990811673bbc81d23ea2c3ec7e56d39296f0cbb648873a5d3179091557f1e3eed9690704035a04eacaceca34e96bce22d281827df84322a115037131b938054821673b6c057591e073249f2d9d88ba59a46cfc9b59edb17905573075b1bb99792c9e1041ba13afef80c91a1e70fb36000527fe854cc577af44ece23e49a2d309ca5b6df05936b3cda929750e969af17b2164e8054909116737fc77b5c7614e1533320ea6ddc2eb61fa00a9714179055620001f7565b3390565b612f9c80620002076000396000f3fe6080604052600436106100f75760003560e01c8063798ae4f51161008a578063b10e1dbc11610059578063b10e1dbc1461031e578063d1bd82051461034c578063f2fde38b1461039a578063fbf0c6f1146103cd576100fe565b8063798ae4f51461023a578063819201331461026b5780638da5cb5b146102d65780638ff27fcc146102eb576100fe565b80635901ae54116100c65780635901ae54146101955780635de0398e146101d0578063715018a6146101fc57806375f12b2114610211576100fe565b80631385d24c14610103578063399355d31461011a5780633ccfd60b1461014d578063551196d514610162576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b506101186103e2565b005b34801561012657600080fd5b506101186004803603602081101561013d57600080fd5b50356001600160a01b031661045b565b34801561015957600080fd5b50610118610522565b34801561016e57600080fd5b506101186004803603602081101561018557600080fd5b50356001600160a01b03166105c3565b3480156101a157600080fd5b50610118600480360360408110156101b857600080fd5b506001600160a01b03813581169160200135166106b8565b3480156101dc57600080fd5b506101e56107a1565b6040805161ffff9092168252519081900360200190f35b34801561020857600080fd5b506101186107b2565b34801561021d57600080fd5b50610226610854565b604080519115158252519081900360200190f35b34801561024657600080fd5b5061024f610864565b604080516001600160a01b039092168252519081900360200190f35b34801561027757600080fd5b506102c4600480360360c081101561028e57600080fd5b506001600160a01b03813581169160208101358216916040820135169061ffff6060820135169060808101359060a00135610873565b60408051918252519081900360200190f35b3480156102e257600080fd5b5061024f610cae565b3480156102f757600080fd5b506101186004803603602081101561030e57600080fd5b50356001600160a01b0316610cbd565b34801561032a57600080fd5b506101186004803603602081101561034157600080fd5b503561ffff16610d84565b6102c4600480360360c081101561036257600080fd5b506001600160a01b038135811691602081013582169161ffff6040830135169160608101359091169060808101359060a00135610e58565b3480156103a657600080fd5b50610118600480360360208110156103bd57600080fd5b50356001600160a01b03166117e9565b3480156103d957600080fd5b5061024f6118e2565b6103ea6118f1565b6001546001600160a01b0390811691161461043a576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6001805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6104636118f1565b6001546001600160a01b039081169116146104b3576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6001600160a01b038116610500576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61052a6118f1565b6001546001600160a01b0390811691161461057a576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b476000610585610cae565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f193505050501580156105be573d6000803e3d6000fd5b505050565b6105cb6118f1565b6001546001600160a01b0390811691161461061b576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561066a57600080fd5b505afa15801561067e573d6000803e3d6000fd5b505050506040513d602081101561069457600080fd5b505190506106b46106a3610cae565b6001600160a01b03841690836118f5565b5050565b6106c06118f1565b6001546001600160a01b03908116911614610710576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6001600160a01b0382161580159061073057506001600160a01b03811615155b610773576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015290519081900360640190fd5b6001600160a01b03918216600090815260046020526040902080546001600160a01b03191691909216179055565b600154600160a81b900461ffff1681565b6107ba6118f1565b6001546001600160a01b0390811691161461080a576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b600154600160a01b900460ff1681565b6003546001600160a01b031681565b6000600260005414156108cd576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055600154600160a01b900460ff1615610926576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b60008590506000816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561096657600080fd5b505afa15801561097a573d6000803e3d6000fd5b505050506040513d602081101561099057600080fd5b505190506109a96001600160a01b038316333088611947565b60006109b583876119a7565b90506001600160a01b038316632e1a7d4d6109d08884611a0c565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610a0657600080fd5b505af1158015610a1a573d6000803e3d6000fd5b505050506000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610a6d57600080fd5b505afa158015610a81573d6000803e3d6000fd5b505050506040513d6020811015610a9757600080fd5b5051905060006001600160a01b038b81169085161415610acc57610ac56001600160a01b0385168d846118f5565b5080610c48565b8861ffff1660021415610aed57610ae684838e8e8b611a55565b9050610c48565b8861ffff1660011415610c0c57836001600160a01b031663db006a75836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610b4057600080fd5b505af1158015610b54573d6000803e3d6000fd5b505050506000846001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b9557600080fd5b505af1158015610ba9573d6000803e3d6000fd5b505050506040513d6020811015610bbf57600080fd5b505190506001600160a01b038c16610be457610bdd81848f8b611b5f565b9150610c06565b610bf0818d858b611eee565b9150610c066001600160a01b038d168e846118f5565b50610c48565b6001600160a01b038b16610c2657610ae684838e8a611b5f565b610c32848c848a611eee565b9050610c486001600160a01b038c168d836118f5565b604080516001600160a01b03808f168252808d1660208301528d16818301526060810183905290517fccd66be260e4d251757c46211a144a9df723fe5d98726e537a900b7115b0e74d9181900360800190a160016000559b9a5050505050505050505050565b6001546001600160a01b031690565b610cc56118f1565b6001546001600160a01b03908116911614610d15576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6001600160a01b038116610d62576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b610d8c6118f1565b6001546001600160a01b03908116911614610ddc576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6127108161ffff1610610e36576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6001805461ffff909216600160a81b0261ffff60a81b19909216919091179055565b600060026000541415610eb2576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055600154600160a01b900460ff1615610f0b576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b60008690506000816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d6020811015610f7557600080fd5b505190506001600160a01b038616610fd45760003411610fcf576040805162461bcd60e51b815260206004820152601060248201526f1154948e88139bc8115512081cd95b9d60821b604482015290519081900360640190fd5b611087565b6000851161101f576040805162461bcd60e51b8152602060048201526013602482015272115c9c8e88139bc8151bdad95b9cc814d95b9d606a1b604482015290519081900360640190fd5b3415611072576040805162461bcd60e51b815260206004820152601860248201527f4552523a204554482073656e74207769746820546f6b656e0000000000000000604482015290519081900360640190fd5b6110876001600160a01b038716333088611947565b856001600160a01b0316816001600160a01b03161415611118576110b56001600160a01b03821683876126ab565b816001600160a01b031663b6b55f25866040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110fb57600080fd5b505af115801561110f573d6000803e3d6000fd5b505050506116cb565b8661ffff1660021415611313576001600160a01b0380821660009081526004602052604081205482169188166111e65760025460408051632d4242f760e21b8152306004820152600060248201526001600160a01b0385811660448301523460648301819052608483018b9052925193169263b5090bdc929160a48082019260209290919082900301818588803b1580156111b257600080fd5b505af11580156111c6573d6000803e3d6000fd5b50505050506040513d60208110156111dd57600080fd5b5051905061129a565b600254611200906001600160a01b038a81169116896126ab565b60025460408051632d4242f760e21b81523060048201526001600160a01b038b811660248301528581166044830152606482018b9052608482018a90529151919092169163b5090bdc9160a48083019260209291908290030181600087803b15801561126b57600080fd5b505af115801561127f573d6000803e3d6000fd5b505050506040513d602081101561129557600080fd5b505190505b6112ae6001600160a01b03841685836126ab565b836001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156112f457600080fd5b505af1158015611308573d6000803e3d6000fd5b5050505050506116cb565b8661ffff1660011415611627576000816001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561135d57600080fd5b505af1158015611371573d6000803e3d6000fd5b505050506040513d602081101561138757600080fd5b5051905060006001600160a01b0388166113ac576113a582876127be565b90506113bb565b6113b888838989611eee565b90505b6114487324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b15801561140b57600080fd5b505afa15801561141f573d6000803e3d6000fd5b505050506040513d602081101561143557600080fd5b50516001600160a01b03841690836126ab565b7324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561149557600080fd5b505afa1580156114a9573d6000803e3d6000fd5b505050506040513d60208110156114bf57600080fd5b505160408051636968703360e11b81526001600160a01b03858116600483015260248201859052600060448301819052925193169263d2d0e0669260648084019391929182900301818387803b15801561151857600080fd5b505af115801561152c573d6000803e3d6000fd5b505050506000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561157f57600080fd5b505afa158015611593573d6000803e3d6000fd5b505050506040513d60208110156115a957600080fd5b505190506115c16001600160a01b03851686836126ab565b846001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561160757600080fd5b505af115801561161b573d6000803e3d6000fd5b505050505050506116cb565b60006001600160a01b0387166116485761164182866127be565b9050611657565b61165487838888611eee565b90505b61166b6001600160a01b03831684836126ab565b826001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156116b157600080fd5b505af11580156116c5573d6000803e3d6000fd5b50505050505b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561171a57600080fd5b505afa15801561172e573d6000803e3d6000fd5b505050506040513d602081101561174457600080fd5b50519050600061175484836119a7565b90506117758b6117648484611a0c565b6001600160a01b03871691906118f5565b7f7c58760c09b45377b9759b1584bfa97aaad8a040feb4ec965b2b76e20b4af07f8b856117a28585611a0c565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190a16117d58282611a0c565b60016000559b9a5050505050505050505050565b6117f16118f1565b6001546001600160a01b03908116911614611841576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6001600160a01b0381166118865760405162461bcd60e51b8152600401808060200182810382526026815260200180612ea06026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b3390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526105be908490612ad5565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526119a1908590612ad5565b50505050565b6001546000906119cf906119c7908490600160a81b900461ffff16612b86565b612710612bdf565b9050806119de57506000611a06565b611a066001600160a01b03841673e737b6afec2320f616297e59445b60a11e3ef75f836118f5565b92915050565b6000611a4e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c21565b9392505050565b600354600090611a72906001600160a01b038881169116876126ab565b6001600160a01b0380871660009081526004602081905260409091205490911690737fc77b5c7614e1533320ea6ddc2eb61fa00a9714821415611ab3575060035b6003546040805163363507c560e11b81526001600160a01b038981166004830152858116602483015260448201859052606482018b9052888116608483015260a4820188905291519190921691636c6a0f8a9160c48083019260209291908290030181600087803b158015611b2757600080fd5b505af1158015611b3b573d6000803e3d6000fd5b505050506040513d6020811015611b5157600080fd5b505198975050505050505050565b60006001600160a01b03851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415611c375773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611be057600080fd5b505af1158015611bf4573d6000803e3d6000fd5b50506040516001600160a01b038616925086156108fc02915086906000818181858888f19350505050158015611c2e573d6000803e3d6000fd5b50839050611ee6565b611c5f6001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d866126ab565b60408051600280825260608083018452926020830190803683370190505090508581600081518110611c8d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611ccf57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166318cbafe58760018589600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611d8e578181015183820152602001611d76565b505050509050019650505050505050600060405180830381600087803b158015611db757600080fd5b505af1158015611dcb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611df457600080fd5b8101908080516040519392919084600160201b821115611e1357600080fd5b908301906020820185811115611e2857600080fd5b82518660208202830111600160201b82111715611e4457600080fd5b82525081516020918201928201910280838360005b83811015611e71578181015183820152602001611e59565b50505050905001604052505050600183510381518110611e8d57fe5b60200260200101519050838111611ee2576040805162461bcd60e51b81526020600482015260146024820152734572726f723a204869676820536c69707061676560601b604482015290519081900360640190fd5b9150505b949350505050565b6000836001600160a01b0316856001600160a01b03161415611f11575081611ee6565b611f396001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d856126ab565b6001600160a01b03851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21461242a576001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2146121ed57604080516003808252608082019092526060916020820183803683370190505090508581600081518110611fb157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611ff357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848160028151811061202157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398560018430600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156120de5781810151838201526020016120c6565b505050509050019650505050505050600060405180830381600087803b15801561210757600080fd5b505af115801561211b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561214457600080fd5b8101908080516040519392919084600160201b82111561216357600080fd5b90830190602082018581111561217857600080fd5b82518660208202830111600160201b8211171561219457600080fd5b82525081516020918201928201910280838360005b838110156121c15781810151838201526020016121a9565b505050509050016040525050506001825103815181106121dd57fe5b6020026020010151915050612425565b6040805160028082526060808301845292602083019080368337019050509050858160008151811061221b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061225d57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398560018430600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561231a578181015183820152602001612302565b505050509050019650505050505050600060405180830381600087803b15801561234357600080fd5b505af1158015612357573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561238057600080fd5b8101908080516040519392919084600160201b82111561239f57600080fd5b9083019060208201858111156123b457600080fd5b82518660208202830111600160201b821117156123d057600080fd5b82525081516020918201928201910280838360005b838110156123fd5781810151838201526020016123e5565b5050505090500160405250505060018251038151811061241957fe5b60200260200101519150505b612662565b604080516002808252606080830184529260208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061246c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848160018151811061249a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398560018430600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561255757818101518382015260200161253f565b505050509050019650505050505050600060405180830381600087803b15801561258057600080fd5b505af1158015612594573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156125bd57600080fd5b8101908080516040519392919084600160201b8211156125dc57600080fd5b9083019060208201858111156125f157600080fd5b82518660208202830111600160201b8211171561260d57600080fd5b82525081516020918201928201910280838360005b8381101561263a578181015183820152602001612622565b5050505090500160405250505060018251038151811061265657fe5b60200260200101519150505b818111611ee6576040805162461bcd60e51b81526020600482015260126024820152714552523a204869676820536c69707061676560701b604482015290519081900360640190fd5b801580612731575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561270357600080fd5b505afa158015612717573d6000803e3d6000fd5b505050506040513d602081101561272d57600080fd5b5051155b61276c5760405162461bcd60e51b8152600401808060200182810382526036815260200180612f316036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526105be908490612ad5565b60006001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156128555773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561283457600080fd5b505af1158015612848573d6000803e3d6000fd5b5050505050349050611a06565b604080516002808252606080830184529260208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061289757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083816001815181106128c557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316637ff36ab53460018430600f60fc1b6040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561297c578181015183820152602001612964565b50505050905001955050505050506000604051808303818588803b1580156129a357600080fd5b505af11580156129b7573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405260208110156129e157600080fd5b8101908080516040519392919084600160201b821115612a0057600080fd5b908301906020820185811115612a1557600080fd5b82518660208202830111600160201b82111715612a3157600080fd5b82525081516020918201928201910280838360005b83811015612a5e578181015183820152602001612a46565b50505050905001604052505050600182510381518110612a7a57fe5b6020026020010151915082821015612ace576040805162461bcd60e51b81526020600482015260126024820152714552523a204869676820536c69707061676560701b604482015290519081900360640190fd5b5092915050565b6060612b2a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612cb89092919063ffffffff16565b8051909150156105be57808060200190516020811015612b4957600080fd5b50516105be5760405162461bcd60e51b815260040180806020018281038252602a815260200180612f07602a913960400191505060405180910390fd5b600082612b9557506000611a06565b82820282848281612ba257fe5b0414611a4e5760405162461bcd60e51b8152600401808060200182810382526021815260200180612ec66021913960400191505060405180910390fd5b6000611a4e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cc7565b60008184841115612cb05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c75578181015183820152602001612c5d565b50505050905090810190601f168015612ca25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6060611ee68484600085612d2c565b60008183612d165760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612c75578181015183820152602001612c5d565b506000838581612d2257fe5b0495945050505050565b6060612d3785612e99565b612d88576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612dc75780518252601f199092019160209182019101612da8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612e29576040519150601f19603f3d011682016040523d82523d6000602084013e612e2e565b606091505b50915091508115612e42579150611ee69050565b805115612e525780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612c75578181015183820152602001612c5d565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212206ff7fe4bf7e67f4eb54901e8ea678a888a962e6ef2f833b904611ebf663f729364736f6c634300060c00330000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106100f75760003560e01c8063798ae4f51161008a578063b10e1dbc11610059578063b10e1dbc1461031e578063d1bd82051461034c578063f2fde38b1461039a578063fbf0c6f1146103cd576100fe565b8063798ae4f51461023a578063819201331461026b5780638da5cb5b146102d65780638ff27fcc146102eb576100fe565b80635901ae54116100c65780635901ae54146101955780635de0398e146101d0578063715018a6146101fc57806375f12b2114610211576100fe565b80631385d24c14610103578063399355d31461011a5780633ccfd60b1461014d578063551196d514610162576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b506101186103e2565b005b34801561012657600080fd5b506101186004803603602081101561013d57600080fd5b50356001600160a01b031661045b565b34801561015957600080fd5b50610118610522565b34801561016e57600080fd5b506101186004803603602081101561018557600080fd5b50356001600160a01b03166105c3565b3480156101a157600080fd5b50610118600480360360408110156101b857600080fd5b506001600160a01b03813581169160200135166106b8565b3480156101dc57600080fd5b506101e56107a1565b6040805161ffff9092168252519081900360200190f35b34801561020857600080fd5b506101186107b2565b34801561021d57600080fd5b50610226610854565b604080519115158252519081900360200190f35b34801561024657600080fd5b5061024f610864565b604080516001600160a01b039092168252519081900360200190f35b34801561027757600080fd5b506102c4600480360360c081101561028e57600080fd5b506001600160a01b03813581169160208101358216916040820135169061ffff6060820135169060808101359060a00135610873565b60408051918252519081900360200190f35b3480156102e257600080fd5b5061024f610cae565b3480156102f757600080fd5b506101186004803603602081101561030e57600080fd5b50356001600160a01b0316610cbd565b34801561032a57600080fd5b506101186004803603602081101561034157600080fd5b503561ffff16610d84565b6102c4600480360360c081101561036257600080fd5b506001600160a01b038135811691602081013582169161ffff6040830135169160608101359091169060808101359060a00135610e58565b3480156103a657600080fd5b50610118600480360360208110156103bd57600080fd5b50356001600160a01b03166117e9565b3480156103d957600080fd5b5061024f6118e2565b6103ea6118f1565b6001546001600160a01b0390811691161461043a576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6001805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6104636118f1565b6001546001600160a01b039081169116146104b3576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6001600160a01b038116610500576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61052a6118f1565b6001546001600160a01b0390811691161461057a576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b476000610585610cae565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f193505050501580156105be573d6000803e3d6000fd5b505050565b6105cb6118f1565b6001546001600160a01b0390811691161461061b576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561066a57600080fd5b505afa15801561067e573d6000803e3d6000fd5b505050506040513d602081101561069457600080fd5b505190506106b46106a3610cae565b6001600160a01b03841690836118f5565b5050565b6106c06118f1565b6001546001600160a01b03908116911614610710576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6001600160a01b0382161580159061073057506001600160a01b03811615155b610773576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015290519081900360640190fd5b6001600160a01b03918216600090815260046020526040902080546001600160a01b03191691909216179055565b600154600160a81b900461ffff1681565b6107ba6118f1565b6001546001600160a01b0390811691161461080a576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b600154600160a01b900460ff1681565b6003546001600160a01b031681565b6000600260005414156108cd576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055600154600160a01b900460ff1615610926576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b60008590506000816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561096657600080fd5b505afa15801561097a573d6000803e3d6000fd5b505050506040513d602081101561099057600080fd5b505190506109a96001600160a01b038316333088611947565b60006109b583876119a7565b90506001600160a01b038316632e1a7d4d6109d08884611a0c565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610a0657600080fd5b505af1158015610a1a573d6000803e3d6000fd5b505050506000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610a6d57600080fd5b505afa158015610a81573d6000803e3d6000fd5b505050506040513d6020811015610a9757600080fd5b5051905060006001600160a01b038b81169085161415610acc57610ac56001600160a01b0385168d846118f5565b5080610c48565b8861ffff1660021415610aed57610ae684838e8e8b611a55565b9050610c48565b8861ffff1660011415610c0c57836001600160a01b031663db006a75836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610b4057600080fd5b505af1158015610b54573d6000803e3d6000fd5b505050506000846001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b9557600080fd5b505af1158015610ba9573d6000803e3d6000fd5b505050506040513d6020811015610bbf57600080fd5b505190506001600160a01b038c16610be457610bdd81848f8b611b5f565b9150610c06565b610bf0818d858b611eee565b9150610c066001600160a01b038d168e846118f5565b50610c48565b6001600160a01b038b16610c2657610ae684838e8a611b5f565b610c32848c848a611eee565b9050610c486001600160a01b038c168d836118f5565b604080516001600160a01b03808f168252808d1660208301528d16818301526060810183905290517fccd66be260e4d251757c46211a144a9df723fe5d98726e537a900b7115b0e74d9181900360800190a160016000559b9a5050505050505050505050565b6001546001600160a01b031690565b610cc56118f1565b6001546001600160a01b03908116911614610d15576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6001600160a01b038116610d62576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b610d8c6118f1565b6001546001600160a01b03908116911614610ddc576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6127108161ffff1610610e36576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6001805461ffff909216600160a81b0261ffff60a81b19909216919091179055565b600060026000541415610eb2576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055600154600160a01b900460ff1615610f0b576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b60008690506000816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d6020811015610f7557600080fd5b505190506001600160a01b038616610fd45760003411610fcf576040805162461bcd60e51b815260206004820152601060248201526f1154948e88139bc8115512081cd95b9d60821b604482015290519081900360640190fd5b611087565b6000851161101f576040805162461bcd60e51b8152602060048201526013602482015272115c9c8e88139bc8151bdad95b9cc814d95b9d606a1b604482015290519081900360640190fd5b3415611072576040805162461bcd60e51b815260206004820152601860248201527f4552523a204554482073656e74207769746820546f6b656e0000000000000000604482015290519081900360640190fd5b6110876001600160a01b038716333088611947565b856001600160a01b0316816001600160a01b03161415611118576110b56001600160a01b03821683876126ab565b816001600160a01b031663b6b55f25866040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110fb57600080fd5b505af115801561110f573d6000803e3d6000fd5b505050506116cb565b8661ffff1660021415611313576001600160a01b0380821660009081526004602052604081205482169188166111e65760025460408051632d4242f760e21b8152306004820152600060248201526001600160a01b0385811660448301523460648301819052608483018b9052925193169263b5090bdc929160a48082019260209290919082900301818588803b1580156111b257600080fd5b505af11580156111c6573d6000803e3d6000fd5b50505050506040513d60208110156111dd57600080fd5b5051905061129a565b600254611200906001600160a01b038a81169116896126ab565b60025460408051632d4242f760e21b81523060048201526001600160a01b038b811660248301528581166044830152606482018b9052608482018a90529151919092169163b5090bdc9160a48083019260209291908290030181600087803b15801561126b57600080fd5b505af115801561127f573d6000803e3d6000fd5b505050506040513d602081101561129557600080fd5b505190505b6112ae6001600160a01b03841685836126ab565b836001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156112f457600080fd5b505af1158015611308573d6000803e3d6000fd5b5050505050506116cb565b8661ffff1660011415611627576000816001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561135d57600080fd5b505af1158015611371573d6000803e3d6000fd5b505050506040513d602081101561138757600080fd5b5051905060006001600160a01b0388166113ac576113a582876127be565b90506113bb565b6113b888838989611eee565b90505b6114487324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b15801561140b57600080fd5b505afa15801561141f573d6000803e3d6000fd5b505050506040513d602081101561143557600080fd5b50516001600160a01b03841690836126ab565b7324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561149557600080fd5b505afa1580156114a9573d6000803e3d6000fd5b505050506040513d60208110156114bf57600080fd5b505160408051636968703360e11b81526001600160a01b03858116600483015260248201859052600060448301819052925193169263d2d0e0669260648084019391929182900301818387803b15801561151857600080fd5b505af115801561152c573d6000803e3d6000fd5b505050506000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561157f57600080fd5b505afa158015611593573d6000803e3d6000fd5b505050506040513d60208110156115a957600080fd5b505190506115c16001600160a01b03851686836126ab565b846001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561160757600080fd5b505af115801561161b573d6000803e3d6000fd5b505050505050506116cb565b60006001600160a01b0387166116485761164182866127be565b9050611657565b61165487838888611eee565b90505b61166b6001600160a01b03831684836126ab565b826001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156116b157600080fd5b505af11580156116c5573d6000803e3d6000fd5b50505050505b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561171a57600080fd5b505afa15801561172e573d6000803e3d6000fd5b505050506040513d602081101561174457600080fd5b50519050600061175484836119a7565b90506117758b6117648484611a0c565b6001600160a01b03871691906118f5565b7f7c58760c09b45377b9759b1584bfa97aaad8a040feb4ec965b2b76e20b4af07f8b856117a28585611a0c565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190a16117d58282611a0c565b60016000559b9a5050505050505050505050565b6117f16118f1565b6001546001600160a01b03908116911614611841576040805162461bcd60e51b81526020600482018190526024820152600080516020612ee7833981519152604482015290519081900360640190fd5b6001600160a01b0381166118865760405162461bcd60e51b8152600401808060200182810382526026815260200180612ea06026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b3390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526105be908490612ad5565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526119a1908590612ad5565b50505050565b6001546000906119cf906119c7908490600160a81b900461ffff16612b86565b612710612bdf565b9050806119de57506000611a06565b611a066001600160a01b03841673e737b6afec2320f616297e59445b60a11e3ef75f836118f5565b92915050565b6000611a4e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c21565b9392505050565b600354600090611a72906001600160a01b038881169116876126ab565b6001600160a01b0380871660009081526004602081905260409091205490911690737fc77b5c7614e1533320ea6ddc2eb61fa00a9714821415611ab3575060035b6003546040805163363507c560e11b81526001600160a01b038981166004830152858116602483015260448201859052606482018b9052888116608483015260a4820188905291519190921691636c6a0f8a9160c48083019260209291908290030181600087803b158015611b2757600080fd5b505af1158015611b3b573d6000803e3d6000fd5b505050506040513d6020811015611b5157600080fd5b505198975050505050505050565b60006001600160a01b03851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415611c375773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611be057600080fd5b505af1158015611bf4573d6000803e3d6000fd5b50506040516001600160a01b038616925086156108fc02915086906000818181858888f19350505050158015611c2e573d6000803e3d6000fd5b50839050611ee6565b611c5f6001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d866126ab565b60408051600280825260608083018452926020830190803683370190505090508581600081518110611c8d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611ccf57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166318cbafe58760018589600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611d8e578181015183820152602001611d76565b505050509050019650505050505050600060405180830381600087803b158015611db757600080fd5b505af1158015611dcb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611df457600080fd5b8101908080516040519392919084600160201b821115611e1357600080fd5b908301906020820185811115611e2857600080fd5b82518660208202830111600160201b82111715611e4457600080fd5b82525081516020918201928201910280838360005b83811015611e71578181015183820152602001611e59565b50505050905001604052505050600183510381518110611e8d57fe5b60200260200101519050838111611ee2576040805162461bcd60e51b81526020600482015260146024820152734572726f723a204869676820536c69707061676560601b604482015290519081900360640190fd5b9150505b949350505050565b6000836001600160a01b0316856001600160a01b03161415611f11575081611ee6565b611f396001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d856126ab565b6001600160a01b03851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21461242a576001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2146121ed57604080516003808252608082019092526060916020820183803683370190505090508581600081518110611fb157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611ff357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848160028151811061202157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398560018430600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156120de5781810151838201526020016120c6565b505050509050019650505050505050600060405180830381600087803b15801561210757600080fd5b505af115801561211b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561214457600080fd5b8101908080516040519392919084600160201b82111561216357600080fd5b90830190602082018581111561217857600080fd5b82518660208202830111600160201b8211171561219457600080fd5b82525081516020918201928201910280838360005b838110156121c15781810151838201526020016121a9565b505050509050016040525050506001825103815181106121dd57fe5b6020026020010151915050612425565b6040805160028082526060808301845292602083019080368337019050509050858160008151811061221b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061225d57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398560018430600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561231a578181015183820152602001612302565b505050509050019650505050505050600060405180830381600087803b15801561234357600080fd5b505af1158015612357573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561238057600080fd5b8101908080516040519392919084600160201b82111561239f57600080fd5b9083019060208201858111156123b457600080fd5b82518660208202830111600160201b821117156123d057600080fd5b82525081516020918201928201910280838360005b838110156123fd5781810151838201526020016123e5565b5050505090500160405250505060018251038151811061241957fe5b60200260200101519150505b612662565b604080516002808252606080830184529260208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061246c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848160018151811061249a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398560018430600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561255757818101518382015260200161253f565b505050509050019650505050505050600060405180830381600087803b15801561258057600080fd5b505af1158015612594573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156125bd57600080fd5b8101908080516040519392919084600160201b8211156125dc57600080fd5b9083019060208201858111156125f157600080fd5b82518660208202830111600160201b8211171561260d57600080fd5b82525081516020918201928201910280838360005b8381101561263a578181015183820152602001612622565b5050505090500160405250505060018251038151811061265657fe5b60200260200101519150505b818111611ee6576040805162461bcd60e51b81526020600482015260126024820152714552523a204869676820536c69707061676560701b604482015290519081900360640190fd5b801580612731575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561270357600080fd5b505afa158015612717573d6000803e3d6000fd5b505050506040513d602081101561272d57600080fd5b5051155b61276c5760405162461bcd60e51b8152600401808060200182810382526036815260200180612f316036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526105be908490612ad5565b60006001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156128555773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561283457600080fd5b505af1158015612848573d6000803e3d6000fd5b5050505050349050611a06565b604080516002808252606080830184529260208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061289757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083816001815181106128c557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316637ff36ab53460018430600f60fc1b6040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561297c578181015183820152602001612964565b50505050905001955050505050506000604051808303818588803b1580156129a357600080fd5b505af11580156129b7573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405260208110156129e157600080fd5b8101908080516040519392919084600160201b821115612a0057600080fd5b908301906020820185811115612a1557600080fd5b82518660208202830111600160201b82111715612a3157600080fd5b82525081516020918201928201910280838360005b83811015612a5e578181015183820152602001612a46565b50505050905001604052505050600182510381518110612a7a57fe5b6020026020010151915082821015612ace576040805162461bcd60e51b81526020600482015260126024820152714552523a204869676820536c69707061676560701b604482015290519081900360640190fd5b5092915050565b6060612b2a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612cb89092919063ffffffff16565b8051909150156105be57808060200190516020811015612b4957600080fd5b50516105be5760405162461bcd60e51b815260040180806020018281038252602a815260200180612f07602a913960400191505060405180910390fd5b600082612b9557506000611a06565b82820282848281612ba257fe5b0414611a4e5760405162461bcd60e51b8152600401808060200182810382526021815260200180612ec66021913960400191505060405180910390fd5b6000611a4e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cc7565b60008184841115612cb05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c75578181015183820152602001612c5d565b50505050905090810190601f168015612ca25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6060611ee68484600085612d2c565b60008183612d165760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612c75578181015183820152602001612c5d565b506000838581612d2257fe5b0495945050505050565b6060612d3785612e99565b612d88576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612dc75780518252601f199092019160209182019101612da8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612e29576040519150601f19603f3d011682016040523d82523d6000602084013e612e2e565b606091505b50915091508115612e42579150611ee69050565b805115612e525780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612c75578181015183820152602001612c5d565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212206ff7fe4bf7e67f4eb54901e8ea678a888a962e6ef2f833b904611ebf663f729364736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _goodwill (uint16): 0
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
30153:20568:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50330:86;;;;;;;;;;;;;:::i;:::-;;33038:260;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33038:260:0;-1:-1:-1;;;;;33038:260:0;;:::i;50486:192::-;;;;;;;;;;;;;:::i;50082:208::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50082:208:0;-1:-1:-1;;;;;50082:208:0;;:::i;33588:300::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33588:300:0;;;;;;;;;;:::i;30358:22::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22497:148;;;;;;;;;;;;;:::i;30324:27::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;30809:127;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;30809:127:0;;;;;;;;;;;;;;40008:3699;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;40008:3699:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;21855:79;;;;;;;;;;;;;:::i;33310:266::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33310:266:0;-1:-1:-1;;;;;33310:266:0;;:::i;49836:238::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49836:238:0;;;;:::i;34371:5151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34371:5151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22800:281::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22800:281:0;-1:-1:-1;;;;;22800:281:0;;:::i;30678:124::-;;;;;;;;;;;;;:::i;50330:86::-;22077:12;:10;:12::i;:::-;22067:6;;-1:-1:-1;;;;;22067:6:0;;;:22;;;22059:67;;;;;-1:-1:-1;;;22059:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22059:67:0;;;;;;;;;;;;;;;50401:7:::1;::::0;;-1:-1:-1;;;;50390:18:0;::::1;-1:-1:-1::0;;;50401:7:0;;;::::1;;;50400:8;50390:18:::0;;::::1;;::::0;;50330:86::o;33038:260::-;22077:12;:10;:12::i;:::-;22067:6;;-1:-1:-1;;;;;22067:6:0;;;:22;;;22059:67;;;;;-1:-1:-1;;;22059:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22059:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33157:38:0;::::1;33149:66;;;::::0;;-1:-1:-1;;;33149:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33149:66:0;;;;;;;;;;;;;::::1;;33226:17;:64:::0;;-1:-1:-1;;;;;;33226:64:0::1;-1:-1:-1::0;;;;;33226:64:0;;;::::1;::::0;;;::::1;::::0;;33038:260::o;50486:192::-;22077:12;:10;:12::i;:::-;22067:6;;-1:-1:-1;;;;;22067:6:0;;;:22;;;22059:67;;;;;-1:-1:-1;;;22059:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22059:67:0;;;;;;;;;;;;;;;50560:21:::1;50534:23;50622:7;:5;:7::i;:::-;50641:29;::::0;50592:38;;-1:-1:-1;;;;;;50641:12:0;::::1;::::0;:29;::::1;;;::::0;50654:15;;50641:29:::1;::::0;;;50654:15;50641:12;:29;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;22137:1;;50486:192::o:0;50082:208::-;22077:12;:10;:12::i;:::-;22067:6;;-1:-1:-1;;;;;22067:6:0;;;:22;;;22059:67;;;;;-1:-1:-1;;;22059:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22059:67:0;;;;;;;;;;;;;;;50162:11:::1;50176:13;-1:-1:-1::0;;;;;50176:23:0::1;;50208:4;50176:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;50176:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;50176:38:0;;-1:-1:-1;50225:57:0::1;50269:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;50225:43:0;::::1;::::0;50278:3;50225:43:::1;:57::i;:::-;22137:1;50082:208:::0;:::o;33588:300::-;22077:12;:10;:12::i;:::-;22067:6;;-1:-1:-1;;;;;22067:6:0;;;:22;;;22059:67;;;;;-1:-1:-1;;;22059:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22059:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33730:28:0;::::1;::::0;;::::1;::::0;:66:::1;;-1:-1:-1::0;;;;;;33762:34:0;::::1;::::0;::::1;33730:66;33722:94;;;::::0;;-1:-1:-1;;;33722:94:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33722:94:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;33827:30:0;;::::1;;::::0;;;:14:::1;:30;::::0;;;;:53;;-1:-1:-1;;;;;;33827:53:0::1;::::0;;;::::1;;::::0;;33588:300::o;30358:22::-;;;-1:-1:-1;;;30358:22:0;;;;;:::o;22497:148::-;22077:12;:10;:12::i;:::-;22067:6;;-1:-1:-1;;;;;22067:6:0;;;:22;;;22059:67;;;;;-1:-1:-1;;;22059:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22059:67:0;;;;;;;;;;;;;;;22588:6:::1;::::0;22567:40:::1;::::0;22604:1:::1;::::0;-1:-1:-1;;;;;22588:6:0::1;::::0;22567:40:::1;::::0;22604:1;;22567:40:::1;22618:6;:19:::0;;-1:-1:-1;;;;;;22618:19:0::1;::::0;;22497:148::o;30324:27::-;;;-1:-1:-1;;;30324:27:0;;;;;:::o;30809:127::-;;;-1:-1:-1;;;;;30809:127:0;;:::o;40008:3699::-;40279:7;9216:1;9821:7;;:19;;9813:63;;;;;-1:-1:-1;;;9813:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9216:1;9954:7;:18;32925:7:::1;::::0;-1:-1:-1;;;32925:7:0;::::1;;;32921:102;;;32949:28;::::0;;-1:-1:-1;;;32949:28:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32949:28:0;;;;;;;;;;;;;::::1;32921:102;40299:18:::2;40327;40299:47;;40357:28;40388:11;-1:-1:-1::0;;;;;40388:17:0::2;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40388:19:0;;-1:-1:-1;40420:136:0::2;-1:-1:-1::0;;;;;40420:45:0;::::2;40480:10;40513:4;40533:12:::0;40420:45:::2;:136::i;:::-;40577:23;40603:90;40643:11;40670:12;40603:17;:90::i;:::-;40577:116:::0;-1:-1:-1;;;;;;40706:20:0;::::2;;40727:33;:12:::0;40577:116;40727:16:::2;:33::i;:::-;40706:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;40772:26;40808:20;-1:-1:-1::0;;;;;40801:38:0::2;;40862:4;40801:77;;;;;;;;;;;;;-1:-1:-1::0;;;;;40801:77:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40801:77:0;;-1:-1:-1;40899:24:0::2;-1:-1:-1::0;;;;;40937:47:0;;::::2;::::0;;::::2;;40934:2548;;;41001:126;-1:-1:-1::0;;;;;41001:41:0;::::2;41061:14:::0;41094:18;41001:41:::2;:126::i;:::-;-1:-1:-1::0;41161:18:0;40934:2548:::2;;;41215:10;:15;;41229:1;41215:15;41212:2259;;;41270:240;41311:20;41354:18;41395:14;41432:23;41478:13;41270:18;:240::i;:::-;41251:259;;41212:2259;;;41535:10;:15;;41549:1;41535:15;41532:1939;;;41613:20;-1:-1:-1::0;;;;;41605:36:0::2;;41642:18;41605:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;41680:23;41714:20;-1:-1:-1::0;;;;;41706:78:0::2;;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;41706:80:0;;-1:-1:-1;;;;;;41851:37:0;::::2;41848:768;;41932:210;41969:15;42011:18;42064:14;42106:13;41932:10;:210::i;:::-;41913:229;;41848:768;;;42210:212;42249:15;42291:23;42341:18;42386:13;42210:12;:212::i;:::-;42191:231:::0;-1:-1:-1;42445:151:0::2;-1:-1:-1::0;;;;;42445:44:0;::::2;42516:14:::0;42191:231;42445:44:::2;:151::i;:::-;41532:1939;;;;-1:-1:-1::0;;;;;42659:37:0;::::2;42656:800;;42740:215;42777:20;42824:18;42877:14;42919:13;42740:10;:215::i;42656:800::-;43023:217;43062:20;43109:23;43159:18;43204:13;43023:12;:217::i;:::-;43004:236:::0;-1:-1:-1;43285:151:0::2;-1:-1:-1::0;;;;;43285:44:0;::::2;43356:14:::0;43004:236;43285:44:::2;:151::i;:::-;43507:148;::::0;;-1:-1:-1;;;;;43507:148:0;;::::2;::::0;;;;::::2;;::::0;::::2;::::0;;::::2;::::0;;;;;;;;;;;;::::2;::::0;;;;;;;::::2;9172:1:::0;10133:7;:22;43683:16;40008:3699;-1:-1:-1;;;;;;;;;;;40008:3699:0:o;21855:79::-;21920:6;;-1:-1:-1;;;;;21920:6:0;21855:79;:::o;33310:266::-;22077:12;:10;:12::i;:::-;22067:6;;-1:-1:-1;;;;;22067:6:0;;;:22;;;22059:67;;;;;-1:-1:-1;;;22059:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22059:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33431:39:0;::::1;33423:67;;;::::0;;-1:-1:-1;;;33423:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33423:67:0;;;;;;;;;;;;;::::1;;33501:18;:67:::0;;-1:-1:-1;;;;;;33501:67:0::1;-1:-1:-1::0;;;;;33501:67:0;;;::::1;::::0;;;::::1;::::0;;33310:266::o;49836:238::-;22077:12;:10;:12::i;:::-;22067:6;;-1:-1:-1;;;;;22067:6:0;;;:22;;;22059:67;;;;;-1:-1:-1;;;22059:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22059:67:0;;;;;;;;;;;;;;;49972:5:::1;49956:13;:21;;;49912:119;;;::::0;;-1:-1:-1;;;49912:119:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;50042:8;:24:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;50042:24:0::1;-1:-1:-1::0;;;;50042:24:0;;::::1;::::0;;;::::1;::::0;;49836:238::o;34371:5151::-;34640:7;9216:1;9821:7;;:19;;9813:63;;;;;-1:-1:-1;;;9813:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9216:1;9954:7;:18;32925:7:::1;::::0;-1:-1:-1;;;32925:7:0;::::1;;;32921:102;;;32949:28;::::0;;-1:-1:-1;;;32949:28:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32949:28:0;;;;;;;;;;;;;::::1;32921:102;34660:19:::2;34689:16;34660:46;;34717:28;34748:12;-1:-1:-1::0;;;;;34748:18:0::2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;34748:20:0;;-1:-1:-1;;;;;;34785:31:0;::::2;34781:409;;34853:1;34841:9;:13;34833:42;;;::::0;;-1:-1:-1;;;34833:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34833:42:0;;;;;;;;;;;;;::::2;;34781:409;;;34926:1;34916:7;:11;34908:43;;;::::0;;-1:-1:-1;;;34908:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34908:43:0;;;;;;;;;;;;;::::2;;34974:9;:14:::0;34966:51:::2;;;::::0;;-1:-1:-1;;;34966:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;35034:144;-1:-1:-1::0;;;;;35034:42:0;::::2;35095:10;35132:4;35156:7:::0;35034:42:::2;:144::i;:::-;35228:17;-1:-1:-1::0;;;;;35204:41:0::2;:20;-1:-1:-1::0;;;;;35204:41:0::2;;35200:3707;;;35262:121;-1:-1:-1::0;;;;;35262:40:0;::::2;35329:12:::0;35361:7;35262:40:::2;:121::i;:::-;35398:12;-1:-1:-1::0;;;;;35398:20:0::2;;35419:7;35398:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;35200:3707;;;35493:10;:15;;35507:1;35493:15;35489:3407;;;-1:-1:-1::0;;;;;35557:36:0;;::::2;35529:25;35557:36:::0;;;:14:::2;:36;::::0;;;;;;::::2;::::0;35673:31;::::2;35669:846;;35744:17;::::0;:265:::2;::::0;;-1:-1:-1;;;35744:265:0;;35820:4:::2;35744:265;::::0;::::2;::::0;:17:::2;:265:::0;;;;-1:-1:-1;;;;;35744:265:0;;::::2;::::0;;;;35775:9:::2;35744:265:::0;;;;;;;;;;;;;;:17;::::2;::::0;:23:::2;::::0;35775:9;35744:265;;;;;::::2;::::0;;;;;;;;;35775:9;35744:17;:265;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;35744:265:0;;-1:-1:-1;35669:846:0::2;;;36130:17;::::0;36058:147:::2;::::0;-1:-1:-1;;;;;36058:37:0;;::::2;::::0;36130:17:::2;36175:7:::0;36058:37:::2;:147::i;:::-;36243:17;::::0;:252:::2;::::0;;-1:-1:-1;;;36243:252:0;;36301:4:::2;36243:252;::::0;::::2;::::0;-1:-1:-1;;;;;36243:252:0;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;;;;;;;;;:17;;;::::2;::::0;:23:::2;::::0;:252;;;;;::::2;::::0;;;;;;;;:17:::2;::::0;:252;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36243:252:0;;-1:-1:-1;35669:846:0::2;36535:138;-1:-1:-1::0;;;;;36535:40:0;::::2;36606:12:::0;36642;36535:40:::2;:138::i;:::-;36692:12;-1:-1:-1::0;;;;;36692:20:0::2;;36713:12;36692:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;35489:3407;;;;;36752:10;:15;;36766:1;36752:15;36748:2148;;;36788:23;36822:20;-1:-1:-1::0;;;;;36814:74:0::2;;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36814:76:0;;-1:-1:-1;36911:20:0::2;-1:-1:-1::0;;;;;36954:31:0;::::2;36950:477;;37025:119;37062:15;37104:17;37025:10;:119::i;:::-;37010:134;;36950:477;;;37208:199;37247:17;37291:15;37333:7;37367:17;37208:12;:199::i;:::-;37193:214;;36950:477;37447:159;31082:42;-1:-1:-1::0;;;;;37505:45:0::2;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37505:47:0;-1:-1:-1;;;;;37447:35:0;::::2;::::0;37575:12;37447:35:::2;:159::i;:::-;31082:42;-1:-1:-1::0;;;;;37644:41:0::2;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37644:43:0;37627:125:::2;::::0;;-1:-1:-1;;;37627:125:0;;-1:-1:-1;;;;;37627:125:0;;::::2;;::::0;::::2;::::0;;;;;;;37750:1:::2;37627:125:::0;;;;;;;;:91;::::2;::::0;::::2;::::0;:125;;;;;37750:1;;37627:125;;;;;;37750:1;37627:91;:125;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;37773:21;37804:20;-1:-1:-1::0;;;;;37797:38:0::2;;37866:4;37797:93;;;;;;;;;;;;;-1:-1:-1::0;;;;;37797:93:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37797:93:0;;-1:-1:-1;37909:139:0::2;-1:-1:-1::0;;;;;37909:40:0;::::2;37980:12:::0;37797:93;37909:40:::2;:139::i;:::-;38067:12;-1:-1:-1::0;;;;;38067:20:0::2;;38088:13;38067:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;36748:2148;;;;;;38143:20;-1:-1:-1::0;;;;;38186:31:0;::::2;38182:487;;38257:124;38294:20;38341:17;38257:10;:124::i;:::-;38242:139;;38182:487;;;38445:204;38484:17;38528:20;38575:7;38609:17;38445:12;:204::i;:::-;38430:219;;38182:487;38689:138;-1:-1:-1::0;;;;;38689:40:0;::::2;38760:12:::0;38796;38689:40:::2;:138::i;:::-;38846:12;-1:-1:-1::0;;;;;38846:20:0::2;;38867:12;38846:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;36748:2148;;38919:18;38955:12;-1:-1:-1::0;;;;;38940:39:0::2;;39002:4;38940:78;;;;;;;;;;;;;-1:-1:-1::0;;;;;38940:78:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;38940:78:0;;-1:-1:-1;39060:23:0::2;39086:89;39126:12:::0;38940:78;39086:17:::2;:89::i;:::-;39060:115:::0;-1:-1:-1;39188:128:0::2;39245:14:::0;39274:31:::2;:10:::0;39060:115;39274:14:::2;:31::i;:::-;-1:-1:-1::0;;;;;39188:42:0;::::2;::::0;:128;:42:::2;:128::i;:::-;39334:127;39354:14:::0;39391:12;39419:31:::2;:10:::0;39434:15;39419:14:::2;:31::i;:::-;39334:127;::::0;;-1:-1:-1;;;;;39334:127:0;;::::2;::::0;;;;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;::::2;39482:31;:10:::0;39497:15;39482:14:::2;:31::i;:::-;9172:1:::0;10133:7;:22;39474:40;34371:5151;-1:-1:-1;;;;;;;;;;;34371:5151:0:o;22800:281::-;22077:12;:10;:12::i;:::-;22067:6;;-1:-1:-1;;;;;22067:6:0;;;:22;;;22059:67;;;;;-1:-1:-1;;;22059:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22059:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22903:22:0;::::1;22881:110;;;;-1:-1:-1::0;;;22881:110:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23028:6;::::0;23007:38:::1;::::0;-1:-1:-1;;;;;23007:38:0;;::::1;::::0;23028:6:::1;::::0;23007:38:::1;::::0;23028:6:::1;::::0;23007:38:::1;23056:6;:17:::0;;-1:-1:-1;;;;;;23056:17:0::1;-1:-1:-1::0;;;;;23056:17:0;;;::::1;::::0;;;::::1;::::0;;22800:281::o;30678:124::-;;;-1:-1:-1;;;;;30678:124:0;;:::o;20334:106::-;20422:10;20334:106;:::o;23692:177::-;23802:58;;;-1:-1:-1;;;;;23802:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23802:58:0;-1:-1:-1;;;23802:58:0;;;23775:86;;23795:5;;23775:19;:86::i;23877:205::-;24005:68;;;-1:-1:-1;;;;;24005:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24005:68:0;-1:-1:-1;;;24005:68:0;;;23978:96;;23998:5;;23978:19;:96::i;:::-;23877:205;;;;:::o;49349:479::-;49580:8;;49472:23;;49526:94;;49553:36;;49566:12;;-1:-1:-1;;;49580:8:0;;;;49553:12;:36::i;:::-;49604:5;49526:12;:94::i;:::-;49508:112;-1:-1:-1;49637:20:0;49633:61;;-1:-1:-1;49681:1:0;49674:8;;49633:61;49706:114;-1:-1:-1;;;;;49706:42:0;;32066;49794:15;49706:42;:114::i;:::-;49349:479;;;;:::o;3334:136::-;3392:7;3419:43;3423:1;3426;3419:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;3412:50;3334:136;-1:-1:-1;;;3334:136:0:o;43719:891::-;44018:18;;43940:7;;43960:112;;-1:-1:-1;;;;;43960:35:0;;;;44018:18;44052:9;43960:35;:112::i;:::-;-1:-1:-1;;;;;44121:31:0;;;44093:25;44121:31;;;:14;:31;;;;;;;;;;;;;31290:42;44209:45;;44206:91;;;-1:-1:-1;44284:1:0;44206:91;44342:18;;:249;;;-1:-1:-1;;;44342:249:0;;-1:-1:-1;;;;;44342:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;;;:25;;:249;;;;;;;;;;;;;;:18;;:249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44342:249:0;;43719:891;-1:-1:-1;;;;;;;;43719:891:0:o;47951:1101::-;48140:7;-1:-1:-1;;;;;48164:45:0;;31964:42;48164:45;48160:210;;;31964:42;-1:-1:-1;;;;;48226:32:0;;48259:12;48226:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48287:37:0;;-1:-1:-1;;;;;48287:23:0;;;-1:-1:-1;48287:37:0;;;;;-1:-1:-1;48311:12:0;;48287:37;;;;48311:12;48287:23;:37;;;;;;;;;;;;;;;;;;;;;48346:12;48339:19;;;;48160:210;48382:120;-1:-1:-1;;;;;48382:45:0;;30620:42;48479:12;48382:45;:120::i;:::-;48539:16;;;48553:1;48539:16;;;48515:21;48539:16;;;;;48515:21;48539:16;;;;;;;;;;-1:-1:-1;48539:16:0;48515:40;;48576:25;48566:4;48571:1;48566:7;;;;;;;;;;;;;:35;-1:-1:-1;;;;;48566:35:0;;;-1:-1:-1;;;;;48566:35:0;;;;;31964:42;48612:4;48617:1;48612:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;48612:26:0;;;-1:-1:-1;;;;;48612:26:0;;;;;48649:17;30620:42;-1:-1:-1;;;;;48669:35:0;;48735:12;48778:1;48810:4;48845:14;-1:-1:-1;;;48669:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48669:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48669:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48669:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48669:256:0;;;;;;;;;;;;-1:-1:-1;48669:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48940:1;48926:4;:11;:15;48669:273;;;;;;;;;;;;;;48649:293;;48983:9;48971;:21;48963:54;;;;;-1:-1:-1;;;48963:54:0;;;;;;;;;;;;-1:-1:-1;;;48963:54:0;;;;;;;;;;;;;;;49035:9;-1:-1:-1;;47951:1101:0;;;;;;;:::o;45944:1995::-;46136:19;46201:23;-1:-1:-1;;;;;46172:52:0;:25;-1:-1:-1;;;;;46172:52:0;;46168:104;;;-1:-1:-1;46248:12:0;46241:19;;46168:104;46284:120;-1:-1:-1;;;;;46284:45:0;;30620:42;46381:12;46284:45;:120::i;:::-;-1:-1:-1;;;;;46421:45:0;;31964:42;46421:45;46417:1448;;-1:-1:-1;;;;;46487:43:0;;31964:42;46487:43;46483:977;;46575:16;;;46589:1;46575:16;;;;;;;;;46551:21;;46575:16;;;46551:21;;46575:16;;;;;-1:-1:-1;46575:16:0;46551:40;;46620:25;46610:4;46615:1;46610:7;;;;;;;;;;;;;:35;-1:-1:-1;;;;;46610:35:0;;;-1:-1:-1;;;;;46610:35:0;;;;;31964:42;46664:4;46669:1;46664:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;46664:26:0;;;-1:-1:-1;;;;;46664:26:0;;;;;46719:23;46709:4;46714:1;46709:7;;;;;;;;;;;;;:33;-1:-1:-1;;;;;46709:33:0;;;-1:-1:-1;;;;;46709:33:0;;;;;30620:42;-1:-1:-1;;;;;46775:38:0;;46836:12;46871:1;46895:4;46930;-1:-1:-1;;;46775:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46775:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46775:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46775:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46775:210:0;;;;;;;;;;;;-1:-1:-1;46775:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47000:1;46986:4;:11;:15;46775:227;;;;;;;;;;;;;;46761:241;;46483:977;;;;47067:16;;;47081:1;47067:16;;;47043:21;47067:16;;;;;47043:21;47067:16;;;;;;;;;;-1:-1:-1;47067:16:0;47043:40;;47112:25;47102:4;47107:1;47102:7;;;;;;;;;;;;;:35;-1:-1:-1;;;;;47102:35:0;;;-1:-1:-1;;;;;47102:35:0;;;;;31964:42;47156:4;47161:1;47156:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;47156:26:0;;;-1:-1:-1;;;;;47156:26:0;;;;;30620:42;-1:-1:-1;;;;;47217:38:0;;47278:12;47313:1;47337:4;47372;-1:-1:-1;;;47217:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47217:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47217:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47217:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47217:210:0;;;;;;;;;;;;-1:-1:-1;47217:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47442:1;47428:4;:11;:15;47217:227;;;;;;;;;;;;;;47203:241;;46483:977;;46417:1448;;;47516:16;;;47530:1;47516:16;;;47492:21;47516:16;;;;;47492:21;47516:16;;;;;;;;;;-1:-1:-1;47516:16:0;47492:40;;31964:42;47547:4;47552:1;47547:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;47547:26:0;;;-1:-1:-1;;;;;47547:26:0;;;;;47598:23;47588:4;47593:1;47588:7;;;;;;;;;;;;;:33;-1:-1:-1;;;;;47588:33:0;;;-1:-1:-1;;;;;47588:33:0;;;;;30620:42;-1:-1:-1;;;;;47650:38:0;;47707:12;47738:1;47758:4;47789;-1:-1:-1;;;47650:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47650:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47650:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47650:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47650:186:0;;;;;;;;;;;;-1:-1:-1;47650:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47851:1;47837:4;:11;:15;47650:203;;;;;;;;;;;;;;47636:217;;46417:1448;;47899:9;47885:11;:23;47877:54;;;;;-1:-1:-1;;;47877:54:0;;;;;;;;;;;;-1:-1:-1;;;47877:54:0;;;;;;;;;;;;;;24351:622;24721:10;;;24720:62;;-1:-1:-1;24737:39:0;;;-1:-1:-1;;;24737:39:0;;24761:4;24737:39;;;;-1:-1:-1;;;;;24737:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24737:39:0;:44;24720:62;24712:152;;;;-1:-1:-1;;;24712:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24902:62;;;-1:-1:-1;;;;;24902:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24902:62:0;-1:-1:-1;;;24902:62:0;;;24875:90;;24895:5;;24875:19;:90::i;44873:698::-;44979:20;-1:-1:-1;;;;;45020:41:0;;31964:42;45020:41;45017:155;;;31964:42;-1:-1:-1;;;;;45078:31:0;;45117:9;45078:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45151:9;45144:16;;;;45017:155;45208:16;;;45222:1;45208:16;;;45184:21;45208:16;;;;;45184:21;45208:16;;;;;;;;;;-1:-1:-1;45208:16:0;45184:40;;31964:42;45235:4;45240:1;45235:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;45235:26:0;;;-1:-1:-1;;;;;45235:26:0;;;;;45282:21;45272:4;45277:1;45272:7;;;;;;;;;;;;;:31;-1:-1:-1;;;;;45272:31:0;;;-1:-1:-1;;;;;45272:31:0;;;;;30620:42;-1:-1:-1;;;;;45329:35:0;;45372:9;45397:1;45413:4;45440;-1:-1:-1;;;45329:150:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45329:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45329:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45329:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45329:150:0;;;;;;;;;;;;-1:-1:-1;45329:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45494:1;45480:4;:11;:15;45329:167;;;;;;;;;;;;;;45314:182;;45531:9;45515:12;:25;;45507:56;;;;;-1:-1:-1;;;45507:56:0;;;;;;;;;;;;-1:-1:-1;;;45507:56:0;;;;;;;;;;;;;;;44873:698;;;;;:::o;25997:761::-;26421:23;26447:69;26475:4;26447:69;;;;;;;;;;;;;;;;;26455:5;-1:-1:-1;;;;;26447:27:0;;;:69;;;;;:::i;:::-;26531:17;;26421:95;;-1:-1:-1;26531:21:0;26527:224;;26673:10;26662:30;;;;;;;;;;;;;;;-1:-1:-1;26662:30:0;26654:85;;;;-1:-1:-1;;;26654:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4258:471;4316:7;4561:6;4557:47;;-1:-1:-1;4591:1:0;4584:8;;4557:47;4628:5;;;4632:1;4628;:5;:1;4652:5;;;;;:10;4644:56;;;;-1:-1:-1;;;4644:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5205:132;5263:7;5290:39;5294:1;5297;5290:39;;;;;;;;;;;;;;;;;:3;:39::i;3773:226::-;3893:7;3929:12;3921:6;;;;3913:29;;;;-1:-1:-1;;;3913:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3965:5:0;;;3773:226::o;16987:230::-;17124:12;17156:53;17179:6;17187:4;17193:1;17196:12;17156:22;:53::i;5833:312::-;5953:7;5988:12;5981:5;5973:28;;;;-1:-1:-1;;;5973:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6012:9;6028:1;6024;:5;;;;;;;5833:312;-1:-1:-1;;;;;5833:312:0:o;18608:1044::-;18781:12;18814:18;18825:6;18814:10;:18::i;:::-;18806:60;;;;;-1:-1:-1;;;18806:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18940:12;18954:23;18981:6;-1:-1:-1;;;;;18981:11:0;19000:8;19024:4;18981:58;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18981:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18939:100;;;;19054:7;19050:595;;;19085:10;-1:-1:-1;19078:17:0;;-1:-1:-1;19078:17:0;19050:595;19199:17;;:21;19195:439;;19462:10;19456:17;19523:15;19510:10;19506:2;19502:19;19495:44;19410:148;19598:20;;-1:-1:-1;;;19598:20:0;;;;;;;;;;;;;;;;;19605:12;;19598:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13950:444;14330:20;14378:8;;;13950:444::o
Swarm Source
ipfs://6ff7fe4bf7e67f4eb54901e8ea678a888a962e6ef2f833b904611ebf663f7293
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.