I've compiled and deployed the following trivial smart contract:
pragma solidity ^0.4.7;
/// Trivial counter contract. Provides an external function which increments the counter
/// and replies the current value.
contract BasicCounter {
uint private counter = 0;
function incrementAndGet() external returns (uint) {
counter++;
return counter;
}
}
In the node
REPL I can instantiate a handle for the deployed smart contract:
let instance =
web3.eth.contract(/* the contract abi */))
.at(/* the contract address */);
Using the instance, I can invoke the external function incrementAndGet
:
let ret = instance.incrementAndGet();
The return value ret
is a hex string, i.e.
0xa768b61d2892dda6495b6b1529e4c81252f333f4ca4ffa18ea7408580366292d
If I convert it to a BigNumber
using web3
, i.e.
let value = web3.toBigNumber(ret);
console.log(`: <${value.toString(10)}>`)
I get the following value
current counter value: <75721254712088916818789556586747754611065627738232115122133311013811340585261>
This looks strange. The first invocation of incrementAndGet
should rather return something like 00000......00001
.
Any hint what is going wrong here? How to correctly unmarshal an uint value returned from a external function in a smart contract?