簡體   English   中英

僅在 Solana 上的交易數據中獲取 NFT 轉賬

[英]Get NFT transfers only in transaction data on Solana

給定一個錢包地址,我想找到發送給它的 NFT 的所有交易。 我有一些代碼,但不能 100% 確定它只是在做 NFT。 確定交易或解析指令是否與 NFT 相關的標識符是什么(SPL-Token??)

import {
    clusterApiUrl,
    ConfirmedSignaturesForAddress2Options,
    Connection,
    PublicKey,
} from '@solana/web3.js';
import fs from 'fs';
import path from 'path';

const WALLET = "<WALLET>"; // receiving NFTs
const LIMIT = 100;

(async () => {
    // Connect to the Solana cluster
    const c = new Connection(clusterApiUrl('mainnet-beta'));

    // The wallet receiving NFTs
    const p = new PublicKey(WALLET);

    // Query for signitures
    const opts: ConfirmedSignaturesForAddress2Options = {
        limit: 10,
    }
    const cs = await c.getConfirmedSignaturesForAddress2(p, opts);

    // Parse the signiture transaction data
    const td = [];
    for (let i = 0; i < cs.length; i++) {

        const s = cs[i];
        const d = await c.getParsedTransaction(s.signature, 'finalized');

        if (!d) continue;
        td.push(d);

    }

    // Build a map of mint source and destinations
    const tm: any = {};
    for (let i = 0; i < td.length; i++) {
        const d = td[i];

        d.meta?.postTokenBalances?.forEach(({ mint, owner }) => {

            if (!tm[mint]) tm[mint] = { destination: "", source: "" };
            if (owner === p.toString()) tm[mint].destination = owner;
            else tm[mint].source = owner;

        });
    }

    fs.writeFileSync(path.join(process.cwd(), 'nft-transfers.json'), JSON.stringify(tm, null, 2));

})();

您快到了! 如果要過濾 NFT,則需要檢查鑄幣廠以獲取已轉移的代幣,並檢查鑄幣廠的供應量是否為1 ,例如:

// Parse the signiture transaction data
    const td = [];
    for (let i = 0; i < cs.length; i++) {

        const s = cs[i];
        const d = await c.getParsedTransaction(s.signature, 'finalized');

        if (!d) continue;
        if (d.meta.preTokenBalances.includes(1) &&
            d.meta.preTokenBalances.includes(0) &&
            d.meta.postTokenBalances.includes(1) &&
            d.meta.postTokenBalances.includes(0)) {
            td.push(d);
        }
    }

這很麻煩,因為它只是檢查一些帳戶之前和之后有 1 和 0 令牌。 您可能可以使用find做一些更聰明的事情,以確保 1 和 0 的帳戶索引已更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM