У меня два контракта: ElephanteumStorage и ElephanteumCore. Хранилище просто хранит некоторые данные. Ядро предназначено для изменения данных в Хранилище.
В качестве аргумента конструктора ElephanteumCore получает адрес Storage, чтобы Core мог вызывать функции Storage. Кроме того, я установил Core в качестве владельца хранилища.
Я написал функцию инициализации в Core, которая должна сохранять данные в хранилище, и я протестировал эту функцию в Remix IDE с Rinkeby и JS VM, и все было в порядке. Но в тесте Truffle я получил сообщение об ошибке возврата.
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;
}
}
А вот и мой трюфельный тест:
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");
})
Я пытался запустить тест как в testrpc, так и в rinkeby, везде он вызывает исключение в строке
await eCore.init(name, symbol, supply);
И я не знаю, почему.
Вы используете функцию setElephantsRemainingToAssign
в функции инициализации, но я не вижу этой функции в ElephanteumStorage
контракте.
Я удалил каталог «сборка», и теперь он работает. Проблема заключалась в том, что Truffle по умолчанию не перекомпилирует контракты перед запуском теста.
Михайло Хорошун