instanciación de contrato web3

Estoy tratando de crear un contractobjeto con web3.

      var contract_abi = result['contracts']['Test']["interface"];

//[{"constant":false,"inputs":[],"name":"inc","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"odd","type":"bool"},{"indexed":false,"name":"x","type":"uint256"}],"name":"Incremented","type":"event"}];

var contract = new web3.eth.Contract(contract_abi);

Sin embargo, sigo recibiendo el error:

Uncaught Error: You must provide the json interface of the contract when instantiating a contract object.

Sin embargo, si copio la salida de mi consola contract_abi y creo directamente una variable como esta:

var contract_abi =
[{"constant":false,"inputs":[],"name":"inc","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"odd","type":"bool"},{"indexed":false,"name":"x","type":"uint256"}],"name":"Incremented","type":"event"}];

Funciona. ¿Que esta pasando? Gracias

Respuestas (4)

No estoy seguro de si su abi es correcto. Pero estoy escribiendo la forma de interactuar con el contrato inteligente y generar abi a partir del código fuente.

Generando abi desde el código fuente:

  • Pegue su código en el compilador de solidez remix-online.
  • Haga clic en comenzar a compilar para compilar su código.
  • Si su código se compila con éxito. Haga clic en Detailsla pestaña en la esquina superior derecha
  • Obtendrá una lista de propiedades que incluyen abi, copie el abi desde allí.

Accediendo al contrato usando web3:

  • Inicializar instancia web3

  • Use el siguiente código para obtener una instancia de contrato.

//For web3 versions 0.20.x
var contract = web3.eth.contract(contractAbi).at(contractAddress);
//For web3 1.0.x
var contract = new web3.eth.Contract(contractAbi,contractAddress);

¡Espero que esto ayude!

Por favor, ¿qué versión de web3? El método contractno existe al menos en la última versión, no aparece en la documentación de la API . Solo existe la clase Contrato, por lo que newse necesita la palabra clave, tal como se usó @user339946 en la descripción de la pregunta.

Acabo de encontrarme con este problema y pude resolverlo ejecutando JSON.parse() en el resultado de la interfaz, por lo que en su caso sería algo como:

var contract_abi = JSON.parse(result['contracts']['Test']["interface"])

la razón por la que está funcionando copiar el resultado de su línea de comando y configurarlo en la variable es porque cuando lo copia, técnicamente lo cambia de una cadena a un objeto, que es lo que haría JSON.parse :)

Esta debería ser la respuesta aceptada.

Para mí, no estaba recuperando el objeto abi del archivo json compilado.

esto funcionó:

var erc20ABI = JSON.parse(fs.readFileSync(file+"DummyERC20.json"));
var abi = erc20ABI.abi #essential
ERC20DummyContract = new web3.eth.Contract(erc20ABI, erc20Address);
Agregar .abi lo arregló para mí en1.0.0-beta.37

He tenido el mismo problema. Si está utilizando web3@1.0 y JavaScript, probablemente necesite ejecutar su ABI con JSON.parse().

Consulta este enlace