Contract Events
Assuming that you have a subscription targeted to the events you are indexing, below are some instructions to get started making some more specific queries.
Events by contract id
In this example, we're querying events (within the constraints of our subscription) for Testnet's native token contract.
query MyQuery {
eventByContractId(
searchedContractId: "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC"
) {
edges {
node {
contractId
data
ledger
ledgerTimestamp
topic2
topic1
topic4
topic3
}
}
}
}
Example response:
{
"data": {
"eventByContractId": {
"edges": [
{
"node": {
"contractId": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC",
"data": "AAAACgAAAAAAAAAAAAAAAAX14QA=",
"ledger": 1976715,
"ledgerTimestamp": 1697125133,
"topic2": "AAAAEgAAAAAAAAAAlgxjlS3RNgkTERctfeiCrlUtOyt9BCzR4tRDDY9zmIE=",
"topic1": "AAAADwAAAAh0cmFuc2Zlcg==",
"topic4": "AAAADgAAAAZuYXRpdmUAAA==",
"topic3": "AAAAEgAAAAFkp3At7J1OWk8PiDhUMY2lWuneIYknC4OsmpJHxEYR7Q=="
}
},
{
"node": {
"contractId": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC",
"data": "AAAACgAAAAAAAAAAAAAAAAABgnY=",
"ledger": 1977257,
"ledgerTimestamp": 1697127978,
"topic2": "AAAAEgAAAAAAAAAAtXs1DVecP4w3jdgAVoD8DDcUkSryRVL3pjWQIbk1EZY=",
"topic1": "AAAADwAAAAh0cmFuc2Zlcg==",
"topic4": "AAAADgAAAAZuYXRpdmUAAA==",
"topic3": "AAAAEgAAAAAAAAAAPTdgJsV5ZyTSlS3RBk3s+JcreccjoCp3Vj7Z8jmU26k="
}
},
{
"node": {
"contractId": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC",
"data": "AAAACgAAAAAAAAAAAAAAAAAAA+g=",
"ledger": 1977723,
"ledgerTimestamp": 1697130446,
"topic2": "AAAAEgAAAAAAAAAAJYf9NMqmC02G4br+I6LKzbfLvGV8QeiHblDN8VQtkyI=",
"topic1": "AAAADwAAAAh0cmFuc2Zlcg==",
"topic4": "AAAADgAAAAZuYXRpdmUAAA==",
"topic3": "AAAAEgAAAAAAAAAAf1sKj1rp5aRGdzj/pa4Yh0Jg83YJhhCmvWdqZoi4zks="
}
},
{
"node": {
"contractId": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC",
"data": "AAAACgAAAAAAAAAAAAAAAlQL5AA=",
"ledger": 1977738,
"ledgerTimestamp": 1697130525,
"topic2": "AAAAEgAAAAAAAAAAJYf9NMqmC02G4br+I6LKzbfLvGV8QeiHblDN8VQtkyI=",
"topic1": "AAAADwAAAAh0cmFuc2Zlcg==",
"topic4": "AAAADgAAAAZuYXRpdmUAAA==",
"topic3": "AAAAEgAAAAAAAAAAf1sKj1rp5aRGdzj/pa4Yh0Jg83YJhhCmvWdqZoi4zks="
}
},
{
"node": {
"contractId": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC",
"data": "AAAACgAAAAAAAAAAAAAAAAX14QA=",
"ledger": 1978025,
"ledgerTimestamp": 1697132038,
"topic2": "AAAAEgAAAAAAAAAAlgxjlS3RNgkTERctfeiCrlUtOyt9BCzR4tRDDY9zmIE=",
"topic1": "AAAADwAAAAh0cmFuc2Zlcg==",
"topic4": "AAAADgAAAAZuYXRpdmUAAA==",
"topic3": "AAAAEgAAAAAAAAAADrWdipCyvgYDlv6kRpdNchs5UGHB3Dsol3VHKAS2tYE="
}
}
]
}
}
}
Note that the data for events is stored as base64-encoded XDR.
Events by topics
Mercury also allows you to query events given certain topics. For instance, let's index
all transfer events in our subscription to the address GAHLLHMKSCZL4BQDS37KIRUXJVZBWOKQMHA5YOZIS52UOKAEW22YDSXX:
query MyQuery {
eventByTopic(
t1: "AAAADwAAAAh0cmFuc2Zlcg=="
t3: "AAAAEgAAAAAAAAAADrWdipCyvgYDlv6kRpdNchs5UGHB3Dsol3VHKAS2tYE="
) {
edges {
node {
contractId
data
ledger
ledgerTimestamp
topic1
topic2
topic3
topic4
}
}
}
}
sample response:
{
"data": {
"eventByTopic": {
"edges": [
{
"node": {
"contractId": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC",
"data": "AAAACgAAAAAAAAAAAAAAAAX14QA=",
"ledger": 1978025,
"ledgerTimestamp": 1697132038,
"topic1": "AAAADwAAAAh0cmFuc2Zlcg==",
"topic2": "AAAAEgAAAAAAAAAAlgxjlS3RNgkTERctfeiCrlUtOyt9BCzR4tRDDY9zmIE=",
"topic3": "AAAAEgAAAAAAAAAADrWdipCyvgYDlv6kRpdNchs5UGHB3Dsol3VHKAS2tYE=",
"topic4": "AAAADgAAAAZuYXRpdmUAAA=="
}
}
]
}
}
}
Note: this assumes that you already know the exact structure of the events you're querying. In this example we know that topic1 (t1) holds the event kind (Symbol("transfer") in our case) and that topic3 (t3) holds an Address object for the public key
GAHLLHMKSCZL4BQDS37KIRUXJVZBWOKQMHA5YOZIS52UOKAEW22YDSXX. Building these xdrs must be done by the client and can be easily done with the existing stellar xdr tooling.