No se pueden llamar funciones desde el contrato usando web3.js

Así que tengo un Dapp y quiero llamar a una función desde un contrato implementado en Rinkeby. Uso Metamask para interactuar con la cadena de bloques.

Cuando uso las funciones en la consola, funcionan, pero cuando quiero llamar desde el código JS, ya no funcionan. Mi Dapp funciona en el puerto 3030.

Aquí está el código JS. Inicializando web3:

import Web3 from 'web3';

export let web3;

if (typeof web3 !== 'undefined') {
  web3 = new Web3(web3.currentProvider);
} else {
  // set the provider you want from Web3.providers
  web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:3030'));
}

Aquí está el archivo .js con diferentes funcionalidades:

import web3 from '../ethereum/web3.js';

var SapienTokenAddress = "0x9857D34e0a3Ea34518E6BC54eA32cfF544BA54b7"

var SapienTokenABI = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stake","type":"address"}],"name":"enableTransferToContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_controller","type":"address"}],"name":"changeController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableTransferToContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"increaseTotal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owned","type":"address"}],"name":"changeOwned","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"addToBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_owned","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

var SapienTokenBytecode = "60606040526040805190810160405280600b81526020017f53415049454e20434f494e00000000000000000000000000000000000000000081525060029080519060200190620000519291906200011b565b506040805190810160405280600381526020017f53504e0000000000000000000000000000000000000000000000000000000000815250600390805190602001906200009f9291906200011b565b50601260045560006005553415620000b657600080fd5b604051602080620011278339810160405280805190602001909190505080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001ca565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200015e57805160ff19168380011785556200018f565b828001600101855582156200018f579182015b828111156200018e57825182559160200191906001019062000171565b5b5090506200019e9190620001a2565b5090565b620001c791905b80821115620001c3576000816000905550600101620001a9565b5090565b90565b610f4d80620001da6000396000f3006060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100bf57806318160ddd1461014d578063307820dc14610176578063313ce567146101af5780633cebb823146101d857806370a08231146102115780637c432ef21461025e57806381fa54311461027357806395d89b411461029657806397ee470014610324578063a9059cbb1461035d578063b08079a6146103b7575b600080fd5b34156100ca57600080fd5b6100d26103f9565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101125780820151818401526020810190506100f7565b50505050905090810190601f16801561013f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015857600080fd5b610160610497565b6040518082815260200191505060405180910390f35b341561018157600080fd5b6101ad600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061049d565b005b34156101ba57600080fd5b6101c261058a565b6040518082815260200191505060405180910390f35b34156101e357600080fd5b61020f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610590565b005b341561021c57600080fd5b610248600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106b6565b6040518082815260200191505060405180910390f35b341561026957600080fd5b6102716106ff565b005b341561027e57600080fd5b61029460048080359060200190919050506107eb565b005b34156102a157600080fd5b6102a9610943565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102e95780820151818401526020810190506102ce565b50505050905090810190601f1680156103165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561032f57600080fd5b61035b600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109e1565b005b341561036857600080fd5b61039d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b07565b604051808215151515815260200191505060405180910390f35b34156103c257600080fd5b6103f7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610d17565b005b60028054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561048f5780601f106104645761010080835404028352916020019161048f565b820191906000526020600020905b81548152906001019060200180831161047257829003601f168201915b505050505081565b60005481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663893d20e86000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561052b57600080fd5b6102c65a03f1151561053c57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561057f57600080fd5b600160058190555050565b60045481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663893d20e86000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561061e57600080fd5b6102c65a03f1151561062f57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561067257600080fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663893d20e86000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561078d57600080fd5b6102c65a03f1151561079e57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107e157600080fd5b6000600581905550565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663893d20e86000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561087957600080fd5b6102c65a03f1151561088a57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061091a57503373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b151561092557600080fd5b61093a81600054610eea90919063ffffffff16565b60008190555050565b60038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109d95780601f106109ae576101008083540402835291602001916109d9565b820191906000526020600020905b8154815290600101906020018083116109bc57829003601f168201915b505050505081565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663893d20e86000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610a6f57600080fd5b6102c65a03f11515610a8057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ac357600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610b4457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515610b7e57600080fd5b610bd082600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f0890919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610c6582600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610eea90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663893d20e86000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610da557600080fd5b6102c65a03f11515610db657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e4657503373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b1515610e5157600080fd5b610ea381600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610eea90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000808284019050838110151515610efe57fe5b8091505092915050565b6000828211151515610f1657fe5b8183039050929150505600a165627a7a723058201a2c226e36e25d3037ffbea5afd48f008f5a65e4e0f3d334a02f995d1c81ef620029"

export function getCurrentPublicAddress() {

  web3.eth.getAccounts(function(error, result){
      if(!error)
        return result[0];
      else
        return error;
  });

}

export function getCurrentSPN() {

  var spnCoinContract = web3.eth.contract(SapienTokenABI).at(SapienTokenAddress);

  var notConnected = notWeb3Connected();

  if (!notConnected) {

  return spnCoinContract.balanceOf.call(String(getCurrentPublicAddress()), function(error, result){

    if (!error)
      console.log(result);

    else {
        console.log(error);
      }

    });

  }

}

export function notWeb3Connected() {

// Check the connection
if(!web3.isConnected()) {

  console.error("Not connected");

  return true;

}

return false;

}

Y en otro archivo importo las funciones y la consola registro sus resultados. Por ejemplo, hago esto:

import { getCurrentPublicAddress, getCurrentSPN } from '/imports/lib/pudding/manageSPN.js';

Y esto:

console.log(getCurrentAddress());
console.log(getCurrentSPN());

Cuando llamo a las funciones, arrojan errores:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

PD: uso meteorito -p 3030 para inicializar mi aplicación. PPS: Con getCurrentPublicAddress obtengo la clave pública de Metamask. Con la otra función obtengo la cantidad de tokens que acuñé para esta cuenta específica.

Al inicializar HttpProvider, debe pasar la dirección de su propia instancia de geth o usar un proveedor público como infura.io.

Respuestas (1)

Parece que en su getCurrentSPN()función, está haciendo referencia a un web3objeto que quizás no esté completamente inicializado.

No tengo claro lo que está importando en ese archivo, solo dice import web3 from '../ethereum/web3.js';, lo que para mí es un poco extraño, por lo general, lo que importa es la Web3clase, no una web3instancia.

Supongo que está tratando de importarlo desde export let web3;, pero entiendo que cuando importa un valor, que es una vista de solo lectura en ese módulo, no puede mutarlo y hacer que ese resultado se propague a los módulos de importación .

Si desea exportar una web3instancia desde ese primer archivo, probablemente debería exportar un objeto y hacer que una de sus propiedades se actualice una vez que se detecte web3, o simplemente hacer la detección de web3 en cada módulo individual.