33

How do I get the balance of a contract with solidity? I know geth has web3.eth.getBalance(), but that's to get the contract balance after it has been deployed.

Is there a standard way of doing this, or do I have to have a separate var that uint256 that keeps track of the total balance?

44

You can do this by calling address.balance. To get the contract's balance, just do this.balance. Read the docs.

Update: As of Solidity ^0.4.24, you need to do:

address(this).balance

(Copied from answer by Paul Berg)

22

Small update from my side:

enter image description here

You want to use the following, address(this).balance;

11

As of Solidity ^0.4.24, you need to do:

address(this).balance

Find an example here.

1

In case of invalid opcode, use a local variable of type address payable as workaround:

        address payable self = address(this);
        uint256 balance = self.balance;

In solidity 0.5.14, I get an invalid opcode, debugging showed me, that it is exactly here:

address(this).balance

Test result:

     Error: Returned error: VM Exception while processing transaction: invalid opcode
     at PromiEvent (node_modules/truffle/build/webpack:/packages/contract/lib/promievent.js:6:1)                                                              
      at TruffleContract.destroy (node_modules/truffle/build/webpack:/packages/contract/lib/execute.js:158:1)                                                 
      at Context.it (test/1_PactaTest.js:108:17)                                                                                                              
      at web3.eth.getBlockNumber.then.result (node_modules/truffle/build/webpack:/packages/core/lib/testing/testrunner.js:161:1)                              
      at <anonymous>                                                                                                                                          
      at process._tickCallback (internal/process/next_tick.js:188:7)                                                                                          

Debugging:

debug(development:0x7655ecf8...)> 

Pacta.sol:

115:     // move whole balance to the owner
116:     function withdraw() public managers isActive {
117:         uint256 part = address(this).balance / beneficiaries.length;
                            ^^^^^^^^^^^^^^^^^^^^^                        

debug(development:0x7655ecf8...)> 

Transaction halted with a RUNTIME ERROR.

This is likely due to an intentional halting expression, like assert(), require() or revert(). It can also be due to out-of-gas exceptions. Please inspect your transaction parameters and contract code to determine the meaning of this error.

Your Answer

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