Monitor ERC-721 Transfer events across multiple NFT collections to track collection activity, analyze whale movements, or build NFT analytics platforms.
Use Case
NFT transfer tracking enables you to:
- Build NFT transfer trackers and analytics
- Monitor collection activity and floor prices
- Track whale movements across collections
- Analyze trading patterns and market trends
Code Example
curl --compressed -X POST 'https://portal.sqd.dev/datasets/ethereum-mainnet/stream' \
-H 'Content-Type: application/json' \
-d '{
"type": "evm",
"fromBlock": 18000000,
"toBlock": 18010000,
"fields": {
"block": {
"number": true,
"timestamp": true
},
"log": {
"address": true,
"topics": true,
"transactionHash": true
}
},
"logs": [{
"address": [
"0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D",
"0x60E4d786628Fea6478F785A6d7e704777c86a7c6",
"0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB"
],
"topic0": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}]
}'
Try it yourself with the interactive query interface below:
Key Parameters
| Parameter | Description |
|---|
address | NFT collection contract addresses. Multiple addresses use OR logic |
topic0 | Transfer event signature (same for ERC-721 and ERC-20) |
topics[1] | From address (indexed parameter) |
topics[2] | To address (indexed parameter) |
topics[3] | Token ID (indexed parameter in ERC-721) |
ERC-721 Transfer events have the token ID in topics[3]. ERC-20 transfers don’t have this field (amount is in data instead).
Expected Output
{
"header": {
"number": 18000123,
"timestamp": 1697544779
},
"logs": [
{
"address": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x000000000000000000000000a9d1e08c7793af67e9d92fe308d5697fb81d3e43",
"0x00000000000000000000000028c6c06298d514db089934071355e5743bf21d60",
"0x0000000000000000000000000000000000000000000000000000000000000001"
],
"transactionHash": "0x123..."
}
]
}
Track Specific Wallet Activity
Monitor NFT transfers for a specific wallet address:
curl --compressed -X POST 'https://portal.sqd.dev/datasets/ethereum-mainnet/stream' \
-H 'Content-Type: application/json' \
-d '{
"type": "evm",
"fromBlock": 18000000,
"toBlock": 18010000,
"fields": {
"log": {
"address": true,
"topics": true,
"transactionHash": true
}
},
"logs": [{
"address": ["0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D"],
"topic0": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"],
"topic2": ["0x00000000000000000000000028c6c06298d514db089934071355e5743bf21d60"]
}]
}'
Track Minting Events
Monitor NFT mints (transfers from null address):
const blocks = await dataSource.getBlocks({
from: 18000000,
to: 18010000,
fields: {
log: { address: true, topics: true },
},
logs: [
{
address: ["0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D"],
topic0: ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"],
topic1: ["0x0000000000000000000000000000000000000000000000000000000000000000"], // From null
},
],
});
Minting is represented as a transfer from the zero address (0x000...000).
ERC-1155 Transfers
For ERC-1155 NFTs, use different event signatures:
// ERC-1155 TransferSingle event
const TRANSFER_SINGLE = "0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62";
// ERC-1155 TransferBatch event
const TRANSFER_BATCH = "0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb";
const blocks = await dataSource.getBlocks({
from: 18000000,
to: 18010000,
fields: {
log: { address: true, topics: true, data: true },
},
logs: [
{
address: ["0x..."], // ERC-1155 contract
topic0: [TRANSFER_SINGLE, TRANSFER_BATCH],
},
],
});
- Filter by collection: Specify exact contract addresses
- Use topic filters: Filter by from/to addresses at Portal level
- Batch processing: Query 10k-50k blocks at a time
- Minimal fields: Request only needed fields