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

如何实现用户为初始持币人的动态部署ERC20代币生成器

问题原因

Solidity 中msg.sender代表直接发起当前合约调用的地址。你现有逻辑里,Token合约是被TokenGenerator合约部署的,因此Token构造函数执行时,msg.sender取值为TokenGenerator合约地址,而非发起前端交易的用户地址,最终导致初始铸造的代币全部归属工厂合约。

另外你原有Token合约的铸币逻辑存在精度问题:OpenZeppelin 标准 ERC20 实现默认带18位小数,直接_mint(msg.sender,1000)实际只铸造了0.000000000000001个代币,而非用户认知中的1000个完整代币。

修改方案

1. 调整Token合约逻辑

给构造函数新增初始持币地址入参,不再依赖构造函数内的msg.sender作为铸币目标,同时补上精度计算:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Token is ERC20 {
    constructor(
        string memory name, 
        string memory symbol,
        address initialHolder
    ) ERC20(name, symbol) { 
        // 按代币精度铸造对应数量的初始供应量到指定持币地址
        _mint(initialHolder, 1000 * 10 ** decimals());
    }
}

2. 调整TokenGenerator工厂合约逻辑

部署新Token时,将调用generateToken函数的用户地址(即工厂函数内的msg.sender,此时该值就是发起交易的用户钱包地址)作为初始持币地址传入Token构造函数,同时移除冗余的导入:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./Token.sol";

contract TokenGenerator{ 
    
    function generateToken(string memory name, string memory symbol) public returns(address){
        Token newToken = new Token(name, symbol, msg.sender);
        return address(newToken);
    }
}
部署验证

修改完成后重新部署TokenGenerator合约即可。前端调用逻辑不需要改动,用户点击*generate(生成)*按钮发起交易后,新部署的ERC20代币初始供应量会直接打入发起交易的用户地址,和用户自行独立部署代币合约的效果完全一致,每个新生成的代币合约互相独立、互不干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:39:38