我正在创造一个象征,我可以创造一个无限的数量。我会把它们卖给别人。
然后,我需要发送另一个令牌,或ETH,给每个持有人我的令牌。发送的金额应与其持有的令牌数量成比例。
发布于 2020-12-19 20:33:12
一般来说,您应该避免在基本的智能契约代码中使用循环,因为它们最终会花费越来越多的汽油,并且有更多的令牌持有者。
因此,我推荐一种类似于这样的模式:
mapping(address => uint256) public withdrawableETH;
mapping(address => uint256) public lastUpdateTotalETHdistributedPerToken;
uint256 public totalETHdistributedPerToken;
function updateTokenHolderWithdrawableETH(address _tokenHolder) public
{
uint256 tokens = balanceOf(_tokenHolder);
uint256 newETHperToken = totalETHdistributedPerToken - lastUpdateTotalETHdistributedPerToken[_tokenHolder];
if (newETHperToken > 0)
{
withdrawableETH[_tokenHolder] += tokens * newETHperToken / (1 ether);
}
lastUpdateTotalETHdistributedPerToken[_tokenHolder] = totalETHdistributedPerToken;
}
function distributeETH() external onlyOwner payable
{
totalETHdistributedPerToken += msg.value * (1 ether) / totalSupply;
}
function withdrawETH() external
{
updateTokenHolderWithdrawableETH(msg.sender);
uint256 amount = withdrawableETH[msg.sender];
withdrawableETH[msg.sender] = 0;
msg.sender.transfer(amount);
}updateTokenHolderWithdrawableETH(addr)应该在addr余额的每一次更改之前执行。
令牌持有者可以调用withdrawETH(),以获取自上次退出以来发生的部分ETH分发。
如果您真的想将ETH“推送”给令牌持有者,您可以添加一个批提取函数。
https://ethereum.stackexchange.com/questions/91212
复制相似问题