Как уничтожить токен или список токенов из другого контракта?

[Редактировать 14-03-2018] Я хочу создать контракт A, который может генерировать случайное количество токенов A, и другой контракт B, который получает и уничтожает один или несколько этих токенов для создания нового токена B.

Это как отправить одного CryptosKitty на другой контракт B, сжечь котенка и сгенерировать Dog с геном котенка.

Спасибо за помощь.

Вам нужно будет предоставить больше контекста.
в контракте невозможно генерировать действительно случайные числа. Последний парень, который пытался это сделать, потерял свои 2000 эфиров, это было около года назад.
ваш токен должен знать адрес контракта разрушителя, и когда он получает конкретное сообщение, он может обнулить баланс токена.

Ответы (2)

Если контракт Aпозволяет держателям токенов сжигать свои токены, вам просто нужно вызвать соответствующий метод контракта Aиз контракта Bследующим образом:

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!
  }
}

Если Aне разрешает сжигание, просто отправьте «сгоревшие» токены на какой-нибудь мёртвый адрес:

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));
  }
}

На самом деле вам не нужно ничего «получать». Контракт B просто должен быть в состоянии сжечь некоторые токены, которые перечислены в контракте A.

Вот пример кода:

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);
    }
}