Pruebas de fábrica de contratos de trufas (Javascript)

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
    })
  })

Respuestas (1)

un par de problemas

En la función creationde Contract1 estás devolviendo newcontract3sin 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 contract3Addresspará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
    })
  })
¡Gracias! El primer error es un error tipográfico mío al intentar acortar esto en la publicación, pero la última solución es exactamente lo que necesitaba que me recordaran, ¡gracias!