V2ArbExecutor

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/V2ArbExecutor.sol": {
      "content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.26;\r
\r
interface IRouterV2 {\r
    function swapExactTokensForTokens(\r
        uint amountIn,\r
        uint amountOutMin,\r
        address[] memory path,\r
        address to,\r
        uint deadline\r
    ) external returns (uint[] memory amounts);\r
}\r
\r
interface IERC20 {\r
    function balanceOf(address) external view returns (uint);\r
    function allowance(address owner, address spender) external view returns (uint);\r
    function approve(address spender, uint value) external returns (bool);\r
    function transferFrom(address from, address to, uint value) external returns (bool);\r
    function transfer(address to, uint value) external returns (bool);\r
}\r
\r
contract V2ArbExecutor {\r
    function _maxApprove(IERC20 t, address s, uint need) internal {\r
        if (t.allowance(address(this), s) < need) {\r
            require(t.approve(s, type(uint).max), "approve fail");\r
        }\r
    }\r
\r
    // Собираем динамический массив из двух адресов (удобно и надёжно)\r
    function _mk2(address a, address b) internal pure returns (address[] memory p) {\r
        p = new address[](2);  // Fix: Explicitly set array length\r
        p[0] = a;\r
        p[1] = b;\r
    }\r
\r
    /// @notice Два V2-свопа в одном tx: buy на дешёвом, затем sell на дорогом\r
    /// @dev Перед вызовом владелец должен approve'ить ЭТОТ контракт на tokenIn на сумму amountIn\r
    function executeV2Cross(\r
        address routerBuy,\r
        address routerSell,\r
        address tokenIn,\r
        address tokenOut,\r
        uint    amountIn,\r
        uint    minOutBuy,\r
        uint    minFinalTokenIn,\r
        uint    deadline\r
    ) external returns (uint finalAmountIn)\r
    {\r
        IERC20 tin = IERC20(tokenIn);\r
        IERC20 tout = IERC20(tokenOut);\r
\r
        // 0) Забираем входные токены у владельца\r
        require(tin.transferFrom(msg.sender, address(this), amountIn), "transferFrom fail");\r
\r
        // 1) BUY: tokenIn -> tokenOut на дешёвом роутере\r
        _maxApprove(tin, routerBuy, amountIn);\r
        address[] memory path1 = _mk2(tokenIn, tokenOut);\r
        IRouterV2(routerBuy).swapExactTokensForTokens(\r
            amountIn,\r
            minOutBuy,\r
            path1,\r
            address(this),\r
            deadline\r
        );\r
\r
        // Сколько tokenOut получили\r
        uint mid = tout.balanceOf(address(this));\r
\r
        // 2) SELL: tokenOut -> tokenIn на дорогом роутере\r
        _maxApprove(tout, routerSell, mid);\r
        address[] memory path2 = _mk2(tokenOut, tokenIn);\r
        IRouterV2(routerSell).swapExactTokensForTokens(\r
            mid,\r
            minFinalTokenIn,\r
            path2,\r
            address(this),\r
            deadline\r
        );\r
\r
        // 3) Возвращаем всё владельцу, гарантируем минимум tokenIn\r
        finalAmountIn = tin.balanceOf(address(this));\r
        require(finalAmountIn >= minFinalTokenIn, "minFinal");\r
        require(tin.transfer(msg.sender, finalAmountIn), "transfer back");\r
    }\r
}\r
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
ERC20, DeFi, Swap, Factory|addr:0xdfef4331d3b71a8323f9d02c859aaaaa95625803|verified:true|block:23745150|tx:0x743b4668f21cfda169caf4b4422182c54e6a335d94fc6cdf5a71d02281f2ec7d|first_check:1762514746

Submitted on: 2025-11-07 12:25:47

Comments

Log in to comment.

No comments yet.