{"version":3,"sources":["jsdelivr-header.js","/npm/@minswap/minswap-tokens@1.0.8/src/adapters/blockFrostAdapter.ts","/npm/@minswap/minswap-tokens@1.0.8/src/utils.ts","/npm/@minswap/minswap-tokens@1.0.8/src/apis/marketcapApi.ts","/npm/@minswap/minswap-tokens@1.0.8/src/consts.ts","/npm/@minswap/minswap-tokens@1.0.8/src/apis/tokenApi.ts"],"names":[],"mappings":"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","file":"/npm/@minswap/minswap-tokens@1.0.8/build/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@minswap/minswap-tokens@1.0.8/build/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { BlockFrostAPI } from \"@blockfrost/blockfrost-js\";\nimport type { Adapter, BlockFrostOptions } from \"./types\";\n\nexport class BlockFrostAdapter implements Adapter {\n  private readonly blockFrost: BlockFrostAPI;\n\n  constructor(options?: BlockFrostOptions) {\n    this.blockFrost = new BlockFrostAPI(options);\n  }\n\n  async getAmountInAddress(address: string, tokenId: string): Promise<bigint> {\n    const values = address.startsWith(\"stake\")\n      ? await this.blockFrost.accountsAddressesAssetsAll(address)\n      : await this.blockFrost.addresses(address).then((resp) => resp.amount);\n    let amount = 0n;\n    for (const value of values) {\n      if (value.unit === tokenId) {\n        amount += BigInt(value.quantity);\n      }\n    }\n    return amount;\n  }\n\n  async getOnchainAmountOfAsset(assetId: string): Promise<bigint> {\n    const assetInfo = await this.blockFrost.assetsById(assetId);\n    return BigInt(assetInfo?.quantity);\n  }\n}\n","export function tryParseBigInt(value: string | number): bigint | null {\n  try {\n    return BigInt(value);\n  } catch {\n    return null;\n  }\n}\n\nexport function formatNumber(value: bigint, decimals: number): string {\n  if (value === 0n) {\n    return \"0\";\n  }\n  const numberString = value.toString();\n  if (numberString.length <= decimals) {\n    return `0.${numberString.padStart(decimals, \"0\")}`;\n  }\n\n  const postfix = numberString.slice(numberString.length - decimals).replace(/0+$/g, \"\");\n  const decimalPoint = postfix.length ? \".\" : \"\";\n  const prefix = numberString.slice(0, numberString.length - decimals);\n  return prefix + decimalPoint + postfix;\n}\n\nexport function isBigInt(value: string | number): boolean {\n  return !Number.isNaN(Number(value)) && value.toString() === tryParseBigInt(value)?.toString();\n}\n\nexport function isAPIEndPoint(str: string | number): boolean {\n  return typeof str === \"string\" && str.startsWith(\"https://\");\n}\n\nexport function isAddress(str: string | number): boolean {\n  return typeof str === \"string\" && (str.startsWith(\"addr\") || str.startsWith(\"stake\"));\n}\n\nexport async function getAmountFromURL(url: string, decimals: number): Promise<bigint | null> {\n  const response = await fetch(url);\n  let amount = await response.text();\n  // format to support APIs which return amount with decimal places\n  if (amount.includes(\".\")) {\n    const [prefix, postfix] = amount.split(\".\");\n    if (postfix.length > decimals) {\n      return null;\n    }\n    amount = prefix + postfix.padEnd(decimals, \"0\");\n  }\n\n  return tryParseBigInt(amount);\n}\n","import type { Adapter } from \"../adapters\";\nimport type { MarketCapInfoResponse, TokenMetadata } from \"../types\";\nimport { formatNumber, getAmountFromURL, isAPIEndPoint, isAddress, isBigInt } from \"../utils\";\n\nconst nullResponse = {\n  total: null,\n  circulating: null,\n};\n\nexport class MarketCapAPI {\n  private readonly adapter: Adapter;\n\n  constructor(adapter: Adapter) {\n    this.adapter = adapter;\n  }\n\n  /**\n   * Get market cap information of an asset.\n   * @param tokenInfo Token metadata followed by the token schema.\n   * @returns The maximum supply of an asset.\n   * @returns The circulating amount of an asset.\n   */\n  public async getMarketCapInfo(tokenInfo: TokenMetadata): Promise<MarketCapInfoResponse> {\n    if (!tokenInfo.maxSupply) {\n      throw new Error(\"MarketCap has not been configured.\");\n    }\n\n    const tokenId = tokenInfo.tokenId;\n    const decimals = tokenInfo.decimals;\n    let maxSupply: (string | number)[];\n\n    if (Array.isArray(tokenInfo.maxSupply)) {\n      maxSupply = tokenInfo.maxSupply;\n    } else {\n      maxSupply = [tokenInfo.maxSupply];\n    }\n\n    const total = await this.getAmountFromArray(tokenId, maxSupply, decimals);\n    if (total === null) {\n      return nullResponse;\n    }\n\n    if (!tokenInfo.circulatingOnChain && !tokenInfo.burn && !tokenInfo.treasury && !tokenInfo.treasuryOnChain) {\n      return {\n        total: formatNumber(total, decimals),\n      };\n    }\n\n    if (tokenInfo.treasuryOnChain) {\n      const treasuryRaw = tokenInfo.treasuryOnChain;\n\n      const treasury = await this.adapter.getAmountInAddress(treasuryRaw, tokenId);\n      return {\n        total: formatNumber(total - treasury, decimals),\n        circulating: formatNumber(total - treasury, decimals),\n      };\n    }\n\n    const [treasury, burn] = await Promise.all([\n      this.getAmountFromArray(tokenId, tokenInfo.treasury ?? [], decimals),\n      this.getAmountFromArray(tokenId, tokenInfo.burn ?? [], decimals),\n    ]);\n\n    if (burn === null || treasury === null) {\n      return nullResponse;\n    }\n\n    if (tokenInfo.circulatingOnChain) {\n      const circulatingOnChain = await this.getAmountFromArray(tokenId, tokenInfo.circulatingOnChain, decimals);\n\n      if (circulatingOnChain === null) {\n        return nullResponse;\n      }\n\n      return {\n        total: formatNumber(total - burn, decimals),\n        circulating: formatNumber(circulatingOnChain - treasury, decimals),\n      };\n    }\n\n    return {\n      total: formatNumber(total - burn, decimals),\n      circulating: formatNumber(total - treasury - burn, decimals),\n    };\n  }\n\n  private async getAmountFromArray(\n    token: string,\n    values: (string | number)[],\n    decimals: number,\n  ): Promise<bigint | null> {\n    const amounts = await Promise.all(\n      values.map((value) => {\n        if (isBigInt(value)) {\n          return BigInt(value);\n        }\n        if (isAddress(value)) {\n          return this.adapter.getAmountInAddress(value.toString(), token);\n        }\n        if (isAPIEndPoint(value)) {\n          return getAmountFromURL(value.toString(), decimals);\n        }\n        return this.adapter.getOnchainAmountOfAsset(value.toString());\n      }),\n    );\n    let amount = 0n;\n    for (const value of amounts) {\n      if (value === null) {\n        return null;\n      }\n      amount += value;\n    }\n    return amount;\n  }\n}\n","export const TOKENS_DIR = \"tokens\";\nexport const URL_REGEX = \"^https://.*$\";\nexport const ADDRESS_REGEX = \"^(addr|stake)[0-9a-zA-Z]+\";\nexport const ASSET_ID_REGEX = \"^(([a-fA-F0-9]{2}){28,})$\";\n","import { load } from \"js-yaml\";\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { TOKENS_DIR } from \"../consts\";\nimport type { GetTokenOptions, TokenMetadata } from \"../types\";\n\nexport class TokenAPI {\n  /**\n   * Get token's metadata by its ID.\n   * @param tokenId The concatenation of token policy ID and hex-coded token name.\n   * @returns The token metadata followed the token schema.\n   */\n  public async getToken(tokenId: string) {\n    try {\n      const __dirname = import.meta.dirname;\n      const filePath = path.join(__dirname, `${TOKENS_DIR}/${tokenId}.yaml`);\n      const tokenFileData = fs.readFileSync(filePath, \"utf-8\");\n      const tokenData: TokenMetadata = {\n        tokenId,\n        ...(load(tokenFileData) as Omit<TokenMetadata, \"tokenId\">),\n      };\n      return tokenData;\n    } catch (e) {\n      console.error(e);\n      return null;\n    }\n  }\n\n  /**\n   * Get all tokens' metadata by its ID.\n   * @param options Only verified or only tokens with market cap.\n   * @returns The list of all tokens' metadata.\n   */\n  public async getTokens(options?: GetTokenOptions) {\n    const __dirname = import.meta.dirname;\n    const directory = path.join(__dirname, TOKENS_DIR);\n    const tokenList: TokenMetadata[] = [];\n    const files = fs.readdirSync(directory);\n    for (const file of files) {\n      const tokenString = file.split(\".\")[0];\n      const token = await this.getToken(tokenString);\n      if (!token) {\n        continue;\n      }\n      const matchedVerify = !options?.verifiedOnly || (options?.verifiedOnly && token.verified);\n      const matchedMarketCap = !options?.hasMarketCapOnly || (options?.hasMarketCapOnly && !!token.maxSupply);\n      if (matchedVerify && matchedMarketCap) {\n        tokenList.push(token);\n      }\n    }\n    return tokenList;\n  }\n}\n"]}