Contract
0x0744Ac5578EBDF6a406AD0926Bd31f3f83055679
2
Contract Overview
Balance:
0 FTM
FTM Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x62e7f9a35825981fd594fea0b9db1b9aad1e50eb894d0d59418ec096dc3a99f0 | 0x60806040 | 56853001 | 24 days 15 hrs ago | 0xbcb909975715dc8fde643ee44b89e3fd6a35a259 | IN | Create: HCurve | 0 FTM | 0.112729769539 |
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x62e7f9a35825981fd594fea0b9db1b9aad1e50eb894d0d59418ec096dc3a99f0 | 56853001 | 24 days 15 hrs ago | 0xbcb909975715dc8fde643ee44b89e3fd6a35a259 | Contract Creation | 0 FTM |
[ Download CSV Export ]
Contract Name:
HCurve
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @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 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' 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^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; 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"); (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"); (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"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Config { // function signature of "postProcess()" bytes4 public constant POSTPROCESS_SIG = 0xc2722916; // The base amount of percentage function uint256 public constant PERCENTAGE_BASE = 1 ether; // Handler post-process type. Others should not happen now. enum HandlerType { Token, Custom, Others } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./lib/LibCache.sol"; import "./lib/LibStack.sol"; /// @notice A cache structure composed by a bytes32 array contract Storage { using LibCache for mapping(bytes32 => bytes32); using LibStack for bytes32[]; bytes32[] public stack; mapping(bytes32 => bytes32) public cache; // keccak256 hash of "msg.sender" // prettier-ignore bytes32 public constant MSG_SENDER_KEY = 0xb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a; modifier isStackEmpty() { require(stack.length == 0, "Stack not empty"); _; } modifier isInitialized() { require(_getSender() != address(0), "Sender is not initialized"); _; } modifier isNotInitialized() { require(_getSender() == address(0), "Sender is initialized"); _; } function _setSender() internal isNotInitialized { cache.setAddress(MSG_SENDER_KEY, msg.sender); } function _resetSender() internal { cache.setAddress(MSG_SENDER_KEY, address(0)); } function _getSender() internal view returns (address) { return cache.getAddress(MSG_SENDER_KEY); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "../interface/IERC20Usdt.sol"; import "../Config.sol"; import "../Storage.sol"; abstract contract HandlerBase is Storage, Config { using SafeERC20 for IERC20; using LibStack for bytes32[]; address public constant NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; function postProcess() external payable virtual { revert("Invalid post process"); /* Implementation template bytes4 sig = stack.getSig(); if (sig == bytes4(keccak256(bytes("handlerFunction_1()")))) { // Do something } else if (sig == bytes4(keccak256(bytes("handlerFunction_2()")))) { bytes32 temp = stack.get(); // Do something } else revert("Invalid post process"); */ } function _updateToken(address token) internal { stack.setAddress(token); // Ignore token type to fit old handlers // stack.setHandlerType(uint256(HandlerType.Token)); } function _updatePostProcess(bytes32[] memory params) internal { for (uint256 i = params.length; i > 0; i--) { stack.set(params[i - 1]); } stack.set(msg.sig); stack.setHandlerType(HandlerType.Custom); } function getContractName() public pure virtual returns (string memory); function _revertMsg( string memory functionName, string memory reason ) internal pure { revert( string( abi.encodePacked( getContractName(), "_", functionName, ": ", reason ) ) ); } function _revertMsg(string memory functionName) internal pure { _revertMsg(functionName, "Unspecified"); } function _requireMsg( bool condition, string memory functionName, string memory reason ) internal pure { if (!condition) _revertMsg(functionName, reason); } function _uint2String(uint256 n) internal pure returns (string memory) { if (n == 0) { return "0"; } else { uint256 len = 0; for (uint256 temp = n; temp > 0; temp /= 10) { len++; } bytes memory str = new bytes(len); for (uint256 i = len; i > 0; i--) { str[i - 1] = bytes1(uint8(48 + (n % 10))); n /= 10; } return string(str); } } function _getBalance( address token, uint256 amount ) internal view returns (uint256) { if (amount != type(uint256).max) { return amount; } // ETH case if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) { return address(this).balance; } // ERC20 token case return IERC20(token).balanceOf(address(this)); } function _tokenApprove( address token, address spender, uint256 amount ) internal { try IERC20Usdt(token).approve(spender, amount) {} catch { IERC20(token).safeApprove(spender, 0); IERC20(token).safeApprove(spender, amount); } } function _tokenApproveZero(address token, address spender) internal { if (IERC20Usdt(token).allowance(address(this), spender) > 0) { try IERC20Usdt(token).approve(spender, 0) {} catch { IERC20Usdt(token).approve(spender, 1); } } } function _isNotNativeToken(address token) internal pure returns (bool) { return (token != address(0) && token != NATIVE_TOKEN_ADDRESS); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "../HandlerBase.sol"; import "./ICurveHandler.sol"; contract HCurve is HandlerBase { using SafeERC20 for IERC20; function getContractName() public pure override returns (string memory) { return "HCurve"; } /// @notice Curve exchange function exchange( address handler, address tokenI, address tokenJ, int128 i, int128 j, uint256 amount, uint256 minAmount ) external payable returns (uint256) { ( uint256 _amount, uint256 balanceBefore, uint256 ethAmount ) = _exchangeBefore(handler, tokenI, tokenJ, amount); try ICurveHandler(handler).exchange{value: ethAmount}( i, j, _amount, minAmount ) {} catch Error(string memory reason) { _revertMsg("exchange", reason); } catch { _revertMsg("exchange"); } return _exchangeAfter(handler, tokenI, tokenJ, balanceBefore); } /// @notice Curve exchange with uint256 ij function exchangeUint256( address handler, address tokenI, address tokenJ, uint256 i, uint256 j, uint256 amount, uint256 minAmount ) external payable returns (uint256) { ( uint256 _amount, uint256 balanceBefore, uint256 ethAmount ) = _exchangeBefore(handler, tokenI, tokenJ, amount); try ICurveHandler(handler).exchange{value: ethAmount}( i, j, _amount, minAmount ) {} catch Error(string memory reason) { _revertMsg("exchangeUint256", reason); } catch { _revertMsg("exchangeUint256"); } return _exchangeAfter(handler, tokenI, tokenJ, balanceBefore); } /// @notice Curve exchange with uint256 ij and ether flag function exchangeUint256Ether( address handler, address tokenI, address tokenJ, uint256 i, uint256 j, uint256 amount, uint256 minAmount ) external payable returns (uint256) { ( uint256 _amount, uint256 balanceBefore, uint256 ethAmount ) = _exchangeBefore(handler, tokenI, tokenJ, amount); try ICurveHandler(handler).exchange{value: ethAmount}( i, j, _amount, minAmount, true ) {} catch Error(string memory reason) { _revertMsg("exchangeUint256Ether", reason); } catch { _revertMsg("exchangeUint256Ether"); } return _exchangeAfter(handler, tokenI, tokenJ, balanceBefore); } /// @notice Curve exchange underlying function exchangeUnderlying( address handler, address tokenI, address tokenJ, int128 i, int128 j, uint256 amount, uint256 minAmount ) external payable returns (uint256) { ( uint256 _amount, uint256 balanceBefore, uint256 ethAmount ) = _exchangeBefore(handler, tokenI, tokenJ, amount); try ICurveHandler(handler).exchange_underlying{value: ethAmount}( i, j, _amount, minAmount ) {} catch Error(string memory reason) { _revertMsg("exchangeUnderlying", reason); } catch { _revertMsg("exchangeUnderlying"); } return _exchangeAfter(handler, tokenI, tokenJ, balanceBefore); } /// @notice Curve exchange underlying with factory zap function exchangeUnderlyingFactoryZap( address handler, address pool, address tokenI, address tokenJ, int128 i, int128 j, uint256 amount, uint256 minAmount ) external payable returns (uint256) { ( uint256 _amount, uint256 balanceBefore, uint256 ethAmount ) = _exchangeBefore(handler, tokenI, tokenJ, amount); try ICurveHandler(handler).exchange_underlying{value: ethAmount}( pool, i, j, _amount, minAmount ) {} catch Error(string memory reason) { _revertMsg("exchangeUnderlyingFactoryZap", reason); } catch { _revertMsg("exchangeUnderlyingFactoryZap"); } return _exchangeAfter(handler, tokenI, tokenJ, balanceBefore); } /// @notice Curve exchange underlying with uint256 ij function exchangeUnderlyingUint256( address handler, address tokenI, address tokenJ, uint256 i, uint256 j, uint256 amount, uint256 minAmount ) external payable returns (uint256) { ( uint256 _amount, uint256 balanceBefore, uint256 ethAmount ) = _exchangeBefore(handler, tokenI, tokenJ, amount); try ICurveHandler(handler).exchange_underlying{value: ethAmount}( i, j, _amount, minAmount ) {} catch Error(string memory reason) { _revertMsg("exchangeUnderlyingUint256", reason); } catch { _revertMsg("exchangeUnderlyingUint256"); } return _exchangeAfter(handler, tokenI, tokenJ, balanceBefore); } function _exchangeBefore( address handler, address tokenI, address tokenJ, uint256 amount ) internal returns (uint256, uint256, uint256) { amount = _getBalance(tokenI, amount); uint256 balanceBefore = _getBalance(tokenJ, type(uint256).max); // Approve erc20 token or set eth amount uint256 ethAmount; if (tokenI != NATIVE_TOKEN_ADDRESS) { _tokenApprove(tokenI, handler, amount); } else { ethAmount = amount; } return (amount, balanceBefore, ethAmount); } function _exchangeAfter( address handler, address tokenI, address tokenJ, uint256 balanceBefore ) internal returns (uint256) { uint256 balance = _getBalance(tokenJ, type(uint256).max); _requireMsg( balance > balanceBefore, "_exchangeAfter", "after <= before" ); if (tokenI != NATIVE_TOKEN_ADDRESS) _tokenApproveZero(tokenI, handler); if (tokenJ != NATIVE_TOKEN_ADDRESS) _updateToken(tokenJ); return balance - balanceBefore; } /// @notice Curve add liquidity function addLiquidity( address handler, address pool, address[] calldata tokens, uint256[] calldata amounts, uint256 minPoolAmount ) external payable returns (uint256) { ( uint256[] memory _amounts, uint256 balanceBefore, uint256 ethAmount ) = _addLiquidityBefore(handler, pool, tokens, amounts); // Execute add_liquidity according to amount array size if (_amounts.length == 2) { uint256[2] memory amts = [_amounts[0], _amounts[1]]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( amts, minPoolAmount ) {} catch Error(string memory reason) { _revertMsg("addLiquidity", reason); } catch { _revertMsg("addLiquidity"); } } else if (_amounts.length == 3) { uint256[3] memory amts = [_amounts[0], _amounts[1], _amounts[2]]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( amts, minPoolAmount ) {} catch Error(string memory reason) { _revertMsg("addLiquidity", reason); } catch { _revertMsg("addLiquidity"); } } else if (_amounts.length == 4) { uint256[4] memory amts = [ _amounts[0], _amounts[1], _amounts[2], _amounts[3] ]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( amts, minPoolAmount ) {} catch Error(string memory reason) { _revertMsg("addLiquidity", reason); } catch { _revertMsg("addLiquidity"); } } else if (_amounts.length == 5) { uint256[5] memory amts = [ _amounts[0], _amounts[1], _amounts[2], _amounts[3], _amounts[4] ]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( amts, minPoolAmount ) {} catch Error(string memory reason) { _revertMsg("addLiquidity", reason); } catch { _revertMsg("addLiquidity"); } } else if (_amounts.length == 6) { uint256[6] memory amts = [ _amounts[0], _amounts[1], _amounts[2], _amounts[3], _amounts[4], _amounts[5] ]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( amts, minPoolAmount ) {} catch Error(string memory reason) { _revertMsg("addLiquidity", reason); } catch { _revertMsg("addLiquidity"); } } else { _revertMsg("addLiquidity", "invalid amount[] size"); } return _addLiquidityAfter(handler, pool, tokens, amounts, balanceBefore); } /// @notice Curve add liquidity with underlying true flag function addLiquidityUnderlying( address handler, address pool, address[] calldata tokens, uint256[] calldata amounts, uint256 minPoolAmount ) external payable returns (uint256) { ( uint256[] memory _amounts, uint256 balanceBefore, uint256 ethAmount ) = _addLiquidityBefore(handler, pool, tokens, amounts); // Execute add_liquidity according to amount array size if (_amounts.length == 2) { uint256[2] memory amts = [_amounts[0], _amounts[1]]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( amts, minPoolAmount, true ) {} catch Error(string memory reason) { _revertMsg("addLiquidityUnderlying", reason); } catch { _revertMsg("addLiquidityUnderlying"); } } else if (_amounts.length == 3) { uint256[3] memory amts = [_amounts[0], _amounts[1], _amounts[2]]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( amts, minPoolAmount, true ) {} catch Error(string memory reason) { _revertMsg("addLiquidityUnderlying", reason); } catch { _revertMsg("addLiquidityUnderlying"); } } else if (_amounts.length == 4) { uint256[4] memory amts = [ _amounts[0], _amounts[1], _amounts[2], _amounts[3] ]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( amts, minPoolAmount, true ) {} catch Error(string memory reason) { _revertMsg("addLiquidityUnderlying", reason); } catch { _revertMsg("addLiquidityUnderlying"); } } else if (_amounts.length == 5) { uint256[5] memory amts = [ _amounts[0], _amounts[1], _amounts[2], _amounts[3], _amounts[4] ]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( amts, minPoolAmount, true ) {} catch Error(string memory reason) { _revertMsg("addLiquidityUnderlying", reason); } catch { _revertMsg("addLiquidityUnderlying"); } } else if (_amounts.length == 6) { uint256[6] memory amts = [ _amounts[0], _amounts[1], _amounts[2], _amounts[3], _amounts[4], _amounts[5] ]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( amts, minPoolAmount, true ) {} catch Error(string memory reason) { _revertMsg("addLiquidityUnderlying", reason); } catch { _revertMsg("addLiquidityUnderlying"); } } else { _revertMsg("addLiquidityUnderlying", "invalid amount[] size"); } return _addLiquidityAfter(handler, pool, tokens, amounts, balanceBefore); } /// @notice Curve add liquidity with factory zap function addLiquidityFactoryZap( address handler, address pool, address[] calldata tokens, uint256[] calldata amounts, uint256 minPoolAmount ) external payable returns (uint256) { ( uint256[] memory _amounts, uint256 balanceBefore, uint256 ethAmount ) = _addLiquidityBefore(handler, pool, tokens, amounts); // Execute add_liquidity according to amount array size if (_amounts.length == 3) { uint256[3] memory amts = [_amounts[0], _amounts[1], _amounts[2]]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( pool, amts, minPoolAmount ) {} catch Error(string memory reason) { _revertMsg("addLiquidityFactoryZap", reason); } catch { _revertMsg("addLiquidityFactoryZap"); } } else if (_amounts.length == 4) { uint256[4] memory amts = [ _amounts[0], _amounts[1], _amounts[2], _amounts[3] ]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( pool, amts, minPoolAmount ) {} catch Error(string memory reason) { _revertMsg("addLiquidityFactoryZap", reason); } catch { _revertMsg("addLiquidityFactoryZap"); } } else if (_amounts.length == 5) { uint256[5] memory amts = [ _amounts[0], _amounts[1], _amounts[2], _amounts[3], _amounts[4] ]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( pool, amts, minPoolAmount ) {} catch Error(string memory reason) { _revertMsg("addLiquidityFactoryZap", reason); } catch { _revertMsg("addLiquidityFactoryZap"); } } else if (_amounts.length == 6) { uint256[6] memory amts = [ _amounts[0], _amounts[1], _amounts[2], _amounts[3], _amounts[4], _amounts[5] ]; try ICurveHandler(handler).add_liquidity{value: ethAmount}( pool, amts, minPoolAmount ) {} catch Error(string memory reason) { _revertMsg("addLiquidityFactoryZap", reason); } catch { _revertMsg("addLiquidityFactoryZap"); } } else { _revertMsg("addLiquidityFactoryZap", "invalid amount[] size"); } return _addLiquidityAfter(handler, pool, tokens, amounts, balanceBefore); } function _addLiquidityBefore( address handler, address pool, address[] memory tokens, uint256[] memory amounts ) internal returns (uint256[] memory, uint256, uint256) { uint256 balanceBefore = IERC20(pool).balanceOf(address(this)); // Approve non-zero amount erc20 token and set eth amount uint256 ethAmount; for (uint256 i = 0; i < amounts.length; i++) { if (amounts[i] == 0) continue; amounts[i] = _getBalance(tokens[i], amounts[i]); if (tokens[i] == NATIVE_TOKEN_ADDRESS) { ethAmount = amounts[i]; continue; } _tokenApprove(tokens[i], handler, amounts[i]); } return (amounts, balanceBefore, ethAmount); } function _addLiquidityAfter( address handler, address pool, address[] memory tokens, uint256[] memory amounts, uint256 balanceBefore ) internal returns (uint256) { uint256 balance = IERC20(pool).balanceOf(address(this)); _requireMsg( balance > balanceBefore, "_addLiquidityAfter", "after <= before" ); for (uint256 i = 0; i < amounts.length; i++) { if (amounts[i] == 0) continue; if (tokens[i] != NATIVE_TOKEN_ADDRESS) _tokenApproveZero(tokens[i], handler); } // Update post process _updateToken(address(pool)); return balance - balanceBefore; } /// @notice Curve remove liquidity one coin function removeLiquidityOneCoin( address handler, address pool, address tokenI, uint256 poolAmount, int128 i, uint256 minAmount ) external payable returns (uint256) { ( uint256 _poolAmount, uint256 balanceBefore ) = _removeLiquidityOneCoinBefore(handler, pool, tokenI, poolAmount); try ICurveHandler(handler).remove_liquidity_one_coin( _poolAmount, i, minAmount ) {} catch Error(string memory reason) { _revertMsg("removeLiquidityOneCoin", reason); } catch { _revertMsg("removeLiquidityOneCoin"); } return _removeLiquidityOneCoinAfter(handler, pool, tokenI, balanceBefore); } /// @notice Curve remove liquidity one coin with uint256 i function removeLiquidityOneCoinUint256( address handler, address pool, address tokenI, uint256 poolAmount, uint256 i, uint256 minAmount ) external payable returns (uint256) { ( uint256 _poolAmount, uint256 balanceBefore ) = _removeLiquidityOneCoinBefore(handler, pool, tokenI, poolAmount); try ICurveHandler(handler).remove_liquidity_one_coin( _poolAmount, i, minAmount ) {} catch Error(string memory reason) { _revertMsg("removeLiquidityOneCoinUint256", reason); } catch { _revertMsg("removeLiquidityOneCoinUint256"); } return _removeLiquidityOneCoinAfter(handler, pool, tokenI, balanceBefore); } /// @notice Curve remove liquidity one coin underlying function removeLiquidityOneCoinUnderlying( address handler, address pool, address tokenI, uint256 poolAmount, int128 i, uint256 minAmount ) external payable returns (uint256) { ( uint256 _poolAmount, uint256 balanceBefore ) = _removeLiquidityOneCoinBefore(handler, pool, tokenI, poolAmount); try ICurveHandler(handler).remove_liquidity_one_coin( _poolAmount, i, minAmount, true ) {} catch Error(string memory reason) { _revertMsg("removeLiquidityOneCoinUnderlying", reason); } catch { _revertMsg("removeLiquidityOneCoinUnderlying"); } return _removeLiquidityOneCoinAfter(handler, pool, tokenI, balanceBefore); } /// @notice Curve remove liquidity one coin underlying with uint256 i function removeLiquidityOneCoinUnderlyingUint256( address handler, address pool, address tokenI, uint256 poolAmount, uint256 i, uint256 minAmount ) external payable returns (uint256) { ( uint256 _poolAmount, uint256 balanceBefore ) = _removeLiquidityOneCoinBefore(handler, pool, tokenI, poolAmount); try ICurveHandler(handler).remove_liquidity_one_coin( _poolAmount, i, minAmount, true ) {} catch Error(string memory reason) { _revertMsg("removeLiquidityOneCoinUnderlyingUint256", reason); } catch { _revertMsg("removeLiquidityOneCoinUnderlyingUint256"); } return _removeLiquidityOneCoinAfter(handler, pool, tokenI, balanceBefore); } /// @notice Curve remove liquidity one coin with with factory zap function removeLiquidityOneCoinFactoryZap( address handler, address pool, address tokenI, uint256 poolAmount, int128 i, uint256 minAmount ) external payable returns (uint256) { ( uint256 _poolAmount, uint256 balanceBefore ) = _removeLiquidityOneCoinBefore(handler, pool, tokenI, poolAmount); try ICurveHandler(handler).remove_liquidity_one_coin( pool, _poolAmount, i, minAmount ) {} catch Error(string memory reason) { _revertMsg("removeLiquidityOneCoinFactoryZap", reason); } catch { _revertMsg("removeLiquidityOneCoinFactoryZap"); } return _removeLiquidityOneCoinAfter(handler, pool, tokenI, balanceBefore); } function _removeLiquidityOneCoinBefore( address handler, address pool, address tokenI, uint256 poolAmount ) internal returns (uint256, uint256) { uint256 balanceBefore = _getBalance(tokenI, type(uint256).max); poolAmount = _getBalance(pool, poolAmount); _tokenApprove(pool, handler, poolAmount); return (poolAmount, balanceBefore); } function _removeLiquidityOneCoinAfter( address handler, address pool, address tokenI, uint256 balanceBefore ) internal returns (uint256) { // Some curve non-underlying pools like 3pool won't consume pool token // allowance since pool token was issued by the pool that don't need to // call transferFrom(). So set approval to 0 here. _tokenApproveZero(pool, handler); uint256 balance = _getBalance(tokenI, type(uint256).max); _requireMsg( balance > balanceBefore, "_removeLiquidityOneCoinAfter", "after <= before" ); // Update post process if (tokenI != NATIVE_TOKEN_ADDRESS) _updateToken(tokenI); return balance - balanceBefore; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface ICurveHandler { function get_dy( int128 i, int128 j, uint256 dx ) external view returns (uint256); function get_dy( uint256 i, uint256 j, uint256 dx ) external view returns (uint256); function exchange( int128 i, int128 j, uint256 dx, uint256 min_dy ) external payable; function exchange( uint256 i, uint256 j, uint256 dx, uint256 min_dy ) external payable; function exchange( uint256 i, uint256 j, uint256 dx, uint256 min_dy, bool boolean // use_eth ) external payable; function get_dy_underlying( int128 i, int128 j, uint256 dx ) external view returns (uint256); function get_dy_underlying( uint256 i, uint256 j, uint256 dx ) external view returns (uint256); function exchange_underlying( int128 i, int128 j, uint256 dx, uint256 min_dy ) external payable; function exchange_underlying( address pool, int128 i, int128 j, uint256 dx, uint256 min_dy ) external payable; function exchange_underlying( uint256 i, uint256 j, uint256 dx, uint256 min_dy ) external payable; function exchange_underlying( uint256 i, uint256 j, uint256 dx, uint256 min_dy, bool boolean // use_eth ) external payable; // Curve add liquidity function only support static array function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external payable; function add_liquidity(uint256[3] calldata amounts, uint256 min_mint_amount) external payable; function add_liquidity(uint256[4] calldata amounts, uint256 min_mint_amount) external payable; function add_liquidity(uint256[5] calldata amounts, uint256 min_mint_amount) external payable; function add_liquidity(uint256[6] calldata amounts, uint256 min_mint_amount) external payable; // Curve add liquidity underlying function add_liquidity( uint256[2] calldata amounts, uint256 min_mint_amount, bool boolean // use_underlying ) external payable; function add_liquidity( uint256[3] calldata amounts, uint256 min_mint_amount, bool boolean // use_underlying ) external payable; function add_liquidity( uint256[4] calldata amounts, uint256 min_mint_amount, bool boolean // use_underlying ) external payable; function add_liquidity( uint256[5] calldata amounts, uint256 min_mint_amount, bool boolean // use_underlying ) external payable; function add_liquidity( uint256[6] calldata amounts, uint256 min_mint_amount, bool boolean // use_underlying ) external payable; function calc_token_amount(uint256[2] calldata amounts, bool deposit) external view returns (uint256); function calc_token_amount(uint256[3] calldata amounts, bool deposit) external view returns (uint256); function calc_token_amount(uint256[4] calldata amounts, bool deposit) external view returns (uint256); function calc_token_amount(uint256[5] calldata amounts, bool deposit) external view returns (uint256); function calc_token_amount(uint256[6] calldata amounts, bool deposit) external view returns (uint256); // Curve add liquidity factory metapool deposit zap function add_liquidity( address pool, uint256[3] calldata amounts, uint256 min_mint_amount ) external payable; function add_liquidity( address pool, uint256[4] calldata amounts, uint256 min_mint_amount ) external payable; function add_liquidity( address pool, uint256[5] calldata amounts, uint256 min_mint_amount ) external payable; function add_liquidity( address pool, uint256[6] calldata amounts, uint256 min_mint_amount ) external payable; function calc_token_amount( address pool, uint256[3] calldata amounts, bool deposit ) external view returns (uint256); function calc_token_amount( address pool, uint256[4] calldata amounts, bool deposit ) external view returns (uint256); function calc_token_amount( address pool, uint256[5] calldata amounts, bool deposit ) external view returns (uint256); function calc_token_amount( address pool, uint256[6] calldata amounts, bool deposit ) external view returns (uint256); // Curve remove liquidity function remove_liquidity_one_coin( uint256 _token_amount, int128 i, uint256 min_amount ) external; function remove_liquidity_one_coin( uint256 _token_amount, uint256 i, uint256 min_amount ) external; function remove_liquidity_one_coin( uint256 _token_amount, int128 i, uint256 min_uamount, bool boolean // donate_dust or use_underlying ) external; function remove_liquidity_one_coin( uint256 _token_amount, uint256 i, uint256 min_uamount, bool boolean ) external; // Curve remove liquidity factory metapool deposit zap function remove_liquidity_one_coin( address pool, uint256 _token_amount, int128 i, uint256 min_amount ) external; function calc_withdraw_one_coin(uint256 _token_amount, int128 i) external view returns (uint256); function calc_withdraw_one_coin(uint256 _token_amount, uint256 i) external view returns (uint256); // Curve factory metapool deposit zap function calc_withdraw_one_coin( address pool, uint256 _token_amount, int128 i ) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC20Usdt { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external; function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external; function transferFrom(address sender, address recipient, uint256 amount) external; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library LibCache { function set( mapping(bytes32 => bytes32) storage _cache, bytes32 _key, bytes32 _value ) internal { _cache[_key] = _value; } function setAddress( mapping(bytes32 => bytes32) storage _cache, bytes32 _key, address _value ) internal { _cache[_key] = bytes32(uint256(uint160(_value))); } function setUint256( mapping(bytes32 => bytes32) storage _cache, bytes32 _key, uint256 _value ) internal { _cache[_key] = bytes32(_value); } function getAddress( mapping(bytes32 => bytes32) storage _cache, bytes32 _key ) internal view returns (address ret) { ret = address(uint160(uint256(_cache[_key]))); } function getUint256( mapping(bytes32 => bytes32) storage _cache, bytes32 _key ) internal view returns (uint256 ret) { ret = uint256(_cache[_key]); } function get( mapping(bytes32 => bytes32) storage _cache, bytes32 _key ) internal view returns (bytes32 ret) { ret = _cache[_key]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../Config.sol"; library LibStack { function setAddress(bytes32[] storage _stack, address _input) internal { _stack.push(bytes32(uint256(uint160(_input)))); } function set(bytes32[] storage _stack, bytes32 _input) internal { _stack.push(_input); } function setHandlerType( bytes32[] storage _stack, Config.HandlerType _input ) internal { _stack.push(bytes12(uint96(_input))); } function getAddress( bytes32[] storage _stack ) internal returns (address ret) { ret = address(uint160(uint256(peek(_stack)))); _stack.pop(); } function getSig(bytes32[] storage _stack) internal returns (bytes4 ret) { ret = bytes4(peek(_stack)); _stack.pop(); } function get(bytes32[] storage _stack) internal returns (bytes32 ret) { ret = peek(_stack); _stack.pop(); } function peek( bytes32[] storage _stack ) internal view returns (bytes32 ret) { uint256 length = _stack.length; require(length > 0, "stack empty"); ret = _stack[length - 1]; } function peek( bytes32[] storage _stack, uint256 _index ) internal view returns (bytes32 ret) { uint256 length = _stack.length; require(length > 0, "stack empty"); require(length > _index, "not enough elements in stack"); ret = _stack[length - _index - 1]; } }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"MSG_SENDER_KEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POSTPROCESS_SIG","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minPoolAmount","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minPoolAmount","type":"uint256"}],"name":"addLiquidityFactoryZap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minPoolAmount","type":"uint256"}],"name":"addLiquidityUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cache","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"tokenI","type":"address"},{"internalType":"address","name":"tokenJ","type":"address"},{"internalType":"int128","name":"i","type":"int128"},{"internalType":"int128","name":"j","type":"int128"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"exchange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"tokenI","type":"address"},{"internalType":"address","name":"tokenJ","type":"address"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"j","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"exchangeUint256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"tokenI","type":"address"},{"internalType":"address","name":"tokenJ","type":"address"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"j","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"exchangeUint256Ether","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"tokenI","type":"address"},{"internalType":"address","name":"tokenJ","type":"address"},{"internalType":"int128","name":"i","type":"int128"},{"internalType":"int128","name":"j","type":"int128"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"exchangeUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenI","type":"address"},{"internalType":"address","name":"tokenJ","type":"address"},{"internalType":"int128","name":"i","type":"int128"},{"internalType":"int128","name":"j","type":"int128"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"exchangeUnderlyingFactoryZap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"tokenI","type":"address"},{"internalType":"address","name":"tokenJ","type":"address"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"j","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"exchangeUnderlyingUint256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getContractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"postProcess","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenI","type":"address"},{"internalType":"uint256","name":"poolAmount","type":"uint256"},{"internalType":"int128","name":"i","type":"int128"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"removeLiquidityOneCoin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenI","type":"address"},{"internalType":"uint256","name":"poolAmount","type":"uint256"},{"internalType":"int128","name":"i","type":"int128"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"removeLiquidityOneCoinFactoryZap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenI","type":"address"},{"internalType":"uint256","name":"poolAmount","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"removeLiquidityOneCoinUint256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenI","type":"address"},{"internalType":"uint256","name":"poolAmount","type":"uint256"},{"internalType":"int128","name":"i","type":"int128"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"removeLiquidityOneCoinUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenI","type":"address"},{"internalType":"uint256","name":"poolAmount","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"removeLiquidityOneCoinUnderlyingUint256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stack","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506135ff806100206000396000f3fe6080604052600436106101355760003560e01c8063c2722916116100ab578063f5f5ba721161006f578063f5f5ba72146102f2578063f9c1a8ee14610327578063fa2901a51461033a578063fa8b32581461036e578063fef6074e14610381578063ff2e5c431461039457600080fd5b8063c272291614610262578063dc9031c41461026c578063df2ebdbb1461028c578063df5f2889146102cc578063ec075daf146102df57600080fd5b80637ad0fd49116100fd5780637ad0fd49146101cd5780637eb32418146101e05780638337782d146101f357806387c139431461020657806399eb59b914610222578063a8461c211461024f57600080fd5b80630f532d181461013a578063301ee99614610181578063349a06351461019457806351a34ca5146101a757806351c6312e146101ba575b600080fd5b34801561014657600080fd5b5061016e7fb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a81565b6040519081526020015b60405180910390f35b61016e61018f366004612d84565b6103a7565b61016e6101a2366004612dea565b6104dd565b61016e6101b5366004612e95565b6105ff565b61016e6101c8366004612f2f565b610bf3565b61016e6101db366004612e95565b610d2c565b61016e6101ee366004612d84565b6112c1565b61016e610201366004612f97565b6113f0565b34801561021257600080fd5b5061016e670de0b6b3a764000081565b34801561022e57600080fd5b5061016e61023d36600461300f565b60016020526000908152604090205481565b61016e61025d366004613028565b6114f9565b61026a611657565b005b34801561027857600080fd5b5061016e61028736600461300f565b61169b565b34801561029857600080fd5b506102b473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6040516001600160a01b039091168152602001610178565b61016e6102da366004612d84565b6116bc565b61016e6102ed366004612e95565b6117e8565b3480156102fe57600080fd5b50604080518082018252600681526548437572766560d01b6020820152905161017891906130e1565b61016e610335366004612dea565b611cf0565b34801561034657600080fd5b50610355636139148b60e11b81565b6040516001600160e01b03199091168152602001610178565b61016e61037c366004612f2f565b611ddf565b61016e61038f366004612f97565b611f03565b61016e6103a2366004612f2f565b612020565b60008060006103b889898989612133565b604051630d2680e960e11b815260048101839052600f88900b60248201526044810187905291935091506001600160a01b038a1690631a4d01d290606401600060405180830381600087803b15801561041057600080fd5b505af1925050508015610421575060015b6104c45761042d613114565b806308c379a0141561048b575061044261316b565b8061044d575061048d565b610485604051806040016040528060168152602001753932b6b7bb32a634b8bab4b234ba3ca7b732a1b7b4b760511b8152508261216a565b506104c4565b505b6104c4604051806040016040528060168152602001753932b6b7bb32a634b8bab4b234ba3ca7b732a1b7b4b760511b8152506121c1565b6104d0898989846121f1565b9998505050505050505050565b60008060006104ee89898989612133565b60405163f1dc3cc960e01b815260048101839052602481018890526044810187905291935091506001600160a01b038a169063f1dc3cc990606401600060405180830381600087803b15801561054357600080fd5b505af1925050508015610554575060015b6104c457610560613114565b806308c379a014156105bf575061057561316b565b8061058057506105c1565b6104856040518060400160405280601d81526020017f72656d6f76654c69717569646974794f6e65436f696e55696e743235360000008152508261216a565b505b6104c46040518060400160405280601d81526020017f72656d6f76654c69717569646974794f6e65436f696e55696e743235360000008152506121c1565b6000806000806106748b8b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152506122b792505050565b9250925092508251600214156107c05760006040518060400160405280856000815181106106a4576106a46131f5565b60200260200101518152602001856001815181106106c4576106c46131f5565b602002602001015181525090508b6001600160a01b0316630b4c7e4d8383896040518463ffffffff1660e01b815260040161070092919061322e565b6000604051808303818588803b15801561071957600080fd5b505af19350505050801561072b575060015b6107ba57610737613114565b806308c379a0141561078b575061074c61316b565b80610757575061078d565b6107856040518060400160405280600c81526020016b6164644c697175696469747960a01b8152508261216a565b506107ba565b505b6107ba6040518060400160405280600c81526020016b6164644c697175696469747960a01b8152506121c1565b50610b73565b8251600314156108665760006040518060600160405280856000815181106107ea576107ea6131f5565b602002602001015181526020018560018151811061080a5761080a6131f5565b602002602001015181526020018560028151811061082a5761082a6131f5565b602002602001015181525090508b6001600160a01b0316634515cef38383896040518463ffffffff1660e01b815260040161070092919061326c565b82516004141561092c576000604051806080016040528085600081518110610890576108906131f5565b60200260200101518152602001856001815181106108b0576108b06131f5565b60200260200101518152602001856002815181106108d0576108d06131f5565b60200260200101518152602001856003815181106108f0576108f06131f5565b602002602001015181525090508b6001600160a01b031663029b2f348383896040518463ffffffff1660e01b81526004016107009291906132aa565b825160051415610a125760006040518060a0016040528085600081518110610956576109566131f5565b6020026020010151815260200185600181518110610976576109766131f5565b6020026020010151815260200185600281518110610996576109966131f5565b60200260200101518152602001856003815181106109b6576109b66131f5565b60200260200101518152602001856004815181106109d6576109d66131f5565b602002602001015181525090508b6001600160a01b031663847384998383896040518463ffffffff1660e01b81526004016107009291906132e8565b825160061415610b185760006040518060c0016040528085600081518110610a3c57610a3c6131f5565b6020026020010151815260200185600181518110610a5c57610a5c6131f5565b6020026020010151815260200185600281518110610a7c57610a7c6131f5565b6020026020010151815260200185600381518110610a9c57610a9c6131f5565b6020026020010151815260200185600481518110610abc57610abc6131f5565b6020026020010151815260200185600581518110610adc57610adc6131f5565b602002602001015181525090508b6001600160a01b0316633f8a44f38383896040518463ffffffff1660e01b8152600401610700929190613326565b610b736040518060400160405280600c81526020016b6164644c697175696469747960a01b81525060405180604001604052806015815260200174696e76616c696420616d6f756e745b5d2073697a6560581b81525061216a565b610be48b8b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d918291850190849080828437600092019190915250899250612481915050565b9b9a5050505050505050505050565b600080600080610c058b8b8b8961261b565b6040516365b2489b60e01b8152600481018c9052602481018b9052604481018490526064810189905292955090935091506001600160a01b038c16906365b2489b9083906084016000604051808303818588803b158015610c6557600080fd5b505af193505050508015610c77575060015b610d2057610c83613114565b806308c379a01415610ce45750610c9861316b565b80610ca35750610ce6565b610cde6040518060400160405280601981526020017832bc31b430b733b2aab73232b9363cb4b733aab4b73a191a9b60391b8152508261216a565b50610d20565b505b610d206040518060400160405280601981526020017832bc31b430b733b2aab73232b9363cb4b733aab4b73a191a9b60391b8152506121c1565b610be48b8b8b85612685565b600080600080610da18b8b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152506122b792505050565b925092509250825160021415610ef8576000604051806040016040528085600081518110610dd157610dd16131f5565b6020026020010151815260200185600181518110610df157610df16131f5565b602002602001015181525090508b6001600160a01b031663ee22be2383838960016040518563ffffffff1660e01b8152600401610e3093929190613341565b6000604051808303818588803b158015610e4957600080fd5b505af193505050508015610e5b575060015b6107ba57610e67613114565b806308c379a01415610ebf5750610e7c61316b565b80610e875750610ec1565b610785604051806040016040528060168152602001756164644c6971756964697479556e6465726c79696e6760501b8152508261216a565b505b6107ba604051806040016040528060168152602001756164644c6971756964697479556e6465726c79696e6760501b8152506121c1565b825160031415610fa1576000604051806060016040528085600081518110610f2257610f226131f5565b6020026020010151815260200185600181518110610f4257610f426131f5565b6020026020010151815260200185600281518110610f6257610f626131f5565b602002602001015181525090508b6001600160a01b0316632b6e993a83838960016040518563ffffffff1660e01b8152600401610e3093929190613365565b82516004141561106a576000604051806080016040528085600081518110610fcb57610fcb6131f5565b6020026020010151815260200185600181518110610feb57610feb6131f5565b602002602001015181526020018560028151811061100b5761100b6131f5565b602002602001015181526020018560038151811061102b5761102b6131f5565b602002602001015181525090508b6001600160a01b031663dc3a2d8183838960016040518563ffffffff1660e01b8152600401610e3093929190613389565b8251600514156111535760006040518060a0016040528085600081518110611094576110946131f5565b60200260200101518152602001856001815181106110b4576110b46131f5565b60200260200101518152602001856002815181106110d4576110d46131f5565b60200260200101518152602001856003815181106110f4576110f46131f5565b6020026020010151815260200185600481518110611114576111146131f5565b602002602001015181525090508b6001600160a01b031663c25fd56583838960016040518563ffffffff1660e01b8152600401610e30939291906133ad565b82516006141561125c5760006040518060c001604052808560008151811061117d5761117d6131f5565b602002602001015181526020018560018151811061119d5761119d6131f5565b60200260200101518152602001856002815181106111bd576111bd6131f5565b60200260200101518152602001856003815181106111dd576111dd6131f5565b60200260200101518152602001856004815181106111fd576111fd6131f5565b602002602001015181526020018560058151811061121d5761121d6131f5565b602002602001015181525090508b6001600160a01b03166312b7ef1e83838960016040518563ffffffff1660e01b8152600401610e30939291906133d1565b610b73604051806040016040528060168152602001756164644c6971756964697479556e6465726c79696e6760501b81525060405180604001604052806015815260200174696e76616c696420616d6f756e745b5d2073697a6560581b81525061216a565b60008060006112d289898989612133565b6040516314f6943160e11b81526001600160a01b038b8116600483015260248201849052600f89900b604483015260648201889052929450909250908a16906329ed286290608401600060405180830381600087803b15801561133457600080fd5b505af1925050508015611345575060015b6104c457611351613114565b806308c379a014156113b0575061136661316b565b8061137157506113b2565b6104856040518060400160405280602081526020017f72656d6f76654c69717569646974794f6e65436f696e466163746f72795a61708152508261216a565b505b6104c46040518060400160405280602081526020017f72656d6f76654c69717569646974794f6e65436f696e466163746f72795a61708152506121c1565b6000806000806114028b8b8b8961261b565b604051630f7c084960e21b8152600f8c810b60048301528b900b6024820152604481018490526064810189905292955090935091506001600160a01b038c1690633df021249083906084016000604051808303818588803b15801561146657600080fd5b505af193505050508015611478575060015b610d2057611484613114565b806308c379a014156114ce575061149961316b565b806114a457506114d0565b610cde6040518060400160405280600881526020016765786368616e676560c01b8152508261216a565b505b610d206040518060400160405280600881526020016765786368616e676560c01b8152506121c1565b60008060008061150b8c8b8b8961261b565b604051633cc0e21f60e11b81526001600160a01b038f81166004830152600f8d810b60248401528c900b604483015260648201859052608482018a90529396509194509250908d1690637981c43e90839060a4016000604051808303818588803b15801561157857600080fd5b505af19350505050801561158a575060015b61163b57611596613114565b806308c379a014156115fb57506115ab61316b565b806115b657506115fd565b6115f56040518060400160405280601c81526020017f65786368616e6765556e6465726c79696e67466163746f72795a6170000000008152508261216a565b5061163b565b505b61163b6040518060400160405280601c81526020017f65786368616e6765556e6465726c79696e67466163746f72795a6170000000008152506121c1565b6116478c8b8b85612685565b9c9b505050505050505050505050565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c696420706f73742070726f6365737360601b60448201526064015b60405180910390fd5b600081815481106116ab57600080fd5b600091825260209091200154905081565b60008060006116cd89898989612133565b60405163517a55a360e01b815260048101839052600f88900b6024820152604481018790526001606482015291935091506001600160a01b038a169063517a55a390608401600060405180830381600087803b15801561172c57600080fd5b505af192505050801561173d575060015b6104c457611749613114565b806308c379a014156117a8575061175e61316b565b8061176957506117aa565b6104856040518060400160405280602081526020017f72656d6f76654c69717569646974794f6e65436f696e556e6465726c79696e678152508261216a565b505b6104c46040518060400160405280602081526020017f72656d6f76654c69717569646974794f6e65436f696e556e6465726c79696e678152506121c1565b60008060008061185d8b8b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152506122b792505050565b9250925092508251600314156119d357600060405180606001604052808560008151811061188d5761188d6131f5565b60200260200101518152602001856001815181106118ad576118ad6131f5565b60200260200101518152602001856002815181106118cd576118cd6131f5565b602002602001015181525090508b6001600160a01b031663a3185179838d848a6040518563ffffffff1660e01b815260040161190b939291906133f6565b6000604051808303818588803b15801561192457600080fd5b505af193505050508015611936575060015b6107ba57611942613114565b806308c379a0141561199a575061195761316b565b80611962575061199c565b6107856040518060400160405280601681526020017506164644c6971756964697479466163746f72795a61760541b8152508261216a565b505b6107ba6040518060400160405280601681526020017506164644c6971756964697479466163746f72795a61760541b8152506121c1565b825160041415611a9b5760006040518060800160405280856000815181106119fd576119fd6131f5565b6020026020010151815260200185600181518110611a1d57611a1d6131f5565b6020026020010151815260200185600281518110611a3d57611a3d6131f5565b6020026020010151815260200185600381518110611a5d57611a5d6131f5565b602002602001015181525090508b6001600160a01b031663384e03db838d848a6040518563ffffffff1660e01b815260040161190b93929190613421565b825160051415611b835760006040518060a0016040528085600081518110611ac557611ac56131f5565b6020026020010151815260200185600181518110611ae557611ae56131f5565b6020026020010151815260200185600281518110611b0557611b056131f5565b6020026020010151815260200185600381518110611b2557611b256131f5565b6020026020010151815260200185600481518110611b4557611b456131f5565b602002602001015181525090508b6001600160a01b0316631b61222b838d848a6040518563ffffffff1660e01b815260040161190b9392919061344c565b825160061415611c8b5760006040518060c0016040528085600081518110611bad57611bad6131f5565b6020026020010151815260200185600181518110611bcd57611bcd6131f5565b6020026020010151815260200185600281518110611bed57611bed6131f5565b6020026020010151815260200185600381518110611c0d57611c0d6131f5565b6020026020010151815260200185600481518110611c2d57611c2d6131f5565b6020026020010151815260200185600581518110611c4d57611c4d6131f5565b602002602001015181525090508b6001600160a01b0316630dd95c5e838d848a6040518563ffffffff1660e01b815260040161190b93929190613477565b610b736040518060400160405280601681526020017506164644c6971756964697479466163746f72795a61760541b81525060405180604001604052806015815260200174696e76616c696420616d6f756e745b5d2073697a6560581b81525061216a565b6000806000611d0189898989612133565b604051638f15b6b560e01b81526004810183905260248101889052604481018790526001606482015291935091506001600160a01b038a1690638f15b6b590608401600060405180830381600087803b158015611d5d57600080fd5b505af1925050508015611d6e575060015b6104c457611d7a613114565b806308c379a01415611dbc5750611d8f61316b565b80611d9a5750611dbe565b6104856040518060600160405280602781526020016135a3602791398261216a565b505b6104c46040518060600160405280602781526020016135a3602791396121c1565b600080600080611df18b8b8b8961261b565b60405163394747c560e01b8152600481018c9052602481018b905260448101849052606481018990526001608482015292955090935091506001600160a01b038c169063394747c590839060a4016000604051808303818588803b158015611e5857600080fd5b505af193505050508015611e6a575060015b610d2057611e76613114565b806308c379a01415611ecc5750611e8b61316b565b80611e965750611ece565b610cde6040518060400160405280601481526020017332bc31b430b733b2aab4b73a191a9b22ba3432b960611b8152508261216a565b505b610d206040518060400160405280601481526020017332bc31b430b733b2aab4b73a191a9b22ba3432b960611b8152506121c1565b600080600080611f158b8b8b8961261b565b604051635320bf6b60e11b8152600f8c810b60048301528b900b6024820152604481018490526064810189905292955090935091506001600160a01b038c169063a6417ed69083906084016000604051808303818588803b158015611f7957600080fd5b505af193505050508015611f8b575060015b610d2057611f97613114565b806308c379a01415611feb5750611fac61316b565b80611fb75750611fed565b610cde6040518060400160405280601281526020017165786368616e6765556e6465726c79696e6760701b8152508261216a565b505b610d206040518060400160405280601281526020017165786368616e6765556e6465726c79696e6760701b8152506121c1565b6000806000806120328b8b8b8961261b565b604051630b68372160e31b8152600481018c9052602481018b9052604481018490526064810189905292955090935091506001600160a01b038c1690635b41b9089083906084016000604051808303818588803b15801561209257600080fd5b505af1935050505080156120a4575060015b610d20576120b0613114565b806308c379a0141561210157506120c561316b565b806120d05750612103565b610cde6040518060400160405280600f81526020016e32bc31b430b733b2aab4b73a191a9b60891b8152508261216a565b505b610d206040518060400160405280600f81526020016e32bc31b430b733b2aab4b73a191a9b60891b8152506121c1565b60008060006121448560001961271e565b9050612150868561271e565b935061215d8688866127df565b9296929550919350505050565b60408051808201909152600681526548437572766560d01b6020820152828260405160200161219b939291906134a3565b60408051601f198184030181529082905262461bcd60e51b8252611692916004016130e1565b6121ee816040518060400160405280600b81526020016a155b9cdc1958da599a595960aa1b81525061216a565b50565b60006121fd848661286c565b600061220b8460001961271e565b90506122768382116040518060400160405280601c81526020017f5f72656d6f76654c69717569646974794f6e65436f696e4166746572000000008152506040518060400160405280600f81526020016e6166746572203c3d206265666f726560881b8152506129ac565b6001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146122a3576122a3846129bb565b6122ad8382613519565b9695505050505050565b6040516370a0823160e01b8152306004820152606090600090819081906001600160a01b038816906370a0823190602401602060405180830381865afa158015612305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123299190613530565b90506000805b86518110156124705786818151811061234a5761234a6131f5565b60200260200101516000141561235f5761245e565b61239b888281518110612374576123746131f5565b602002602001015188838151811061238e5761238e6131f5565b602002602001015161271e565b8782815181106123ad576123ad6131f5565b60200260200101818152505073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168882815181106123e9576123e96131f5565b60200260200101516001600160a01b0316141561242157868181518110612412576124126131f5565b6020026020010151915061245e565b61245e888281518110612436576124366131f5565b60200260200101518b898481518110612451576124516131f5565b60200260200101516127df565b8061246881613549565b91505061232f565b509498909750939550929350505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038716906370a0823190602401602060405180830381865afa1580156124ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ee9190613530565b905061254e838211604051806040016040528060128152602001712fb0b2322634b8bab4b234ba3ca0b33a32b960711b8152506040518060400160405280600f81526020016e6166746572203c3d206265666f726560881b8152506129ac565b60005b84518110156125fc5784818151811061256c5761256c6131f5565b602002602001015160001415612581576125ea565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168682815181106125b1576125b16131f5565b60200260200101516001600160a01b0316146125ea576125ea8682815181106125dc576125dc6131f5565b60200260200101518961286c565b806125f481613549565b915050612551565b50612606866129bb565b6126108382613519565b979650505050505050565b600080600061262a868561271e565b9350600061263a8660001961271e565b905060006001600160a01b03881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146126725761266d888a886127df565b612675565b50845b9498909750939550929350505050565b6000806126948460001961271e565b90506126f08382116040518060400160405280600e81526020016d2fb2bc31b430b733b2a0b33a32b960911b8152506040518060400160405280600f81526020016e6166746572203c3d206265666f726560881b8152506129ac565b6001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461227657612276858761286c565b600060001982146127305750806127d9565b6001600160a01b038316158061276257506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561276e5750476127d9565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156127b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d69190613530565b90505b92915050565b60405163095ea7b360e01b81526001600160a01b0383811660048301526024820183905284169063095ea7b390604401600060405180830381600087803b15801561282957600080fd5b505af192505050801561283a575060015b612867576128536001600160a01b0384168360006129fa565b6128676001600160a01b03841683836129fa565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b0382811660248301526000919084169063dd62ed3e90604401602060405180830381865afa1580156128bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e09190613530565b11156129a85760405163095ea7b360e01b81526001600160a01b0382811660048301526000602483015283169063095ea7b390604401600060405180830381600087803b15801561293057600080fd5b505af1925050508015612941575060015b6129a85760405163095ea7b360e01b81526001600160a01b0382811660048301526001602483015283169063095ea7b390604401600060405180830381600087803b15801561298f57600080fd5b505af11580156129a3573d6000803e3d6000fd5b505050505b5050565b8261286757612867828261216a565b600080546001810182559080526001600160a01b0382167f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5639091015550565b801580612a745750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a729190613530565b155b612adf5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401611692565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663095ea7b360e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261286792869291600091612b6f918516908490612bec565b8051909150156128675780806020019051810190612b8d9190613564565b6128675760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611692565b6060612bfb8484600085612c05565b90505b9392505050565b606082471015612c665760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611692565b843b612cb45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611692565b600080866001600160a01b03168587604051612cd09190613586565b60006040518083038185875af1925050503d8060008114612d0d576040519150601f19603f3d011682016040523d82523d6000602084013e612d12565b606091505b509150915061261082828660608315612d2c575081612bfe565b825115612d3c5782518084602001fd5b8160405162461bcd60e51b815260040161169291906130e1565b80356001600160a01b0381168114612d6d57600080fd5b919050565b8035600f81900b8114612d6d57600080fd5b60008060008060008060c08789031215612d9d57600080fd5b612da687612d56565b9550612db460208801612d56565b9450612dc260408801612d56565b935060608701359250612dd760808801612d72565b915060a087013590509295509295509295565b60008060008060008060c08789031215612e0357600080fd5b612e0c87612d56565b9550612e1a60208801612d56565b9450612e2860408801612d56565b9350606087013592506080870135915060a087013590509295509295509295565b60008083601f840112612e5b57600080fd5b50813567ffffffffffffffff811115612e7357600080fd5b6020830191508360208260051b8501011115612e8e57600080fd5b9250929050565b600080600080600080600060a0888a031215612eb057600080fd5b612eb988612d56565b9650612ec760208901612d56565b9550604088013567ffffffffffffffff80821115612ee457600080fd5b612ef08b838c01612e49565b909750955060608a0135915080821115612f0957600080fd5b50612f168a828b01612e49565b989b979a50959894979596608090950135949350505050565b600080600080600080600060e0888a031215612f4a57600080fd5b612f5388612d56565b9650612f6160208901612d56565b9550612f6f60408901612d56565b969995985095966060810135965060808101359560a0820135955060c0909101359350915050565b600080600080600080600060e0888a031215612fb257600080fd5b612fbb88612d56565b9650612fc960208901612d56565b9550612fd760408901612d56565b9450612fe560608901612d72565b9350612ff360808901612d72565b925060a0880135915060c0880135905092959891949750929550565b60006020828403121561302157600080fd5b5035919050565b600080600080600080600080610100898b03121561304557600080fd5b61304e89612d56565b975061305c60208a01612d56565b965061306a60408a01612d56565b955061307860608a01612d56565b945061308660808a01612d72565b935061309460a08a01612d72565b925060c0890135915060e089013590509295985092959890939650565b60005b838110156130cc5781810151838201526020016130b4565b838111156130db576000848401525b50505050565b60208152600082518060208401526131008160408501602087016130b1565b601f01601f19169190910160400192915050565b600060033d111561312d5760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff8111828210171561316457634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156131795790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156131a957505050505090565b82850191508151818111156131c15750505050505090565b843d87010160208285010111156131db5750505050505090565b6131ea60208286010187613130565b509095945050505050565b634e487b7160e01b600052603260045260246000fd5b8060005b60028110156130db57815184526020938401939091019060010161320f565b6060810161323c828561320b565b8260408301529392505050565b8060005b60038110156130db57815184526020938401939091019060010161324d565b6080810161327a8285613249565b8260608301529392505050565b8060005b60048110156130db57815184526020938401939091019060010161328b565b60a081016132b88285613287565b8260808301529392505050565b8060005b60058110156130db5781518452602093840193909101906001016132c9565b60c081016132f682856132c5565b8260a08301529392505050565b8060005b60068110156130db578151845260209384019390910190600101613307565b60e081016133348285613303565b8260c08301529392505050565b6080810161334f828661320b565b8360408301528215156060830152949350505050565b60a081016133738286613249565b8360608301528215156080830152949350505050565b60c081016133978286613287565b83608083015282151560a0830152949350505050565b60e081016133bb82866132c5565b8360a083015282151560c0830152949350505050565b61010081016133e08286613303565b8360c083015282151560e0830152949350505050565b6001600160a01b038416815260a081016134136020830185613249565b826080830152949350505050565b6001600160a01b038416815260c0810161343e6020830185613287565b8260a0830152949350505050565b6001600160a01b038416815260e0810161346960208301856132c5565b8260c0830152949350505050565b6001600160a01b038416815261010081016134956020830185613303565b8260e0830152949350505050565b600084516134b58184602089016130b1565b605f60f81b90830190815284516134d38160018401602089016130b1565b6101d160f51b6001929091019182015283516134f68160038401602088016130b1565b0160030195945050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561352b5761352b613503565b500390565b60006020828403121561354257600080fd5b5051919050565b600060001982141561355d5761355d613503565b5060010190565b60006020828403121561357657600080fd5b81518015158114612bfe57600080fd5b600082516135988184602087016130b1565b919091019291505056fe72656d6f76654c69717569646974794f6e65436f696e556e6465726c79696e6755696e74323536a2646970667358221220f5763d647847408b4e59173e303c15d36adb1362773716bf944f34660538c5ba64736f6c634300080a0033
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.