Search code examples
ethereumweb3jsmetamask

How to connect web3.js 1.0.x to Metamsk


I am using web3.js 1.0.0-beta.36 to connect to the blockchain.

But unfortunately this code cannot connect to Metamask, if it has been enabled.

var metamask = false;
if (typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
    metamask = true; 
    web3.eth.defaultAccount = web3.eth.accounts[0];
} else {
    web3 = new Web3(new
    Web3.providers.HttpProvider(infuraUrl));
    var address = web3.eth.accounts.create().address;
}
myContract = new web3.eth.Contract(abi,contractAddress);
myContract.methods.Register((Name,Id).send({},function(error,result){
    if (! error)
        console.log(result);
    else
        console.log(error);
});

When we run this program with Metamsk it displays this error:

Error: Returned error: Error: MetaMask Tx Signature: User denied transaction signature.

but when I mention a fixed address it works:

myContract.methods.Register((Name,Id).send({from: '0x...'},function(error,result){
        if (! error)
            console.log(result);
        else
            console.log(error);
    });

For some reasons I can't bring the address itself in the source code and I want it to get the address from Metamask. What should I do?


Solution

  • Eureka!!! (without special Archimedes style!)

    Finally I found.

    window.addEventListener('load', async () => {
        // Modern dapp browsers...
        if (window.ethereum) {
            window.web3 = new Web3(ethereum);
            try {
                await ethereum.enable();
                var accounts= await web3.eth.getAccounts();
                var option={from: accounts[0] };
                var myContract = new web3.eth.Contract(abi,contractAddress);
                myContract.methods.RegisterInstructor('11','Ali')
                .send(option,function(error,result){
                    if (! error)
                        console.log(result);
                    else
                        console.log(error);
                });
            } catch (error) {
                // User denied account access...
            }
        }
        // Legacy dapp browsers...
        else if (window.web3) {
            window.web3 = new Web3(web3.currentProvider);
            // Acccounts always exposed
            web3.eth.sendTransaction({/* ... */});
        }
        // Non-dapp browsers...
        else {
            console.log('Non-Ethereum browser detected. You should consider trying MetaMask!');
        }
    });
    

    This connects to Metamask properly. Main problem was that our browsers are supermodern!!!