在持有者之间划分合约价值(实际上是代币合约)

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 &lt; TotalSupplyTokenBalance / 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);
    

【讨论】:

以上是关于在持有者之间划分合约价值(实际上是代币合约)的主要内容,如果未能解决你的问题,请参考以下文章

以太坊合约所有者可以支付交易的gas吗?

ERC20代币学习与合约编写

持续监听智能合约事件

以太坊 Solidity 的划分

手把手教你发行代币

代币(ETH)空投工具