Solidity

自動對交易徵稅並分發給所有代幣持有者

  • May 4, 2021

是否有一種有效的方法可以自動對每筆交易“徵稅”並按比例將徵稅金額發送給所有未列入黑名單的代幣持有者?據我了解,在每筆交易中循環遍歷所有地址將花費大量的 gas。

是否可以通過跟踪 atotalTaxedAmount並在呼叫時返回以下內容來做到這一點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映射中刪除

引用自:https://ethereum.stackexchange.com/questions/97808