// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
// Import Interfaces
interface IUniversalRouter {
function execute(
bytes calldata commands,
bytes[] calldata inputs,
uint256 deadline
) external payable;
}
interface IPermit2 {
function permit(
address owner,
address spender,
address token,
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
}
interface IERC20 {
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
}
contract TokenSwapper {
IUniversalRouter public universalRouter;
IPermit2 public permit2;
// Define Command Constants
bytes1 public constant V3_SWAP_EXACT_IN = 0x00;
// Events for tracking
event SwapExecuted(
address indexed user,
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 amountOutMin,
uint256 deadline
);
constructor(address _universalRouter, address _permit2) {
universalRouter = IUniversalRouter(_universalRouter);
permit2 = IPermit2(_permit2);
}
function swapExactInputWithPermit(
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 amountOutMin,
bytes calldata path,
uint256 deadline,
uint256 permitDeadline,
uint8 v,
bytes32 r,
bytes32 s
) external {
// Permit2 to approve UniversalRouter to spend Token A on behalf of the user
permit2.permit(
msg.sender, // owner
address(universalRouter), // spender
tokenIn, // token
amountIn, // amount
permitDeadline, // deadline
v, r, s // signature
);
// Construct the command and input data
bytes memory commands = abi.encodePacked(V3_SWAP_EXACT_IN);
// Input structure based on Dispatcher.sol:
// (address recipient, uint256 amountIn, uint256 amountOutMin, bool payerIsUser, bytes path)
bytes memory input = abi.encode(
msg.sender, // recipient
amountIn, // amountIn
amountOutMin, // amountOutMin
true, // payerIsUser
path // path
);
bytes;
inputsArray[0] = input;
// Execute the swap via UniversalRouter
universalRouter.execute{value: 0}(commands, inputsArray, deadline);
// Emit event for tracking
emit SwapExecuted(
msg.sender,
tokenIn,
tokenOut,
amountIn,
amountOutMin,
deadline
);
}
receive() external payable {}
}
我正在尝试通过参与一个项目来学习 Solidity,并且我想使用 DEX 交换代币。我有该 DEX 和 Permit2 的合约地址,并且我编写了一个简单的智能合约来查看它是否有效,但我收到 inputArray[0] 的“未声明的标识符”错误,并且我不知道如何修复这。我将感谢您的帮助。
要修复
Undeclared identifier
错误,只需确保在 universalRouter.execute
中使用它之前声明并设置 inputArray 即可。查看添加的评论。
pragma solidity ^0.8.17;
contract TokenSwapper {
IUniversalRouter public universalRouter;
IPermit2 public permit2;
bytes1 public constant V3_SWAP_EXACT_IN = 0x00;
constructor(address _universalRouter, address _permit2) {
universalRouter = IUniversalRouter(_universalRouter);
permit2 = IPermit2(_permit2);
}
function swapExactInputWithPermit(
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 amountOutMin,
bytes calldata path,
uint256 deadline,
uint256 permitDeadline,
uint8 v,
bytes32 r,
bytes32 s
) external {
permit2.permit(
msg.sender,
address(universalRouter),
tokenIn,
amountIn,
permitDeadline,
v, r, s
);
bytes memory commands = abi.encodePacked(V3_SWAP_EXACT_IN);
bytes memory input = abi.encode(
msg.sender,
amountIn,
amountOutMin,
true,
path
);
// 用一个元素声明并初始化 inputArray
bytes;
// 将编码后的输入数据分配给第一个元素
inputsArray[0] = input;
universalRouter.execute{value: 0}(commands, inputsArray, deadline);
}
}