UniversalArbitrage

Description:

Decentralized Finance (DeFi) protocol contract providing Swap, Factory functionality.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "contracts/Universal.sol": {
      "content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.19;\r
\r
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";\r
import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol";\r
\r
/// @title UniversalArbitrage - One contract, any token, any pool, forever\r
/// @author Your Wallet\r
/// @notice Deploy once. Call execute() with any USDC→Token→USDC path. No redeploy needed.\r
contract UniversalArbitrage {\r
    address public immutable OWNER;\r
    ISwapRouter public immutable router;\r
\r
    constructor(address _router) {\r
        OWNER = msg.sender;\r
        router = ISwapRouter(_router);\r
    }\r
\r
    modifier onlyOwner() {\r
        require(msg.sender == OWNER, "Not owner");\r
        _;\r
    }\r
\r
    /// @notice Execute a 2-hop arbitrage: tokenIn → intermediate → tokenIn\r
    /// @param tokenIn Starting token (e.g. USDC)\r
    /// @param intermediateToken Intermediate token (e.g. WETH)\r
    /// @param amountIn Amount of tokenIn to swap\r
    /// @param fee1 Fee tier for first swap (500 = 0.05%)\r
    /// @param fee2 Fee tier for second swap (100 = 0.01%)\r
    function execute(\r
        address tokenIn,\r
        address intermediateToken,\r
        uint256 amountIn,\r
        uint24 fee1,\r
        uint24 fee2\r
    ) external onlyOwner {\r
        IERC20(tokenIn).approve(address(router), amountIn);\r
\r
        // Step 1: tokenIn → intermediateToken\r
        router.exactInputSingle(\r
            ISwapRouter.ExactInputSingleParams({\r
                tokenIn: tokenIn,\r
                tokenOut: intermediateToken,\r
                fee: fee1,\r
                recipient: address(this),\r
                deadline: block.timestamp + 300,\r
                amountIn: amountIn,\r
                amountOutMinimum: 0,\r
                sqrtPriceLimitX96: 0\r
            })\r
        );\r
\r
        // Step 2: intermediateToken → tokenIn\r
        uint256 intermediateBal = IERC20(intermediateToken).balanceOf(address(this));\r
        IERC20(intermediateToken).approve(address(router), intermediateBal);\r
\r
        router.exactInputSingle(\r
            ISwapRouter.ExactInputSingleParams({\r
                tokenIn: intermediateToken,\r
                tokenOut: tokenIn,\r
                fee: fee2,\r
                recipient: OWNER,\r
                deadline: block.timestamp + 300,\r
                amountIn: intermediateBal,\r
                amountOutMinimum: 0,\r
                sqrtPriceLimitX96: 0\r
            })\r
        );\r
    }\r
\r
    /// @notice Emergency: Withdraw any stuck tokens\r
    /// @param token Token to rescue\r
    function rescue(IERC20 token) external onlyOwner {\r
        token.transfer(OWNER, token.balanceOf(address(this)));\r
    }\r
}"
    },
    "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol": {
      "content": "// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.7.5;
pragma abicoder v2;

import '@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol';

/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface ISwapRouter is IUniswapV3SwapCallback {
    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);

    struct ExactOutputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);

    struct ExactOutputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}
"
    },
    "@openzeppelin/contracts/token/ERC20/IERC20.sol": {
      "content": "// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)

pragma solidity >=0.4.16;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}
"
    },
    "@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol": {
      "content": "// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;

/// @title Callback for IUniswapV3PoolActions#swap
/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
interface IUniswapV3SwapCallback {
    /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
    /// @dev In the implementation you must pay the pool tokens owed for the swap.
    /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
    /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
    /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
    /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
    /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
    function uniswapV3SwapCallback(
        int256 amount0Delta,
        int256 amount1Delta,
        bytes calldata data
    ) external;
}
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
ERC20, DeFi, Swap, Factory|addr:0x8d02b54f95b8fdc1d5316a63aa6eb82be663401e|verified:true|block:23700232|tx:0xf3083a09ad96e4982fb561752108c4be45a37034951f25cadaa996183f50d8f6|first_check:1761989937

Submitted on: 2025-11-01 10:38:58

Comments

Log in to comment.

No comments yet.