guides Work with contracts Query/Subscribe for messages(events) How to work with contract event
How to work with contract events
About messages
Account messages are of 3 types:
External inbound (msg_type
=1 or ExtIn
). It is for example, deploy message or run message.
Internal message(msg_type
=0). It is when one contract calls another contract it sends an internal message. These messages are constructed with target contract ABI. Can be of 2 subtypes:
Internal outbound (IntOut
)
External outbound messages(msg_type
=2 or ExtOut
). These can be of 2 subtypes:
Return - these are generated by contract function's return.
Query/subscribe to messages
You can fetch events of you contract like this:
Copy query{
blockchain{
account(address:"-1:67f4bf95722e1bd6df845fca7991e5e7128ce4a6d25f6d4ef027d139a11a7964"){
messages(msg_type:[ExtOut, ExtIn, IntIn, IntOut],first:2){
edges{
node{
hash
body
created_at_string
}
cursor
}
pageInfo{
hasNextPage
}
}
}
}
}
Or subscribe to them:
Copy subscription{
messages(
filter:{
src:{
eq:"-1:67f4bf95722e1bd6df845fca7991e5e7128ce4a6d25f6d4ef027d139a11a7964"
}
msg_type:{
in:[0,1,2]
}
}
)
{
id
body
}
}
Usage
Query
See the full sample here https://github.com/everx-labs/sdk-samples/tree/master/core-examples/node-js/pagination
Read about used API here -> Account messages pagination .
Copy result = await client.net.query({
query: `query MyQuery($address: String!, $cursor: String, $count: Int, $start_seq_no: Int, end_seq_no: Int) {
blockchain {
account(address: $address){
messages(
master_seq_no_range: { start: $start_seq_no, end: $end_seq_no }
first: $count,
msg_type: [ExtOut, ExtIn, IntIn, IntOut],
after: $cursor
) {
edges {
node { id, created_at }
}
pageInfo {
endCursor
hasNextPage
}
}
}
}
}`,
variables:{address, cursor, count, start_seq_no, end_seq_no}
});
Subscribe
See the full sample here https://github.com/everx-labs/sdk-samples/tree/master/core-examples/node-js/subscribe-and-decode
To subscribe to all this. Don't forget to specify your own callback.
Copy const messageSubscription = await TonClient.default.net.subscribe_collection({
collection: "messages",
filter: {
dst: { eq: your-contract-address },
msg_type:{ in: [0,1,2] }
},
result: "boc"
}, <callback function>
});
Decode
See the full sample here https://github.com/everx-labs/sdk-samples/tree/master/core-examples/node-js/subscribe-and-decode
Copy const decoded = (await TonClient.default.abi.decode_message({
abi: abiContract(your-contract-abi),
message: message_boc,
}));
switch (decoded.body_type) {
case MessageBodyType.Input:
console.log(`External inbound message, function "${decoded.name}", parameters: `, JSON.stringify(decoded.value));
break;
case MessageBodyType.Output:
console.log(`External outbound message, function "${decoded.name}", result`, JSON.stringify(decoded.value));
break;
case MessageBodyType.Event:
console.log(`External outbound message, event "${decoded.name}", parameters`, JSON.stringify(decoded.value));
break;
}
Check out AppKit documentation for this use case.
Last updated 8 months ago