Source Code
Overview
MOVR Balance
MOVR Value
$0.00Latest 25 from a total of 3,775 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 11663340 | 248 days ago | OUT | 0 MOVR | 0 | ||||
| Beef Out And Swa... | 5627298 | 788 days ago | IN | 0 MOVR | 0.00265706 | ||||
| Beef In ETH | 5581600 | 795 days ago | IN | 3.1 MOVR | 0.00505499 | ||||
| Beef In | 5577460 | 795 days ago | IN | 0 MOVR | 0.00240036 | ||||
| Beef Out | 5577371 | 795 days ago | IN | 0 MOVR | 0.00295322 | ||||
| Beef Out And Swa... | 5543351 | 800 days ago | IN | 0 MOVR | 0.00242707 | ||||
| Beef Out And Swa... | 5528186 | 803 days ago | IN | 0 MOVR | 0.00264621 | ||||
| Beef Out And Swa... | 5517766 | 804 days ago | IN | 0 MOVR | 0.00253058 | ||||
| Beef In | 5508089 | 806 days ago | IN | 0 MOVR | 0.00352975 | ||||
| Beef In ETH | 5505306 | 806 days ago | IN | 1 MOVR | 0.00320215 | ||||
| Beef Out And Swa... | 5504508 | 806 days ago | IN | 0 MOVR | 0.00122553 | ||||
| Beef In ETH | 5503502 | 806 days ago | IN | 7.62029167 MOVR | 0.0036381 | ||||
| Beef Out And Swa... | 5503496 | 806 days ago | IN | 0 MOVR | 0.00325725 | ||||
| Beef In | 5501411 | 807 days ago | IN | 0 MOVR | 0.00265161 | ||||
| Beef In ETH | 5499641 | 807 days ago | IN | 9.01671245 MOVR | 0.00182839 | ||||
| Beef In ETH | 5499420 | 807 days ago | IN | 7.6073195 MOVR | 0.00258018 | ||||
| Beef Out And Swa... | 5492967 | 808 days ago | IN | 0 MOVR | 0.00245431 | ||||
| Beef Out | 5490745 | 808 days ago | IN | 0 MOVR | 0.00236582 | ||||
| Beef In ETH | 5487136 | 809 days ago | IN | 2.4420525 MOVR | 0.00373485 | ||||
| Beef Out And Swa... | 5486441 | 809 days ago | IN | 0 MOVR | 0.00258309 | ||||
| Beef Out And Swa... | 5486103 | 809 days ago | IN | 0 MOVR | 0.00108375 | ||||
| Beef Out And Swa... | 5486066 | 809 days ago | IN | 0 MOVR | 0.00140095 | ||||
| Beef Out | 5485784 | 809 days ago | IN | 0 MOVR | 0.00103851 | ||||
| Beef Out | 5485767 | 809 days ago | IN | 0 MOVR | 0.00140006 | ||||
| Beef Out And Swa... | 5477063 | 810 days ago | IN | 0 MOVR | 0.00331647 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 5627298 | 788 days ago | 0.90552363 MOVR | ||||
| 5627298 | 788 days ago | 0.90552363 MOVR | ||||
| 5581600 | 795 days ago | 0.00000219 MOVR | ||||
| 5581600 | 795 days ago | 0.00000219 MOVR | ||||
| 5581600 | 795 days ago | 3.1 MOVR | ||||
| 5577371 | 795 days ago | 981.56538931 MOVR | ||||
| 5577371 | 795 days ago | 981.56538931 MOVR | ||||
| 5505306 | 806 days ago | 0.00000076 MOVR | ||||
| 5505306 | 806 days ago | 0.00000076 MOVR | ||||
| 5505306 | 806 days ago | 1 MOVR | ||||
| 5504508 | 806 days ago | 19.19557845 MOVR | ||||
| 5504508 | 806 days ago | 19.19557845 MOVR | ||||
| 5503502 | 806 days ago | 0.00000325 MOVR | ||||
| 5503502 | 806 days ago | 0.00000325 MOVR | ||||
| 5503502 | 806 days ago | 7.62029167 MOVR | ||||
| 5503496 | 806 days ago | 7.67510069 MOVR | ||||
| 5503496 | 806 days ago | 7.67510069 MOVR | ||||
| 5499641 | 807 days ago | 0.00000321 MOVR | ||||
| 5499641 | 807 days ago | 0.00000321 MOVR | ||||
| 5499641 | 807 days ago | 9.01671245 MOVR | ||||
| 5499420 | 807 days ago | 0.00000474 MOVR | ||||
| 5499420 | 807 days ago | 0.00000474 MOVR | ||||
| 5499420 | 807 days ago | 7.6073195 MOVR | ||||
| 5492967 | 808 days ago | 0.76951162 MOVR | ||||
| 5492967 | 808 days ago | 0.76951162 MOVR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BeefyUniV3SolarZap
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/**
*Submitted for verification at moonriver.moonscan.io on 2021-11-02
*/
// 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 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.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
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,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut, uint fee) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
// File: contracts/BIFI/zap/IUniswapV2Router02.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
// 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 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 BeefyUniV3SolarZap {
using LowGasSafeMath for uint256;
using SafeERC20 for IERC20;
using SafeERC20 for IBeefyVaultV6;
IUniswapV2Router02 public immutable router;
address public immutable WETH;
uint256 public constant minimumAmount = 1000;
uint256 public constant fee = 25;
constructor(address _router, address _WETH) {
router = IUniswapV2Router02(_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 _removeLiqudity(address(pair), msg.sender);
}
_removeLiqudity(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);
_removeLiqudity(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.swapExactTokensForTokens(IERC20(swapToken).balanceOf(address(this)), desiredTokenOutMin, path, address(this), block.timestamp);
_returnAssets(path);
}
function _removeLiqudity(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 view returns (IBeefyVaultV6 vault, IUniswapV2Pair pair) {
vault = IBeefyVaultV6(beefyVault);
pair = IUniswapV2Pair(vault.want());
require(pair.factory() == router.factory(), 'Beefy: Incompatible liquidity pair factory');
}
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(fullInvestment, reserveA, reserveB);
} else {
swapAmountIn = _getSwapAmount(fullInvestment, reserveB, reserveA);
}
_approveTokenIfNeeded(path[0], address(router));
uint256[] memory swapedAmounts = router
.swapExactTokensForTokens(swapAmountIn, tokenAmountOutMin, path, address(this), block.timestamp);
_approveTokenIfNeeded(path[1], address(router));
(,, uint256 amountLiquidity) = router
.addLiquidity(path[0], path[1], 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(uint256 investmentA, uint256 reserveA, uint256 reserveB) private view returns (uint256 swapAmount) {
uint256 halfInvestment = investmentA / 2;
uint256 nominator = router.getAmountOut(halfInvestment, reserveA, reserveB, fee);
uint256 denominator = router.quote(halfInvestment, reserveA.add(halfInvestment), reserveB.sub(nominator));
swapAmount = investmentA.sub(Babylonian.sqrt(halfInvestment * halfInvestment * nominator / denominator));
}
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);
swapAmountIn = _getSwapAmount(fullInvestmentIn, reserveA, reserveB);
swapAmountOut = router.getAmountOut(swapAmountIn, reserveA, reserveB, fee);
swapTokenOut = isInputA ? pair.token1() : pair.token0();
}
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
Contract ABI
API[{"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":[],"name":"fee","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 IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c060405234801561001057600080fd5b50604051612ad6380380612ad68339818101604052604081101561003357600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c612a046100d26000398060a55280610b785280610bf15280610ca25280610d965280610e375280611049528061182f528061187c5250806104d252806108ec52806109125280610c1d5280611197528061124152806113ae528061142e5280611e415280611feb5250612a046000f3fe6080604052600436106100955760003560e01c8063ad5c464811610059578063ad5c464814610212578063bb0c829814610243578063ddca3f431461026a578063f5d07b601461027f578063f887ea40146102c6576100ce565b80633f2f869a146100d357806351c9cf911461013d57806370fae20d146101845780638437fabe146101b0578063a28c361b146101d9576100ce565b366100ce57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146100cc57fe5b005b600080fd5b3480156100df57600080fd5b50610116600480360360608110156100f657600080fd5b506001600160a01b038135811691602081013590911690604001356102db565b6040805193845260208401929092526001600160a01b031682820152519081900360600190f35b34801561014957600080fd5b506100cc6004803603608081101561016057600080fd5b506001600160a01b038135811691602081013591604082013516906060013561065f565b6100cc6004803603604081101561019a57600080fd5b506001600160a01b038135169060200135610b35565b3480156101bc57600080fd5b506101c5610c19565b604080519115158252519081900360200190f35b3480156101e557600080fd5b506100cc600480360360408110156101fc57600080fd5b506001600160a01b038135169060200135610d10565b34801561021e57600080fd5b50610227611047565b604080516001600160a01b039092168252519081900360200190f35b34801561024f57600080fd5b5061025861106b565b60408051918252519081900360200190f35b34801561027657600080fd5b50610258611071565b34801561028b57600080fd5b506100cc600480360360808110156102a257600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611076565b3480156102d257600080fd5b50610227611195565b60008060006102e8610c19565b5060006102f4876111b9565b9150506000866001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561033c57600080fd5b505afa158015610350573d6000803e3d6000fd5b505050506040513d602081101561036657600080fd5b50516001600160a01b031614905080806103f55750866001600160a01b0316826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156103be57600080fd5b505afa1580156103d2573d6000803e3d6000fd5b505050506040513d60208110156103e857600080fd5b50516001600160a01b0316145b6104305760405162461bcd60e51b815260040180806020018281038252602f8152602001806128bf602f913960400191505060405180910390fd5b600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561046c57600080fd5b505afa158015610480573d6000803e3d6000fd5b505050506040513d606081101561049657600080fd5b5080516020909101516001600160701b039182169350169050826104bb5780826104be565b81815b90925090506104ce88838361136e565b96507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166352707d8c88848460196040518563ffffffff1660e01b81526004018085815260200184815260200183815260200182815260200194505050505060206040518083038186803b15801561054d57600080fd5b505afa158015610561573d6000803e3d6000fd5b505050506040513d602081101561057757600080fd5b50519550826105ea57836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156105b957600080fd5b505afa1580156105cd573d6000803e3d6000fd5b505050506040513d60208110156105e357600080fd5b5051610650565b836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561062357600080fd5b505afa158015610637573d6000803e3d6000fd5b505050506040513d602081101561064d57600080fd5b50515b94505050505093509350939050565b60008061066b866111b9565b915091506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156106aa57600080fd5b505afa1580156106be573d6000803e3d6000fd5b505050506040513d60208110156106d457600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0385169163d21220a7916004808301926020929190829003018186803b15801561071c57600080fd5b505afa158015610730573d6000803e3d6000fd5b505050506040513d602081101561074657600080fd5b505190506001600160a01b0382811690871614806107755750856001600160a01b0316816001600160a01b0316145b6107b05760405162461bcd60e51b81526004018080602001828103825260318152602001806128ee6031913960400191505060405180910390fd5b6107c56001600160a01b03851633308a611503565b836001600160a01b0316632e1a7d4d886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b5050505061082d833061155d565b6000866001600160a01b0316826001600160a01b03161461084e5781610850565b825b6040805160028082526060820183529293506000929091602083019080368337019050509050818160008151811061088457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505087816001815181106108b257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610910816000815181106108e257fe5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006116f6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166338ed1739836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561098c57600080fd5b505afa1580156109a0573d6000803e3d6000fd5b505050506040513d60208110156109b657600080fd5b50516040516001600160e01b031960e084901b16815260048101828152602482018c90523060648301819052426084840181905260a060448501908152885160a486015288518f958a95929160c4909101906020878101910280838360005b83811015610a2d578181015183820152602001610a15565b505050509050019650505050505050600060405180830381600087803b158015610a5657600080fd5b505af1158015610a6a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610a9357600080fd5b8101908080516040519392919084640100000000821115610ab357600080fd5b908301906020820185811115610ac857600080fd5b8251866020820283011164010000000082111715610ae557600080fd5b82525081516020918201928201910280838360005b83811015610b12578181015183820152602001610afa565b5050505090500160405250505050610b298161178c565b50505050505050505050565b6103e8341015610b765760405162461bcd60e51b81526004018080602001828103825260218152602001806127dc6021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610bd157600080fd5b505af1158015610be5573d6000803e3d6000fd5b5050505050610c1582827f0000000000000000000000000000000000000000000000000000000000000000611a3a565b5050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610c7457600080fd5b505afa158015610c88573d6000803e3d6000fd5b505050506040513d6020811015610c9e57600080fd5b50517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116911614905080610d0d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806127fd602e913960400191505060405180910390fd5b90565b600080610d1c846111b9565b9092509050610d366001600160a01b038516333086611503565b816001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d7c57600080fd5b505af1158015610d90573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610df757600080fd5b505afa158015610e0b573d6000803e3d6000fd5b505050506040513d6020811015610e2157600080fd5b50516001600160a01b031614801590610ed057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9857600080fd5b505afa158015610eac573d6000803e3d6000fd5b505050506040513d6020811015610ec257600080fd5b50516001600160a01b031614155b15610ee657610edf813361155d565b5050610c15565b610ef0813061155d565b604080516002808252606082018352600092602083019080368337019050509050816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4a57600080fd5b505afa158015610f5e573d6000803e3d6000fd5b505050506040513d6020811015610f7457600080fd5b505181518290600090610f8357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610fdc57600080fd5b505afa158015610ff0573d6000803e3d6000fd5b505050506040513d602081101561100657600080fd5b505181518290600190811061101757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506110408161178c565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6103e881565b601981565b6103e88110156110b75760405162461bcd60e51b81526004018080602001828103825260218152602001806127dc6021913960400191505060405180910390fd5b60408051636eb1769f60e11b8152336004820152306024820152905182916001600160a01b0385169163dd62ed3e91604480820192602092909190829003018186803b15801561110657600080fd5b505afa15801561111a573d6000803e3d6000fd5b505050506040513d602081101561113057600080fd5b5051101561116f5760405162461bcd60e51b815260040180806020018281038252602281526020018061289d6022913960400191505060405180910390fd5b6111846001600160a01b038316333084611503565b61118f848484611a3a565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080829150816001600160a01b0316631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d602081101561122257600080fd5b50516040805163c45a015560e01b815290519192506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163c45a015591600480820192602092909190829003018186803b15801561128857600080fd5b505afa15801561129c573d6000803e3d6000fd5b505050506040513d60208110156112b257600080fd5b50516040805163c45a015560e01b815290516001600160a01b039283169284169163c45a0155916004808301926020929190829003018186803b1580156112f857600080fd5b505afa15801561130c573d6000803e3d6000fd5b505050506040513d602081101561132257600080fd5b50516001600160a01b0316146113695760405162461bcd60e51b815260040180806020018281038252602a81526020018061291f602a913960400191505060405180910390fd5b915091565b6040805163149c1f6360e21b8152600285046004820181905260248201859052604482018490526019606483015291516000929183916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916352707d8c916084808301926020929190829003018186803b1580156113f457600080fd5b505afa158015611408573d6000803e3d6000fd5b505050506040513d602081101561141e57600080fd5b5051905060006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663ad615dec8461145e8982612244565b611468898761225a565b6040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156114aa57600080fd5b505afa1580156114be573d6000803e3d6000fd5b505050506040513d60208110156114d457600080fd5b505190506114f86114f1828580028502816114eb57fe5b0461226a565b889061225a565b979650505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261118f9085906123b2565b6115eb82836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156115ae57600080fd5b505afa1580156115c2573d6000803e3d6000fd5b505050506040513d60208110156115d857600080fd5b50516001600160a01b0385169190612463565b600080836001600160a01b03166389afcb44846040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506040805180830381600087803b15801561163c57600080fd5b505af1158015611650573d6000803e3d6000fd5b505050506040513d604081101561166657600080fd5b50805160209091015190925090506103e88210156116b55760405162461bcd60e51b81526004018080602001828103825260268152602001806129496026913960400191505060405180910390fd5b6103e881101561118f5760405162461bcd60e51b81526004018080602001828103825260268152602001806128516026913960400191505060405180910390fd5b60408051636eb1769f60e11b81523060048201526001600160a01b03838116602483015291519184169163dd62ed3e91604480820192602092909190829003018186803b15801561174657600080fd5b505afa15801561175a573d6000803e3d6000fd5b505050506040513d602081101561177057600080fd5b5051610c1557610c156001600160a01b038316826000196124b5565b6000805b8251811015611a35578281815181106117a557fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117f957600080fd5b505afa15801561180d573d6000803e3d6000fd5b505050506040513d602081101561182357600080fd5b505191508115611a2d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031683828151811061186357fe5b60200260200101516001600160a01b031614156119fc577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156118e057600080fd5b505af11580156118f4573d6000803e3d6000fd5b505060408051600080825260208201928390528151909450339350869290819081908082805b602083106119395780518252601f19909201916020918201910161191a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461199b576040519150601f19603f3d011682016040523d82523d6000602084013e6119a0565b606091505b50509050806119f6576040805162461bcd60e51b815260206004820152601a60248201527f42656566793a20455448207472616e73666572206661696c6564000000000000604482015290519081900360640190fd5b50611a2d565b611a2d3383858481518110611a0d57fe5b60200260200101516001600160a01b03166124639092919063ffffffff16565b600101611790565b505050565b600080611a46856111b9565b91509150600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611a8657600080fd5b505afa158015611a9a573d6000803e3d6000fd5b505050506040513d6060811015611ab057600080fd5b5080516020909101516001600160701b0391821693501690506103e882118015611adb57506103e881115b611b165760405162461bcd60e51b815260040180806020018281038252602681526020018061282b6026913960400191505060405180910390fd5b6000856001600160a01b0316846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611b5b57600080fd5b505afa158015611b6f573d6000803e3d6000fd5b505050506040513d6020811015611b8557600080fd5b50516001600160a01b03161490508080611c145750856001600160a01b0316846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611bdd57600080fd5b505afa158015611bf1573d6000803e3d6000fd5b505050506040513d6020811015611c0757600080fd5b50516001600160a01b0316145b611c4f5760405162461bcd60e51b815260040180806020018281038252602f8152602001806128bf602f913960400191505060405180910390fd5b6040805160028082526060820183526000926020830190803683370190505090508681600081518110611c7e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081611d0d57846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611cdc57600080fd5b505afa158015611cf0573d6000803e3d6000fd5b505050506040513d6020811015611d0657600080fd5b5051611d73565b846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611d4657600080fd5b505afa158015611d5a573d6000803e3d6000fd5b505050506040513d6020811015611d7057600080fd5b50515b81600181518110611d8057fe5b6001600160a01b03928316602091820292909201810191909152604080516370a0823160e01b815230600482015290516000938b16926370a082319260248082019391829003018186803b158015611dd757600080fd5b505afa158015611deb573d6000803e3d6000fd5b505050506040513d6020811015611e0157600080fd5b5051905060008315611e1f57611e1882878761136e565b9050611e2d565b611e2a82868861136e565b90505b611e3d836000815181106108e257fe5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166338ed1739838d8730426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611ee3578181015183820152602001611ecb565b505050509050019650505050505050600060405180830381600087803b158015611f0c57600080fd5b505af1158015611f20573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f4957600080fd5b8101908080516040519392919084640100000000821115611f6957600080fd5b908301906020820185811115611f7e57600080fd5b8251866020820283011164010000000082111715611f9b57600080fd5b82525081516020918201928201910280838360005b83811015611fc8578181015183820152602001611fb0565b505050509050016040525050509050611fe7846001815181106108e257fe5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e8e337008660008151811061202557fe5b60200260200101518760018151811061203a57fe5b60200260200101516120698660008151811061205257fe5b60200260200101518961225a90919063ffffffff16565b8660018151811061207657fe5b602002602001015160018030426040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001858152602001848152602001836001600160a01b0316815260200182815260200198505050505050505050606060405180830381600087803b15801561210557600080fd5b505af1158015612119573d6000803e3d6000fd5b505050506040513d606081101561212f57600080fd5b50604001519050612140898b6116f6565b896001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561218657600080fd5b505af115801561219a573d6000803e3d6000fd5b5050505061222c338b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156121ef57600080fd5b505afa158015612203573d6000803e3d6000fd5b505050506040513d602081101561221957600080fd5b50516001600160a01b038d169190612463565b6122358561178c565b50505050505050505050505050565b8082018281101561225457600080fd5b92915050565b8082038281111561225457600080fd5b600081612279575060006123ad565b816001600160801b82106122925760809190911c9060401b5b6801000000000000000082106122ad5760409190911c9060201b5b64010000000082106122c45760209190911c9060101b5b6201000082106122d95760109190911c9060081b5b61010082106122ed5760089190911c9060041b5b601082106123005760049190911c9060021b5b6008821061230c5760011b5b600181858161231757fe5b048201901c9050600181858161232957fe5b048201901c9050600181858161233b57fe5b048201901c9050600181858161234d57fe5b048201901c9050600181858161235f57fe5b048201901c9050600181858161237157fe5b048201901c9050600181858161238357fe5b048201901c9050600081858161239557fe5b0490508082106123a557806123a7565b815b93505050505b919050565b6000612407826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125c89092919063ffffffff16565b805190915015611a355780806020019051602081101561242657600080fd5b5051611a355760405162461bcd60e51b815260040180806020018281038252602a81526020018061296f602a913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a359084906123b2565b80158061253b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561250d57600080fd5b505afa158015612521573d6000803e3d6000fd5b505050506040513d602081101561253757600080fd5b5051155b6125765760405162461bcd60e51b81526004018080602001828103825260368152602001806129996036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611a359084906123b2565b60606125d784846000856125e1565b90505b9392505050565b6060824710156126225760405162461bcd60e51b81526004018080602001828103825260268152602001806128776026913960400191505060405180910390fd5b61262b85612731565b61267c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106126ba5780518252601f19909201916020918201910161269b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461271c576040519150601f19603f3d011682016040523d82523d6000602084013e612721565b606091505b50915091506114f8828286612737565b3b151590565b606083156127465750816125da565b8251156127565782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127a0578181015183820152602001612788565b50505050905090810190601f1680156127cd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe42656566793a20496e7369676e69666963616e7420696e70757420616d6f756e7442656566793a20574554482061646472657373206e6f74206d61746368696e6720526f757465722e57455448282942656566793a204c6971756964697479207061697220726573657276657320746f6f206c6f77556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c42656566793a20496e70757420746f6b656e206973206e6f7420617070726f76656442656566793a20496e70757420746f6b656e206e6f742070726573656e7420696e206c69717564697479207061697242656566793a206465736972656420746f6b656e206e6f742070726573656e7420696e206c69717564697479207061697242656566793a20496e636f6d70617469626c65206c6971756964697479207061697220666163746f7279556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220ba7b50bdde402ae26d9becb5ca043391629f6a39e9a4e9f3c3ae259776311bbb64736f6c63430007060033000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Deployed Bytecode
0x6080604052600436106100955760003560e01c8063ad5c464811610059578063ad5c464814610212578063bb0c829814610243578063ddca3f431461026a578063f5d07b601461027f578063f887ea40146102c6576100ce565b80633f2f869a146100d357806351c9cf911461013d57806370fae20d146101845780638437fabe146101b0578063a28c361b146101d9576100ce565b366100ce57336001600160a01b037f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a16146100cc57fe5b005b600080fd5b3480156100df57600080fd5b50610116600480360360608110156100f657600080fd5b506001600160a01b038135811691602081013590911690604001356102db565b6040805193845260208401929092526001600160a01b031682820152519081900360600190f35b34801561014957600080fd5b506100cc6004803603608081101561016057600080fd5b506001600160a01b038135811691602081013591604082013516906060013561065f565b6100cc6004803603604081101561019a57600080fd5b506001600160a01b038135169060200135610b35565b3480156101bc57600080fd5b506101c5610c19565b604080519115158252519081900360200190f35b3480156101e557600080fd5b506100cc600480360360408110156101fc57600080fd5b506001600160a01b038135169060200135610d10565b34801561021e57600080fd5b50610227611047565b604080516001600160a01b039092168252519081900360200190f35b34801561024f57600080fd5b5061025861106b565b60408051918252519081900360200190f35b34801561027657600080fd5b50610258611071565b34801561028b57600080fd5b506100cc600480360360808110156102a257600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611076565b3480156102d257600080fd5b50610227611195565b60008060006102e8610c19565b5060006102f4876111b9565b9150506000866001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561033c57600080fd5b505afa158015610350573d6000803e3d6000fd5b505050506040513d602081101561036657600080fd5b50516001600160a01b031614905080806103f55750866001600160a01b0316826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156103be57600080fd5b505afa1580156103d2573d6000803e3d6000fd5b505050506040513d60208110156103e857600080fd5b50516001600160a01b0316145b6104305760405162461bcd60e51b815260040180806020018281038252602f8152602001806128bf602f913960400191505060405180910390fd5b600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561046c57600080fd5b505afa158015610480573d6000803e3d6000fd5b505050506040513d606081101561049657600080fd5b5080516020909101516001600160701b039182169350169050826104bb5780826104be565b81815b90925090506104ce88838361136e565b96507f000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f6001600160a01b03166352707d8c88848460196040518563ffffffff1660e01b81526004018085815260200184815260200183815260200182815260200194505050505060206040518083038186803b15801561054d57600080fd5b505afa158015610561573d6000803e3d6000fd5b505050506040513d602081101561057757600080fd5b50519550826105ea57836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156105b957600080fd5b505afa1580156105cd573d6000803e3d6000fd5b505050506040513d60208110156105e357600080fd5b5051610650565b836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561062357600080fd5b505afa158015610637573d6000803e3d6000fd5b505050506040513d602081101561064d57600080fd5b50515b94505050505093509350939050565b60008061066b866111b9565b915091506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156106aa57600080fd5b505afa1580156106be573d6000803e3d6000fd5b505050506040513d60208110156106d457600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0385169163d21220a7916004808301926020929190829003018186803b15801561071c57600080fd5b505afa158015610730573d6000803e3d6000fd5b505050506040513d602081101561074657600080fd5b505190506001600160a01b0382811690871614806107755750856001600160a01b0316816001600160a01b0316145b6107b05760405162461bcd60e51b81526004018080602001828103825260318152602001806128ee6031913960400191505060405180910390fd5b6107c56001600160a01b03851633308a611503565b836001600160a01b0316632e1a7d4d886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b5050505061082d833061155d565b6000866001600160a01b0316826001600160a01b03161461084e5781610850565b825b6040805160028082526060820183529293506000929091602083019080368337019050509050818160008151811061088457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505087816001815181106108b257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610910816000815181106108e257fe5b60200260200101517f000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f6116f6565b7f000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f6001600160a01b03166338ed1739836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561098c57600080fd5b505afa1580156109a0573d6000803e3d6000fd5b505050506040513d60208110156109b657600080fd5b50516040516001600160e01b031960e084901b16815260048101828152602482018c90523060648301819052426084840181905260a060448501908152885160a486015288518f958a95929160c4909101906020878101910280838360005b83811015610a2d578181015183820152602001610a15565b505050509050019650505050505050600060405180830381600087803b158015610a5657600080fd5b505af1158015610a6a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610a9357600080fd5b8101908080516040519392919084640100000000821115610ab357600080fd5b908301906020820185811115610ac857600080fd5b8251866020820283011164010000000082111715610ae557600080fd5b82525081516020918201928201910280838360005b83811015610b12578181015183820152602001610afa565b5050505090500160405250505050610b298161178c565b50505050505050505050565b6103e8341015610b765760405162461bcd60e51b81526004018080602001828103825260218152602001806127dc6021913960400191505060405180910390fd5b7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610bd157600080fd5b505af1158015610be5573d6000803e3d6000fd5b5050505050610c1582827f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a611a3a565b5050565b60007f000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610c7457600080fd5b505afa158015610c88573d6000803e3d6000fd5b505050506040513d6020811015610c9e57600080fd5b50517f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6001600160a01b03908116911614905080610d0d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806127fd602e913960400191505060405180910390fd5b90565b600080610d1c846111b9565b9092509050610d366001600160a01b038516333086611503565b816001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d7c57600080fd5b505af1158015610d90573d6000803e3d6000fd5b505050507f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610df757600080fd5b505afa158015610e0b573d6000803e3d6000fd5b505050506040513d6020811015610e2157600080fd5b50516001600160a01b031614801590610ed057507f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9857600080fd5b505afa158015610eac573d6000803e3d6000fd5b505050506040513d6020811015610ec257600080fd5b50516001600160a01b031614155b15610ee657610edf813361155d565b5050610c15565b610ef0813061155d565b604080516002808252606082018352600092602083019080368337019050509050816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4a57600080fd5b505afa158015610f5e573d6000803e3d6000fd5b505050506040513d6020811015610f7457600080fd5b505181518290600090610f8357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610fdc57600080fd5b505afa158015610ff0573d6000803e3d6000fd5b505050506040513d602081101561100657600080fd5b505181518290600190811061101757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506110408161178c565b5050505050565b7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a81565b6103e881565b601981565b6103e88110156110b75760405162461bcd60e51b81526004018080602001828103825260218152602001806127dc6021913960400191505060405180910390fd5b60408051636eb1769f60e11b8152336004820152306024820152905182916001600160a01b0385169163dd62ed3e91604480820192602092909190829003018186803b15801561110657600080fd5b505afa15801561111a573d6000803e3d6000fd5b505050506040513d602081101561113057600080fd5b5051101561116f5760405162461bcd60e51b815260040180806020018281038252602281526020018061289d6022913960400191505060405180910390fd5b6111846001600160a01b038316333084611503565b61118f848484611a3a565b50505050565b7f000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f81565b600080829150816001600160a01b0316631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d602081101561122257600080fd5b50516040805163c45a015560e01b815290519192506001600160a01b037f000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f169163c45a015591600480820192602092909190829003018186803b15801561128857600080fd5b505afa15801561129c573d6000803e3d6000fd5b505050506040513d60208110156112b257600080fd5b50516040805163c45a015560e01b815290516001600160a01b039283169284169163c45a0155916004808301926020929190829003018186803b1580156112f857600080fd5b505afa15801561130c573d6000803e3d6000fd5b505050506040513d602081101561132257600080fd5b50516001600160a01b0316146113695760405162461bcd60e51b815260040180806020018281038252602a81526020018061291f602a913960400191505060405180910390fd5b915091565b6040805163149c1f6360e21b8152600285046004820181905260248201859052604482018490526019606483015291516000929183916001600160a01b037f000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f16916352707d8c916084808301926020929190829003018186803b1580156113f457600080fd5b505afa158015611408573d6000803e3d6000fd5b505050506040513d602081101561141e57600080fd5b5051905060006001600160a01b037f000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f1663ad615dec8461145e8982612244565b611468898761225a565b6040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156114aa57600080fd5b505afa1580156114be573d6000803e3d6000fd5b505050506040513d60208110156114d457600080fd5b505190506114f86114f1828580028502816114eb57fe5b0461226a565b889061225a565b979650505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261118f9085906123b2565b6115eb82836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156115ae57600080fd5b505afa1580156115c2573d6000803e3d6000fd5b505050506040513d60208110156115d857600080fd5b50516001600160a01b0385169190612463565b600080836001600160a01b03166389afcb44846040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506040805180830381600087803b15801561163c57600080fd5b505af1158015611650573d6000803e3d6000fd5b505050506040513d604081101561166657600080fd5b50805160209091015190925090506103e88210156116b55760405162461bcd60e51b81526004018080602001828103825260268152602001806129496026913960400191505060405180910390fd5b6103e881101561118f5760405162461bcd60e51b81526004018080602001828103825260268152602001806128516026913960400191505060405180910390fd5b60408051636eb1769f60e11b81523060048201526001600160a01b03838116602483015291519184169163dd62ed3e91604480820192602092909190829003018186803b15801561174657600080fd5b505afa15801561175a573d6000803e3d6000fd5b505050506040513d602081101561177057600080fd5b5051610c1557610c156001600160a01b038316826000196124b5565b6000805b8251811015611a35578281815181106117a557fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117f957600080fd5b505afa15801561180d573d6000803e3d6000fd5b505050506040513d602081101561182357600080fd5b505191508115611a2d577f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6001600160a01b031683828151811061186357fe5b60200260200101516001600160a01b031614156119fc577f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156118e057600080fd5b505af11580156118f4573d6000803e3d6000fd5b505060408051600080825260208201928390528151909450339350869290819081908082805b602083106119395780518252601f19909201916020918201910161191a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461199b576040519150601f19603f3d011682016040523d82523d6000602084013e6119a0565b606091505b50509050806119f6576040805162461bcd60e51b815260206004820152601a60248201527f42656566793a20455448207472616e73666572206661696c6564000000000000604482015290519081900360640190fd5b50611a2d565b611a2d3383858481518110611a0d57fe5b60200260200101516001600160a01b03166124639092919063ffffffff16565b600101611790565b505050565b600080611a46856111b9565b91509150600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611a8657600080fd5b505afa158015611a9a573d6000803e3d6000fd5b505050506040513d6060811015611ab057600080fd5b5080516020909101516001600160701b0391821693501690506103e882118015611adb57506103e881115b611b165760405162461bcd60e51b815260040180806020018281038252602681526020018061282b6026913960400191505060405180910390fd5b6000856001600160a01b0316846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611b5b57600080fd5b505afa158015611b6f573d6000803e3d6000fd5b505050506040513d6020811015611b8557600080fd5b50516001600160a01b03161490508080611c145750856001600160a01b0316846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611bdd57600080fd5b505afa158015611bf1573d6000803e3d6000fd5b505050506040513d6020811015611c0757600080fd5b50516001600160a01b0316145b611c4f5760405162461bcd60e51b815260040180806020018281038252602f8152602001806128bf602f913960400191505060405180910390fd5b6040805160028082526060820183526000926020830190803683370190505090508681600081518110611c7e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081611d0d57846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611cdc57600080fd5b505afa158015611cf0573d6000803e3d6000fd5b505050506040513d6020811015611d0657600080fd5b5051611d73565b846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611d4657600080fd5b505afa158015611d5a573d6000803e3d6000fd5b505050506040513d6020811015611d7057600080fd5b50515b81600181518110611d8057fe5b6001600160a01b03928316602091820292909201810191909152604080516370a0823160e01b815230600482015290516000938b16926370a082319260248082019391829003018186803b158015611dd757600080fd5b505afa158015611deb573d6000803e3d6000fd5b505050506040513d6020811015611e0157600080fd5b5051905060008315611e1f57611e1882878761136e565b9050611e2d565b611e2a82868861136e565b90505b611e3d836000815181106108e257fe5b60007f000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f6001600160a01b03166338ed1739838d8730426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611ee3578181015183820152602001611ecb565b505050509050019650505050505050600060405180830381600087803b158015611f0c57600080fd5b505af1158015611f20573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f4957600080fd5b8101908080516040519392919084640100000000821115611f6957600080fd5b908301906020820185811115611f7e57600080fd5b8251866020820283011164010000000082111715611f9b57600080fd5b82525081516020918201928201910280838360005b83811015611fc8578181015183820152602001611fb0565b505050509050016040525050509050611fe7846001815181106108e257fe5b60007f000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f6001600160a01b031663e8e337008660008151811061202557fe5b60200260200101518760018151811061203a57fe5b60200260200101516120698660008151811061205257fe5b60200260200101518961225a90919063ffffffff16565b8660018151811061207657fe5b602002602001015160018030426040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001858152602001848152602001836001600160a01b0316815260200182815260200198505050505050505050606060405180830381600087803b15801561210557600080fd5b505af1158015612119573d6000803e3d6000fd5b505050506040513d606081101561212f57600080fd5b50604001519050612140898b6116f6565b896001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561218657600080fd5b505af115801561219a573d6000803e3d6000fd5b5050505061222c338b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156121ef57600080fd5b505afa158015612203573d6000803e3d6000fd5b505050506040513d602081101561221957600080fd5b50516001600160a01b038d169190612463565b6122358561178c565b50505050505050505050505050565b8082018281101561225457600080fd5b92915050565b8082038281111561225457600080fd5b600081612279575060006123ad565b816001600160801b82106122925760809190911c9060401b5b6801000000000000000082106122ad5760409190911c9060201b5b64010000000082106122c45760209190911c9060101b5b6201000082106122d95760109190911c9060081b5b61010082106122ed5760089190911c9060041b5b601082106123005760049190911c9060021b5b6008821061230c5760011b5b600181858161231757fe5b048201901c9050600181858161232957fe5b048201901c9050600181858161233b57fe5b048201901c9050600181858161234d57fe5b048201901c9050600181858161235f57fe5b048201901c9050600181858161237157fe5b048201901c9050600181858161238357fe5b048201901c9050600081858161239557fe5b0490508082106123a557806123a7565b815b93505050505b919050565b6000612407826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125c89092919063ffffffff16565b805190915015611a355780806020019051602081101561242657600080fd5b5051611a355760405162461bcd60e51b815260040180806020018281038252602a81526020018061296f602a913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a359084906123b2565b80158061253b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561250d57600080fd5b505afa158015612521573d6000803e3d6000fd5b505050506040513d602081101561253757600080fd5b5051155b6125765760405162461bcd60e51b81526004018080602001828103825260368152602001806129996036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611a359084906123b2565b60606125d784846000856125e1565b90505b9392505050565b6060824710156126225760405162461bcd60e51b81526004018080602001828103825260268152602001806128776026913960400191505060405180910390fd5b61262b85612731565b61267c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106126ba5780518252601f19909201916020918201910161269b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461271c576040519150601f19603f3d011682016040523d82523d6000602084013e612721565b606091505b50915091506114f8828286612737565b3b151590565b606083156127465750816125da565b8251156127565782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127a0578181015183820152602001612788565b50505050905090810190601f1680156127cd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe42656566793a20496e7369676e69666963616e7420696e70757420616d6f756e7442656566793a20574554482061646472657373206e6f74206d61746368696e6720526f757465722e57455448282942656566793a204c6971756964697479207061697220726573657276657320746f6f206c6f77556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c42656566793a20496e70757420746f6b656e206973206e6f7420617070726f76656442656566793a20496e70757420746f6b656e206e6f742070726573656e7420696e206c69717564697479207061697242656566793a206465736972656420746f6b656e206e6f742070726573656e7420696e206c69717564697479207061697242656566793a20496e636f6d70617469626c65206c6971756964697479207061697220666163746f7279556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220ba7b50bdde402ae26d9becb5ca043391629f6a39e9a4e9f3c3ae259776311bbb64736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
-----Decoded View---------------
Arg [0] : _router (address): 0xAA30eF758139ae4a7f798112902Bf6d65612045f
Arg [1] : _WETH (address): 0x98878B06940aE243284CA214f92Bb71a2b032B8A
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f
Arg [1] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Deployed Bytecode Sourcemap
30959:7808:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31460:10;-1:-1:-1;;;;;31474:4:0;31460:18;;31453:26;;;;30959:7808;;;;;37528:814;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37528:814:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;37528:814:0;;;;;;;;;;;;;;32948:1017;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32948:1017:0;;;;;;;;;;;;;;;;;;;;:::i;31495:290::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31495:290:0;;;;;;;;:::i;38350:183::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;32289:651;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32289:651:0;;;;;;;;:::i;31157:29::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;31157:29:0;;;;;;;;;;;;;;31193:44;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;31244:32;;;;;;;;;;;;;:::i;31793:488::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31793:488:0;;;;;;;;;;;;;;;;;;;;:::i;31108:42::-;;;;;;;;;;;;;:::i;37528:814::-;37633:20;37655:21;37678:20;37711:11;:9;:11::i;:::-;;37736:19;37759:25;37773:10;37759:13;:25::i;:::-;37733:51;;;37797:13;37830:7;-1:-1:-1;;;;;37813:24:0;:4;-1:-1:-1;;;;;37813:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37813:13:0;-1:-1:-1;;;;;37813:24:0;;;-1:-1:-1;37813:24:0;;37856:36;;;37885:7;-1:-1:-1;;;;;37868:24:0;:4;-1:-1:-1;;;;;37868:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37868:13:0;-1:-1:-1;;;;;37868:24:0;;37856:36;37848:96;;;;-1:-1:-1;;;37848:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37958:16;37976;37997:4;-1:-1:-1;;;;;37997:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37997:18:0;;;;;;;-1:-1:-1;;;;;37957:58:0;;;;-1:-1:-1;37957:58:0;;-1:-1:-1;38049:8:0;:54;;38084:8;38094;38049:54;;;38061:8;38071;38049:54;38026:77;;-1:-1:-1;38026:77:0;-1:-1:-1;38131:52:0;38146:16;38026:77;;38131:14;:52::i;:::-;38116:67;;38210:6;-1:-1:-1;;;;;38210:19:0;;38230:12;38244:8;38254;31274:2;38210:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38210:58:0;;-1:-1:-1;38294:8:0;:40;;38321:4;-1:-1:-1;;;;;38321:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38321:13:0;38294:40;;;38305:4;-1:-1:-1;;;;;38305:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38305:13:0;38294:40;38279:55;;37528:814;;;;;;;;;;;:::o;32948:1017::-;33087:19;33108;33131:25;33145:10;33131:13;:25::i;:::-;33086:70;;;;33167:14;33184:4;-1:-1:-1;;;;;33184:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33184:13:0;33225;;;-1:-1:-1;;;33225:13:0;;;;33184;;-1:-1:-1;33208:14:0;;-1:-1:-1;;;;;33225:11:0;;;;;:13;;;;;33184;;33225;;;;;;;:11;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33225:13:0;;-1:-1:-1;;;;;;33257:22:0;;;;;;;;:48;;;33293:12;-1:-1:-1;;;;;33283:22:0;:6;-1:-1:-1;;;;;33283:22:0;;33257:48;33249:110;;;;-1:-1:-1;;;33249:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33372:65;-1:-1:-1;;;;;33372:22:0;;33395:10;33415:4;33422:14;33372:22;:65::i;:::-;33448:5;-1:-1:-1;;;;;33448:14:0;;33463;33448:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33489:45;33513:4;33528;33489:15;:45::i;:::-;33547:17;33577:12;-1:-1:-1;;;;;33567:22:0;:6;-1:-1:-1;;;;;33567:22:0;;:40;;33601:6;33567:40;;;33592:6;33567:40;33642:16;;;33656:1;33642:16;;;;;;;;33547:60;;-1:-1:-1;33618:21:0;;33642:16;;;;;;;;;;;;-1:-1:-1;33642:16:0;33618:40;;33679:9;33669:4;33674:1;33669:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;33669:19:0;;;-1:-1:-1;;;;;33669:19:0;;;;;33709:12;33699:4;33704:1;33699:7;;;;;;;;;;;;;:22;-1:-1:-1;;;;;33699:22:0;;;-1:-1:-1;;;;;33699:22:0;;;;;33734:47;33756:4;33761:1;33756:7;;;;;;;;;;;;;;33773:6;33734:21;:47::i;:::-;33792:6;-1:-1:-1;;;;;33792:31:0;;33831:9;-1:-1:-1;;;;;33824:27:0;;33860:4;33824:42;;;;;;;;;;;;;-1:-1:-1;;;;;33824:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33824:42:0;33792:133;;-1:-1:-1;;;;;;33792:133:0;;;;;;;;;;;;;;;;;;;33902:4;33792:133;;;;;;33909:15;33792:133;;;;;;;;;;;;;;;;;;;;;33868:18;;33888:4;;33792:133;;;;;;;33824:42;33792:133;;;;;;;;-1:-1:-1;33792:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33792:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33792:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33938:19;33952:4;33938:13;:19::i;:::-;32948:1017;;;;;;;;;;:::o;31495:290::-;31233:4;31598:9;:26;;31590:72;;;;-1:-1:-1;;;31590:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31681:4;-1:-1:-1;;;;;31675:19:0;;31702:9;31675:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31727:50;31741:10;31753:17;31772:4;31727:13;:50::i;:::-;31495:290;;:::o;38350:183::-;38392:12;38435:6;-1:-1:-1;;;;;38435:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38435:13:0;38427:4;-1:-1:-1;;;;;38427:21:0;;;;;;;-1:-1:-1;38427:21:0;38459:66;;;;-1:-1:-1;;;38459:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38350:183;:::o;32289:651::-;32372:19;32393;32416:25;32430:10;32416:13;:25::i;:::-;32371:70;;-1:-1:-1;32371:70:0;-1:-1:-1;32454:78:0;-1:-1:-1;;;;;32454:35:0;;32490:10;32510:4;32517:14;32454:35;:78::i;:::-;32543:5;-1:-1:-1;;;;;32543:14:0;;32558;32543:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32607:4;-1:-1:-1;;;;;32590:21:0;:4;-1:-1:-1;;;;;32590:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32590:13:0;-1:-1:-1;;;;;32590:21:0;;;;;:46;;;32632:4;-1:-1:-1;;;;;32615:21:0;:4;-1:-1:-1;;;;;32615:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32615:13:0;-1:-1:-1;;;;;32615:21:0;;;32590:46;32586:128;;;32660:42;32684:4;32691:10;32660:15;:42::i;:::-;32653:49;;;;32586:128;32726:45;32750:4;32765;32726:15;:45::i;:::-;32810:16;;;32824:1;32810:16;;;;;;;;32784:23;;32810:16;;;;;;;;;;-1:-1:-1;32810:16:0;32784:42;;32849:4;-1:-1:-1;;;;;32849:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32849:13:0;32837:9;;:6;;32844:1;;32837:9;;;;;;;;;:25;-1:-1:-1;;;;;32837:25:0;;;-1:-1:-1;;;;;32837:25:0;;;;;32885:4;-1:-1:-1;;;;;32885:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32885:13:0;32873:9;;:6;;32880:1;;32873:9;;;;;;;;;;;:25;-1:-1:-1;;;;;32873:25:0;;;-1:-1:-1;;;;;32873:25:0;;;;;32911:21;32925:6;32911:13;:21::i;:::-;32289:651;;;;;:::o;31157:29::-;;;:::o;31193:44::-;31233:4;31193:44;:::o;31244:32::-;31274:2;31244:32;:::o;31793:488::-;31233:4;31925:13;:30;;31917:76;;;;-1:-1:-1;;;31917:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32012:52;;;-1:-1:-1;;;32012:52:0;;32038:10;32012:52;;;;32058:4;32012:52;;;;;;32068:13;;-1:-1:-1;;;;;32012:25:0;;;;;:52;;;;;;;;;;;;;;;:25;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32012:52:0;:69;;32004:116;;;;-1:-1:-1;;;32004:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32133:74;-1:-1:-1;;;;;32133:32:0;;32166:10;32186:4;32193:13;32133:32;:74::i;:::-;32220:53;32234:10;32246:17;32265:7;32220:13;:53::i;:::-;31793:488;;;;:::o;31108:42::-;;;:::o;34380:306::-;34446:19;34467;34521:10;34499:33;;34565:5;-1:-1:-1;;;;;34565:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34565:12:0;34615:16;;;-1:-1:-1;;;34615:16:0;;;;34565:12;;-1:-1:-1;;;;;;34615:6:0;:14;;;;:16;;;;;34565:12;;34615:16;;;;;;;;:14;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34615:16:0;34597:14;;;-1:-1:-1;;;34597:14:0;;;;-1:-1:-1;;;;;34597:34:0;;;;:12;;;;;:14;;;;;34615:16;;34597:14;;;;;;;:12;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34597:14:0;-1:-1:-1;;;;;34597:34:0;;34589:89;;;;-1:-1:-1;;;34589:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34380:306;;;:::o;37016:504::-;37221:60;;;-1:-1:-1;;;37221:60:0;;37189:1;37175:15;;37221:60;;;;;;;;;;;;;;;;;;31274:2;37221:60;;;;;;37119:18;;37175:15;37119:18;;-1:-1:-1;;;;;37221:6:0;:19;;;;:60;;;;;;;;;;;;;;:19;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37221:60:0;;-1:-1:-1;37292:19:0;-1:-1:-1;;;;;37314:6:0;:12;;37327:14;37343:28;:8;37327:14;37343:12;:28::i;:::-;37373:23;:8;37386:9;37373:12;:23::i;:::-;37314:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37314:83:0;;-1:-1:-1;37421:91:0;37437:74;37314:83;37453:31;;;:43;;37314:83;37453:57;;;;;37437:15;:74::i;:::-;37421:11;;:15;:91::i;:::-;37408:104;37016:504;-1:-1:-1;;;;;;;37016:504:0:o;20219:205::-;20347:68;;;-1:-1:-1;;;;;20347:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20347:68:0;-1:-1:-1;;;20347:68:0;;;20320:96;;20340:5;;20320:19;:96::i;33973:399::-;34043:70;34069:4;34082;-1:-1:-1;;;;;34075:22:0;;34106:4;34075:37;;;;;;;;;;;;;-1:-1:-1;;;;;34075:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34075:37:0;-1:-1:-1;;;;;34043:25:0;;;:70;:25;:70::i;:::-;34125:15;34142;34176:4;-1:-1:-1;;;;;34161:25:0;;34187:2;34161:29;;;;;;;;;;;;;-1:-1:-1;;;;;34161:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34161:29:0;;;;;;;;;-1:-1:-1;34161:29:0;-1:-1:-1;31233:4:0;34211:24;;;34203:75;;;;-1:-1:-1;;;34203:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31233:4;34297:7;:24;;34289:75;;;;-1:-1:-1;;;34289:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38541:221;38627:47;;;-1:-1:-1;;;38627:47:0;;38659:4;38627:47;;;;-1:-1:-1;;;;;38627:47:0;;;;;;;;;:23;;;;;;:47;;;;;;;;;;;;;;;:23;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38627:47:0;38623:132;;38696:47;-1:-1:-1;;;;;38696:25:0;;38722:7;-1:-1:-1;;38696:25:0;:47::i;36374:634::-;36441:15;36472:9;36467:534;36487:6;:13;36483:1;:17;36467:534;;;36539:6;36546:1;36539:9;;;;;;;;;;;;;;-1:-1:-1;;;;;36532:27:0;;36568:4;36532:42;;;;;;;;;;;;;-1:-1:-1;;;;;36532:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36532:42:0;;-1:-1:-1;36593:11:0;;36589:401;;36642:4;-1:-1:-1;;;;;36629:17:0;:6;36636:1;36629:9;;;;;;;;;;;;;;-1:-1:-1;;;;;36629:17:0;;36625:350;;;36677:4;-1:-1:-1;;;;;36671:20:0;;36692:7;36671:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36773:12:0;;;36724;36773;;;;;;;;;;36741:45;;36724:12;;-1:-1:-1;36741:10:0;;-1:-1:-1;36764:7:0;;36773:12;;;;;36741:45;36773:12;;36741:45;;;;;;;;;;-1:-1:-1;;36741:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36723:63;;;36817:7;36809:46;;;;;-1:-1:-1;;;36809:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36625:350;;;;36904:51;36935:10;36947:7;36911:6;36918:1;36911:9;;;;;;;;;;;;;;-1:-1:-1;;;;;36904:30:0;;;:51;;;;;:::i;:::-;36502:3;;36467:534;;;;36374:634;;:::o;34694:1672::-;34801:19;34822;34845:25;34859:10;34845:13;:25::i;:::-;34800:70;;;;34884:16;34902;34923:4;-1:-1:-1;;;;;34923:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34923:18:0;;;;;;;-1:-1:-1;;;;;34883:58:0;;;;-1:-1:-1;34883:58:0;;-1:-1:-1;31233:4:0;34960:24;;:52;;;;;31233:4;34988:8;:24;34960:52;34952:103;;;;-1:-1:-1;;;34952:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35068:13;35101:7;-1:-1:-1;;;;;35084:24:0;:4;-1:-1:-1;;;;;35084:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35084:13:0;-1:-1:-1;;;;;35084:24:0;;;-1:-1:-1;35084:24:0;;35127:36;;;35156:7;-1:-1:-1;;;;;35139:24:0;:4;-1:-1:-1;;;;;35139:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35139:13:0;-1:-1:-1;;;;;35139:24:0;;35127:36;35119:96;;;;-1:-1:-1;;;35119:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35252:16;;;35266:1;35252:16;;;;;;;;35228:21;;35252:16;;;;;;;;;;-1:-1:-1;35252:16:0;35228:40;;35289:7;35279:4;35284:1;35279:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;35279:17:0;;;-1:-1:-1;;;;;35279:17:0;;;;;35317:8;:40;;35344:4;-1:-1:-1;;;;;35344:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35344:13:0;35317:40;;;35328:4;-1:-1:-1;;;;;35328:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35328:13:0;35317:40;35307:4;35312:1;35307:7;;;;;;;;-1:-1:-1;;;;;35307:50:0;;;:7;;;;;;;;;;:50;;;;35395:40;;;-1:-1:-1;;;35395:40:0;;35429:4;35395:40;;;;;;35370:22;;35395:25;;;;;:40;;;;;;;;;;;:25;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35395:40:0;;-1:-1:-1;35446:20:0;35477:204;;;;35521:50;35536:14;35552:8;35562;35521:14;:50::i;:::-;35506:65;;35477:204;;;35619:50;35634:14;35650:8;35660;35619:14;:50::i;:::-;35604:65;;35477:204;35693:47;35715:4;35720:1;35715:7;;;;;;;35693:47;35751:30;35784:6;-1:-1:-1;;;;;35784:45:0;;35830:12;35844:17;35863:4;35877;35884:15;35784:116;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35784:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35784:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35784:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35751:149;;35913:47;35935:4;35940:1;35935:7;;;;;;;35913:47;35975:23;36002:6;-1:-1:-1;;;;;36002:33:0;;36036:4;36041:1;36036:7;;;;;;;;;;;;;;36045:4;36050:1;36045:7;;;;;;;;;;;;;;36054:36;36073:13;36087:1;36073:16;;;;;;;;;;;;;;36054:14;:18;;:36;;;;:::i;:::-;36092:13;36106:1;36092:16;;;;;;;;;;;;;;36110:1;36113;36124:4;36131:15;36002:145;;;;;;;;;;;;;-1:-1:-1;;;;;36002:145:0;;;;;;-1:-1:-1;;;;;36002:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36002:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36002:145:0;;;;-1:-1:-1;36160:52:0;36190:4;36205:5;36160:21;:52::i;:::-;36223:5;-1:-1:-1;;;;;36223:13:0;;36237:15;36223:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36266:62;36285:10;36297:5;-1:-1:-1;;;;;36297:15:0;;36321:4;36297:30;;;;;;;;;;;;;-1:-1:-1;;;;;36297:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36297:30:0;-1:-1:-1;;;;;36266:18:0;;;:62;:18;:62::i;:::-;36339:19;36353:4;36339:13;:19::i;:::-;34694:1672;;;;;;;;;;;;;:::o;23556:113::-;23649:5;;;23644:16;;;;23636:25;;;;;;23556:113;;;;:::o;23839:::-;23932:5;;;23927:16;;;;23919:25;;;;;2952:1239;3000:7;3024:6;3020:20;;-1:-1:-1;3039:1:0;3032:8;;3020:20;3218:1;3242;-1:-1:-1;;;3258:41:0;;3254:107;;3323:3;3316:10;;;;;3347:2;3341:8;3254:107;3381:19;3375:2;:25;3371:90;;3424:2;3417:9;;;;;3447:2;3441:8;3371:90;3481:11;3475:2;:17;3471:82;;3516:2;3509:9;;;;;3539:2;3533:8;3471:82;3573:7;3567:2;:13;3563:77;;3604:2;3597:9;;;;;3627:1;3621:7;3563:77;3660:5;3654:2;:11;3650:74;;3689:1;3682:8;;;;;3711:1;3705:7;3650:74;3744:4;3738:2;:10;3734:73;;3772:1;3765:8;;;;;3794:1;3788:7;3734:73;3827:3;3821:2;:9;3817:49;;3853:1;3847:7;3817:49;3895:1;3889;3885;:5;;;;;;3881:1;:9;3880:16;;3876:20;;3926:1;3920;3916;:5;;;;;;3912:1;:9;3911:16;;3907:20;;3957:1;3951;3947;:5;;;;;;3943:1;:9;3942:16;;3938:20;;3988:1;3982;3978;:5;;;;;;3974:1;:9;3973:16;;3969:20;;4019:1;4013;4009;:5;;;;;;4005:1;:9;4004:16;;4000:20;;4050:1;4044;4040;:5;;;;;;4036:1;:9;4035:16;;4031:20;;4081:1;4075;4071;:5;;;;;;4067:1;:9;4066:16;;4062:20;;4130:10;4147:1;4143;:5;;;;;;4130:18;;4171:2;4167:1;:6;:15;;4180:2;4167:15;;;4176:1;4167:15;4159:24;;;;;2952:1239;;;;:::o;22339:761::-;22763:23;22789:69;22817:4;22789:69;;;;;;;;;;;;;;;;;22797:5;-1:-1:-1;;;;;22789:27:0;;;:69;;;;;:::i;:::-;22873:17;;22763:95;;-1:-1:-1;22873:21:0;22869:224;;23015:10;23004:30;;;;;;;;;;;;;;;-1:-1:-1;23004:30:0;22996:85;;;;-1:-1:-1;;;22996:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20034:177;20144:58;;;-1:-1:-1;;;;;20144:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20144:58:0;-1:-1:-1;;;20144:58:0;;;20117:86;;20137:5;;20117:19;:86::i;20693:622::-;21063:10;;;21062:62;;-1:-1:-1;21079:39:0;;;-1:-1:-1;;;21079:39:0;;21103:4;21079:39;;;;-1:-1:-1;;;;;21079:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21079:39:0;:44;21062:62;21054:152;;;;-1:-1:-1;;;21054:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21244:62;;;-1:-1:-1;;;;;21244:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21244:62:0;-1:-1:-1;;;21244:62:0;;;21217:90;;21237:5;;21217:19;:90::i;16050:195::-;16153:12;16185:52;16207:6;16215:4;16221:1;16224:12;16185:21;:52::i;:::-;16178:59;;16050:195;;;;;;:::o;17102:530::-;17229:12;17287:5;17262:21;:30;;17254:81;;;;-1:-1:-1;;;17254:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17354:18;17365:6;17354:10;:18::i;:::-;17346:60;;;;;-1:-1:-1;;;17346:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17480:12;17494:23;17521:6;-1:-1:-1;;;;;17521:11:0;17541:5;17549:4;17521:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17521:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17479:75;;;;17572:52;17590:7;17599:10;17611:12;17572:17;:52::i;13132:422::-;13499:20;13538:8;;;13132:422::o;18638:742::-;18753:12;18782:7;18778:595;;;-1:-1:-1;18813:10:0;18806:17;;18778:595;18927:17;;:21;18923:439;;19190:10;19184:17;19251:15;19238:10;19234:2;19230:19;19223:44;19138:148;19333:12;19326:20;;-1:-1:-1;;;19326:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://ba7b50bdde402ae26d9becb5ca043391629f6a39e9a4e9f3c3ae259776311bbb
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.