Tengo un contrato central (1) que usa una fábrica de contratos (2) para crear un contrato (3). Estoy escribiendo algunas pruebas en JavaScript para asegurarme de que el contrato 3 se cree correctamente. Puedo decir que los eventos se están emitiendo correctamente, pero cuando quiero verificar las funciones del contrato 3 (#intentandohacerlo), parece que Truffle no reconoce la dirección del contrato 3 creado como un contrato (es decir, ) TypeError: contract3Address.functionName is not a function
. ¿Las pruebas de Truffle Javascript solo reconocen direcciones como contratos si se implementan a través de migraciones de Truffle? ¿Hay una solución para esto en Javascript? ¿Quizás es un mejor caso de prueba para las pruebas de solidez?
A continuación se muestran algunas versiones simplificadas de lo que estoy trabajando:
Contrato 1: Centro
import "./Contract2Interface.sol";
contract Contract1 {
Contract2Interface I;
function Contract1(address Contract2Address){
I = Contract2Interface(Contract2Address);
}
function creation() returns (address newcontract3) {
address theCreatedContract3 = I.createNewContract3();
return newcontract3;
}
}
Contrato 2: Contrato de Fábrica
import "./Contract3.sol";
import "./Contract2Interface.sol";
contract Contract2 is Contract2Interface {
event ContractCreation(address _newContract);
function createNewContract3() public returns(address) {
Contract3 createdContract3 = new Contract3();
ContractCreation(createdContract3);
return createdContract3;
}
}
Contrato 3: Contrato a crear
contract Contract3{
uint256 public num;
function storeNum(uint256 newNum) public returns(bool) {
num = newNum;
}
}
Prueba de JavaScript Esto está simplificado, pero creo que da suficiente idea.
beforeEach(async function(){
contractFactory = await Contract2.new();
contractHub = await Contract1.new(contractFactory.address);
});
describe("Creating contract 3", async function(){
it("Should allow us to create contract 3", async function(){
let result = await contract1.createNewContract3({from: owner});
//Event data
let log = resultTwo.logs[0];
let contract3Address = log.args._newContract;
console.log(contract3Address) //I can see this is a valid contract address & event has been emitted properly.
let newnum = await contract3Address.storeNum(7);
// At this point I get an error that "storeNum" is not a function of contract3Address from Truffle testing
})
})
un par de problemas
En la función creation
de Contract1 estás devolviendo newcontract3
sin que se le asigne un valor, al ser una dirección el valor devuelto será por defecto address(0x0)
. Probablemente desee asignar el resultado de createNewContract3()
.
function creation() returns (address newcontract3) {
newcontract3 = I.createNewContract3();
return newcontract3;
}
En su prueba, asigna al contract3Address
parámetro del evento que es de tipo string
. En truffle, cuando desea interactuar con un contrato en una dirección determinada, necesita obtener una instancia que apunte a esa dirección, es decir const myContract = await MyContract.at("address");
.
describe("Creating contract 3", async function(){
it("Should allow us to create contract 3", async function(){
let result = await contract1.createNewContract3({from: owner});
//Event data
let log = resultTwo.logs[0];
let contract3Address = log.args._newContract;
// Get instance pointing to address obtained from event
const contract3 = await Contract3.at(contract3Address);
let newnum = await contract3.storeNum(7);
// At this point I get an error that "storeNum" is not a function of contract3Address from Truffle testing
})
})
karen s