部署ERC20相关合约后交易日志未显示ERC20Token合约地址问题咨询
问题解决方案
问题1:日志无mint操作对应合约地址的解决方法
- 根本原因:Solidity的链上日志仅会记录显式触发的Event事件,你当前编写的
ERC20Token合约的mint方法仅更新了balances状态,没有定义和触发事件,因此不会在交易日志中生成相关记录,自然无法查询到对应的合约地址。 - 修复方案:在
ERC20Token合约中新增Mint事件,每次调用mint方法时触发事件,将合约地址、mint操作发起地址、mint数量等参数写入日志。
问题2:获取ERC20Token合约部署地址的方法
你编写的MyContract合约已经将token变量声明为public类型,Solidity会自动为public状态变量生成同名的外部调用方法,直接调用MyContract实例的token()方法,即可获取到构造函数传入的ERC20Token合约部署地址,无需额外编写逻辑。
问题3:交易日志可查询ERC20Token地址的修复代码
你可以参考下方修改后的完整合约代码,新增事件定义和触发逻辑后即可满足需求:
pragma solidity >=0.7.0 <0.9.0; contract ERC20Token{ string public name; mapping (address => uint256) public balances; // 新增Mint事件,记录当前合约地址、mint接收地址、mint数量 event Mint(address indexed tokenContract, address indexed to, uint256 amount); function mint() public { balances[tx.origin] ++; // 触发事件,写入链上日志 emit Mint(address(this), tx.origin, 1); } } contract MyContract { address payable wallet; address public token; constructor(address payable _wallet, address _token) public { wallet=_wallet; token=_token; } fallback()external payable{ buyTonken(); } function buyTonken() public payable { ERC20Token _token = ERC20Token(address(token)); _token.mint(); wallet.transfer(msg.value); } }
- 代码修改说明:新增
Mint事件后,每次调用mint方法都会将当前ERC20Token的合约地址作为参数写入日志,后续查询对应交易的日志即可直接提取到该地址。
内容的提问来源于stack exchange,提问作者Miguelangel weill
相关产品推荐
相关产品推荐

