Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 599 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 19776748 | 275 days ago | IN | 0 ETH | 0.00361621 | ||||
Liquidate | 19776733 | 275 days ago | IN | 0 ETH | 0.00398051 | ||||
Withdraw | 19654202 | 292 days ago | IN | 0 ETH | 0.00458229 | ||||
Withdraw | 19387580 | 329 days ago | IN | 0 ETH | 0.01544222 | ||||
Repay | 19386793 | 329 days ago | IN | 0.08126339 ETH | 0.00575314 | ||||
Repay | 19382525 | 330 days ago | IN | 0.08126339 ETH | 0.00755353 | ||||
Repay | 19313658 | 339 days ago | IN | 0 ETH | 0.00295367 | ||||
Withdraw | 18531705 | 449 days ago | IN | 0 ETH | 0.0148896 | ||||
Withdraw | 16353019 | 755 days ago | IN | 0 ETH | 0.00483383 | ||||
Withdraw | 16067150 | 795 days ago | IN | 0 ETH | 0.00374163 | ||||
Repay | 16067141 | 795 days ago | IN | 0 ETH | 0.00059885 | ||||
Withdraw | 16047878 | 798 days ago | IN | 0 ETH | 0.0038276 | ||||
Harvest | 15138613 | 932 days ago | IN | 0 ETH | 0.00707566 | ||||
Withdraw | 14949057 | 964 days ago | IN | 0 ETH | 0.00211667 | ||||
Liquidate | 14949041 | 964 days ago | IN | 0 ETH | 0.0035093 | ||||
Repay | 14949029 | 964 days ago | IN | 0 ETH | 0.00382155 | ||||
Mint | 14948991 | 964 days ago | IN | 0 ETH | 0.00209889 | ||||
Liquidate | 14948970 | 964 days ago | IN | 0 ETH | 0.00269649 | ||||
Repay | 14948937 | 964 days ago | IN | 0 ETH | 0.00190957 | ||||
Mint | 14948926 | 964 days ago | IN | 0 ETH | 0.00223009 | ||||
Liquidate | 14948903 | 964 days ago | IN | 0 ETH | 0.00332348 | ||||
Liquidate | 14948863 | 964 days ago | IN | 0 ETH | 0.00544353 | ||||
Mint | 14948860 | 964 days ago | IN | 0 ETH | 0.00340678 | ||||
Repay | 14948839 | 964 days ago | IN | 0 ETH | 0.00366956 | ||||
Mint | 14948749 | 964 days ago | IN | 0 ETH | 0.00324024 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
19386793 | 329 days ago | 0.08126339 ETH | ||||
19382525 | 330 days ago | 0.08126339 ETH | ||||
13623284 | 1172 days ago | 0.1 ETH | ||||
13541192 | 1185 days ago | 10 ETH | ||||
13540944 | 1185 days ago | 2.96 ETH | ||||
13240366 | 1232 days ago | 200 ETH | ||||
13224051 | 1235 days ago | 100 ETH | ||||
13079348 | 1257 days ago | 20 ETH | ||||
13070966 | 1258 days ago | 0.02 ETH | ||||
13065808 | 1259 days ago | 23 ETH | ||||
12966627 | 1275 days ago | 100 ETH | ||||
12903524 | 1284 days ago | 0.4 ETH | ||||
12873055 | 1289 days ago | 0.8 ETH | ||||
12857695 | 1292 days ago | 1.88943215 ETH | ||||
12843092 | 1294 days ago | 100 ETH | ||||
12842213 | 1294 days ago | 0.005 ETH | ||||
12800615 | 1301 days ago | 0.6 ETH | ||||
12788991 | 1302 days ago | 0.1765 ETH | ||||
12779134 | 1304 days ago | 0.6 ETH | ||||
12775075 | 1305 days ago | 1.37 ETH | ||||
12755398 | 1308 days ago | 46 ETH | ||||
12754066 | 1308 days ago | 32 ETH | ||||
12753771 | 1308 days ago | 1 ETH | ||||
12746070 | 1309 days ago | 47 ETH | ||||
12742248 | 1310 days ago | 73.5 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
YumEthVesperVault
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-27 */ // Sources flattened with hardhat v2.1.1 https://hardhat.org // File @openzeppelin/contracts/math/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/utils/[email protected] 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); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/[email protected] 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 @openzeppelin/contracts/math/[email protected] 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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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) { 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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * 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); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File @openzeppelin/contracts/token/ERC20/[email protected] 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/libraries/FixedPointMath.sol pragma solidity ^0.6.12; library FixedPointMath { uint256 public constant DECIMALS = 18; uint256 public constant SCALAR = 10**DECIMALS; struct uq192x64 { uint256 x; } function fromU256(uint256 value) internal pure returns (uq192x64 memory) { uint256 x; require(value == 0 || (x = value * SCALAR) / SCALAR == value); return uq192x64(x); } function maximumValue() internal pure returns (uq192x64 memory) { return uq192x64(uint256(-1)); } function add(uq192x64 memory self, uq192x64 memory value) internal pure returns (uq192x64 memory) { uint256 x; require((x = self.x + value.x) >= self.x); return uq192x64(x); } function add(uq192x64 memory self, uint256 value) internal pure returns (uq192x64 memory) { return add(self, fromU256(value)); } function sub(uq192x64 memory self, uq192x64 memory value) internal pure returns (uq192x64 memory) { uint256 x; require((x = self.x - value.x) <= self.x); return uq192x64(x); } function sub(uq192x64 memory self, uint256 value) internal pure returns (uq192x64 memory) { return sub(self, fromU256(value)); } function mul(uq192x64 memory self, uint256 value) internal pure returns (uq192x64 memory) { uint256 x; require(value == 0 || (x = self.x * value) / value == self.x); return uq192x64(x); } function div(uq192x64 memory self, uint256 value) internal pure returns (uq192x64 memory) { require(value != 0); return uq192x64(self.x / value); } function cmp(uq192x64 memory self, uq192x64 memory value) internal pure returns (int256) { if (self.x < value.x) { return -1; } if (self.x > value.x) { return 1; } return 0; } function decode(uq192x64 memory self) internal pure returns (uint256) { return self.x / SCALAR; } } // File contracts/interfaces/IDetailedERC20.sol pragma solidity ^0.6.12; interface IDetailedERC20 is IERC20 { function name() external returns (string memory); function symbol() external returns (string memory); function decimals() external returns (uint8); } // File hardhat/[email protected] pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } } // File contracts/libraries/alchemist/CDP.sol pragma solidity ^0.6.12; /// @title CDP /// /// @dev A library which provides the CDP data struct and associated functions. library CDP { using CDP for Data; using FixedPointMath for FixedPointMath.uq192x64; using SafeERC20 for IDetailedERC20; using SafeMath for uint256; struct Context { FixedPointMath.uq192x64 collateralizationLimit; FixedPointMath.uq192x64 accumulatedYieldWeight; } struct Data { uint256 totalDeposited; uint256 totalDebt; uint256 totalCredit; uint256 lastDeposit; FixedPointMath.uq192x64 lastAccumulatedYieldWeight; } function update(Data storage _self, Context storage _ctx) internal { uint256 _earnedYield = _self.getEarnedYield(_ctx); if (_earnedYield > _self.totalDebt) { uint256 _currentTotalDebt = _self.totalDebt; _self.totalDebt = 0; _self.totalCredit = _earnedYield.sub(_currentTotalDebt); } else { _self.totalDebt = _self.totalDebt.sub(_earnedYield); } _self.lastAccumulatedYieldWeight = _ctx.accumulatedYieldWeight; } /// @dev Assures that the CDP is healthy. /// /// This function will revert if the CDP is unhealthy. function checkHealth(Data storage _self, Context storage _ctx, string memory _msg) internal view { require(_self.isHealthy(_ctx), _msg); } /// @dev Gets if the CDP is considered healthy. /// /// A CDP is healthy if its collateralization ratio is greater than the global collateralization limit. /// /// @return if the CDP is healthy. function isHealthy(Data storage _self, Context storage _ctx) internal view returns (bool) { return _ctx.collateralizationLimit.cmp(_self.getCollateralizationRatio(_ctx)) <= 0; } function getUpdatedTotalDebt(Data storage _self, Context storage _ctx) internal view returns (uint256) { uint256 _unclaimedYield = _self.getEarnedYield(_ctx); if (_unclaimedYield == 0) { return _self.totalDebt; } uint256 _currentTotalDebt = _self.totalDebt; if (_unclaimedYield >= _currentTotalDebt) { return 0; } return _currentTotalDebt - _unclaimedYield; } function getUpdatedTotalCredit(Data storage _self, Context storage _ctx) internal view returns (uint256) { uint256 _unclaimedYield = _self.getEarnedYield(_ctx); if (_unclaimedYield == 0) { return _self.totalCredit; } uint256 _currentTotalDebt = _self.totalDebt; if (_unclaimedYield <= _currentTotalDebt) { return 0; } return _self.totalCredit + (_unclaimedYield - _currentTotalDebt); } /// @dev Gets the amount of yield that a CDP has earned since the last time it was updated. /// /// @param _self the CDP to query. /// @param _ctx the CDP context. /// /// @return the amount of earned yield. function getEarnedYield(Data storage _self, Context storage _ctx) internal view returns (uint256) { FixedPointMath.uq192x64 memory _currentAccumulatedYieldWeight = _ctx.accumulatedYieldWeight; FixedPointMath.uq192x64 memory _lastAccumulatedYieldWeight = _self.lastAccumulatedYieldWeight; if (_currentAccumulatedYieldWeight.cmp(_lastAccumulatedYieldWeight) == 0) { return 0; } return _currentAccumulatedYieldWeight .sub(_lastAccumulatedYieldWeight) .mul(_self.totalDeposited) .decode(); } /// @dev Gets a CDPs collateralization ratio. /// /// The collateralization ratio is defined as the ratio of collateral to debt. If the CDP has zero debt then this /// will return the maximum value of a fixed point integer. /// /// This function will use the updated total debt so an update before calling this function is not required. /// /// @param _self the CDP to query. /// /// @return a fixed point integer representing the collateralization ratio. function getCollateralizationRatio(Data storage _self, Context storage _ctx) internal view returns (FixedPointMath.uq192x64 memory) { uint256 _totalDebt = _self.getUpdatedTotalDebt(_ctx); if (_totalDebt == 0) { return FixedPointMath.maximumValue(); } return FixedPointMath.fromU256(_self.totalDeposited).div(_totalDebt); } } // File contracts/interfaces/ITransmuter.sol pragma solidity ^0.6.12; interface ITransmuter { function distribute (address origin, uint256 amount) external; } // File contracts/interfaces/IMintableERC20.sol pragma solidity ^0.6.12; interface IMintableERC20 is IDetailedERC20{ function mint(address _recipient, uint256 _amount) external; function burnFrom(address account, uint256 amount) external; function lowerHasMinted(uint256 amount)external; } // File contracts/interfaces/IWETH.sol pragma solidity ^0.6.12; interface IWETH { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function balanceOf(address) external view returns (uint256); function deposit() external payable; function withdraw(uint256) external; function totalSupply() external view returns (uint256); function approve(address, uint256) external returns (bool); function transfer(address, uint256) external returns (bool); function transferFrom(address, address, uint256) external returns (bool); function allowance(address, address) external view returns (uint256); } // File contracts/interfaces/IChainlink.sol pragma solidity ^0.6.12; interface IChainlink { function latestAnswer() external view returns (int256); } // File contracts/interfaces/IWETHVaultAdapterV2.sol pragma solidity ^0.6.12; /// Interface for all Vault Adapter implementations. interface IWETHVaultAdapterV2 { /// @dev Gets the token that the adapter accepts. function token() external view returns (IWETH); /// @dev The total value of the assets deposited into the vault. function totalValue() external view returns (uint256); /// @dev Deposits funds into the vault. /// /// @param _amount the amount of funds to deposit. function deposit(uint256 _amount) external; /// @dev Attempts to withdraw funds from the wrapped vault. /// /// The amount withdrawn to the recipient may be less than the amount requested. /// /// @param _recipient the recipient of the funds. /// @param _amount the amount of funds to withdraw. function withdraw(address _recipient, uint256 _amount, bool _isHarvest) external; } // File contracts/libraries/alchemist/WETHVaultV2.sol pragma solidity ^0.6.12; /// @title WETHVaultV2 /// /// @dev A library which provides the Vault data struct and associated functions. library WETHVaultV2 { using WETHVaultV2 for Data; using WETHVaultV2 for List; using SafeMath for uint256; struct Data { IWETHVaultAdapterV2 adapter; uint256 totalDeposited; } struct List { Data[] elements; } /// @dev Gets the total amount of assets deposited in the vault. /// /// @return the total assets. function totalValue(Data storage _self) internal view returns (uint256) { return _self.adapter.totalValue(); } /// @dev Gets the token that the vault accepts. /// /// @return the accepted token. function token(Data storage _self) internal view returns (IWETH) { return IWETH(_self.adapter.token()); } /// @dev Deposits funds from the caller into the vault. /// /// @param _amount the amount of funds to deposit. function deposit(Data storage _self, uint256 _amount) internal returns (uint256) { // Push the token that the vault accepts onto the stack to save gas. IWETH _token = _self.token(); _token.transfer(address(_self.adapter), _amount); _self.adapter.deposit(_amount); _self.totalDeposited = _self.totalDeposited.add(_amount); return _amount; } /// @dev Deposits the entire token balance of the caller into the vault. function depositAll(Data storage _self) internal returns (uint256) { IWETH _token = _self.token(); return _self.deposit(_token.balanceOf(address(this))); } /// @dev Withdraw deposited funds from the vault. /// /// @param _recipient the account to withdraw the tokens to. /// @param _amount the amount of tokens to withdraw. function withdraw(Data storage _self, address _recipient, uint256 _amount, bool _isHarvest) internal returns (uint256, uint256) { (uint256 _withdrawnAmount, uint256 _decreasedValue) = _self.directWithdraw(_recipient, _amount, _isHarvest); _self.totalDeposited = _self.totalDeposited.sub(_decreasedValue); return (_withdrawnAmount, _decreasedValue); } /// @dev Directly withdraw deposited funds from the vault. /// /// @param _recipient the account to withdraw the tokens to. /// @param _amount the amount of tokens to withdraw. function directWithdraw(Data storage _self, address _recipient, uint256 _amount, bool _isHarvest) internal returns (uint256, uint256) { IWETH _token = _self.token(); uint256 _startingBalance = _token.balanceOf(_recipient); uint256 _startingTotalValue = _self.totalValue(); _self.adapter.withdraw(_recipient, _amount, _isHarvest); uint256 _endingBalance = _token.balanceOf(_recipient); uint256 _withdrawnAmount = _endingBalance.sub(_startingBalance); uint256 _endingTotalValue = _self.totalValue(); uint256 _decreasedValue = _startingTotalValue.sub(_endingTotalValue); return (_withdrawnAmount, _decreasedValue); } /// @dev Withdraw all the deposited funds from the vault. /// /// @param _recipient the account to withdraw the tokens to. function withdrawAll(Data storage _self, address _recipient) internal returns (uint256, uint256) { return _self.withdraw(_recipient, _self.totalDeposited, false); } /// @dev Harvests yield from the vault. /// /// @param _recipient the account to withdraw the harvested yield to. function harvest(Data storage _self, address _recipient) internal returns (uint256, uint256) { if (_self.totalValue() <= _self.totalDeposited) { return (0, 0); } uint256 _withdrawAmount = _self.totalValue().sub(_self.totalDeposited); return _self.directWithdraw(_recipient, _withdrawAmount, true); } /// @dev Adds a element to the list. /// /// @param _element the element to add. function push(List storage _self, Data memory _element) internal { _self.elements.push(_element); } /// @dev Gets a element from the list. /// /// @param _index the index in the list. /// /// @return the element at the specified index. function get(List storage _self, uint256 _index) internal view returns (Data storage) { return _self.elements[_index]; } /// @dev Gets the last element in the list. /// /// This function will revert if there are no elements in the list. /// /// @return the last element in the list. function last(List storage _self) internal view returns (Data storage) { return _self.elements[_self.lastIndex()]; } /// @dev Gets the index of the last element in the list. /// /// This function will revert if there are no elements in the list. /// /// @return the index of the last element. function lastIndex(List storage _self) internal view returns (uint256) { uint256 _length = _self.length(); return _length.sub(1, "Vault.List: empty"); } /// @dev Gets the number of elements in the list. /// /// @return the number of elements. function length(List storage _self) internal view returns (uint256) { return _self.elements.length; } } // File contracts/YumEthVesperVault.sol pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; contract YumEthVesperVault is ReentrancyGuard { using CDP for CDP.Data; using FixedPointMath for FixedPointMath.uq192x64; using WETHVaultV2 for WETHVaultV2.Data; using WETHVaultV2 for WETHVaultV2.List; using SafeERC20 for IMintableERC20; using SafeMath for uint256; using Address for address; address public constant ZERO_ADDRESS = address(0); /// @dev Resolution for all fixed point numeric parameters which represent percents. The resolution allows for a /// granularity of 0.01% increments. uint256 public constant PERCENT_RESOLUTION = 10000; /// @dev The minimum value that the collateralization limit can be set to by the governance. This is a safety rail /// to prevent the collateralization from being set to a value which breaks the system. /// /// This value is equal to 100%. /// /// IMPORTANT: This constant is a raw FixedPointMath.uq192x64 value and assumes a resolution of 64 bits. If the /// resolution for the FixedPointMath library changes this constant must change as well. uint256 public constant MINIMUM_COLLATERALIZATION_LIMIT = 1000000000000000000; /// @dev The maximum value that the collateralization limit can be set to by the governance. This is a safety rail /// to prevent the collateralization from being set to a value which breaks the system. /// /// This value is equal to 400%. /// /// IMPORTANT: This constant is a raw FixedPointMath.uq192x64 value and assumes a resolution of 64 bits. If the /// resolution for the FixedPointMath library changes this constant must change as well. uint256 public constant MAXIMUM_COLLATERALIZATION_LIMIT = 4000000000000000000; event GovernanceUpdated( address governance ); event PendingGovernanceUpdated( address pendingGovernance ); event SentinelUpdated( address sentinel ); event TransmuterUpdated( address transmuter ); event RewardsUpdated( address treasury ); event HarvestFeeUpdated( uint256 fee ); event CollateralizationLimitUpdated( uint256 limit ); event EmergencyExitUpdated( bool status ); event ActiveVaultUpdated( IWETHVaultAdapterV2 indexed adapter ); event FundsHarvested( uint256 withdrawnAmount, uint256 decreasedValue ); event FundsRecalled( uint256 indexed vaultId, uint256 withdrawnAmount, uint256 decreasedValue ); event FundsFlushed( uint256 amount ); event TokensDeposited( address indexed account, uint256 amount ); event TokensWithdrawn( address indexed account, uint256 requestedAmount, uint256 withdrawnAmount, uint256 decreasedValue ); event TokensRepaid( address indexed account, uint256 parentAmount, uint256 childAmount ); event TokensLiquidated( address indexed account, uint256 requestedAmount, uint256 withdrawnAmount, uint256 decreasedValue ); /// @dev The token that this contract is using as the parent asset. IWETH public weth; /// @dev The token that this contract is using as the child asset. IMintableERC20 public waEth; /// @dev The address of the account which currently has administrative capabilities over this contract. address public governance; /// @dev The address of the pending governance. address public pendingGovernance; /// @dev The address of the account which can initiate an emergency withdraw of funds in a vault. address public sentinel; /// @dev The address of the contract which will transmute synthetic tokens back into native tokens. address public transmuter; /// @dev The address of the contract which will receive fees. address public rewards; /// @dev The percent of each profitable harvest that will go to the rewards contract. uint256 public harvestFee; /// @dev The total amount the native token deposited into the system that is owned by external users. uint256 public totalDeposited; /// @dev when movemetns are bigger than this number flush is activated. uint256 public flushActivator; /// @dev A flag indicating if the contract has been initialized yet. bool public initialized; /// @dev A flag indicating if deposits and flushes should be halted and if all parties should be able to recall /// from the active vault. bool public emergencyExit; /// @dev The context shared between the CDPs. CDP.Context private _ctx; /// @dev A mapping of all of the user CDPs. If a user wishes to have multiple CDPs they will have to either /// create a new address or set up a proxy contract that interfaces with this contract. mapping(address => CDP.Data) private _cdps; /// @dev A list of all of the vaults. The last element of the list is the vault that is currently being used for /// deposits and withdraws. Vaults before the last element are considered inactive and are expected to be cleared. WETHVaultV2.List private _vaults; /// @dev The address of the link oracle. address public _linkGasOracle; /// @dev The minimum returned amount needed to be on peg according to the oracle. uint256 public pegMinimum; constructor( IWETH _weth, IMintableERC20 _waEth, address _governance, address _sentinel ) public { require(_governance != ZERO_ADDRESS, "YumEthVesperVault: governance address cannot be 0x0."); require(_sentinel != ZERO_ADDRESS, "YumEthVesperVault: sentinel address cannot be 0x0."); weth = _weth; waEth = _waEth; governance = _governance; sentinel = _sentinel; flushActivator = 100000 ether;// change for non 18 digit tokens uint256 COLL_LIMIT = MINIMUM_COLLATERALIZATION_LIMIT.mul(2); _ctx.collateralizationLimit = FixedPointMath.uq192x64(COLL_LIMIT); _ctx.accumulatedYieldWeight = FixedPointMath.uq192x64(0); } /// @dev Sets the pending governance. /// /// This function reverts if the new pending governance is the zero address or the caller is not the current /// governance. This is to prevent the contract governance being set to the zero address which would deadlock /// privileged contract functionality. /// /// @param _pendingGovernance the new pending governance. function setPendingGovernance(address _pendingGovernance) external onlyGov { require(_pendingGovernance != ZERO_ADDRESS, "YumEthVesperVault: governance address cannot be 0x0."); pendingGovernance = _pendingGovernance; emit PendingGovernanceUpdated(_pendingGovernance); } /// @dev Accepts the role as governance. /// /// This function reverts if the caller is not the new pending governance. function acceptGovernance() external { require(msg.sender == pendingGovernance,"sender is not pendingGovernance"); address _pendingGovernance = pendingGovernance; governance = _pendingGovernance; emit GovernanceUpdated(_pendingGovernance); } function setSentinel(address _sentinel) external onlyGov { require(_sentinel != ZERO_ADDRESS, "YumEthVesperVault: sentinel address cannot be 0x0."); sentinel = _sentinel; emit SentinelUpdated(_sentinel); } /// @dev Sets the transmuter. /// /// This function reverts if the new transmuter is the zero address or the caller is not the current governance. /// /// @param _transmuter the new transmuter. function setTransmuter(address _transmuter) external onlyGov { // Check that the transmuter address is not the zero address. Setting the transmuter to the zero address would break // transfers to the address because of `safeTransfer` checks. require(_transmuter != ZERO_ADDRESS, "YumEthVesperVault: transmuter address cannot be 0x0."); transmuter = _transmuter; emit TransmuterUpdated(_transmuter); } /// @dev Sets the flushActivator. /// /// @param _flushActivator the new flushActivator. function setFlushActivator(uint256 _flushActivator) external onlyGov { flushActivator = _flushActivator; } /// @dev Sets the rewards contract. /// /// This function reverts if the new rewards contract is the zero address or the caller is not the current governance. /// /// @param _rewards the new rewards contract. function setRewards(address _rewards) external onlyGov { // Check that the rewards address is not the zero address. Setting the rewards to the zero address would break // transfers to the address because of `safeTransfer` checks. require(_rewards != ZERO_ADDRESS, "YumEthVesperVault: rewards address cannot be 0x0."); rewards = _rewards; emit RewardsUpdated(_rewards); } /// @dev Sets the harvest fee. /// /// This function reverts if the caller is not the current governance. /// /// @param _harvestFee the new harvest fee. function setHarvestFee(uint256 _harvestFee) external onlyGov { // Check that the harvest fee is within the acceptable range. Setting the harvest fee greater than 100% could // potentially break internal logic when calculating the harvest fee. require(_harvestFee <= PERCENT_RESOLUTION, "YumEthVesperVault: harvest fee above maximum."); harvestFee = _harvestFee; emit HarvestFeeUpdated(_harvestFee); } /// @dev Sets the collateralization limit. /// /// This function reverts if the caller is not the current governance or if the collateralization limit is outside /// of the accepted bounds. /// /// @param _limit the new collateralization limit. function setCollateralizationLimit(uint256 _limit) external onlyGov { require(_limit >= MINIMUM_COLLATERALIZATION_LIMIT, "YumEthVesperVault: collateralization limit below minimum."); require(_limit <= MAXIMUM_COLLATERALIZATION_LIMIT, "YumEthVesperVault: collateralization limit above maximum."); _ctx.collateralizationLimit = FixedPointMath.uq192x64(_limit); emit CollateralizationLimitUpdated(_limit); } /// @dev Set oracle. function setOracleAddress(address Oracle, uint256 peg) external onlyGov { _linkGasOracle = Oracle; pegMinimum = peg; } /// @dev Sets if the contract should enter emergency exit mode. /// /// @param _emergencyExit if the contract should enter emergency exit mode. function setEmergencyExit(bool _emergencyExit) external { require(msg.sender == governance || msg.sender == sentinel, ""); emergencyExit = _emergencyExit; emit EmergencyExitUpdated(_emergencyExit); } /// @dev Gets the collateralization limit. /// /// The collateralization limit is the minimum ratio of collateral to debt that is allowed by the system. /// /// @return the collateralization limit. function collateralizationLimit() external view returns (FixedPointMath.uq192x64 memory) { return _ctx.collateralizationLimit; } /// @dev Initializes the contract. /// /// This function checks that the transmuter and rewards have been set and sets up the active vault. /// /// @param _adapter the vault adapter of the active vault. function initialize(IWETHVaultAdapterV2 _adapter) external onlyGov { require(!initialized, "YumEthVesperVault: already initialized"); require(transmuter != ZERO_ADDRESS, "YumEthVesperVault: cannot initialize transmuter address to 0x0"); require(rewards != ZERO_ADDRESS, "YumEthVesperVault: cannot initialize rewards address to 0x0"); _updateActiveVault(_adapter); initialized = true; } /// @dev Migrates the system to a new vault. /// /// This function reverts if the vault adapter is the zero address, if the token that the vault adapter accepts /// is not the token that this contract defines as the parent asset, or if the contract has not yet been initialized. /// /// @param _adapter the adapter for the vault the system will migrate to. function migrate(IWETHVaultAdapterV2 _adapter) external expectInitialized onlyGov { _updateActiveVault(_adapter); } /// @dev Harvests yield from a vault. /// /// @param _vaultId the identifier of the vault to harvest from. /// /// @return the amount of funds that were harvested from the vault. function harvest(uint256 _vaultId) external expectInitialized returns (uint256, uint256) { WETHVaultV2.Data storage _vault = _vaults.get(_vaultId); (uint256 _harvestedAmount, uint256 _decreasedValue) = _vault.harvest(address(this)); if (_harvestedAmount > 0) { uint256 _feeAmount = _harvestedAmount.mul(harvestFee).div(PERCENT_RESOLUTION); uint256 _distributeAmount = _harvestedAmount.sub(_feeAmount); FixedPointMath.uq192x64 memory _weight = FixedPointMath.fromU256(_distributeAmount).div(totalDeposited); _ctx.accumulatedYieldWeight = _ctx.accumulatedYieldWeight.add(_weight); if (_feeAmount > 0) { weth.transfer(rewards, _feeAmount); } if (_distributeAmount > 0) { _distributeToTransmuter(_distributeAmount); } } emit FundsHarvested(_harvestedAmount, _decreasedValue); return (_harvestedAmount, _decreasedValue); } /// @dev Recalls an amount of deposited funds from a vault to this contract. /// /// @param _vaultId the identifier of the recall funds from. /// /// @return the amount of funds that were recalled from the vault to this contract and the decreased vault value. function recall(uint256 _vaultId, uint256 _amount) external nonReentrant expectInitialized returns (uint256, uint256) { return _recallFunds(_vaultId, _amount); } /// @dev Recalls all the deposited funds from a vault to this contract. /// /// @param _vaultId the identifier of the recall funds from. /// /// @return the amount of funds that were recalled from the vault to this contract and the decreased vault value. function recallAll(uint256 _vaultId) external nonReentrant expectInitialized returns (uint256, uint256) { WETHVaultV2.Data storage _vault = _vaults.get(_vaultId); return _recallFunds(_vaultId, _vault.totalDeposited); } /// @dev Flushes buffered tokens to the active vault. /// /// This function reverts if an emergency exit is active. This is in place to prevent the potential loss of /// additional funds. /// /// @return the amount of tokens flushed to the active vault. function flush() external nonReentrant expectInitialized returns (uint256) { // Prevent flushing to the active vault when an emergency exit is enabled to prevent potential loss of funds if // the active vault is poisoned for any reason. require(!emergencyExit, "emergency pause enabled"); return flushActiveVault(); } /// @dev Internal function to flush buffered tokens to the active vault. /// /// This function reverts if an emergency exit is active. This is in place to prevent the potential loss of /// additional funds. /// /// @return the amount of tokens flushed to the active vault. function flushActiveVault() internal returns (uint256) { WETHVaultV2.Data storage _activeVault = _vaults.last(); uint256 _depositedAmount = _activeVault.depositAll(); emit FundsFlushed(_depositedAmount); return _depositedAmount; } /// @dev Handle incoming ETH to the contract address. receive() external payable { deposit(); } /// @dev Wraps ETH in WETH and deposits into a CDP /// /// This function reverts if an emergency exit is active. This is in place to prevent the potential loss of /// additional funds. function deposit() public payable nonReentrant noContractAllowed expectInitialized { require(!emergencyExit, "emergency pause enabled"); // Wraps ETH in WETH weth.deposit{value: msg.value}(); _deposit(msg.value, msg.sender); } /// @dev Deposits WETH into a CDP. /// /// This function reverts if an emergency exit is active. This is in place to prevent the potential loss of /// additional funds. /// /// @param _amount the amount of collateral to deposit. function deposit(uint256 _amount) external nonReentrant noContractAllowed expectInitialized { require(!emergencyExit, "emergency pause enabled"); weth.transferFrom(msg.sender, address(this), _amount); _deposit(_amount, msg.sender); } /// @dev Handle deposit logic /// /// @param _amount the amount of the WETH to deposit. /// @param user the user's address function _deposit(uint256 _amount, address user) internal { CDP.Data storage _cdp = _cdps[user]; _cdp.update(_ctx); if(_amount >= flushActivator) { flushActiveVault(); } totalDeposited = totalDeposited.add(_amount); _cdp.totalDeposited = _cdp.totalDeposited.add(_amount); _cdp.lastDeposit = block.number; emit TokensDeposited(user, _amount); } /// @dev Attempts to withdraw part of a CDP's collateral. /// /// This function reverts if a deposit into the CDP was made in the same block. This is to prevent flash loan attacks /// on other internal or external systems. /// /// @param _amount the amount of collateral to withdraw. function withdraw(uint256 _amount) external nonReentrant noContractAllowed expectInitialized returns (uint256, uint256) { CDP.Data storage _cdp = _cdps[msg.sender]; require(block.number > _cdp.lastDeposit, ""); _cdp.update(_ctx); (uint256 _withdrawnAmount, uint256 _decreasedValue) = _withdrawFundsTo(msg.sender, _amount); _cdp.totalDeposited = _cdp.totalDeposited.sub(_decreasedValue, "Exceeds withdrawable amount"); _cdp.checkHealth(_ctx, "Action blocked: unhealthy collateralization ratio"); emit TokensWithdrawn(msg.sender, _amount, _withdrawnAmount, _decreasedValue); return (_withdrawnAmount, _decreasedValue); } /// @dev Wraps ETH in WETH and repays debt with it function repay() external payable nonReentrant noContractAllowed onLinkCheck expectInitialized { CDP.Data storage _cdp = _cdps[msg.sender]; _cdp.update(_ctx); // Wraps ETH in WETH weth.deposit{value: msg.value}(); _distributeToTransmuter(msg.value); uint256 _totalAmount = msg.value; _cdp.totalDebt = _cdp.totalDebt.sub(_totalAmount, ""); emit TokensRepaid(msg.sender, msg.value, 0); } /// @dev Repays debt with the native and or synthetic token. /// /// An approval is required to transfer native tokens to the transmuter. function repay(uint256 _parentAmount, uint256 _childAmount) external nonReentrant noContractAllowed onLinkCheck expectInitialized { CDP.Data storage _cdp = _cdps[msg.sender]; _cdp.update(_ctx); if (_parentAmount > 0) { weth.transferFrom(msg.sender, address(this), _parentAmount); _distributeToTransmuter(_parentAmount); } if (_childAmount > 0) { waEth.burnFrom(msg.sender, _childAmount); //lower debt cause burn waEth.lowerHasMinted(_childAmount); } uint256 _totalAmount = _parentAmount.add(_childAmount); _cdp.totalDebt = _cdp.totalDebt.sub(_totalAmount, ""); emit TokensRepaid(msg.sender, _parentAmount, _childAmount); } /// @dev Attempts to liquidate part of a CDP's collateral to pay back its debt. /// /// @param _amount the amount of collateral to attempt to liquidate. function liquidate(uint256 _amount) external nonReentrant noContractAllowed onLinkCheck expectInitialized returns (uint256, uint256) { CDP.Data storage _cdp = _cdps[msg.sender]; _cdp.update(_ctx); // don't attempt to liquidate more than is possible if(_amount > _cdp.totalDebt){ _amount = _cdp.totalDebt; } (uint256 _withdrawnAmount, uint256 _decreasedValue) = _withdrawFundsTo(address(this), _amount); //changed to new transmuter compatibillity _distributeToTransmuter(_withdrawnAmount); _cdp.totalDeposited = _cdp.totalDeposited.sub(_decreasedValue, ""); _cdp.totalDebt = _cdp.totalDebt.sub(_withdrawnAmount, ""); emit TokensLiquidated(msg.sender, _amount, _withdrawnAmount, _decreasedValue); return (_withdrawnAmount, _decreasedValue); } /// @dev Mints synthetic tokens by either claiming credit or increasing the debt. /// /// Claiming credit will take priority over increasing the debt. /// /// This function reverts if the debt is increased and the CDP health check fails. /// /// @param _amount the amount of alchemic tokens to borrow. function mint(uint256 _amount) external nonReentrant noContractAllowed onLinkCheck expectInitialized { CDP.Data storage _cdp = _cdps[msg.sender]; _cdp.update(_ctx); uint256 _totalCredit = _cdp.totalCredit; if (_totalCredit < _amount) { uint256 _remainingAmount = _amount.sub(_totalCredit); _cdp.totalDebt = _cdp.totalDebt.add(_remainingAmount); _cdp.totalCredit = 0; _cdp.checkHealth(_ctx, "YumEthVesperVault: Loan-to-value ratio breached"); } else { _cdp.totalCredit = _totalCredit.sub(_amount); } waEth.mint(msg.sender, _amount); } /// @dev Gets the number of vaults in the vault list. /// /// @return the vault count. function vaultCount() external view returns (uint256) { return _vaults.length(); } /// @dev Get the adapter of a vault. /// /// @param _vaultId the identifier of the vault. /// /// @return the vault adapter. function getVaultAdapter(uint256 _vaultId) external view returns (IWETHVaultAdapterV2) { WETHVaultV2.Data storage _vault = _vaults.get(_vaultId); return _vault.adapter; } /// @dev Get the total amount of the parent asset that has been deposited into a vault. /// /// @param _vaultId the identifier of the vault. /// /// @return the total amount of deposited tokens. function getVaultTotalDeposited(uint256 _vaultId) external view returns (uint256) { WETHVaultV2.Data storage _vault = _vaults.get(_vaultId); return _vault.totalDeposited; } /// @dev Get the total amount of collateral deposited into a CDP. /// /// @param _account the user account of the CDP to query. /// /// @return the deposited amount of tokens. function getCdpTotalDeposited(address _account) external view returns (uint256) { CDP.Data storage _cdp = _cdps[_account]; return _cdp.totalDeposited; } /// @dev Get the total amount of alchemic tokens borrowed from a CDP. /// /// @param _account the user account of the CDP to query. /// /// @return the borrowed amount of tokens. function getCdpTotalDebt(address _account) external view returns (uint256) { CDP.Data storage _cdp = _cdps[_account]; return _cdp.getUpdatedTotalDebt(_ctx); } /// @dev Get the total amount of credit that a CDP has. /// /// @param _account the user account of the CDP to query. /// /// @return the amount of credit. function getCdpTotalCredit(address _account) external view returns (uint256) { CDP.Data storage _cdp = _cdps[_account]; return _cdp.getUpdatedTotalCredit(_ctx); } /// @dev Gets the last recorded block of when a user made a deposit into their CDP. /// /// @param _account the user account of the CDP to query. /// /// @return the block number of the last deposit. function getCdpLastDeposit(address _account) external view returns (uint256) { CDP.Data storage _cdp = _cdps[_account]; return _cdp.lastDeposit; } /// @dev sends tokens to the transmuter /// /// benefit of great nation of transmuter function _distributeToTransmuter(uint256 amount) internal { weth.approve(transmuter,amount); ITransmuter(transmuter).distribute(address(this),amount); // lower debt cause of 'burn' waEth.lowerHasMinted(amount); } /// @dev Checks that parent token is on peg. /// /// This is used over a modifier limit of pegged interactions. modifier onLinkCheck() { if(pegMinimum > 0 ){ uint256 oracleAnswer = uint256(IChainlink(_linkGasOracle).latestAnswer()); require(oracleAnswer > pegMinimum, "off peg limitation"); } _; } /// @dev Checks that caller is not a eoa. /// /// This is used to prevent contracts from interacting. modifier noContractAllowed() { require(!address(msg.sender).isContract() && msg.sender == tx.origin, "Sorry we do not accept contract!"); _; } /// @dev Checks that the contract is in an initialized state. /// /// This is used over a modifier to reduce the size of the contract modifier expectInitialized() { require(initialized, "YumEthVesperVault: not initialized."); _; } /// @dev Checks that the current message sender or caller is a specific address. /// /// @param _expectedCaller the expected caller. function _expectCaller(address _expectedCaller) internal { require(msg.sender == _expectedCaller, ""); } /// @dev Checks that the current message sender or caller is the governance address. /// /// modifier onlyGov() { require(msg.sender == governance, "YumEthVesperVault: only governance."); _; } /// @dev Updates the active vault. /// /// This function reverts if the vault adapter is the zero address, if the token that the vault adapter accepts /// is not the token that this contract defines as the parent asset, or if the contract has not yet been initialized. /// /// @param _adapter the adapter for the new active vault. function _updateActiveVault(IWETHVaultAdapterV2 _adapter) internal { require(_adapter != IWETHVaultAdapterV2(ZERO_ADDRESS), "YumEthVesperVault: active vault address cannot be 0x0."); require(_adapter.token() == weth, "YumEthVesperVault: token mismatch."); _vaults.push(WETHVaultV2.Data({ adapter: _adapter, totalDeposited: 0 })); emit ActiveVaultUpdated(_adapter); } /// @dev Recalls an amount of funds from a vault to this contract. /// /// @param _vaultId the identifier of the recall funds from. /// @param _amount the amount of funds to recall from the vault. /// /// @return the amount of funds that were recalled from the vault to this contract and the decreased vault value. function _recallFunds(uint256 _vaultId, uint256 _amount) internal returns (uint256, uint256) { require(emergencyExit || msg.sender == governance || _vaultId != _vaults.lastIndex(), "YumEthVesperVault: not an emergency, not governance, and user does not have permission to recall funds from active vault"); WETHVaultV2.Data storage _vault = _vaults.get(_vaultId); (uint256 _withdrawnAmount, uint256 _decreasedValue) = _vault.withdraw(address(this), _amount, false); emit FundsRecalled(_vaultId, _withdrawnAmount, _decreasedValue); return (_withdrawnAmount, _decreasedValue); } /// @dev Attempts to withdraw funds from the active vault to the recipient. /// /// Funds will be first withdrawn from this contracts balance and then from the active vault. This function /// is different from `recallFunds` in that it reduces the total amount of deposited tokens by the decreased /// value of the vault. /// /// @param _recipient the account to withdraw the funds to. /// @param _amount the amount of funds to withdraw. function _withdrawFundsTo(address _recipient, uint256 _amount) internal returns (uint256, uint256) { // Pull the funds from the buffer. uint256 _bufferedAmount = Math.min(_amount, weth.balanceOf(address(this))); if (_recipient != address(this)) { weth.transfer(_recipient, _bufferedAmount); } uint256 _totalWithdrawn = _bufferedAmount; uint256 _totalDecreasedValue = _bufferedAmount; uint256 _remainingAmount = _amount.sub(_bufferedAmount); // Pull the remaining funds from the active vault. if (_remainingAmount > 0) { WETHVaultV2.Data storage _activeVault = _vaults.last(); (uint256 _withdrawAmount, uint256 _decreasedValue) = _activeVault.withdraw( _recipient, _remainingAmount, false ); _totalWithdrawn = _totalWithdrawn.add(_withdrawAmount); _totalDecreasedValue = _totalDecreasedValue.add(_decreasedValue); } totalDeposited = totalDeposited.sub(_totalDecreasedValue); return (_totalWithdrawn, _totalDecreasedValue); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IWETH","name":"_weth","type":"address"},{"internalType":"contract IMintableERC20","name":"_waEth","type":"address"},{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_sentinel","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IWETHVaultAdapterV2","name":"adapter","type":"address"}],"name":"ActiveVaultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"CollateralizationLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"EmergencyExitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsFlushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"FundsHarvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"FundsRecalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"GovernanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"HarvestFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingGovernance","type":"address"}],"name":"PendingGovernanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"RewardsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sentinel","type":"address"}],"name":"SentinelUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"TokensLiquidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"parentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"childAmount","type":"uint256"}],"name":"TokensRepaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"transmuter","type":"address"}],"name":"TransmuterUpdated","type":"event"},{"inputs":[],"name":"MAXIMUM_COLLATERALIZATION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_COLLATERALIZATION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_RESOLUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_linkGasOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collateralizationLimit","outputs":[{"components":[{"internalType":"uint256","name":"x","type":"uint256"}],"internalType":"struct FixedPointMath.uq192x64","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"emergencyExit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flush","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flushActivator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getCdpLastDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getCdpTotalCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getCdpTotalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getCdpTotalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"getVaultAdapter","outputs":[{"internalType":"contract IWETHVaultAdapterV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"getVaultTotalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IWETHVaultAdapterV2","name":"_adapter","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"liquidate","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWETHVaultAdapterV2","name":"_adapter","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pegMinimum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recall","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"recallAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"repay","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_parentAmount","type":"uint256"},{"internalType":"uint256","name":"_childAmount","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sentinel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setCollateralizationLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_emergencyExit","type":"bool"}],"name":"setEmergencyExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_flushActivator","type":"uint256"}],"name":"setFlushActivator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_harvestFee","type":"uint256"}],"name":"setHarvestFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Oracle","type":"address"},{"internalType":"uint256","name":"peg","type":"uint256"}],"name":"setOracleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pendingGovernance","type":"address"}],"name":"setPendingGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewards","type":"address"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sentinel","type":"address"}],"name":"setSentinel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_transmuter","type":"address"}],"name":"setTransmuter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transmuter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"waEth","outputs":[{"internalType":"contract IMintableERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003d0838038062003d0883398101604081905262000034916200018a565b60016000556001600160a01b0382166200006b5760405162461bcd60e51b81526004016200006290620001f1565b60405180910390fd5b6001600160a01b038116620000945760405162461bcd60e51b815260040162000062906200028f565b600180546001600160a01b03199081166001600160a01b03878116919091179092556002805482168684161781556003805483168685161790556005805490921692841692909217905569152d02c7e14af6800000600a556000906200011090670de0b6b3a76400009062000141602090811b6200203817901c565b604080516020808201835290839052600c9290925580519182019052600090819052600d5550620002fa9350505050565b600082620001525750600062000184565b828202828482816200016057fe5b0414620001815760405162461bcd60e51b815260040162000062906200024e565b90505b92915050565b60008060008060808587031215620001a0578384fd5b8451620001ad81620002e1565b6020860151909450620001c081620002e1565b6040860151909350620001d381620002e1565b6060860151909250620001e681620002e1565b939692955090935050565b60208082526034908201527f59756d4574685665737065725661756c743a20676f7665726e616e636520616460408201527f64726573732063616e6e6f74206265203078302e000000000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526032908201527f59756d4574685665737065725661756c743a2073656e74696e656c206164647260408201527132b9b99031b0b73737ba10313290183c181760711b606082015260800190565b6001600160a01b0381168114620002f757600080fd5b50565b6139fe806200030a6000396000f3fe6080604052600436106102b25760003560e01c8063792b55b611610175578063c4d66de8116100dc578063f0d787a311610095578063faa4567f1161006f578063faa4567f146107a5578063fc00e8a0146107ba578063fefdc5d1146107da578063ff50abdc146107fa576102c1565b8063f0d787a314610766578063f39c38a01461077b578063f58c251c14610790576102c1565b8063c4d66de8146106be578063ce5494bb146106de578063d0e30db0146106fe578063d8aed14514610706578063ddc6326214610726578063ec38a86214610746576102c1565b8063a7c6a1001161012e578063a7c6a10014610614578063aa6e043414610629578063aaf1666014610649578063adb4a9ad14610669578063b596291714610689578063b6b55f251461069e576102c1565b8063792b55b61461056a5780639a9af2211461058a5780639ec5a894146105aa578063a005fda3146105bf578063a0712d68146105d4578063a1e401a9146105f4576102c1565b8063415f12401161021957806353ffa18b116101d257806353ffa18b146104d65780635641ec03146104f65780635a9b5e921461050b5780635aa6e6751461052b5780636b9f96ea146105405780637239d2b914610555576102c1565b8063415f12401461042a57806345ee07551461044a57806345f867b31461046a5780634aaf7c651461047f5780634c3a8e02146104a1578063538ba4f9146104c1576102c1565b80632670fdd81161026b5780632670fdd8146103885780632e1a7d4d146103b557806330d4d190146103e35780633847f038146103f85780633fc8cef31461040d578063402d888314610422576102c1565b80630510111e146102c657806309dac061146102f15780630abb603514610311578063158ef93e1461033157806322c37b7514610353578063238efcbc14610373576102c1565b366102c1576102bf61080f565b005b600080fd5b3480156102d257600080fd5b506102db610935565b6040516102e89190613918565b60405180910390f35b3480156102fd57600080fd5b506102bf61030c36600461303a565b610941565b34801561031d57600080fd5b506102bf61032c36600461303a565b6109e7565b34801561033d57600080fd5b50610346610a82565b6040516102e8919061319a565b34801561035f57600080fd5b506102bf61036e3660046130ed565b610a8b565b34801561037f57600080fd5b506102bf610aba565b34801561039457600080fd5b506103a86103a33660046130ed565b610b35565b6040516102e89190613126565b3480156103c157600080fd5b506103d56103d03660046130ed565b610b54565b6040516102e8929190613921565b3480156103ef57600080fd5b506102db610ce2565b34801561040457600080fd5b506102db610cee565b34801561041957600080fd5b506103a8610cf4565b6102bf610d03565b34801561043657600080fd5b506103d56104453660046130ed565b610f21565b34801561045657600080fd5b506102bf610465366004613081565b611109565b34801561047657600080fd5b506102db61118b565b34801561048b57600080fd5b50610494611191565b6040516102e8919061390e565b3480156104ad57600080fd5b506103d56104bc3660046130ed565b6111ad565b3480156104cd57600080fd5b506103a8611227565b3480156104e257600080fd5b506102bf6104f13660046130ed565b61122c565b34801561050257600080fd5b506103466112e6565b34801561051757600080fd5b506102bf610526366004613056565b6112f4565b34801561053757600080fd5b506103a8611344565b34801561054c57600080fd5b506102db611353565b34801561056157600080fd5b506103a86113d9565b34801561057657600080fd5b506102bf6105853660046130ed565b6113e8565b34801561059657600080fd5b506102db6105a536600461303a565b611469565b3480156105b657600080fd5b506103a8611487565b3480156105cb57600080fd5b506103a8611496565b3480156105e057600080fd5b506102bf6105ef3660046130ed565b6114a5565b34801561060057600080fd5b506102db61060f36600461303a565b6116c6565b34801561062057600080fd5b506102db6116e1565b34801561063557600080fd5b506102db61064436600461303a565b6116f2565b34801561065557600080fd5b506102db6106643660046130ed565b61171c565b34801561067557600080fd5b506102bf61068436600461303a565b611735565b34801561069557600080fd5b506102db6117d0565b3480156106aa57600080fd5b506102bf6106b93660046130ed565b6117d6565b3480156106ca57600080fd5b506102bf6106d936600461303a565b611912565b3480156106ea57600080fd5b506102bf6106f936600461303a565b6119c8565b6102bf61080f565b34801561071257600080fd5b506102bf610721366004613105565b611a20565b34801561073257600080fd5b506103d56107413660046130ed565b611d44565b34801561075257600080fd5b506102bf61076136600461303a565b611eea565b34801561077257600080fd5b506102db611f85565b34801561078757600080fd5b506103a8611f8b565b34801561079c57600080fd5b506103a8611f9a565b3480156107b157600080fd5b506103a8611fa9565b3480156107c657600080fd5b506102db6107d536600461303a565b611fb8565b3480156107e657600080fd5b506103d56107f5366004613105565b611fdb565b34801561080657600080fd5b506102db612032565b6002600054141561083b5760405162461bcd60e51b81526004016108329061384e565b60405180910390fd5b60026000556108493361207b565b15801561085557503332145b6108715760405162461bcd60e51b8152600401610832906132e0565b600b5460ff166108935760405162461bcd60e51b8152600401610832906134d6565b600b54610100900460ff16156108bb5760405162461bcd60e51b8152600401610832906137ca565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561090b57600080fd5b505af115801561091f573d6000803e3d6000fd5b505050505061092e3433612081565b6001600055565b673782dace9d90000081565b6003546001600160a01b0316331461096b5760405162461bcd60e51b815260040161083290613640565b6001600160a01b0381166109915760405162461bcd60e51b81526004016108329061355a565b600580546001600160a01b0319166001600160a01b0383161790556040517fdc117600f93282860144d2cd2745f8e2e15c3ca2a32b4290c30f7cd1ae7ffcb9906109dc908390613126565b60405180910390a150565b6003546001600160a01b03163314610a115760405162461bcd60e51b815260040161083290613640565b6001600160a01b038116610a375760405162461bcd60e51b8152600401610832906131f8565b600480546001600160a01b0319166001600160a01b0383161790556040517fc9e2377236eab4280090ce8f2317332649736d92f00dcf20a8dd6684ec5e7839906109dc908390613126565b600b5460ff1681565b6003546001600160a01b03163314610ab55760405162461bcd60e51b815260040161083290613640565b600a55565b6004546001600160a01b03163314610ae45760405162461bcd60e51b8152600401610832906135ac565b600454600380546001600160a01b0319166001600160a01b0390921691821790556040517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab906109dc908390613126565b600080610b43600f84612123565b546001600160a01b03169392505050565b60008060026000541415610b7a5760405162461bcd60e51b81526004016108329061384e565b6002600055610b883361207b565b158015610b9457503332145b610bb05760405162461bcd60e51b8152600401610832906132e0565b600b5460ff16610bd25760405162461bcd60e51b8152600401610832906134d6565b336000908152600e6020526040902060038101544311610c045760405162461bcd60e51b815260040161083290613731565b610c0f81600c61214a565b600080610c1c33876121a6565b60408051808201909152601b81527f4578636565647320776974686472617761626c6520616d6f756e74000000000060208201528554929450909250610c6491908390612341565b835560408051606081019091526031808252610c8d91600c91613998602083013985919061236d565b336001600160a01b03167fb3ad69dc1d2c6b1f5f5b0927ffd8ee8f1437a156253c8f6dccc75e6f8e4fd38b878484604051610cca9392919061392f565b60405180910390a26001600055909590945092505050565b670de0b6b3a764000081565b60115481565b6001546001600160a01b031681565b60026000541415610d265760405162461bcd60e51b81526004016108329061384e565b6002600055610d343361207b565b158015610d4057503332145b610d5c5760405162461bcd60e51b8152600401610832906132e0565b60115415610e0657601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015610da957600080fd5b505afa158015610dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de191906130d5565b90506011548111610e045760405162461bcd60e51b815260040161083290613885565b505b600b5460ff16610e285760405162461bcd60e51b8152600401610832906134d6565b336000908152600e60205260409020610e4281600c61214a565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e9257600080fd5b505af1158015610ea6573d6000803e3d6000fd5b5050505050610eb43461239c565b60408051602081019091526000815260018201543491610ed691908390612341565b600183015560405133907fbade234341a40ca3c71df59b3ca02b8bb65b491a098af970953228b4f4a5d38f90610f10903490600090613921565b60405180910390a250506001600055565b60008060026000541415610f475760405162461bcd60e51b81526004016108329061384e565b6002600055610f553361207b565b158015610f6157503332145b610f7d5760405162461bcd60e51b8152600401610832906132e0565b6011541561102757601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015610fca57600080fd5b505afa158015610fde573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100291906130d5565b905060115481116110255760405162461bcd60e51b815260040161083290613885565b505b600b5460ff166110495760405162461bcd60e51b8152600401610832906134d6565b336000908152600e6020526040902061106381600c61214a565b806001015484111561107757806001015493505b60008061108430876121a6565b915091506110918261239c565b60408051602081019091526000815283546110ad918390612341565b835560408051602081019091526000815260018401546110ce918490612341565b600184015560405133907f3ea051727656be6fd11c2260f244f29ff3c70d1fb077bfa73e89d554e9bb95c790610cca9089908690869061392f565b6003546001600160a01b031633148061112c57506005546001600160a01b031633145b6111485760405162461bcd60e51b815260040161083290613731565b600b805461ff001916610100831515021790556040517ff0064f2efd0da4bc63eecf2e75590fe8a308eaa526a51c334e50eec09a711049906109dc90839061319a565b61271081565b611199613027565b506040805160208101909152600c54815290565b600080600260005414156111d35760405162461bcd60e51b81526004016108329061384e565b6002600055600b5460ff166111fa5760405162461bcd60e51b8152600401610832906134d6565b6000611207600f85612123565b90506112178482600101546124ee565b6001600055909590945092505050565b600081565b6003546001600160a01b031633146112565760405162461bcd60e51b815260040161083290613640565b670de0b6b3a764000081101561127e5760405162461bcd60e51b815260040161083290613683565b673782dace9d9000008111156112a65760405162461bcd60e51b8152600401610832906135e3565b60408051602081018252829052600c829055517ff78180bc708b1292177c888900951cd66a39faf48dc7b6d111e93285dbbe55a0906109dc908390613918565b600b54610100900460ff1681565b6003546001600160a01b0316331461131e5760405162461bcd60e51b815260040161083290613640565b601080546001600160a01b0319166001600160a01b039390931692909217909155601155565b6003546001600160a01b031681565b6000600260005414156113785760405162461bcd60e51b81526004016108329061384e565b6002600055600b5460ff1661139f5760405162461bcd60e51b8152600401610832906134d6565b600b54610100900460ff16156113c75760405162461bcd60e51b8152600401610832906137ca565b6113cf6125ab565b9050600160005590565b6006546001600160a01b031681565b6003546001600160a01b031633146114125760405162461bcd60e51b815260040161083290613640565b6127108111156114345760405162461bcd60e51b815260040161083290613801565b60088190556040517fc36862a253ff42cc71f4f200d3c62e8e5eaaece01041fc6900aeace64ade72a8906109dc908390613918565b6001600160a01b03166000908152600e602052604090206003015490565b6007546001600160a01b031681565b6010546001600160a01b031681565b600260005414156114c85760405162461bcd60e51b81526004016108329061384e565b60026000556114d63361207b565b1580156114e257503332145b6114fe5760405162461bcd60e51b8152600401610832906132e0565b601154156115a857601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b15801561154b57600080fd5b505afa15801561155f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158391906130d5565b905060115481116115a65760405162461bcd60e51b815260040161083290613885565b505b600b5460ff166115ca5760405162461bcd60e51b8152600401610832906134d6565b336000908152600e602052604090206115e481600c61214a565b6002810154828110156116485760006115fd8483612604565b600184015490915061160f908261262c565b6001840155600060028401556040805160608101909152602f80825261164291600c91613969602083013985919061236d565b50611658565b6116528184612604565b60028301555b6002546040516340c10f1960e01b81526001600160a01b03909116906340c10f199061168a903390879060040161315e565b600060405180830381600087803b1580156116a457600080fd5b505af11580156116b8573d6000803e3d6000fd5b505060016000555050505050565b6001600160a01b03166000908152600e602052604090205490565b60006116ed600f612651565b905090565b6001600160a01b0381166000908152600e6020526040812061171581600c612655565b9392505050565b60008061172a600f84612123565b600101549392505050565b6003546001600160a01b0316331461175f5760405162461bcd60e51b815260040161083290613640565b6001600160a01b0381166117855760405162461bcd60e51b815260040161083290613482565b600680546001600160a01b0319166001600160a01b0383161790556040517fe42bb1780117f5788c6e0042e955291223819875891ddf465b8e4fbb85a933e9906109dc908390613126565b60085481565b600260005414156117f95760405162461bcd60e51b81526004016108329061384e565b60026000556118073361207b565b15801561181357503332145b61182f5760405162461bcd60e51b8152600401610832906132e0565b600b5460ff166118515760405162461bcd60e51b8152600401610832906134d6565b600b54610100900460ff16156118795760405162461bcd60e51b8152600401610832906137ca565b6001546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906118ad9033903090869060040161313a565b602060405180830381600087803b1580156118c757600080fd5b505af11580156118db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ff919061309d565b5061190a8133612081565b506001600055565b6003546001600160a01b0316331461193c5760405162461bcd60e51b815260040161083290613640565b600b5460ff161561195f5760405162461bcd60e51b815260040161083290613742565b6006546001600160a01b03166119875760405162461bcd60e51b81526004016108329061324c565b6007546001600160a01b03166119af5760405162461bcd60e51b8152600401610832906138b1565b6119b881612694565b50600b805460ff19166001179055565b600b5460ff166119ea5760405162461bcd60e51b8152600401610832906134d6565b6003546001600160a01b03163314611a145760405162461bcd60e51b815260040161083290613640565b611a1d81612694565b50565b60026000541415611a435760405162461bcd60e51b81526004016108329061384e565b6002600055611a513361207b565b158015611a5d57503332145b611a795760405162461bcd60e51b8152600401610832906132e0565b60115415611b2357601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015611ac657600080fd5b505afa158015611ada573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afe91906130d5565b90506011548111611b215760405162461bcd60e51b815260040161083290613885565b505b600b5460ff16611b455760405162461bcd60e51b8152600401610832906134d6565b336000908152600e60205260409020611b5f81600c61214a565b8215611bf5576001546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90611b999033903090889060040161313a565b602060405180830381600087803b158015611bb357600080fd5b505af1158015611bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611beb919061309d565b50611bf58361239c565b8115611cc25760025460405163079cc67960e41b81526001600160a01b03909116906379cc679090611c2d903390869060040161315e565b600060405180830381600087803b158015611c4757600080fd5b505af1158015611c5b573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb9150611c8f908590600401613918565b600060405180830381600087803b158015611ca957600080fd5b505af1158015611cbd573d6000803e3d6000fd5b505050505b6000611cce848461262c565b9050611cf8816040518060200160405280600081525084600101546123419092919063ffffffff16565b600183015560405133907fbade234341a40ca3c71df59b3ca02b8bb65b491a098af970953228b4f4a5d38f90611d319087908790613921565b60405180910390a2505060016000555050565b600b54600090819060ff16611d6b5760405162461bcd60e51b8152600401610832906134d6565b6000611d78600f85612123565b9050600080611d8783306127bf565b90925090508115611ea6576000611db5612710611daf6008548661203890919063ffffffff16565b90612814565b90506000611dc38483612604565b9050611dcd613027565b611de2600954611ddc84612846565b90612888565b6040805160208101909152600d548152909150611dff90826128bc565b51600d558215611e935760015460075460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92611e3f92911690879060040161315e565b602060405180830381600087803b158015611e5957600080fd5b505af1158015611e6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e91919061309d565b505b8115611ea257611ea28261239c565b5050505b7f11d2034f4471d11a13f0f1798ceaf0c9db2812d450a0681958ce7d4f2fb97f098282604051611ed7929190613921565b60405180910390a1909350915050915091565b6003546001600160a01b03163314611f145760405162461bcd60e51b815260040161083290613640565b6001600160a01b038116611f3a5760405162461bcd60e51b8152600401610832906136e0565b600780546001600160a01b0319166001600160a01b0383161790556040517f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf906109dc908390613126565b600a5481565b6004546001600160a01b031681565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001600160a01b0381166000908152600e6020526040812061171581600c6128ec565b600080600260005414156120015760405162461bcd60e51b81526004016108329061384e565b6002600055600b5460ff166120285760405162461bcd60e51b8152600401610832906134d6565b61121784846124ee565b60095481565b60008261204757506000612075565b8282028284828161205457fe5b04146120725760405162461bcd60e51b815260040161083290613519565b90505b92915050565b3b151590565b6001600160a01b0381166000908152600e602052604090206120a481600c61214a565b600a5483106120b7576120b56125ab565b505b6009546120c4908461262c565b60095580546120d3908461262c565b81554360038201556040516001600160a01b038316907f59062170a285eb80e8c6b8ced60428442a51910635005233fc4ce084a475845e90612116908690613918565b60405180910390a2505050565b600082600001828154811061213457fe5b9060005260206000209060020201905092915050565b60006121568383612933565b905082600101548111156121845760018301805460009091556121798282612604565b600285015550612199565b60018301546121939082612604565b60018401555b5060010154600490910155565b6001546040516370a0823160e01b8152600091829182916122369186916001600160a01b0316906370a08231906121e1903090600401613126565b60206040518083038186803b1580156121f957600080fd5b505afa15801561220d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223191906130d5565b6129ac565b90506001600160a01b03851630146122ce5760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061227a908890859060040161315e565b602060405180830381600087803b15801561229457600080fd5b505af11580156122a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cc919061309d565b505b808060006122dc8783612604565b905080156123225760006122f0600f6129c2565b9050600080612301838c86846129ed565b9092509050612310868361262c565b955061231c858261262c565b94505050505b60095461232f9083612604565b600955509093509150505b9250929050565b600081848411156123655760405162461bcd60e51b815260040161083291906131a5565b505050900390565b6123778383612a25565b81906123965760405162461bcd60e51b815260040161083291906131a5565b50505050565b60015460065460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926123d292911690859060040161315e565b602060405180830381600087803b1580156123ec57600080fd5b505af1158015612400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612424919061309d565b50600654604051631f72642160e31b81526001600160a01b039091169063fb93210890612457903090859060040161315e565b600060405180830381600087803b15801561247157600080fd5b505af1158015612485573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb91506124b9908490600401613918565b600060405180830381600087803b1580156124d357600080fd5b505af11580156124e7573d6000803e3d6000fd5b5050505050565b600b546000908190610100900460ff168061251357506003546001600160a01b031633145b806125275750612523600f612a53565b8414155b6125435760405162461bcd60e51b8152600401610832906133d9565b6000612550600f86612123565b9050600080612561833088846129ed565b91509150867fccbd929f935422b28ee209a0db0556280b0a3d9bc4da58f1d3f0ab4f8a4996478383604051612597929190613921565b60405180910390a290969095509350505050565b6000806125b8600f6129c2565b905060006125c582612aa0565b90507f860f4701faa0ecdeecd9e9eaae11a8612bbd01c663081f7c0c4e4873df653d69816040516125f69190613918565b60405180910390a191505090565b6000828211156126265760405162461bcd60e51b81526004016108329061336b565b50900390565b6000828201838110156120725760405162461bcd60e51b8152600401610832906132a9565b5490565b6000806126628484612933565b9050806126755750506001820154612075565b600184015480821061268c57600092505050612075565b039392505050565b6001600160a01b0381166126ba5760405162461bcd60e51b815260040161083290613315565b60015460408051637e062a3560e11b815290516001600160a01b039283169284169163fc0c546a916004808301926020929190829003018186803b15801561270157600080fd5b505afa158015612715573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273991906130b9565b6001600160a01b03161461275f5760405162461bcd60e51b815260040161083290613788565b604080518082019091526001600160a01b03821681526000602082015261278890600f90612b34565b6040516001600160a01b038216907f0821015de34e20b0878a40f6f165801417f53b2017016d7321cacee989c8cfa790600090a250565b60008083600101546127d085612b77565b116127e05750600090508061233a565b60006127f985600101546127f387612b77565b90612604565b90506128088585836001612bf3565b92509250509250929050565b60008082116128355760405162461bcd60e51b8152600401610832906133a2565b81838161283e57fe5b049392505050565b61284e613027565b600082158061286b575050670de0b6b3a764000082810290810483145b61287457600080fd5b604080516020810190915290815292915050565b612890613027565b8161289a57600080fd5b6040518060200160405280838560000151816128b257fe5b0490529392505050565b6128c4613027565b825182518101908110156128d757600080fd5b60408051602081019091529081529392505050565b6000806128f98484612933565b90508061290c5750506002820154612075565b600184015480821161292357600092505050612075565b6002850154910301905092915050565b600061293d613027565b50604080516020810190915260018301548152612958613027565b506040805160208101909152600485015481526129758282612db0565b61298457600092505050612075565b84546129a39061299e906129988585612de1565b90612dfc565b612e2a565b95945050505050565b60008183106129bb5781612072565b5090919050565b6000816129ce81612a53565b815481106129d857fe5b90600052602060002090600202019050919050565b60008080806129fe88888888612bf3565b60018a01549193509150612a129082612604565b6001890155909250905094509492505050565b600080612a4a612a358585612e39565b60408051602081019091528554815290612db0565b13159392505050565b600080612a5f83612651565b90506117156001604051806040016040528060118152602001705661756c742e4c6973743a20656d70747960781b815250836123419092919063ffffffff16565b600080612aac83612e7d565b9050611715816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612add9190613126565b60206040518083038186803b158015612af557600080fd5b505afa158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d91906130d5565b8490612ef9565b8154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b039093169290921782559190920151910155565b8054604080516306a61f7560e51b815290516000926001600160a01b03169163d4c3eea0916004808301926020929190829003018186803b158015612bbb57600080fd5b505afa158015612bcf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207591906130d5565b6000806000612c0187612e7d565b90506000816001600160a01b03166370a08231886040518263ffffffff1660e01b8152600401612c319190613126565b60206040518083038186803b158015612c4957600080fd5b505afa158015612c5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8191906130d5565b90506000612c8e89612b77565b895460405163ead5d35960e01b81529192506001600160a01b03169063ead5d35990612cc2908b908b908b90600401613177565b600060405180830381600087803b158015612cdc57600080fd5b505af1158015612cf0573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03861691506370a0823190612d23908c90600401613126565b60206040518083038186803b158015612d3b57600080fd5b505afa158015612d4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d7391906130d5565b90506000612d818285612604565b90506000612d8e8c612b77565b90506000612d9c8583612604565b929d929c50919a5050505050505050505050565b805182516000911115612dc65750600019612075565b815183511115612dd857506001612075565b50600092915050565b612de9613027565b825182518103908111156128d757600080fd5b612e04613027565b6000821580612e21575050825182810290838281612e1e57fe5b04145b6128d757600080fd5b51670de0b6b3a7640000900490565b612e41613027565b6000612e4d8484612655565b905080612e6457612e5c61300b565b915050612075565b612e7581611ddc8660000154612846565b949350505050565b805460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b158015612ec157600080fd5b505afa158015612ed5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207591906130b9565b600080612f0584612e7d565b845460405163a9059cbb60e01b81529192506001600160a01b038084169263a9059cbb92612f39921690879060040161315e565b602060405180830381600087803b158015612f5357600080fd5b505af1158015612f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8b919061309d565b50835460405163b6b55f2560e01b81526001600160a01b039091169063b6b55f2590612fbb908690600401613918565b600060405180830381600087803b158015612fd557600080fd5b505af1158015612fe9573d6000803e3d6000fd5b5050506001850154612ffc91508461262c565b60018501555081905092915050565b613013613027565b506040805160208101909152600019815290565b6040518060200160405280600081525090565b60006020828403121561304b578081fd5b813561207281613945565b60008060408385031215613068578081fd5b823561307381613945565b946020939093013593505050565b600060208284031215613092578081fd5b81356120728161395a565b6000602082840312156130ae578081fd5b81516120728161395a565b6000602082840312156130ca578081fd5b815161207281613945565b6000602082840312156130e6578081fd5b5051919050565b6000602082840312156130fe578081fd5b5035919050565b60008060408385031215613117578182fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b901515815260200190565b6000602080835283518082850152825b818110156131d1578581018301518582016040015282016131b5565b818111156131e25783604083870101525b50601f01601f1916929092016040019392505050565b60208082526034908201527f59756d4574685665737065725661756c743a20676f7665726e616e6365206164604082015273323932b9b99031b0b73737ba10313290183c181760611b606082015260800190565b6020808252603e908201527f59756d4574685665737065725661756c743a2063616e6e6f7420696e6974696160408201527f6c697a65207472616e736d75746572206164647265737320746f203078300000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f536f72727920776520646f206e6f742061636365707420636f6e747261637421604082015260600190565b60208082526036908201527f59756d4574685665737065725661756c743a20616374697665207661756c742060408201527530b2323932b9b99031b0b73737ba10313290183c181760511b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526078908201527f59756d4574685665737065725661756c743a206e6f7420616e20656d6572676560408201527f6e63792c206e6f7420676f7665726e616e63652c20616e64207573657220646f60608201527f6573206e6f742068617665207065726d697373696f6e20746f20726563616c6c60808201527f2066756e64732066726f6d20616374697665207661756c74000000000000000060a082015260c00190565b60208082526034908201527f59756d4574685665737065725661756c743a207472616e736d75746572206164604082015273323932b9b99031b0b73737ba10313290183c181760611b606082015260800190565b60208082526023908201527f59756d4574685665737065725661756c743a206e6f7420696e697469616c697a60408201526232b21760e91b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526032908201527f59756d4574685665737065725661756c743a2073656e74696e656c206164647260408201527132b9b99031b0b73737ba10313290183c181760711b606082015260800190565b6020808252601f908201527f73656e646572206973206e6f742070656e64696e67476f7665726e616e636500604082015260600190565b60208082526039908201527f59756d4574685665737065725661756c743a20636f6c6c61746572616c697a6160408201527f74696f6e206c696d69742061626f7665206d6178696d756d2e00000000000000606082015260800190565b60208082526023908201527f59756d4574685665737065725661756c743a206f6e6c7920676f7665726e616e60408201526231b29760e91b606082015260800190565b60208082526039908201527f59756d4574685665737065725661756c743a20636f6c6c61746572616c697a6160408201527f74696f6e206c696d69742062656c6f77206d696e696d756d2e00000000000000606082015260800190565b60208082526031908201527f59756d4574685665737065725661756c743a207265776172647320616464726560408201527039b99031b0b73737ba10313290183c181760791b606082015260800190565b602080825260009082015260400190565b60208082526026908201527f59756d4574685665737065725661756c743a20616c726561647920696e697469604082015265185b1a5e995960d21b606082015260800190565b60208082526022908201527f59756d4574685665737065725661756c743a20746f6b656e206d69736d617463604082015261341760f11b606082015260800190565b60208082526017908201527f656d657267656e637920706175736520656e61626c6564000000000000000000604082015260600190565b6020808252602d908201527f59756d4574685665737065725661756c743a206861727665737420666565206160408201526c3137bb329036b0bc34b6bab69760991b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526012908201527137b333103832b3903634b6b4ba30ba34b7b760711b604082015260600190565b6020808252603b908201527f59756d4574685665737065725661756c743a2063616e6e6f7420696e6974696160408201527f6c697a652072657761726473206164647265737320746f203078300000000000606082015260800190565b9051815260200190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b6001600160a01b0381168114611a1d57600080fd5b8015158114611a1d57600080fdfe59756d4574685665737065725661756c743a204c6f616e2d746f2d76616c756520726174696f206272656163686564416374696f6e20626c6f636b65643a20756e6865616c74687920636f6c6c61746572616c697a6174696f6e20726174696fa26469706673582212203633761964f83d46ad749010131a86b6dab7471589f472304d1b81eca74ba9dc64736f6c634300060c0033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006a1fbefdf67445c7f531b4f3e04ffb37b7b1379400000000000000000000000023ae8682437004044c0eddc7cee3bf632349062e0000000000000000000000009e145af5b3b142a50d871cb4821992dd493d3798
Deployed Bytecode
0x6080604052600436106102b25760003560e01c8063792b55b611610175578063c4d66de8116100dc578063f0d787a311610095578063faa4567f1161006f578063faa4567f146107a5578063fc00e8a0146107ba578063fefdc5d1146107da578063ff50abdc146107fa576102c1565b8063f0d787a314610766578063f39c38a01461077b578063f58c251c14610790576102c1565b8063c4d66de8146106be578063ce5494bb146106de578063d0e30db0146106fe578063d8aed14514610706578063ddc6326214610726578063ec38a86214610746576102c1565b8063a7c6a1001161012e578063a7c6a10014610614578063aa6e043414610629578063aaf1666014610649578063adb4a9ad14610669578063b596291714610689578063b6b55f251461069e576102c1565b8063792b55b61461056a5780639a9af2211461058a5780639ec5a894146105aa578063a005fda3146105bf578063a0712d68146105d4578063a1e401a9146105f4576102c1565b8063415f12401161021957806353ffa18b116101d257806353ffa18b146104d65780635641ec03146104f65780635a9b5e921461050b5780635aa6e6751461052b5780636b9f96ea146105405780637239d2b914610555576102c1565b8063415f12401461042a57806345ee07551461044a57806345f867b31461046a5780634aaf7c651461047f5780634c3a8e02146104a1578063538ba4f9146104c1576102c1565b80632670fdd81161026b5780632670fdd8146103885780632e1a7d4d146103b557806330d4d190146103e35780633847f038146103f85780633fc8cef31461040d578063402d888314610422576102c1565b80630510111e146102c657806309dac061146102f15780630abb603514610311578063158ef93e1461033157806322c37b7514610353578063238efcbc14610373576102c1565b366102c1576102bf61080f565b005b600080fd5b3480156102d257600080fd5b506102db610935565b6040516102e89190613918565b60405180910390f35b3480156102fd57600080fd5b506102bf61030c36600461303a565b610941565b34801561031d57600080fd5b506102bf61032c36600461303a565b6109e7565b34801561033d57600080fd5b50610346610a82565b6040516102e8919061319a565b34801561035f57600080fd5b506102bf61036e3660046130ed565b610a8b565b34801561037f57600080fd5b506102bf610aba565b34801561039457600080fd5b506103a86103a33660046130ed565b610b35565b6040516102e89190613126565b3480156103c157600080fd5b506103d56103d03660046130ed565b610b54565b6040516102e8929190613921565b3480156103ef57600080fd5b506102db610ce2565b34801561040457600080fd5b506102db610cee565b34801561041957600080fd5b506103a8610cf4565b6102bf610d03565b34801561043657600080fd5b506103d56104453660046130ed565b610f21565b34801561045657600080fd5b506102bf610465366004613081565b611109565b34801561047657600080fd5b506102db61118b565b34801561048b57600080fd5b50610494611191565b6040516102e8919061390e565b3480156104ad57600080fd5b506103d56104bc3660046130ed565b6111ad565b3480156104cd57600080fd5b506103a8611227565b3480156104e257600080fd5b506102bf6104f13660046130ed565b61122c565b34801561050257600080fd5b506103466112e6565b34801561051757600080fd5b506102bf610526366004613056565b6112f4565b34801561053757600080fd5b506103a8611344565b34801561054c57600080fd5b506102db611353565b34801561056157600080fd5b506103a86113d9565b34801561057657600080fd5b506102bf6105853660046130ed565b6113e8565b34801561059657600080fd5b506102db6105a536600461303a565b611469565b3480156105b657600080fd5b506103a8611487565b3480156105cb57600080fd5b506103a8611496565b3480156105e057600080fd5b506102bf6105ef3660046130ed565b6114a5565b34801561060057600080fd5b506102db61060f36600461303a565b6116c6565b34801561062057600080fd5b506102db6116e1565b34801561063557600080fd5b506102db61064436600461303a565b6116f2565b34801561065557600080fd5b506102db6106643660046130ed565b61171c565b34801561067557600080fd5b506102bf61068436600461303a565b611735565b34801561069557600080fd5b506102db6117d0565b3480156106aa57600080fd5b506102bf6106b93660046130ed565b6117d6565b3480156106ca57600080fd5b506102bf6106d936600461303a565b611912565b3480156106ea57600080fd5b506102bf6106f936600461303a565b6119c8565b6102bf61080f565b34801561071257600080fd5b506102bf610721366004613105565b611a20565b34801561073257600080fd5b506103d56107413660046130ed565b611d44565b34801561075257600080fd5b506102bf61076136600461303a565b611eea565b34801561077257600080fd5b506102db611f85565b34801561078757600080fd5b506103a8611f8b565b34801561079c57600080fd5b506103a8611f9a565b3480156107b157600080fd5b506103a8611fa9565b3480156107c657600080fd5b506102db6107d536600461303a565b611fb8565b3480156107e657600080fd5b506103d56107f5366004613105565b611fdb565b34801561080657600080fd5b506102db612032565b6002600054141561083b5760405162461bcd60e51b81526004016108329061384e565b60405180910390fd5b60026000556108493361207b565b15801561085557503332145b6108715760405162461bcd60e51b8152600401610832906132e0565b600b5460ff166108935760405162461bcd60e51b8152600401610832906134d6565b600b54610100900460ff16156108bb5760405162461bcd60e51b8152600401610832906137ca565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561090b57600080fd5b505af115801561091f573d6000803e3d6000fd5b505050505061092e3433612081565b6001600055565b673782dace9d90000081565b6003546001600160a01b0316331461096b5760405162461bcd60e51b815260040161083290613640565b6001600160a01b0381166109915760405162461bcd60e51b81526004016108329061355a565b600580546001600160a01b0319166001600160a01b0383161790556040517fdc117600f93282860144d2cd2745f8e2e15c3ca2a32b4290c30f7cd1ae7ffcb9906109dc908390613126565b60405180910390a150565b6003546001600160a01b03163314610a115760405162461bcd60e51b815260040161083290613640565b6001600160a01b038116610a375760405162461bcd60e51b8152600401610832906131f8565b600480546001600160a01b0319166001600160a01b0383161790556040517fc9e2377236eab4280090ce8f2317332649736d92f00dcf20a8dd6684ec5e7839906109dc908390613126565b600b5460ff1681565b6003546001600160a01b03163314610ab55760405162461bcd60e51b815260040161083290613640565b600a55565b6004546001600160a01b03163314610ae45760405162461bcd60e51b8152600401610832906135ac565b600454600380546001600160a01b0319166001600160a01b0390921691821790556040517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab906109dc908390613126565b600080610b43600f84612123565b546001600160a01b03169392505050565b60008060026000541415610b7a5760405162461bcd60e51b81526004016108329061384e565b6002600055610b883361207b565b158015610b9457503332145b610bb05760405162461bcd60e51b8152600401610832906132e0565b600b5460ff16610bd25760405162461bcd60e51b8152600401610832906134d6565b336000908152600e6020526040902060038101544311610c045760405162461bcd60e51b815260040161083290613731565b610c0f81600c61214a565b600080610c1c33876121a6565b60408051808201909152601b81527f4578636565647320776974686472617761626c6520616d6f756e74000000000060208201528554929450909250610c6491908390612341565b835560408051606081019091526031808252610c8d91600c91613998602083013985919061236d565b336001600160a01b03167fb3ad69dc1d2c6b1f5f5b0927ffd8ee8f1437a156253c8f6dccc75e6f8e4fd38b878484604051610cca9392919061392f565b60405180910390a26001600055909590945092505050565b670de0b6b3a764000081565b60115481565b6001546001600160a01b031681565b60026000541415610d265760405162461bcd60e51b81526004016108329061384e565b6002600055610d343361207b565b158015610d4057503332145b610d5c5760405162461bcd60e51b8152600401610832906132e0565b60115415610e0657601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015610da957600080fd5b505afa158015610dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de191906130d5565b90506011548111610e045760405162461bcd60e51b815260040161083290613885565b505b600b5460ff16610e285760405162461bcd60e51b8152600401610832906134d6565b336000908152600e60205260409020610e4281600c61214a565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e9257600080fd5b505af1158015610ea6573d6000803e3d6000fd5b5050505050610eb43461239c565b60408051602081019091526000815260018201543491610ed691908390612341565b600183015560405133907fbade234341a40ca3c71df59b3ca02b8bb65b491a098af970953228b4f4a5d38f90610f10903490600090613921565b60405180910390a250506001600055565b60008060026000541415610f475760405162461bcd60e51b81526004016108329061384e565b6002600055610f553361207b565b158015610f6157503332145b610f7d5760405162461bcd60e51b8152600401610832906132e0565b6011541561102757601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015610fca57600080fd5b505afa158015610fde573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100291906130d5565b905060115481116110255760405162461bcd60e51b815260040161083290613885565b505b600b5460ff166110495760405162461bcd60e51b8152600401610832906134d6565b336000908152600e6020526040902061106381600c61214a565b806001015484111561107757806001015493505b60008061108430876121a6565b915091506110918261239c565b60408051602081019091526000815283546110ad918390612341565b835560408051602081019091526000815260018401546110ce918490612341565b600184015560405133907f3ea051727656be6fd11c2260f244f29ff3c70d1fb077bfa73e89d554e9bb95c790610cca9089908690869061392f565b6003546001600160a01b031633148061112c57506005546001600160a01b031633145b6111485760405162461bcd60e51b815260040161083290613731565b600b805461ff001916610100831515021790556040517ff0064f2efd0da4bc63eecf2e75590fe8a308eaa526a51c334e50eec09a711049906109dc90839061319a565b61271081565b611199613027565b506040805160208101909152600c54815290565b600080600260005414156111d35760405162461bcd60e51b81526004016108329061384e565b6002600055600b5460ff166111fa5760405162461bcd60e51b8152600401610832906134d6565b6000611207600f85612123565b90506112178482600101546124ee565b6001600055909590945092505050565b600081565b6003546001600160a01b031633146112565760405162461bcd60e51b815260040161083290613640565b670de0b6b3a764000081101561127e5760405162461bcd60e51b815260040161083290613683565b673782dace9d9000008111156112a65760405162461bcd60e51b8152600401610832906135e3565b60408051602081018252829052600c829055517ff78180bc708b1292177c888900951cd66a39faf48dc7b6d111e93285dbbe55a0906109dc908390613918565b600b54610100900460ff1681565b6003546001600160a01b0316331461131e5760405162461bcd60e51b815260040161083290613640565b601080546001600160a01b0319166001600160a01b039390931692909217909155601155565b6003546001600160a01b031681565b6000600260005414156113785760405162461bcd60e51b81526004016108329061384e565b6002600055600b5460ff1661139f5760405162461bcd60e51b8152600401610832906134d6565b600b54610100900460ff16156113c75760405162461bcd60e51b8152600401610832906137ca565b6113cf6125ab565b9050600160005590565b6006546001600160a01b031681565b6003546001600160a01b031633146114125760405162461bcd60e51b815260040161083290613640565b6127108111156114345760405162461bcd60e51b815260040161083290613801565b60088190556040517fc36862a253ff42cc71f4f200d3c62e8e5eaaece01041fc6900aeace64ade72a8906109dc908390613918565b6001600160a01b03166000908152600e602052604090206003015490565b6007546001600160a01b031681565b6010546001600160a01b031681565b600260005414156114c85760405162461bcd60e51b81526004016108329061384e565b60026000556114d63361207b565b1580156114e257503332145b6114fe5760405162461bcd60e51b8152600401610832906132e0565b601154156115a857601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b15801561154b57600080fd5b505afa15801561155f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158391906130d5565b905060115481116115a65760405162461bcd60e51b815260040161083290613885565b505b600b5460ff166115ca5760405162461bcd60e51b8152600401610832906134d6565b336000908152600e602052604090206115e481600c61214a565b6002810154828110156116485760006115fd8483612604565b600184015490915061160f908261262c565b6001840155600060028401556040805160608101909152602f80825261164291600c91613969602083013985919061236d565b50611658565b6116528184612604565b60028301555b6002546040516340c10f1960e01b81526001600160a01b03909116906340c10f199061168a903390879060040161315e565b600060405180830381600087803b1580156116a457600080fd5b505af11580156116b8573d6000803e3d6000fd5b505060016000555050505050565b6001600160a01b03166000908152600e602052604090205490565b60006116ed600f612651565b905090565b6001600160a01b0381166000908152600e6020526040812061171581600c612655565b9392505050565b60008061172a600f84612123565b600101549392505050565b6003546001600160a01b0316331461175f5760405162461bcd60e51b815260040161083290613640565b6001600160a01b0381166117855760405162461bcd60e51b815260040161083290613482565b600680546001600160a01b0319166001600160a01b0383161790556040517fe42bb1780117f5788c6e0042e955291223819875891ddf465b8e4fbb85a933e9906109dc908390613126565b60085481565b600260005414156117f95760405162461bcd60e51b81526004016108329061384e565b60026000556118073361207b565b15801561181357503332145b61182f5760405162461bcd60e51b8152600401610832906132e0565b600b5460ff166118515760405162461bcd60e51b8152600401610832906134d6565b600b54610100900460ff16156118795760405162461bcd60e51b8152600401610832906137ca565b6001546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906118ad9033903090869060040161313a565b602060405180830381600087803b1580156118c757600080fd5b505af11580156118db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ff919061309d565b5061190a8133612081565b506001600055565b6003546001600160a01b0316331461193c5760405162461bcd60e51b815260040161083290613640565b600b5460ff161561195f5760405162461bcd60e51b815260040161083290613742565b6006546001600160a01b03166119875760405162461bcd60e51b81526004016108329061324c565b6007546001600160a01b03166119af5760405162461bcd60e51b8152600401610832906138b1565b6119b881612694565b50600b805460ff19166001179055565b600b5460ff166119ea5760405162461bcd60e51b8152600401610832906134d6565b6003546001600160a01b03163314611a145760405162461bcd60e51b815260040161083290613640565b611a1d81612694565b50565b60026000541415611a435760405162461bcd60e51b81526004016108329061384e565b6002600055611a513361207b565b158015611a5d57503332145b611a795760405162461bcd60e51b8152600401610832906132e0565b60115415611b2357601054604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd916004808301926020929190829003018186803b158015611ac657600080fd5b505afa158015611ada573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afe91906130d5565b90506011548111611b215760405162461bcd60e51b815260040161083290613885565b505b600b5460ff16611b455760405162461bcd60e51b8152600401610832906134d6565b336000908152600e60205260409020611b5f81600c61214a565b8215611bf5576001546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90611b999033903090889060040161313a565b602060405180830381600087803b158015611bb357600080fd5b505af1158015611bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611beb919061309d565b50611bf58361239c565b8115611cc25760025460405163079cc67960e41b81526001600160a01b03909116906379cc679090611c2d903390869060040161315e565b600060405180830381600087803b158015611c4757600080fd5b505af1158015611c5b573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb9150611c8f908590600401613918565b600060405180830381600087803b158015611ca957600080fd5b505af1158015611cbd573d6000803e3d6000fd5b505050505b6000611cce848461262c565b9050611cf8816040518060200160405280600081525084600101546123419092919063ffffffff16565b600183015560405133907fbade234341a40ca3c71df59b3ca02b8bb65b491a098af970953228b4f4a5d38f90611d319087908790613921565b60405180910390a2505060016000555050565b600b54600090819060ff16611d6b5760405162461bcd60e51b8152600401610832906134d6565b6000611d78600f85612123565b9050600080611d8783306127bf565b90925090508115611ea6576000611db5612710611daf6008548661203890919063ffffffff16565b90612814565b90506000611dc38483612604565b9050611dcd613027565b611de2600954611ddc84612846565b90612888565b6040805160208101909152600d548152909150611dff90826128bc565b51600d558215611e935760015460075460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92611e3f92911690879060040161315e565b602060405180830381600087803b158015611e5957600080fd5b505af1158015611e6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e91919061309d565b505b8115611ea257611ea28261239c565b5050505b7f11d2034f4471d11a13f0f1798ceaf0c9db2812d450a0681958ce7d4f2fb97f098282604051611ed7929190613921565b60405180910390a1909350915050915091565b6003546001600160a01b03163314611f145760405162461bcd60e51b815260040161083290613640565b6001600160a01b038116611f3a5760405162461bcd60e51b8152600401610832906136e0565b600780546001600160a01b0319166001600160a01b0383161790556040517f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf906109dc908390613126565b600a5481565b6004546001600160a01b031681565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001600160a01b0381166000908152600e6020526040812061171581600c6128ec565b600080600260005414156120015760405162461bcd60e51b81526004016108329061384e565b6002600055600b5460ff166120285760405162461bcd60e51b8152600401610832906134d6565b61121784846124ee565b60095481565b60008261204757506000612075565b8282028284828161205457fe5b04146120725760405162461bcd60e51b815260040161083290613519565b90505b92915050565b3b151590565b6001600160a01b0381166000908152600e602052604090206120a481600c61214a565b600a5483106120b7576120b56125ab565b505b6009546120c4908461262c565b60095580546120d3908461262c565b81554360038201556040516001600160a01b038316907f59062170a285eb80e8c6b8ced60428442a51910635005233fc4ce084a475845e90612116908690613918565b60405180910390a2505050565b600082600001828154811061213457fe5b9060005260206000209060020201905092915050565b60006121568383612933565b905082600101548111156121845760018301805460009091556121798282612604565b600285015550612199565b60018301546121939082612604565b60018401555b5060010154600490910155565b6001546040516370a0823160e01b8152600091829182916122369186916001600160a01b0316906370a08231906121e1903090600401613126565b60206040518083038186803b1580156121f957600080fd5b505afa15801561220d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223191906130d5565b6129ac565b90506001600160a01b03851630146122ce5760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061227a908890859060040161315e565b602060405180830381600087803b15801561229457600080fd5b505af11580156122a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cc919061309d565b505b808060006122dc8783612604565b905080156123225760006122f0600f6129c2565b9050600080612301838c86846129ed565b9092509050612310868361262c565b955061231c858261262c565b94505050505b60095461232f9083612604565b600955509093509150505b9250929050565b600081848411156123655760405162461bcd60e51b815260040161083291906131a5565b505050900390565b6123778383612a25565b81906123965760405162461bcd60e51b815260040161083291906131a5565b50505050565b60015460065460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926123d292911690859060040161315e565b602060405180830381600087803b1580156123ec57600080fd5b505af1158015612400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612424919061309d565b50600654604051631f72642160e31b81526001600160a01b039091169063fb93210890612457903090859060040161315e565b600060405180830381600087803b15801561247157600080fd5b505af1158015612485573d6000803e3d6000fd5b505060025460405163288aafcb60e01b81526001600160a01b03909116925063288aafcb91506124b9908490600401613918565b600060405180830381600087803b1580156124d357600080fd5b505af11580156124e7573d6000803e3d6000fd5b5050505050565b600b546000908190610100900460ff168061251357506003546001600160a01b031633145b806125275750612523600f612a53565b8414155b6125435760405162461bcd60e51b8152600401610832906133d9565b6000612550600f86612123565b9050600080612561833088846129ed565b91509150867fccbd929f935422b28ee209a0db0556280b0a3d9bc4da58f1d3f0ab4f8a4996478383604051612597929190613921565b60405180910390a290969095509350505050565b6000806125b8600f6129c2565b905060006125c582612aa0565b90507f860f4701faa0ecdeecd9e9eaae11a8612bbd01c663081f7c0c4e4873df653d69816040516125f69190613918565b60405180910390a191505090565b6000828211156126265760405162461bcd60e51b81526004016108329061336b565b50900390565b6000828201838110156120725760405162461bcd60e51b8152600401610832906132a9565b5490565b6000806126628484612933565b9050806126755750506001820154612075565b600184015480821061268c57600092505050612075565b039392505050565b6001600160a01b0381166126ba5760405162461bcd60e51b815260040161083290613315565b60015460408051637e062a3560e11b815290516001600160a01b039283169284169163fc0c546a916004808301926020929190829003018186803b15801561270157600080fd5b505afa158015612715573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273991906130b9565b6001600160a01b03161461275f5760405162461bcd60e51b815260040161083290613788565b604080518082019091526001600160a01b03821681526000602082015261278890600f90612b34565b6040516001600160a01b038216907f0821015de34e20b0878a40f6f165801417f53b2017016d7321cacee989c8cfa790600090a250565b60008083600101546127d085612b77565b116127e05750600090508061233a565b60006127f985600101546127f387612b77565b90612604565b90506128088585836001612bf3565b92509250509250929050565b60008082116128355760405162461bcd60e51b8152600401610832906133a2565b81838161283e57fe5b049392505050565b61284e613027565b600082158061286b575050670de0b6b3a764000082810290810483145b61287457600080fd5b604080516020810190915290815292915050565b612890613027565b8161289a57600080fd5b6040518060200160405280838560000151816128b257fe5b0490529392505050565b6128c4613027565b825182518101908110156128d757600080fd5b60408051602081019091529081529392505050565b6000806128f98484612933565b90508061290c5750506002820154612075565b600184015480821161292357600092505050612075565b6002850154910301905092915050565b600061293d613027565b50604080516020810190915260018301548152612958613027565b506040805160208101909152600485015481526129758282612db0565b61298457600092505050612075565b84546129a39061299e906129988585612de1565b90612dfc565b612e2a565b95945050505050565b60008183106129bb5781612072565b5090919050565b6000816129ce81612a53565b815481106129d857fe5b90600052602060002090600202019050919050565b60008080806129fe88888888612bf3565b60018a01549193509150612a129082612604565b6001890155909250905094509492505050565b600080612a4a612a358585612e39565b60408051602081019091528554815290612db0565b13159392505050565b600080612a5f83612651565b90506117156001604051806040016040528060118152602001705661756c742e4c6973743a20656d70747960781b815250836123419092919063ffffffff16565b600080612aac83612e7d565b9050611715816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612add9190613126565b60206040518083038186803b158015612af557600080fd5b505afa158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d91906130d5565b8490612ef9565b8154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b039093169290921782559190920151910155565b8054604080516306a61f7560e51b815290516000926001600160a01b03169163d4c3eea0916004808301926020929190829003018186803b158015612bbb57600080fd5b505afa158015612bcf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207591906130d5565b6000806000612c0187612e7d565b90506000816001600160a01b03166370a08231886040518263ffffffff1660e01b8152600401612c319190613126565b60206040518083038186803b158015612c4957600080fd5b505afa158015612c5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8191906130d5565b90506000612c8e89612b77565b895460405163ead5d35960e01b81529192506001600160a01b03169063ead5d35990612cc2908b908b908b90600401613177565b600060405180830381600087803b158015612cdc57600080fd5b505af1158015612cf0573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03861691506370a0823190612d23908c90600401613126565b60206040518083038186803b158015612d3b57600080fd5b505afa158015612d4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d7391906130d5565b90506000612d818285612604565b90506000612d8e8c612b77565b90506000612d9c8583612604565b929d929c50919a5050505050505050505050565b805182516000911115612dc65750600019612075565b815183511115612dd857506001612075565b50600092915050565b612de9613027565b825182518103908111156128d757600080fd5b612e04613027565b6000821580612e21575050825182810290838281612e1e57fe5b04145b6128d757600080fd5b51670de0b6b3a7640000900490565b612e41613027565b6000612e4d8484612655565b905080612e6457612e5c61300b565b915050612075565b612e7581611ddc8660000154612846565b949350505050565b805460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b158015612ec157600080fd5b505afa158015612ed5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207591906130b9565b600080612f0584612e7d565b845460405163a9059cbb60e01b81529192506001600160a01b038084169263a9059cbb92612f39921690879060040161315e565b602060405180830381600087803b158015612f5357600080fd5b505af1158015612f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8b919061309d565b50835460405163b6b55f2560e01b81526001600160a01b039091169063b6b55f2590612fbb908690600401613918565b600060405180830381600087803b158015612fd557600080fd5b505af1158015612fe9573d6000803e3d6000fd5b5050506001850154612ffc91508461262c565b60018501555081905092915050565b613013613027565b506040805160208101909152600019815290565b6040518060200160405280600081525090565b60006020828403121561304b578081fd5b813561207281613945565b60008060408385031215613068578081fd5b823561307381613945565b946020939093013593505050565b600060208284031215613092578081fd5b81356120728161395a565b6000602082840312156130ae578081fd5b81516120728161395a565b6000602082840312156130ca578081fd5b815161207281613945565b6000602082840312156130e6578081fd5b5051919050565b6000602082840312156130fe578081fd5b5035919050565b60008060408385031215613117578182fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b901515815260200190565b6000602080835283518082850152825b818110156131d1578581018301518582016040015282016131b5565b818111156131e25783604083870101525b50601f01601f1916929092016040019392505050565b60208082526034908201527f59756d4574685665737065725661756c743a20676f7665726e616e6365206164604082015273323932b9b99031b0b73737ba10313290183c181760611b606082015260800190565b6020808252603e908201527f59756d4574685665737065725661756c743a2063616e6e6f7420696e6974696160408201527f6c697a65207472616e736d75746572206164647265737320746f203078300000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f536f72727920776520646f206e6f742061636365707420636f6e747261637421604082015260600190565b60208082526036908201527f59756d4574685665737065725661756c743a20616374697665207661756c742060408201527530b2323932b9b99031b0b73737ba10313290183c181760511b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526078908201527f59756d4574685665737065725661756c743a206e6f7420616e20656d6572676560408201527f6e63792c206e6f7420676f7665726e616e63652c20616e64207573657220646f60608201527f6573206e6f742068617665207065726d697373696f6e20746f20726563616c6c60808201527f2066756e64732066726f6d20616374697665207661756c74000000000000000060a082015260c00190565b60208082526034908201527f59756d4574685665737065725661756c743a207472616e736d75746572206164604082015273323932b9b99031b0b73737ba10313290183c181760611b606082015260800190565b60208082526023908201527f59756d4574685665737065725661756c743a206e6f7420696e697469616c697a60408201526232b21760e91b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526032908201527f59756d4574685665737065725661756c743a2073656e74696e656c206164647260408201527132b9b99031b0b73737ba10313290183c181760711b606082015260800190565b6020808252601f908201527f73656e646572206973206e6f742070656e64696e67476f7665726e616e636500604082015260600190565b60208082526039908201527f59756d4574685665737065725661756c743a20636f6c6c61746572616c697a6160408201527f74696f6e206c696d69742061626f7665206d6178696d756d2e00000000000000606082015260800190565b60208082526023908201527f59756d4574685665737065725661756c743a206f6e6c7920676f7665726e616e60408201526231b29760e91b606082015260800190565b60208082526039908201527f59756d4574685665737065725661756c743a20636f6c6c61746572616c697a6160408201527f74696f6e206c696d69742062656c6f77206d696e696d756d2e00000000000000606082015260800190565b60208082526031908201527f59756d4574685665737065725661756c743a207265776172647320616464726560408201527039b99031b0b73737ba10313290183c181760791b606082015260800190565b602080825260009082015260400190565b60208082526026908201527f59756d4574685665737065725661756c743a20616c726561647920696e697469604082015265185b1a5e995960d21b606082015260800190565b60208082526022908201527f59756d4574685665737065725661756c743a20746f6b656e206d69736d617463604082015261341760f11b606082015260800190565b60208082526017908201527f656d657267656e637920706175736520656e61626c6564000000000000000000604082015260600190565b6020808252602d908201527f59756d4574685665737065725661756c743a206861727665737420666565206160408201526c3137bb329036b0bc34b6bab69760991b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526012908201527137b333103832b3903634b6b4ba30ba34b7b760711b604082015260600190565b6020808252603b908201527f59756d4574685665737065725661756c743a2063616e6e6f7420696e6974696160408201527f6c697a652072657761726473206164647265737320746f203078300000000000606082015260800190565b9051815260200190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b6001600160a01b0381168114611a1d57600080fd5b8015158114611a1d57600080fdfe59756d4574685665737065725661756c743a204c6f616e2d746f2d76616c756520726174696f206272656163686564416374696f6e20626c6f636b65643a20756e6865616c74687920636f6c6c61746572616c697a6174696f6e20726174696fa26469706673582212203633761964f83d46ad749010131a86b6dab7471589f472304d1b81eca74ba9dc64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006a1fbefdf67445c7f531b4f3e04ffb37b7b1379400000000000000000000000023ae8682437004044c0eddc7cee3bf632349062e0000000000000000000000009e145af5b3b142a50d871cb4821992dd493d3798
-----Decoded View---------------
Arg [0] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : _waEth (address): 0x6a1fbefdF67445C7F531b4F3e04Ffb37b7b13794
Arg [2] : _governance (address): 0x23Ae8682437004044C0eddC7cee3bF632349062e
Arg [3] : _sentinel (address): 0x9e145AF5b3B142a50d871cb4821992dd493d3798
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 0000000000000000000000006a1fbefdf67445c7f531b4f3e04ffb37b7b13794
Arg [2] : 00000000000000000000000023ae8682437004044c0eddc7cee3bf632349062e
Arg [3] : 0000000000000000000000009e145af5b3b142a50d871cb4821992dd493d3798
Deployed Bytecode Sourcemap
103545:28667:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119069:9;:7;:9::i;:::-;103545:28667;;;;;105171:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110611:229;;;;;;;;;;-1:-1:-1;110611:229:0;;;;;:::i;:::-;;:::i;109911:292::-;;;;;;;;;;-1:-1:-1;109911:292:0;;;;;:::i;:::-;;:::i;107812:23::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;111591:116::-;;;;;;;;;;-1:-1:-1;111591:116:0;;;;;:::i;:::-;;:::i;110338:267::-;;;;;;;;;;;;;:::i;125208:183::-;;;;;;;;;;-1:-1:-1;125208:183:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;120901:673::-;;;;;;;;;;-1:-1:-1;120901:673:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;104610:77::-;;;;;;;;;;;;;:::i;108788:25::-;;;;;;;;;;;;;:::i;106649:17::-;;;;;;;;;;;;;:::i;121634:434::-;;;:::i;123104:821::-;;;;;;;;;;-1:-1:-1;123104:821:0;;;;;:::i;:::-;;:::i;113968:221::-;;;;;;;;;;-1:-1:-1;113968:221:0;;;;;:::i;:::-;;:::i;104076:50::-;;;;;;;;;;;;;:::i;114408:136::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;117563:231::-;;;;;;;;;;-1:-1:-1;117563:231:0;;;;;:::i;:::-;;:::i;103864:49::-;;;;;;;;;;;;;:::i;113219:433::-;;;;;;;;;;-1:-1:-1;113219:433:0;;;;;:::i;:::-;;:::i;107987:25::-;;;;;;;;;;;;;:::i;113680:131::-;;;;;;;;;;-1:-1:-1;113680:131:0;;;;;:::i;:::-;;:::i;106885:25::-;;;;;;;;;;;;;:::i;118072:344::-;;;;;;;;;;;;;:::i;107241:25::-;;;;;;;;;;;;;:::i;112516:434::-;;;;;;;;;;-1:-1:-1;112516:434:0;;;;;:::i;:::-;;:::i;127098:159::-;;;;;;;;;;-1:-1:-1;127098:159:0;;;;;:::i;:::-;;:::i;107338:22::-;;;;;;;;;;;;;:::i;108667:29::-;;;;;;;;;;;;;:::i;124254:616::-;;;;;;;;;;-1:-1:-1;124254:616:0;;;;;:::i;:::-;;:::i;125989:165::-;;;;;;;;;;-1:-1:-1;125989:165:0;;;;;:::i;:::-;;:::i;124972:90::-;;;;;;;;;;;;;:::i;126354:171::-;;;;;;;;;;-1:-1:-1;126354:171:0;;;;;:::i;:::-;;:::i;125607:185::-;;;;;;;;;;-1:-1:-1;125607:185:0;;;;;:::i;:::-;;:::i;111055:434::-;;;;;;;;;;-1:-1:-1;111055:434:0;;;;;:::i;:::-;;:::i;107456:25::-;;;;;;;;;;;;;:::i;119800:253::-;;;;;;;;;;-1:-1:-1;119800:253:0;;;;;:::i;:::-;;:::i;114768:421::-;;;;;;;;;;-1:-1:-1;114768:421:0;;;;;:::i;:::-;;:::i;115570:125::-;;;;;;;;;;-1:-1:-1;115570:125:0;;;;;:::i;:::-;;:::i;119288:259::-;;;:::i;122221:715::-;;;;;;;;;;-1:-1:-1;122221:715:0;;;;;:::i;:::-;;:::i;115895:940::-;;;;;;;;;;-1:-1:-1;115895:940:0;;;;;:::i;:::-;;:::i;111937:404::-;;;;;;;;;;-1:-1:-1;111937:404:0;;;;;:::i;:::-;;:::i;107704:29::-;;;;;;;;;;;;;:::i;106968:32::-;;;;;;;;;;;;;:::i;107108:23::-;;;;;;;;;;;;;:::i;106744:27::-;;;;;;;;;;;;;:::i;126702:175::-;;;;;;;;;;-1:-1:-1;126702:175:0;;;;;:::i;:::-;;:::i;117116:171::-;;;;;;;;;;-1:-1:-1;117116:171:0;;;;;:::i;:::-;;:::i;107593:29::-;;;;;;;;;;;;;:::i;119288:259::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;;;;;;;;;2718:1;3457:7;:18;128110:32:::1;128118:10;128110:30;:32::i;:::-;128109:33;:60;;;;-1:-1:-1::0;128146:10:0::1;128160:9;128146:23;128109:60;128101:105;;;;-1:-1:-1::0;;;128101:105:0::1;;;;;;;:::i;:::-;128411:11:::2;::::0;::::2;;128403:59;;;;-1:-1:-1::0;;;128403:59:0::2;;;;;;;:::i;:::-;119389:13:::3;::::0;::::3;::::0;::::3;;;119388:14;119380:50;;;;-1:-1:-1::0;;;119380:50:0::3;;;;;;;:::i;:::-;119469:4;;;;;;;;;-1:-1:-1::0;;;;;119469:4:0::3;-1:-1:-1::0;;;;;119469:12:0::3;;119489:9;119469:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;119510:31;119519:9;119530:10;119510:8;:31::i;:::-;2674:1:::0;3636:7;:22;119288:259::o;105171:77::-;105229:19;105171:77;:::o;110611:229::-;128892:10;;-1:-1:-1;;;;;128892:10:0;128878;:24;128870:72;;;;-1:-1:-1;;;128870:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;110685:25:0;::::1;110677:88;;;;-1:-1:-1::0;;;110677:88:0::1;;;;;;;:::i;:::-;110774:8;:20:::0;;-1:-1:-1;;;;;;110774:20:0::1;-1:-1:-1::0;;;;;110774:20:0;::::1;;::::0;;110808:26:::1;::::0;::::1;::::0;::::1;::::0;110774:20;;110808:26:::1;:::i;:::-;;;;;;;;110611:229:::0;:::o;109911:292::-;128892:10;;-1:-1:-1;;;;;128892:10:0;128878;:24;128870:72;;;;-1:-1:-1;;;128870:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;110001:34:0;::::1;109993:99;;;;-1:-1:-1::0;;;109993:99:0::1;;;;;;;:::i;:::-;110101:17;:38:::0;;-1:-1:-1;;;;;;110101:38:0::1;-1:-1:-1::0;;;;;110101:38:0;::::1;;::::0;;110153:44:::1;::::0;::::1;::::0;::::1;::::0;110101:38;;110153:44:::1;:::i;107812:23::-:0;;;;;;:::o;111591:116::-;128892:10;;-1:-1:-1;;;;;128892:10:0;128878;:24;128870:72;;;;-1:-1:-1;;;128870:72:0;;;;;;;:::i;:::-;111667:14:::1;:32:::0;111591:116::o;110338:267::-;110405:17;;-1:-1:-1;;;;;110405:17:0;110391:10;:31;110383:74;;;;-1:-1:-1;;;110383:74:0;;;;;;;:::i;:::-;110493:17;;110517:10;:31;;-1:-1:-1;;;;;;110517:31:0;-1:-1:-1;;;;;110493:17:0;;;110517:31;;;;;110562:37;;;;;;110493:17;;110562:37;:::i;125208:183::-;125274:19;;125336:21;:7;125348:8;125336:11;:21::i;:::-;125371:14;-1:-1:-1;;;;;125371:14:0;;125208:183;-1:-1:-1;;;125208:183:0:o;120901:673::-;121003:7;121012;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;128110:32:::1;128118:10;128110:30;:32::i;:::-;128109:33;:60;;;;-1:-1:-1::0;128146:10:0::1;128160:9;128146:23;128109:60;128101:105;;;;-1:-1:-1::0;;;128101:105:0::1;;;;;;;:::i;:::-;128411:11:::2;::::0;::::2;;128403:59;;;;-1:-1:-1::0;;;128403:59:0::2;;;;;;;:::i;:::-;121060:10:::3;121030:21;121054:17:::0;;;:5:::3;:17;::::0;;;;121101:16:::3;::::0;::::3;::::0;121086:12:::3;:31;121078:44;;;;-1:-1:-1::0;;;121078:44:0::3;;;;;;;:::i;:::-;121131:17;:4:::0;121143::::3;121131:11;:17::i;:::-;121158:24;121184:23:::0;121211:37:::3;121228:10;121240:7;121211:16;:37::i;:::-;121279:71;::::0;;;;::::3;::::0;;;::::3;::::0;;::::3;;::::0;::::3;::::0;:19;;121157:91;;-1:-1:-1;121157:91:0;;-1:-1:-1;121279:71:0::3;::::0;:19;121157:91;;121279:23:::3;:71::i;:::-;121257:93:::0;;121357:75:::3;::::0;;::::3;::::0;::::3;::::0;;;::::3;::::0;;;::::3;::::0;121374:4:::3;::::0;121357:75:::3;;::::0;::::3;;:4:::0;;:75;:16:::3;:75::i;:::-;121462:10;-1:-1:-1::0;;;;;121446:71:0::3;;121474:7;121483:16;121501:15;121446:71;;;;;;;;:::i;:::-;;;;;;;;2674:1:::0;3636:7;:22;121534:16;;;;-1:-1:-1;120901:673:0;-1:-1:-1;;;120901:673:0:o;104610:77::-;104668:19;104610:77;:::o;108788:25::-;;;;:::o;106649:17::-;;;-1:-1:-1;;;;;106649:17:0;;:::o;121634:434::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;128110:32:::1;128118:10;128110:30;:32::i;:::-;128109:33;:60;;;;-1:-1:-1::0;128146:10:0::1;128160:9;128146:23;128109:60;128101:105;;;;-1:-1:-1::0;;;128101:105:0::1;;;;;;;:::i;:::-;127766:10:::2;::::0;:14;127763:174:::2;;127833:14;::::0;127822:41:::2;::::0;;-1:-1:-1;;;127822:41:0;;;;127791:20:::2;::::0;-1:-1:-1;;;;;127833:14:0::2;::::0;127822:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;127833:14;127822:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;127791:73;;127896:10;;127881:12;:25;127873:56;;;;-1:-1:-1::0;;;127873:56:0::2;;;;;;;:::i;:::-;127763:174;;128411:11:::3;::::0;::::3;;128403:59;;;;-1:-1:-1::0;;;128403:59:0::3;;;;;;;:::i;:::-;121766:10:::4;121736:21;121760:17:::0;;;:5:::4;:17;::::0;;;;121784::::4;121760::::0;121796:4:::4;121784:11;:17::i;:::-;121836:4;;;;;;;;;-1:-1:-1::0;;;;;121836:4:0::4;-1:-1:-1::0;;;;;121836:12:0::4;;121856:9;121836:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;121875:34;121899:9;121875:23;:34::i;:::-;121974:36;::::0;;::::4;::::0;::::4;::::0;;;121918:20:::4;121974:36:::0;;:14:::4;::::0;::::4;::::0;121941:9:::4;::::0;121974:36:::4;::::0;:14;121941:9;;121974:18:::4;:36::i;:::-;121957:14;::::0;::::4;:53:::0;122024:38:::4;::::0;122037:10:::4;::::0;122024:38:::4;::::0;::::4;::::0;122049:9:::4;::::0;122060:1:::4;::::0;122024:38:::4;:::i;:::-;;;;;;;;-1:-1:-1::0;;2674:1:0;3636:7;:22;121634:434::o;123104:821::-;123219:7;123228;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;128110:32:::1;128118:10;128110:30;:32::i;:::-;128109:33;:60;;;;-1:-1:-1::0;128146:10:0::1;128160:9;128146:23;128109:60;128101:105;;;;-1:-1:-1::0;;;128101:105:0::1;;;;;;;:::i;:::-;127766:10:::2;::::0;:14;127763:174:::2;;127833:14;::::0;127822:41:::2;::::0;;-1:-1:-1;;;127822:41:0;;;;127791:20:::2;::::0;-1:-1:-1;;;;;127833:14:0::2;::::0;127822:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;127833:14;127822:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;127791:73;;127896:10;;127881:12;:25;127873:56;;;;-1:-1:-1::0;;;127873:56:0::2;;;;;;;:::i;:::-;127763:174;;128411:11:::3;::::0;::::3;;128403:59;;;;-1:-1:-1::0;;;128403:59:0::3;;;;;;;:::i;:::-;123274:10:::4;123244:21;123268:17:::0;;;:5:::4;:17;::::0;;;;123292::::4;123268::::0;123304:4:::4;123292:11;:17::i;:::-;123392:4;:14;;;123382:7;:24;123379:69;;;123426:4;:14;;;123416:24;;123379:69;123455:24;123481:23:::0;123508:40:::4;123533:4;123540:7;123508:16;:40::i;:::-;123454:94;;;;123604:41;123628:16;123604:23;:41::i;:::-;123676:44;::::0;;::::4;::::0;::::4;::::0;;;-1:-1:-1;123676:44:0;;:19;;:44:::4;::::0;123700:15;;123676:23:::4;:44::i;:::-;123654:66:::0;;123744:40:::4;::::0;;::::4;::::0;::::4;::::0;;;123654:19:::4;123744:40:::0;;:14:::4;::::0;::::4;::::0;:40:::4;::::0;123763:16;;123744:18:::4;:40::i;:::-;123727:14;::::0;::::4;:57:::0;123796:72:::4;::::0;123813:10:::4;::::0;123796:72:::4;::::0;::::4;::::0;123825:7;;123834:16;;123852:15;;123796:72:::4;:::i;113968:221::-:0;114053:10;;-1:-1:-1;;;;;114053:10:0;114039;:24;;:50;;-1:-1:-1;114081:8:0;;-1:-1:-1;;;;;114081:8:0;114067:10;:22;114039:50;114031:63;;;;-1:-1:-1;;;114031:63:0;;;;;;;:::i;:::-;114103:13;:30;;-1:-1:-1;;114103:30:0;;;;;;;;;114147:36;;;;;;114103:30;;114147:36;:::i;104076:50::-;104121:5;104076:50;:::o;114408:136::-;114465:30;;:::i;:::-;-1:-1:-1;114504:34:0;;;;;;;;;114511:4;114504:34;;;114408:136;:::o;117563:231::-;117649:7;117658;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;128411:11:::1;::::0;::::1;;128403:59;;;;-1:-1:-1::0;;;128403:59:0::1;;;;;;;:::i;:::-;117674:31:::2;117708:21;:7;117720:8:::0;117708:11:::2;:21::i;:::-;117674:55;;117743:45;117756:8;117766:6;:21;;;117743:12;:45::i;:::-;2674:1:::0;3636:7;:22;117736:52;;;;-1:-1:-1;117563:231:0;-1:-1:-1;;;117563:231:0:o;103864:49::-;103911:1;103864:49;:::o;113219:433::-;128892:10;;-1:-1:-1;;;;;128892:10:0;128878;:24;128870:72;;;;-1:-1:-1;;;128870:72:0;;;;;;;:::i;:::-;104668:19:::1;113304:6;:41;;113296:111;;;;-1:-1:-1::0;;;113296:111:0::1;;;;;;;:::i;:::-;105229:19;113422:6;:41;;113414:111;;;;-1:-1:-1::0;;;113414:111:0::1;;;;;;;:::i;:::-;113564:31;::::0;;::::1;::::0;::::1;::::0;;;;;113534:4:::1;:61:::0;;;113609:37;::::1;::::0;::::1;::::0;113588:6;;113609:37:::1;:::i;107987:25::-:0;;;;;;;;;:::o;113680:131::-;128892:10;;-1:-1:-1;;;;;128892:10:0;128878;:24;128870:72;;;;-1:-1:-1;;;128870:72:0;;;;;;;:::i;:::-;113759:14:::1;:23:::0;;-1:-1:-1;;;;;;113759:23:0::1;-1:-1:-1::0;;;;;113759:23:0;;;::::1;::::0;;;::::1;::::0;;;113789:10:::1;:16:::0;113680:131::o;106885:25::-;;;-1:-1:-1;;;;;106885:25:0;;:::o;118072:344::-;118138:7;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;128411:11:::1;::::0;::::1;;128403:59;;;;-1:-1:-1::0;;;128403:59:0::1;;;;;;;:::i;:::-;118335:13:::2;::::0;::::2;::::0;::::2;;;118334:14;118326:50;;;;-1:-1:-1::0;;;118326:50:0::2;;;;;;;:::i;:::-;118392:18;:16;:18::i;:::-;118385:25;;2674:1:::0;3636:7;:22;118072:344;:::o;107241:25::-;;;-1:-1:-1;;;;;107241:25:0;;:::o;112516:434::-;128892:10;;-1:-1:-1;;;;;128892:10:0;128878;:24;128870:72;;;;-1:-1:-1;;;128870:72:0;;;;;;;:::i;:::-;104121:5:::1;112784:11;:33;;112776:91;;;;-1:-1:-1::0;;;112776:91:0::1;;;;;;;:::i;:::-;112876:10;:24:::0;;;112914:30:::1;::::0;::::1;::::0;::::1;::::0;112889:11;;112914:30:::1;:::i;127098:159::-:0;-1:-1:-1;;;;;127206:15:0;127166:7;127206:15;;;:5;:15;;;;;127235:16;;;;127098:159::o;107338:22::-;;;-1:-1:-1;;;;;107338:22:0;;:::o;108667:29::-;;;-1:-1:-1;;;;;108667:29:0;;:::o;124254:616::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;128110:32:::1;128118:10;128110:30;:32::i;:::-;128109:33;:60;;;;-1:-1:-1::0;128146:10:0::1;128160:9;128146:23;128109:60;128101:105;;;;-1:-1:-1::0;;;128101:105:0::1;;;;;;;:::i;:::-;127766:10:::2;::::0;:14;127763:174:::2;;127833:14;::::0;127822:41:::2;::::0;;-1:-1:-1;;;127822:41:0;;;;127791:20:::2;::::0;-1:-1:-1;;;;;127833:14:0::2;::::0;127822:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;127833:14;127822:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;127791:73;;127896:10;;127881:12;:25;127873:56;;;;-1:-1:-1::0;;;127873:56:0::2;;;;;;;:::i;:::-;127763:174;;128411:11:::3;::::0;::::3;;128403:59;;;;-1:-1:-1::0;;;128403:59:0::3;;;;;;;:::i;:::-;124394:10:::4;124364:21;124388:17:::0;;;:5:::4;:17;::::0;;;;124412::::4;124388::::0;124424:4:::4;124412:11;:17::i;:::-;124461:16;::::0;::::4;::::0;124490:22;;::::4;124486:339;;;124523:24;124550:25;:7:::0;124562:12;124550:11:::4;:25::i;:::-;124601:14;::::0;::::4;::::0;124523:52;;-1:-1:-1;124601:36:0::4;::::0;124523:52;124601:18:::4;:36::i;:::-;124584:14;::::0;::::4;:53:::0;124665:1:::4;124646:16;::::0;::::4;:20:::0;124677:73:::4;::::0;;::::4;::::0;::::4;::::0;;;::::4;::::0;;;::::4;::::0;124694:4:::4;::::0;124677:73:::4;;::::0;::::4;;:4:::0;;:73;:16:::4;:73::i;:::-;124486:339;;;;124792:25;:12:::0;124809:7;124792:16:::4;:25::i;:::-;124773:16;::::0;::::4;:44:::0;124486:339:::4;124833:5;::::0;:31:::4;::::0;-1:-1:-1;;;124833:31:0;;-1:-1:-1;;;;;124833:5:0;;::::4;::::0;:10:::4;::::0;:31:::4;::::0;124844:10:::4;::::0;124856:7;;124833:31:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;-1:-1:-1::0;;2674:1:0;3636:7;:22;-1:-1:-1;;;;;124254:616:0:o;125989:165::-;-1:-1:-1;;;;;126100:15:0;126060:7;126100:15;;;:5;:15;;;;;126129:19;;125989:165::o;124972:90::-;125017:7;125040:16;:7;:14;:16::i;:::-;125033:23;;124972:90;:::o;126354:171::-;-1:-1:-1;;;;;126460:15:0;;126420:7;126460:15;;;:5;:15;;;;;126489:30;126460:15;126514:4;126489:24;:30::i;:::-;126482:37;126354:171;-1:-1:-1;;;126354:171:0:o;125607:185::-;125680:7;;125730:21;:7;125742:8;125730:11;:21::i;:::-;125765;;;;125607:185;-1:-1:-1;;;125607:185:0:o;111055:434::-;128892:10;;-1:-1:-1;;;;;128892:10:0;128878;:24;128870:72;;;;-1:-1:-1;;;128870:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;111322:27:0;::::1;111314:92;;;;-1:-1:-1::0;;;111314:92:0::1;;;;;;;:::i;:::-;111415:10;:24:::0;;-1:-1:-1;;;;;;111415:24:0::1;-1:-1:-1::0;;;;;111415:24:0;::::1;;::::0;;111453:30:::1;::::0;::::1;::::0;::::1;::::0;111415:24;;111453:30:::1;:::i;107456:25::-:0;;;;:::o;119800:253::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;128110:32:::1;128118:10;128110:30;:32::i;:::-;128109:33;:60;;;;-1:-1:-1::0;128146:10:0::1;128160:9;128146:23;128109:60;128101:105;;;;-1:-1:-1::0;;;128101:105:0::1;;;;;;;:::i;:::-;128411:11:::2;::::0;::::2;;128403:59;;;;-1:-1:-1::0;;;128403:59:0::2;;;;;;;:::i;:::-;119908:13:::3;::::0;::::3;::::0;::::3;;;119907:14;119899:50;;;;-1:-1:-1::0;;;119899:50:0::3;;;;;;;:::i;:::-;119958:4;::::0;:53:::3;::::0;-1:-1:-1;;;119958:53:0;;-1:-1:-1;;;;;119958:4:0;;::::3;::::0;:17:::3;::::0;:53:::3;::::0;119976:10:::3;::::0;119996:4:::3;::::0;120003:7;;119958:53:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;120018:29;120027:7;120036:10;120018:8;:29::i;:::-;-1:-1:-1::0;2674:1:0;3636:7;:22;119800:253::o;114768:421::-;128892:10;;-1:-1:-1;;;;;128892:10:0;128878;:24;128870:72;;;;-1:-1:-1;;;128870:72:0;;;;;;;:::i;:::-;114853:11:::1;::::0;::::1;;114852:12;114844:63;;;;-1:-1:-1::0;;;114844:63:0::1;;;;;;;:::i;:::-;114924:10;::::0;-1:-1:-1;;;;;114924:10:0::1;114916:101;;;;-1:-1:-1::0;;;114916:101:0::1;;;;;;;:::i;:::-;115032:7;::::0;-1:-1:-1;;;;;115032:7:0::1;115024:95;;;;-1:-1:-1::0;;;115024:95:0::1;;;;;;;:::i;:::-;115128:28;115147:8;115128:18;:28::i;:::-;-1:-1:-1::0;115165:11:0::1;:18:::0;;-1:-1:-1;;115165:18:0::1;115179:4;115165:18;::::0;;114768:421::o;115570:125::-;128411:11;;;;128403:59;;;;-1:-1:-1;;;128403:59:0;;;;;;;:::i;:::-;128892:10:::1;::::0;-1:-1:-1;;;;;128892:10:0::1;128878;:24;128870:72;;;;-1:-1:-1::0;;;128870:72:0::1;;;;;;;:::i;:::-;115661:28:::2;115680:8;115661:18;:28::i;:::-;115570:125:::0;:::o;122221:715::-;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;128110:32:::1;128118:10;128110:30;:32::i;:::-;128109:33;:60;;;;-1:-1:-1::0;128146:10:0::1;128160:9;128146:23;128109:60;128101:105;;;;-1:-1:-1::0;;;128101:105:0::1;;;;;;;:::i;:::-;127766:10:::2;::::0;:14;127763:174:::2;;127833:14;::::0;127822:41:::2;::::0;;-1:-1:-1;;;127822:41:0;;;;127791:20:::2;::::0;-1:-1:-1;;;;;127833:14:0::2;::::0;127822:39:::2;::::0;:41:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;127833:14;127822:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;127791:73;;127896:10;;127881:12;:25;127873:56;;;;-1:-1:-1::0;;;127873:56:0::2;;;;;;;:::i;:::-;127763:174;;128411:11:::3;::::0;::::3;;128403:59;;;;-1:-1:-1::0;;;128403:59:0::3;;;;;;;:::i;:::-;122390:10:::4;122360:21;122384:17:::0;;;:5:::4;:17;::::0;;;;122408::::4;122384::::0;122420:4:::4;122408:11;:17::i;:::-;122438::::0;;122434:146:::4;;122466:4;::::0;:59:::4;::::0;-1:-1:-1;;;122466:59:0;;-1:-1:-1;;;;;122466:4:0;;::::4;::::0;:17:::4;::::0;:59:::4;::::0;122484:10:::4;::::0;122504:4:::4;::::0;122511:13;;122466:59:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;122534:38;122558:13;122534:23;:38::i;:::-;122592:16:::0;;122588:153:::4;;122619:5;::::0;:40:::4;::::0;-1:-1:-1;;;122619:40:0;;-1:-1:-1;;;;;122619:5:0;;::::4;::::0;:14:::4;::::0;:40:::4;::::0;122634:10:::4;::::0;122646:12;;122619:40:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;-1:-1:-1::0;;122699:5:0::4;::::0;:34:::4;::::0;-1:-1:-1;;;122699:34:0;;-1:-1:-1;;;;;122699:5:0;;::::4;::::0;-1:-1:-1;122699:20:0::4;::::0;-1:-1:-1;122699:34:0::4;::::0;122720:12;;122699:34:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;122588:153;122749:20;122772:31;:13:::0;122790:12;122772:17:::4;:31::i;:::-;122749:54;;122827:36;122846:12;122827:36;;;;;;;;;;;::::0;:4:::4;:14;;;:18;;:36;;;;;:::i;:::-;122810:14;::::0;::::4;:53:::0;122877::::4;::::0;122890:10:::4;::::0;122877:53:::4;::::0;::::4;::::0;122902:13;;122917:12;;122877:53:::4;:::i;:::-;;;;;;;;-1:-1:-1::0;;2674:1:0;3636:7;:22;-1:-1:-1;;122221:715:0:o;115895:940::-;128411:11;;115966:7;;;;128411:11;;128403:59;;;;-1:-1:-1;;;128403:59:0;;;;;;;:::i;:::-;115993:31:::1;116027:21;:7;116039:8:::0;116027:11:::1;:21::i;:::-;115993:55:::0;-1:-1:-1;116058:24:0::1;::::0;116111:29:::1;115993:55:::0;116134:4:::1;116111:14;:29::i;:::-;116057:83:::0;;-1:-1:-1;116057:83:0;-1:-1:-1;116153:20:0;;116149:567:::1;;116184:18;116205:56;104121:5;116205:32;116226:10;;116205:16;:20;;:32;;;;:::i;:::-;:36:::0;::::1;:56::i;:::-;116184:77:::0;-1:-1:-1;116270:25:0::1;116298:32;:16:::0;116184:77;116298:20:::1;:32::i;:::-;116270:60;;116341:38;;:::i;:::-;116382:62;116429:14;;116382:42;116406:17;116382:23;:42::i;:::-;:46:::0;::::1;:62::i;:::-;116483:31;::::0;;::::1;::::0;::::1;::::0;;;:27;:31;;;116341:103;;-1:-1:-1;116483:40:0::1;::::0;116341:103;116483:31:::1;:40::i;:::-;116453:70:::0;:27;:70;116538:14;;116534:75:::1;;116565:4;::::0;116579:7:::1;::::0;116565:34:::1;::::0;-1:-1:-1;;;116565:34:0;;-1:-1:-1;;;;;116565:4:0;;::::1;::::0;:13:::1;::::0;:34:::1;::::0;116579:7;::::1;::::0;116588:10;;116565:34:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;116534:75;116623:21:::0;;116619:90:::1;;116657:42;116681:17;116657:23;:42::i;:::-;116149:567;;;;116729:49;116744:16;116762:15;116729:49;;;;;;;:::i;:::-;;;;;;;;116795:16:::0;;-1:-1:-1;116813:15:0;-1:-1:-1;;115895:940:0;;;:::o;111937:404::-;128892:10;;-1:-1:-1;;;;;128892:10:0;128878;:24;128870:72;;;;-1:-1:-1;;;128870:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;112192:24:0;::::1;112184:86;;;;-1:-1:-1::0;;;112184:86:0::1;;;;;;;:::i;:::-;112279:7;:18:::0;;-1:-1:-1;;;;;;112279:18:0::1;-1:-1:-1::0;;;;;112279:18:0;::::1;;::::0;;112311:24:::1;::::0;::::1;::::0;::::1;::::0;112279:18;;112311:24:::1;:::i;107704:29::-:0;;;;:::o;106968:32::-;;;-1:-1:-1;;;;;106968:32:0;;:::o;107108:23::-;;;-1:-1:-1;;;;;107108:23:0;;:::o;106744:27::-;;;-1:-1:-1;;;;;106744:27:0;;:::o;126702:175::-;-1:-1:-1;;;;;126810:15:0;;126770:7;126810:15;;;:5;:15;;;;;126839:32;126810:15;126866:4;126839:26;:32::i;117116:171::-;117216:7;117225;2718:1;3324:7;;:19;;3316:63;;;;-1:-1:-1;;;3316:63:0;;;;;;;:::i;:::-;2718:1;3457:7;:18;128411:11:::1;::::0;::::1;;128403:59;;;;-1:-1:-1::0;;;128403:59:0::1;;;;;;;:::i;:::-;117250:31:::2;117263:8;117273:7;117250:12;:31::i;107593:29::-:0;;;;:::o;18205:220::-;18263:7;18287:6;18283:20;;-1:-1:-1;18302:1:0;18295:8;;18283:20;18326:5;;;18330:1;18326;:5;:1;18350:5;;;;;:10;18342:56;;;;-1:-1:-1;;;18342:56:0;;;;;;;:::i;:::-;18416:1;-1:-1:-1;18205:220:0;;;;;:::o;4451:422::-;4818:20;4857:8;;;4451:422::o;120194:399::-;-1:-1:-1;;;;;120283:11:0;;120259:21;120283:11;;;:5;:11;;;;;120301:17;120283:11;120313:4;120301:11;:17::i;:::-;120341:14;;120330:7;:25;120327:65;;120366:18;:16;:18::i;:::-;;120327:65;120415:14;;:27;;120434:7;120415:18;:27::i;:::-;120398:14;:44;120473:19;;:32;;120497:7;120473:23;:32::i;:::-;120451:54;;120531:12;120512:16;;;:31;120557:30;;-1:-1:-1;;;;;120557:30:0;;;;;;;120579:7;;120557:30;:::i;:::-;;;;;;;;120194:399;;;:::o;102397:128::-;102469:12;102497:5;:14;;102512:6;102497:22;;;;;;;;;;;;;;;;;;102490:29;;102397:128;;;;:::o;92226:466::-;92300:20;92323:26;:5;92344:4;92323:20;:26::i;:::-;92300:49;;92375:5;:15;;;92360:12;:30;92356:262;;;92429:15;;;;;92401:25;92453:19;;;92501:35;:12;92429:15;92501:16;:35::i;:::-;92481:17;;;:55;-1:-1:-1;92356:262:0;;;92577:15;;;;:33;;92597:12;92577:19;:33::i;:::-;92559:15;;;:51;92356:262;-1:-1:-1;92659:27:0;;92624:62;:32;;;;:62;92226:466::o;131140:1069::-;131330:4;;:29;;-1:-1:-1;;;131330:29:0;;131221:7;;;;;;131312:48;;131321:7;;-1:-1:-1;;;;;131330:4:0;;:14;;:29;;131353:4;;131330:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;131312:8;:48::i;:::-;131286:74;-1:-1:-1;;;;;;131373:27:0;;131395:4;131373:27;131369:92;;131411:4;;:42;;-1:-1:-1;;;131411:42:0;;-1:-1:-1;;;;;131411:4:0;;;;:13;;:42;;131425:10;;131437:15;;131411:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;131369:92;131495:15;;131469:23;131599:28;:7;131495:15;131599:11;:28::i;:::-;131572:55;-1:-1:-1;131696:20:0;;131692:391;;131727:37;131767:14;:7;:12;:14::i;:::-;131727:54;-1:-1:-1;131791:23:0;;131843:94;131727:54;131875:10;131896:16;131791:23;131843:21;:94::i;:::-;131790:147;;-1:-1:-1;131790:147:0;-1:-1:-1;131966:36:0;:15;131790:147;131966:19;:36::i;:::-;131948:54;-1:-1:-1;132034:41:0;:20;132059:15;132034:24;:41::i;:::-;132011:64;;131692:391;;;;132108:14;;:40;;132127:20;132108:18;:40::i;:::-;132091:14;:57;-1:-1:-1;132165:15:0;;-1:-1:-1;132182:20:0;-1:-1:-1;;131140:1069:0;;;;;;:::o;20153:166::-;20239:7;20275:12;20267:6;;;;20259:29;;;;-1:-1:-1;;;20259:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;20306:5:0;;;20153:166::o;92808:146::-;92920:21;:5;92936:4;92920:15;:21::i;:::-;92943:4;92912:36;;;;;-1:-1:-1;;;92912:36:0;;;;;;;;:::i;:::-;;92808:146;;;:::o;127356:251::-;127425:4;;127438:10;;127425:31;;-1:-1:-1;;;127425:31:0;;-1:-1:-1;;;;;127425:4:0;;;;:12;;:31;;127438:10;;;127449:6;;127425:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;127479:10:0;;127467:56;;-1:-1:-1;;;127467:56:0;;-1:-1:-1;;;;;127479:10:0;;;;127467:34;;:56;;127510:4;;127516:6;;127467:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;127573:5:0;;:28;;-1:-1:-1;;;127573:28:0;;-1:-1:-1;;;;;127573:5:0;;;;-1:-1:-1;127573:20:0;;-1:-1:-1;127573:28:0;;127594:6;;127573:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;127356:251;:::o;130061:609::-;130169:13;;130136:7;;;;130169:13;;;;;;:41;;-1:-1:-1;130200:10:0;;-1:-1:-1;;;;;130200:10:0;130186;:24;130169:41;:76;;;;130226:19;:7;:17;:19::i;:::-;130214:8;:31;;130169:76;130161:209;;;;-1:-1:-1;;;130161:209:0;;;;;;;:::i;:::-;130379:31;130413:21;:7;130425:8;130413:11;:21::i;:::-;130379:55;-1:-1:-1;130442:24:0;;130495:46;130379:55;130519:4;130526:7;130442:24;130495:15;:46::i;:::-;130441:100;;;;130569:8;130555:58;130579:16;130597:15;130555:58;;;;;;;:::i;:::-;;;;;;;;130630:16;;;;-1:-1:-1;130061:609:0;-1:-1:-1;;;;130061:609:0:o;118713:259::-;118759:7;118777:37;118817:14;:7;:12;:14::i;:::-;118777:54;;118838:24;118865:25;:12;:23;:25::i;:::-;118838:52;;118904:30;118917:16;118904:30;;;;;;:::i;:::-;;;;;;;;118950:16;-1:-1:-1;;118713:259:0;:::o;17788:158::-;17846:7;17879:1;17874;:6;;17866:49;;;;-1:-1:-1;;;17866:49:0;;;;;;;:::i;:::-;-1:-1:-1;17933:5:0;;;17788:158::o;17326:179::-;17384:7;17416:5;;;17440:6;;;;17432:46;;;;-1:-1:-1;;;17432:46:0;;;;;;;:::i;103299:109::-;103381:21;;103299:109::o;93361:415::-;93455:7;;93497:26;:5;93518:4;93497:20;:26::i;:::-;93471:52;-1:-1:-1;93534:20:0;93530:65;;-1:-1:-1;;93572:15:0;;;;93565:22;;93530:65;93631:15;;;;93657:36;;;93653:67;;93711:1;93704:8;;;;;;93653:67;93735:35;;93361:415;-1:-1:-1;;;93361:415:0:o;129309:412::-;-1:-1:-1;;;;;129391:45:0;;129383:112;;;;-1:-1:-1;;;129383:112:0;;;;;;;:::i;:::-;129530:4;;129510:16;;;-1:-1:-1;;;129510:16:0;;;;-1:-1:-1;;;;;129530:4:0;;;;129510:14;;;;;:16;;;;;;;;;;;;;;:14;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;129510:24:0;;129502:71;;;;-1:-1:-1;;;129502:71:0;;;;;;;:::i;:::-;129595:77;;;;;;;;;-1:-1:-1;;;;;129595:77:0;;;;-1:-1:-1;129595:77:0;;;;129582:91;;:7;;:12;:91::i;:::-;129687:28;;-1:-1:-1;;;;;129687:28:0;;;;;;;;129309:412;:::o;101708:329::-;101783:7;101792;101834:5;:20;;;101812:18;:5;:16;:18::i;:::-;:42;101808:78;;-1:-1:-1;101873:1:0;;-1:-1:-1;101873:1:0;101865:13;;101808:78;101892:23;101918:44;101941:5;:20;;;101918:18;:5;:16;:18::i;:::-;:22;;:44::i;:::-;101892:70;-1:-1:-1;101976:55:0;:5;101997:10;101892:70;102026:4;101976:20;:55::i;:::-;101969:62;;;;;101708:329;;;;;:::o;18903:153::-;18961:7;18993:1;18989;:5;18981:44;;;;-1:-1:-1;;;18981:44:0;;;;;;;:::i;:::-;19047:1;19043;:5;;;;;;;18903:153;-1:-1:-1;;;18903:153:0:o;25980:188::-;26036:15;;:::i;:::-;26060:9;26084:10;;;:52;;-1:-1:-1;;25917:12:0;26103:14;;;;26098:29;;:38;;26084:52;26076:61;;;;;;26151:11;;;;;;;;;;;;;25980:188;-1:-1:-1;;25980:188:0:o;27178:160::-;27251:15;;:::i;:::-;27283:10;27275:19;;;;;;27308:24;;;;;;;;27326:5;27317:4;:6;;;:14;;;;;;27308:24;;27301:31;27178:160;-1:-1:-1;;;27178:160:0:o;26285:193::-;26366:15;;:::i;:::-;26440:6;;26428:7;;26419:16;;;26414:32;;;26406:41;;;;;;26461:11;;;;;;;;;;;;;26285:193;-1:-1:-1;;;26285:193:0:o;93782:441::-;93878:7;;93920:26;:5;93941:4;93920:20;:26::i;:::-;93894:52;-1:-1:-1;93957:20:0;93953:67;;-1:-1:-1;;93995:17:0;;;;93988:24;;93953:67;94056:15;;;;94082:36;;;94078:67;;94136:1;94129:8;;;;;;94078:67;94160:17;;;;94181:35;;94160:57;;-1:-1:-1;93782:441:0;;;;:::o;94456:547::-;94545:7;94561:61;;:::i;:::-;-1:-1:-1;94561:91:0;;;;;;;;;94625:27;;;94561:91;;;94659:58;;:::i;:::-;-1:-1:-1;94659:93:0;;;;;;;;;94720:32;;;94659:93;;;94765:63;:30;94659:93;94765:34;:63::i;:::-;94761:99;;94851:1;94844:8;;;;;;94761:99;94959:20;;94875:122;;:105;;:71;:30;94918:27;94875:42;:71::i;:::-;:83;;:105::i;:::-;:120;:122::i;:::-;94868:129;94456:547;-1:-1:-1;;;;;94456:547:0:o;537:106::-;595:7;626:1;622;:5;:13;;634:1;622:13;;;-1:-1:-1;630:1:0;;615:20;-1:-1:-1;537:106:0:o;102708:124::-;102765:12;102793:5;102808:17;102793:5;102808:15;:17::i;:::-;102793:33;;;;;;;;;;;;;;;;;;102786:40;;102708:124;;;:::o;100032:368::-;100142:7;;;;100221:53;:5;100242:10;100254:7;100263:10;100221:20;:53::i;:::-;100304:20;;;;100167:107;;-1:-1:-1;100167:107:0;-1:-1:-1;100304:41:0;;100167:107;100304:24;:41::i;:::-;100281:20;;;:64;100360:16;;-1:-1:-1;100378:15:0;-1:-1:-1;100032:368:0;;;;;;;:::o;93170:185::-;93254:4;;93274:70;93306:37;:5;93338:4;93306:31;:37::i;:::-;93274:31;;;;;;;;;;;;;;;:70::i;:::-;:75;;;93170:185;-1:-1:-1;;;93170:185:0:o;103029:165::-;103091:7;103107:15;103125:14;:5;:12;:14::i;:::-;103107:32;;103153:35;103165:1;103153:35;;;;;;;;;;;;;-1:-1:-1;;;103153:35:0;;;:7;:11;;:35;;;;;:::i;99675:168::-;99733:7;99749:12;99764:13;:5;:11;:13::i;:::-;99749:28;;99791:46;99805:6;-1:-1:-1;;;;;99805:16:0;;99830:4;99805:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;99791:5;;:13;:46::i;102133:107::-;102205:29;;;;;;;;-1:-1:-1;102205:29:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;102205:29:0;-1:-1:-1;;;;;102205:29:0;;;;;;;;;;;;;;;;;102133:107::o;98761:118::-;98847:13;;:26;;;-1:-1:-1;;;98847:26:0;;;;98824:7;;-1:-1:-1;;;;;98847:13:0;;:24;;:26;;;;;;;;;;;;;;:13;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;100598:671::-;100714:7;100723;100739:12;100754:13;:5;:11;:13::i;:::-;100739:28;;100776:24;100803:6;-1:-1:-1;;;;;100803:16:0;;100820:10;100803:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;100776:55;;100838:27;100868:18;:5;:16;:18::i;:::-;100895:13;;:55;;-1:-1:-1;;;100895:55:0;;100838:48;;-1:-1:-1;;;;;;100895:13:0;;:22;;:55;;100918:10;;100930:7;;100939:10;;100895:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;100984:28:0;;-1:-1:-1;;;100984:28:0;;100959:22;;-1:-1:-1;;;;;;100984:16:0;;;-1:-1:-1;100984:16:0;;:28;;101001:10;;100984:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;100959:53;-1:-1:-1;101019:24:0;101046:36;100959:53;101065:16;101046:18;:36::i;:::-;101019:63;;101091:25;101119:18;:5;:16;:18::i;:::-;101091:46;-1:-1:-1;101144:23:0;101170:42;:19;101091:46;101170:23;:42::i;:::-;101229:16;;;;-1:-1:-1;100598:671:0;;-1:-1:-1;;;;;;;;;;;100598:671:0:o;27344:221::-;27453:7;;27444:6;;27425;;-1:-1:-1;27440:48:0;;;-1:-1:-1;;;27471:9:0;;27440:48;27509:7;;27500:6;;:16;27496:47;;;-1:-1:-1;27534:1:0;27527:8;;27496:47;-1:-1:-1;27558:1:0;27344:221;;;;:::o;26626:193::-;26707:15;;:::i;:::-;26781:6;;26769:7;;26760:16;;;26755:32;;;26747:41;;;;;26967:205;27040:15;;:::i;:::-;27064:9;27088:10;;;:52;;-1:-1:-1;;27134:6:0;;27107:14;;;;27125:5;27107:14;27125:5;27102:28;;;;;:38;27088:52;27080:61;;;;;27571:105;27655:6;25917:12;27655:15;;;27571:105::o;95495:365::-;95605:30;;:::i;:::-;95647:18;95668:31;:5;95694:4;95668:25;:31::i;:::-;95647:52;-1:-1:-1;95710:15:0;95706:74;;95743:29;:27;:29::i;:::-;95736:36;;;;;95706:74;95793:61;95843:10;95793:45;95817:5;:20;;;95793:23;:45::i;:61::-;95786:68;95495:365;-1:-1:-1;;;;95495:365:0:o;98978:113::-;99063:13;;:21;;;-1:-1:-1;;;99063:21:0;;;;99036:5;;-1:-1:-1;;;;;99063:13:0;;:19;;:21;;;;;;;;;;;;;;:13;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;99217:376::-;99289:7;99379:12;99394:13;:5;:11;:13::i;:::-;99440;;99416:48;;-1:-1:-1;;;99416:48:0;;99379:28;;-1:-1:-1;;;;;;99416:15:0;;;;;;:48;;99440:13;;99456:7;;99416:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;99471:13:0;;:30;;-1:-1:-1;;;99471:30:0;;-1:-1:-1;;;;;99471:13:0;;;;:21;;:30;;99493:7;;99471:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;99531:20:0;;;;:33;;-1:-1:-1;99556:7:0;99531:24;:33::i;:::-;99508:20;;;:56;-1:-1:-1;99580:7:0;;-1:-1:-1;99217:376:0;;;;:::o;26174:105::-;26221:15;;:::i;:::-;-1:-1:-1;26252:21:0;;;;;;;;;-1:-1:-1;;26252:21:0;;26174:105;:::o;-1:-1:-1:-;;;;;;;;;;;;;;:::o;1187:241::-;;1291:2;1279:9;1270:7;1266:23;1262:32;1259:2;;;-1:-1;;1297:12;1259:2;85:6;72:20;97:33;124:5;97:33;:::i;1435:366::-;;;1556:2;1544:9;1535:7;1531:23;1527:32;1524:2;;;-1:-1;;1562:12;1524:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1614:63;1714:2;1753:22;;;;976:20;;-1:-1;;;1518:283::o;1808:235::-;;1909:2;1897:9;1888:7;1884:23;1880:32;1877:2;;;-1:-1;;1915:12;1877:2;219:6;206:20;231:30;255:5;231:30;:::i;2050:257::-;;2162:2;2150:9;2141:7;2137:23;2133:32;2130:2;;;-1:-1;;2168:12;2130:2;354:6;348:13;366:30;390:5;366:30;:::i;2618:291::-;;2747:2;2735:9;2726:7;2722:23;2718:32;2715:2;;;-1:-1;;2753:12;2715:2;699:6;693:13;711:47;752:5;711:47;:::i;2916:261::-;;3030:2;3018:9;3009:7;3005:23;3001:32;2998:2;;;-1:-1;;3036:12;2998:2;-1:-1;847:13;;2992:185;-1:-1;2992:185::o;3184:241::-;;3288:2;3276:9;3267:7;3263:23;3259:32;3256:2;;;-1:-1;;3294:12;3256:2;-1:-1;976:20;;3250:175;-1:-1;3250:175::o;3702:366::-;;;3823:2;3811:9;3802:7;3798:23;3794:32;3791:2;;;-1:-1;;3829:12;3791:2;-1:-1;;976:20;;;3981:2;4020:22;;;976:20;;-1:-1;3785:283::o;15521:222::-;-1:-1;;;;;32117:54;;;;4295:37;;15648:2;15633:18;;15619:124::o;15995:476::-;-1:-1;;;;;32117:54;;;4154:58;;32117:54;;;;16374:2;16359:18;;4154:58;16457:2;16442:18;;15352:37;;;;16194:2;16179:18;;16165:306::o;16478:349::-;-1:-1;;;;;32117:54;;;;4154:58;;16813:2;16798:18;;15352:37;16641:2;16626:18;;16612:215::o;17174:432::-;-1:-1;;;;;32117:54;;;;4295:37;;17515:2;17500:18;;15352:37;;;;31713:13;31706:21;17592:2;17577:18;;4409:34;17351:2;17336:18;;17322:284::o;17613:210::-;31713:13;;31706:21;4409:34;;17734:2;17719:18;;17705:118::o;18647:310::-;;18794:2;;18815:17;18808:47;5278:5;31336:12;31493:6;18794:2;18783:9;18779:18;31481:19;-1:-1;33761:101;33775:6;33772:1;33769:13;33761:101;;;33842:11;;;;;33836:18;33823:11;;;31521:14;33823:11;33816:39;33790:10;;33761:101;;;33877:6;33874:1;33871:13;33868:2;;;-1:-1;31521:14;33933:6;18783:9;33924:16;;33917:27;33868:2;-1:-1;34049:7;34033:14;-1:-1;;34029:28;5436:39;;;;31521:14;5436:39;;18765:192;-1:-1;;;18765:192::o;18964:416::-;19164:2;19178:47;;;5712:2;19149:18;;;31481:19;5748:34;31521:14;;;5728:55;-1:-1;;;5803:12;;;5796:44;5859:12;;;19135:245::o;19387:416::-;19587:2;19601:47;;;6110:2;19572:18;;;31481:19;6146:34;31521:14;;;6126:55;6215:32;6201:12;;;6194:54;6267:12;;;19558:245::o;19810:416::-;20010:2;20024:47;;;6518:2;19995:18;;;31481:19;6554:29;31521:14;;;6534:50;6603:12;;;19981:245::o;20233:416::-;20433:2;20447:47;;;20418:18;;;31481:19;6890:34;31521:14;;;6870:55;6944:12;;;20404:245::o;20656:416::-;20856:2;20870:47;;;7195:2;20841:18;;;31481:19;7231:34;31521:14;;;7211:55;-1:-1;;;7286:12;;;7279:46;7344:12;;;20827:245::o;21079:416::-;21279:2;21293:47;;;7595:2;21264:18;;;31481:19;7631:32;31521:14;;;7611:53;7683:12;;;21250:245::o;21502:416::-;21702:2;21716:47;;;7934:2;21687:18;;;31481:19;7970:28;31521:14;;;7950:49;8018:12;;;21673:245::o;21925:416::-;22125:2;22139:47;;;8269:3;22110:18;;;31481:19;8306:34;31521:14;;;8286:55;8375:34;8361:12;;;8354:56;8444:34;8430:12;;;8423:56;8513:26;8499:12;;;8492:48;8559:13;;;22096:245::o;22348:416::-;22548:2;22562:47;;;8811:2;22533:18;;;31481:19;8847:34;31521:14;;;8827:55;-1:-1;;;8902:12;;;8895:44;8958:12;;;22519:245::o;22771:416::-;22971:2;22985:47;;;9209:2;22956:18;;;31481:19;9245:34;31521:14;;;9225:55;-1:-1;;;9300:12;;;9293:27;9339:12;;;22942:245::o;23194:416::-;23394:2;23408:47;;;9590:2;23379:18;;;31481:19;9626:34;31521:14;;;9606:55;-1:-1;;;9681:12;;;9674:25;9718:12;;;23365:245::o;23617:416::-;23817:2;23831:47;;;9969:2;23802:18;;;31481:19;10005:34;31521:14;;;9985:55;-1:-1;;;10060:12;;;10053:42;10114:12;;;23788:245::o;24040:416::-;24240:2;24254:47;;;10365:2;24225:18;;;31481:19;10401:33;31521:14;;;10381:54;10454:12;;;24211:245::o;24463:416::-;24663:2;24677:47;;;10705:2;24648:18;;;31481:19;10741:34;31521:14;;;10721:55;10810:27;10796:12;;;10789:49;10857:12;;;24634:245::o;24886:416::-;25086:2;25100:47;;;11108:2;25071:18;;;31481:19;11144:34;31521:14;;;11124:55;-1:-1;;;11199:12;;;11192:27;11238:12;;;25057:245::o;25309:416::-;25509:2;25523:47;;;11489:2;25494:18;;;31481:19;11525:34;31521:14;;;11505:55;11594:27;11580:12;;;11573:49;11641:12;;;25480:245::o;25732:416::-;25932:2;25946:47;;;11892:2;25917:18;;;31481:19;11928:34;31521:14;;;11908:55;-1:-1;;;11983:12;;;11976:41;12036:12;;;25903:245::o;26155:416::-;26355:2;26369:47;;;26155:416;26340:18;;;31481:19;31521:14;;;26326:245::o;26578:416::-;26778:2;26792:47;;;12558:2;26763:18;;;31481:19;12594:34;31521:14;;;12574:55;-1:-1;;;12649:12;;;12642:30;12691:12;;;26749:245::o;27001:416::-;27201:2;27215:47;;;12942:2;27186:18;;;31481:19;12978:34;31521:14;;;12958:55;-1:-1;;;13033:12;;;13026:26;13071:12;;;27172:245::o;27424:416::-;27624:2;27638:47;;;13322:2;27609:18;;;31481:19;13358:25;31521:14;;;13338:46;13403:12;;;27595:245::o;27847:416::-;28047:2;28061:47;;;13654:2;28032:18;;;31481:19;13690:34;31521:14;;;13670:55;-1:-1;;;13745:12;;;13738:37;13794:12;;;28018:245::o;28270:416::-;28470:2;28484:47;;;14045:2;28455:18;;;31481:19;14081:33;31521:14;;;14061:54;14134:12;;;28441:245::o;28693:416::-;28893:2;28907:47;;;14385:2;28878:18;;;31481:19;-1:-1;;;31521:14;;;14401:41;14461:12;;;28864:245::o;29116:416::-;29316:2;29330:47;;;14712:2;29301:18;;;31481:19;14748:34;31521:14;;;14728:55;14817:29;14803:12;;;14796:51;14866:12;;;29287:245::o;29539:326::-;15171:23;;15352:37;;29718:2;29703:18;;29689:176::o;29872:222::-;15352:37;;;29999:2;29984:18;;29970:124::o;30101:349::-;15352:37;;;30436:2;30421:18;;5063:58;30264:2;30249:18;;30235:215::o;30797:444::-;15352:37;;;31144:2;31129:18;;15352:37;;;;31227:2;31212:18;;15352:37;30980:2;30965:18;;30951:290::o;34070:117::-;-1:-1;;;;;32117:54;;34129:35;;34119:2;;34178:1;;34168:12;34194:111;34275:5;31713:13;31706:21;34253:5;34250:32;34240:2;;34296:1;;34286:12
Swarm Source
ipfs://3633761964f83d46ad749010131a86b6dab7471589f472304d1b81eca74ba9dc
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.