在持有者之间划分合约价值(实际上是代币合约)
Posted
技术标签:
【中文标题】在持有者之间划分合约价值(实际上是代币合约)【英文标题】:Dividing contract value (actually it is token contract) between holders 【发布时间】:2021-10-12 10:14:39 【问题描述】:这是我的代码的一部分(代币合约的一部分):
contract SpeadTheGainContract
uint public _totalSupply;
mapping(address => uint) public balances;
uint public indexedAddressesCounter = 0;
mapping(address=>bool) ifAdressExisted;
mapping(uint=>address) ownersAddresses;
uint requiredAmount = 1 wei;
function spreadTheGain() external
for (uint i = 0; i < indexedAddressesCounter; i++)
payable(ownersAddresses[i]).transfer(address(this).balance*(balances[ownersAddresses[i]]/_totalSupply));
function increaseValue() external payable
require(msg.value >= requiredAmount, "Can't send 0 value!");
通过每次传输令牌,新的接收者地址将添加到ownersAddresses
。
使用increaseValue()
,合约收到一定数量的ETH并存储起来。
使用spreadTheGain()
,合约存储的 ETH 将在代币持有者之间进行分配。
问题是当有 1 个代币持有者(所有者)时它可以正常工作,但如果有另一个,它就不起作用并在不发送任何 ETH 的情况下执行该功能。
在交易详情中,它向持有者显示内部交易的数量,向持有者发送 ETH,但发送值为 0 ETH。
有什么问题?!
【问题讨论】:
【参考方案1】:有两个问题:
每次转账后合约余额都会更新address(this).balance.
所以如果你想在 10 个地址之间拆分 10 wei,第一个会看到 10 wei/10,但第二个会看到 9 wei /10。
solidity 中的整数除法会截断结果,因此 9/10 返回 0。计算完成 EtherBalance * (TokenBalance / TotalSupply)
。当持有者超过1个时TokenBalance < TotalSupply
和TokenBalance / TotalSupply = 0
。
为了解决第一个问题,在进入循环之前将余额保存在一个变量中。第二个问题可以通过重新排序先做产品的操作员然后除法(EtherBalance * TokenBalance) / TotalSupply
来解决。
function spreadTheGain() external
uint256 totalBalance = address(this).balance;
for (uint i = 0; i < indexedAddressesCounter; i++)
uint256 amount = (totalBalance * balances[ownersAddresses[i]]) / _totalSupply;
payable(ownersAddresses[i]).transfer(amount);
【讨论】:
以上是关于在持有者之间划分合约价值(实际上是代币合约)的主要内容,如果未能解决你的问题,请参考以下文章