Contract 0xb82b43c4c0abf41dfc342571c330964ff576a9b3

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0c73eb451a546217bd663a866387fa7d98074d36918c5922d8a080cb13fee8f60x60806040187956542022-07-28 15:59:54187 days 3 hrs ago0x8f8c780dbc3ef64e86352a1198b58f98c8fa51a6 IN  Create: CurveWrapperV30 ETH0.003169642163 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x98c26a1845c6ed4c5758e1e4987889fb8430cf34e5aa0c127197dbaaafcd920c549144052023-01-23 12:41:388 days 6 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0x4c2af2df2a7e567b5155879720619ea06c5bb15d0 ETH
0x98c26a1845c6ed4c5758e1e4987889fb8430cf34e5aa0c127197dbaaafcd920c549144052023-01-23 12:41:388 days 6 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0x98c26a1845c6ed4c5758e1e4987889fb8430cf34e5aa0c127197dbaaafcd920c549144052023-01-23 12:41:388 days 6 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0x98c26a1845c6ed4c5758e1e4987889fb8430cf34e5aa0c127197dbaaafcd920c549144052023-01-23 12:41:388 days 6 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0x0000000022d53366457f9d5e68ec105046fc43830 ETH
0x98c26a1845c6ed4c5758e1e4987889fb8430cf34e5aa0c127197dbaaafcd920c549144052023-01-23 12:41:388 days 6 hrs ago 0x952569d5a579f0205dab398c291b4a35236a7ddd 0xb82b43c4c0abf41dfc342571c330964ff576a9b30 ETH
0xd4c4de7b52e1128a3cda35d66b4ceffbbdc4adf65e3689fa491557093d038c4a549042302023-01-23 11:39:288 days 7 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0x4c2af2df2a7e567b5155879720619ea06c5bb15d0 ETH
0xd4c4de7b52e1128a3cda35d66b4ceffbbdc4adf65e3689fa491557093d038c4a549042302023-01-23 11:39:288 days 7 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0xd4c4de7b52e1128a3cda35d66b4ceffbbdc4adf65e3689fa491557093d038c4a549042302023-01-23 11:39:288 days 7 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0xd4c4de7b52e1128a3cda35d66b4ceffbbdc4adf65e3689fa491557093d038c4a549042302023-01-23 11:39:288 days 7 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0x0000000022d53366457f9d5e68ec105046fc43830 ETH
0xd4c4de7b52e1128a3cda35d66b4ceffbbdc4adf65e3689fa491557093d038c4a549042302023-01-23 11:39:288 days 7 hrs ago 0xad38df1c34b5e0e57de2cbb4e48c7588d4f6548d 0xb82b43c4c0abf41dfc342571c330964ff576a9b30 ETH
0x139306de8523d1562eaf3878ea20b4ee627228063c9e2987f4a2fb282894387e547221792023-01-22 13:50:519 days 5 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0x4c2af2df2a7e567b5155879720619ea06c5bb15d0 ETH
0x139306de8523d1562eaf3878ea20b4ee627228063c9e2987f4a2fb282894387e547221792023-01-22 13:50:519 days 5 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b30x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f0 ETH
0x139306de8523d1562eaf3878ea20b4ee627228063c9e2987f4a2fb282894387e547221792023-01-22 13:50:519 days 5 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b30x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f0 ETH
0x139306de8523d1562eaf3878ea20b4ee627228063c9e2987f4a2fb282894387e547221792023-01-22 13:50:519 days 5 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0x0000000022d53366457f9d5e68ec105046fc43830 ETH
0x139306de8523d1562eaf3878ea20b4ee627228063c9e2987f4a2fb282894387e547221792023-01-22 13:50:519 days 5 hrs ago 0xf129c6e535952c6018617d5dd4b80609d7fc4a95 0xb82b43c4c0abf41dfc342571c330964ff576a9b30 ETH
0x5666b67a1a2760784267212cc94295f402f6de3696d78b5fc414f11c0f943404547174602023-01-22 13:20:159 days 6 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0x4c2af2df2a7e567b5155879720619ea06c5bb15d0 ETH
0x5666b67a1a2760784267212cc94295f402f6de3696d78b5fc414f11c0f943404547174602023-01-22 13:20:159 days 6 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0x5666b67a1a2760784267212cc94295f402f6de3696d78b5fc414f11c0f943404547174602023-01-22 13:20:159 days 6 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0x5666b67a1a2760784267212cc94295f402f6de3696d78b5fc414f11c0f943404547174602023-01-22 13:20:159 days 6 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0x0000000022d53366457f9d5e68ec105046fc43830 ETH
0x5666b67a1a2760784267212cc94295f402f6de3696d78b5fc414f11c0f943404547174602023-01-22 13:20:159 days 6 hrs ago 0xcd72262f0fd56712a64d5e29aa2707efcb6f5cbe 0xb82b43c4c0abf41dfc342571c330964ff576a9b30 ETH
0xefca49b2b7387904b5fa9176ae950b108d0ec7ff03187319d8d1d0cf8a862a73547078362023-01-22 12:24:229 days 7 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0x4c2af2df2a7e567b5155879720619ea06c5bb15d0 ETH
0xefca49b2b7387904b5fa9176ae950b108d0ec7ff03187319d8d1d0cf8a862a73547078362023-01-22 12:24:229 days 7 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0xefca49b2b7387904b5fa9176ae950b108d0ec7ff03187319d8d1d0cf8a862a73547078362023-01-22 12:24:229 days 7 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0xefca49b2b7387904b5fa9176ae950b108d0ec7ff03187319d8d1d0cf8a862a73547078362023-01-22 12:24:229 days 7 hrs ago 0xb82b43c4c0abf41dfc342571c330964ff576a9b3 0x0000000022d53366457f9d5e68ec105046fc43830 ETH
0xefca49b2b7387904b5fa9176ae950b108d0ec7ff03187319d8d1d0cf8a862a73547078362023-01-22 12:24:229 days 7 hrs ago 0xb2fdafee263409bc0b6e14ee016f7ce6f35c04ae 0xb82b43c4c0abf41dfc342571c330964ff576a9b30 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CurveWrapperV3

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2022-07-28
*/

// SPDX-License-Identifier: MIT

pragma solidity =0.8.10;





interface IExchangeV3 {
    function sell(address _srcAddr, address _destAddr, uint _srcAmount, bytes memory _additionalData) external returns (uint);

    function buy(address _srcAddr, address _destAddr, uint _destAmount, bytes memory _additionalData) external returns(uint);

    function getSellRate(address _srcAddr, address _destAddr, uint _srcAmount, bytes memory _additionalData) external returns (uint);

    function getBuyRate(address _srcAddr, address _destAddr, uint _srcAmount, bytes memory _additionalData) external returns (uint);
}




interface ISwaps {

    ///@notice Perform an exchange using the pool that offers the best rate
    ///@dev Prior to calling this function, the caller must approve
    ///        this contract to transfer `_amount` coins from `_from`
    ///        Does NOT check rates in factory-deployed pools
    ///@param _from Address of coin being sent
    ///@param _to Address of coin being received
    ///@param _amount Quantity of `_from` being sent
    ///@param _expected Minimum quantity of `_from` received
    ///        in order for the transaction to succeed
    ///@param _receiver Address to transfer the received tokens to
    ///@return uint256 Amount received
    function exchange_with_best_rate(
        address _from,
        address _to,
        uint256 _amount,
        uint256 _expected,
        address _receiver
    ) external payable returns (uint256);


    ///@notice Perform an exchange using a specific pool
    ///@dev Prior to calling this function, the caller must approve
    ///        this contract to transfer `_amount` coins from `_from`
    ///        Works for both regular and factory-deployed pools
    ///@param _pool Address of the pool to use for the swap
    ///@param _from Address of coin being sent
    ///@param _to Address of coin being received
    ///@param _amount Quantity of `_from` being sent
    ///@param _expected Minimum quantity of `_from` received
    ///        in order for the transaction to succeed
    ///@param _receiver Address to transfer the received tokens to
    ///@return uint256 Amount received
    function exchange(
        address _pool,
        address _from,
        address _to,
        uint256 _amount,
        uint256 _expected,
        address _receiver
    ) external payable returns (uint256);



    ///@notice Find the pool offering the best rate for a given swap.
    ///@dev Checks rates for regular and factory pools
    ///@param _from Address of coin being sent
    ///@param _to Address of coin being received
    ///@param _amount Quantity of `_from` being sent
    ///@param _exclude_pools A list of up to 8 addresses which shouldn't be returned
    ///@return Pool address, amount received
    function get_best_rate(
        address _from,
        address _to,
        uint256 _amount,
        address[8] memory _exclude_pools
    ) external view returns (address, uint256);


    ///@notice Get the current number of coins received in an exchange
    ///@dev Works for both regular and factory-deployed pools
    ///@param _pool Pool address
    ///@param _from Address of coin to be sent
    ///@param _to Address of coin to be received
    ///@param _amount Quantity of `_from` to be sent
    ///@return Quantity of `_to` to be received
    function get_exchange_amount(
        address _pool,
        address _from,
        address _to,
        uint256 _amount
    ) external view returns (uint256);


    ///@notice Get the current number of coins required to receive the given amount in an exchange
    ///@param _pool Pool address
    ///@param _from Address of coin to be sent
    ///@param _to Address of coin to be received
    ///@param _amount Quantity of `_to` to be received
    ///@return Quantity of `_from` to be sent
    function get_input_amount(
        address _pool,
        address _from,
        address _to,
        uint256 _amount
    ) external view returns (uint256);


    ///@notice Get the current number of coins required to receive the given amount in an exchange
    ///@param _pool Pool address
    ///@param _from Address of coin to be sent
    ///@param _to Address of coin to be received
    ///@param _amounts Quantity of `_to` to be received
    ///@return Quantity of `_from` to be sent
    function get_exchange_amounts(
        address _pool,
        address _from,
        address _to,
        uint256[] memory _amounts
    ) external view returns (uint256[] memory);


    ///@notice Set calculator contract
    ///@dev Used to calculate `get_dy` for a pool
    ///@param _pool Pool address
    ///@return `CurveCalc` address
    function get_calculator(address _pool) external view returns (address);


    /// @notice Perform up to four swaps in a single transaction
    /// @dev Routing and swap params must be determined off-chain. This
    ///     functionality is designed for gas efficiency over ease-of-use.
    /// @param _route Array of [initial token, pool, token, pool, token, ...]
    ///     The array is iterated until a pool address of 0x00, then the last
    ///     given token is transferred to `_receiver`
    /// @param _swap_params Multidimensional array of [i, j, swap type] where i and j are the correct
    ///     values for the n'th pool in `_route`. The swap type should be 1 for
    ///     a stableswap `exchange`, 2 for stableswap `exchange_underlying`, 3
    ///     for a cryptoswap `exchange`, 4 for a cryptoswap `exchange_underlying`,
    ///     5 for Polygon factory metapools `exchange_underlying`, 6-8 for
    ///     underlying coin -> LP token "exchange" (actually `add_liquidity`), 9 and 10
    ///     for LP token -> underlying coin "exchange" (actually `remove_liquidity_one_coin`)
    /// @param _amount The amount of `_route[0]` token being sent.
    /// @param _expected The minimum amount received after the final swap.
    /// @param _pools Array of pools for swaps via zap contracts. This parameter is only needed for
    ///     Polygon meta-factories underlying swaps.
    /// @param _receiver Address to transfer the final output token to.
    /// @return Received amount of the final output token
    function exchange_multiple(
        address[9] memory _route,
        uint256[3][4] memory _swap_params,
        uint256 _amount,
        uint256 _expected,
        address[4] memory _pools,
        address _receiver
    ) external payable returns (uint256);

    function exchange_multiple(
        address[9] memory _route,
        uint256[3][4] memory _swap_params,
        uint256 _amount,
        uint256 _expected
    ) external payable returns (uint256);

    function get_exchange_multiple_amount(
        address[9] memory _route,
        uint256[3][4] memory _swap_params,
        uint256 _amount
    ) external view returns (uint256);
}




interface IAddressProvider {
    function admin() external view returns (address);
    function get_registry() external view returns (address);
    function get_address(uint256 _id) external view returns (address);
}





interface IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint256 digits);
    function totalSupply() external view returns (uint256 supply);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transfer(address _to, uint256 _value) external returns (bool success);

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function approve(address _spender, uint256 _value) external returns (bool success);

    function allowance(address _owner, address _spender) external view returns (uint256 remaining);

    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}




contract DSMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x + y;
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x - y;
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x * y;
    }

    function div(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x / y;
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x <= y ? x : y;
    }

    function max(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x >= y ? x : y;
    }

    function imin(int256 x, int256 y) internal pure returns (int256 z) {
        return x <= y ? x : y;
    }

    function imax(int256 x, int256 y) internal pure returns (int256 z) {
        return x >= y ? x : y;
    }

    uint256 constant WAD = 10**18;
    uint256 constant RAY = 10**27;

    function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }

    function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), RAY / 2) / RAY;
    }

    function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, WAD), y / 2) / y;
    }

    function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, RAY), y / 2) / y;
    }

    // This famous algorithm is called "exponentiation by squaring"
    // and calculates x^n with x as fixed-point and n as regular unsigned.
    //
    // It's O(log n), instead of O(n) for naive repeated multiplication.
    //
    // These facts are why it works:
    //
    //  If n is even, then x^n = (x^2)^(n/2).
    //  If n is odd,  then x^n = x * x^(n-1),
    //   and applying the equation for even x gives
    //    x^n = x * (x^2)^((n-1) / 2).
    //
    //  Also, EVM division is flooring and
    //    floor[(n-1) / 2] = floor[n / 2].
    //
    function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }
}





abstract contract IDFSRegistry {
 
    function getAddr(bytes4 _id) public view virtual returns (address);

    function addNewContract(
        bytes32 _id,
        address _contractAddr,
        uint256 _waitPeriod
    ) public virtual;

    function startContractChange(bytes32 _id, address _newContractAddr) public virtual;

    function approveContractChange(bytes32 _id) public virtual;

    function cancelContractChange(bytes32 _id) public virtual;

    function changeWaitPeriod(bytes32 _id, uint256 _newWaitPeriod) public virtual;
}





library Address {
    //insufficient balance
    error InsufficientBalance(uint256 available, uint256 required);
    //unable to send value, recipient may have reverted
    error SendingValueFail();
    //insufficient balance for call
    error InsufficientBalanceForCall(uint256 available, uint256 required);
    //call to non-contract
    error NonContractCall();
    
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        uint256 balance = address(this).balance;
        if (balance < amount){
            revert InsufficientBalance(balance, amount);
        }

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        if (!(success)){
            revert SendingValueFail();
        }
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        uint256 balance = address(this).balance;
        if (balance < value){
            revert InsufficientBalanceForCall(balance, value);
        }
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        if (!(isContract(target))){
            revert NonContractCall();
        }

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}




library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    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;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by 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;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}







library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /// @dev Edited so it always first approves 0 and then the value, because of non standard tokens
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, newAllowance)
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(
            value,
            "SafeERC20: decreased allowance below zero"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, newAllowance)
        );
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}





contract ArbitrumAuthAddresses {
    address internal constant ADMIN_VAULT_ADDR = 0xd47D8D97cAd12A866900eEc6Cde1962529F25351;
    address internal constant FACTORY_ADDRESS = 0x5261abC3a94a6475D0A1171daE94A5f84fbaEcD2;
    address internal constant ADMIN_ADDR = 0x6AFEA85cFAB61e3a55Ad2e4537252Ec05796BEfa;
}





contract AuthHelper is ArbitrumAuthAddresses {
}





contract AdminVault is AuthHelper {
    address public owner;
    address public admin;

    error SenderNotAdmin();

    constructor() {
        owner = msg.sender;
        admin = ADMIN_ADDR;
    }

    /// @notice Admin is able to change owner
    /// @param _owner Address of new owner
    function changeOwner(address _owner) public {
        if (admin != msg.sender){
            revert SenderNotAdmin();
        }
        owner = _owner;
    }

    /// @notice Admin is able to set new admin
    /// @param _admin Address of multisig that becomes new admin
    function changeAdmin(address _admin) public {
        if (admin != msg.sender){
            revert SenderNotAdmin();
        }
        admin = _admin;
    }

}








contract AdminAuth is AuthHelper {
    using SafeERC20 for IERC20;

    AdminVault public constant adminVault = AdminVault(ADMIN_VAULT_ADDR);

    error SenderNotOwner();
    error SenderNotAdmin();

    modifier onlyOwner() {
        if (adminVault.owner() != msg.sender){
            revert SenderNotOwner();
        }
        _;
    }

    modifier onlyAdmin() {
        if (adminVault.admin() != msg.sender){
            revert SenderNotAdmin();
        }
        _;
    }

    /// @notice withdraw stuck funds
    function withdrawStuckFunds(address _token, address _receiver, uint256 _amount) public onlyOwner {
        if (_token == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) {
            payable(_receiver).transfer(_amount);
        } else {
            IERC20(_token).safeTransfer(_receiver, _amount);
        }
    }

    /// @notice Destroy the contract
    function kill() public onlyAdmin {
        selfdestruct(payable(msg.sender));
    }
}





contract ArbitrumWrapperAddresses {

    address internal constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    address payable internal constant WALLET_ID = payable(0x322d58b9E75a6918f7e7849AEe0fF09369977e08);
    address internal constant UNI_V3_ROUTER = 0xE592427A0AEce92De3Edee1F18E0157C05861564;
    address internal constant UNI_V3_QUOTER = 0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6;

    address internal constant CURVE_ADDRESS_PROVIDER = 0x0000000022D53366457F9d5E68Ec105046FC4383;

    // Deprecated on L2
    address internal constant KYBER_INTERFACE = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    address internal constant UNI_V2_ROUTER = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
}





contract WrapperHelper is ArbitrumWrapperAddresses {
}











contract CurveWrapperV3 is DSMath, IExchangeV3, AdminAuth, WrapperHelper {
    using SafeERC20 for IERC20;

    IAddressProvider addressProvider = IAddressProvider(CURVE_ADDRESS_PROVIDER);

    /// @notice Sells _srcAmount of tokens on Curve
    /// @param _srcAddr From token
    /// @param _srcAmount From amount
    /// @param _additionalData Route and swap params
    /// @return uint256 amount of tokens received from selling
    function sell(address _srcAddr, address, uint256 _srcAmount, bytes calldata _additionalData) external override returns (uint) {    
        ISwaps exchangeContract = ISwaps(
                addressProvider.get_address(2)
        );
        IERC20(_srcAddr).safeApprove(address(exchangeContract), _srcAmount);

        (
            address[9] memory _route, uint256[3][4] memory _swap_params
        ) = abi.decode(_additionalData, (address[9], uint256[3][4]));

        address[4] memory pools;
        uint256 amountOut = exchangeContract.exchange_multiple(
            _route,
            _swap_params,
            _srcAmount,
            1,   // _expected
            pools,
            msg.sender
        );

        return amountOut;
    }

    /// @dev deprecated function
    function buy(address, address, uint, bytes calldata) external override returns(uint) {
        return 0;
    }

    /// @notice Return a rate for which we can sell an amount of tokens
    /// @param _srcAmount From amount
    /// @param _additionalData Route and swap params
    /// @return uint256 Rate (price)
    function getSellRate(address, address, uint256 _srcAmount, bytes memory _additionalData) public override returns (uint) {
        ISwaps exchangeContract = ISwaps(
                addressProvider.get_address(2)
        );
        (
            address[9] memory _route, uint256[3][4] memory _swap_params
        ) = abi.decode(_additionalData, (address[9], uint256[3][4]));

        uint256 amountOut = exchangeContract.get_exchange_multiple_amount(
            _route,
            _swap_params,
            _srcAmount
        );
        return wdiv(amountOut, _srcAmount);
    }

    /// @dev deprecated function
    function getBuyRate(address, address, uint, bytes memory) public override returns (uint) {
        return 0;
    }

    // solhint-disable-next-line no-empty-blocks
    receive() external payable {}
}

Contract ABI

[{"inputs":[],"name":"NonContractCall","type":"error"},{"inputs":[],"name":"SenderNotAdmin","type":"error"},{"inputs":[],"name":"SenderNotOwner","type":"error"},{"inputs":[],"name":"adminVault","outputs":[{"internalType":"contract AdminVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"buy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"getBuyRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"internalType":"bytes","name":"_additionalData","type":"bytes"}],"name":"getSellRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_srcAddr","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"internalType":"bytes","name":"_additionalData","type":"bytes"}],"name":"sell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600080546001600160a01b0319166f22d53366457f9d5e68ec105046fc438317905534801561003257600080fd5b5061132c806100426000396000f3fe6080604052600436106100745760003560e01c806354123c121161004e57806354123c12146100f05780635b6f36fc146101105780638cedca7114610130578063c579d4901461017d57600080fd5b80633924db661461008057806341c0e1b5146100b957806349d66644146100d057600080fd5b3661007b57005b600080fd5b34801561008c57600080fd5b506100a661009b366004610b54565b600095945050505050565b6040519081526020015b60405180910390f35b3480156100c557600080fd5b506100ce61019d565b005b3480156100dc57600080fd5b506100a66100eb366004610ce1565b610287565b3480156100fc57600080fd5b506100a661010b366004610ce1565b610292565b34801561011c57600080fd5b506100a661012b366004610b54565b6103dc565b34801561013c57600080fd5b5061015873d47d8d97cad12a866900eec6cde1962529f2535181565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b0565b34801561018957600080fd5b506100ce610198366004610dc3565b610560565b3373ffffffffffffffffffffffffffffffffffffffff1673d47d8d97cad12a866900eec6cde1962529f2535173ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610213573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102379190610e04565b73ffffffffffffffffffffffffffffffffffffffff1614610284576040517fa6c827a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33ff5b60005b949350505050565b600080546040517f493f4f7400000000000000000000000000000000000000000000000000000000815260026004820152829173ffffffffffffffffffffffffffffffffffffffff169063493f4f7490602401602060405180830381865afa158015610302573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103269190610e04565b90506000808480602001905181019061033f9190610e21565b9150915060008373ffffffffffffffffffffffffffffffffffffffff16637b3d22cf84848a6040518463ffffffff1660e01b815260040161038293929190610faf565b602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c39190610fdb565b90506103cf81886106e8565b9998505050505050505050565b600080546040517f493f4f7400000000000000000000000000000000000000000000000000000000815260026004820152829173ffffffffffffffffffffffffffffffffffffffff169063493f4f7490602401602060405180830381865afa15801561044c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104709190610e04565b905061049373ffffffffffffffffffffffffffffffffffffffff88168287610721565b6000806104a285870187610ff4565b915091506104ae610b11565b6040517f0651cb3500000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff861690630651cb359061050e90879087908e90600190899033906004016110e8565b6020604051808303816000875af115801561052d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105519190610fdb565b9b9a5050505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1673d47d8d97cad12a866900eec6cde1962529f2535173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fa9190610e04565b73ffffffffffffffffffffffffffffffffffffffff1614610647576040517f19494c8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff841614156106c25760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f193505050501580156106bc573d6000803e3d6000fd5b50505050565b6106e373ffffffffffffffffffffffffffffffffffffffff8416838361084b565b505050565b60008161071061070085670de0b6b3a76400006108a1565b61070b6002866111ab565b6108ad565b61071a91906111ab565b9392505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152600060448201526107f59084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526108b9565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526106e39084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401610773565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526106e39084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610773565b600061071a82846111e6565b600061071a8284611223565b600061091b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166109ca9092919063ffffffff16565b8051909150156106e35780806020019051810190610939919061123b565b6106e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b606061028a848460008560606109df85610ad8565b610a15576040517f304619b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610a3e9190611289565b60006040518083038185875af1925050503d8060008114610a7b576040519150601f19603f3d011682016040523d82523d6000602084013e610a80565b606091505b50915091508115610a9457915061028a9050565b805115610aa45780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c191906112a5565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061028a575050151592915050565b60405180608001604052806004906020820280368337509192915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610b5157600080fd5b50565b600080600080600060808688031215610b6c57600080fd5b8535610b7781610b2f565b94506020860135610b8781610b2f565b935060408601359250606086013567ffffffffffffffff80821115610bab57600080fd5b818801915088601f830112610bbf57600080fd5b813581811115610bce57600080fd5b896020828501011115610be057600080fd5b9699959850939650602001949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610120810167ffffffffffffffff81118282101715610c4657610c46610bf3565b60405290565b6040516080810167ffffffffffffffff81118282101715610c4657610c46610bf3565b6040516060810167ffffffffffffffff81118282101715610c4657610c46610bf3565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610cd957610cd9610bf3565b604052919050565b60008060008060808587031215610cf757600080fd5b8435610d0281610b2f565b9350602085810135610d1381610b2f565b935060408601359250606086013567ffffffffffffffff80821115610d3757600080fd5b818801915088601f830112610d4b57600080fd5b813581811115610d5d57610d5d610bf3565b610d8d847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610c92565b91508082528984828501011115610da357600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080600060608486031215610dd857600080fd5b8335610de381610b2f565b92506020840135610df381610b2f565b929592945050506040919091013590565b600060208284031215610e1657600080fd5b815161071a81610b2f565b6000806102a0808486031215610e3657600080fd5b601f8581860112610e4657600080fd5b610e4e610c22565b80610120870188811115610e6157600080fd5b875b81811015610e84578051610e7681610b2f565b845260209384019301610e63565b508196508861013f890112610e9857600080fd5b610ea0610c4c565b94880194925082915088851115610eb657600080fd5b84811015610f15578884820112610ecd5760008081fd5b610ed5610c6f565b80606083018b811115610ee85760008081fd5b835b81811015610f02578051845260209384019301610eea565b5050845250602090920191606001610eb6565b50809450505050509250929050565b8060005b60098110156106bc57815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101610f28565b806000805b6004811015610fa857825185835b6003811015610f8f578251825260209283019290910190600101610f70565b5050506060949094019360209290920191600101610f62565b5050505050565b6102c08101610fbe8286610f24565b610fcc610120830185610f5d565b826102a0830152949350505050565b600060208284031215610fed57600080fd5b5051919050565b6000806102a080848603121561100957600080fd5b601f858186011261101957600080fd5b611021610c22565b8061012087018881111561103457600080fd5b875b8181101561105757803561104981610b2f565b845260209384019301611036565b508196508861013f89011261106b57600080fd5b611073610c4c565b9488019492508291508885111561108957600080fd5b84811015610f155788848201126110a05760008081fd5b6110a8610c6f565b80606083018b8111156110bb5760008081fd5b835b818110156110d55780358452602093840193016110bd565b5050845250602090920191606001611089565b61038081016110f78289610f24565b611105610120830188610f5d565b856102a0830152846102c08301526102e082018460005b600481101561115157815173ffffffffffffffffffffffffffffffffffffffff1683526020928301929091019060010161111c565b50505073ffffffffffffffffffffffffffffffffffffffff8316610360830152979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000826111e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561121e5761121e61117c565b500290565b600082198211156112365761123661117c565b500190565b60006020828403121561124d57600080fd5b8151801515811461071a57600080fd5b60005b83811015611278578181015183820152602001611260565b838111156106bc5750506000910152565b6000825161129b81846020870161125d565b9190910192915050565b60208152600082518060208401526112c481604085016020870161125d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea26469706673582212209d32cba4c2731e3e06ac5c71805f1c1ccd049cfa9d41dada4cbdd41ec3f08ec164736f6c634300080a0033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.