transactions.paginate()
Async generator that yields batches of transactions, automatically handling pagination.
Signature
transactions.paginate(
query?: ListTransactionsQuery,
pageSize?: number
): AsyncGenerator<Transaction[]>Parameters
query (optional)
- Type:
ListTransactionsQuery - Default:
{}
Filter options for transactions.
interface ListTransactionsQuery {
payer?: string; // Filter by payer address
pay_to?: string; // Filter by recipient address
entry_id?: string; // Filter by entry ID
}pageSize (optional)
- Type:
number - Default:
20 - Max:
100
Number of transactions per batch.
Returns
- Type:
AsyncGenerator<Transaction[]>
Yields arrays of transactions, one page at a time.
Usage
Basic Pagination
for await (const batch of grapevine.transactions.paginate()) {
console.log(`Processing ${batch.length} transactions`);
for (const tx of batch) {
console.log(`${tx.payer} → ${tx.pay_to}: ${tx.amount}`);
}
}With Filters
// Get all payments from a specific wallet
for await (const batch of grapevine.transactions.paginate({
payer: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb'
})) {
console.log(`Processing ${batch.length} payments`);
}Custom Page Size
// Use larger batches for efficiency
for await (const batch of grapevine.transactions.paginate({}, 100)) {
console.log(`Processing batch of ${batch.length}`);
}Collect All Transactions
async function getAllTransactions(query?: ListTransactionsQuery) {
const allTransactions: Transaction[] = [];
for await (const batch of grapevine.transactions.paginate(query, 100)) {
allTransactions.push(...batch);
console.log(`Loaded ${allTransactions.length} transactions...`);
}
return allTransactions;
}
// Usage
const myPayments = await getAllTransactions({ payer: myAddress });
console.log(`Total payments: ${myPayments.length}`);Calculate Total Revenue
async function calculateTotalRevenue(walletAddress: string) {
let totalRevenue = BigInt(0);
let transactionCount = 0;
for await (const batch of grapevine.transactions.paginate({
pay_to: walletAddress
})) {
for (const tx of batch) {
totalRevenue += BigInt(tx.amount);
transactionCount++;
}
}
return {
totalRevenue: formatUSDC(totalRevenue.toString()),
transactionCount
};
}
function formatUSDC(weiAmount: string): string {
const usdc = Number(BigInt(weiAmount)) / 1e6;
return `${usdc.toFixed(2)}`;
}Find Unique Buyers
async function getUniqueBuyers(sellerAddress: string) {
const buyers = new Set<string>();
for await (const batch of grapevine.transactions.paginate({
pay_to: sellerAddress
})) {
for (const tx of batch) {
buyers.add(tx.payer);
}
}
return Array.from(buyers);
}
// Usage
const buyers = await getUniqueBuyers(myAddress);
console.log(`You have ${buyers.length} unique buyers`);Export to CSV
async function exportTransactions(query: ListTransactionsQuery) {
const rows: string[] = ['ID,Date,Payer,Recipient,Amount,Asset,Entry ID,Hash'];
for await (const batch of grapevine.transactions.paginate(query, 100)) {
for (const tx of batch) {
rows.push([
tx.id,
new Date(tx.created_at * 1000).toISOString(),
tx.payer,
tx.pay_to,
formatUSDC(tx.amount),
tx.asset,
tx.entry_id || '',
tx.transaction_hash
].join(','));
}
}
return rows.join('\n');
}
// Usage
const csv = await exportTransactions({ pay_to: myAddress });
console.log(csv);With Progress Tracking
async function downloadAllTransactions(
query: ListTransactionsQuery,
onProgress?: (count: number) => void
) {
const transactions: Transaction[] = [];
for await (const batch of grapevine.transactions.paginate(query, 100)) {
transactions.push(...batch);
onProgress?.(transactions.length);
}
return transactions;
}
// Usage with React state
const [progress, setProgress] = useState(0);
const transactions = await downloadAllTransactions(
{ payer: address },
setProgress
);Early Exit
async function findFirstLargeTransaction(minAmount: bigint) {
for await (const batch of grapevine.transactions.paginate({}, 50)) {
for (const tx of batch) {
if (BigInt(tx.amount) >= minAmount) {
return tx; // Exit early when found
}
}
}
return null;
}
// Find first transaction over $100
const largeTx = await findFirstLargeTransaction(BigInt(100_000_000)); // 100 USDCNotes
- Authentication: Not required - public endpoint
- Efficiency: Uses cursor-based pagination for consistent results
- Memory: Processes one batch at a time, suitable for large datasets
- Ordering: Results are ordered by creation time, newest first
Related
- transactions.list() - Single page request
- feeds.paginate() - Similar pattern for feeds
- entries.paginate() - Similar pattern for entries