FRAX Price: $0.98 (+8.00%)

Contract

0xEB609695017Aa8597FA9B3db276EC639783351D4

Overview

FRAX Balance | FXTL Balance

0 FRAX | 343 FXTL

FRAX Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

> 10 Internal Transactions and 1 Token Transfer found.

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
276765492025-11-03 9:56:4986 days ago1762163809
0xEB609695...9783351D4
0 FRAX
266877612025-10-11 12:37:13109 days ago1760186233
0xEB609695...9783351D4
0 FRAX
266714072025-10-11 3:32:05109 days ago1760153525
0xEB609695...9783351D4
0 FRAX
266097192025-10-09 17:15:49110 days ago1760030149
0xEB609695...9783351D4
0 FRAX
250224832025-09-02 23:27:57147 days ago1756855677
0xEB609695...9783351D4
0 FRAX
247535742025-08-27 18:04:19153 days ago1756317859
0xEB609695...9783351D4
0 FRAX
247535682025-08-27 18:04:07153 days ago1756317847
0xEB609695...9783351D4
0 FRAX
243969532025-08-19 11:56:57162 days ago1755604617
0xEB609695...9783351D4
0 FRAX
243461572025-08-18 7:43:45163 days ago1755503025
0xEB609695...9783351D4
0 FRAX
242391032025-08-15 20:15:17165 days ago1755288917
0xEB609695...9783351D4
0 FRAX
242390982025-08-15 20:15:07165 days ago1755288907
0xEB609695...9783351D4
0 FRAX
240646632025-08-11 19:20:37169 days ago1754940037
0xEB609695...9783351D4
0 FRAX
237309362025-08-04 1:56:23177 days ago1754272583
0xEB609695...9783351D4
0 FRAX
236837702025-08-02 23:44:11178 days ago1754178251
0xEB609695...9783351D4
0 FRAX
236837472025-08-02 23:43:25178 days ago1754178205
0xEB609695...9783351D4
0 FRAX
236837442025-08-02 23:43:19178 days ago1754178199
0xEB609695...9783351D4
0 FRAX
236837402025-08-02 23:43:11178 days ago1754178191
0xEB609695...9783351D4
0 FRAX
236037222025-08-01 3:15:55180 days ago1754018155
0xEB609695...9783351D4
0 FRAX
234649492025-07-28 22:10:09183 days ago1753740609
0xEB609695...9783351D4
0 FRAX
234644142025-07-28 21:52:19183 days ago1753739539
0xEB609695...9783351D4
0 FRAX
234127632025-07-27 17:10:37184 days ago1753636237
0xEB609695...9783351D4
0 FRAX
218692792025-06-21 23:41:09220 days ago1750549269
0xEB609695...9783351D4
0 FRAX
218692742025-06-21 23:40:59220 days ago1750549259
0xEB609695...9783351D4
0 FRAX
218692702025-06-21 23:40:51220 days ago1750549251
0xEB609695...9783351D4
0 FRAX
216872802025-06-17 18:34:31224 days ago1750185271
0xEB609695...9783351D4
0 FRAX
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CurveHelper

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion
// SPDX-License-Identifier: GNU AGPLv3
pragma solidity 0.8.20;

import { ICurveRouterNgPoolsOnlyV1 } from "contracts/curve/interfaces/ICurveRouterNgPoolsOnlyV1.sol";
import { ICurveRouterWrapper } from "contracts/curve/interfaces/ICurveRouterWrapper.sol";
import { Constants } from "contracts/shared/Constants.sol";
import { ERC20 } from "@rari-capital/solmate/src/tokens/ERC20.sol";

library CurveHelper {
    /// @notice Get the last non-zero token in the route
    function getLastTokenInRoute(address[11] memory route) public pure returns (address) {
        for (uint256 i = route.length - 1; i >= 0; i--) {
            if (route[i] != address(0)) {
                return route[i];
            }
        }
        revert("No token in route");
    }

    struct CurveSwapExtraParams {
        address[11] route;
        uint256[4][5] swapParams;
        uint256 swapSlippageBufferBps;
    }

    function decodeCurveSwapExtraParams(
        bytes memory data
    ) public pure returns (CurveSwapExtraParams memory _swapExtraParams) {
        (_swapExtraParams.route, _swapExtraParams.swapParams, _swapExtraParams.swapSlippageBufferBps) = abi.decode(
            data,
            (address[11], uint256[4][5], uint256)
        );
    }

    function swapExactOutput(
        ICurveRouterNgPoolsOnlyV1 _curveRouter,
        address[11] memory _route,
        uint256[4][5] memory _swapParams,
        address[11] memory _reverseRoute,
        uint256[4][5] memory _reverseSwapParams,
        uint256 swapSlippageBufferBps,
        uint256 maxSlippageSurplusSwapBps,
        uint256 _amountOutput,
        uint256 _maxInputAmount
    ) public returns (uint256) {
        // As Curve does not support exact output swaps, we need to calculate the required input amount
        // and add a buffer to account for potential slippage. Then swapping back the surplus amount

        address inputToken = _route[0];

        // Calculate the required input amount
        uint256 estimatedAmountIn = _curveRouter.get_dx(_route, _swapParams, _amountOutput);

        // Add a buffer to account for potential slippage
        uint256 amountIn = (estimatedAmountIn * (Constants.ONE_HUNDRED_PERCENT_BPS + swapSlippageBufferBps)) /
            Constants.ONE_HUNDRED_PERCENT_BPS;

        // amountIn cannot exceed current balance of input token
        uint256 inputTokenBalance = ERC20(inputToken).balanceOf(address(this));
        if (amountIn > inputTokenBalance) {
            amountIn = inputTokenBalance;
        }

        if (amountIn > _maxInputAmount) {
            revert ICurveRouterWrapper.InputAmountExceedsMaximum(amountIn, _maxInputAmount);
        }

        // Input token balance before the swap
        uint256 inputTokenBalanceBefore = ERC20(inputToken).balanceOf(address(this));

        // Approve the router to spend our tokens
        ERC20(inputToken).approve(address(_curveRouter), _maxInputAmount);

        // Execute the swap
        uint256 actualAmountOut = _curveRouter.exchange(
            _route,
            _swapParams,
            amountIn,
            _amountOutput, // This is now our minimum expected output
            address(this) // The receiver of the output tokens
        );

        // Get the difference between the actual and expected output
        uint256 redundantAmount = actualAmountOut - _amountOutput;

        // Swap the redundant amount back to the input token with the reverse route
        if (redundantAmount > 0) {
            // Calculate estimated amount out for the swap back
            uint256 estimatedSwapBackAmountOut = _curveRouter.get_dy(
                _reverseRoute,
                _reverseSwapParams,
                redundantAmount
            );

            // Calculate minimum output amount using maxSlippageSurplusSwapBps
            uint256 minSwapBackAmountOut = (estimatedSwapBackAmountOut *
                (Constants.ONE_HUNDRED_PERCENT_BPS - maxSlippageSurplusSwapBps)) / Constants.ONE_HUNDRED_PERCENT_BPS;

            address outputToken = getLastTokenInRoute(_route);

            ERC20(outputToken).approve(address(_curveRouter), redundantAmount);
            _curveRouter.exchange(
                _reverseRoute,
                _reverseSwapParams,
                redundantAmount,
                minSwapBackAmountOut,
                address(this)
            );
        }

        // Input token balance after the swap
        uint256 inputTokenBalanceAfter = ERC20(inputToken).balanceOf(address(this));

        if (inputTokenBalanceAfter < inputTokenBalanceBefore) {
            uint256 usedInputAmount = inputTokenBalanceBefore - inputTokenBalanceAfter;

            return usedInputAmount;
        } else {
            return 0;
        }
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

// SPDX-License-Identifier: MIT
/* ———————————————————————————————————————————————————————————————————————————————— *
 *    _____     ______   ______     __     __   __     __     ______   __  __       *
 *   /\  __-.  /\__  _\ /\  == \   /\ \   /\ "-.\ \   /\ \   /\__  _\ /\ \_\ \      *
 *   \ \ \/\ \ \/_/\ \/ \ \  __<   \ \ \  \ \ \-.  \  \ \ \  \/_/\ \/ \ \____ \     *
 *    \ \____-    \ \_\  \ \_\ \_\  \ \_\  \ \_\\"\_\  \ \_\    \ \_\  \/\_____\    *
 *     \/____/     \/_/   \/_/ /_/   \/_/   \/_/ \/_/   \/_/     \/_/   \/_____/    *
 *                                                                                  *
 * ————————————————————————————————— dtrinity.org ————————————————————————————————— *
 *                                                                                  *
 *                                         ▲                                        *
 *                                        ▲ ▲                                       *
 *                                                                                  *
 * ———————————————————————————————————————————————————————————————————————————————— *
 * dTRINITY Protocol: https://github.com/dtrinity                                   *
 * ———————————————————————————————————————————————————————————————————————————————— */

pragma solidity ^0.8.20;

/**
 * @dev Interface for Curve.Fi RouterNG contract (pools-only version 1).
 * @dev Generated from original ABI: https://fraxscan.com/address/0x9f2Fa7709B30c75047980a0d70A106728f0Ef2db#code
 */

interface ICurveRouterNgPoolsOnlyV1 {
    event Exchange(
        address indexed sender,
        address indexed receiver,
        address[11] route,
        uint256[4][5] swap_params,
        uint256 in_amount,
        uint256 out_amount
    );

    function exchange(
        address[11] calldata _route,
        uint256[4][5] calldata _swap_params,
        uint256 _amount,
        uint256 _min_dy
    ) external payable returns (uint256);

    function exchange(
        address[11] calldata _route,
        uint256[4][5] calldata _swap_params,
        uint256 _amount,
        uint256 _min_dy,
        address _receiver
    ) external payable returns (uint256);

    function get_dy(
        address[11] calldata _route,
        uint256[4][5] calldata _swap_params,
        uint256 _amount
    ) external view returns (uint256);

    function get_dx(
        address[11] calldata _route,
        uint256[4][5] calldata _swap_params,
        uint256 _out_amount
    ) external view returns (uint256);

    function version() external view returns (string memory);
}

// SPDX-License-Identifier: MIT
/* ———————————————————————————————————————————————————————————————————————————————— *
 *    _____     ______   ______     __     __   __     __     ______   __  __       *
 *   /\  __-.  /\__  _\ /\  == \   /\ \   /\ "-.\ \   /\ \   /\__  _\ /\ \_\ \      *
 *   \ \ \/\ \ \/_/\ \/ \ \  __<   \ \ \  \ \ \-.  \  \ \ \  \/_/\ \/ \ \____ \     *
 *    \ \____-    \ \_\  \ \_\ \_\  \ \_\  \ \_\\"\_\  \ \_\    \ \_\  \/\_____\    *
 *     \/____/     \/_/   \/_/ /_/   \/_/   \/_/ \/_/   \/_/     \/_/   \/_____/    *
 *                                                                                  *
 * ————————————————————————————————— dtrinity.org ————————————————————————————————— *
 *                                                                                  *
 *                                         ▲                                        *
 *                                        ▲ ▲                                       *
 *                                                                                  *
 * ———————————————————————————————————————————————————————————————————————————————— *
 * dTRINITY Protocol: https://github.com/dtrinity                                   *
 * ———————————————————————————————————————————————————————————————————————————————— */

pragma solidity ^0.8.20;

import "./IRouterNG.sol";

interface ICurveRouterWrapper {
    error InsufficientOutputAmount(uint256 amountOut, uint256 minAmountOut);
    error InputAmountExceedsMaximum(uint256 amountIn, uint256 maxAmountIn);
    error InvalidRouteLength(address[11] route);
    error InvalidInputTokenInRoute(address tokenIn, address[11] route);
    error NotFoundKeyForSwapExtraParams(address inputToken, address outputToken, string key);
    error DuplicateKeyForSwapExtraParams(address inputToken, address outputToken, string key);

    function router() external view returns (ICurveRouterNG);

    /**
     * @dev Executes a token swap on Curve with exact input
     * @param route The route of the swap
     * @param swapParams The swap parameters
     * @param amountIn The exact amount of input tokens
     * @param minAmountOut The minimum amount of output tokens to receive
     * @param pools The pools to use for the swap
     * @param tokenIn The address of the input token
     * @return The amount of output tokens received
     */
    function swapExactIn(
        address[11] calldata route,
        uint256[5][5] calldata swapParams,
        uint256 amountIn,
        uint256 minAmountOut,
        address[5] calldata pools,
        address tokenIn
    ) external returns (uint256);

    /**
     * @dev Executes a token swap on Curve with exact output
     * @param route The route of the swap
     * @param swapParams The swap parameters
     * @param amountOut The exact amount of output tokens to receive
     * @param maxAmountIn The maximum amount of input tokens to spend
     * @param pools The pools to use for the swap
     * @param tokenIn The address of the input token
     * @return The amount of input tokens spent
     */
    function swapExactOutput(
        address[11] calldata route,
        uint256[5][5] calldata swapParams,
        uint256 amountOut,
        uint256 maxAmountIn,
        address[5] calldata pools,
        address tokenIn
    ) external returns (uint256);

    /**
     * @dev Gets the expected output amount for a swap
     * @param route The route of the swap
     * @param swapParams The swap parameters
     * @param amountIn The amount of input tokens
     * @param pools The pools to use for the swap
     * @return The expected amount of output tokens
     */
    function getExpectedOutput(
        address[11] calldata route,
        uint256[5][5] calldata swapParams,
        uint256 amountIn,
        address[5] calldata pools
    ) external view returns (uint256);

    /**
     * @dev Gets the expected input amount for a desired output amount
     * @param route The route of the swap
     * @param swapParams The swap parameters
     * @param amountOut The desired amount of output tokens
     * @param pools The pools to use for the swap
     * @return The expected amount of input tokens required
     */
    function getExpectedInput(
        address[11] calldata route,
        uint256[5][5] calldata swapParams,
        uint256 amountOut,
        address[5] calldata pools
    ) external view returns (uint256);
}

// SPDX-License-Identifier: MIT
/* ———————————————————————————————————————————————————————————————————————————————— *
 *    _____     ______   ______     __     __   __     __     ______   __  __       *
 *   /\  __-.  /\__  _\ /\  == \   /\ \   /\ "-.\ \   /\ \   /\__  _\ /\ \_\ \      *
 *   \ \ \/\ \ \/_/\ \/ \ \  __<   \ \ \  \ \ \-.  \  \ \ \  \/_/\ \/ \ \____ \     *
 *    \ \____-    \ \_\  \ \_\ \_\  \ \_\  \ \_\\"\_\  \ \_\    \ \_\  \/\_____\    *
 *     \/____/     \/_/   \/_/ /_/   \/_/   \/_/ \/_/   \/_/     \/_/   \/_____/    *
 *                                                                                  *
 * ————————————————————————————————— dtrinity.org ————————————————————————————————— *
 *                                                                                  *
 *                                         ▲                                        *
 *                                        ▲ ▲                                       *
 *                                                                                  *
 * ———————————————————————————————————————————————————————————————————————————————— *
 * dTRINITY Protocol: https://github.com/dtrinity                                   *
 * ———————————————————————————————————————————————————————————————————————————————— */

pragma solidity ^0.8.20;

/**
 * @dev Interface for Curve.Fi RouterNG contract.
 * @dev See original implementation in official repository:
 * https://github.com/curvefi/curve-router-ng/blob/master/contracts/Router.vy
 * ABI: https://etherscan.io/address/0x16C6521Dff6baB339122a0FE25a9116693265353#code
 */

interface ICurveRouterNG {
    event Exchange(
        address indexed sender,
        address indexed receiver,
        address[11] route,
        uint256[5][5] swap_params,
        address[5] pools,
        uint256 in_amount,
        uint256 out_amount
    );

    fallback() external payable;

    receive() external payable;

    function exchange(
        address[11] calldata _route,
        uint256[5][5] calldata _swap_params,
        uint256 _amount,
        uint256 _min_dy
    ) external payable returns (uint256);

    function exchange(
        address[11] calldata _route,
        uint256[5][5] calldata _swap_params,
        uint256 _amount,
        uint256 _min_dy,
        address[5] calldata _pools
    ) external payable returns (uint256);

    function exchange(
        address[11] calldata _route,
        uint256[5][5] calldata _swap_params,
        uint256 _amount,
        uint256 _min_dy,
        address[5] calldata _pools,
        address _receiver
    ) external payable returns (uint256);

    function get_dy(
        address[11] calldata _route,
        uint256[5][5] calldata _swap_params,
        uint256 _amount
    ) external view returns (uint256);

    function get_dy(
        address[11] calldata _route,
        uint256[5][5] calldata _swap_params,
        uint256 _amount,
        address[5] calldata _pools
    ) external view returns (uint256);

    function get_dx(
        address[11] calldata _route,
        uint256[5][5] calldata _swap_params,
        uint256 _out_amount,
        address[5] calldata _pools
    ) external view returns (uint256);

    function get_dx(
        address[11] calldata _route,
        uint256[5][5] calldata _swap_params,
        uint256 _out_amount,
        address[5] calldata _pools,
        address[5] calldata _base_pools
    ) external view returns (uint256);

    function get_dx(
        address[11] calldata _route,
        uint256[5][5] calldata _swap_params,
        uint256 _out_amount,
        address[5] calldata _pools,
        address[5] calldata _base_pools,
        address[5] calldata _base_tokens
    ) external view returns (uint256);

    function version() external view returns (string memory);
}

File 6 of 6 : Constants.sol
// SPDX-License-Identifier: MIT
/* ———————————————————————————————————————————————————————————————————————————————— *
 *    _____     ______   ______     __     __   __     __     ______   __  __       *
 *   /\  __-.  /\__  _\ /\  == \   /\ \   /\ "-.\ \   /\ \   /\__  _\ /\ \_\ \      *
 *   \ \ \/\ \ \/_/\ \/ \ \  __<   \ \ \  \ \ \-.  \  \ \ \  \/_/\ \/ \ \____ \     *
 *    \ \____-    \ \_\  \ \_\ \_\  \ \_\  \ \_\\"\_\  \ \_\    \ \_\  \/\_____\    *
 *     \/____/     \/_/   \/_/ /_/   \/_/   \/_/ \/_/   \/_/     \/_/   \/_____/    *
 *                                                                                  *
 * ————————————————————————————————— dtrinity.org ————————————————————————————————— *
 *                                                                                  *
 *                                         ▲                                        *
 *                                        ▲ ▲                                       *
 *                                                                                  *
 * ———————————————————————————————————————————————————————————————————————————————— *
 * dTRINITY Protocol: https://github.com/dtrinity                                   *
 * ———————————————————————————————————————————————————————————————————————————————— */

pragma solidity ^0.8.0;

library Constants {
    // Shared definitions of how we represent percentages and basis points
    uint16 public constant ONE_BPS = 100; // 1 basis point with 2 decimals
    uint32 public constant ONE_PERCENT_BPS = ONE_BPS * 100;
    uint32 public constant ONE_HUNDRED_PERCENT_BPS = ONE_PERCENT_BPS * 100;

    uint32 public constant ORACLE_BASE_CURRENCY_UNIT = 1e8;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "london",
  "viaIR": true,
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"}],"name":"InputAmountExceedsMaximum","type":"error"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"decodeCurveSwapExtraParams","outputs":[{"components":[{"internalType":"address[11]","name":"route","type":"address[11]"},{"internalType":"uint256[4][5]","name":"swapParams","type":"uint256[4][5]"},{"internalType":"uint256","name":"swapSlippageBufferBps","type":"uint256"}],"internalType":"struct CurveHelper.CurveSwapExtraParams","name":"_swapExtraParams","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[11]","name":"route","type":"address[11]"}],"name":"getLastTokenInRoute","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"}]

6080806040523461001d57610c9690816100238239308161038b0152f35b600080fdfe60806040908082526004908136101561001757600080fd5b600090813560e01c9081633fff811314610384575080636d5fe7ce146103085763fd47dd581461004657600080fd5b602090816003193601126103055782359167ffffffffffffffff9384841161030157366023850112156103015783810135948086116102ee57865196601f96610097818901601f191686018a6105f4565b8089528489019636602483830101116102ea5781879260248893018a378a0101528051906060820192828410908411176102d7578281526100d783610589565b610160928336823782528482019181516100f0816105bc565b86885b60a081106102bb5750508352818101978789528a518b01998b888c019b6104009d8e9103126102b7578b603f820112156102b75784519b6101338d610589565b8c61018083019482861161028c57905b8582106102945750508061019f83011215610290578551939291908e610168866105bc565b8592019381851161028c57908e9695949392919a999a915b84831061021a5750505050518a528452525196878587915b600b83106101fa575050505051918601919084925b600584106101c157888888516103e0820152f35b8483518288905b8582106101e3575050506080600192019301930192916101ad565b9280839460019394518152019301910187926101c8565b83516001600160a01b031681529281019260019290920191879101610198565b90838382949596979899509c9b9c01121561028c57875161023a816105d8565b806080850184811161028857918e9286949294905b808210610270575050608093508152019201908e96959493929a999a610180565b919381939581925181520192018f939194929461024f565b8f80fd5b8c80fd5b8a80fd5b81516001600160a01b03811681036102b3578152908b01908b01610143565b8d80fd5b8980fd5b84516102c6816105d8565b6080368237818401520187906100f3565b634e487b7160e01b865260418452602486fd5b8680fd5b634e487b7160e01b845260418252602484fd5b8280fd5b80fd5b5082906101603660031901126103055736602312156103055781519261032d84610589565b83916101649136831161038057925b8284106103605760208561034f88610660565b90516001600160a01b039091168152f35b83356001600160a01b03811681036103015781526020938401930161033c565b5080fd5b84915083307f00000000000000000000000000000000000000000000000000000000000000001461056c5761086036600319011261056c576001600160a01b039390358481168103610380573660431215610380576103e283610589565b6101849183368411610380576024905b848210610570575050366101a3121561030557845195610411876105bc565b866104049436861161056c57905b85821061051c5750503661042312156103805785519061043e82610589565b81906105649536871161051857915b8683106104ff575050503661058312156103805785519161046d836105bc565b826107e49536871161030157905b8682106104ab576020896104a48c8b8b8b8b8b61084435956108243595610804359535946107cc565b9051908152f35b36601f830112156103015788516104c1816105d8565b80608084013681116104fb5784915b8183106104eb5750505081602091608093520191019061047b565b82358152602092830192016104d0565b8580fd5b823582811681036104fb5781526020928301920161044d565b8480fd5b36601f8301121561056c578751610532816105d8565b80608084013681116102ea5784915b81831061055c5750505081602091608093520191019061041f565b8235815260209283019201610541565b8380fd5b8135888116810361056c578152602091820191016103f2565b610160810190811067ffffffffffffffff8211176105a657604052565b634e487b7160e01b600052604160045260246000fd5b60a0810190811067ffffffffffffffff8211176105a657604052565b6080810190811067ffffffffffffffff8211176105a657604052565b90601f8019910116810190811067ffffffffffffffff8211176105a657604052565b9190820391821161062357565b634e487b7160e01b600052601160045260246000fd5b90600b81101561064a5760051b0190565b634e487b7160e01b600052603260045260246000fd5b90600a5b6001600160a01b03806106778386610639565b51166106a25750801561068d5760001901610664565b60246000634e487b7160e01b81526011600452fd5b9192906106ae91610639565b511690565b6000915b600b83106106c457505050565b81516001600160a01b0316815260019290920191602091820191016106b7565b9060009182915b600583106106f95750505050565b815184825b6004821061071c5750505060206080600192019201920191906106eb565b6001908351815260208091019301910190916106fe565b6107576103e09295949361074c836104008101986106b3565b6101608301906106e4565b0152565b8181029291811591840414171561062357565b90816020910312610786575180151581036107865790565b600080fd5b9390959491926107b2610420946107a78761044081019a6106b3565b6101608701906106e4565b6103e08501526104008401526001600160a01b0316910152565b8151604051637b5e2c7b60e01b81526001600160a01b03909116989297949694959194919392916020828061080686888e60048501610733565b03816001600160a01b038a165afa9182156109ca57600092610c2c575b50620f4240019081620f42401161062357620f4240916108429161075b565b046040516370a0823160e01b81523060048201526020816024818d5afa9081156109ca57600091610bfa575b50808211610bf2575b50898111610bd4576040516370a0823160e01b81523060048201529960208b6024818d5afa9a8b156109ca5760009b610b9f575b5060405163095ea7b360e01b8082526001600160a01b03881660048301526024820192909252909392919060208160448160008f5af180156109ca578a926020928592610b82575b506109166040519485938493633f51256760e21b998a865230936004870161078b565b038160006001600160a01b038b165af19081156109ca57600091610b4e575b509061094091610616565b94856109d6575b50505050505050506020602491604051928380926370a0823160e01b82523060048301525afa9081156109ca57600091610998575b50818110156109915761098e91610616565b90565b5050600090565b906020823d6020116109c2575b816109b2602093836105f4565b810103126103055750513861097c565b3d91506109a5565b6040513d6000823e3d90fd5b6040516308f109c360e11b815290602082806109f78a898d60048501610733565b03816001600160a01b038a165afa9182156109ca57600092610b1a575b50620f424003620f4240811161062357610a34620f42409160209361075b565b04976001600160a01b0390610a4890610660565b6040519485526001600160a01b03871660048601526024850188905284916044918391600091165af180156109ca57602096600093610a9e92610aed575b5060405198899788968795865230936004870161078b565b03926001600160a01b03165af180156109ca57610ac2575b80808080808080610947565b602090813d8311610ae6575b610ad881836105f4565b810103126107865738610ab6565b503d610ace565b610b0c90893d8b11610b13575b610b0481836105f4565b81019061076e565b5038610a86565b503d610afa565b90916020823d602011610b46575b81610b35602093836105f4565b810103126103055750519038610a14565b3d9150610b28565b906020823d602011610b7a575b81610b68602093836105f4565b81010312610305575051610940610935565b3d9150610b5b565b610b9890843d8611610b1357610b0481836105f4565b50386108f3565b909a6020823d602011610bcc575b81610bba602093836105f4565b810103126103055750519960006108ab565b3d9150610bad565b6044908a604051916334398dcf60e01b835260048301526024820152fd5b905038610877565b906020823d602011610c24575b81610c14602093836105f4565b810103126103055750513861086e565b3d9150610c07565b90916020823d602011610c58575b81610c47602093836105f4565b810103126103055750519038610823565b3d9150610c3a56fea26469706673582212200032fda758825f3367722947d71ecffef25967cc85edb6707891c84ddb699ffd64736f6c63430008140033

Deployed Bytecode

0x60806040908082526004908136101561001757600080fd5b600090813560e01c9081633fff811314610384575080636d5fe7ce146103085763fd47dd581461004657600080fd5b602090816003193601126103055782359167ffffffffffffffff9384841161030157366023850112156103015783810135948086116102ee57865196601f96610097818901601f191686018a6105f4565b8089528489019636602483830101116102ea5781879260248893018a378a0101528051906060820192828410908411176102d7578281526100d783610589565b610160928336823782528482019181516100f0816105bc565b86885b60a081106102bb5750508352818101978789528a518b01998b888c019b6104009d8e9103126102b7578b603f820112156102b75784519b6101338d610589565b8c61018083019482861161028c57905b8582106102945750508061019f83011215610290578551939291908e610168866105bc565b8592019381851161028c57908e9695949392919a999a915b84831061021a5750505050518a528452525196878587915b600b83106101fa575050505051918601919084925b600584106101c157888888516103e0820152f35b8483518288905b8582106101e3575050506080600192019301930192916101ad565b9280839460019394518152019301910187926101c8565b83516001600160a01b031681529281019260019290920191879101610198565b90838382949596979899509c9b9c01121561028c57875161023a816105d8565b806080850184811161028857918e9286949294905b808210610270575050608093508152019201908e96959493929a999a610180565b919381939581925181520192018f939194929461024f565b8f80fd5b8c80fd5b8a80fd5b81516001600160a01b03811681036102b3578152908b01908b01610143565b8d80fd5b8980fd5b84516102c6816105d8565b6080368237818401520187906100f3565b634e487b7160e01b865260418452602486fd5b8680fd5b634e487b7160e01b845260418252602484fd5b8280fd5b80fd5b5082906101603660031901126103055736602312156103055781519261032d84610589565b83916101649136831161038057925b8284106103605760208561034f88610660565b90516001600160a01b039091168152f35b83356001600160a01b03811681036103015781526020938401930161033c565b5080fd5b84915083307f000000000000000000000000eb609695017aa8597fa9b3db276ec639783351d41461056c5761086036600319011261056c576001600160a01b039390358481168103610380573660431215610380576103e283610589565b6101849183368411610380576024905b848210610570575050366101a3121561030557845195610411876105bc565b866104049436861161056c57905b85821061051c5750503661042312156103805785519061043e82610589565b81906105649536871161051857915b8683106104ff575050503661058312156103805785519161046d836105bc565b826107e49536871161030157905b8682106104ab576020896104a48c8b8b8b8b8b61084435956108243595610804359535946107cc565b9051908152f35b36601f830112156103015788516104c1816105d8565b80608084013681116104fb5784915b8183106104eb5750505081602091608093520191019061047b565b82358152602092830192016104d0565b8580fd5b823582811681036104fb5781526020928301920161044d565b8480fd5b36601f8301121561056c578751610532816105d8565b80608084013681116102ea5784915b81831061055c5750505081602091608093520191019061041f565b8235815260209283019201610541565b8380fd5b8135888116810361056c578152602091820191016103f2565b610160810190811067ffffffffffffffff8211176105a657604052565b634e487b7160e01b600052604160045260246000fd5b60a0810190811067ffffffffffffffff8211176105a657604052565b6080810190811067ffffffffffffffff8211176105a657604052565b90601f8019910116810190811067ffffffffffffffff8211176105a657604052565b9190820391821161062357565b634e487b7160e01b600052601160045260246000fd5b90600b81101561064a5760051b0190565b634e487b7160e01b600052603260045260246000fd5b90600a5b6001600160a01b03806106778386610639565b51166106a25750801561068d5760001901610664565b60246000634e487b7160e01b81526011600452fd5b9192906106ae91610639565b511690565b6000915b600b83106106c457505050565b81516001600160a01b0316815260019290920191602091820191016106b7565b9060009182915b600583106106f95750505050565b815184825b6004821061071c5750505060206080600192019201920191906106eb565b6001908351815260208091019301910190916106fe565b6107576103e09295949361074c836104008101986106b3565b6101608301906106e4565b0152565b8181029291811591840414171561062357565b90816020910312610786575180151581036107865790565b600080fd5b9390959491926107b2610420946107a78761044081019a6106b3565b6101608701906106e4565b6103e08501526104008401526001600160a01b0316910152565b8151604051637b5e2c7b60e01b81526001600160a01b03909116989297949694959194919392916020828061080686888e60048501610733565b03816001600160a01b038a165afa9182156109ca57600092610c2c575b50620f4240019081620f42401161062357620f4240916108429161075b565b046040516370a0823160e01b81523060048201526020816024818d5afa9081156109ca57600091610bfa575b50808211610bf2575b50898111610bd4576040516370a0823160e01b81523060048201529960208b6024818d5afa9a8b156109ca5760009b610b9f575b5060405163095ea7b360e01b8082526001600160a01b03881660048301526024820192909252909392919060208160448160008f5af180156109ca578a926020928592610b82575b506109166040519485938493633f51256760e21b998a865230936004870161078b565b038160006001600160a01b038b165af19081156109ca57600091610b4e575b509061094091610616565b94856109d6575b50505050505050506020602491604051928380926370a0823160e01b82523060048301525afa9081156109ca57600091610998575b50818110156109915761098e91610616565b90565b5050600090565b906020823d6020116109c2575b816109b2602093836105f4565b810103126103055750513861097c565b3d91506109a5565b6040513d6000823e3d90fd5b6040516308f109c360e11b815290602082806109f78a898d60048501610733565b03816001600160a01b038a165afa9182156109ca57600092610b1a575b50620f424003620f4240811161062357610a34620f42409160209361075b565b04976001600160a01b0390610a4890610660565b6040519485526001600160a01b03871660048601526024850188905284916044918391600091165af180156109ca57602096600093610a9e92610aed575b5060405198899788968795865230936004870161078b565b03926001600160a01b03165af180156109ca57610ac2575b80808080808080610947565b602090813d8311610ae6575b610ad881836105f4565b810103126107865738610ab6565b503d610ace565b610b0c90893d8b11610b13575b610b0481836105f4565b81019061076e565b5038610a86565b503d610afa565b90916020823d602011610b46575b81610b35602093836105f4565b810103126103055750519038610a14565b3d9150610b28565b906020823d602011610b7a575b81610b68602093836105f4565b81010312610305575051610940610935565b3d9150610b5b565b610b9890843d8611610b1357610b0481836105f4565b50386108f3565b909a6020823d602011610bcc575b81610bba602093836105f4565b810103126103055750519960006108ab565b3d9150610bad565b6044908a604051916334398dcf60e01b835260048301526024820152fd5b905038610877565b906020823d602011610c24575b81610c14602093836105f4565b810103126103055750513861086e565b3d9150610c07565b90916020823d602011610c58575b81610c47602093836105f4565b810103126103055750519038610823565b3d9150610c3a56fea26469706673582212200032fda758825f3367722947d71ecffef25967cc85edb6707891c84ddb699ffd64736f6c63430008140033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.