ekubo.ts
1 // Ekubo Position NFT 2 import type { Block, Filter } from "https://esm.sh/@apibara/indexer/starknet"; 3 import { hash, uint256 } from "https://esm.sh/starknet"; 4 5 const contractAddress = 6 "0x07987d7865f098F348CaC18c853AE20eDdfe3ea1c029a49652e3ffd1b85F976E"; 7 8 export const filter: Filter = { 9 header: { 10 weak: true, 11 }, 12 events: [ 13 { 14 fromAddress: contractAddress, 15 keys: [hash.getSelectorFromName("Transfer")], 16 }, 17 ], 18 }; 19 20 // Iterate over all token transfers to pick the new NFT owner. 21 export function updateNftOwner({ header, events }: Block) { 22 const tokenIdCount = new Map<string, number>(); 23 const tokenIdToOwner = new Map<string, string>(); 24 25 for (const { event } of events) { 26 const dest = event.data[1]; 27 const tokenId = uint256.uint256ToBN({ 28 low: event.data[2], 29 high: event.data[3], 30 }); 31 tokenIdToOwner.set(tokenId.toString(), dest); 32 tokenIdCount.set( 33 tokenId.toString(), 34 (tokenIdCount.get(tokenId.toString()) ?? 0) + 1, 35 ); 36 } 37 38 return [...tokenIdToOwner.entries()].map(([tokenId, owner]) => ({ 39 entity: { 40 tokenId, 41 }, 42 update: { 43 "$set": { 44 tokenId, 45 owner, 46 updateAt: header?.timestamp, 47 updateAtBlock: header?.blockNumber, 48 }, 49 "$inc": { 50 transferCount: tokenIdCount.get(tokenId) ?? 0, 51 }, 52 }, 53 })); 54 }