0

Here is my code :

var Web3 = require('web3');
var fs = require("fs");
var Artifactor = require("truffle-artifactor");
var provider = new Web3.providers.HttpProvider("http://localhost:8545");
var contract = require("truffle-contract");
var temp = require("temp").track();
var path = require("path");
var requireNoCache = require("require-nocache")(module);

var toAddress = null;
var toAmount = 0;
var web3 = null;
var web3Provider = null;
var balance = 0;
var contracts = {};
var account = null;
var callback = function(error, result) {if (!error) {} else {console.log(error)}}

function getProvider() {
  if (web3 !== null) {
    web3Provider = web3.currentProvider;
    web3 = new Web3(web3Provider);
  } else {
    web3Provider = new Web3.providers.HttpProvider('http://localhost:8545');
    web3 = new Web3(web3Provider);
  }
}

function getContract() {
  var DINRegistryArtifact = require('./build/contracts/DINRegistry.json');
  contracts.DINRegistry = contract(DINRegistryArtifact);
  contracts.DINRegistry.setProvider(web3Provider);
  networkCheck();
  getNewDIN();
}

function networkCheck() {
  web3.version.getNetwork((err, netId) => {
    if (err) {
      console.log(err)
      return
    }
    switch (netId) {
      case '1':
        console.log('This is mainnet')
        break
      case '2':
        console.log('This is the deprecated Morden test network.')
        break
      case '3':
        console.log('This is the ropsten test network.')
        break
      default:
        console.log('This is an unknown network.')
    }
  });
}

function getNewDIN() {
  // console.log('getting balances...')
  web3.eth.getAccounts((error, accounts) => {
    if (error) {
      console.log(error)
      return
    }
    this.account = accounts[0]

    console.log(contracts.DINRegistry);
    contracts.DINRegistry.at("0x4c70da2e04d097cca503832dc93be7ae58134c4a")
      .then(function(instance) {
        var DINRegistryInstance = instance;
        web3.eth.defaultAccount = this.account;
        console.log(web3.eth.defaultAccount);

        return DINRegistryInstance.registerNewDIN()
          .then(function(din) {
            console.log(din);
            return din;
          })
      })
      .then((result) => {
        return result;
        // console.log('new din is ' + result);
      })
      .catch((err) => {
        console.log(err.message)
      })
  })
}

getProvider()
getContract()

The code returns the error (node:9466) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: invalid address on running it. I don't understand what is causing the error. I have set the web3.eth.defaultAccount which was recommended by other answers.

0

I think the problem is that you actually set defaultAccount to undefined here.

this.account = accounts[0]

contracts.DINRegistry.at("0x4c70da2e04d097cca503832dc93be7ae58134c4a")
  .then(function(instance) {
    web3.eth.defaultAccount = this.account;

The problem is that this is replaced when you call function(instance) { ... in then.

You can refer to MDN for more information:

A function's this keyword behaves a little differently in JavaScript compared to other languages. In most cases, the value of this is determined by how a function is called. It can't be set by assignment during execution, and it may be different each time the function is called.

Or just try this instead

web3.eth.getAccounts((error, accounts) => {
    if (error) {
      console.log(error)
      return
    }
    web3.eth.defaultAccount = accounts[0];
  • Thanks for catching that. That is a typo as I had copied the code from the app I am building to a side where I am testing things and it was left by mistake. The actual problem turned out to be that for every function of the contract called, I need to mention my address. So something like : return DINRegistryInstance.registerNewDIN(from: {account}) works. Also, I added the event callback and used event.stopWatching() in registerNewDIN()'s .then definition to make the event listening work too. – lee huang Aug 25 '17 at 8:18

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.