import { Logger } from "../common"; import { LpTokenInfo, SplTokenInfo } from "./type"; const logger = Logger.from("token/util"); /** * Token list */ export class TokenList { constructor(private tokenList: (SplTokenInfo | LpTokenInfo)[]) {} /** * Filter token by mint of token list. * * @param mint - Token's mint address */ filterByMint = (mint: string) => { return this.tokenList.filter((token) => token.mint === mint); }; /** * Filter unique token by mint of token list, must and can only have one result. */ filterUniqueByMint = (mint: string, tokenType: T | "all" | "spl" | "lp" = "all") => { const result = this.tokenList.filter((token) => token.mint === mint); if (result.length === 0) { return logger.throwArgumentError(`No token found`, "mint", mint); } else if (result.length > 1) { return logger.throwArgumentError(`Multiple tokens found: ${result.length}`, "mint", mint); } const token = result[0]; if (tokenType === "spl" && "version" in token) { return logger.throwArgumentError("invalid SPL token mint", "mint", mint); } else if (tokenType === "lp" && !("version" in token)) { return logger.throwArgumentError("invalid LP token mint", "mint", mint); } return token as T extends "all" ? SplTokenInfo | LpTokenInfo : T extends "spl" ? SplTokenInfo : LpTokenInfo; }; /** * Get list of token list */ getList = () => { return this.tokenList; }; }