Feature Tip: Add private address tag to any address under My Name Tag !
Overview
Max Total Supply
0
Holders
0
Total Transfers
-
Market
Fully Diluted Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Buoy3Pool
Compiler Version
v0.6.12+commit.27d51765
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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.