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

如何返回多类型数组内容?ERC20工厂合约数组查询及结构体疑问

问题解决与优化方案

首先看你合约里getList函数的问题:

  1. 错误地把数组tokenList当作函数调用(tokenList()),直接返回数组本身即可
  2. tokenList是ERC20[]类型,但你声明的返回值是address[],需要做类型转换或者调整返回类型

修正getList函数的两种方案

方案1:直接返回ERC20数组

function getList() public view returns (ERC20[] memory) {
    return tokenList;
}

方案2:转换为地址数组返回

function getList() public view returns (address[] memory) {
    address[] memory tokenAddresses = new address[](tokenList.length);
    for (uint i = 0; i < tokenList.length; i++) {
        tokenAddresses[i] = address(tokenList[i]);
    }
    return tokenAddresses;
}

关于结构体存储ERC20实例的问题

完全可以用结构体存储ERC20实例,甚至可以把token的元数据(名称、符号、总供应量等)一起存入,方便后续管理:

// 定义包含token信息的结构体
struct TokenDetail {
    ERC20 tokenContract;
    string tokenName;
    string tokenSymbol;
    uint totalSupply;
}

// 存储所有token的详细信息
TokenDetail[] public tokenDetails;

// 修改createERC20函数,存入结构体
function createERC20(string memory name_, string memory symbol_, uint totalSupply_) public {
    ERC20 newToken = new ERC20(name_, symbol_, totalSupply_, owner_);
    tokenDetails.push(TokenDetail({
        tokenContract: newToken,
        tokenName: name_,
        tokenSymbol: symbol_,
        totalSupply: totalSupply_
    }));
}

// 获取完整的token详情列表
function getTokenDetails() public view returns (TokenDetail[] memory) {
    return tokenDetails;
}

额外的合约优化建议

  • owner_的初始化建议放在构造函数里,这是Solidity的规范写法,避免版本兼容问题:
address owner_;

constructor() {
    owner_ = msg.sender;
}
  • 你开头声明的ERC20 erc20 = ERC20(0x2C31Db3Cc686CBf0EF2325a468f622137A42Da31);没有实际作用,因为每次调用createERC20都会创建新合约并覆盖这个变量,建议删除或者明确它的用途。

内容的提问来源于stack exchange,提问作者Carlton Bags

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:25:20