Project type: OnChain Data API

The most powerful real-time data pipelines | QuickNodeMenu* Products[[[[[[[Marketplace[[[[[[[Explore add-ons
* Solutions[By Use Case[[[[[[By Segment[[Integrations and Custom Solutions[[
* Chains[[[[[[[[[[[[View More
* DevelopersGetting StartedLearn about the different ways to integrate[[ [ [Browse all guides[[[[[[[
* Company[[[[[
Sign in account]( "Pricing")
Sign in account](# **The most powerful** real-time data pipelines
Eliminate the need for complex ETL pipelines and constant polling. Streams provides a continuous, push-based data flow that simplifies your data ingestion process.
* Create a free Stream 
Live##### Index the Ethereum chain
[Use template](##### All Uniswap exchange swaps
[Use template](##### All Arbitrum token transfers
## Instant access to multiple streaming datasets
* Blocks with receipts
* Block with receipts + debug_trace
* Block with receipts + trace_block
# Tools to turn raw data into your data
function main(data) { try { var data = data.streamData;
const addresses = [ "0x56220b7e25c7d0885159915cdebf5819f2090f57", "0x351e1b4079cf180971025a3b35dadea1d809de26", "0xa61551e4e455edebaa7c59f006a1d2956d46eecc" ]; var addressSet = new Set(addresses.map(address => address.toLowerCase())); var paddedAddressSet = new Set(addresses.map(address => '0x' + address.toLowerCase().slice(2).padStart(64, '0')));
var matchingTransactions = []; var matchingReceipts = [];
data.block.transactions.forEach(transaction => { let transactionMatches = (transaction.from && addressSet.has(transaction.from.toLowerCase())) || (transaction.to && addressSet.has(transaction.to.toLowerCase()));
if (transactionMatches) { matchingTransactions.push(transaction); } });
data.receipts.forEach(receipt => { let receiptMatches = receipt.logs && receipt.logs.some(log => log.topics && log.topics.length > 1 && (paddedAddressSet.has(log.topics[1]) || (log.topics.length > 2 && paddedAddressSet.has(log.topics[2]))) ); if (receiptMatches) { matchingReceipts.push(receipt); } });
if (matchingTransactions.length === 0 && matchingReceipts.length === 0) { return null; }
return { transactions: matchingTransactions, receipts: matchingReceipts }; } catch (e) { return {error: e.message}; } }Raw payloadShapeNeeds transformationSize20.2MBFiltered payloadShapeValid payload shapeSize1.2MBNew!
# Filter and Transform your data exactly how you want, so you get the data you need and pay for nothing more.
# Key-Value Store lets you target and access dynamic lists and sets, updatable from anywhere natively within streams and API.
| | walletStore \<List> | |
| --- | --- | --- |
| | | |
| --- | --- | --- |
function main(data) { var matchingTransactions = []; function checkAddress(address) { let result = qnContainsListItem("walletStore", address); return result; } data.streamData.block.transactions.forEach(transaction => { let transactionMatches = (transaction.from && checkAddress(transaction.from)) || (transaction.to && checkAddress(transaction.to)); if (transactionMatches) { matchingTransactions.push(transaction); } }); return matchingTransactions;}Load
# We focus on infrastructure, so you can focus on innovation
PostgreSQLAmazon S3WebhookSnowflakeComing soonComing soonComing soonComing soonComing soon# Guaranteed delivery to one of our many pre-built destinations
OR# Use Functions to enrich, process, and run custom code on our scalable serverless platform, enabling workflow creation without additional services.
Learn more about Functions* Filtered payload
function main(data) { try { var data = data.streamData;
const addresses = [ "0x56220b7e25c7d0885159915cdebf5819f2090f57", "0x351e1b4079cf180971025a3b35dadea1d809de26", "0xa61551e4e455edebaa7c59f006a1d2956d46eecc" ]; var addressSet = new Set(addresses.map(address => address.toLowerCase())); var paddedAddressSet = new Set(addresses.map(address => '0x' + address.toLowerCase().slice(2).padStart(64, '0')));
var matchingTransactions = []; var matchingReceipts = [];
data.block.transactions.forEach(transaction => { let transactionMatches = (transaction.from && addressSet.has(transaction.from.toLowerCase())) || (transaction.to && addressSet.has(transaction.to.toLowerCase()));
if (transactionMatches) { matchingTransactions.push(transaction); } });
data.receipts.forEach(receipt => { let receiptMatches = receipt.logs && receipt.logs.some(log => log.topics && log.topics.length > 1 && (paddedAddressSet.has(log.topics[1]) || (log.topics.length > 2 && paddedAddressSet.has(log.topics[2]))) ); if (receiptMatches) { matchingReceipts.push(receipt); } });
if (matchingTransactions.length === 0 && matchingReceipts.length === 0) { return null; }
return { transactions: matchingTransactions, receipts: matchingReceipts }; } catch (e) { return {error: e.message}; } }
function main(data) { var matchingTransactions = []; function checkAddress(address) { let result = qnContainsListItem("walletStore", address); return result; } data.streamData.block.transactions.forEach(transaction => { let transactionMatches = (transaction.from && checkAddress(transaction.from)) || (transaction.to && checkAddress(transaction.to)); if (transactionMatches) { matchingTransactions.push(transaction); } }); return matchingTransactions;}
function main(data) { try { var data = data.streamData;
const addresses = [ "0x56220b7e25c7d0885159915cdebf5819f2090f57", "0x351e1b4079cf180971025a3b35dadea1d809de26", "0xa61551e4e455edebaa7c59f006a1d2956d46eecc" ]; var addressSet = new Set(addresses.map(address => address.toLowerCase())); var paddedAddressSet = new Set(addresses.map(address => '0x' + address.toLowerCase().slice(2).padStart(64, '0')));
var matchingTransactions = []; var matchingReceipts = [];
data.block.transactions.forEach(transaction => { let transactionMatches = (transaction.from && addressSet.has(transaction.from.toLowerCase())) || (transaction.to && addressSet.has(transaction.to.toLowerCase()));
if (transactionMatches) { matchingTransactions.push(transaction); } });
data.receipts.forEach(receipt => { let receiptMatches = receipt.logs && receipt.logs.some(log => log.topics && log.topics.length > 1 && (paddedAddressSet.has(log.topics[1]) || (log.topics.length > 2 && paddedAddressSet.has(log.topics[2]))) ); if (receiptMatches) { matchingReceipts.push(receipt); } });
if (matchingTransactions.length === 0 && matchingReceipts.length === 0) { return null; }
return { transactions: matchingTransactions, receipts: matchingReceipts }; } catch (e) { return {error: e.message}; } }
## "The outstanding real-time performance helps us **deliver the freshest analytics** to our users – key to maintaining our competitive edge in the industry."
## Scalable, serverless, simple. See for yourself in seconds.
[Create a free Stream](# 60% Cheaper
Experience substantial savings compared to conventional methods when handling the same load by using more efficient resource utilization.
Achieve faster backfill speeds over traditional backfilling techniques, significantly reducing the time required for data synchronization.
Drastically reduce data engineering hours with automatic routing to your data warehouses, streamlining your workflows in seconds.
* BNB Smart Chain
* Write for us, make money! 
* Wall of Love
* Preferred Partner Network
* Terms & Conditions
* Write for us, make money! 
* Wall of Love
* Preferred Partner Network
* Terms & Conditions
###### Want QuickNode updates?
Our newsletter is full of free resources, QuickNode updates, Web3 insights, and more. Sign up below!