yamaswap-sdk
Version:
ETF SDK for Solana and Evm
58 lines (52 loc) • 2.06 kB
text/typescript
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;
}
}
}