[Редактировать 14-03-2018] Я хочу создать контракт A, который может генерировать случайное количество токенов A, и другой контракт B, который получает и уничтожает один или несколько этих токенов для создания нового токена B.
Это как отправить одного CryptosKitty на другой контракт B, сжечь котенка и сгенерировать Dog с геном котенка.
Спасибо за помощь.
Если контракт 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);
}
}
ивикаа
Нулик
Нулик