Solidity代码报错:未声明标识符inputsArray[0]求解
修复Solidity合约中“未声明标识符错误:inputsArray[0]”的问题
错误原因
你代码中直接使用了inputsArray变量,但从未声明该变量的类型与初始值,导致编译器无法识别这个标识符。具体问题出在这段无效代码:
bytes; inputsArray[0] = input;
修复方案
你需要先声明一个bytes[]类型的内存数组,再将构造好的input数据存入数组中。有两种简洁的实现方式:
方式1:显式声明并初始化数组
将错误代码替换为:
// 声明一个长度为1的bytes数组(对应单个swap命令) bytes[] memory inputsArray = new bytes[](1); inputsArray[0] = input;
方式2:使用数组字面量直接传参
可以跳过单独声明数组的步骤,在调用execute函数时直接传入数组字面量,代码更简洁:
// 直接用[input]作为inputs参数传入 universalRouter.execute{value: 0}(commands, [input], deadline);
修复后的完整合约代码
// 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数组 bytes[] memory inputsArray = new bytes[](1); 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 {} }
额外说明
- 因为你只执行一个V3_SWAP_EXACT_IN命令,所以数组长度设为1即可。如果后续需要添加多个命令,只需对应增加数组长度并填充更多input数据。
- 单命令场景下,使用数组字面量
[input]的方式代码更简洁。
内容的提问来源于stack exchange,提问作者SaturnUK
相关产品推荐
相关产品推荐

