{"version":3,"file":"tx.mjs","names":[],"sources":["../../src/commands/tx.ts"],"sourcesContent":["/** Transaction operations — history or detail (supports ENS) */\nimport { defineCommand } from \"citty\";\nimport type { ChainKey, Transaction } from \"../core/types.js\";\nimport {\n  failCommand,\n  parsePositiveInteger,\n  print,\n  reportCommandError,\n  withSelectedProvider,\n} from \"./shared.js\";\nimport type { SelectedProvider } from \"./shared.js\";\n\ntype TransactionMode = \"detail\" | \"history\";\n\nasync function transactionMode(\n  requested: string | undefined,\n  target: string,\n  chain: ChainKey,\n): Promise<TransactionMode> {\n  if (requested !== undefined && requested !== \"history\" && requested !== \"detail\") {\n    failCommand('Invalid --mode value (expected \"history\" or \"detail\")');\n  }\n  const { classifyInput } = await import(\"../core/input.js\");\n  return requested ?? (classifyInput(target, chain) === \"txhash\" ? \"detail\" : \"history\");\n}\n\n/* oxlint-disable-next-line typescript/prefer-readonly-parameter-types */\nfunction renderOpReturns(transaction: Transaction): void {\n  for (const payload of transaction.opReturn ?? []) {\n    const [first = \"\", ...rest] = (payload.text ?? payload.hex).split(\"\\n\");\n    print(`  OP_RETURN: ${first}`);\n    for (const line of rest) print(`    ${line}`);\n  }\n}\n\n/* oxlint-disable-next-line typescript/prefer-readonly-parameter-types */\nfunction renderTransaction(providerName: string, transaction: Transaction): void {\n  print(`[${providerName}] Tx ${transaction.hash}`);\n  print(`  Block: ${transaction.blockNumber}`);\n  print(`  From: ${transaction.from}`);\n  print(`  To: ${transaction.to ?? \"contract creation\"}`);\n  print(`  Value: ${transaction.valueFormatted}`);\n  print(`  Status: ${transaction.status}`);\n  if (transaction.fee) print(`  Fee: ${transaction.fee} base units`);\n  if (transaction.functionName) print(`  Method: ${transaction.functionName}`);\n  if (transaction.tokenTransfers.length > 0) {\n    print(`  Token transfers: ${transaction.tokenTransfers.length}`);\n  }\n  renderOpReturns(transaction);\n}\n\n/* oxlint-disable-next-line typescript/prefer-readonly-parameter-types */\nasync function runDetail(selected: SelectedProvider, target: string): Promise<void> {\n  const getTxDetail = selected.provider.getTxDetail?.bind(selected.provider);\n  if (!selected.provider.capabilities.txDetail || !getTxDetail) {\n    failCommand(`Provider \"${selected.name}\" does not support transaction details`);\n  }\n  const transaction = await getTxDetail(target, selected.chain);\n  renderTransaction(selected.name, transaction);\n}\n\nasync function runHistory(\n  /* oxlint-disable-next-line typescript/prefer-readonly-parameter-types */\n  selected: SelectedProvider,\n  target: string,\n  limitInput: string,\n): Promise<void> {\n  const { resolveInput } = await import(\"../core/input.js\");\n  const { address } = await resolveInput(target, selected.chain);\n  const limit = parsePositiveInteger(limitInput, \"Invalid --limit value\");\n  const transactions = await selected.provider.getTxHistory(address, selected.chain, { limit });\n  print(\n    `[${selected.name}] ${transactions.length} transactions for ${address} on ${selected.chain}`,\n  );\n  print(\"\");\n  for (const transaction of transactions) {\n    const value = transaction.valueFormatted !== \"0\" ? ` ${transaction.valueFormatted}` : \"\";\n    print(\n      `  ${transaction.hash.slice(0, 18)}…  ${transaction.from.slice(0, 10)}… → ${(transaction.to ?? \"?\").slice(0, 10)}…${value}  [${transaction.status}]`,\n    );\n  }\n}\n\nexport default defineCommand({\n  meta: {\n    name: \"tx\",\n    description: \"Get transaction history or detail (supports ENS)\",\n  },\n  args: {\n    target: {\n      type: \"positional\",\n      description: \"Address, ENS name, or tx hash\",\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 results (for history)\",\n      default: \"10\",\n    },\n    mode: {\n      type: \"string\",\n      alias: \"m\",\n      description: \"Operation mode (history or detail)\",\n    },\n    provider: {\n      type: \"string\",\n      alias: \"p\",\n      description: \"Provider\",\n    },\n  },\n  async run({ args }) {\n    try {\n      const [{ PROVIDER_DEFAULT_CHAIN, resolveProvider }, { normalizeChain }] = await Promise.all([\n        import(\"../core/resolve.js\"),\n        import(\"../core/types.js\"),\n      ]);\n      const chainInput = args.chain as string | undefined;\n      const providerInput = args.provider as string | undefined;\n      const requestedChain = chainInput === undefined ? undefined : normalizeChain(chainInput);\n      const initialName = resolveProvider(providerInput, requestedChain);\n      const initialChain = requestedChain ?? normalizeChain(PROVIDER_DEFAULT_CHAIN[initialName]);\n      const target = (args.target as string).trim();\n      const mode = await transactionMode(args.mode as string | undefined, target, initialChain);\n      await withSelectedProvider(\n        initialChain,\n        providerInput,\n        mode === \"detail\" ? \"txDetail\" : \"txHistory\",\n        async (selected) => {\n          if (mode === \"detail\") await runDetail(selected, target);\n          else await runHistory(selected, target, args.limit as string);\n        },\n      );\n    } catch (error) {\n      reportCommandError(error);\n    }\n  },\n});\n"],"mappings":"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"}