¿Cómo obtener la dirección de la instancia del contrato para la API del contrato Web3 1.0?

Con truffle-contract , todo lo que necesitaba hacer para obtener la instancia del contrato era algo como esto:

const getContract = require('truffle-contract')
const contractJSON = require('./MyContract.json')

const contract = getContract(contractJSON)
contract.setProvider(web3.currentProvider)

const instance = await contract.deployed()
return instance
  • Tenga en cuenta que el MyContract.jsonarchivo es el artefacto de construcción de Truffle.

Pero dado que la instancia creada por truffle-contract devuelve promesas en lugar del PromiEvent que vino con la versión 1.0 de Web3, decidí que quería usar la v1.0 Web3 normal para obtener la instancia del contrato. En otras palabras, ya no quería confiar en el contrato de trufa.

Desafortunadamente, no estoy tan familiarizado con la API de contrato en el nuevo 1.0 Web3. Este es mi intento:

const contract = new web3.eth.Contract(contractJSON.abi)
contract.methods.get().call()

La primera línea está bien, pero la segunda arroja el siguiente error:

Este objeto de contrato aún no tiene una dirección configurada, primero configure una dirección.

Veo que esto tiene sentido porque la documentación parece indicar que puede establecer una dirección para que sepa dónde encontrar la instancia implementada.

¿Significa esto que tendría que ir a mi Consola Truffle (también conocida como testrpc) para encontrar la dirección del contrato y copiar y pegar esto cada vez? Espero que no, porque con truffle-contrat, todo lo que tenía que hacer era incluir el archivo JSON y lo resolvió por mí.

¿Cómo se supone que debo obtener esta dirección y pasarla?

Sí, debe proporcionar la dirección. Supongo que MyContract.jsondebe incluir la dirección, por lo que puede leerlo desde allí si lo desea.
@smarx pero MyContract.json (es decir, el artefacto de compilación Truffle) no contiene la dirección. Esto se debe a que es un artefacto de compilación de la definición del contrato, no un artefacto de una instancia implementada. Sin embargo, trufa-contrato parece ser capaz de resolverlo.
Profundizando en el código fuente del contrato de trufa, parece que hace algo extraño, como tratar de verificar en qué red está y luego comparar de alguna manera para ver si ese contrato está implementado o no y luego qué dirección es. Sin embargo, no puedo entender cómo lo está haciendo.
Mire el JSON en build/contracts. Después de una búsqueda rápida, me parece que ahí es donde deberías encontrar la dirección. Yo no uso Truffle, así que no tengo nada útil para hurgar, lo siento.
Ese es el JSON del que estoy hablando. No tiene la dirección.
Ah, creo que lo encontré, déjame escribir una respuesta. Gracias por ayudar.

Respuestas (1)

No pude encontrar dónde estaba almacenada la dirección porque el archivo JSON que tomé era una versión desactualizada. Fue uno que se generó antes de migrar a Truffle. Resulta que el archivo JSON se actualiza cada vez que Truffle ejecuta sus migraciones. Y con eso, agregará la dirección de la instancia de contrato implementada.

Tuve que profundizar en sus documentos para encontrarlo aquí: https://github.com/trufflesuite/truffle/tree/develop/packages/truffle-contract-schema#networks

A partir de ahí, fue fácil encontrar la dirección implementada previamente. El código final se parece a esto:

const networkId = await web3.eth.net.getId()
const deployedAddress = contractJSON.networks[networkId].address
const contract = new web3.eth.Contract(contractJSON.abi, deployedAddress)