[英]Solana: Get Candy Machine info from a NFT token using Js
[英]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.