0

I am trying to call the following simple function from web3.js but none of the function is being executed as I find no transaction entry in ganache.

pragma solidity ^0.5.11;

contract FirstContract {
    uint value;
    address sender; 
    
    function getValue() external view returns(uint) { 
        return value;
    }
    
    function setValue(uint _value) external {
        sender = msg.sender;
        value = _value;
    }
    
    function getMsgSender() external view returns(address) { 
        return sender;
    }
    
    
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Welcome to Meta Mask</title>
</head>
<body>
    <h2>Welcome to Meta Mask</h2>
    <div id="status"></div>
    <div id="address"></div>
    <div id="balance"></div>
    <script src="/node_modules/web3/dist/web3.min.js"></script>
    <script>        
        if (typeof window.ethereum !== 'undefined') {
         document.getElementById('status').innerHTML = "Meta Mask is installed";
         //window.ethereum.enable(); //To enable site for Meta mask
    } else {
        document.getElementById('status').innerHTML = "Meta Mask is not installed";
    }
    </script>
    <script>
        walletAddress = null;
        //Connecting to Blockchain
        var web3 = new Web3(Web3.givenProvider || "HTTP://127.0.0.1:9545");        
        var balance = null
        var id = null;
        var contactAddress = '0xB16bEc01bfe4F13D5e85A2F75F51893D797Df1F7'
        var abi = '[{"constant":true,"inputs":[],"name":"getValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getMsgSender","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]'
        const abiJson = JSON.parse(abi);
        const init = async () => {
            var contactAddress = '0xB16bEc01bfe4F13D5e85A2F75F51893D797Df1F7'
            var abi = '[{"constant":true,"inputs":[],"name":"getValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getMsgSender","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]'
            const abiJson = JSON.parse(abi);

            ac = await web3.eth.getAccounts()
            walletAddress = ac[0]
            console.log(walletAddress)
            const contract = new web3.eth.Contract(
                abiJson,
                walletAddress
            )
            //await contract.methods.setValue(5).send({from:walletAddress})
            contract.methods.setValue(5).send({from:walletAddress}, (err, txHash) => {
                    console.log('TX is', txHash)
                    console.log('Err is', err)
            })
        }
   
        init() // Call the functions
    </script>
</body>
</html>

It is not printing neither error not txHash value

Update:

I am using truffle deploy to deploy on Ganache. The contract was already deployed. No changes were made.

Update 2

enter image description here

Update 3 - truffle-config.js

/**
 * Use this file to configure your truffle project. It's seeded with some
 * common settings for different networks and features like migrations,
 * compilation and testing. Uncomment the ones you need or modify
 * them to suit your project as necessary.
 *
 * More information about configuration can be found at:
 *
 * trufflesuite.com/docs/advanced/configuration
 *
 * To deploy via Infura you'll need a wallet provider (like @truffle/hdwallet-provider)
 * to sign your transactions before they're sent to a remote public node. Infura accounts
 * are available for free at: infura.io/register.
 *
 * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate
 * public/private key pairs. If you're publishing your code to GitHub make sure you load this
 * phrase from a file you've .gitignored so it doesn't accidentally become public.
 *
 */

// const HDWalletProvider = require('@truffle/hdwallet-provider');
// const infuraKey = "fj4jll3k.....";
//
// const fs = require('fs');
// const mnemonic = fs.readFileSync(".secret").toString().trim();

module.exports = {
  /**
   * Networks define how you connect to your ethereum client and let you set the
   * defaults web3 uses to send transactions. If you don't specify one truffle
   * will spin up a development blockchain for you on port 9545 when you
   * run `develop` or `test`. You can ask a truffle command to use a specific
   * network from the command line, e.g
   *
   * $ truffle test --network <network-name>
   */

  networks: {
    // Useful for testing. The `development` name is special - truffle uses it by default
    // if it's defined here and no other network is specified at the command line.
    // You should run a client (like ganache-cli, geth or parity) in a separate terminal
    // tab if you use this network and you must also set the `host`, `port` and `network_id`
    // options below to some value.
    //
    // development: {
    //  host: "127.0.0.1",     // Localhost (default: none)
    //  port: 8545,            // Standard Ethereum port (default: none)
    //  network_id: "*",       // Any network (default: none)
    // },
    // Another network with more advanced options...
    // advanced: {
    // port: 8777,             // Custom port
    // network_id: 1342,       // Custom network
    // gas: 8500000,           // Gas sent with each transaction (default: ~6700000)
    // gasPrice: 20000000000,  // 20 gwei (in wei) (default: 100 gwei)
    // from: <address>,        // Account to send txs from (default: accounts[0])
    // websocket: true        // Enable EventEmitter interface for web3 (default: false)
    // },
    // Useful for deploying to a public network.
    // NB: It's important to wrap the provider as a function.
    // ropsten: {
    // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`),
    // network_id: 3,       // Ropsten's id
    // gas: 5500000,        // Ropsten has a lower block limit than mainnet
    // confirmations: 2,    // # of confs to wait between deployments. (default: 0)
    // timeoutBlocks: 200,  // # of blocks before a deployment times out  (minimum/default: 50)
    // skipDryRun: true     // Skip dry run before migrations? (default: false for public nets )
    // },
    // Useful for private networks
    // private: {
    // provider: () => new HDWalletProvider(mnemonic, `https://network.io`),
    // network_id: 2111,   // This network is yours, in the cloud.
    // production: true    // Treats this network as if it was a public net. (default: false)
    // }
  },

  // Set default mocha options here, use special reporters etc.
  mocha: {
    // timeout: 100000
  },

  // Configure your compilers
  compilers: {
    solc: {
      // version: "0.5.1",    // Fetch exact version from solc-bin (default: truffle's version)
      // docker: true,        // Use "0.5.1" you've installed locally with docker (default: false)
      // settings: {          // See the solidity docs for advice about optimization and evmVersion
      //  optimizer: {
      //    enabled: false,
      //    runs: 200
      //  },
      //  evmVersion: "byzantium"
      // }
    }
  },

  // Truffle DB is currently disabled by default; to enable it, change enabled: false to enabled: true
  //
  // Note: if you migrated your contracts prior to enabling this field in your Truffle project and want
  // those previously migrated contracts available in the .db directory, you will need to run the following:
  // $ truffle migrate --reset --compile-all

  db: {
    enabled: false
  }
};

Update 3

It's weird. The nodejs version works fine. Is it due to different way to fetch abi?

const Web3 = require('web3')
const MyContract = require('./build/contracts/FirstContract.json')
console.log(typeof MyContract.abi)
const init = async () => {
    // const web3 = new Web3('http://127.0.0.1:9545')
    let web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:7545"));
    id = await web3.eth.net.getId() 
    const deployedNetwork = MyContract.networks[id]
    console.log(deployedNetwork.address)
    contract = new web3.eth.Contract(
        MyContract.abi,
        deployedNetwork.address
    );


    ac = await web3.eth.getAccounts()
    walletAddress = ac[0]

    let result = await contract.methods.getValue().call()
    //await contract.methods.setValue(12).send({from:walletAddress})
    result = await contract.methods.getValue().call()
    console.log(result)
}

init()

Update 4 (index.html)

enter image description here

14
  • how are you deploying it? Jul 5 at 11:36
  • @AvocadoChocolate I am using truffle deploy to deploy on Ganache. The contract was already deployed. No changes were made.
    – Volatil3
    Jul 5 at 11:40
  • @AvocadoChocolate is there anyway to debug why function is not being called?
    – Volatil3
    Jul 5 at 11:45
  • did you use truffle migrate to migrate to the local blockchain? Jul 5 at 12:05
  • @AvocadoChocolate the contract exist in blockchain. The console.log() of contract prints all functions.
    – Volatil3
    Jul 5 at 12:08

Your Answer

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

Browse other questions tagged or ask your own question.