5

updated the title and more details added.
I am not able to send the ether to contract operation or contract via Web3.js code and Metamask (blockchain browser plugin). Please see the original post for more details.

  • In original post please skip the first code snippet.
  • The second code snippet shows what I wrote to send the transaction to contract. It specifies "from address", "to address", "the value of the transaction", and "method" to invoke.
  • Metamask screenshot, which shows every detail accurately, however amount field is still blank. I thought it should have taken from value field of passed transaction.

    Maybe I am missing something here, any help to resolve this is highly appreciated.


original post


I am trying to create a contract via web3.js. It works fine. However, need to send ether while creating contract. how do that via web3.js. Please find the code which I am using for creating the contract.

function createContract() {
        web3.eth.getAccounts(function(error, result) {
            var browser_safebuy_sol_safebuyContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"seller","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"abort","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"value","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buyer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"confirmReceived","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"demandRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"deposit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"confirmPurchase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"inputs":[],"payable":true,"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Aborted","type":"event"},{"anonymous":false,"inputs":[],"name":"PurchaseConfirmed","type":"event"},{"anonymous":false,"inputs":[],"name":"ItemReceived","type":"event"},{"anonymous":false,"inputs":[],"name":"DepositReceived","type":"event"}]);
            var browser_safebuy_sol_safebuy = browser_safebuy_sol_safebuyContract.new(
               {
                 from: result[0], 
                 data: '0x60606040526000600360146101000a81548160ff0219169083600281111561002357fe5b021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034600181905550346000819055507ffb606260831153b2b5b9f4a20fdfc7c2394d87a166d6a64035e3d5c11ada9baf60405160405180910390a161077c806100b26000396000f30060606040523615610097576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806308551a531461009c57806335a063b4146100f15780633fa4f245146101065780637150d8ae1461012f57806373fac6f014610184578063c19d93fb14610199578063ca973f07146101d0578063d0e30db0146101e5578063d69606971461020e575b600080fd5b34156100a757600080fd5b6100af610218565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fc57600080fd5b61010461023e565b005b341561011157600080fd5b610119610386565b6040518082815260200191505060405180910390f35b341561013a57600080fd5b61014261038c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561018f57600080fd5b6101976103b2565b005b34156101a457600080fd5b6101ac61050f565b604051808260028111156101bc57fe5b60ff16815260200191505060405180910390f35b34156101db57600080fd5b6101e3610522565b005b34156101f057600080fd5b6101f8610668565b6040518082815260200191505060405180910390f35b61021661066e565b005b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561029a57600080fd5b60008060028111156102a857fe5b600360149054906101000a900460ff1660028111156102c357fe5b1415156102cf57600080fd5b7f72c874aeff0b183a56e2b79c71b46e1aed4dee5e09862134b8821ba2fddbf8bf60405160405180910390a16002600360146101000a81548160ff0219169083600281111561031a57fe5b0217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6001549081150290604051600060405180830381858888f19350505050151561038357600080fd5b50565b60005481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561040e57600080fd5b600180600281111561041c57fe5b600360149054906101000a900460ff16600281111561043757fe5b14151561044357600080fd5b7fe89152acd703c9d8c7d28829d443260b411454d45394e7995815140c8cbcbcf760405160405180910390a16002600360146101000a81548160ff0219169083600281111561048e57fe5b0217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050151561050c57600080fd5b50565b600360149054906101000a900460ff1681565b600180600281111561053057fe5b600360149054906101000a900460ff16600281111561054b57fe5b14151561055757600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105b357600080fd5b62278d0060045401421115156105c857600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050151561064157600080fd5b6002600360146101000a81548160ff0219169083600281111561066057fe5b021790555050565b60015481565b600080600281111561067c57fe5b600360149054906101000a900460ff16600281111561069757fe5b1415156106a357600080fd5b60005434148015156106b457600080fd5b7fd5d55c8a68912e9a110618df8d5e2e83b8d83211c57a8ddd1203df92885dc88160405160405180910390a14260048190555033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360146101000a81548160ff0219169083600281111561074757fe5b021790555050505600a165627a7a72305820d5114b3793f81efb23ccdd1b6d7237f337b13bb75cc42954373733d730fcadd00029', 
                 gas: '4700000'
               }, function (e, contract){
                console.log(e, contract);
                if (typeof contract.address !== 'undefined') {
                     console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
                }
             })
        });
 }

I did some more investigation and tried to send ether via web3.js to smart contract's method. I used web3.eth.sendTransaction operation and passed ether via "value" attribute. However metamask is not showing the ether value. please find the code and screenshot. Appreciate any help.

function sendDeposit() {
        web3.eth.getAccounts(function(error, result) {
            web3.eth.sendTransaction(
                {from:result[0],
                to:"0x5333752f6d1007f8d4dabaca20afce38369de2a5",
                value:  "0x30D40", //200000 Wei
                data: "0x06cb4bcd"
                    }, function(err, transactionHash) {
              if (!err)
                console.log(transactionHash); 
            });
        });

    }

enter image description here

  • You have to make your constructor payable. – Ismael Oct 3 '17 at 15:55
  • 1
    Hi Ismael, sendDeposit method is contract is payable, still it is not working. As I described above, the metamask is showing amount as 0 eth, however the value field for send transaction is 200000 Wei. That is the problem. Could you please help.. – user1687711 Oct 5 '17 at 23:46
  • I am still struggling to understand how, this is duplicate. The query is not how to send eth to a contract, which I can do it via remix or ethereum wallet. However it doesn't work with metamask. I hope, it is clear. Please note all the required operation in my contract are maked as "payable" – user1687711 Oct 5 '17 at 23:48
  • Sorry, the original title was "Sending ether while creating contract via web3.js" and the duplicated question answer that. Your real question was "Why contract balance is not updated after a transaction in metamask?". If you edit the title you can request to reopen the question. From ropsten.etherscan.io/address/… the balance is there. For the next time please read here stackoverflow.com/help/how-to-ask how to write a good question. – Ismael Oct 6 '17 at 1:47
  • 1
    Let me change the title to "Not able to send ether to contract via web3.js and Metamask" – user1687711 Oct 6 '17 at 8:03
1

Totally agree with @Rob Magier's answer,

web3.eth.getAccounts(function(error, result) {
            web3.eth.sendTransaction(
                {from: fromAddr,
                to: toAddr,
                value:  amount, 
                data: "0x06cb4bcd"
                    }, function(err, transactionHash) {
              if (!err)
                console.log(transactionHash); 
            });
        });

Note: 100000 Wei is only 0.0000000000001 ETH and Metamask showed as zero, and I changed that value to 1 Ether and the code worked for me.

Here is the method you can change your wei to ether,

const amount = web3.toWei(0.5, 'ether');

Thanks, Hope this helps you. Happy Coding :-)

0

In order for metamask to correctly show those details (I guess it's a bug on their side) I had to switch from using a callback syntax to promises:

this.state.ContractInstance.myPayableFunction({
  gas: 300000,
  from: this.state.web3.eth.coinbase,
  value: this.state.web3.toWei(myAmount, 'ether')
}).then((res) => {

}).catch((error) => {

})
0

You have to also have in mind that the value you are trying to send is very small. I had similar problem before and the only reason was that Metamask was rounding my value.

200000 Wei is only 0.0000000000002 ETH and Metamask will show it as zero. According to their code they only show 6 digits.

This is also an information I am getting from your comment:

This posted can be closed now. Even though metamask doesn't show the amount which is getting transferred in the UI. I could see in blockchain, ether balance is updated.

Which means that value is getting transferred and the only problem is in Metamask which is incorrectly showing value to be send due to the way it rounds transaction and balance values.

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.