ETH Price: $2,020.43 (-2.33%)

Contract

0x7839254CfF8aaFBdC2da66fe709eB8f17cE09fe5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Method Block
From
To
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
AMMQuoter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
pragma solidity ^0.6.0;

import "@openzeppelin/contracts/math/SafeMath.sol";
import "./interface/IUniswapExchange.sol";
import "./interface/IUniswapFactory.sol";
import "./interface/IUniswapRouterV2.sol";
import "./interface/ICurveFi.sol";
import "./interface/IWeth.sol";
import "./interface/IPermanentStorage.sol";

contract AMMQuoter {
    using SafeMath for uint256;
    /* Constants */
    string public constant version = "5.1.0";
    address private constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    address private constant ZERO_ADDRESS = address(0);
    address public constant UNISWAP_V2_ROUTER_02_ADDRESS = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address public constant SUSHISWAP_ROUTER_ADDRESS = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F;
    address public immutable weth;
    IPermanentStorage public immutable permStorage;

    event CurveTokenAdded(
        address indexed makerAddress,
        address indexed assetAddress,
        int128 index
    );

    constructor (IPermanentStorage _permStorage, address _weth) public {
        permStorage = _permStorage;
        weth = _weth;
    }

    function isETH(address assetAddress) public pure returns (bool) {
        return (assetAddress == ZERO_ADDRESS || assetAddress == ETH_ADDRESS);
    }

    function getMakerOutAmount(
        address _makerAddr,
        address _takerAssetAddr,
        address _makerAssetAddr,
        uint256 _takerAssetAmount
    )
        public
        view
        returns (uint256)
    {
        uint256 makerAssetAmount;
        if (_makerAddr == UNISWAP_V2_ROUTER_02_ADDRESS ||
            _makerAddr == SUSHISWAP_ROUTER_ADDRESS) {
            IUniswapRouterV2 router = IUniswapRouterV2(_makerAddr);
            address[] memory path = new address[](2);
            if (isETH(_takerAssetAddr)) {
                path[0] = weth;
                path[1] = _makerAssetAddr;
            } else if (isETH(_makerAssetAddr)) {
                path[0] = _takerAssetAddr;
                path[1] = weth;
            } else {
                path[0] = _takerAssetAddr;
                path[1] = _makerAssetAddr;
            }
            uint256[] memory amounts = router.getAmountsOut(_takerAssetAmount, path);
            makerAssetAmount = amounts[1];
        } else {
            address curveTakerIntenalAsset = isETH(_takerAssetAddr) ? ETH_ADDRESS : _takerAssetAddr;
            address curveMakerIntenalAsset = isETH(_makerAssetAddr) ? ETH_ADDRESS : _makerAssetAddr;
            (int128 fromTokenCurveIndex, int128 toTokenCurveIndex, uint16 swapMethod,) = permStorage.getCurvePoolInfo(_makerAddr, curveTakerIntenalAsset, curveMakerIntenalAsset);
            if (fromTokenCurveIndex > 0 && toTokenCurveIndex > 0) {
                require(swapMethod != 0, "AMMQuoter: swap method not registered");
                // Substract index by 1 because indices stored in `permStorage` starts from 1
                fromTokenCurveIndex = fromTokenCurveIndex - 1;
                toTokenCurveIndex = toTokenCurveIndex - 1;
                ICurveFi curve = ICurveFi(_makerAddr);
                if (swapMethod == 1) {
                    makerAssetAmount = curve.get_dy(fromTokenCurveIndex, toTokenCurveIndex, _takerAssetAmount).sub(1);
                } else if (swapMethod == 2) {
                    makerAssetAmount = curve.get_dy_underlying(fromTokenCurveIndex, toTokenCurveIndex, _takerAssetAmount).sub(1);
                }
            } else {
                revert("AMMQuoter: Unsupported makerAddr");
            }
        }
        return makerAssetAmount;
    }

    function getBestOutAmount(
        address[] calldata _makerAddresses,
        address _takerAssetAddr,
        address _makerAssetAddr,
        uint256 _takerAssetAmount
    )
        external
        view
        returns (address bestMaker, uint256 bestAmount)
    {
        bestAmount = 0;
        uint256 poolLength = _makerAddresses.length;
        for (uint256 i = 0; i < poolLength; i++) {
            address makerAddress = _makerAddresses[i];
            uint256 makerAssetAmount = getMakerOutAmount(makerAddress, _takerAssetAddr, _makerAssetAddr, _takerAssetAmount);
            if (makerAssetAmount > bestAmount) {
                bestAmount = makerAssetAmount;
                bestMaker = makerAddress;
            }
        }
        return (bestMaker, bestAmount);
    }

    function getTakerInAmount(
        address _makerAddr,
        address _takerAssetAddr,
        address _makerAssetAddr,
        uint256 _makerAssetAmount
    )
        public
        view
        returns (uint256)
    {
        uint256 takerAssetAmount;
        if (_makerAddr == UNISWAP_V2_ROUTER_02_ADDRESS ||
            _makerAddr == SUSHISWAP_ROUTER_ADDRESS) {
            IUniswapRouterV2 router = IUniswapRouterV2(_makerAddr);
            address[] memory path = new address[](2);
            if (isETH(_takerAssetAddr)) {
                path[0] = weth;
                path[1] = _makerAssetAddr;
            } else if (isETH(_makerAssetAddr)) {
                path[0] = _takerAssetAddr;
                path[1] = weth;
            } else {
                path[0] = _takerAssetAddr;
                path[1] = _makerAssetAddr;
            }
            uint256[] memory amounts = router.getAmountsIn(_makerAssetAmount, path);
            takerAssetAmount = amounts[0];
        } else {
            address curveTakerIntenalAsset = isETH(_takerAssetAddr) ? ETH_ADDRESS : _takerAssetAddr;
            address curveMakerIntenalAsset = isETH(_makerAssetAddr) ? ETH_ADDRESS : _makerAssetAddr;
            (int128 fromTokenCurveIndex, int128 toTokenCurveIndex, uint16 swapMethod, bool supportGetDx) = permStorage.getCurvePoolInfo(_makerAddr, curveTakerIntenalAsset, curveMakerIntenalAsset);
            if (fromTokenCurveIndex > 0 && toTokenCurveIndex > 0) {
                require(swapMethod != 0, "AMMQuoter: swap method not registered");
                // Substract index by 1 because indices stored in `permStorage` starts from 1
                fromTokenCurveIndex = fromTokenCurveIndex - 1;
                toTokenCurveIndex = toTokenCurveIndex - 1;
                ICurveFi curve = ICurveFi(_makerAddr);
                if (supportGetDx) {
                    if (swapMethod == 1) {
                        takerAssetAmount = curve.get_dx(fromTokenCurveIndex, toTokenCurveIndex, _makerAssetAmount);
                    } else if (swapMethod == 2) {
                        takerAssetAmount = curve.get_dx_underlying(fromTokenCurveIndex, toTokenCurveIndex, _makerAssetAmount);
                    }
                } else {
                    if (swapMethod == 1) {
                        // does not support get_dx_underlying, try to get an estimated rate here
                        takerAssetAmount = curve.get_dy(toTokenCurveIndex, fromTokenCurveIndex, _makerAssetAmount);
                    } else if (swapMethod == 2) {
                        takerAssetAmount = curve.get_dy_underlying(toTokenCurveIndex, fromTokenCurveIndex, _makerAssetAmount);
                    }
                }
            } else {
                revert("AMMQuoter: Unsupported makerAddr");
            }
        }
        return takerAssetAmount;
    }

    function getBestInAmount(
        address[] calldata _makerAddresses,
        address _takerAssetAddr,
        address _makerAssetAddr,
        uint256 _makerAssetAmount
    )
        external
        view
        returns (address bestMaker, uint256 bestAmount)
    {
        bestAmount = 2**256 - 1;
        uint256 poolLength = _makerAddresses.length;
        for (uint256 i = 0; i < poolLength; i++) {
            address makerAddress = _makerAddresses[i];
            uint256 takerAssetAmount = getTakerInAmount(makerAddress, _takerAssetAddr, _makerAssetAddr, _makerAssetAmount);
            if (takerAssetAmount < bestAmount) {
                bestAmount = takerAssetAmount;
                bestMaker = makerAddress;
            }
        }
        return (bestMaker, bestAmount);
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 3 of 8 : IUniswapExchange.sol
pragma solidity >=0.5.0 <0.8.0;

interface IUniswapExchange {
    // Address of ERC20 token sold on this exchange
    function tokenAddress() external view returns (address token);
    // Address of Uniswap Factory
    function factoryAddress() external view returns (address factory);
    // Provide Liquidity
    function addLiquidity(uint256 min_liquidity, uint256 max_tokens, uint256 deadline) external payable returns (uint256);
    function removeLiquidity(uint256 amount, uint256 min_eth, uint256 min_tokens, uint256 deadline) external returns (uint256, uint256);
    // Get Prices
    function getEthToTokenInputPrice(uint256 eth_sold) external view returns (uint256 tokens_bought);
    function getEthToTokenOutputPrice(uint256 tokens_bought) external view returns (uint256 eth_sold);
    function getTokenToEthInputPrice(uint256 tokens_sold) external view returns (uint256 eth_bought);
    function getTokenToEthOutputPrice(uint256 eth_bought) external view returns (uint256 tokens_sold);
    // Trade ETH to ERC20
    function ethToTokenSwapInput(uint256 min_tokens, uint256 deadline) external payable returns (uint256 tokens_bought);
    function ethToTokenTransferInput(uint256 min_tokens, uint256 deadline, address recipient) external payable returns (uint256  tokens_bought);
    function ethToTokenSwapOutput(uint256 tokens_bought, uint256 deadline) external payable returns (uint256  eth_sold);
    function ethToTokenTransferOutput(uint256 tokens_bought, uint256 deadline, address recipient) external payable returns (uint256  eth_sold);
    // Trade ERC20 to ETH
    function tokenToEthSwapInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline) external returns (uint256  eth_bought);
    function tokenToEthTransferInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline, address recipient) external returns (uint256  eth_bought);
    function tokenToEthSwapOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline) external returns (uint256  tokens_sold);
    function tokenToEthTransferOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline, address recipient) external returns (uint256  tokens_sold);
    // Trade ERC20 to ERC20
    function tokenToTokenSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address token_addr) external returns (uint256  tokens_bought);
    function tokenToTokenTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address token_addr) external returns (uint256  tokens_bought);
    function tokenToTokenSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address token_addr) external returns (uint256  tokens_sold);
    function tokenToTokenTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address token_addr) external returns (uint256  tokens_sold);
    // Trade ERC20 to Custom Pool
    function tokenToExchangeSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address exchange_addr) external returns (uint256  tokens_bought);
    function tokenToExchangeTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address exchange_addr) external returns (uint256  tokens_bought);
    function tokenToExchangeSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address exchange_addr) external returns (uint256  tokens_sold);
    function tokenToExchangeTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address exchange_addr) external returns (uint256  tokens_sold);
    // ERC20 comaptibility for liquidity tokens
    function name() external view returns (bytes32);
    function symbol() external view returns (bytes32);
    function decimals() external view returns (uint256);
    function transfer(address _to, uint256 _value) external returns (bool);
    function transferFrom(address _from, address _to, uint256 value) external returns (bool);
    function approve(address _spender, uint256 _value) external returns (bool);
    function allowance(address _owner, address _spender) external view returns (uint256);
    function balanceOf(address _owner) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    // Never use
    function setup(address token_addr) external;
}

pragma solidity >=0.5.0 <0.8.0;

interface IUniswapFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);
    function allPairsLength() external view returns (uint256);
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    // Create Exchange
    function createExchange(address token) external returns (address exchange);
    // Get Exchange and Token Info
    function getExchange(address token) external view returns (address exchange);
    function getToken(address exchange) external view returns (address token);
    function getTokenWithId(uint256 tokenId) external view returns (address token);
    // Never use
    function initializeFactory(address template) external;
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.8.0;

interface IUniswapRouterV2 {
    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);
}

pragma solidity >=0.5.0 <0.8.0;

interface ICurveFi {
    function get_virtual_price() external returns (uint256 out);
    function add_liquidity(
        uint256[2] calldata amounts,
        uint256 deadline
    ) external;

    function add_liquidity(
        // sBTC pool
        uint256[3] calldata amounts,
        uint256 min_mint_amount
    ) external;

    function add_liquidity(
        // bUSD pool
        uint256[4] calldata amounts,
        uint256 min_mint_amount
    ) external;

    function get_dx(
        int128 i,
        int128 j,
        uint256 dy
    ) external view returns (uint256 out);

    function get_dx_underlying(
        int128 i,
        int128 j,
        uint256 dy
    ) external view returns (uint256 out);

    function get_dy(
        int128 i,
        int128 j,
        uint256 dx
    ) external view returns (uint256 out);

    function get_dy_underlying(
        int128 i,
        int128 j,
        uint256 dx
    ) external view returns (uint256 out);

    function exchange(
        int128 i,
        int128 j,
        uint256 dx,
        uint256 min_dy
    ) external payable;

    function exchange(
        int128 i,
        int128 j,
        uint256 dx,
        uint256 min_dy,
        uint256 deadline
    ) external payable;

    function exchange_underlying(
        int128 i,
        int128 j,
        uint256 dx,
        uint256 min_dy
    ) external payable;

    function exchange_underlying(
        int128 i,
        int128 j,
        uint256 dx,
        uint256 min_dy,
        uint256 deadline
    ) external payable;

    function remove_liquidity(
        uint256 _amount,
        uint256 deadline,
        uint256[2] calldata min_amounts
    ) external;

    function remove_liquidity_imbalance(
        uint256[2] calldata amounts,
        uint256 deadline
    ) external;

    function remove_liquidity_imbalance(
        uint256[3] calldata amounts,
        uint256 max_burn_amount
    ) external;

    function remove_liquidity(uint256 _amount, uint256[3] calldata amounts)
        external;

    function remove_liquidity_imbalance(
        uint256[4] calldata amounts,
        uint256 max_burn_amount
    ) external;

    function remove_liquidity(uint256 _amount, uint256[4] calldata amounts)
        external;

    function commit_new_parameters(
        int128 amplification,
        int128 new_fee,
        int128 new_admin_fee
    ) external;

    function apply_new_parameters() external;

    function revert_new_parameters() external;

    function commit_transfer_ownership(address _owner) external;

    function apply_transfer_ownership() external;

    function revert_transfer_ownership() external;

    function withdraw_admin_fees() external;

    function coins(int128 arg0) external returns (address out);

    function underlying_coins(int128 arg0) external returns (address out);

    function balances(int128 arg0) external returns (uint256 out);

    function A() external returns (int128 out);

    function fee() external returns (int128 out);

    function admin_fee() external returns (int128 out);

    function owner() external returns (address out);

    function admin_actions_deadline() external returns (uint256 out);

    function transfer_ownership_deadline() external returns (uint256 out);

    function future_A() external returns (int128 out);

    function future_fee() external returns (int128 out);

    function future_admin_fee() external returns (int128 out);

    function future_owner() external returns (address out);
}

pragma solidity ^0.6.0;

interface IWETH {
    function deposit() external payable;
    function withdraw(uint256 amount) external;
    function transferFrom(address src, address dst, uint wad) external returns (bool);
}

pragma solidity ^0.6.0;

interface IPermanentStorage {
    function wethAddr() external view returns (address);
    function getCurvePoolInfo(address _makerAddr, address _takerAssetAddr, address _makerAssetAddr) external view returns (int128 takerAssetIndex, int128 makerAssetIndex, uint16 swapMethod, bool supportGetDx);
    function setCurvePoolInfo(address _makerAddr, address[] calldata _underlyingCoins, address[] calldata _coins, bool _supportGetDx) external;
    function isTransactionSeen(bytes32 _transactionHash) external view returns (bool);
    function isRelayerValid(address _relayer) external view returns (bool);
    function setTransactionSeen(bytes32 _transactionHash) external;
    function setRelayersValid(address[] memory _relayers, bool[] memory _isValids) external;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IPermanentStorage","name":"_permStorage","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"makerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"assetAddress","type":"address"},{"indexed":false,"internalType":"int128","name":"index","type":"int128"}],"name":"CurveTokenAdded","type":"event"},{"inputs":[],"name":"SUSHISWAP_ROUTER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_V2_ROUTER_02_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_makerAddresses","type":"address[]"},{"internalType":"address","name":"_takerAssetAddr","type":"address"},{"internalType":"address","name":"_makerAssetAddr","type":"address"},{"internalType":"uint256","name":"_makerAssetAmount","type":"uint256"}],"name":"getBestInAmount","outputs":[{"internalType":"address","name":"bestMaker","type":"address"},{"internalType":"uint256","name":"bestAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_makerAddresses","type":"address[]"},{"internalType":"address","name":"_takerAssetAddr","type":"address"},{"internalType":"address","name":"_makerAssetAddr","type":"address"},{"internalType":"uint256","name":"_takerAssetAmount","type":"uint256"}],"name":"getBestOutAmount","outputs":[{"internalType":"address","name":"bestMaker","type":"address"},{"internalType":"uint256","name":"bestAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_makerAddr","type":"address"},{"internalType":"address","name":"_takerAssetAddr","type":"address"},{"internalType":"address","name":"_makerAssetAddr","type":"address"},{"internalType":"uint256","name":"_takerAssetAmount","type":"uint256"}],"name":"getMakerOutAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_makerAddr","type":"address"},{"internalType":"address","name":"_takerAssetAddr","type":"address"},{"internalType":"address","name":"_makerAssetAddr","type":"address"},{"internalType":"uint256","name":"_makerAssetAmount","type":"uint256"}],"name":"getTakerInAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"}],"name":"isETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"permStorage","outputs":[{"internalType":"contract IPermanentStorage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60c060405234801561001057600080fd5b506040516114e83803806114e88339818101604052604081101561003357600080fd5b5080516020909101516001600160601b0319606092831b811660a052911b1660805260805160601c60a05160601c61144c61009c600039806108485280610ecd52806112b55250806103dc528061051252806105cf5280610ba85280610c65525061144c6000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063a94c12bc11610076578063bc2990331161005b578063bc299033146102f7578063c49e4fd914610333578063f70a25081461033b576100be565b8063a94c12bc146102e7578063bb8a43b9146102ef576100be565b80634bbf902b116100a75780634bbf902b1461019357806354fd4d501461021c578063a673e16314610299576100be565b806319cff21e146100c35780633fc8cef31461016f575b600080fd5b61014c600480360360808110156100d957600080fd5b8101906020810181356401000000008111156100f457600080fd5b82018360208201111561010657600080fd5b8035906020019184602083028401116401000000008311171561012857600080fd5b91935091506001600160a01b03813581169160208101359091169060400135610375565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6101776103da565b604080516001600160a01b039092168252519081900360200190f35b61014c600480360360808110156101a957600080fd5b8101906020810181356401000000008111156101c457600080fd5b8201836020820111156101d657600080fd5b803590602001918460208302840111640100000000831117156101f857600080fd5b91935091506001600160a01b038135811691602081013590911690604001356103fe565b610224610455565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025e578181015183820152602001610246565b50505050905090810190601f16801561028b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d5600480360360808110156102af57600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561048e565b60408051918252519081900360200190f35b610177610af4565b610177610b0c565b6102d56004803603608081101561030d57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610b24565b6101776112b3565b6103616004803603602081101561035157600080fd5b50356001600160a01b03166112d7565b604080519115158252519081900360200190f35b600060001985825b818110156103ce57600089898381811061039357fe5b905060200201356001600160a01b0316905060006103b3828a8a8a610b24565b9050848110156103c4578094508195505b505060010161037d565b50509550959350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008085815b818110156103ce57600089898381811061041a57fe5b905060200201356001600160a01b03169050600061043a828a8a8a61048e565b90508481111561044b578094508195505b5050600101610404565b6040518060400160405280600581526020017f352e312e3000000000000000000000000000000000000000000000000000000081525081565b6000806001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d14806104d857506001600160a01b03861673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f145b156107e7576040805160028082526060808301845289939092919060208301908036833701905050905061050b876112d7565b15610591577f00000000000000000000000000000000000000000000000000000000000000008160008151811061053e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061056c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610658565b61059a866112d7565b156105fb5786816000815181106105ad57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061056c57fe5b868160008151811061060957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061063757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b604080517fd06ca61f00000000000000000000000000000000000000000000000000000000815260048101878152602482019283528351604483015283516060936001600160a01b0387169363d06ca61f938b9388939192606401906020808601910280838360005b838110156106d95781810151838201526020016106c1565b50505050905001935050505060006040518083038186803b1580156106fd57600080fd5b505afa158015610711573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561073a57600080fd5b810190808051604051939291908464010000000082111561075a57600080fd5b90830190602082018581111561076f57600080fd5b825186602082028301116401000000008211171561078c57600080fd5b82525081516020918201928201910280838360005b838110156107b95781810151838201526020016107a1565b505050509050016040525050509050806001815181106107d557fe5b60200260200101519350505050610aeb565b60006107f2866112d7565b6107fc5785610812565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061081f866112d7565b610829578561083f565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b905060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638ab4a8cc8c87876040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b03168152602001826001600160a01b03168152602001935050505060806040518083038186803b1580156108d557600080fd5b505afa1580156108e9573d6000803e3d6000fd5b505050506040513d60808110156108ff57600080fd5b508051602082015160409092015190945090925090506000600f84900b13801561092c5750600082600f0b135b15610a985761ffff81166109715760405162461bcd60e51b81526004018080602001828103825260258152602001806113f26025913960400191505060405180910390fd5b6000199283019291909101908a61ffff821660011415610a2357610a1c6001826001600160a01b0316635e0d443f87878e6040518463ffffffff1660e01b81526004018084600f0b815260200183600f0b8152602001828152602001935050505060206040518083038186803b1580156109ea57600080fd5b505afa1580156109fe573d6000803e3d6000fd5b505050506040513d6020811015610a1457600080fd5b505190611311565b9650610a92565b8161ffff1660021415610a9257610a8f6001826001600160a01b03166307211ef787878e6040518463ffffffff1660e01b81526004018084600f0b815260200183600f0b8152602001828152602001935050505060206040518083038186803b1580156109ea57600080fd5b96505b50610ae5565b6040805162461bcd60e51b815260206004820181905260248201527f414d4d51756f7465723a20556e737570706f72746564206d616b657241646472604482015290519081900360640190fd5b50505050505b95945050505050565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6000806001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d1480610b6e57506001600160a01b03861673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f145b15610e6b5760408051600280825260608083018452899390929190602083019080368337019050509050610ba1876112d7565b15610c27577f000000000000000000000000000000000000000000000000000000000000000081600081518110610bd457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110610c0257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610cee565b610c30866112d7565b15610c91578681600081518110610c4357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610c0257fe5b8681600081518110610c9f57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110610ccd57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b604080517f1f00ca7400000000000000000000000000000000000000000000000000000000815260048101878152602482019283528351604483015283516060936001600160a01b03871693631f00ca74938b9388939192606401906020808601910280838360005b83811015610d6f578181015183820152602001610d57565b50505050905001935050505060006040518083038186803b158015610d9357600080fd5b505afa158015610da7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610dd057600080fd5b8101908080516040519392919084640100000000821115610df057600080fd5b908301906020820185811115610e0557600080fd5b8251866020820283011164010000000082111715610e2257600080fd5b82525081516020918201928201910280838360005b83811015610e4f578181015183820152602001610e37565b505050509050016040525050509050806000815181106107d557fe5b6000610e76866112d7565b610e805785610e96565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b90506000610ea3866112d7565b610ead5785610ec3565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b90506000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638ab4a8cc8d88886040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b03168152602001826001600160a01b03168152602001935050505060806040518083038186803b158015610f5a57600080fd5b505afa158015610f6e573d6000803e3d6000fd5b505050506040513d6080811015610f8457600080fd5b50805160208201516040830151606090930151919650945090925090506000600f85900b138015610fb85750600083600f0b135b15610a985761ffff8216610ffd5760405162461bcd60e51b81526004018080602001828103825260258152602001806113f26025913960400191505060405180910390fd5b6000199384019392909201918b8115611175578261ffff16600114156110c257604080517f67df02ca000000000000000000000000000000000000000000000000000000008152600f87810b600483015286900b6024820152604481018c905290516001600160a01b038316916367df02ca916064808301926020929190829003018186803b15801561108f57600080fd5b505afa1580156110a3573d6000803e3d6000fd5b505050506040513d60208110156110b957600080fd5b50519750611170565b8261ffff166002141561117057604080517f0e71d1b9000000000000000000000000000000000000000000000000000000008152600f87810b600483015286900b6024820152604481018c905290516001600160a01b03831691630e71d1b9916064808301926020929190829003018186803b15801561114157600080fd5b505afa158015611155573d6000803e3d6000fd5b505050506040513d602081101561116b57600080fd5b505197505b6112a2565b8261ffff16600114156111f457604080517f5e0d443f000000000000000000000000000000000000000000000000000000008152600f86810b600483015287900b6024820152604481018c905290516001600160a01b03831691635e0d443f916064808301926020929190829003018186803b15801561114157600080fd5b8261ffff16600214156112a257604080517f07211ef7000000000000000000000000000000000000000000000000000000008152600f86810b600483015287900b6024820152604481018c905290516001600160a01b038316916307211ef7916064808301926020929190829003018186803b15801561127357600080fd5b505afa158015611287573d6000803e3d6000fd5b505050506040513d602081101561129d57600080fd5b505197505b505050505050509050949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006001600160a01b038216158061130b57506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b92915050565b600061135383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061135a565b9392505050565b600081848411156113e95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156113ae578181015183820152602001611396565b50505050905090810190601f1680156113db5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe414d4d51756f7465723a2073776170206d6574686f64206e6f742072656769737465726564a26469706673582212206e2b5e4d39bf411a6e84859d1bf83ff8174174f698266ecc92359775a302162464736f6c634300060c00330000000000000000000000006d9cc14a1d36e6ff13fc6efa9e9326fcd12e7903000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063a94c12bc11610076578063bc2990331161005b578063bc299033146102f7578063c49e4fd914610333578063f70a25081461033b576100be565b8063a94c12bc146102e7578063bb8a43b9146102ef576100be565b80634bbf902b116100a75780634bbf902b1461019357806354fd4d501461021c578063a673e16314610299576100be565b806319cff21e146100c35780633fc8cef31461016f575b600080fd5b61014c600480360360808110156100d957600080fd5b8101906020810181356401000000008111156100f457600080fd5b82018360208201111561010657600080fd5b8035906020019184602083028401116401000000008311171561012857600080fd5b91935091506001600160a01b03813581169160208101359091169060400135610375565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6101776103da565b604080516001600160a01b039092168252519081900360200190f35b61014c600480360360808110156101a957600080fd5b8101906020810181356401000000008111156101c457600080fd5b8201836020820111156101d657600080fd5b803590602001918460208302840111640100000000831117156101f857600080fd5b91935091506001600160a01b038135811691602081013590911690604001356103fe565b610224610455565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025e578181015183820152602001610246565b50505050905090810190601f16801561028b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d5600480360360808110156102af57600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561048e565b60408051918252519081900360200190f35b610177610af4565b610177610b0c565b6102d56004803603608081101561030d57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610b24565b6101776112b3565b6103616004803603602081101561035157600080fd5b50356001600160a01b03166112d7565b604080519115158252519081900360200190f35b600060001985825b818110156103ce57600089898381811061039357fe5b905060200201356001600160a01b0316905060006103b3828a8a8a610b24565b9050848110156103c4578094508195505b505060010161037d565b50509550959350505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60008085815b818110156103ce57600089898381811061041a57fe5b905060200201356001600160a01b03169050600061043a828a8a8a61048e565b90508481111561044b578094508195505b5050600101610404565b6040518060400160405280600581526020017f352e312e3000000000000000000000000000000000000000000000000000000081525081565b6000806001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d14806104d857506001600160a01b03861673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f145b156107e7576040805160028082526060808301845289939092919060208301908036833701905050905061050b876112d7565b15610591577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061053e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061056c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610658565b61059a866112d7565b156105fb5786816000815181106105ad57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061056c57fe5b868160008151811061060957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061063757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b604080517fd06ca61f00000000000000000000000000000000000000000000000000000000815260048101878152602482019283528351604483015283516060936001600160a01b0387169363d06ca61f938b9388939192606401906020808601910280838360005b838110156106d95781810151838201526020016106c1565b50505050905001935050505060006040518083038186803b1580156106fd57600080fd5b505afa158015610711573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561073a57600080fd5b810190808051604051939291908464010000000082111561075a57600080fd5b90830190602082018581111561076f57600080fd5b825186602082028301116401000000008211171561078c57600080fd5b82525081516020918201928201910280838360005b838110156107b95781810151838201526020016107a1565b505050509050016040525050509050806001815181106107d557fe5b60200260200101519350505050610aeb565b60006107f2866112d7565b6107fc5785610812565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061081f866112d7565b610829578561083f565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b905060008060007f0000000000000000000000006d9cc14a1d36e6ff13fc6efa9e9326fcd12e79036001600160a01b0316638ab4a8cc8c87876040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b03168152602001826001600160a01b03168152602001935050505060806040518083038186803b1580156108d557600080fd5b505afa1580156108e9573d6000803e3d6000fd5b505050506040513d60808110156108ff57600080fd5b508051602082015160409092015190945090925090506000600f84900b13801561092c5750600082600f0b135b15610a985761ffff81166109715760405162461bcd60e51b81526004018080602001828103825260258152602001806113f26025913960400191505060405180910390fd5b6000199283019291909101908a61ffff821660011415610a2357610a1c6001826001600160a01b0316635e0d443f87878e6040518463ffffffff1660e01b81526004018084600f0b815260200183600f0b8152602001828152602001935050505060206040518083038186803b1580156109ea57600080fd5b505afa1580156109fe573d6000803e3d6000fd5b505050506040513d6020811015610a1457600080fd5b505190611311565b9650610a92565b8161ffff1660021415610a9257610a8f6001826001600160a01b03166307211ef787878e6040518463ffffffff1660e01b81526004018084600f0b815260200183600f0b8152602001828152602001935050505060206040518083038186803b1580156109ea57600080fd5b96505b50610ae5565b6040805162461bcd60e51b815260206004820181905260248201527f414d4d51756f7465723a20556e737570706f72746564206d616b657241646472604482015290519081900360640190fd5b50505050505b95945050505050565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6000806001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d1480610b6e57506001600160a01b03861673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f145b15610e6b5760408051600280825260608083018452899390929190602083019080368337019050509050610ba1876112d7565b15610c27577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600081518110610bd457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110610c0257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610cee565b610c30866112d7565b15610c91578681600081518110610c4357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110610c0257fe5b8681600081518110610c9f57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110610ccd57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b604080517f1f00ca7400000000000000000000000000000000000000000000000000000000815260048101878152602482019283528351604483015283516060936001600160a01b03871693631f00ca74938b9388939192606401906020808601910280838360005b83811015610d6f578181015183820152602001610d57565b50505050905001935050505060006040518083038186803b158015610d9357600080fd5b505afa158015610da7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610dd057600080fd5b8101908080516040519392919084640100000000821115610df057600080fd5b908301906020820185811115610e0557600080fd5b8251866020820283011164010000000082111715610e2257600080fd5b82525081516020918201928201910280838360005b83811015610e4f578181015183820152602001610e37565b505050509050016040525050509050806000815181106107d557fe5b6000610e76866112d7565b610e805785610e96565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b90506000610ea3866112d7565b610ead5785610ec3565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b90506000806000807f0000000000000000000000006d9cc14a1d36e6ff13fc6efa9e9326fcd12e79036001600160a01b0316638ab4a8cc8d88886040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b03168152602001826001600160a01b03168152602001935050505060806040518083038186803b158015610f5a57600080fd5b505afa158015610f6e573d6000803e3d6000fd5b505050506040513d6080811015610f8457600080fd5b50805160208201516040830151606090930151919650945090925090506000600f85900b138015610fb85750600083600f0b135b15610a985761ffff8216610ffd5760405162461bcd60e51b81526004018080602001828103825260258152602001806113f26025913960400191505060405180910390fd5b6000199384019392909201918b8115611175578261ffff16600114156110c257604080517f67df02ca000000000000000000000000000000000000000000000000000000008152600f87810b600483015286900b6024820152604481018c905290516001600160a01b038316916367df02ca916064808301926020929190829003018186803b15801561108f57600080fd5b505afa1580156110a3573d6000803e3d6000fd5b505050506040513d60208110156110b957600080fd5b50519750611170565b8261ffff166002141561117057604080517f0e71d1b9000000000000000000000000000000000000000000000000000000008152600f87810b600483015286900b6024820152604481018c905290516001600160a01b03831691630e71d1b9916064808301926020929190829003018186803b15801561114157600080fd5b505afa158015611155573d6000803e3d6000fd5b505050506040513d602081101561116b57600080fd5b505197505b6112a2565b8261ffff16600114156111f457604080517f5e0d443f000000000000000000000000000000000000000000000000000000008152600f86810b600483015287900b6024820152604481018c905290516001600160a01b03831691635e0d443f916064808301926020929190829003018186803b15801561114157600080fd5b8261ffff16600214156112a257604080517f07211ef7000000000000000000000000000000000000000000000000000000008152600f86810b600483015287900b6024820152604481018c905290516001600160a01b038316916307211ef7916064808301926020929190829003018186803b15801561127357600080fd5b505afa158015611287573d6000803e3d6000fd5b505050506040513d602081101561129d57600080fd5b505197505b505050505050509050949350505050565b7f0000000000000000000000006d9cc14a1d36e6ff13fc6efa9e9326fcd12e790381565b60006001600160a01b038216158061130b57506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b92915050565b600061135383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061135a565b9392505050565b600081848411156113e95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156113ae578181015183820152602001611396565b50505050905090810190601f1680156113db5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe414d4d51756f7465723a2073776170206d6574686f64206e6f742072656769737465726564a26469706673582212206e2b5e4d39bf411a6e84859d1bf83ff8174174f698266ecc92359775a302162464736f6c634300060c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000006d9cc14a1d36e6ff13fc6efa9e9326fcd12e7903000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

-----Decoded View---------------
Arg [0] : _permStorage (address): 0x6D9Cc14a1d36E6fF13fc6efA9e9326FcD12E7903
Arg [1] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006d9cc14a1d36e6ff13fc6efa9e9326fcd12e7903
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.