{"version":3,"file":"tokens.mjs","names":[],"sources":["../../src/commands/tokens.ts"],"sourcesContent":["/** List fungible token holdings (supports ENS) */\nimport { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport { parsePositiveInteger, print, withSelectedProvider } from \"./shared.js\";\n\nexport default defineCommand({\n  meta: {\n    name: \"tokens\",\n    description: \"List fungible token holdings for an address (supports ENS)\",\n  },\n  args: {\n    address: {\n      type: \"positional\",\n      description: \"Blockchain address or ENS name\",\n      required: true,\n    },\n    chain: {\n      type: \"string\",\n      alias: \"c\",\n      description: \"Chain\",\n    },\n    limit: {\n      type: \"string\",\n      alias: \"n\",\n      description: \"Max holdings listed, up to 100\",\n      default: \"50\",\n    },\n    provider: {\n      type: \"string\",\n      alias: \"p\",\n      description: \"Provider\",\n    },\n  },\n  async run({ args }) {\n    try {\n      const [{ resolveInput }, { clampMaxResults }] = await Promise.all([\n        import(\"../core/input.js\"),\n        import(\"../core/types.js\"),\n      ]);\n      const limit = clampMaxResults(\n        parsePositiveInteger(args.limit as string, \"Invalid --limit value\"),\n      );\n      await withSelectedProvider(\n        args.chain as string | undefined,\n        args.provider as string | undefined,\n        \"tokenBalances\",\n        async ({ chain, name, provider }) => {\n          const caps = provider.capabilities;\n          if (!caps.tokenBalances || !provider.getTokenBalances) {\n            consola.error(`Provider \"${name}\" does not support token balances`);\n            process.exit(1);\n          }\n          const { address } = await resolveInput(args.address as string, chain);\n          const holdings = await provider.getTokenBalances(address, chain, { nonZeroOnly: true });\n          const tokens = holdings.slice(0, limit);\n          const listed = tokens.length < holdings.length ? `, ${tokens.length} listed` : \"\";\n          print(`[${name}] ${holdings.length} tokens for ${address} on ${chain}${listed}`);\n          print(\"\");\n          for (const token of tokens) {\n            const usd = token.valueUsd ? ` ($${token.valueUsd.toFixed(2)})` : \"\";\n            print(\n              `  ${token.symbol}: ${token.balanceFormatted}${usd}  [${token.contract.slice(0, 10)}…]`,\n            );\n          }\n        },\n      );\n    } catch (error) {\n      consola.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n      process.exit(1);\n    }\n  },\n});\n"],"mappings":";;;AAKA,IAAA,iBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;EACJ,SAAS;GACP,MAAM;GACN,aAAa;GACb,UAAU;EACZ;EACA,OAAO;GACL,MAAM;GACN,OAAO;GACP,aAAa;EACf;EACA,OAAO;GACL,MAAM;GACN,OAAO;GACP,aAAa;GACb,SAAS;EACX;EACA,UAAU;GACR,MAAM;GACN,OAAO;GACP,aAAa;EACf;CACF;CACA,MAAM,IAAI,EAAE,QAAQ;EAClB,IAAI;GACF,MAAM,CAAC,EAAE,gBAAgB,EAAE,qBAAqB,MAAM,QAAQ,IAAI,CAChE,OAAO,cAAmB,CAAA,MAAA,MAAA,EAAA,aAAA,GAC1B,OAAO,cAAmB,CAAA,MAAA,MAAA,EAAA,aAAA,CAC5B,CAAC;GACD,MAAM,QAAQ,gBACZ,qBAAqB,KAAK,OAAiB,uBAAuB,CACpE;GACA,MAAM,qBACJ,KAAK,OACL,KAAK,UACL,iBACA,OAAO,EAAE,OAAO,MAAM,eAAe;IAEnC,IAAI,CADS,SAAS,aACZ,iBAAiB,CAAC,SAAS,kBAAkB;KACrD,QAAQ,MAAM,aAAa,KAAK,kCAAkC;KAClE,QAAQ,KAAK,CAAC;IAChB;IACA,MAAM,EAAE,YAAY,MAAM,aAAa,KAAK,SAAmB,KAAK;IACpE,MAAM,WAAW,MAAM,SAAS,iBAAiB,SAAS,OAAO,EAAE,aAAa,KAAK,CAAC;IACtF,MAAM,SAAS,SAAS,MAAM,GAAG,KAAK;IACtC,MAAM,SAAS,OAAO,SAAS,SAAS,SAAS,KAAK,OAAO,OAAO,WAAW;IAC/E,MAAM,IAAI,KAAK,IAAI,SAAS,OAAO,cAAc,QAAQ,MAAM,QAAQ,QAAQ;IAC/E,MAAM,EAAE;IACR,KAAK,MAAM,SAAS,QAAQ;KAC1B,MAAM,MAAM,MAAM,WAAW,MAAM,MAAM,SAAS,QAAQ,CAAC,EAAE,KAAK;KAClE,MACE,KAAK,MAAM,OAAO,IAAI,MAAM,mBAAmB,IAAI,KAAK,MAAM,SAAS,MAAM,GAAG,EAAE,EAAE,GACtF;IACF;GACF,CACF;EACF,SAAS,OAAO;GACd,QAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG;GAChF,QAAQ,KAAK,CAAC;EAChB;CACF;AACF,CAAC"}