More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,727 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Beef In | 20223651 | 881 days ago | IN | 0 ETH | 0.000101976366 | ||||
Beef Out | 20200309 | 881 days ago | IN | 0 ETH | 0.000078843483 | ||||
Beef Out | 20002235 | 883 days ago | IN | 0 ETH | 0.000010096106 | ||||
Beef Out | 20000985 | 883 days ago | IN | 0 ETH | 0.00001107967 | ||||
Beef In | 19949146 | 883 days ago | IN | 0 ETH | 0.000086399527 | ||||
Beef In | 19949106 | 883 days ago | IN | 0 ETH | 0.000110920902 | ||||
Beef In | 19948953 | 883 days ago | IN | 0 ETH | 0.000083626953 | ||||
Beef In | 19948917 | 883 days ago | IN | 0 ETH | 0.000083858675 | ||||
Beef In | 19940204 | 883 days ago | IN | 0 ETH | 0.000141209706 | ||||
Beef In ETH | 19939712 | 883 days ago | IN | 0.06 ETH | 0.000103020881 | ||||
Beef In | 19939644 | 883 days ago | IN | 0 ETH | 0.000130260681 | ||||
Beef Out And Swa... | 19936857 | 883 days ago | IN | 0 ETH | 0.000040287731 | ||||
Beef In ETH | 19935715 | 883 days ago | IN | 0.48 ETH | 0.000053117818 | ||||
Beef Out And Swa... | 19935462 | 883 days ago | IN | 0 ETH | 0.000051233033 | ||||
Beef In ETH | 19934988 | 883 days ago | IN | 5.943069181024763 ETH | 0.000037957078 | ||||
Beef In | 19933359 | 883 days ago | IN | 0 ETH | 0.000029798046 | ||||
Beef In | 19933323 | 883 days ago | IN | 0 ETH | 0.00002869029 | ||||
Beef In | 19933266 | 883 days ago | IN | 0 ETH | 0.00003537627 | ||||
Beef In | 19932855 | 883 days ago | IN | 0 ETH | 0.000028506459 | ||||
Beef In | 19932742 | 883 days ago | IN | 0 ETH | 0.000033459854 | ||||
Beef In ETH | 19929670 | 883 days ago | IN | 0.01 ETH | 0.000042035428 | ||||
Beef In | 19928967 | 883 days ago | IN | 0 ETH | 0.000050969399 | ||||
Beef In | 19926385 | 883 days ago | IN | 0 ETH | 0.000036859315 | ||||
Beef In | 19924476 | 883 days ago | IN | 0 ETH | 0.000029523601 | ||||
Beef In | 19924267 | 883 days ago | IN | 0 ETH | 0.000025088128 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19949146 | 883 days ago | 0.000000000738587 ETH | ||||
19949146 | 883 days ago | 0.000000000738587 ETH | ||||
19949106 | 883 days ago | 0.000000000732392 ETH | ||||
19948953 | 883 days ago | 0.000000000529774 ETH | ||||
19948953 | 883 days ago | 0.000000000529774 ETH | ||||
19948917 | 883 days ago | 0.000000000207845 ETH | ||||
19939712 | 883 days ago | 0.06 ETH | ||||
19939644 | 883 days ago | 0.000055349387416 ETH | ||||
19939644 | 883 days ago | 0.000055349387416 ETH | ||||
19935715 | 883 days ago | 0.48 ETH | ||||
19934988 | 883 days ago | 0.000006228283872 ETH | ||||
19934988 | 883 days ago | 0.000006228283872 ETH | ||||
19934988 | 883 days ago | 5.943069181024763 ETH | ||||
19929670 | 883 days ago | 0.000015674647795 ETH | ||||
19929670 | 883 days ago | 0.000015674647795 ETH | ||||
19929670 | 883 days ago | 0.01 ETH | ||||
19922755 | 883 days ago | 0.000000043999199 ETH | ||||
19922755 | 883 days ago | 0.000000043999199 ETH | ||||
19922755 | 883 days ago | 0.0005 ETH | ||||
19922438 | 883 days ago | 0.01 ETH | ||||
19921593 | 883 days ago | 0.000000032505531 ETH | ||||
19921593 | 883 days ago | 0.000000032505531 ETH | ||||
19919391 | 883 days ago | 0.00000006204327 ETH | ||||
19919391 | 883 days ago | 0.00000006204327 ETH | ||||
19917883 | 883 days ago | 0.000030019078237 ETH |
Loading...
Loading
Contract Name:
BeefyUniV2ZapSolidly
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at optimistic.etherscan.io on 2022-07-25 */ // SPDX-License-Identifier: MIT // File: contracts/BIFI/zap/IUniswapV2Pair.sol pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function stable() external view returns (bool); function getAmountOut(uint256 amountIn, address tokenIn) external view returns (uint256); function initialize(address, address) external; } // File: contracts/BIFI/zap/Babylonian.sol pragma solidity >=0.4.0; // computes square roots using the babylonian method // https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method library Babylonian { // credit for this implementation goes to // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687 function sqrt(uint256 x) internal pure returns (uint256) { if (x == 0) return 0; // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2); // however that code costs significantly more gas uint256 xx = x; uint256 r = 1; if (xx >= 0x100000000000000000000000000000000) { xx >>= 128; r <<= 64; } if (xx >= 0x10000000000000000) { xx >>= 64; r <<= 32; } if (xx >= 0x100000000) { xx >>= 32; r <<= 16; } if (xx >= 0x10000) { xx >>= 16; r <<= 8; } if (xx >= 0x100) { xx >>= 8; r <<= 4; } if (xx >= 0x10) { xx >>= 4; r <<= 2; } if (xx >= 0x8) { r <<= 1; } r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; // Seven iterations should be enough uint256 r1 = x / r; return (r < r1 ? r : r1); } } // File: contracts/BIFI/zap/IERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/BIFI/zap/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, 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: contracts/BIFI/zap/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/BIFI/zap/SafeERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/BIFI/zap/LowGasSafeMath.sol pragma solidity >=0.7.0; /// @title Optimized overflow and underflow safe math operations /// @notice Contains methods for doing math operations that revert on overflow or underflow for minimal gas cost library LowGasSafeMath { /// @notice Returns x + y, reverts if sum overflows uint256 /// @param x The augend /// @param y The addend /// @return z The sum of x and y function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x); } /// @notice Returns x - y, reverts if underflows /// @param x The minuend /// @param y The subtrahend /// @return z The difference of x and y function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x); } /// @notice Returns x * y, reverts if overflows /// @param x The multiplicand /// @param y The multiplier /// @return z The product of x and y function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(x == 0 || (z = x * y) / x == y); } /// @notice Returns x + y, reverts if overflows or underflows /// @param x The augend /// @param y The addend /// @return z The sum of x and y function add(int256 x, int256 y) internal pure returns (int256 z) { require((z = x + y) >= x == (y >= 0)); } /// @notice Returns x - y, reverts if overflows or underflows /// @param x The minuend /// @param y The subtrahend /// @return z The difference of x and y function sub(int256 x, int256 y) internal pure returns (int256 z) { require((z = x - y) <= x == (y >= 0)); } } // File: contracts/BIFI/zap/IUniswapV2Router01.sol pragma solidity >=0.6.0 <0.9.0; interface IUniswapRouterSolidly { function addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, bool stable, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokensSimple( uint amountIn, uint amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint deadline ) external returns (uint[] memory amounts); function getAmountOut(uint amountIn, address tokenIn, address tokenOut) external view returns (uint amount, bool stable); function quoteAddLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired ) external view returns (uint amountA, uint amountB, uint liquidity); function quoteLiquidity(uint amountA, uint reserveA, uint reserveB) external view returns (uint amountB); function factory() external view returns (address); function weth() external view returns (address); } // File: contracts/BIFI/zap/BeefyUniV2Zap.sol // 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 Wivern for Beefy.Finance // @notice This contract adds liquidity to Uniswap V2 compatible liquidity pair pools and stake. pragma solidity >=0.7.0; interface IERC20Extended { function decimals() external view returns (uint256); } interface IWETH is IERC20 { function deposit() external payable; function withdraw(uint256 wad) external; } interface IBeefyVaultV6 is IERC20 { function deposit(uint256 amount) external; function withdraw(uint256 shares) external; function want() external pure returns (address); } contract BeefyUniV2ZapSolidly { using LowGasSafeMath for uint256; using SafeERC20 for IERC20; using SafeERC20 for IBeefyVaultV6; IUniswapRouterSolidly public immutable router; address public immutable WETH; uint256 public constant minimumAmount = 1000; constructor(address _router, address _WETH) { router = IUniswapRouterSolidly(_router); WETH = _WETH; } receive() external payable { assert(msg.sender == WETH); } function beefInETH (address beefyVault, uint256 tokenAmountOutMin) external payable { require(msg.value >= minimumAmount, 'Beefy: Insignificant input amount'); IWETH(WETH).deposit{value: msg.value}(); _swapAndStake(beefyVault, tokenAmountOutMin, WETH); } function beefIn (address beefyVault, uint256 tokenAmountOutMin, address tokenIn, uint256 tokenInAmount) external { require(tokenInAmount >= minimumAmount, 'Beefy: Insignificant input amount'); require(IERC20(tokenIn).allowance(msg.sender, address(this)) >= tokenInAmount, 'Beefy: Input token is not approved'); IERC20(tokenIn).safeTransferFrom(msg.sender, address(this), tokenInAmount); _swapAndStake(beefyVault, tokenAmountOutMin, tokenIn); } function beefOut (address beefyVault, uint256 withdrawAmount) external { (IBeefyVaultV6 vault, IUniswapV2Pair pair) = _getVaultPair(beefyVault); IERC20(beefyVault).safeTransferFrom(msg.sender, address(this), withdrawAmount); vault.withdraw(withdrawAmount); if (pair.token0() != WETH && pair.token1() != WETH) { return _removeLiquidity(address(pair), msg.sender); } _removeLiquidity(address(pair), address(this)); address[] memory tokens = new address[](2); tokens[0] = pair.token0(); tokens[1] = pair.token1(); _returnAssets(tokens); } function beefOutAndSwap(address beefyVault, uint256 withdrawAmount, address desiredToken, uint256 desiredTokenOutMin) external { (IBeefyVaultV6 vault, IUniswapV2Pair pair) = _getVaultPair(beefyVault); address token0 = pair.token0(); address token1 = pair.token1(); require(token0 == desiredToken || token1 == desiredToken, 'Beefy: desired token not present in liqudity pair'); vault.safeTransferFrom(msg.sender, address(this), withdrawAmount); vault.withdraw(withdrawAmount); _removeLiquidity(address(pair), address(this)); address swapToken = token1 == desiredToken ? token0 : token1; address[] memory path = new address[](2); path[0] = swapToken; path[1] = desiredToken; _approveTokenIfNeeded(path[0], address(router)); router.swapExactTokensForTokensSimple(IERC20(swapToken).balanceOf(address(this)), desiredTokenOutMin, path[0], path[1], pair.stable(), address(this), block.timestamp); _returnAssets(path); } function _removeLiquidity(address pair, address to) private { IERC20(pair).safeTransfer(pair, IERC20(pair).balanceOf(address(this))); (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(to); require(amount0 >= minimumAmount, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT'); require(amount1 >= minimumAmount, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT'); } function _getVaultPair (address beefyVault) private pure returns (IBeefyVaultV6 vault, IUniswapV2Pair pair) { vault = IBeefyVaultV6(beefyVault); pair = IUniswapV2Pair(vault.want()); } function _swapAndStake(address beefyVault, uint256 tokenAmountOutMin, address tokenIn) private { (IBeefyVaultV6 vault, IUniswapV2Pair pair) = _getVaultPair(beefyVault); (uint256 reserveA, uint256 reserveB,) = pair.getReserves(); require(reserveA > minimumAmount && reserveB > minimumAmount, 'Beefy: Liquidity pair reserves too low'); bool isInputA = pair.token0() == tokenIn; require(isInputA || pair.token1() == tokenIn, 'Beefy: Input token not present in liqudity pair'); address[] memory path = new address[](2); path[0] = tokenIn; path[1] = isInputA ? pair.token1() : pair.token0(); uint256 fullInvestment = IERC20(tokenIn).balanceOf(address(this)); uint256 swapAmountIn; if (isInputA) { swapAmountIn = _getSwapAmount(pair, fullInvestment, reserveA, reserveB, path[0]); } else { swapAmountIn = _getSwapAmount(pair, fullInvestment, reserveB, reserveA, path[0]); } _approveTokenIfNeeded(path[0], address(router)); uint256[] memory swapedAmounts = router .swapExactTokensForTokensSimple(swapAmountIn, tokenAmountOutMin, path[0], path[1], pair.stable(), address(this), block.timestamp); _approveTokenIfNeeded(path[1], address(router)); (,, uint256 amountLiquidity) = router .addLiquidity(path[0], path[1], pair.stable(), fullInvestment.sub(swapedAmounts[0]), swapedAmounts[1], 1, 1, address(this), block.timestamp); _approveTokenIfNeeded(address(pair), address(vault)); vault.deposit(amountLiquidity); vault.safeTransfer(msg.sender, vault.balanceOf(address(this))); _returnAssets(path); } function _returnAssets(address[] memory tokens) private { uint256 balance; for (uint256 i; i < tokens.length; i++) { balance = IERC20(tokens[i]).balanceOf(address(this)); if (balance > 0) { if (tokens[i] == WETH) { IWETH(WETH).withdraw(balance); (bool success,) = msg.sender.call{value: balance}(new bytes(0)); require(success, 'Beefy: ETH transfer failed'); } else { IERC20(tokens[i]).safeTransfer(msg.sender, balance); } } } } function _getSwapAmount(IUniswapV2Pair pair, uint256 investmentA, uint256 reserveA, uint256 reserveB, address tokenA) private view returns (uint256 swapAmount) { uint256 halfInvestment = pair.stable() ? investmentA * getRatio(pair, tokenA) / 10**18 : investmentA / 2; uint256 nominator = pair.getAmountOut(halfInvestment, tokenA); uint256 denominator = halfInvestment * reserveB.sub(nominator) / reserveA.add(halfInvestment); swapAmount = pair.stable() ? halfInvestment : investmentA.sub(Babylonian.sqrt(halfInvestment * halfInvestment * nominator / denominator)); } function getRatio(IUniswapV2Pair pair, address tokenA) public view returns (uint256) { (uint256 opLp0, uint256 opLp1, ) = pair.getReserves(); uint256 lp0Amt = opLp0 * 10**18 / 10**IERC20Extended(pair.token0()).decimals(); uint256 lp1Amt = opLp1 * 10**18 / 10**IERC20Extended(pair.token1()).decimals(); uint256 totalSupply = lp0Amt.add(lp1Amt); bool tokenAis0 = tokenA == pair.token0() ? true : false; return tokenAis0 ? lp1Amt * 10**18 / totalSupply : lp0Amt * 10**18 / totalSupply ; } function estimateSwap(address beefyVault, address tokenIn, uint256 fullInvestmentIn) public view returns(uint256 swapAmountIn, uint256 swapAmountOut, address swapTokenOut) { checkWETH(); (, IUniswapV2Pair pair) = _getVaultPair(beefyVault); bool isInputA = pair.token0() == tokenIn; require(isInputA || pair.token1() == tokenIn, 'Beefy: Input token not present in liqudity pair'); (uint256 reserveA, uint256 reserveB,) = pair.getReserves(); (reserveA, reserveB) = isInputA ? (reserveA, reserveB) : (reserveB, reserveA); swapTokenOut = isInputA ? pair.token1() : pair.token0(); swapAmountIn = _getSwapAmount(pair, fullInvestmentIn, reserveA, reserveB, tokenIn); swapAmountOut = pair.getAmountOut(swapAmountIn, tokenIn); } function checkWETH() public view returns (bool isValid) { isValid = WETH == router.weth(); require(isValid, 'Beefy: WETH address not matching Router.weth()'); } function _approveTokenIfNeeded(address token, address spender) private { if (IERC20(token).allowance(address(this), spender) == 0) { IERC20(token).safeApprove(spender, uint256(~0)); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beefyVault","type":"address"},{"internalType":"uint256","name":"tokenAmountOutMin","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenInAmount","type":"uint256"}],"name":"beefIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beefyVault","type":"address"},{"internalType":"uint256","name":"tokenAmountOutMin","type":"uint256"}],"name":"beefInETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"beefyVault","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"beefOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beefyVault","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"},{"internalType":"address","name":"desiredToken","type":"address"},{"internalType":"uint256","name":"desiredTokenOutMin","type":"uint256"}],"name":"beefOutAndSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkWETH","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beefyVault","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"fullInvestmentIn","type":"uint256"}],"name":"estimateSwap","outputs":[{"internalType":"uint256","name":"swapAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapAmountOut","type":"uint256"},{"internalType":"address","name":"swapTokenOut","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IUniswapV2Pair","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"}],"name":"getRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapRouterSolidly","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801561001057600080fd5b50604051612e1b380380612e1b8339818101604052604081101561003357600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c612d5d6100be6000398060a55280610bde5280610c575280610d08528061113452806111d552806113e75280611aca5280611b175250806108ef52806109155280610c83528061153052806120fb52806123085250612d5d6000f3fe6080604052600436106100955760003560e01c8063a28c361b11610059578063a28c361b14610226578063ad5c46481461025f578063bb0c829814610290578063f5d07b60146102a5578063f887ea40146102ec576100ce565b80633f2f869a146100d357806351c9cf911461013d57806370fae20d146101845780638437fabe146101b05780638dd136fd146101d9576100ce565b366100ce57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146100cc57fe5b005b600080fd5b3480156100df57600080fd5b50610116600480360360608110156100f657600080fd5b506001600160a01b03813581169160208101359091169060400135610301565b6040805193845260208401929092526001600160a01b031682820152519081900360600190f35b34801561014957600080fd5b506100cc6004803603608081101561016057600080fd5b506001600160a01b0381358116916020810135916040820135169060600135610662565b6100cc6004803603604081101561019a57600080fd5b506001600160a01b038135169060200135610b9b565b3480156101bc57600080fd5b506101c5610c7f565b604080519115158252519081900360200190f35b3480156101e557600080fd5b50610214600480360360408110156101fc57600080fd5b506001600160a01b0381358116916020013516610d76565b60408051918252519081900360200190f35b34801561023257600080fd5b506100cc6004803603604081101561024957600080fd5b506001600160a01b0381351690602001356110ae565b34801561026b57600080fd5b506102746113e5565b604080516001600160a01b039092168252519081900360200190f35b34801561029c57600080fd5b50610214611409565b3480156102b157600080fd5b506100cc600480360360808110156102c857600080fd5b506001600160a01b038135811691602081013591604082013516906060013561140f565b3480156102f857600080fd5b5061027461152e565b600080600061030e610c7f565b50600061031a87611552565b9150506000866001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561036257600080fd5b505afa158015610376573d6000803e3d6000fd5b505050506040513d602081101561038c57600080fd5b50516001600160a01b0316149050808061041b5750866001600160a01b0316826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156103e457600080fd5b505afa1580156103f8573d6000803e3d6000fd5b505050506040513d602081101561040e57600080fd5b50516001600160a01b0316145b6104565760405162461bcd60e51b815260040180806020018281038252602f815260200180612c42602f913960400191505060405180910390fd5b600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561049257600080fd5b505afa1580156104a6573d6000803e3d6000fd5b505050506040513d60608110156104bc57600080fd5b5080516020909101516001600160701b039182169350169050826104e15780826104e4565b81815b90925090508261055857836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561052757600080fd5b505afa15801561053b573d6000803e3d6000fd5b505050506040513d602081101561055157600080fd5b50516105be565b836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561059157600080fd5b505afa1580156105a5573d6000803e3d6000fd5b505050506040513d60208110156105bb57600080fd5b50515b94506105cd848984848d6115c5565b9650836001600160a01b031663f140a35a888b6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b15801561062457600080fd5b505afa158015610638573d6000803e3d6000fd5b505050506040513d602081101561064e57600080fd5b5051969a9699509397509495505050505050565b60008061066e86611552565b915091506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ad57600080fd5b505afa1580156106c1573d6000803e3d6000fd5b505050506040513d60208110156106d757600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0385169163d21220a7916004808301926020929190829003018186803b15801561071f57600080fd5b505afa158015610733573d6000803e3d6000fd5b505050506040513d602081101561074957600080fd5b505190506001600160a01b0382811690871614806107785750856001600160a01b0316816001600160a01b0316145b6107b35760405162461bcd60e51b8152600401808060200182810382526031815260200180612c716031913960400191505060405180910390fd5b6107c86001600160a01b03851633308a61179e565b836001600160a01b0316632e1a7d4d886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561080e57600080fd5b505af1158015610822573d6000803e3d6000fd5b5050505061083083306117f8565b6000866001600160a01b0316826001600160a01b0316146108515781610853565b825b6040805160028082526060820183529293506000929091602083019080368337019050509050818160008151811061088757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505087816001815181106108b557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610913816000815181106108e557fe5b60200260200101517f0000000000000000000000000000000000000000000000000000000000000000611991565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166313dcfc59836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561098f57600080fd5b505afa1580156109a3573d6000803e3d6000fd5b505050506040513d60208110156109b957600080fd5b505183518a9085906000906109ca57fe5b6020026020010151856001815181106109df57fe5b60200260200101518a6001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b158015610a2057600080fd5b505afa158015610a34573d6000803e3d6000fd5b505050506040513d6020811015610a4a57600080fd5b5051604080516001600160e01b031960e089901b168152600481019690965260248601949094526001600160a01b03928316604486015291166064840152151560848301523060a48301524260c48301525160e480830192600092919082900301818387803b158015610abc57600080fd5b505af1158015610ad0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610af957600080fd5b8101908080516040519392919084640100000000821115610b1957600080fd5b908301906020820185811115610b2e57600080fd5b8251866020820283011164010000000082111715610b4b57600080fd5b82525081516020918201928201910280838360005b83811015610b78578181015183820152602001610b60565b5050505090500160405250505050610b8f81611a27565b50505050505050505050565b6103e8341015610bdc5760405162461bcd60e51b8152600401808060200182810382526021815260200180612b8d6021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c3757600080fd5b505af1158015610c4b573d6000803e3d6000fd5b5050505050610c7b82827f0000000000000000000000000000000000000000000000000000000000000000611cd5565b5050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633fc8cef36040518163ffffffff1660e01b815260040160206040518083038186803b158015610cda57600080fd5b505afa158015610cee573d6000803e3d6000fd5b505050506040513d6020811015610d0457600080fd5b50517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116911614905080610d735760405162461bcd60e51b815260040180806020018281038252602e815260200180612b5f602e913960400191505060405180910390fd5b90565b6000806000846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610db457600080fd5b505afa158015610dc8573d6000803e3d6000fd5b505050506040513d6060811015610dde57600080fd5b50805160209182015160408051630dfe168160e01b815290516001600160701b0393841696509290911693506000926001600160a01b03891692630dfe1681926004808201939291829003018186803b158015610e3a57600080fd5b505afa158015610e4e573d6000803e3d6000fd5b505050506040513d6020811015610e6457600080fd5b50516040805163313ce56760e01b815290516001600160a01b039092169163313ce56791600480820192602092909190829003018186803b158015610ea857600080fd5b505afa158015610ebc573d6000803e3d6000fd5b505050506040513d6020811015610ed257600080fd5b5051600a0a670de0b6b3a7640000840281610ee957fe5b0490506000866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2757600080fd5b505afa158015610f3b573d6000803e3d6000fd5b505050506040513d6020811015610f5157600080fd5b50516040805163313ce56760e01b815290516001600160a01b039092169163313ce56791600480820192602092909190829003018186803b158015610f9557600080fd5b505afa158015610fa9573d6000803e3d6000fd5b505050506040513d6020811015610fbf57600080fd5b5051600a0a670de0b6b3a7640000840281610fd657fe5b0490506000610fe583836125c2565b90506000886001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d602081101561104c57600080fd5b50516001600160a01b0389811691161461106757600061106a565b60015b90508061108a578184670de0b6b3a7640000028161108457fe5b0461109f565b8183670de0b6b3a7640000028161109d57fe5b045b96505050505050505b92915050565b6000806110ba84611552565b90925090506110d46001600160a01b03851633308661179e565b816001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561111a57600080fd5b505af115801561112e573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561119557600080fd5b505afa1580156111a9573d6000803e3d6000fd5b505050506040513d60208110156111bf57600080fd5b50516001600160a01b03161480159061126e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561123657600080fd5b505afa15801561124a573d6000803e3d6000fd5b505050506040513d602081101561126057600080fd5b50516001600160a01b031614155b156112845761127d81336117f8565b5050610c7b565b61128e81306117f8565b604080516002808252606082018352600092602083019080368337019050509050816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e857600080fd5b505afa1580156112fc573d6000803e3d6000fd5b505050506040513d602081101561131257600080fd5b50518151829060009061132157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561137a57600080fd5b505afa15801561138e573d6000803e3d6000fd5b505050506040513d60208110156113a457600080fd5b50518151829060019081106113b557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506113de81611a27565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6103e881565b6103e88110156114505760405162461bcd60e51b8152600401808060200182810382526021815260200180612b8d6021913960400191505060405180910390fd5b60408051636eb1769f60e11b8152336004820152306024820152905182916001600160a01b0385169163dd62ed3e91604480820192602092909190829003018186803b15801561149f57600080fd5b505afa1580156114b3573d6000803e3d6000fd5b505050506040513d60208110156114c957600080fd5b505110156115085760405162461bcd60e51b8152600401808060200182810382526022815260200180612c206022913960400191505060405180910390fd5b61151d6001600160a01b03831633308461179e565b611528848484611cd5565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080829150816001600160a01b0316631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b15801561159157600080fd5b505afa1580156115a5573d6000803e3d6000fd5b505050506040513d60208110156115bb57600080fd5b5051919391925050565b600080866001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561160157600080fd5b505afa158015611615573d6000803e3d6000fd5b505050506040513d602081101561162b57600080fd5b505161163a5760028604611658565b670de0b6b3a764000061164d8885610d76565b87028161165657fe5b045b90506000876001600160a01b031663f140a35a83866040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156116b157600080fd5b505afa1580156116c5573d6000803e3d6000fd5b505050506040513d60208110156116db57600080fd5b5051905060006116eb87846125c2565b6116f587846125d2565b8402816116fe57fe5b049050886001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561173a57600080fd5b505afa15801561174e573d6000803e3d6000fd5b505050506040513d602081101561176457600080fd5b505161178f5761178a6117838284868702028161177d57fe5b046125e2565b89906125d2565b611791565b825b9998505050505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261152890859061272a565b61188682836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561184957600080fd5b505afa15801561185d573d6000803e3d6000fd5b505050506040513d602081101561187357600080fd5b50516001600160a01b03851691906127db565b600080836001600160a01b03166389afcb44846040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506040805180830381600087803b1580156118d757600080fd5b505af11580156118eb573d6000803e3d6000fd5b505050506040513d604081101561190157600080fd5b50805160209091015190925090506103e88210156119505760405162461bcd60e51b8152600401808060200182810382526026815260200180612ca26026913960400191505060405180910390fd5b6103e88110156115285760405162461bcd60e51b8152600401808060200182810382526026815260200180612bd46026913960400191505060405180910390fd5b60408051636eb1769f60e11b81523060048201526001600160a01b03838116602483015291519184169163dd62ed3e91604480820192602092909190829003018186803b1580156119e157600080fd5b505afa1580156119f5573d6000803e3d6000fd5b505050506040513d6020811015611a0b57600080fd5b5051610c7b57610c7b6001600160a01b0383168260001961282d565b6000805b8251811015611cd057828181518110611a4057fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a9457600080fd5b505afa158015611aa8573d6000803e3d6000fd5b505050506040513d6020811015611abe57600080fd5b505191508115611cc8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316838281518110611afe57fe5b60200260200101516001600160a01b03161415611c97577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b7b57600080fd5b505af1158015611b8f573d6000803e3d6000fd5b505060408051600080825260208201928390528151909450339350869290819081908082805b60208310611bd45780518252601f199092019160209182019101611bb5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611c36576040519150601f19603f3d011682016040523d82523d6000602084013e611c3b565b606091505b5050905080611c91576040805162461bcd60e51b815260206004820152601a60248201527f42656566793a20455448207472616e73666572206661696c6564000000000000604482015290519081900360640190fd5b50611cc8565b611cc83383858481518110611ca857fe5b60200260200101516001600160a01b03166127db9092919063ffffffff16565b600101611a2b565b505050565b600080611ce185611552565b91509150600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611d2157600080fd5b505afa158015611d35573d6000803e3d6000fd5b505050506040513d6060811015611d4b57600080fd5b5080516020909101516001600160701b0391821693501690506103e882118015611d7657506103e881115b611db15760405162461bcd60e51b8152600401808060200182810382526026815260200180612bae6026913960400191505060405180910390fd5b6000856001600160a01b0316846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611df657600080fd5b505afa158015611e0a573d6000803e3d6000fd5b505050506040513d6020811015611e2057600080fd5b50516001600160a01b03161490508080611eaf5750856001600160a01b0316846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7857600080fd5b505afa158015611e8c573d6000803e3d6000fd5b505050506040513d6020811015611ea257600080fd5b50516001600160a01b0316145b611eea5760405162461bcd60e51b815260040180806020018281038252602f815260200180612c42602f913960400191505060405180910390fd5b6040805160028082526060820183526000926020830190803683370190505090508681600081518110611f1957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081611fa857846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7757600080fd5b505afa158015611f8b573d6000803e3d6000fd5b505050506040513d6020811015611fa157600080fd5b505161200e565b846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611fe157600080fd5b505afa158015611ff5573d6000803e3d6000fd5b505050506040513d602081101561200b57600080fd5b50515b8160018151811061201b57fe5b6001600160a01b03928316602091820292909201810191909152604080516370a0823160e01b815230600482015290516000938b16926370a082319260248082019391829003018186803b15801561207257600080fd5b505afa158015612086573d6000803e3d6000fd5b505050506040513d602081101561209c57600080fd5b50519050600083156120d0576120c987838888876000815181106120bc57fe5b60200260200101516115c5565b90506120e7565b6120e487838789876000815181106120bc57fe5b90505b6120f7836000815181106108e557fe5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166313dcfc59838d8760008151811061213757fe5b60200260200101518860018151811061214c57fe5b60200260200101518d6001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561218d57600080fd5b505afa1580156121a1573d6000803e3d6000fd5b505050506040513d60208110156121b757600080fd5b5051604080516001600160e01b031960e089901b168152600481019690965260248601949094526001600160a01b03928316604486015291166064840152151560848301523060a48301524260c48301525160e480830192600092919082900301818387803b15801561222957600080fd5b505af115801561223d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561226657600080fd5b810190808051604051939291908464010000000082111561228657600080fd5b90830190602082018581111561229b57600080fd5b82518660208202830111640100000000821117156122b857600080fd5b82525081516020918201928201910280838360005b838110156122e55781810151838201526020016122cd565b505050509050016040525050509050612304846001815181106108e557fe5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635a47ddc38660008151811061234257fe5b60200260200101518760018151811061235757fe5b60200260200101518c6001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561239857600080fd5b505afa1580156123ac573d6000803e3d6000fd5b505050506040513d60208110156123c257600080fd5b505186516123ec9088906000906123d557fe5b60200260200101518a6125d290919063ffffffff16565b876001815181106123f957fe5b6020908102919091010151604080516001600160e01b031960e089901b1681526001600160a01b039687166004820152949095166024850152911515604484015260648301526084820152600160a4820181905260c48201523060e48201524261010482015290516101248083019260609291908290030181600087803b15801561248357600080fd5b505af1158015612497573d6000803e3d6000fd5b505050506040513d60608110156124ad57600080fd5b506040015190506124be898b611991565b896001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561250457600080fd5b505af1158015612518573d6000803e3d6000fd5b505050506125aa338b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561256d57600080fd5b505afa158015612581573d6000803e3d6000fd5b505050506040513d602081101561259757600080fd5b50516001600160a01b038d1691906127db565b6125b385611a27565b50505050505050505050505050565b808201828110156110a857600080fd5b808203828111156110a857600080fd5b6000816125f157506000612725565b816001600160801b821061260a5760809190911c9060401b5b6801000000000000000082106126255760409190911c9060201b5b640100000000821061263c5760209190911c9060101b5b6201000082106126515760109190911c9060081b5b61010082106126655760089190911c9060041b5b601082106126785760049190911c9060021b5b600882106126845760011b5b600181858161268f57fe5b048201901c905060018185816126a157fe5b048201901c905060018185816126b357fe5b048201901c905060018185816126c557fe5b048201901c905060018185816126d757fe5b048201901c905060018185816126e957fe5b048201901c905060018185816126fb57fe5b048201901c9050600081858161270d57fe5b04905080821061271d578061271f565b815b93505050505b919050565b600061277f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129409092919063ffffffff16565b805190915015611cd05780806020019051602081101561279e57600080fd5b5051611cd05760405162461bcd60e51b815260040180806020018281038252602a815260200180612cc8602a913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611cd090849061272a565b8015806128b3575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561288557600080fd5b505afa158015612899573d6000803e3d6000fd5b505050506040513d60208110156128af57600080fd5b5051155b6128ee5760405162461bcd60e51b8152600401808060200182810382526036815260200180612cf26036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611cd090849061272a565b606061294f8484600085612959565b90505b9392505050565b60608247101561299a5760405162461bcd60e51b8152600401808060200182810382526026815260200180612bfa6026913960400191505060405180910390fd5b6129a385612ab4565b6129f4576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310612a325780518252601f199092019160209182019101612a13565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612a94576040519150601f19603f3d011682016040523d82523d6000602084013e612a99565b606091505b5091509150612aa9828286612aba565b979650505050505050565b3b151590565b60608315612ac9575081612952565b825115612ad95782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612b23578181015183820152602001612b0b565b50505050905090810190601f168015612b505780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe42656566793a20574554482061646472657373206e6f74206d61746368696e6720526f757465722e77657468282942656566793a20496e7369676e69666963616e7420696e70757420616d6f756e7442656566793a204c6971756964697479207061697220726573657276657320746f6f206c6f77556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c42656566793a20496e70757420746f6b656e206973206e6f7420617070726f76656442656566793a20496e70757420746f6b656e206e6f742070726573656e7420696e206c69717564697479207061697242656566793a206465736972656420746f6b656e206e6f742070726573656e7420696e206c697175646974792070616972556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220e7f0cfa4e340100bdb80d7ad4cd5646897878ed3a21a65083f9463509cf24c6564736f6c63430007060033000000000000000000000000a132dab612db5cb9fc9ac426a0cc215a3423f9c90000000000000000000000004200000000000000000000000000000000000006
Deployed Bytecode
0x6080604052600436106100955760003560e01c8063a28c361b11610059578063a28c361b14610226578063ad5c46481461025f578063bb0c829814610290578063f5d07b60146102a5578063f887ea40146102ec576100ce565b80633f2f869a146100d357806351c9cf911461013d57806370fae20d146101845780638437fabe146101b05780638dd136fd146101d9576100ce565b366100ce57336001600160a01b037f000000000000000000000000420000000000000000000000000000000000000616146100cc57fe5b005b600080fd5b3480156100df57600080fd5b50610116600480360360608110156100f657600080fd5b506001600160a01b03813581169160208101359091169060400135610301565b6040805193845260208401929092526001600160a01b031682820152519081900360600190f35b34801561014957600080fd5b506100cc6004803603608081101561016057600080fd5b506001600160a01b0381358116916020810135916040820135169060600135610662565b6100cc6004803603604081101561019a57600080fd5b506001600160a01b038135169060200135610b9b565b3480156101bc57600080fd5b506101c5610c7f565b604080519115158252519081900360200190f35b3480156101e557600080fd5b50610214600480360360408110156101fc57600080fd5b506001600160a01b0381358116916020013516610d76565b60408051918252519081900360200190f35b34801561023257600080fd5b506100cc6004803603604081101561024957600080fd5b506001600160a01b0381351690602001356110ae565b34801561026b57600080fd5b506102746113e5565b604080516001600160a01b039092168252519081900360200190f35b34801561029c57600080fd5b50610214611409565b3480156102b157600080fd5b506100cc600480360360808110156102c857600080fd5b506001600160a01b038135811691602081013591604082013516906060013561140f565b3480156102f857600080fd5b5061027461152e565b600080600061030e610c7f565b50600061031a87611552565b9150506000866001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561036257600080fd5b505afa158015610376573d6000803e3d6000fd5b505050506040513d602081101561038c57600080fd5b50516001600160a01b0316149050808061041b5750866001600160a01b0316826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156103e457600080fd5b505afa1580156103f8573d6000803e3d6000fd5b505050506040513d602081101561040e57600080fd5b50516001600160a01b0316145b6104565760405162461bcd60e51b815260040180806020018281038252602f815260200180612c42602f913960400191505060405180910390fd5b600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561049257600080fd5b505afa1580156104a6573d6000803e3d6000fd5b505050506040513d60608110156104bc57600080fd5b5080516020909101516001600160701b039182169350169050826104e15780826104e4565b81815b90925090508261055857836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561052757600080fd5b505afa15801561053b573d6000803e3d6000fd5b505050506040513d602081101561055157600080fd5b50516105be565b836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561059157600080fd5b505afa1580156105a5573d6000803e3d6000fd5b505050506040513d60208110156105bb57600080fd5b50515b94506105cd848984848d6115c5565b9650836001600160a01b031663f140a35a888b6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b15801561062457600080fd5b505afa158015610638573d6000803e3d6000fd5b505050506040513d602081101561064e57600080fd5b5051969a9699509397509495505050505050565b60008061066e86611552565b915091506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ad57600080fd5b505afa1580156106c1573d6000803e3d6000fd5b505050506040513d60208110156106d757600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0385169163d21220a7916004808301926020929190829003018186803b15801561071f57600080fd5b505afa158015610733573d6000803e3d6000fd5b505050506040513d602081101561074957600080fd5b505190506001600160a01b0382811690871614806107785750856001600160a01b0316816001600160a01b0316145b6107b35760405162461bcd60e51b8152600401808060200182810382526031815260200180612c716031913960400191505060405180910390fd5b6107c86001600160a01b03851633308a61179e565b836001600160a01b0316632e1a7d4d886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561080e57600080fd5b505af1158015610822573d6000803e3d6000fd5b5050505061083083306117f8565b6000866001600160a01b0316826001600160a01b0316146108515781610853565b825b6040805160028082526060820183529293506000929091602083019080368337019050509050818160008151811061088757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505087816001815181106108b557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610913816000815181106108e557fe5b60200260200101517f000000000000000000000000a132dab612db5cb9fc9ac426a0cc215a3423f9c9611991565b7f000000000000000000000000a132dab612db5cb9fc9ac426a0cc215a3423f9c96001600160a01b03166313dcfc59836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561098f57600080fd5b505afa1580156109a3573d6000803e3d6000fd5b505050506040513d60208110156109b957600080fd5b505183518a9085906000906109ca57fe5b6020026020010151856001815181106109df57fe5b60200260200101518a6001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b158015610a2057600080fd5b505afa158015610a34573d6000803e3d6000fd5b505050506040513d6020811015610a4a57600080fd5b5051604080516001600160e01b031960e089901b168152600481019690965260248601949094526001600160a01b03928316604486015291166064840152151560848301523060a48301524260c48301525160e480830192600092919082900301818387803b158015610abc57600080fd5b505af1158015610ad0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610af957600080fd5b8101908080516040519392919084640100000000821115610b1957600080fd5b908301906020820185811115610b2e57600080fd5b8251866020820283011164010000000082111715610b4b57600080fd5b82525081516020918201928201910280838360005b83811015610b78578181015183820152602001610b60565b5050505090500160405250505050610b8f81611a27565b50505050505050505050565b6103e8341015610bdc5760405162461bcd60e51b8152600401808060200182810382526021815260200180612b8d6021913960400191505060405180910390fd5b7f00000000000000000000000042000000000000000000000000000000000000066001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c3757600080fd5b505af1158015610c4b573d6000803e3d6000fd5b5050505050610c7b82827f0000000000000000000000004200000000000000000000000000000000000006611cd5565b5050565b60007f000000000000000000000000a132dab612db5cb9fc9ac426a0cc215a3423f9c96001600160a01b0316633fc8cef36040518163ffffffff1660e01b815260040160206040518083038186803b158015610cda57600080fd5b505afa158015610cee573d6000803e3d6000fd5b505050506040513d6020811015610d0457600080fd5b50517f00000000000000000000000042000000000000000000000000000000000000066001600160a01b03908116911614905080610d735760405162461bcd60e51b815260040180806020018281038252602e815260200180612b5f602e913960400191505060405180910390fd5b90565b6000806000846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610db457600080fd5b505afa158015610dc8573d6000803e3d6000fd5b505050506040513d6060811015610dde57600080fd5b50805160209182015160408051630dfe168160e01b815290516001600160701b0393841696509290911693506000926001600160a01b03891692630dfe1681926004808201939291829003018186803b158015610e3a57600080fd5b505afa158015610e4e573d6000803e3d6000fd5b505050506040513d6020811015610e6457600080fd5b50516040805163313ce56760e01b815290516001600160a01b039092169163313ce56791600480820192602092909190829003018186803b158015610ea857600080fd5b505afa158015610ebc573d6000803e3d6000fd5b505050506040513d6020811015610ed257600080fd5b5051600a0a670de0b6b3a7640000840281610ee957fe5b0490506000866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2757600080fd5b505afa158015610f3b573d6000803e3d6000fd5b505050506040513d6020811015610f5157600080fd5b50516040805163313ce56760e01b815290516001600160a01b039092169163313ce56791600480820192602092909190829003018186803b158015610f9557600080fd5b505afa158015610fa9573d6000803e3d6000fd5b505050506040513d6020811015610fbf57600080fd5b5051600a0a670de0b6b3a7640000840281610fd657fe5b0490506000610fe583836125c2565b90506000886001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d602081101561104c57600080fd5b50516001600160a01b0389811691161461106757600061106a565b60015b90508061108a578184670de0b6b3a7640000028161108457fe5b0461109f565b8183670de0b6b3a7640000028161109d57fe5b045b96505050505050505b92915050565b6000806110ba84611552565b90925090506110d46001600160a01b03851633308661179e565b816001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561111a57600080fd5b505af115801561112e573d6000803e3d6000fd5b505050507f00000000000000000000000042000000000000000000000000000000000000066001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561119557600080fd5b505afa1580156111a9573d6000803e3d6000fd5b505050506040513d60208110156111bf57600080fd5b50516001600160a01b03161480159061126e57507f00000000000000000000000042000000000000000000000000000000000000066001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561123657600080fd5b505afa15801561124a573d6000803e3d6000fd5b505050506040513d602081101561126057600080fd5b50516001600160a01b031614155b156112845761127d81336117f8565b5050610c7b565b61128e81306117f8565b604080516002808252606082018352600092602083019080368337019050509050816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e857600080fd5b505afa1580156112fc573d6000803e3d6000fd5b505050506040513d602081101561131257600080fd5b50518151829060009061132157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561137a57600080fd5b505afa15801561138e573d6000803e3d6000fd5b505050506040513d60208110156113a457600080fd5b50518151829060019081106113b557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506113de81611a27565b5050505050565b7f000000000000000000000000420000000000000000000000000000000000000681565b6103e881565b6103e88110156114505760405162461bcd60e51b8152600401808060200182810382526021815260200180612b8d6021913960400191505060405180910390fd5b60408051636eb1769f60e11b8152336004820152306024820152905182916001600160a01b0385169163dd62ed3e91604480820192602092909190829003018186803b15801561149f57600080fd5b505afa1580156114b3573d6000803e3d6000fd5b505050506040513d60208110156114c957600080fd5b505110156115085760405162461bcd60e51b8152600401808060200182810382526022815260200180612c206022913960400191505060405180910390fd5b61151d6001600160a01b03831633308461179e565b611528848484611cd5565b50505050565b7f000000000000000000000000a132dab612db5cb9fc9ac426a0cc215a3423f9c981565b600080829150816001600160a01b0316631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b15801561159157600080fd5b505afa1580156115a5573d6000803e3d6000fd5b505050506040513d60208110156115bb57600080fd5b5051919391925050565b600080866001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561160157600080fd5b505afa158015611615573d6000803e3d6000fd5b505050506040513d602081101561162b57600080fd5b505161163a5760028604611658565b670de0b6b3a764000061164d8885610d76565b87028161165657fe5b045b90506000876001600160a01b031663f140a35a83866040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156116b157600080fd5b505afa1580156116c5573d6000803e3d6000fd5b505050506040513d60208110156116db57600080fd5b5051905060006116eb87846125c2565b6116f587846125d2565b8402816116fe57fe5b049050886001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561173a57600080fd5b505afa15801561174e573d6000803e3d6000fd5b505050506040513d602081101561176457600080fd5b505161178f5761178a6117838284868702028161177d57fe5b046125e2565b89906125d2565b611791565b825b9998505050505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261152890859061272a565b61188682836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561184957600080fd5b505afa15801561185d573d6000803e3d6000fd5b505050506040513d602081101561187357600080fd5b50516001600160a01b03851691906127db565b600080836001600160a01b03166389afcb44846040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506040805180830381600087803b1580156118d757600080fd5b505af11580156118eb573d6000803e3d6000fd5b505050506040513d604081101561190157600080fd5b50805160209091015190925090506103e88210156119505760405162461bcd60e51b8152600401808060200182810382526026815260200180612ca26026913960400191505060405180910390fd5b6103e88110156115285760405162461bcd60e51b8152600401808060200182810382526026815260200180612bd46026913960400191505060405180910390fd5b60408051636eb1769f60e11b81523060048201526001600160a01b03838116602483015291519184169163dd62ed3e91604480820192602092909190829003018186803b1580156119e157600080fd5b505afa1580156119f5573d6000803e3d6000fd5b505050506040513d6020811015611a0b57600080fd5b5051610c7b57610c7b6001600160a01b0383168260001961282d565b6000805b8251811015611cd057828181518110611a4057fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a9457600080fd5b505afa158015611aa8573d6000803e3d6000fd5b505050506040513d6020811015611abe57600080fd5b505191508115611cc8577f00000000000000000000000042000000000000000000000000000000000000066001600160a01b0316838281518110611afe57fe5b60200260200101516001600160a01b03161415611c97577f00000000000000000000000042000000000000000000000000000000000000066001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b7b57600080fd5b505af1158015611b8f573d6000803e3d6000fd5b505060408051600080825260208201928390528151909450339350869290819081908082805b60208310611bd45780518252601f199092019160209182019101611bb5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611c36576040519150601f19603f3d011682016040523d82523d6000602084013e611c3b565b606091505b5050905080611c91576040805162461bcd60e51b815260206004820152601a60248201527f42656566793a20455448207472616e73666572206661696c6564000000000000604482015290519081900360640190fd5b50611cc8565b611cc83383858481518110611ca857fe5b60200260200101516001600160a01b03166127db9092919063ffffffff16565b600101611a2b565b505050565b600080611ce185611552565b91509150600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611d2157600080fd5b505afa158015611d35573d6000803e3d6000fd5b505050506040513d6060811015611d4b57600080fd5b5080516020909101516001600160701b0391821693501690506103e882118015611d7657506103e881115b611db15760405162461bcd60e51b8152600401808060200182810382526026815260200180612bae6026913960400191505060405180910390fd5b6000856001600160a01b0316846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611df657600080fd5b505afa158015611e0a573d6000803e3d6000fd5b505050506040513d6020811015611e2057600080fd5b50516001600160a01b03161490508080611eaf5750856001600160a01b0316846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7857600080fd5b505afa158015611e8c573d6000803e3d6000fd5b505050506040513d6020811015611ea257600080fd5b50516001600160a01b0316145b611eea5760405162461bcd60e51b815260040180806020018281038252602f815260200180612c42602f913960400191505060405180910390fd5b6040805160028082526060820183526000926020830190803683370190505090508681600081518110611f1957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081611fa857846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7757600080fd5b505afa158015611f8b573d6000803e3d6000fd5b505050506040513d6020811015611fa157600080fd5b505161200e565b846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611fe157600080fd5b505afa158015611ff5573d6000803e3d6000fd5b505050506040513d602081101561200b57600080fd5b50515b8160018151811061201b57fe5b6001600160a01b03928316602091820292909201810191909152604080516370a0823160e01b815230600482015290516000938b16926370a082319260248082019391829003018186803b15801561207257600080fd5b505afa158015612086573d6000803e3d6000fd5b505050506040513d602081101561209c57600080fd5b50519050600083156120d0576120c987838888876000815181106120bc57fe5b60200260200101516115c5565b90506120e7565b6120e487838789876000815181106120bc57fe5b90505b6120f7836000815181106108e557fe5b60007f000000000000000000000000a132dab612db5cb9fc9ac426a0cc215a3423f9c96001600160a01b03166313dcfc59838d8760008151811061213757fe5b60200260200101518860018151811061214c57fe5b60200260200101518d6001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561218d57600080fd5b505afa1580156121a1573d6000803e3d6000fd5b505050506040513d60208110156121b757600080fd5b5051604080516001600160e01b031960e089901b168152600481019690965260248601949094526001600160a01b03928316604486015291166064840152151560848301523060a48301524260c48301525160e480830192600092919082900301818387803b15801561222957600080fd5b505af115801561223d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561226657600080fd5b810190808051604051939291908464010000000082111561228657600080fd5b90830190602082018581111561229b57600080fd5b82518660208202830111640100000000821117156122b857600080fd5b82525081516020918201928201910280838360005b838110156122e55781810151838201526020016122cd565b505050509050016040525050509050612304846001815181106108e557fe5b60007f000000000000000000000000a132dab612db5cb9fc9ac426a0cc215a3423f9c96001600160a01b0316635a47ddc38660008151811061234257fe5b60200260200101518760018151811061235757fe5b60200260200101518c6001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561239857600080fd5b505afa1580156123ac573d6000803e3d6000fd5b505050506040513d60208110156123c257600080fd5b505186516123ec9088906000906123d557fe5b60200260200101518a6125d290919063ffffffff16565b876001815181106123f957fe5b6020908102919091010151604080516001600160e01b031960e089901b1681526001600160a01b039687166004820152949095166024850152911515604484015260648301526084820152600160a4820181905260c48201523060e48201524261010482015290516101248083019260609291908290030181600087803b15801561248357600080fd5b505af1158015612497573d6000803e3d6000fd5b505050506040513d60608110156124ad57600080fd5b506040015190506124be898b611991565b896001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561250457600080fd5b505af1158015612518573d6000803e3d6000fd5b505050506125aa338b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561256d57600080fd5b505afa158015612581573d6000803e3d6000fd5b505050506040513d602081101561259757600080fd5b50516001600160a01b038d1691906127db565b6125b385611a27565b50505050505050505050505050565b808201828110156110a857600080fd5b808203828111156110a857600080fd5b6000816125f157506000612725565b816001600160801b821061260a5760809190911c9060401b5b6801000000000000000082106126255760409190911c9060201b5b640100000000821061263c5760209190911c9060101b5b6201000082106126515760109190911c9060081b5b61010082106126655760089190911c9060041b5b601082106126785760049190911c9060021b5b600882106126845760011b5b600181858161268f57fe5b048201901c905060018185816126a157fe5b048201901c905060018185816126b357fe5b048201901c905060018185816126c557fe5b048201901c905060018185816126d757fe5b048201901c905060018185816126e957fe5b048201901c905060018185816126fb57fe5b048201901c9050600081858161270d57fe5b04905080821061271d578061271f565b815b93505050505b919050565b600061277f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129409092919063ffffffff16565b805190915015611cd05780806020019051602081101561279e57600080fd5b5051611cd05760405162461bcd60e51b815260040180806020018281038252602a815260200180612cc8602a913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611cd090849061272a565b8015806128b3575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561288557600080fd5b505afa158015612899573d6000803e3d6000fd5b505050506040513d60208110156128af57600080fd5b5051155b6128ee5760405162461bcd60e51b8152600401808060200182810382526036815260200180612cf26036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611cd090849061272a565b606061294f8484600085612959565b90505b9392505050565b60608247101561299a5760405162461bcd60e51b8152600401808060200182810382526026815260200180612bfa6026913960400191505060405180910390fd5b6129a385612ab4565b6129f4576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310612a325780518252601f199092019160209182019101612a13565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612a94576040519150601f19603f3d011682016040523d82523d6000602084013e612a99565b606091505b5091509150612aa9828286612aba565b979650505050505050565b3b151590565b60608315612ac9575081612952565b825115612ad95782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612b23578181015183820152602001612b0b565b50505050905090810190601f168015612b505780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe42656566793a20574554482061646472657373206e6f74206d61746368696e6720526f757465722e77657468282942656566793a20496e7369676e69666963616e7420696e70757420616d6f756e7442656566793a204c6971756964697479207061697220726573657276657320746f6f206c6f77556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c42656566793a20496e70757420746f6b656e206973206e6f7420617070726f76656442656566793a20496e70757420746f6b656e206e6f742070726573656e7420696e206c69717564697479207061697242656566793a206465736972656420746f6b656e206e6f742070726573656e7420696e206c697175646974792070616972556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220e7f0cfa4e340100bdb80d7ad4cd5646897878ed3a21a65083f9463509cf24c6564736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a132dab612db5cb9fc9ac426a0cc215a3423f9c90000000000000000000000004200000000000000000000000000000000000006
-----Decoded View---------------
Arg [0] : _router (address): 0xa132DAB612dB5cB9fC9Ac426A0Cc215A3423F9c9
Arg [1] : _WETH (address): 0x4200000000000000000000000000000000000006
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a132dab612db5cb9fc9ac426a0cc215a3423f9c9
Arg [1] : 0000000000000000000000004200000000000000000000000000000000000006
Deployed Bytecode Sourcemap
28338:8464:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28818:10;-1:-1:-1;;;;;28832:4:0;28818:18;;28811:26;;;;28338:8464;;;;;35565:812;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35565:812:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;35565:812:0;;;;;;;;;;;;;;30308:1051;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30308:1051:0;;;;;;;;;;;;;;;;;;;;:::i;28853:290::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28853:290:0;;;;;;;;:::i;36385:183::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;35004:553;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35004:553:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29647:653;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29647:653:0;;;;;;;;:::i;28547:29::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;28547:29:0;;;;;;;;;;;;;;28583:44;;;;;;;;;;;;;:::i;29151:488::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29151:488:0;;;;;;;;;;;;;;;;;;;;:::i;28495:45::-;;;;;;;;;;;;;:::i;35565:812::-;35670:20;35692:21;35715:20;35748:11;:9;:11::i;:::-;;35773:19;35796:25;35810:10;35796:13;:25::i;:::-;35770:51;;;35834:13;35867:7;-1:-1:-1;;;;;35850:24:0;:4;-1:-1:-1;;;;;35850:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35850:13:0;-1:-1:-1;;;;;35850:24:0;;;-1:-1:-1;35850:24:0;;35893:36;;;35922:7;-1:-1:-1;;;;;35905:24:0;:4;-1:-1:-1;;;;;35905:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35905:13:0;-1:-1:-1;;;;;35905:24:0;;35893:36;35885:96;;;;-1:-1:-1;;;35885:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35995:16;36013;36034:4;-1:-1:-1;;;;;36034:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36034:18:0;;;;;;;-1:-1:-1;;;;;35994:58:0;;;;-1:-1:-1;35994:58:0;;-1:-1:-1;36086:8:0;:54;;36121:8;36131;36086:54;;;36098:8;36108;36086:54;36063:77;;-1:-1:-1;36063:77:0;-1:-1:-1;36168:8:0;:40;;36195:4;-1:-1:-1;;;;;36195:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36195:13:0;36168:40;;;36179:4;-1:-1:-1;;;;;36179:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36179:13:0;36168:40;36153:55;;36234:67;36249:4;36255:16;36273:8;36283;36293:7;36234:14;:67::i;:::-;36219:82;;36328:4;-1:-1:-1;;;;;36328:17:0;;36346:12;36360:7;36328:40;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36328:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36328:40:0;35565:812;;36328:40;;-1:-1:-1;35565:812:0;;-1:-1:-1;35565:812:0;;-1:-1:-1;;;;;;35565:812:0:o;30308:1051::-;30447:19;30468;30491:25;30505:10;30491:13;:25::i;:::-;30446:70;;;;30527:14;30544:4;-1:-1:-1;;;;;30544:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30544:13:0;30585;;;-1:-1:-1;;;30585:13:0;;;;30544;;-1:-1:-1;30568:14:0;;-1:-1:-1;;;;;30585:11:0;;;;;:13;;;;;30544;;30585;;;;;;;:11;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30585:13:0;;-1:-1:-1;;;;;;30617:22:0;;;;;;;;:48;;;30653:12;-1:-1:-1;;;;;30643:22:0;:6;-1:-1:-1;;;;;30643:22:0;;30617:48;30609:110;;;;-1:-1:-1;;;30609:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30732:65;-1:-1:-1;;;;;30732:22:0;;30755:10;30775:4;30782:14;30732:22;:65::i;:::-;30808:5;-1:-1:-1;;;;;30808:14:0;;30823;30808:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30849:46;30874:4;30889;30849:16;:46::i;:::-;30908:17;30938:12;-1:-1:-1;;;;;30928:22:0;:6;-1:-1:-1;;;;;30928:22:0;;:40;;30962:6;30928:40;;;30953:6;30928:40;31003:16;;;31017:1;31003:16;;;;;;;;30908:60;;-1:-1:-1;30979:21:0;;31003:16;;;;;;;;;;;;-1:-1:-1;31003:16:0;30979:40;;31040:9;31030:4;31035:1;31030:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;31030:19:0;;;-1:-1:-1;;;;;31030:19:0;;;;;31070:12;31060:4;31065:1;31060:7;;;;;;;;;;;;;:22;-1:-1:-1;;;;;31060:22:0;;;-1:-1:-1;;;;;31060:22:0;;;;;31095:47;31117:4;31122:1;31117:7;;;;;;;;;;;;;;31134:6;31095:21;:47::i;:::-;31153:6;-1:-1:-1;;;;;31153:37:0;;31198:9;-1:-1:-1;;;;;31191:27:0;;31227:4;31191:42;;;;;;;;;;;;;-1:-1:-1;;;;;31191:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31191:42:0;31255:7;;31235:18;;31255:4;;31260:1;;31255:7;;;;;;;;;;31264:4;31269:1;31264:7;;;;;;;;;;;;;;31273:4;-1:-1:-1;;;;;31273:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31273:13:0;31153:166;;;-1:-1:-1;;;;;;31153:166:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31153:166:0;;;;;;;;;;;;;;;;;;;31296:4;31153:166;;;;31303:15;31153:166;;;;;;;;;;-1:-1:-1;;31153:166:0;;;;;;;-1:-1:-1;31153:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31153:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31153:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31332:19;31346:4;31332:13;:19::i;:::-;30308:1051;;;;;;;;;;:::o;28853:290::-;28623:4;28956:9;:26;;28948:72;;;;-1:-1:-1;;;28948:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29039:4;-1:-1:-1;;;;;29033:19:0;;29060:9;29033:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29085:50;29099:10;29111:17;29130:4;29085:13;:50::i;:::-;28853:290;;:::o;36385:183::-;36427:12;36470:6;-1:-1:-1;;;;;36470:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36470:13:0;36462:4;-1:-1:-1;;;;;36462:21:0;;;;;;;-1:-1:-1;36462:21:0;36494:66;;;;-1:-1:-1;;;36494:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36385:183;:::o;35004:553::-;35080:7;35101:13;35116;35135:4;-1:-1:-1;;;;;35135:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35135:18:0;;;;;;;;35217:13;;-1:-1:-1;;;35217:13:0;;;;-1:-1:-1;;;;;35100:53:0;;;;-1:-1:-1;35100:53:0;;;;;-1:-1:-1;35164:14:0;;-1:-1:-1;;;;;35217:11:0;;;;;:13;;;;;35135:18;35217:13;;;;;;:11;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35217:13:0;35202:40;;;-1:-1:-1;;;35202:40:0;;;;-1:-1:-1;;;;;35202:38:0;;;;;;:40;;;;;35217:13;;35202:40;;;;;;;;:38;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35202:40:0;35198:2;:44;35189:6;35181:14;;35198:44;35181:61;;;;;35164:78;;35253:14;35306:4;-1:-1:-1;;;;;35306:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35306:13:0;35291:40;;;-1:-1:-1;;;35291:40:0;;;;-1:-1:-1;;;;;35291:38:0;;;;;;:40;;;;;35306:13;;35291:40;;;;;;;;:38;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35291:40:0;35287:2;:44;35278:6;35270:14;;35287:44;35270:61;;;;;;-1:-1:-1;35345:19:0;35367:18;:6;35270:61;35367:10;:18::i;:::-;35345:40;;35396:14;35423:4;-1:-1:-1;;;;;35423:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35423:13:0;-1:-1:-1;;;;;35413:23:0;;;;;;:38;;35446:5;35413:38;;;35439:4;35413:38;35396:55;;35475:9;:73;;35537:11;35519:6;35528;35519:15;:29;;;;;;35475:73;;;35505:11;35487:6;35496;35487:15;:29;;;;;;35475:73;35468:80;;;;;;;;35004:553;;;;;:::o;29647:653::-;29730:19;29751;29774:25;29788:10;29774:13;:25::i;:::-;29729:70;;-1:-1:-1;29729:70:0;-1:-1:-1;29812:78:0;-1:-1:-1;;;;;29812:35:0;;29848:10;29868:4;29875:14;29812:35;:78::i;:::-;29901:5;-1:-1:-1;;;;;29901:14:0;;29916;29901:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29965:4;-1:-1:-1;;;;;29948:21:0;:4;-1:-1:-1;;;;;29948:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29948:13:0;-1:-1:-1;;;;;29948:21:0;;;;;:46;;;29990:4;-1:-1:-1;;;;;29973:21:0;:4;-1:-1:-1;;;;;29973:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29973:13:0;-1:-1:-1;;;;;29973:21:0;;;29948:46;29944:129;;;30018:43;30043:4;30050:10;30018:16;:43::i;:::-;30011:50;;;;29944:129;30085:46;30110:4;30125;30085:16;:46::i;:::-;30170:16;;;30184:1;30170:16;;;;;;;;30144:23;;30170:16;;;;;;;;;;-1:-1:-1;30170:16:0;30144:42;;30209:4;-1:-1:-1;;;;;30209:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30209:13:0;30197:9;;:6;;30204:1;;30197:9;;;;;;;;;:25;-1:-1:-1;;;;;30197:25:0;;;-1:-1:-1;;;;;30197:25:0;;;;;30245:4;-1:-1:-1;;;;;30245:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30245:13:0;30233:9;;:6;;30240:1;;30233:9;;;;;;;;;;;:25;-1:-1:-1;;;;;30233:25:0;;;-1:-1:-1;;;;;30233:25:0;;;;;30271:21;30285:6;30271:13;:21::i;:::-;29647:653;;;;;:::o;28547:29::-;;;:::o;28583:44::-;28623:4;28583:44;:::o;29151:488::-;28623:4;29283:13;:30;;29275:76;;;;-1:-1:-1;;;29275:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29370:52;;;-1:-1:-1;;;29370:52:0;;29396:10;29370:52;;;;29416:4;29370:52;;;;;;29426:13;;-1:-1:-1;;;;;29370:25:0;;;;;:52;;;;;;;;;;;;;;;:25;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29370:52:0;:69;;29362:116;;;;-1:-1:-1;;;29362:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29491:74;-1:-1:-1;;;;;29491:32:0;;29524:10;29544:4;29551:13;29491:32;:74::i;:::-;29578:53;29592:10;29604:17;29623:7;29578:13;:53::i;:::-;29151:488;;;;:::o;28495:45::-;;;:::o;31775:206::-;31841:19;31862;31916:10;31894:33;;31960:5;-1:-1:-1;;;;;31960:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31960:12:0;31775:206;;31960:12;;-1:-1:-1;;31775:206:0:o;34389:607::-;34529:18;34560:22;34585:4;-1:-1:-1;;;;;34585:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34585:13:0;:79;;34663:1;34649:11;:15;34585:79;;;34640:6;34615:22;34624:4;34630:6;34615:8;:22::i;:::-;34601:11;:36;:45;;;;;;34585:79;34560:104;;34675:17;34695:4;-1:-1:-1;;;;;34695:17:0;;34713:14;34729:6;34695:41;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34695:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34695:41:0;;-1:-1:-1;34747:19:0;34812:28;:8;34825:14;34812:12;:28::i;:::-;34786:23;:8;34799:9;34786:12;:23::i;:::-;34769:14;:40;:71;;;;;;34747:93;;34864:4;-1:-1:-1;;;;;34864:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34864:13:0;:124;;34897:91;34913:74;34975:11;34963:9;34946:14;34929;:31;:43;:57;;;;;;34913:15;:74::i;:::-;34897:11;;:15;:91::i;:::-;34864:124;;;34880:14;34864:124;34851:137;34389:607;-1:-1:-1;;;;;;;;;34389:607:0:o;20367:205::-;20495:68;;;-1:-1:-1;;;;;20495:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20495:68:0;-1:-1:-1;;;20495:68:0;;;20468:96;;20488:5;;20468:19;:96::i;31367:400::-;31438:70;31464:4;31477;-1:-1:-1;;;;;31470:22:0;;31501:4;31470:37;;;;;;;;;;;;;-1:-1:-1;;;;;31470:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31470:37:0;-1:-1:-1;;;;;31438:25:0;;;:70;:25;:70::i;:::-;31520:15;31537;31571:4;-1:-1:-1;;;;;31556:25:0;;31582:2;31556:29;;;;;;;;;;;;;-1:-1:-1;;;;;31556:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31556:29:0;;;;;;;;;-1:-1:-1;31556:29:0;-1:-1:-1;28623:4:0;31606:24;;;31598:75;;;;-1:-1:-1;;;31598:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28623:4;31692:7;:24;;31684:75;;;;-1:-1:-1;;;31684:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36576:221;36662:47;;;-1:-1:-1;;;36662:47:0;;36694:4;36662:47;;;;-1:-1:-1;;;;;36662:47:0;;;;;;;;;:23;;;;;;:47;;;;;;;;;;;;;;;:23;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36662:47:0;36658:132;;36731:47;-1:-1:-1;;;;;36731:25:0;;36757:7;-1:-1:-1;;36731:25:0;:47::i;33747:634::-;33814:15;33845:9;33840:534;33860:6;:13;33856:1;:17;33840:534;;;33912:6;33919:1;33912:9;;;;;;;;;;;;;;-1:-1:-1;;;;;33905:27:0;;33941:4;33905:42;;;;;;;;;;;;;-1:-1:-1;;;;;33905:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33905:42:0;;-1:-1:-1;33966:11:0;;33962:401;;34015:4;-1:-1:-1;;;;;34002:17:0;:6;34009:1;34002:9;;;;;;;;;;;;;;-1:-1:-1;;;;;34002:17:0;;33998:350;;;34050:4;-1:-1:-1;;;;;34044:20:0;;34065:7;34044:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34146:12:0;;;34097;34146;;;;;;;;;;34114:45;;34097:12;;-1:-1:-1;34114:10:0;;-1:-1:-1;34137:7:0;;34146:12;;;;;34114:45;34146:12;;34114:45;;;;;;;;;;-1:-1:-1;;34114:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34096:63;;;34190:7;34182:46;;;;;-1:-1:-1;;;34182:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33998:350;;;;34277:51;34308:10;34320:7;34284:6;34291:1;34284:9;;;;;;;;;;;;;;-1:-1:-1;;;;;34277:30:0;;;:51;;;;;:::i;:::-;33875:3;;33840:534;;;;33747:634;;:::o;31989:1750::-;32096:19;32117;32140:25;32154:10;32140:13;:25::i;:::-;32095:70;;;;32179:16;32197;32218:4;-1:-1:-1;;;;;32218:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32218:18:0;;;;;;;-1:-1:-1;;;;;32178:58:0;;;;-1:-1:-1;32178:58:0;;-1:-1:-1;28623:4:0;32255:24;;:52;;;;;28623:4;32283:8;:24;32255:52;32247:103;;;;-1:-1:-1;;;32247:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32363:13;32396:7;-1:-1:-1;;;;;32379:24:0;:4;-1:-1:-1;;;;;32379:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32379:13:0;-1:-1:-1;;;;;32379:24:0;;;-1:-1:-1;32379:24:0;;32422:36;;;32451:7;-1:-1:-1;;;;;32434:24:0;:4;-1:-1:-1;;;;;32434:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32434:13:0;-1:-1:-1;;;;;32434:24:0;;32422:36;32414:96;;;;-1:-1:-1;;;32414:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32547:16;;;32561:1;32547:16;;;;;;;;32523:21;;32547:16;;;;;;;;;;-1:-1:-1;32547:16:0;32523:40;;32584:7;32574:4;32579:1;32574:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;32574:17:0;;;-1:-1:-1;;;;;32574:17:0;;;;;32612:8;:40;;32639:4;-1:-1:-1;;;;;32639:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32639:13:0;32612:40;;;32623:4;-1:-1:-1;;;;;32623:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32623:13:0;32612:40;32602:4;32607:1;32602:7;;;;;;;;-1:-1:-1;;;;;32602:50:0;;;:7;;;;;;;;;;:50;;;;32690:40;;;-1:-1:-1;;;32690:40:0;;32724:4;32690:40;;;;;;32665:22;;32690:25;;;;;:40;;;;;;;;;;;:25;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32690:40:0;;-1:-1:-1;32741:20:0;32772:234;;;;32816:65;32831:4;32837:14;32853:8;32863;32873:4;32878:1;32873:7;;;;;;;;;;;;;;32816:14;:65::i;:::-;32801:80;;32772:234;;;32929:65;32944:4;32950:14;32966:8;32976;32986:4;32991:1;32986:7;;;;;;;32929:65;32914:80;;32772:234;33018:47;33040:4;33045:1;33040:7;;;;;;;33018:47;33076:30;33109:6;-1:-1:-1;;;;;33109:51:0;;33161:12;33175:17;33194:4;33199:1;33194:7;;;;;;;;;;;;;;33203:4;33208:1;33203:7;;;;;;;;;;;;;;33212:4;-1:-1:-1;;;;;33212:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33212:13:0;33109:149;;;-1:-1:-1;;;;;;33109:149:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33109:149:0;;;;;;;;;;;;;;;;;;;33235:4;33109:149;;;;33242:15;33109:149;;;;;;;;;;-1:-1:-1;;33109:149:0;;;;;;;-1:-1:-1;33109:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33109:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33109:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33076:182;;33271:47;33293:4;33298:1;33293:7;;;;;;;33271:47;33333:23;33360:6;-1:-1:-1;;;;;33360:33:0;;33394:4;33399:1;33394:7;;;;;;;;;;;;;;33403:4;33408:1;33403:7;;;;;;;;;;;;;;33412:4;-1:-1:-1;;;;;33412:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33412:13:0;33446:16;;33427:36;;33446:13;;33460:1;;33446:16;;;;;;;;;;33427:14;:18;;:36;;;;:::i;:::-;33465:13;33479:1;33465:16;;;;;;;;;;;;;;;;;;33360:160;;;-1:-1:-1;;;;;;33360:160:0;;;;;;;-1:-1:-1;;;;;33360:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33483:1;33360:160;;;;;;;;;;33497:4;33360:160;;;;33504:15;33360:160;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33360:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33360:160:0;;;;-1:-1:-1;33533:52:0;33563:4;33578:5;33533:21;:52::i;:::-;33596:5;-1:-1:-1;;;;;33596:13:0;;33610:15;33596:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33639:62;33658:10;33670:5;-1:-1:-1;;;;;33670:15:0;;33694:4;33670:30;;;;;;;;;;;;;-1:-1:-1;;;;;33670:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33670:30:0;-1:-1:-1;;;;;33639:18:0;;;:62;:18;:62::i;:::-;33712:19;33726:4;33712:13;:19::i;:::-;31989:1750;;;;;;;;;;;;;:::o;23704:113::-;23797:5;;;23792:16;;;;23784:25;;;;;23987:113;24080:5;;;24075:16;;;;24067:25;;;;;3100:1239;3148:7;3172:6;3168:20;;-1:-1:-1;3187:1:0;3180:8;;3168:20;3366:1;3390;-1:-1:-1;;;3406:41:0;;3402:107;;3471:3;3464:10;;;;;3495:2;3489:8;3402:107;3529:19;3523:2;:25;3519:90;;3572:2;3565:9;;;;;3595:2;3589:8;3519:90;3629:11;3623:2;:17;3619:82;;3664:2;3657:9;;;;;3687:2;3681:8;3619:82;3721:7;3715:2;:13;3711:77;;3752:2;3745:9;;;;;3775:1;3769:7;3711:77;3808:5;3802:2;:11;3798:74;;3837:1;3830:8;;;;;3859:1;3853:7;3798:74;3892:4;3886:2;:10;3882:73;;3920:1;3913:8;;;;;3942:1;3936:7;3882:73;3975:3;3969:2;:9;3965:49;;4001:1;3995:7;3965:49;4043:1;4037;4033;:5;;;;;;4029:1;:9;4028:16;;4024:20;;4074:1;4068;4064;:5;;;;;;4060:1;:9;4059:16;;4055:20;;4105:1;4099;4095;:5;;;;;;4091:1;:9;4090:16;;4086:20;;4136:1;4130;4126;:5;;;;;;4122:1;:9;4121:16;;4117:20;;4167:1;4161;4157;:5;;;;;;4153:1;:9;4152:16;;4148:20;;4198:1;4192;4188;:5;;;;;;4184:1;:9;4183:16;;4179:20;;4229:1;4223;4219;:5;;;;;;4215:1;:9;4214:16;;4210:20;;4278:10;4295:1;4291;:5;;;;;;4278:18;;4319:2;4315:1;:6;:15;;4328:2;4315:15;;;4324:1;4315:15;4307:24;;;;;3100:1239;;;;:::o;22487:761::-;22911:23;22937:69;22965:4;22937:69;;;;;;;;;;;;;;;;;22945:5;-1:-1:-1;;;;;22937:27:0;;;:69;;;;;:::i;:::-;23021:17;;22911:95;;-1:-1:-1;23021:21:0;23017:224;;23163:10;23152:30;;;;;;;;;;;;;;;-1:-1:-1;23152:30:0;23144:85;;;;-1:-1:-1;;;23144:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20182:177;20292:58;;;-1:-1:-1;;;;;20292:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20292:58:0;-1:-1:-1;;;20292:58:0;;;20265:86;;20285:5;;20265:19;:86::i;20841:622::-;21211:10;;;21210:62;;-1:-1:-1;21227:39:0;;;-1:-1:-1;;;21227:39:0;;21251:4;21227:39;;;;-1:-1:-1;;;;;21227:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21227:39:0;:44;21210:62;21202:152;;;;-1:-1:-1;;;21202:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21392:62;;;-1:-1:-1;;;;;21392:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21392:62:0;-1:-1:-1;;;21392:62:0;;;21365:90;;21385:5;;21365:19;:90::i;16198:195::-;16301:12;16333:52;16355:6;16363:4;16369:1;16372:12;16333:21;:52::i;:::-;16326:59;;16198:195;;;;;;:::o;17250:530::-;17377:12;17435:5;17410:21;:30;;17402:81;;;;-1:-1:-1;;;17402:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17502:18;17513:6;17502:10;:18::i;:::-;17494:60;;;;;-1:-1:-1;;;17494:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17628:12;17642:23;17669:6;-1:-1:-1;;;;;17669:11:0;17689:5;17697:4;17669:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17669:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17627:75;;;;17720:52;17738:7;17747:10;17759:12;17720:17;:52::i;:::-;17713:59;17250:530;-1:-1:-1;;;;;;;17250:530:0:o;13280:422::-;13647:20;13686:8;;;13280:422::o;18786:742::-;18901:12;18930:7;18926:595;;;-1:-1:-1;18961:10:0;18954:17;;18926:595;19075:17;;:21;19071:439;;19338:10;19332:17;19399:15;19386:10;19382:2;19378:19;19371:44;19286:148;19481:12;19474:20;;-1:-1:-1;;;19474:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://e7f0cfa4e340100bdb80d7ad4cd5646897878ed3a21a65083f9463509cf24c65
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.