Solidity
自動對交易徵稅並分發給所有代幣持有者
是否有一種有效的方法可以自動對每筆交易“徵稅”並按比例將徵稅金額發送給所有未列入黑名單的代幣持有者?據我了解,在每筆交易中循環遍歷所有地址將花費大量的 gas。
是否可以通過跟踪 a
totalTaxedAmount
並在呼叫時返回以下內容來做到這一點balanceOf(address)
?function balanceOf(address addr) public view returns (uint256){ return balances[addr] + balances[addr]*totalTaxedAmount/totalSupply; }
這實際上會反映代幣數量的增加嗎?
循環遍歷所有地址絕對不是辦法。但是,您可以嘗試跟踪唯一使用者和總稅額。
快速樣本契約:
pragma solidity 0.8.2; contract TaxedToken { mapping(address => uint) internal balances; mapping(address => bool) internal isTokenHolder; uint totalTaxedAmount = 0; uint totalUniqueUsers = 0; uint tax = 10; address public owner; constructor() { owner = msg.sender; balances[owner] = 100; totalUniqueUsers = 1; } function balanceOf(address account) public view returns (uint) { return balances[account] + (totalTaxedAmount / totalUniqueUsers); } function transfer(address _to, uint _value) public { require(balanceOf(msg.sender) >= _value, "Insuficient funds"); balances[msg.sender] = balances[msg.sender] - _value; balances[_to] = balances[_to] + _value - tax; if(!isTokenHolder[_to]) { isTokenHolder[_to] = true; totalUniqueUsers++; } totalTaxedAmount += tax; } }
請注意以下邊緣情況:
- 新的接收者在過去的交易中獲得“稅收獎勵”,這減少了其他人的份額。
- 當發送者轉移他的所有資金時;他應該從
isTokenHolder
映射中刪除