[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.
En caso de que el contrato A
permita a los titulares de tokens quemar sus tokens, solo necesita llamar al método de contrato correspondiente A
desde el contrato B
de 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 A
no 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);
}
}
ivicaa
Nulik
Nulik