Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 5 from a total of 5 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Curve Tolera... | 13757863 | 1506 days ago | IN | 0 ETH | 0.00219444 | ||||
| Set Curve Tolera... | 13308206 | 1576 days ago | IN | 0 ETH | 0.00193133 | ||||
| Set Oracle Toler... | 13308201 | 1576 days ago | IN | 0 ETH | 0.00185915 | ||||
| Update Ratios | 13303705 | 1577 days ago | IN | 0 ETH | 0.01814825 | ||||
| Set Controller | 13303668 | 1577 days ago | IN | 0 ETH | 0.00315972 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Buoy3Pool
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-09-26
*/
// SPDX-License-Identifier: MIT AND AGPLv3
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: @chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol
pragma solidity >=0.6.0;
interface AggregatorV3Interface {
function decimals() external view returns (uint8);
function description() external view returns (string memory);
function version() external view returns (uint256);
// getRoundData and latestRoundData should both raise "No data present"
// if they do not have data to report, instead of returning unset values
// which could be misinterpreted as actual reported values.
function getRoundData(uint80 _roundId)
external
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
function latestRoundData()
external
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
}
// File: contracts/common/Constants.sol
pragma solidity >=0.6.0 <0.7.0;
contract Constants {
uint8 public constant N_COINS = 3;
uint8 public constant DEFAULT_DECIMALS = 18; // GToken and Controller use this decimals
uint256 public constant DEFAULT_DECIMALS_FACTOR = uint256(10)**DEFAULT_DECIMALS;
uint8 public constant CHAINLINK_PRICE_DECIMALS = 8;
uint256 public constant CHAINLINK_PRICE_DECIMAL_FACTOR = uint256(10)**CHAINLINK_PRICE_DECIMALS;
uint8 public constant PERCENTAGE_DECIMALS = 4;
uint256 public constant PERCENTAGE_DECIMAL_FACTOR = uint256(10)**PERCENTAGE_DECIMALS;
uint256 public constant CURVE_RATIO_DECIMALS = 6;
uint256 public constant CURVE_RATIO_DECIMALS_FACTOR = uint256(10)**CURVE_RATIO_DECIMALS;
}
// File: contracts/interfaces/IToken.sol
pragma solidity >=0.6.0 <0.7.0;
interface IToken {
function factor() external view returns (uint256);
function factor(uint256 totalAssets) external view returns (uint256);
function mint(
address account,
uint256 _factor,
uint256 amount
) external;
function burn(
address account,
uint256 _factor,
uint256 amount
) external;
function burnAll(address account) external;
function totalAssets() external view returns (uint256);
function getPricePerShare() external view returns (uint256);
function getShareAssets(uint256 shares) external view returns (uint256);
function getAssets(address account) external view returns (uint256);
}
// File: contracts/interfaces/IVault.sol
pragma solidity >=0.6.0 <0.7.0;
interface IVault {
function withdraw(uint256 amount) external;
function withdraw(uint256 amount, address recipient) external;
function withdrawByStrategyOrder(
uint256 amount,
address recipient,
bool reversed
) external;
function withdrawByStrategyIndex(
uint256 amount,
address recipient,
uint256 strategyIndex
) external;
function deposit(uint256 amount) external;
function updateStrategyRatio(uint256[] calldata strategyRetios) external;
function totalAssets() external view returns (uint256);
function getStrategiesLength() external view returns (uint256);
function strategyHarvestTrigger(uint256 index, uint256 callCost) external view returns (bool);
function strategyHarvest(uint256 index) external returns (bool);
function getStrategyAssets(uint256 index) external view returns (uint256);
function token() external view returns (address);
function vault() external view returns (address);
function investTrigger() external view returns (bool);
function invest() external;
}
// File: contracts/common/FixedContracts.sol
pragma solidity >=0.6.0 <0.7.0;
contract FixedStablecoins is Constants {
address public immutable DAI; // = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
address public immutable USDC; // = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
address public immutable USDT; // = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
uint256 public immutable DAI_DECIMALS; // = 1E18;
uint256 public immutable USDC_DECIMALS; // = 1E6;
uint256 public immutable USDT_DECIMALS; // = 1E6;
constructor(address[N_COINS] memory _tokens, uint256[N_COINS] memory _decimals) public {
DAI = _tokens[0];
USDC = _tokens[1];
USDT = _tokens[2];
DAI_DECIMALS = _decimals[0];
USDC_DECIMALS = _decimals[1];
USDT_DECIMALS = _decimals[2];
}
function underlyingTokens() internal view returns (address[N_COINS] memory tokens) {
tokens[0] = DAI;
tokens[1] = USDC;
tokens[2] = USDT;
}
function getToken(uint256 index) internal view returns (address) {
if (index == 0) {
return DAI;
} else if (index == 1) {
return USDC;
} else {
return USDT;
}
}
function decimals() internal view returns (uint256[N_COINS] memory _decimals) {
_decimals[0] = DAI_DECIMALS;
_decimals[1] = USDC_DECIMALS;
_decimals[2] = USDT_DECIMALS;
}
function getDecimal(uint256 index) internal view returns (uint256) {
if (index == 0) {
return DAI_DECIMALS;
} else if (index == 1) {
return USDC_DECIMALS;
} else {
return USDT_DECIMALS;
}
}
}
contract FixedGTokens {
IToken public immutable pwrd;
IToken public immutable gvt;
constructor(address _pwrd, address _gvt) public {
pwrd = IToken(_pwrd);
gvt = IToken(_gvt);
}
function gTokens(bool _pwrd) internal view returns (IToken) {
if (_pwrd) {
return pwrd;
} else {
return gvt;
}
}
}
contract FixedVaults is Constants {
address public immutable DAI_VAULT;
address public immutable USDC_VAULT;
address public immutable USDT_VAULT;
constructor(address[N_COINS] memory _vaults) public {
DAI_VAULT = _vaults[0];
USDC_VAULT = _vaults[1];
USDT_VAULT = _vaults[2];
}
function getVault(uint256 index) internal view returns (address) {
if (index == 0) {
return DAI_VAULT;
} else if (index == 1) {
return USDC_VAULT;
} else {
return USDT_VAULT;
}
}
function vaults() internal view returns (address[N_COINS] memory _vaults) {
_vaults[0] = DAI_VAULT;
_vaults[1] = USDC_VAULT;
_vaults[2] = USDT_VAULT;
}
}
// File: contracts/interfaces/ICurve.sol
pragma solidity >=0.6.0 <0.7.0;
interface ICurve3Pool {
function coins(uint256 i) external view returns (address);
function get_virtual_price() external view returns (uint256);
function get_dy(
int128 i,
int128 j,
uint256 dx
) external view returns (uint256);
function calc_withdraw_one_coin(uint256 _token_amount, int128 i) external view returns (uint256);
function calc_token_amount(uint256[3] calldata inAmounts, bool deposit) external view returns (uint256);
function balances(uint256 i) external view returns (uint256);
}
interface ICurve3Deposit {
function exchange(
int128 i,
int128 j,
uint256 dx,
uint256 min_dy
) external;
function add_liquidity(uint256[3] calldata uamounts, uint256 min_mint_amount) external;
function remove_liquidity(uint256 amount, uint256[3] calldata min_uamounts) external;
function remove_liquidity_imbalance(uint256[3] calldata amounts, uint256 max_burn_amount) external;
function remove_liquidity_one_coin(
uint256 _token_amount,
int128 i,
uint256 min_uamount
) external;
function get_dy(
int128 i,
int128 j,
uint256 dx
) external view returns (uint256);
}
interface ICurveMetaPool {
function coins(uint256 i) external view returns (address);
function get_virtual_price() external view returns (uint256);
function get_dy_underlying(
int128 i,
int128 j,
uint256 dx
) external view returns (uint256);
function calc_withdraw_one_coin(uint256 _token_amount, int128 i) external view returns (uint256);
function calc_token_amount(uint256[2] calldata inAmounts, bool deposit) external view returns (uint256);
function exchange(
int128 i,
int128 j,
uint256 dx,
uint256 min_dy
) external;
function add_liquidity(uint256[2] calldata uamounts, uint256 min_mint_amount) external;
function remove_liquidity_one_coin(
uint256 _token_amount,
int128 i,
uint256 min_uamount
) external;
}
interface ICurveZap {
function add_liquidity(uint256[4] calldata uamounts, uint256 min_mint_amount) external;
function remove_liquidity(uint256 amount, uint256[4] calldata min_uamounts) external;
function remove_liquidity_imbalance(uint256[4] calldata amounts, uint256 max_burn_amount) external;
function remove_liquidity_one_coin(
uint256 _token_amount,
int128 i,
uint256 min_uamount
) external;
function calc_withdraw_one_coin(uint256 _token_amount, int128 i) external view returns (uint256);
function calc_token_amount(uint256[4] calldata inAmounts, bool deposit) external view returns (uint256);
function pool() external view returns (address);
}
// File: @openzeppelin/contracts/GSN/Context.sol
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File: contracts/interfaces/IController.sol
pragma solidity >=0.6.0 <0.7.0;
interface IController {
function stablecoins() external view returns (address[3] memory);
function vaults() external view returns (address[3] memory);
function underlyingVaults(uint256 i) external view returns (address vault);
function curveVault() external view returns (address);
function pnl() external view returns (address);
function insurance() external view returns (address);
function lifeGuard() external view returns (address);
function buoy() external view returns (address);
function reward() external view returns (address);
function isValidBigFish(
bool pwrd,
bool deposit,
uint256 amount
) external view returns (bool);
function withdrawHandler() external view returns (address);
function emergencyHandler() external view returns (address);
function depositHandler() external view returns (address);
function totalAssets() external view returns (uint256);
function gTokenTotalAssets() external view returns (uint256);
function eoaOnly(address sender) external;
function getSkimPercent() external view returns (uint256);
function gToken(bool _pwrd) external view returns (address);
function emergencyState() external view returns (bool);
function deadCoin() external view returns (uint256);
function distributeStrategyGainLoss(uint256 gain, uint256 loss) external;
function burnGToken(
bool pwrd,
bool all,
address account,
uint256 amount,
uint256 bonus
) external;
function mintGToken(
bool pwrd,
address account,
uint256 amount
) external;
function getUserAssets(bool pwrd, address account) external view returns (uint256 deductUsd);
function referrals(address account) external view returns (address);
function addReferral(address account, address referral) external;
function getStrategiesTargetRatio() external view returns (uint256[] memory);
function withdrawalFee(bool pwrd) external view returns (uint256);
function validGTokenDecrease(uint256 amount) external view returns (bool);
}
// File: contracts/interfaces/IPausable.sol
pragma solidity >=0.6.0 <0.7.0;
interface IPausable {
function paused() external view returns (bool);
}
// File: contracts/common/Controllable.sol
pragma solidity >=0.6.0 <0.7.0;
contract Controllable is Ownable {
address public controller;
event ChangeController(address indexed oldController, address indexed newController);
/// Modifier to make a function callable only when the contract is not paused.
/// Requirements:
/// - The contract must not be paused.
modifier whenNotPaused() {
require(!_pausable().paused(), "Pausable: paused");
_;
}
/// Modifier to make a function callable only when the contract is paused
/// Requirements:
/// - The contract must be paused
modifier whenPaused() {
require(_pausable().paused(), "Pausable: not paused");
_;
}
/// @notice Returns true if the contract is paused, and false otherwise
function ctrlPaused() public view returns (bool) {
return _pausable().paused();
}
function setController(address newController) external onlyOwner {
require(newController != address(0), "setController: !0x");
address oldController = controller;
controller = newController;
emit ChangeController(oldController, newController);
}
function _controller() internal view returns (IController) {
require(controller != address(0), "Controller not set");
return IController(controller);
}
function _pausable() internal view returns (IPausable) {
require(controller != address(0), "Controller not set");
return IPausable(controller);
}
}
// File: contracts/interfaces/IBuoy.sol
pragma solidity >=0.6.0 <0.7.0;
interface IBuoy {
function safetyCheck() external view returns (bool);
function updateRatios() external returns (bool);
function updateRatiosWithTolerance(uint256 tolerance) external returns (bool);
function lpToUsd(uint256 inAmount) external view returns (uint256);
function usdToLp(uint256 inAmount) external view returns (uint256);
function stableToUsd(uint256[3] calldata inAmount, bool deposit) external view returns (uint256);
function stableToLp(uint256[3] calldata inAmount, bool deposit) external view returns (uint256);
function singleStableFromLp(uint256 inAmount, int128 i) external view returns (uint256);
function getVirtualPrice() external view returns (uint256);
function singleStableFromUsd(uint256 inAmount, int128 i) external view returns (uint256);
function singleStableToUsd(uint256 inAmount, uint256 i) external view returns (uint256);
}
// File: contracts/interfaces/IChainPrice.sol
pragma solidity >=0.6.0 <0.7.0;
interface IChainPrice {
function getPriceFeed(uint256 i) external view returns (uint256 _price);
}
// File: contracts/interfaces/IERC20Detailed.sol
pragma solidity >=0.6.0 <0.7.0;
interface IERC20Detailed {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
// File: contracts/pools/oracle/Buoy3Pool.sol
pragma solidity >=0.6.0 <0.7.0;
/// @notice Contract for calculating prices of underlying assets and LP tokens in Curve pool. Also
/// used to sanity check pool against external oracle, to ensure that pools underlying coin ratios
/// are within a specific range (measued in BP) of the external oracles coin price ratios.
/// Sanity check:
/// The Buoy checks previously recorded (cached) curve coin dy, which it compares against current curve dy,
/// blocking any interaction that is outside a certain tolerance (oracle_check_tolerance). When updting the cached
/// value, the buoy uses chainlink to ensure that curves prices arent off peg.
contract Buoy3Pool is FixedStablecoins, Controllable, IBuoy, IChainPrice {
using SafeMath for uint256;
using SafeERC20 for IERC20;
uint256 public oracle_check_tolerance = 1000;
uint256 public curve_check_tolerance = 150;
uint256 constant CHAIN_FACTOR = 100;
ICurve3Pool public immutable curvePool;
mapping(uint256 => uint256) public lastRatio;
// Chianlink price feed
address public immutable daiUsdAgg;
address public immutable usdcUsdAgg;
address public immutable usdtUsdAgg;
event LogNewOracleTolerance(uint256 oldLimit, uint256 newLimit);
event LogNewCurveTolerance(uint256 oldLimit, uint256 newLimit);
event LogNewRatios(uint256[N_COINS] newRatios);
constructor(
address _crv3pool,
address[N_COINS] memory _tokens,
uint256[N_COINS] memory _decimals,
address[N_COINS] memory aggregators
) public FixedStablecoins(_tokens, _decimals) {
curvePool = ICurve3Pool(_crv3pool);
daiUsdAgg = aggregators[0];
usdcUsdAgg = aggregators[1];
usdtUsdAgg = aggregators[2];
}
/// @notice Set limit for how much Curve pool and external oracle is allowed
/// to deviate before failing transactions
/// @param newLimit New threshold in 1E6
function setOracleTolerance(uint256 newLimit) external onlyOwner {
uint256 oldLimit = oracle_check_tolerance;
oracle_check_tolerance = newLimit;
emit LogNewOracleTolerance(oldLimit, newLimit);
}
/// @notice Set limit for how much Curve pool current and cached values
/// can deviate before failing transactions
/// @param newLimit New threshold in 1E6
function setCurveTolerance(uint256 newLimit) external onlyOwner {
uint256 oldLimit = curve_check_tolerance;
curve_check_tolerance = newLimit;
emit LogNewCurveTolerance(oldLimit, newLimit);
}
/// @notice Check the health of the Curve pool:
/// Ratios are checked by the following heuristic:
/// Orcale A - Curve
/// Oracle B - External oracle
/// Both oracles establish ratios for a set of stable coins
/// (a, b, c)
/// and product the following set of ratios:
/// (a/a, a/b, a/c), (b/b, b/a, b/c), (c/c, c/a, c/b)
/// 1) ratios between a stable coin and itself can be discarded
/// 2) inverted ratios, a/b vs b/a, while producing different results
/// should both reflect similar in any one of the two underlying assets,
/// but in opposite directions. This difference between the two will increase
/// as the two assets drift apart, but is considered insignificant at the required
/// treshold
/// This mean that the following set should provide the necessary coverage checks
/// to establish that the coins pricing is healthy:
/// (a/b, a/c, c/b))
function safetyCheck() external view override returns (bool) {
uint256 _ratio;
for (uint256 i = 1; i < N_COINS; i++) {
_ratio = curvePool.get_dy(int128(0), int128(i), getDecimal(0));
_ratio = abs(int256(_ratio) - int256(lastRatio[i - 1]));
if (_ratio > curve_check_tolerance) {
return false;
}
}
_ratio = curvePool.get_dy(int128(2), int128(1), getDecimal(1));
_ratio = abs(int256(_ratio) - int256(lastRatio[N_COINS - 1]));
if (_ratio > curve_check_tolerance) {
return false;
}
return true;
}
/// @notice Check depths in curve pool
/// @param tolerance Check that the pool is within a given tolerance
function healthCheck(uint256 tolerance) external view returns (bool, uint256) {
uint256[N_COINS] memory balances;
uint256 total;
uint256 ratio;
for (uint256 i = 0; i < N_COINS; i++) {
uint256 balance = curvePool.balances(i);
balance = balance.mul(1E18 / getDecimal(i));
total = total.add(balance);
balances[i] = balance;
}
for (uint256 i = 0; i < N_COINS; i++) {
ratio = balances[i].mul(PERCENTAGE_DECIMAL_FACTOR).div(total);
if (ratio < tolerance) {
return (false, i);
}
}
return (true, N_COINS);
}
/// @notice Updated cached curve value with a custom tolerance towards chainlink
/// @param tolerance How much difference between curve and chainlink can be tolerated
function updateRatiosWithTolerance(uint256 tolerance) external override returns (bool) {
require(msg.sender == controller || msg.sender == owner(), "updateRatiosWithTolerance: !authorized");
return _updateRatios(tolerance);
}
/// @notice Updated cached curve values
function updateRatios() external override returns (bool) {
require(msg.sender == controller || msg.sender == owner(), "updateRatios: !authorized");
return _updateRatios(oracle_check_tolerance);
}
/// @notice Get USD value for a specific input amount of tokens, slippage included
function stableToUsd(uint256[N_COINS] calldata inAmounts, bool deposit) external view override returns (uint256) {
return _stableToUsd(inAmounts, deposit);
}
/// @notice Get estimate USD price of a stablecoin amount
/// @param inAmount Token amount
/// @param i Index of token
function singleStableToUsd(uint256 inAmount, uint256 i) external view override returns (uint256) {
uint256[N_COINS] memory inAmounts;
inAmounts[i] = inAmount;
return _stableToUsd(inAmounts, true);
}
/// @notice Get LP token value of input amount of tokens
function stableToLp(uint256[N_COINS] calldata tokenAmounts, bool deposit) external view override returns (uint256) {
return _stableToLp(tokenAmounts, deposit);
}
/// @notice Get LP token value of input amount of single token
function singleStableFromUsd(uint256 inAmount, int128 i) external view override returns (uint256) {
return _singleStableFromLp(_usdToLp(inAmount), i);
}
/// @notice Get LP token value of input amount of single token
function singleStableFromLp(uint256 inAmount, int128 i) external view override returns (uint256) {
return _singleStableFromLp(inAmount, i);
}
/// @notice Get USD price of LP tokens you receive for a specific input amount of tokens, slippage included
function lpToUsd(uint256 inAmount) external view override returns (uint256) {
return _lpToUsd(inAmount);
}
/// @notice Convert USD amount to LP tokens
function usdToLp(uint256 inAmount) external view override returns (uint256) {
return _usdToLp(inAmount);
}
/// @notice Split LP token amount to balance of pool tokens
/// @param inAmount Amount of LP tokens
/// @param totalBalance Total balance of pool
function poolBalances(uint256 inAmount, uint256 totalBalance)
internal
view
returns (uint256[N_COINS] memory balances)
{
uint256[N_COINS] memory _balances;
for (uint256 i = 0; i < N_COINS; i++) {
_balances[i] = (IERC20(getToken(i)).balanceOf(address(curvePool)).mul(inAmount)).div(totalBalance);
}
balances = _balances;
}
function getVirtualPrice() external view override returns (uint256) {
return curvePool.get_virtual_price();
}
// Internal functions
function _lpToUsd(uint256 inAmount) internal view returns (uint256) {
return inAmount.mul(curvePool.get_virtual_price()).div(DEFAULT_DECIMALS_FACTOR);
}
function _stableToUsd(uint256[N_COINS] memory tokenAmounts, bool deposit) internal view returns (uint256) {
uint256 lpAmount = curvePool.calc_token_amount(tokenAmounts, deposit);
return _lpToUsd(lpAmount);
}
function _stableToLp(uint256[N_COINS] memory tokenAmounts, bool deposit) internal view returns (uint256) {
return curvePool.calc_token_amount(tokenAmounts, deposit);
}
function _singleStableFromLp(uint256 inAmount, int128 i) internal view returns (uint256) {
if (inAmount == 0) {
return 0;
}
return curvePool.calc_withdraw_one_coin(inAmount, i);
}
/// @notice Convert USD amount to LP tokens
function _usdToLp(uint256 inAmount) internal view returns (uint256) {
return inAmount.mul(DEFAULT_DECIMALS_FACTOR).div(curvePool.get_virtual_price());
}
/// @notice Calculate price ratios for stablecoins
/// Get USD price data for stablecoin
/// @param i Stablecoin to get USD price for
function getPriceFeed(uint256 i) external view override returns (uint256) {
int256 _price;
(, _price, , ,) = AggregatorV3Interface(getAggregator(i)).latestRoundData();
return uint256(_price);
}
/// @notice Fetch chainlink token ratios
/// @param i Token in
function getTokenRatios(uint256 i) private view returns (uint256[N_COINS] memory _ratios) {
int256[N_COINS] memory _prices;
(,_prices[0], , ,) = AggregatorV3Interface(getAggregator(0)).latestRoundData();
(,_prices[1], , ,) = AggregatorV3Interface(getAggregator(1)).latestRoundData();
(,_prices[2], , ,) = AggregatorV3Interface(getAggregator(2)).latestRoundData();
_ratios[0] = uint256(_prices[0]).mul(CHAINLINK_PRICE_DECIMAL_FACTOR).div(uint256(_prices[1]));
_ratios[1] = uint256(_prices[0]).mul(CHAINLINK_PRICE_DECIMAL_FACTOR).div(uint256(_prices[2]));
_ratios[2] = uint256(_prices[2]).mul(CHAINLINK_PRICE_DECIMAL_FACTOR).div(uint256(_prices[1]));
return _ratios;
}
function getAggregator(uint256 index) private view returns (address) {
require(index < N_COINS, 'getAggregator: !index < N_COINS');
if (index == 0) {
return daiUsdAgg;
} else if (index == 1) {
return usdcUsdAgg;
} else {
return usdtUsdAgg;
}
}
/// @notice Get absolute value
function abs(int256 x) private pure returns (uint256) {
return x >= 0 ? uint256(x) : uint256(-x);
}
function _updateRatios(uint256 tolerance) private returns (bool) {
uint256[N_COINS] memory chainRatios = getTokenRatios(0);
uint256[N_COINS] memory newRatios;
uint256 _ratio;
uint256 check;
for (uint256 i = 1; i < N_COINS; i++) {
_ratio = curvePool.get_dy(int128(0), int128(i), getDecimal(0));
check = abs(int256(_ratio) - int256(chainRatios[i - 1].div(CHAIN_FACTOR)));
if (check > tolerance) {
return false;
} else {
newRatios[i - 1] = _ratio;
}
}
_ratio = curvePool.get_dy(int128(2), int128(1), getDecimal(1));
check = abs(int256(_ratio) - int256(chainRatios[2]/CHAIN_FACTOR));
if (check > tolerance) {
return false;
}
newRatios[N_COINS - 1] = _ratio;
for (uint256 i; i < N_COINS; i++) {
lastRatio[i] = newRatios[i];
}
emit LogNewRatios(newRatios);
return true;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_crv3pool","type":"address"},{"internalType":"address[3]","name":"_tokens","type":"address[3]"},{"internalType":"uint256[3]","name":"_decimals","type":"uint256[3]"},{"internalType":"address[3]","name":"aggregators","type":"address[3]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldController","type":"address"},{"indexed":true,"internalType":"address","name":"newController","type":"address"}],"name":"ChangeController","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"LogNewCurveTolerance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"LogNewOracleTolerance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[3]","name":"newRatios","type":"uint256[3]"}],"name":"LogNewRatios","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"CHAINLINK_PRICE_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHAINLINK_PRICE_DECIMAL_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_RATIO_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_RATIO_DECIMALS_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAI","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAI_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_DECIMALS_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"N_COINS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_DECIMAL_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDT_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ctrlPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curvePool","outputs":[{"internalType":"contract ICurve3Pool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curve_check_tolerance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daiUsdAgg","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getPriceFeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVirtualPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tolerance","type":"uint256"}],"name":"healthCheck","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"inAmount","type":"uint256"}],"name":"lpToUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle_check_tolerance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safetyCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newController","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setCurveTolerance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setOracleTolerance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"inAmount","type":"uint256"},{"internalType":"int128","name":"i","type":"int128"}],"name":"singleStableFromLp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"inAmount","type":"uint256"},{"internalType":"int128","name":"i","type":"int128"}],"name":"singleStableFromUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"inAmount","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"}],"name":"singleStableToUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[3]","name":"tokenAmounts","type":"uint256[3]"},{"internalType":"bool","name":"deposit","type":"bool"}],"name":"stableToLp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[3]","name":"inAmounts","type":"uint256[3]"},{"internalType":"bool","name":"deposit","type":"bool"}],"name":"stableToUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateRatios","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tolerance","type":"uint256"}],"name":"updateRatiosWithTolerance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"inAmount","type":"uint256"}],"name":"usdToLp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdcUsdAgg","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdtUsdAgg","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6101c06040526103e8600255609660035534801561001c57600080fd5b5060405161204b38038061204b833981810160405261014081101561004057600080fd5b5080516020820180516001600160601b0319606091821b811660809081526040860151831b821660a09081528387015190931b90911660c0908152908501805160e09081529286015161010052908501516101205292939192910160006100a5610132565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606094851b8116610140528151851b8116610160526020820151851b81166101805260409091015190931b9092166101a052506101369050565b3390565b60805160601c60a05160601c60c05160601c60e05161010051610120516101405160601c6101605160601c6101805160601c6101a05160601c611e3a610211600039806107f25280611aca5250806111325280611aa35250806111df5280611a7352508061060c52806107c75280610c0e5280610d005280610f98528061121352806112a4528061134a52806115ce52806116c552806117d7528061197f525080611016528061144b525080610e8152806114245250806109c952806113f4525080610eaa525080610a1c525080610f725250611e3a6000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c806392eefe9b11610151578063e25aa5fa116100c3578063ef2cfd1a11610087578063ef2cfd1a14610549578063f2fde38b14610551578063f5a5299e14610577578063f77c47911461057f578063f91d443f14610587578063fa3afdcf146105a457610269565b8063e25aa5fa1461050c578063e38ef15d14610514578063e8ad48851461051c578063e963f18f14610539578063ea0d5c521461054157610269565b8063c1419def11610115578063c1419def146104c7578063c5008f46146104cf578063c54e44eb146104d7578063cc2a2c23146104df578063e0501ecf146104fc578063e0bab4c41461050457610269565b806392eefe9b1461044e578063ae35980f14610474578063ae70b98a1461049a578063aff1d8e5146104a2578063b6217980146104aa57610269565b8063538ef7e1116101ea5780637ffc945c116101ae5780637ffc945c146103ee578063884d9812146103f657806389a30271146104195780638b86ecc1146104215780638da5cb5b1461043e578063907064251461044657610269565b8063538ef7e11461038e57806365b68d51146103b157806366c2bdcf146103b95780636f923e73146103dc578063715018a6146103e457610269565b8063218751b211610231578063218751b214610334578063250108f614610358578063286a90d41461036057806329357750146103685780633d0609f71461038657610269565b806303e6f5cc1461026e5780630cf9b5041461029d57806310a2862a146102ba57806317497176146102e057806319e4099314610318575b600080fd5b61028b6004803603602081101561028457600080fd5b50356105ac565b60408051918252519081900360200190f35b61028b600480360360208110156102b357600080fd5b50356105bf565b61028b600480360360408110156102d057600080fd5b5080359060200135600f0b6105d1565b6102fd600480360360208110156102f657600080fd5b50356105ee565b60408051921515835260208301919091528051918290030190f35b610320610751565b604080519115158252519081900360200190f35b61033c6107c5565b604080516001600160a01b039092168252519081900360200190f35b61028b6107e9565b61033c6107f0565b610370610814565b6040805160ff9092168252519081900360200190f35b61028b610819565b61028b600480360360808110156103a457600080fd5b506060810135151561081f565b610320610855565b61028b600480360360808110156103cf57600080fd5b50606081013515156108ea565b610370610920565b6103ec610925565b005b61028b6109c7565b61028b6004803603604081101561040c57600080fd5b50803590602001356109eb565b61033c610a1a565b6103ec6004803603602081101561043757600080fd5b5035610a3e565b61033c610add565b610370610aec565b6103ec6004803603602081101561046457600080fd5b50356001600160a01b0316610af1565b61028b6004803603604081101561048a57600080fd5b5080359060200135600f0b610beb565b61028b610bf7565b610320610bfd565b610320600480360360208110156104c057600080fd5b5035610e07565b61028b610e7f565b610370610ea3565b61033c610ea8565b6103ec600480360360208110156104f557600080fd5b5035610ecc565b61028b610f6b565b61033c610f70565b61028b610f94565b61028b610fef565b61028b6004803603602081101561053257600080fd5b5035610ff5565b61028b611000565b61028b611008565b61028b611014565b6103ec6004803603602081101561056757600080fd5b50356001600160a01b0316611038565b61033c611130565b61033c611154565b61028b6004803603602081101561059d57600080fd5b5035611163565b61033c6111dd565b60006105b782611201565b90505b919050565b60046020526000908152604090205481565b60006105e56105df8461129d565b83611339565b90505b92915050565b6000806105f9611d59565b60008060005b60038110156106ea5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634903b0d1836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505190506106c16106a8836113ea565b670de0b6b3a7640000816106b857fe5b8391900461146f565b90506106cd84826114c8565b9350808583600381106106dc57fe5b6020020152506001016105ff565b5060005b600381101561073f5761071e8361071861271087856003811061070d57fe5b60200201519061146f565b90611522565b9150868210156107375760009550935061074c92505050565b6001016106ee565b5060019450600393505050505b915091565b600061075b611564565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561079357600080fd5b505afa1580156107a7573d6000803e3d6000fd5b505050506040513d60208110156107bd57600080fd5b505190505b90565b7f000000000000000000000000000000000000000000000000000000000000000081565b620f424081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600381565b60035481565b60006105e58360038060200260405190810160405280929190826003602002808284376000920191909152508591506115c99050565b6001546000906001600160a01b03163314806108895750610874610add565b6001600160a01b0316336001600160a01b0316145b6108da576040805162461bcd60e51b815260206004820152601960248201527f757064617465526174696f733a2021617574686f72697a656400000000000000604482015290519081900360640190fd5b6108e5600254611696565b905090565b60006105e58360038060200260405190810160405280929190826003602002808284376000920191909152508591506119659050565b600881565b61092d6119f9565b6000546001600160a01b0390811691161461097d576040805162461bcd60e51b81526020600482018190526024820152600080516020611de5833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109f5611d59565b83818460038110610a0257fe5b6020020152610a128160016115c9565b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610a466119f9565b6000546001600160a01b03908116911614610a96576040805162461bcd60e51b81526020600482018190526024820152600080516020611de5833981519152604482015290519081900360640190fd5b6003805490829055604080518281526020810184905281517fba3dc48f186b687baac69f1763bd48ad98b41a0495ab095ef4a03fc83a545a03929181900390910190a15050565b6000546001600160a01b031690565b600481565b610af96119f9565b6000546001600160a01b03908116911614610b49576040805162461bcd60e51b81526020600482018190526024820152600080516020611de5833981519152604482015290519081900360640190fd5b6001600160a01b038116610b99576040805162461bcd60e51b81526020600482015260126024820152710e6cae886dedce8e4ded8d8cae474404260f60731b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f7bd9aab74fc8b860dff8328bda449632993abb9bd61340154740618a3debeb8990600090a35050565b60006105e58383611339565b61271081565b60008060015b6003811015610cfd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635e0d443f600083610c4860006113ea565b6040518463ffffffff1660e01b81526004018084600f0b815260200183600f0b8152602001828152602001935050505060206040518083038186803b158015610c9057600080fd5b505afa158015610ca4573d6000803e3d6000fd5b505050506040513d6020811015610cba57600080fd5b50516000198201600090815260046020526040902054909250610cde9083036119fd565b9150600354821115610cf5576000925050506107c2565b600101610c03565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635e0d443f60026001610d3b60016113ea565b6040518463ffffffff1660e01b81526004018084600f0b815260200183600f0b8152602001828152602001935050505060206040518083038186803b158015610d8357600080fd5b505afa158015610d97573d6000803e3d6000fd5b505050506040513d6020811015610dad57600080fd5b5051600260005260046020527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a754909150610de99082036119fd565b9050600354811115610dff5760009150506107c2565b600191505090565b6001546000906001600160a01b0316331480610e3b5750610e26610add565b6001600160a01b0316336001600160a01b0316145b610e765760405162461bcd60e51b8152600401808060200182810382526026815260200180611d786026913960400191505060405180910390fd5b6105b782611696565b7f000000000000000000000000000000000000000000000000000000000000000081565b601281565b7f000000000000000000000000000000000000000000000000000000000000000081565b610ed46119f9565b6000546001600160a01b03908116911614610f24576040805162461bcd60e51b81526020600482018190526024820152600080516020611de5833981519152604482015290519081900360640190fd5b6002805490829055604080518281526020810184905281517fa5dc6720c045d271d043cfd479ba542347af47c7b155c347092938a3e05fe513929181900390910190a15050565b600681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b15801561079357600080fd5b60025481565b60006105b78261129d565b6305f5e10081565b670de0b6b3a764000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6110406119f9565b6000546001600160a01b03908116911614611090576040805162461bcd60e51b81526020600482018190526024820152600080516020611de5833981519152604482015290519081900360640190fd5b6001600160a01b0381166110d55760405162461bcd60e51b8152600401808060200182810382526026815260200180611d9e6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b031681565b60008061116f83611a14565b6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156111a757600080fd5b505afa1580156111bb573d6000803e3d6000fd5b505050506040513d60a08110156111d157600080fd5b50602001519392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006105b7601260ff16600a0a6107187f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b15801561126a57600080fd5b505afa15801561127e573d6000803e3d6000fd5b505050506040513d602081101561129457600080fd5b5051859061146f565b60006105b77f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b1580156112fb57600080fd5b505afa15801561130f573d6000803e3d6000fd5b505050506040513d602081101561132557600080fd5b505161071884670de0b6b3a764000061146f565b600082611348575060006105e8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cc2b27d784846040518363ffffffff1660e01b81526004018083815260200182600f0b81526020019250505060206040518083038186803b1580156113b757600080fd5b505afa1580156113cb573d6000803e3d6000fd5b505050506040513d60208110156113e157600080fd5b50519392505050565b60008161141857507f00000000000000000000000000000000000000000000000000000000000000006105ba565b816001141561144857507f00000000000000000000000000000000000000000000000000000000000000006105ba565b507f00000000000000000000000000000000000000000000000000000000000000006105ba565b60008261147e575060006105e8565b8282028284828161148b57fe5b04146105e55760405162461bcd60e51b8152600401808060200182810382526021815260200180611dc46021913960400191505060405180910390fd5b6000828201838110156105e5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006105e583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611aee565b6001546000906001600160a01b03166115b9576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9bdb1b195c881b9bdd081cd95d60721b604482015290519081900360640190fd5b506001546001600160a01b031690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633883e11985856040518363ffffffff1660e01b81526004018083600360200280838360005b8381101561163457818101518382015260200161161c565b5050505090500182151581526020019250505060206040518083038186803b15801561165f57600080fd5b505afa158015611673573d6000803e3d6000fd5b505050506040513d602081101561168957600080fd5b50519050610a1281611201565b60006116a0611d59565b6116aa6000611b90565b90506116b4611d59565b60008060015b60038110156117d4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635e0d443f6000836116ff60006113ea565b6040518463ffffffff1660e01b81526004018084600f0b815260200183600f0b8152602001828152602001935050505060206040518083038186803b15801561174757600080fd5b505afa15801561175b573d6000803e3d6000fd5b505050506040513d602081101561177157600080fd5b5051925061179f61179860648760001985016003811061178d57fe5b602002015190611522565b84036119fd565b9150868211156117b7576000955050505050506105ba565b828460018303600381106117c757fe5b60200201526001016116ba565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635e0d443f6002600161181260016113ea565b6040518463ffffffff1660e01b81526004018084600f0b815260200183600f0b8152602001828152602001935050505060206040518083038186803b15801561185a57600080fd5b505afa15801561186e573d6000803e3d6000fd5b505050506040513d602081101561188457600080fd5b505191506118a4606485600260200201518161189c57fe5b0483036119fd565b9050858111156118bb5760009450505050506105ba565b6040830182905260005b60038110156118fc578381600381106118da57fe5b60209081029190910151600083815260049092526040909120556001016118c5565b507f996f0896b18d1c257d4f2bd31d7bbf0c90ce5a136c4d86c7818d026f03d351a3836040518082600360200280838360005b8381101561194757818101518382015260200161192f565b5050505090500191505060405180910390a150600195945050505050565b604051633883e11960e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633883e1199085908590600401808360608083838b5b838110156119ce5781810151838201526020016119b6565b5050505090500182151581526020019250505060206040518083038186803b1580156113b757600080fd5b3390565b600080821215611a1057816000036105b7565b5090565b600060038210611a6b576040805162461bcd60e51b815260206004820152601f60248201527f67657441676772656761746f723a2021696e646578203c204e5f434f494e5300604482015290519081900360640190fd5b81611a9757507f00000000000000000000000000000000000000000000000000000000000000006105ba565b8160011415611ac757507f00000000000000000000000000000000000000000000000000000000000000006105ba565b507f00000000000000000000000000000000000000000000000000000000000000006105ba565b60008183611b7a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611b3f578181015183820152602001611b27565b50505050905090810190601f168015611b6c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611b8657fe5b0495945050505050565b611b98611d59565b611ba0611d59565b611baa6000611a14565b6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611be257600080fd5b505afa158015611bf6573d6000803e3d6000fd5b505050506040513d60a0811015611c0c57600080fd5b50602001518152611c1d6001611a14565b6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611c5557600080fd5b505afa158015611c69573d6000803e3d6000fd5b505050506040513d60a0811015611c7f57600080fd5b50602001518160016020020152611c966002611a14565b6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611cce57600080fd5b505afa158015611ce2573d6000803e3d6000fd5b505050506040513d60a0811015611cf857600080fd5b50602001516040820152611d1e8160015b60200201516107186305f5e10084600061070d565b8252611d2b816002611d09565b8260016020020152611d4e81600160200201516107186305f5e10084600261070d565b604083015250919050565b6040518060600160405280600390602082028036833750919291505056fe757064617465526174696f7357697468546f6c6572616e63653a2021617574686f72697a65644f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212206f606c905fffd22373a979703435dd7fdb7284cd40e2ba5f3c8abf7f551140af64736f6c634300060c0033000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c70000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000aed0c38402a5d19df6e4c03f4e2dced6e29c1ee90000000000000000000000008fffffd4afb6115b954bd326cbe7b4ba576818f60000000000000000000000003e7d1eab13ad0104d2750b8863b489d65364e32d
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102695760003560e01c806392eefe9b11610151578063e25aa5fa116100c3578063ef2cfd1a11610087578063ef2cfd1a14610549578063f2fde38b14610551578063f5a5299e14610577578063f77c47911461057f578063f91d443f14610587578063fa3afdcf146105a457610269565b8063e25aa5fa1461050c578063e38ef15d14610514578063e8ad48851461051c578063e963f18f14610539578063ea0d5c521461054157610269565b8063c1419def11610115578063c1419def146104c7578063c5008f46146104cf578063c54e44eb146104d7578063cc2a2c23146104df578063e0501ecf146104fc578063e0bab4c41461050457610269565b806392eefe9b1461044e578063ae35980f14610474578063ae70b98a1461049a578063aff1d8e5146104a2578063b6217980146104aa57610269565b8063538ef7e1116101ea5780637ffc945c116101ae5780637ffc945c146103ee578063884d9812146103f657806389a30271146104195780638b86ecc1146104215780638da5cb5b1461043e578063907064251461044657610269565b8063538ef7e11461038e57806365b68d51146103b157806366c2bdcf146103b95780636f923e73146103dc578063715018a6146103e457610269565b8063218751b211610231578063218751b214610334578063250108f614610358578063286a90d41461036057806329357750146103685780633d0609f71461038657610269565b806303e6f5cc1461026e5780630cf9b5041461029d57806310a2862a146102ba57806317497176146102e057806319e4099314610318575b600080fd5b61028b6004803603602081101561028457600080fd5b50356105ac565b60408051918252519081900360200190f35b61028b600480360360208110156102b357600080fd5b50356105bf565b61028b600480360360408110156102d057600080fd5b5080359060200135600f0b6105d1565b6102fd600480360360208110156102f657600080fd5b50356105ee565b60408051921515835260208301919091528051918290030190f35b610320610751565b604080519115158252519081900360200190f35b61033c6107c5565b604080516001600160a01b039092168252519081900360200190f35b61028b6107e9565b61033c6107f0565b610370610814565b6040805160ff9092168252519081900360200190f35b61028b610819565b61028b600480360360808110156103a457600080fd5b506060810135151561081f565b610320610855565b61028b600480360360808110156103cf57600080fd5b50606081013515156108ea565b610370610920565b6103ec610925565b005b61028b6109c7565b61028b6004803603604081101561040c57600080fd5b50803590602001356109eb565b61033c610a1a565b6103ec6004803603602081101561043757600080fd5b5035610a3e565b61033c610add565b610370610aec565b6103ec6004803603602081101561046457600080fd5b50356001600160a01b0316610af1565b61028b6004803603604081101561048a57600080fd5b5080359060200135600f0b610beb565b61028b610bf7565b610320610bfd565b610320600480360360208110156104c057600080fd5b5035610e07565b61028b610e7f565b610370610ea3565b61033c610ea8565b6103ec600480360360208110156104f557600080fd5b5035610ecc565b61028b610f6b565b61033c610f70565b61028b610f94565b61028b610fef565b61028b6004803603602081101561053257600080fd5b5035610ff5565b61028b611000565b61028b611008565b61028b611014565b6103ec6004803603602081101561056757600080fd5b50356001600160a01b0316611038565b61033c611130565b61033c611154565b61028b6004803603602081101561059d57600080fd5b5035611163565b61033c6111dd565b60006105b782611201565b90505b919050565b60046020526000908152604090205481565b60006105e56105df8461129d565b83611339565b90505b92915050565b6000806105f9611d59565b60008060005b60038110156106ea5760007f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b0316634903b0d1836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b505190506106c16106a8836113ea565b670de0b6b3a7640000816106b857fe5b8391900461146f565b90506106cd84826114c8565b9350808583600381106106dc57fe5b6020020152506001016105ff565b5060005b600381101561073f5761071e8361071861271087856003811061070d57fe5b60200201519061146f565b90611522565b9150868210156107375760009550935061074c92505050565b6001016106ee565b5060019450600393505050505b915091565b600061075b611564565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561079357600080fd5b505afa1580156107a7573d6000803e3d6000fd5b505050506040513d60208110156107bd57600080fd5b505190505b90565b7f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c781565b620f424081565b7f0000000000000000000000003e7d1eab13ad0104d2750b8863b489d65364e32d81565b600381565b60035481565b60006105e58360038060200260405190810160405280929190826003602002808284376000920191909152508591506115c99050565b6001546000906001600160a01b03163314806108895750610874610add565b6001600160a01b0316336001600160a01b0316145b6108da576040805162461bcd60e51b815260206004820152601960248201527f757064617465526174696f733a2021617574686f72697a656400000000000000604482015290519081900360640190fd5b6108e5600254611696565b905090565b60006105e58360038060200260405190810160405280929190826003602002808284376000920191909152508591506119659050565b600881565b61092d6119f9565b6000546001600160a01b0390811691161461097d576040805162461bcd60e51b81526020600482018190526024820152600080516020611de5833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b60006109f5611d59565b83818460038110610a0257fe5b6020020152610a128160016115c9565b949350505050565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b610a466119f9565b6000546001600160a01b03908116911614610a96576040805162461bcd60e51b81526020600482018190526024820152600080516020611de5833981519152604482015290519081900360640190fd5b6003805490829055604080518281526020810184905281517fba3dc48f186b687baac69f1763bd48ad98b41a0495ab095ef4a03fc83a545a03929181900390910190a15050565b6000546001600160a01b031690565b600481565b610af96119f9565b6000546001600160a01b03908116911614610b49576040805162461bcd60e51b81526020600482018190526024820152600080516020611de5833981519152604482015290519081900360640190fd5b6001600160a01b038116610b99576040805162461bcd60e51b81526020600482015260126024820152710e6cae886dedce8e4ded8d8cae474404260f60731b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f7bd9aab74fc8b860dff8328bda449632993abb9bd61340154740618a3debeb8990600090a35050565b60006105e58383611339565b61271081565b60008060015b6003811015610cfd577f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b0316635e0d443f600083610c4860006113ea565b6040518463ffffffff1660e01b81526004018084600f0b815260200183600f0b8152602001828152602001935050505060206040518083038186803b158015610c9057600080fd5b505afa158015610ca4573d6000803e3d6000fd5b505050506040513d6020811015610cba57600080fd5b50516000198201600090815260046020526040902054909250610cde9083036119fd565b9150600354821115610cf5576000925050506107c2565b600101610c03565b507f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b0316635e0d443f60026001610d3b60016113ea565b6040518463ffffffff1660e01b81526004018084600f0b815260200183600f0b8152602001828152602001935050505060206040518083038186803b158015610d8357600080fd5b505afa158015610d97573d6000803e3d6000fd5b505050506040513d6020811015610dad57600080fd5b5051600260005260046020527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a754909150610de99082036119fd565b9050600354811115610dff5760009150506107c2565b600191505090565b6001546000906001600160a01b0316331480610e3b5750610e26610add565b6001600160a01b0316336001600160a01b0316145b610e765760405162461bcd60e51b8152600401808060200182810382526026815260200180611d786026913960400191505060405180910390fd5b6105b782611696565b7f00000000000000000000000000000000000000000000000000000000000f424081565b601281565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec781565b610ed46119f9565b6000546001600160a01b03908116911614610f24576040805162461bcd60e51b81526020600482018190526024820152600080516020611de5833981519152604482015290519081900360640190fd5b6002805490829055604080518281526020810184905281517fa5dc6720c045d271d043cfd479ba542347af47c7b155c347092938a3e05fe513929181900390910190a15050565b600681565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b60007f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b15801561079357600080fd5b60025481565b60006105b78261129d565b6305f5e10081565b670de0b6b3a764000081565b7f00000000000000000000000000000000000000000000000000000000000f424081565b6110406119f9565b6000546001600160a01b03908116911614611090576040805162461bcd60e51b81526020600482018190526024820152600080516020611de5833981519152604482015290519081900360640190fd5b6001600160a01b0381166110d55760405162461bcd60e51b8152600401808060200182810382526026815260200180611d9e6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b7f0000000000000000000000008fffffd4afb6115b954bd326cbe7b4ba576818f681565b6001546001600160a01b031681565b60008061116f83611a14565b6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156111a757600080fd5b505afa1580156111bb573d6000803e3d6000fd5b505050506040513d60a08110156111d157600080fd5b50602001519392505050565b7f000000000000000000000000aed0c38402a5d19df6e4c03f4e2dced6e29c1ee981565b60006105b7601260ff16600a0a6107187f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b15801561126a57600080fd5b505afa15801561127e573d6000803e3d6000fd5b505050506040513d602081101561129457600080fd5b5051859061146f565b60006105b77f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b1580156112fb57600080fd5b505afa15801561130f573d6000803e3d6000fd5b505050506040513d602081101561132557600080fd5b505161071884670de0b6b3a764000061146f565b600082611348575060006105e8565b7f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663cc2b27d784846040518363ffffffff1660e01b81526004018083815260200182600f0b81526020019250505060206040518083038186803b1580156113b757600080fd5b505afa1580156113cb573d6000803e3d6000fd5b505050506040513d60208110156113e157600080fd5b50519392505050565b60008161141857507f0000000000000000000000000000000000000000000000000de0b6b3a76400006105ba565b816001141561144857507f00000000000000000000000000000000000000000000000000000000000f42406105ba565b507f00000000000000000000000000000000000000000000000000000000000f42406105ba565b60008261147e575060006105e8565b8282028284828161148b57fe5b04146105e55760405162461bcd60e51b8152600401808060200182810382526021815260200180611dc46021913960400191505060405180910390fd5b6000828201838110156105e5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006105e583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611aee565b6001546000906001600160a01b03166115b9576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9bdb1b195c881b9bdd081cd95d60721b604482015290519081900360640190fd5b506001546001600160a01b031690565b6000807f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b0316633883e11985856040518363ffffffff1660e01b81526004018083600360200280838360005b8381101561163457818101518382015260200161161c565b5050505090500182151581526020019250505060206040518083038186803b15801561165f57600080fd5b505afa158015611673573d6000803e3d6000fd5b505050506040513d602081101561168957600080fd5b50519050610a1281611201565b60006116a0611d59565b6116aa6000611b90565b90506116b4611d59565b60008060015b60038110156117d4577f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b0316635e0d443f6000836116ff60006113ea565b6040518463ffffffff1660e01b81526004018084600f0b815260200183600f0b8152602001828152602001935050505060206040518083038186803b15801561174757600080fd5b505afa15801561175b573d6000803e3d6000fd5b505050506040513d602081101561177157600080fd5b5051925061179f61179860648760001985016003811061178d57fe5b602002015190611522565b84036119fd565b9150868211156117b7576000955050505050506105ba565b828460018303600381106117c757fe5b60200201526001016116ba565b507f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b0316635e0d443f6002600161181260016113ea565b6040518463ffffffff1660e01b81526004018084600f0b815260200183600f0b8152602001828152602001935050505060206040518083038186803b15801561185a57600080fd5b505afa15801561186e573d6000803e3d6000fd5b505050506040513d602081101561188457600080fd5b505191506118a4606485600260200201518161189c57fe5b0483036119fd565b9050858111156118bb5760009450505050506105ba565b6040830182905260005b60038110156118fc578381600381106118da57fe5b60209081029190910151600083815260049092526040909120556001016118c5565b507f996f0896b18d1c257d4f2bd31d7bbf0c90ce5a136c4d86c7818d026f03d351a3836040518082600360200280838360005b8381101561194757818101518382015260200161192f565b5050505090500191505060405180910390a150600195945050505050565b604051633883e11960e01b81526000906001600160a01b037f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c71690633883e1199085908590600401808360608083838b5b838110156119ce5781810151838201526020016119b6565b5050505090500182151581526020019250505060206040518083038186803b1580156113b757600080fd5b3390565b600080821215611a1057816000036105b7565b5090565b600060038210611a6b576040805162461bcd60e51b815260206004820152601f60248201527f67657441676772656761746f723a2021696e646578203c204e5f434f494e5300604482015290519081900360640190fd5b81611a9757507f000000000000000000000000aed0c38402a5d19df6e4c03f4e2dced6e29c1ee96105ba565b8160011415611ac757507f0000000000000000000000008fffffd4afb6115b954bd326cbe7b4ba576818f66105ba565b507f0000000000000000000000003e7d1eab13ad0104d2750b8863b489d65364e32d6105ba565b60008183611b7a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611b3f578181015183820152602001611b27565b50505050905090810190601f168015611b6c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611b8657fe5b0495945050505050565b611b98611d59565b611ba0611d59565b611baa6000611a14565b6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611be257600080fd5b505afa158015611bf6573d6000803e3d6000fd5b505050506040513d60a0811015611c0c57600080fd5b50602001518152611c1d6001611a14565b6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611c5557600080fd5b505afa158015611c69573d6000803e3d6000fd5b505050506040513d60a0811015611c7f57600080fd5b50602001518160016020020152611c966002611a14565b6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611cce57600080fd5b505afa158015611ce2573d6000803e3d6000fd5b505050506040513d60a0811015611cf857600080fd5b50602001516040820152611d1e8160015b60200201516107186305f5e10084600061070d565b8252611d2b816002611d09565b8260016020020152611d4e81600160200201516107186305f5e10084600261070d565b604083015250919050565b6040518060600160405280600390602082028036833750919291505056fe757064617465526174696f7357697468546f6c6572616e63653a2021617574686f72697a65644f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212206f606c905fffd22373a979703435dd7fdb7284cd40e2ba5f3c8abf7f551140af64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c70000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000aed0c38402a5d19df6e4c03f4e2dced6e29c1ee90000000000000000000000008fffffd4afb6115b954bd326cbe7b4ba576818f60000000000000000000000003e7d1eab13ad0104d2750b8863b489d65364e32d
-----Decoded View---------------
Arg [0] : _crv3pool (address): 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7
Arg [1] : _tokens (address[3]): 0x6B175474E89094C44Da98b954EedeAC495271d0F,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [2] : _decimals (uint256[3]): 1000000000000000000,1000000,1000000
Arg [3] : aggregators (address[3]): 0xAed0c38402a5d19df6E4c03F4E2DceD6e29c1ee9,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,0x3E7d1eAB13ad0104d2750B8863b489D65364e32D
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c7
Arg [1] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [2] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [3] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [4] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [5] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [6] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [7] : 000000000000000000000000aed0c38402a5d19df6e4c03f4e2dced6e29c1ee9
Arg [8] : 0000000000000000000000008fffffd4afb6115b954bd326cbe7b4ba576818f6
Arg [9] : 0000000000000000000000003e7d1eab13ad0104d2750b8863b489d65364e32d
Deployed Bytecode Sourcemap
38355:11494:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45016:120;;;;;;;;;;;;;;;;-1:-1:-1;45016:120:0;;:::i;:::-;;;;;;;;;;;;;;;;38692:44;;;;;;;;;;;;;;;;-1:-1:-1;38692:44:0;;:::i;44498:166::-;;;;;;;;;;;;;;;;-1:-1:-1;44498:166:0;;;;;;;;;:::i;42149:684::-;;;;;;;;;;;;;;;;-1:-1:-1;42149:684:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;35336:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;38647:38;;;:::i;:::-;;;;-1:-1:-1;;;;;38647:38:0;;;;;;;;;;;;;;20648:87;;;:::i;38857:35::-;;;:::i;20073:33::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38554:42;;;:::i;43634:171::-;;;;;;;;;;;;;;;;-1:-1:-1;43634:171:0;;;;;;;:::i;43320:218::-;;;:::i;44247:175::-;;;;;;;;;;;;;;;;-1:-1:-1;44247:175:0;;;;;;;:::i;20292:50::-;;;:::i;31458:148::-;;;:::i;:::-;;23170:37;;;:::i;43947:230::-;;;;;;;;;;;;;;;;-1:-1:-1;43947:230:0;;;;;;;:::i;22998:29::-;;;:::i;40082:222::-;;;;;;;;;;;;;;;;-1:-1:-1;40082:222:0;;:::i;30816:79::-;;;:::i;20450:45::-;;;:::i;35439:286::-;;;;;;;;;;;;;;;;-1:-1:-1;35439:286:0;-1:-1:-1;;;;;35439:286:0;;:::i;44740:155::-;;;;;;;;;;;;;;;;-1:-1:-1;44740:155:0;;;;;;;;;:::i;20502:84::-;;;:::i;41373:650::-;;;:::i;43019:248::-;;;;;;;;;;;;;;;;-1:-1:-1;43019:248:0;;:::i;23225:38::-;;;:::i;20113:43::-;;;:::i;23083:29::-;;;:::i;39672:226::-;;;;;;;;;;;;;;;;-1:-1:-1;39672:226:0;;:::i;20593:48::-;;;:::i;22914:28::-;;;:::i;45897:123::-;;;:::i;38503:44::-;;;:::i;45193:120::-;;;;;;;;;;;;;;;;-1:-1:-1;45193:120:0;;:::i;20349:94::-;;;:::i;20206:79::-;;;:::i;23280:38::-;;;:::i;31761:244::-;;;;;;;;;;;;;;;;-1:-1:-1;31761:244:0;-1:-1:-1;;;;;31761:244:0;;:::i;38815:35::-;;;:::i;34612:25::-;;;:::i;47260:225::-;;;;;;;;;;;;;;;;-1:-1:-1;47260:225:0;;:::i;38774:34::-;;;:::i;45016:120::-;45083:7;45110:18;45119:8;45110;:18::i;:::-;45103:25;;45016:120;;;;:::o;38692:44::-;;;;;;;;;;;;;:::o;44498:166::-;44587:7;44614:42;44634:18;44643:8;44634;:18::i;:::-;44654:1;44614:19;:42::i;:::-;44607:49;;44498:166;;;;;:::o;42149:684::-;42212:4;42218:7;42238:32;;:::i;:::-;42281:13;42305;42334:9;42329:239;20105:1;42349:11;;42329:239;;;42382:15;42400:9;-1:-1:-1;;;;;42400:18:0;;42419:1;42400:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42400:21:0;;-1:-1:-1;42446:33:0;42465:13;42476:1;42465:10;:13::i;:::-;42458:4;:20;;;;;42446:7;;42458:20;;42446:11;:33::i;:::-;42436:43;-1:-1:-1;42502:18:0;:5;42436:43;42502:9;:18::i;:::-;42494:26;;42549:7;42535:8;42544:1;42535:11;;;;;;;;;;:21;-1:-1:-1;42362:3:0;;42329:239;;;;42583:9;42578:215;20105:1;42598:11;;42578:215;;;42639:53;42686:5;42639:42;20554:32;42639:8;42648:1;42639:11;;;;;;;;;;;;:15;:42::i;:::-;:46;;:53::i;:::-;42631:61;;42719:9;42711:5;:17;42707:75;;;42757:5;;-1:-1:-1;42764:1:0;-1:-1:-1;42749:17:0;;-1:-1:-1;;;42749:17:0;42707:75;42611:3;;42578:215;;;-1:-1:-1;42811:4:0;;-1:-1:-1;20105:1:0;;-1:-1:-1;;;;42149:684:0;;;;:::o;35336:95::-;35379:4;35403:11;:9;:11::i;:::-;-1:-1:-1;;;;;35403:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35403:20:0;;-1:-1:-1;35336:95:0;;:::o;38647:38::-;;;:::o;20648:87::-;20702:33;20648:87;:::o;38857:35::-;;;:::o;20073:33::-;20105:1;20073:33;:::o;38554:42::-;;;;:::o;43634:171::-;43738:7;43765:32;43778:9;43765:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43789:7:0;;-1:-1:-1;43765:12:0;;-1:-1:-1;43765:32:0:i;43320:218::-;43410:10;;43371:4;;-1:-1:-1;;;;;43410:10:0;43396;:24;;:49;;;43438:7;:5;:7::i;:::-;-1:-1:-1;;;;;43424:21:0;:10;-1:-1:-1;;;;;43424:21:0;;43396:49;43388:87;;;;;-1:-1:-1;;;43388:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43493:37;43507:22;;43493:13;:37::i;:::-;43486:44;;43320:218;:::o;44247:175::-;44353:7;44380:34;44392:12;44380:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44406:7:0;;-1:-1:-1;44380:11:0;;-1:-1:-1;44380:34:0:i;20292:50::-;20341:1;20292:50;:::o;31458:148::-;31038:12;:10;:12::i;:::-;31028:6;;-1:-1:-1;;;;;31028:6:0;;;:22;;;31020:67;;;;;-1:-1:-1;;;31020:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31020:67:0;;;;;;;;;;;;;;;31565:1:::1;31549:6:::0;;31528:40:::1;::::0;-1:-1:-1;;;;;31549:6:0;;::::1;::::0;31528:40:::1;::::0;31565:1;;31528:40:::1;31596:1;31579:19:::0;;-1:-1:-1;;;;;;31579:19:0::1;::::0;;31458:148::o;23170:37::-;;;:::o;43947:230::-;44035:7;44055:33;;:::i;:::-;44114:8;44099:9;44109:1;44099:12;;;;;;;;;;:23;44140:29;44153:9;44164:4;44140:12;:29::i;:::-;44133:36;43947:230;-1:-1:-1;;;;43947:230:0:o;22998:29::-;;;:::o;40082:222::-;31038:12;:10;:12::i;:::-;31028:6;;-1:-1:-1;;;;;31028:6:0;;;:22;;;31020:67;;;;;-1:-1:-1;;;31020:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31020:67:0;;;;;;;;;;;;;;;40176:21:::1;::::0;;40208:32;;;;40256:40:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;31098:1;40082:222:::0;:::o;30816:79::-;30854:7;30881:6;-1:-1:-1;;;;;30881:6:0;30816:79;:::o;20450:45::-;20494:1;20450:45;:::o;35439:286::-;31038:12;:10;:12::i;:::-;31028:6;;-1:-1:-1;;;;;31028:6:0;;;:22;;;31020:67;;;;;-1:-1:-1;;;31020:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31020:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35523:27:0;::::1;35515:58;;;::::0;;-1:-1:-1;;;35515:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35515:58:0;;;;;;;;;;;;;::::1;;35608:10;::::0;;-1:-1:-1;;;;;35629:26:0;;::::1;-1:-1:-1::0;;;;;;35629:26:0;::::1;::::0;::::1;::::0;;;35671:46:::1;::::0;35608:10;::::1;::::0;35629:26;35608:10;;35671:46:::1;::::0;35584:21:::1;::::0;35671:46:::1;31098:1;35439:286:::0;:::o;44740:155::-;44828:7;44855:32;44875:8;44885:1;44855:19;:32::i;20502:84::-;20554:32;20502:84;:::o;41373:650::-;41428:4;;41487:1;41470:294;20105:1;41490:11;;41470:294;;;41532:9;-1:-1:-1;;;;;41532:16:0;;41556:1;41567;41571:13;41582:1;41571:10;:13::i;:::-;41532:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41532:53:0;-1:-1:-1;;41647:5:0;;41637:16;;;;:9;41532:53;41637:16;;;;;41532:53;;-1:-1:-1;41609:46:0;;41613:41;;41609:3;:46::i;:::-;41600:55;;41683:21;;41674:6;:30;41670:83;;;41732:5;41725:12;;;;;;41670:83;41503:3;;41470:294;;;;41783:9;-1:-1:-1;;;;;41783:16:0;;41807:1;41818;41822:13;41833:1;41822:10;:13::i;:::-;41783:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41783:53:0;41894:11;41884:22;;:9;41783:53;41884:22;;;41783:53;;-1:-1:-1;41856:52:0;;41860:47;;41856:3;:52::i;:::-;41847:61;;41932:21;;41923:6;:30;41919:75;;;41977:5;41970:12;;;;;41919:75;42011:4;42004:11;;;41373:650;:::o;43019:248::-;43139:10;;43100:4;;-1:-1:-1;;;;;43139:10:0;43125;:24;;:49;;;43167:7;:5;:7::i;:::-;-1:-1:-1;;;;;43153:21:0;:10;-1:-1:-1;;;;;43153:21:0;;43125:49;43117:100;;;;-1:-1:-1;;;43117:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43235:24;43249:9;43235:13;:24::i;23225:38::-;;;:::o;20113:43::-;20154:2;20113:43;:::o;23083:29::-;;;:::o;39672:226::-;31038:12;:10;:12::i;:::-;31028:6;;-1:-1:-1;;;;;31028:6:0;;;:22;;;31020:67;;;;;-1:-1:-1;;;31020:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31020:67:0;;;;;;;;;;;;;;;39767:22:::1;::::0;;39800:33;;;;39849:41:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;31098:1;39672:226:::0;:::o;20593:48::-;20640:1;20593:48;:::o;22914:28::-;;;:::o;45897:123::-;45956:7;45983:9;-1:-1:-1;;;;;45983:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38503:44;;;;:::o;45193:120::-;45260:7;45287:18;45296:8;45287;:18::i;20349:94::-;20406:37;20349:94;:::o;20206:79::-;20256:29;20206:79;:::o;23280:38::-;;;:::o;31761:244::-;31038:12;:10;:12::i;:::-;31028:6;;-1:-1:-1;;;;;31028:6:0;;;:22;;;31020:67;;;;;-1:-1:-1;;;31020:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31020:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31850:22:0;::::1;31842:73;;;;-1:-1:-1::0;;;31842:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31952:6;::::0;;31931:38:::1;::::0;-1:-1:-1;;;;;31931:38:0;;::::1;::::0;31952:6;::::1;::::0;31931:38:::1;::::0;::::1;31980:6;:17:::0;;-1:-1:-1;;;;;;31980:17:0::1;-1:-1:-1::0;;;;;31980:17:0;;;::::1;::::0;;;::::1;::::0;;31761:244::o;38815:35::-;;;:::o;34612:25::-;;;-1:-1:-1;;;;;34612:25:0;;:::o;47260:225::-;47325:7;47345:13;47409:16;47423:1;47409:13;:16::i;:::-;-1:-1:-1;;;;;47387:55:0;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47387:57:0;;;;47260:225;-1:-1:-1;;;47260:225:0:o;38774:34::-;;;:::o;46055:166::-;46114:7;46141:72;20154:2;20256:29;;20264:2;20256:29;46141:43;46154:9;-1:-1:-1;;;;;46154:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46154:29:0;46141:8;;:12;:43::i;46933:166::-;46992:7;47019:72;47061:9;-1:-1:-1;;;;;47061:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47061:29:0;47019:37;:8;20256:29;47019:12;:37::i;46656:220::-;46736:7;46759:13;46755:52;;-1:-1:-1;46795:1:0;46788:8;;46755:52;46823:9;-1:-1:-1;;;;;46823:32:0;;46856:8;46866:1;46823:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46823:45:0;;46656:220;-1:-1:-1;;;46656:220:0:o;24276:269::-;24334:7;24358:10;24354:184;;-1:-1:-1;24392:12:0;24385:19;;24354:184;24426:5;24435:1;24426:10;24422:116;;;-1:-1:-1;24460:13:0;24453:20;;24422:116;-1:-1:-1;24513:13:0;24506:20;;5138:471;5196:7;5441:6;5437:47;;-1:-1:-1;5471:1:0;5464:8;;5437:47;5508:5;;;5512:1;5508;:5;:1;5532:5;;;;;:10;5524:56;;;;-1:-1:-1;;;5524:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3784:181;3842:7;3874:5;;;3898:6;;;;3890:46;;;;;-1:-1:-1;;;3890:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6085:132;6143:7;6170:39;6174:1;6177;6170:39;;;;;;;;;;;;;;;;;:3;:39::i;35915:168::-;35989:10;;35959:9;;-1:-1:-1;;;;;35989:10:0;35981:55;;;;;-1:-1:-1;;;35981:55:0;;;;;;;;;;;;-1:-1:-1;;;35981:55:0;;;;;;;;;;;;;;;-1:-1:-1;36064:10:0;;-1:-1:-1;;;;;36064:10:0;35915:168;:::o;46229:230::-;46326:7;46346:16;46365:9;-1:-1:-1;;;;;46365:27:0;;46393:12;46407:7;46365:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46365:50:0;;-1:-1:-1;46433:18:0;46365:50;46433:8;:18::i;48814:1032::-;48873:4;48890:35;;:::i;:::-;48928:17;48943:1;48928:14;:17::i;:::-;48890:55;;48956:33;;:::i;:::-;49000:14;;49066:1;49049:366;20105:1;49069:11;;49049:366;;;49111:9;-1:-1:-1;;;;;49111:16:0;;49135:1;49146;49150:13;49161:1;49150:10;:13::i;:::-;49111:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49111:53:0;;-1:-1:-1;49187:66:0;49215:36;38635:3;49215:11;-1:-1:-1;;49227:5:0;;49215:18;;;;;;;;;;;;:22;:36::i;:::-;49198:6;49191:61;49187:3;:66::i;:::-;49179:74;;49280:9;49272:5;:17;49268:136;;;49317:5;49310:12;;;;;;;;;49268:136;49382:6;49363:9;49377:1;49373;:5;49363:16;;;;;;;;;;:25;49082:3;;49049:366;;;;49436:9;-1:-1:-1;;;;;49436:16:0;;49460:1;49471;49475:13;49486:1;49475:10;:13::i;:::-;49436:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49436:53:0;;-1:-1:-1;49508:57:0;38635:3;49536:11;49548:1;49536:14;;;;:27;;;;;;49519:6;49512:52;49508:3;:57::i;:::-;49500:65;;49588:9;49580:5;:17;49576:62;;;49621:5;49614:12;;;;;;;;49576:62;49648:22;;;:31;;;49695:9;49690:88;20105:1;49706:11;;49690:88;;;49754:9;49764:1;49754:12;;;;;;;;;;;;;;;;49739;;;;:9;:12;;;;;;;:27;49719:3;;49690:88;;;;49793:23;49806:9;49793:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49834:4:0;;48814:1032;-1:-1:-1;;;;;48814:1032:0:o;46467:181::-;46590:50;;-1:-1:-1;;;46590:50:0;;46563:7;;-1:-1:-1;;;;;46590:9:0;:27;;;;46618:12;;46632:7;;46590:50;;;46618:12;46590:50;;;46618:12;46563:7;46590:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29353:106;29441:10;29353:106;:::o;48693:113::-;48738:7;48770:1;48765;:6;;:33;;48796:1;48795:2;;48765:33;;;-1:-1:-1;48782:1:0;48693:113::o;48317:332::-;48377:7;20105:1;48405:15;;48397:59;;;;;-1:-1:-1;;;48397:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48471:10;48467:175;;-1:-1:-1;48505:9:0;48498:16;;48467:175;48536:5;48545:1;48536:10;48532:110;;;-1:-1:-1;48570:10:0;48563:17;;48532:110;-1:-1:-1;48620:10:0;48613:17;;6713:278;6799:7;6834:12;6827:5;6819:28;;;;-1:-1:-1;;;6819:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6858:9;6874:1;6870;:5;;;;;;;6713:278;-1:-1:-1;;;;;6713:278:0:o;47566:743::-;47623:31;;:::i;:::-;47667:30;;:::i;:::-;47751:16;47765:1;47751:13;:16::i;:::-;-1:-1:-1;;;;;47729:55:0;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47729:57:0;;;47708:78;;47840:16;47854:1;47840:13;:16::i;:::-;-1:-1:-1;;;;;47818:55:0;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47818:57:0;;;47799:7;47807:1;47799:10;;;47797:78;47929:16;47943:1;47929:13;:16::i;:::-;-1:-1:-1;;;;;47907:55:0;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47907:57:0;;;47888:10;;;47886:78;47988:80;47888:7;48064:1;48056:10;;;;;47988:55;20406:37;47996:7;48004:1;47996:10;;47988:80;47975:93;;48092:80;48160:7;48168:1;48160:10;;48092:80;48079:7;48087:1;48079:10;;;:93;48196:80;48264:7;48272:1;48264:10;;;;48196:55;20406:37;48204:7;48212:1;48204:10;;48196:80;48183:10;;;:93;-1:-1:-1;48183:7:0;47566:743;-1:-1:-1;47566:743:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://6f606c905fffd22373a979703435dd7fdb7284cd40e2ba5f3c8abf7f551140af
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.