He intentado esto:
function burn(uint256 tokens) public returns(bool){
require(balances[msg.sender] >= tokens);
balances[msg.sender] = balances[msg.sender].sub(tokens);
_totalSupply = _totalSupply.sub(tokens);
Burn(msg.sender, tokens);
}
pero este código solo quemará los tokens del propietario de la dirección. Quiero que el propietario del contrato pueda quemar todos los tokens y hacer que totalSupply sea 0.
Como se puede ver en las respuestas anteriores, si su token se distribuye a decenas de miles de titulares, se vuelve poco práctico y casi imposible establecer todos sus saldos en 0.
Puedes lograr lo mismo al:
_totalSupply
a 0allBurned
y configúrela true
en la burnA()
funciónrequire(!allBurned)
(o código más complejo que hace lo que quieres)Esto no es posible con una implementación típica de erc20. Si realmente quisiera grabar todo, tendría que mantener una matriz de todas las direcciones que tienen un saldo distinto de cero y recorrer esa matriz burn
para establecerlas todas en cero.
Debe vaciar la balances
matriz y establecerla _totalSupply
en 0
. Para vaciar la matriz, consulte: https://ethereum.stackexchange.com/a/3377/31933
Otra historia es qué tipo de evento debe desencadenar. Supongo que deberías disparar:
Burn(msg.sender, _totalSupply);
(aunque no puede usar el valor de _totalSupply
porque ya está puesto a cero, así que almacene el valor temporalmente en alguna otra variable antes de ponerlo a cero)
Para quemar todos los tokens a la vez, necesitaría iterar sobre todos los elementos en los saldos, lo que no es posible sin modificaciones en el código, pero incluso con esas modificaciones, una transacción como esa sería muy rápidamente más grande que el límite de gas del bloque cuando el token es utilizado por un par de miles de direcciones.
Aquí hay una manera de hacerlo, aunque no recomendaría hacerlo:
mapping (address => uint) accountBalances;
mapping (uint => address) accountIndex;
uint accountCount;
function burnAllTokens()
{
for(uint i=0;i<accountCount;i++)
{
accountBalances[accountIndex[i]] = 0;
_totalSupply = 0;
}
}
Obviamente, debe almacenar todas las cuentas cada accountIndex
vez que alguien les envíe.
Prateek Singhania