You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:40:16