How to calculate the amount to transfer to completely empty an account?

So let's say my wallet is 1 eth, I need to completely empty it and I'm going to do it this way

Var value = web3.toWei(1) - gas

Is that right?

• – eth
Aug 1 '17 at 6:00

Yes. You will need to figure out how much gas (in ETH) the transaction will cost, but luckily simple ETH transfers are exactly 21,000 gas (I think, double check this number). This means to know how much ETH will be spent on gas you will need to multiply that by the chosen gas price (e.g., 10^10).

So your calculation will need to look something like this:

var gasPrice = 20*10**9;
var gas = 21000;
var attoethForGas = gasPrice * gas;
var amountToSend = web3.toWei(1) - attoethForGas;
• If I take this gas as 5000 and I can't completely empty my account（unused gas is refunded）
– ali
Aug 1 '17 at 3:10
• @D.Doy I updated the answer to include a code example, let me know if that helps clear things up. Aug 1 '17 at 3:13
• Thank you for your answer, but it seems that it didn't prevent the refund from gas too big. If it were to be cleared, do I have to make gas small enough?
– ali
Aug 1 '17 at 5:43
• Hmm, I'm not sure what your problem might be, I'm reasonably confident that the above is the way to send everything. Can you share the code you have that isn't working? There should be no gas refund for an ETH transfer, even if it zeros out the balance. Aug 1 '17 at 14:20

In order to calculate an exact value to send, you must use precise calculations which JavaScript doesn't give you out of the box. Luckily, web3.js already returns a special BigNumber object from eth.getBalance(). In order to execute precise math, you need to use BigNumber methods instead of using default arithmetic operators. For example:

gasPrice = new BigNumber(web3.toWei('0.6', 'gwei'))
cost = gasPrice.mul(21000)
value = eth.getBalance(eth.accounts).sub(cost)

Constants were pulled from these sources at time of posting:

• ethgasstation.info is actually down at the moment, 0.6 gwei was just a fairly stable price I saw before it went down. Aug 1 '17 at 17:44