UNPKG

yamaswap-sdk

Version:
58 lines (52 loc) 2.06 kB
import { PublicKey } from "@solana/web3.js"; import { DexClient } from "../core/client"; import { ETFNotExistsError } from "./error"; import { ETFCreateParams } from "../types/params"; import { getAccount } from "@solana/spl-token"; import { deriveEtfTokenMintAccount } from "./getAddress"; import * as anchor from "@coral-xyz/anchor"; import { getAssociatedTokenAddressSync, Account } from "@solana/spl-token"; import { checkATAExists } from "./checks"; export interface ETFInfo { etfCoreAddress: PublicKey; creator: string; description: string; assets: Array<{ token: PublicKey; weight: number; }>; } export class ETFQueries { constructor(private client: DexClient) { } async getETFInfo(etfAddress: PublicKey): Promise<ETFInfo | string> { const [etfInfoAddress] = deriveEtfTokenMintAccount(this.client.program as unknown as anchor.Program, ["etf_token_v3", etfAddress]); try { const etfInfo = await this.client.program.account.etfToken.fetch(etfInfoAddress); return { etfCoreAddress: etfInfoAddress, creator: etfInfo.creator.toString(), description: etfInfo.description, assets: etfInfo.assets.map(item => ({ token: item.token, weight: item.weight })) }; } catch (error) { if (error instanceof Error && error.message.includes('Account does not exist')) { return `ETF不存在: ${etfAddress}`; } throw error; } } async getETFBalance(etfAddress: PublicKey, ownerAddress: PublicKey): Promise<number> { try { const tokenAccount = await checkATAExists(this.client, [etfAddress], ownerAddress); return Number(tokenAccount?.amount); } catch (error) { if (error instanceof Error && error.message.includes('Account does not exist')) { return 0; } throw error; } } }