Event logs
addLog(options)
Get event logs emitted by some or all contracts in the network. options
has the following structure:
{
// data requests
address?: string[]
topic0?: string[]
topic1?: string[]
topic2?: string[]
topic3?: string[]
range?: {from: number, to?: number}
// related data retrieval
transaction?: boolean
transactionLogs?: boolean
transactionTraces?: boolean
}
Data requests:
address
: the set of addresses of contracts emitting the logs. Omit to subscribe to events from all contracts in the network.topicN
: the set of values of topicN.range
: the range of blocks to consider.
Related data retrieval:
transaction = true
: the processor will retrieve all parent transactions and add them to thetransactions
iterable within the block data. Additionally it will expose them via the.transaction
field of each log item.transactionLogs = true
: the processor will retrieve all "sibling" logs, that is, all logs emitted by transactions that emitted at least one matching log. The logs will be exposed through the regularlogs
block data iterable and via.transaction.logs
for matching logs.transactionTraces = true
: the processor will retrieve the traces for all transactions that emitted at least one matching log. The traces will be exposed through the regulartraces
block data iterable and via.transaction.traces
.
Note that logs can also be requested by addTransaction()
and addTrace()
method as related data.
Selection of the exact data to be retrieved for each log and its optional parent transaction is done with the setFields()
method documented on the Field selection page. Some examples are available below.
Examples
- Fetch
NewGravatar(uint256,address,string,string)
andUpdateGravatar(uint256,address,string,string)
event logs emitted by0x2E645469f354BB4F5c8a05B3b30A929361cf77eC
. For each log, fetch topic set, log data. Fetch parent transactions with their inputs.
const processor = new EvmBatchProcessor()
.setGateway('https://v2.archive.subsquid.io/network/ethereum-mainnet')
.setRpcEndpoint('<my_eth_rpc_url>')
.setFinalityConfirmation(75)
.addLog({
address: ['0x2e645469f354bb4f5c8a05b3b30a929361cf77ec'],
topic0: [
// topic: 'NewGravatar(uint256,address,string,string)'
'0x9ab3aefb2ba6dc12910ac1bce4692cf5c3c0d06cff16327c64a3ef78228b130b',
// topic: 'UpdatedGravatar(uint256,address,string,string)'
'0x76571b7a897a1509c641587568218a290018fbdc8b9a724f17b77ff0eec22c0c',
],
transaction: true
})
.setFields({
log: {
topics: true,
data: true
},
transaction: {
input: true
}
})
Typescript ABI modules generated by squid-evm-typegen
provide event signatures/topic0 values as constants, e.g.
import * as gravatarAbi from './abi/gravatar'
// ...
topic0: [
gravatarAbi.events.NewGravatar.topic,
gravatarAbi.events.UpdatedGravatar.topic,
],
// ...
- Fetch every
Transfer(address,address,uint256)
event on Ethereum mainnet where topic2 is set to the destination address (a common but non-standard practice) and the destination isvitalik.eth
a.k.a.0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
. For each log, fetch transaction hash.
const processor = new EvmBatchProcessor()
.setGateway('https://v2.archive.subsquid.io/network/ethereum-mainnet')
.setRpcEndpoint('<my_eth_rpc_url>')
.setFinalityConfirmation(75)
.addLog({
topic0: [
// topic0: 'Transfer(address,address,uint256)'
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
],
topic2: [
// vitalik.eth
'0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045'
]
})
.setFields({
log: {
transactionHash: true
}
})
As you may observe, the address in the topic2
is a bit longer than usual (0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
, 42 chars).
This is caused by the fact that Squid SDK expects Bytes32[]
; therefore, the length has to be 66 chars long.
The possible quick fix is to pad the original address with zeros and prepend 0x
.
const address = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
const topic = '0x' + address.replace('x', '0').padStart(64, '0').toLowerCase()