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
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
)
truffle deploy
to deploy on Ganache. The contract was already deployed. No changes were made.console.log()
ofcontract
prints all functions.