@orca-so/token-sdk
Advanced tools
export * from "./coingecko-client"; | ||
export * from "./metaplex-client"; | ||
export * from "./solanafm-client"; |
@@ -18,2 +18,3 @@ "use strict"; | ||
__exportStar(require("./coingecko-client"), exports); | ||
__exportStar(require("./metaplex-client"), exports); | ||
__exportStar(require("./solanafm-client"), exports); |
@@ -15,3 +15,4 @@ import { Connection } from "@solana/web3.js"; | ||
export declare class MetaplexProvider implements MetadataProvider { | ||
private readonly ctx; | ||
private readonly connection; | ||
private readonly client; | ||
private readonly queue; | ||
@@ -18,0 +19,0 @@ private readonly opts; |
@@ -7,7 +7,6 @@ "use strict"; | ||
exports.MetaplexProvider = void 0; | ||
const web3_js_1 = require("@solana/web3.js"); | ||
const common_sdk_1 = require("@orca-so/common-sdk"); | ||
const p_queue_1 = __importDefault(require("p-queue")); | ||
const umi_1 = require("@metaplex-foundation/umi"); | ||
const umi_bundle_defaults_1 = require("@metaplex-foundation/umi-bundle-defaults"); | ||
const mpl_token_metadata_1 = require("@metaplex-foundation/mpl-token-metadata"); | ||
const client_1 = require("./client"); | ||
const DEFAULT_CONCURRENCY = 5; | ||
@@ -18,3 +17,4 @@ const DEFAULT_INTERVAL_MS = 1000; | ||
const { concurrency = DEFAULT_CONCURRENCY, intervalMs = DEFAULT_INTERVAL_MS } = opts; | ||
this.ctx = (0, umi_bundle_defaults_1.createUmi)(connection.rpcEndpoint); | ||
this.connection = connection; | ||
this.client = new client_1.MetaplexHttpClient(); | ||
this.queue = new p_queue_1.default({ concurrency, interval: intervalMs }); | ||
@@ -24,32 +24,68 @@ this.opts = opts; | ||
async find(address) { | ||
try { | ||
const pda = (0, mpl_token_metadata_1.findMetadataPda)(this.ctx, { mint: (0, umi_1.publicKey)(address) }); | ||
const meta = await (0, mpl_token_metadata_1.fetchMetadata)(this.ctx, pda); | ||
let image; | ||
if (this.opts.loadImage) { | ||
const json = await (0, mpl_token_metadata_1.fetchJsonMetadata)(this.ctx, meta.uri); | ||
const pda = this.client.getMetadataAddress(new web3_js_1.PublicKey(address)); | ||
const info = await this.connection.getAccountInfo(pda); | ||
if (!info) { | ||
return null; | ||
} | ||
const meta = this.client.parseOnChainMetadata(pda, info.data); | ||
if (!meta) { | ||
return null; | ||
} | ||
let image; | ||
if (this.opts.loadImage) { | ||
const json = await this.client.getOffChainMetadata(meta); | ||
if (json) { | ||
image = json.image; | ||
} | ||
return { symbol: meta.symbol, name: meta.name, image }; | ||
} | ||
catch (e) { | ||
return null; | ||
} | ||
return { symbol: meta.symbol, name: meta.name, image }; | ||
} | ||
async findMany(addresses) { | ||
const mints = common_sdk_1.AddressUtil.toPubKeys(addresses); | ||
const pdas = mints.map((mint) => (0, mpl_token_metadata_1.findMetadataPda)(this.ctx, { mint: (0, umi_1.publicKey)(mint) })); | ||
const metas = await (0, mpl_token_metadata_1.fetchAllMetadata)(this.ctx, pdas); | ||
const pdas = mints.map((mint) => this.client.getMetadataAddress(mint)); | ||
// chunk the requests into groups of 100 since this is the max number of accounts | ||
// that can be fetched in a single request using `getMultipleAccountsInfo` | ||
let datas = Array(pdas.length); | ||
const dataHandlers = Array(); | ||
const chunkSize = 100; | ||
for (let i = 0; i < pdas.length; i += chunkSize) { | ||
const chunk = pdas.slice(i, i + chunkSize); | ||
dataHandlers.push(async () => { | ||
const chunkInfos = await this.connection.getMultipleAccountsInfo(chunk); | ||
for (let j = 0; j < chunkInfos.length; j++) { | ||
datas[i + j] = chunkInfos[j]?.data ?? null; | ||
} | ||
}); | ||
} | ||
await this.queue.addAll(dataHandlers); | ||
const metas = datas.map((data, index) => data ? this.client.parseOnChainMetadata(pdas[index], data) : null); | ||
let jsons = Array(metas.length); | ||
const jsonHandlers = Array(); | ||
if (this.opts.loadImage) { | ||
jsons = await this.queue.addAll(metas.map((meta) => async () => (0, mpl_token_metadata_1.fetchJsonMetadata)(this.ctx, meta.uri))); | ||
for (let i = 0; i < metas.length; i += 1) { | ||
const meta = metas[i]; | ||
if (!meta) { | ||
continue; | ||
} | ||
jsonHandlers.push(async () => { | ||
const json = await this.client.getOffChainMetadata(meta); | ||
jsons[i] = json; | ||
}); | ||
} | ||
} | ||
return new Map(metas.map((meta, index) => { | ||
const mint = mints[index].toBase58(); | ||
const json = jsons[index]; | ||
await this.queue.addAll(jsonHandlers); | ||
const map = new Map(); | ||
for (let i = 0; i < pdas.length; i += 1) { | ||
const mint = mints[i]; | ||
const meta = metas[i]; | ||
const json = jsons[i]; | ||
if (!meta) { | ||
continue; | ||
} | ||
const result = { symbol: meta.symbol, name: meta.name, image: json?.image }; | ||
return [mint, result]; | ||
})); | ||
map.set(mint.toString(), result); | ||
} | ||
return map; | ||
} | ||
} | ||
exports.MetaplexProvider = MetaplexProvider; |
{ | ||
"name": "@orca-so/token-sdk", | ||
"version": "0.2.0-alpha.1", | ||
"version": "0.2.0-alpha.2", | ||
"description": "SPL Token Utilities", | ||
@@ -11,5 +11,2 @@ "repository": "https://github.com/orca-so/orca-sdks", | ||
"dependencies": { | ||
"@metaplex-foundation/mpl-token-metadata": "^3.1.0", | ||
"@metaplex-foundation/umi": "^0.8.9", | ||
"@metaplex-foundation/umi-bundle-defaults": "^0.8.9", | ||
"@orca-so/common-sdk": "^0.3.1", | ||
@@ -16,0 +13,0 @@ "@solana/spl-token": "0.3.8", |
Sorry, the diff of this file is not supported yet
7
-30%34
6.25%1241
25.48%102896
-36.97%