función en contrato inteligente para permitir que el propietario queme todos los tokens

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.

Respuestas (4)

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:

  1. establecer el _totalSupplya 0
  2. cree una variable booleana llamada allBurnedy configúrela trueen la burnA()función
  3. modificar todas las funciones que administran fondos y poner require(!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 burnpara establecerlas todas en cero.

Sí, estoy de acuerdo en que no es factible implementarlo en erc20, pero ese fue solo un caso de uso que estaba tratando de implementar para verificar el concepto de cómo implementarlo, gracias por su tiempo y ayuda.

Debe vaciar la balancesmatriz y establecerla _totalSupplyen 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 _totalSupplyporque ya está puesto a cero, así que almacene el valor temporalmente en alguna otra variable antes de ponerlo a cero)

Balances no es una matriz, es un mapa.

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 accountIndexvez que alguien les envíe.

@Grunzwanling, eso funcionó, ¡gracias por la ayuda!