Receipt
After a transaction is confirmed in the blockchain, a transaction response would
be returned along with a receipt
.
Example of a transaction response with the receipt
structure:
{
"id": "1",
"jsonrpc": "2.0",
"result": {
// others
"receipt": {
"accepted": true,
"cumulative_gas": "878",
"epoch_num": "589742",
"success": true,
"transitions": [
{
"addr": "0x9a65df55b2668a0f9f5f749267cb351a37e1f3d9",
"depth": 0,
"msg": {
"_amount": "50000000000000",
"_recipient": "0xc0e28525e9d329156e16603b9c1b6e4a9c7ed813",
"_tag": "onFundsReceived",
"params": []
}
}
]
},
"senderPubKey": "0x03DE40DF885B0E334D53FF5E5554589AAF46F2339FEBEE93213F2CCE52D1F488F4",
"signature": "0xB19AB66C4410EE4833A9C5DEE600471DB4D711F6B61D2312988E6E70CC655409F18BB42BB6940B6263C8EA5CE08CAEC06111BDF19BE00D7E15F25515CAA45DAA",
"toAddr": "9a65df55b2668a0f9f5f749267cb351a37e1f3d9",
"version": "65537"
}
}
Depending on the type of transaction (e.g. payment, contract call, chain
contract call) being processed, the receipt
may return different data.
Params
This section lists all the possible receipt
returned values.
Name | Description |
---|---|
cumulative_gas |
The total amount of gas used when it is executed in the particular block |
epoch_num |
The block number when this transaction is allocated to |
errors |
Contains the error code if the transaction has any errors |
event_logs |
Contains the parameters of the contract transition being invoked |
exceptions |
Returns the exception messages if there is an error when invoking contract |
transitions |
Contains the parameters used to call the specific transition |
success |
Returns true if the transaction is successfully executed, false otherwise |
Events
event_logs
are events created as a result of invoking the contract calls.
For instance, in the following sample contract code, calling setHello
transition would trigger a "setHello
" event name.
(* HelloWorld Sample *)
transition setHello (msg : String)
is_owner = builtin eq owner _sender;
match is_owner with
| False =>
e = {_eventname : "setHello()"; code : not_owner_code};
event e
| True =>
welcome_msg := msg;
e = {_eventname : "setHello()"; code : set_hello_code}; (* trigger event here *)
event e
end
end
If we execute this transition, the returned receipt
is as follows:
{
"id": "1",
"jsonrpc": "2.0",
"result": {
// others
"receipt": {
"accepted": false,
"cumulative_gas": "668",
"epoch_num": "1474081",
"event_logs": [
{
"_eventname": "setHello()",
"address": "0xde8d3637aec06d6c7da49aeb9c7409ac44a98138",
"params": [
{
"type": "Int32",
"value": "2",
"vname": "code"
}
]
}
],
"success": true
}
}
}
Observed that the setHello
event is returned as the setHello
transition is
successfully executed by the blockchain.
Transitions
A transitions
object is returned if the contract is invoking other procedures
or another contract transition. A transition
object provides details of the
"transition chain" such as the address of the initiator, the tag (transition
name), the recipient, the params .etc.
Example of a transition
object:
{
"id": "1",
"jsonrpc": "2.0",
"result": {
"ID": "52605cee6955b3d14f5478927a90977b305325aff4ae0a2f9dbde758e7b92ad4",
"amount": "50000000000000",
"data": "{\"_tag\":\"sendFunds\",\"params\":[{\"vname\":\"accountValues\",\"type\":\"List (AccountValue)\",\"value\":[{\"constructor\":\"AccountValue\",\"argtypes\":[],\"arguments\":[\"0xc0e28525e9d329156e16603b9c1b6e4a9c7ed813\",\"50000000000000\"]}]}]}",
"gasLimit": "25000",
"gasPrice": "1000000000",
"nonce": "3816",
"receipt": {
"accepted": true,
"cumulative_gas": "878",
"epoch_num": "589742",
"success": true,
"transitions": [
{
"addr": "0x9a65df55b2668a0f9f5f749267cb351a37e1f3d9",
"depth": 0,
"msg": {
"_amount": "50000000000000",
"_recipient": "0xc0e28525e9d329156e16603b9c1b6e4a9c7ed813",
"_tag": "onFundsReceived",
"params": []
}
}
]
}
// ...
}
}
In the above example, from the data
object we can observe the sendFunds
transition is invoked here, presumably to send 50000000000000
to
0xc0e28525e9d329156e16603b9c1b6e4a9c7ed813
. Notice that in the transitions
object, the onFundsReceived
procedure is subsequently invoked internally, and
we can observe the recipient and amount is indeed the transmitted amount.
Exception
A exceptions
object is returned if the contract specifically raise an error
when it encounters issues invoking the transition, for example, invoking a
transfer transition without sufficient balance .etc. A exceptions
object
contains the line
number of the contract that raised the error and the
corresponding exception message
.
Example of an exceptions
object:
"receipt": {
// ... // others
// ...
"exceptions": [
{
"line": 87,
"message": "Exception thrown: (Message [(_exception : (String \"Error\")) ; (code : (Int32 -2))])"
},
{
"line": 100,
"message": "Raised from IsAdmin"
},
{
"line": 137,
"message": "Raised from ConfigureUsers"
}
]
}