Skip to main content

Event Catcher Usage

warning

Event catcher is still under development, and will got update frequently.

warning

Currently, event catcher is only available as single node. But soon will be available as a cluster of nodes for high availability and scalability.

API

For registering a new contract/event, call this API:

POST https://event-stg.layerg.xyz/api/v1/contracts
BODY sample:
{
"chainId": 2484,
"contractAddress": "0x176581dbb0a5d0ccbb7395f2aafd63e52e3936d7",
"eventSignature": "TransferSingle(address indexed, address indexed, address indexed, uint256, uint256)",
"eventAbi": "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"}]",
"startBlock": 44445660
}

For querying events in the past, call this API:

GET https://event-stg.layerg.xyz/api/v1/events?contractAddress={address}&chainId={chainId}&eventSignature={eventName}

For streaming real-time events, call this API:

URL https://event-mqtt-stg.layerg.xyz/api/v1/events/stream?contractAddress={address}&chainId={chainId}&eventSignature={eventName}

Response:

{
"blockNumber": number,
"txHash": string,
"data": string,
"chainId": number
}

Runtime

As you use LayerG runtime, you can use it directly as below:

First, setup the environment in the configuration file:

mqtt:
broker_url: "wss://event-mqtt-stg.layerg.xyz"
client_id: "event-pool-test-client"
api_url: "https://event-stg.layerg.xyz"
warning

Soon we will move to grpc for better performance and security purposes.

Past event querying:

res, _ := lg.EventQuery(ctx, runtime.EventQuery{
ChainId: 2484,
ContractAddress: "0xeddd02437aa5db6def90ff32c329decd2bcb86db",
TxHash: "0x9cb1bbf5f6e47452feeec0240deaefea56ca967543049b32e73953f62fc0e13e", //optional, if not provided, it will return all events for the contract
})

Real-time event streaming sample usage:

lg.EventSubscribe(ctx, runtime.EventSubscription{
ChainId: 2484,
ContractAddress: "0xeddd02437aa5db6def90ff32c329decd2bcb86db",
EventName: "Transfersingle",
}, func(ctx context.Context, event runtime.EventData) error {
logger.Info("Received event: %v", event)
type TransferData struct {
From string `json:"from"`
ID string `json:"id"`
Operator string `json:"operator"`
To string `json:"to"`
Value string `json:"value"`
}

var transferData TransferData
if err := json.Unmarshal([]byte(event.Data), &transferData); err != nil {
logger.Error("Failed to unmarshal transfer data: %v", err)
return err
}

logger.Info("Decoded event: %v", transferData.From)
logger.Info("Decoded event: %v", transferData.ID)
logger.Info("Decoded event: %v", transferData.Operator)
logger.Info("Decoded event: %v", transferData.To)
logger.Info("Decoded event: %v", transferData.Value)
return nil
})