ERC20PresetFixedSupply库是一种带预铸造功能的ERC20实现,即在合约部署时直接将全部流通量都铸造给某一地址且部署后无法增发。该库同时继承了ERC20Burnable库,支持销毁和委托销毁功能。
[openzeppelin]:v4.8.3,[forge-std]:v1.5.6
ERC20PresetFixedSupply库是一种带预铸造功能的ERC20实现,即在合约部署时直接将全部流通量都铸造给某一地址且部署后无法增发。该库同时继承了ERC20Burnable库,支持销毁和委托销毁功能。ERC20Burnable库详解参见:https://learnblockchain.cn/article/7038
ERC20PresetFixedSupply合约可直接部署。
全部foundry测试合约:
constructor(
string memory name,
string memory symbol,
uint256 initialSupply,
address owner
) ERC20(name, symbol) {
// 在合约部署时,将全部的流通量都铸造给owner
_mint(owner, initialSupply);
}
foundry代码验证:
contract ERC20PresetFixedSupplyTest is Test {
uint private _initialSupply = 100;
address private _owner = address(this);
ERC20PresetFixedSupply private _testing = new ERC20PresetFixedSupply("test name", "test symbol", _initialSupply, _owner);
function test_Constructor() external {
assertEq(_testing.totalSupply(), _initialSupply);
assertEq(_testing.balanceOf(_owner), _initialSupply);
// support {burn} && {burnFrom} of ERC20Burnable
// test {burn}
uint amountToBurn = 1;
_testing.burn(amountToBurn);
assertEq(_testing.totalSupply(), _initialSupply - amountToBurn);
assertEq(_testing.balanceOf(_owner), _initialSupply - amountToBurn);
// test {burnFrom}
address spender = address(1);
_testing.approve(spender, amountToBurn);
vm.prank(spender);
_testing.burnFrom(_owner, amountToBurn);
assertEq(_testing.totalSupply(), _initialSupply - amountToBurn - amountToBurn);
assertEq(_testing.balanceOf(_owner), _initialSupply - amountToBurn - amountToBurn);
}
}
ps: 本人热爱图灵,热爱中本聪,热爱V神。 以下是我个人的公众号,如果有技术问题可以关注我的公众号来跟我交流。 同时我也会在这个公众号上每周更新我的原创文章,喜欢的小伙伴或者老伙计可以支持一下! 如果需要转发,麻烦注明作者。十分感谢!
公众号名称:后现代泼痞浪漫主义奠基人
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!