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
})