Tengo dos contratos: ElephanteumStorage y ElephanteumCore. El almacenamiento solo guarda algunos datos. Se proporciona Core para cambiar los datos en el almacenamiento.
Como argumento del constructor, ElephanteumCore recibe la dirección de almacenamiento para que Core pueda llamar a las funciones de almacenamiento. Además, he establecido a Core como propietario del Almacenamiento.
Escribí la función de inicio en Core que debe guardar datos en el almacenamiento y probé esta funcionalidad en Remix IDE con Rinkeby y JS VM y todo estuvo bien. Pero en la prueba de Truffle recibí un mensaje de error de reversión.
contract ElephanteumCore is Ownable {
ElephanteumStorage public eStorage;
function ElephanteumCore(address _eStorage) public payable {
eStorage = ElephanteumStorage(_eStorage);
}
function init(bytes32 _name, bytes32 _symbol, uint _supply) public onlyOwner {
eStorage.setTotalSupply(_supply);
eStorage.setElephantsRemainingToAssign(_supply);
eStorage.setName(_name);
eStorage.setSymbol(_symbol);
}
}
contract ElephanteumStorage is Ownable {
bytes32 public name;
bytes32 public symbol;
uint public totalSupply;
uint public elephantsRemainingToAssign;
function setName(bytes32 _name) onlyOwner external {
name = _name;
}
function setSymbol(bytes32 _symbol) onlyOwner external {
symbol = _symbol;
}
function setTotalSupply(uint _totalSupply) onlyOwner external {
totalSupply = _totalSupply;
}
function setElephantsRemainingToAssign(uint _elephantsRemainingToAssign) onlyOwner external {
elephantsRemainingToAssign = _elephantsRemainingToAssign;
}
}
Y ahí está mi prueba de trufa:
const elephanteumCore = artifacts.require('ElephanteumCore');
const elephanteumStorage = artifacts.require('ElephanteumStorage');
contract('ElephanteumCore', accounts => {
let eCore, eStorage;
before(async () => {
eStorage = await elephanteumStorage.new();
eCore = await elephanteumCore.new(eStorage.address);
await eStorage.transferOwnership(eCore.address);
})
it('Should initialize the contract correcty', async () => {
let name = "Elephanteum";
let symbol = "EPH";
let supply = 100;
await eCore.init(name, symbol, supply);
let rName = await eStorage.name.call();
let rSymbol = await eStorage.symbol.call();
let rSupply = await eStorage.totalSupply.call();
assert.equal(name, web3.toUtf8(rName), "name should have be initialize correctly");
assert.equal(symbol, web3.toUtf8(rSymbol), "symbol should have be initialize correctly");
assert.equal(supply, rSupply.toNumber(), "supply should have be initialize correctly");
})
Traté de ejecutar la prueba tanto en testrpc como en rinkeby, en todas partes genera una excepción en línea
await eCore.init(name, symbol, supply);
Y no sé por qué.
Usas la función setElephantsRemainingToAssign
en la función de inicio, pero no veo esa función en el ElephanteumStorage
contrato.
Eliminé el directorio "compilar" y ahora funciona. El problema era que Truffle no recompilaba los contratos antes de ejecutar la prueba de forma predeterminada.
Михайло Хорошун