ETH Price: $1,591.79 (+0.10%)
Gas: 11 Gwei
 

Overview

Max Total Supply

0

Holders

0

Total Transfers

-

Market

Fully Diluted Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Buoy3Pool

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-25
*/

// 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

Contract ABI

[{"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
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.