¿Cómo destruir un token o una lista de tokens de otro contrato?

[Editar 14-03-2018] Quiero crear un contrato A que pueda generar un número aleatorio de Token A y otro contrato B que reciba y destruya uno o varios de este token para generar un nuevo Token B.

Es como enviar un CryptosKitty a otro contrato B, quemar el gatito y generar un Perro con la generación del gatito.

Gracias por la ayuda.

Tendrás que proporcionar más contexto.
no es posible generar números verdaderamente aleatorios en un contrato. El último tipo que lo probó, perdió sus 2k Ethers, eso fue hace aproximadamente un año.
su token debe conocer la dirección del contrato del destructor y cuando recibe un mensaje en particular, puede establecer el saldo del token en cero.

Respuestas (2)

En caso de que el contrato Apermita a los titulares de tokens quemar sus tokens, solo necesita llamar al método de contrato correspondiente Adesde el contrato Bde esta manera:

contract B is ERC721 {
  uint nextDogID = 0;
  A a = ...;

  function catToDog (uint _catID) public (returns _dogID) {
    _dogID = nextDogID++;
    _mint (msg.sender, _dogID);
    copyGene (_catID, _dogID);
    require (a.transferFrom (msg.sender, address (this), _catID));
    require (a.burn (_catID)); // Here we burn the cat token!
  }
}

Si Ano permite la grabación, simplemente envíe tokens "quemados" a alguna dirección inactiva:

contract B is ERC721 {
  uint nextDogID = 0;
  IERC721 a = ...;

  function catToDog (uint _catID) public (returns _dogID) {
    _dogID = nextDogID++;
    _mint (msg.sender, _dogID);
    copyGene (_catID, _dogID);

    // Here we send the cat token to dead address effectively burning it
    require (a.transferFrom (
      msg.sender,
      0x000000000000000000000000000000000000dead,
      _catID));
  }
}

En realidad, no necesita "recibir" nada. El contrato B solo necesita poder quemar algunos tokens que se enumeran en el contrato A.

Aquí hay un código de ejemplo:

contract A {
    uint tokens = 10;
    // which address is allowed to burn tokens
    address allowedBurnerAddress = 0x1234;

    // allowed contract (B) can call this to burn tokens
    function burn(uint amount) public {
        require(msg.sender == allowedBurnerAddress);
        tokens -= amount;
    }
}

contract B {
    // address for contract A
    address burnContract = 0x0987;

    // call this to burn tokens which exist in contract A
    function PerformBurn() public {
        // add some requirements for who can call this function

        A original = A(burnContract);
        original.burn(5);
    }
}