/ examples / common / ekubo.ts
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  }