StandaloneV4Swap

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": {
    "EPICswap/selldemo.sol": {
      "content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.24;\r
\r
/// @title 完全独立的 Uniswap V4 Swap 合约\r
/// @notice 不依赖任何外部库,所有接口都在内部定义\r
contract StandaloneV4Swap {\r
\r
    // ═══════════════════════════════════════════════════════════════════\r
    // 常量\r
    // ═══════════════════════════════════════════════════════════════════\r
\r
    address public constant UNIVERSAL_ROUTER = 0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af;\r
    address public constant TOKEN = 0x94314a14Df63779c99C0764a30e0CD22fA78fC0E;\r
\r
    // Commands\r
    uint8 constant V4_SWAP = 0x10;\r
\r
    // Actions\r
    uint8 constant SWAP_EXACT_IN_SINGLE = 0x06;\r
    uint8 constant SETTLE_ALL = 0x0c;\r
    uint8 constant TAKE_ALL = 0x0f;\r
\r
    // ═══════════════════════════════════════════════════════════════════\r
    // 事件\r
    // ═══════════════════════════════════════════════════════════════════\r
\r
    event SwapExecuted(address indexed user, uint256 amountIn, uint256 amountOut);\r
\r
    // ═══════════════════════════════════════════════════════════════════\r
    // 主函数\r
    // ═══════════════════════════════════════════════════════════════════\r
\r
    /// @notice 卖出 token 换取 ETH\r
    /// @param amountIn 卖出的 token 数量\r
    /// @param minAmountOut 最少获得的 ETH 数量\r
    function sellToken(uint128 amountIn, uint128 minAmountOut) external returns (uint256 amountOut) {\r
\r
        // 1️⃣ 从用户转入 token\r
        _transferFrom(TOKEN, msg.sender, address(this), amountIn);\r
\r
        // 2️⃣ 授权给 Universal Router\r
        _approve(TOKEN, UNIVERSAL_ROUTER, amountIn);\r
\r
        // 3️⃣ 记录交换前的 ETH 余额\r
        uint256 ethBefore = address(this).balance;\r
\r
        // 4️⃣ 构造 calldata\r
        bytes memory callData = _buildSwapCalldata(amountIn, minAmountOut);\r
\r
        // 5️⃣ 调用 Universal Router\r
        (bool success, ) = UNIVERSAL_ROUTER.call(callData);\r
        require(success, "Swap failed");\r
\r
        // 6️⃣ 计算获得的 ETH\r
        amountOut = address(this).balance - ethBefore;\r
        require(amountOut >= minAmountOut, "Insufficient output");\r
\r
        // 7️⃣ 将 ETH 发送给用户\r
        (bool sent, ) = msg.sender.call{value: amountOut}("");\r
        require(sent, "ETH transfer failed");\r
\r
        emit SwapExecuted(msg.sender, amountIn, amountOut);\r
\r
        return amountOut;\r
    }\r
\r
    // ═══════════════════════════════════════════════════════════════════\r
    // 内部函数:构造 swap calldata\r
    // ═══════════════════════════════════════════════════════════════════\r
\r
    function _buildSwapCalldata(uint128 amountIn, uint128 minAmountOut) internal pure returns (bytes memory) {\r
\r
        // Commands\r
        bytes memory commands = abi.encodePacked(V4_SWAP);\r
\r
        // Actions\r
        bytes memory actions = abi.encodePacked(\r
            SWAP_EXACT_IN_SINGLE,\r
            SETTLE_ALL,\r
            TAKE_ALL\r
        );\r
\r
        // PoolKey 结构: (currency0, currency1, fee, tickSpacing, hooks)\r
        bytes memory poolKey = abi.encode(\r
            address(0),        // currency0 (ETH)\r
            TOKEN,             // currency1 (Token)\r
            uint24(3000),      // fee (0.3%)\r
            int24(60),         // tickSpacing\r
            address(0)         // hooks\r
        );\r
\r
        // ExactInputSingleParams 结构: (poolKey, zeroForOne, amountIn, amountOutMinimum, hookData)\r
        bytes memory swapParams = abi.encode(\r
            poolKey,           // poolKey\r
            false,             // zeroForOne (token -> ETH)\r
            amountIn,          // amountIn\r
            minAmountOut,      // amountOutMinimum\r
            bytes("")          // hookData\r
        );\r
\r
        // 三个参数\r
        bytes[] memory params = new bytes[](3);\r
        params[0] = swapParams;                              // SWAP_EXACT_IN_SINGLE 参数\r
        params[1] = abi.encode(TOKEN, amountIn);             // SETTLE_ALL 参数\r
        params[2] = abi.encode(address(0), minAmountOut);    // TAKE_ALL 参数\r
\r
        // inputs[0] = encode(actions, params)\r
        bytes[] memory inputs = new bytes[](1);\r
        inputs[0] = abi.encode(actions, params);\r
\r
        // execute(bytes commands, bytes[] inputs, uint256 deadline)\r
\r
        return abi.encodeWithSignature(\r
            "execute(bytes,bytes[],uint256)",\r
            commands,\r
            inputs\r
        );\r
    }\r
\r
    // ═══════════════════════════════════════════════════════════════════\r
    // 内部函数:ERC20 操作\r
    // ═══════════════════════════════════════════════════════════════════\r
\r
    function _transferFrom(address token, address from, address to, uint256 amount) internal {\r
        (bool success, bytes memory data) = token.call(\r
            abi.encodeWithSignature("transferFrom(address,address,uint256)", from, to, amount)\r
        );\r
        require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferFrom failed");\r
    }\r
\r
    function _approve(address token, address spender, uint256 amount) internal {\r
        (bool success, bytes memory data) = token.call(\r
            abi.encodeWithSignature("approve(address,uint256)", spender, amount)\r
        );\r
        require(success && (data.length == 0 || abi.decode(data, (bool))), "Approve failed");\r
    }\r
\r
    // ═══════════════════════════════════════════════════════════════════\r
    // 接收 ETH\r
    // ═══════════════════════════════════════════════════════════════════\r
\r
    receive() external payable {}\r
}\r
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
DeFi, Swap, Factory|addr:0xd134e5246b40230ae78fc8202f09bb52798df5ee|verified:true|block:23676853|tx:0x567a545b7d7dec208e0e4e65b6b7371044cdd21c0486539b216b2a131c7c3f62|first_check:1761669405

Submitted on: 2025-10-28 17:36:47

Comments

Log in to comment.

No comments yet.