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": []
}
}}
Submitted on: 2025-10-28 17:36:47
Comments
Log in to comment.
No comments yet.