Solidity开发:父合约ERC20Mod如何获取子合约的uint变量percentage?
解决方案:让父合约通过抽象函数访问子合约变量
因为Solidity中父合约无法直接访问子合约的状态变量,你可以通过抽象函数+子合约实现的方式解决,既保持两个合约分离,又能让ERC20Mod获取到Wiseth中的手续费百分比。
步骤1:在ERC20Mod.sol中定义抽象函数
修改ERC20Mod.sol,添加一个返回手续费百分比的抽象函数,由子合约负责实现:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract ERC20Mod is ERC20 { // 定义抽象函数,子合约需实现该函数返回手续费比例 function getFeePercentage() public view virtual returns (uint256); function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { // 通过抽象函数获取子合约中的手续费比例 uint256 fee = (amount.mul(getFeePercentage())).div(10000); uint256 total = amount.sub(fee); address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, total); // 补充:将手续费转入指定地址(如合约所有者),避免手续费凭空消失 _transfer(from, owner(), fee); return true; } }
步骤2:在Wiseth合约中实现抽象函数
修改wiseth_v1.sol,实现ERC20Mod中定义的抽象函数,返回自身的percentage变量:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "./ERC20Mod.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract Wiseth is ERC20Mod, Ownable { uint deployDate; uint daHour; bool isPassed; bytes32 num_type; uint public percentage; // 初始化ERC20代币的名称与符号 constructor(string memory tokenName, string memory tokenSymbol) ERC20(tokenName, tokenSymbol) {} function setFirstPercentageFee(uint256 fee) external onlyOwner { // 添加手续费上限校验,防止设置过高比例 require(fee <= 1000, "Fee cannot exceed 10%"); percentage = fee; } // 实现父合约的抽象函数,返回当前手续费比例 function getFeePercentage() public view override returns (uint256) { return percentage; } }
额外提示
- 0.8.x版本的Solidity已内置溢出检查,无需再导入
SafeMath库,代码中的using SafeMath for uint256可以直接删除。 - 手续费的接收地址可根据需求调整,比如改为指定的手续费归集地址,而非仅合约所有者。
内容的提问来源于stack exchange,提问作者solidity_tryharder
相关产品推荐
相关产品推荐

