{"version":3,"file":"ton.mjs","names":[],"sources":["../../src/providers/ton.ts"],"sourcesContent":["/**\n * TON provider — The Open Network (Telegram blockchain)\n *\n * Public API via tonapi.io, no key needed. TON balance, tx history, tx detail, block info.\n *\n * https://tonapi.io/api-docs\n */\n\nimport type {\n  ProviderCapabilities,\n  ProviderConfig,\n  ChainKey,\n  Balance,\n  Transaction,\n  TxHistoryOptions,\n  TokenTransfer,\n  TxStatus,\n} from \"../core/types.js\";\nimport { Provider } from \"../core/provider.js\";\nimport { normalizeBaseUrl } from \"../core/client.js\";\nimport { UnsupportedChainError } from \"../core/errors.js\";\nimport { clampMaxResults, formatWei } from \"../core/types.js\";\n\nimport { assertSafePathSegment } from \"../core/path-safety.js\";\nconst DEFAULT_BASE = \"https://tonapi.io\";\n\ninterface TonAccount {\n  readonly address: string;\n  readonly balance: string | number;\n  readonly status: string;\n  readonly last_activity: number;\n  readonly name?: string;\n  readonly is_scam?: boolean;\n  readonly interfaces?: readonly string[];\n}\n\ninterface TonEvent {\n  readonly event_id: string;\n  readonly timestamp: number;\n  readonly in_progress: boolean;\n  readonly actions: ReadonlyArray<{\n    readonly type: string;\n    readonly TonTransfer?: {\n      readonly sender: { readonly address: string };\n      readonly recipient: { readonly address: string };\n      readonly amount: string | number;\n      readonly comment?: string;\n    };\n    readonly JettonTransfer?: {\n      readonly sender: { readonly address: string };\n      readonly recipient: { readonly address: string };\n      readonly senders_wallet: string;\n      readonly recipients_wallet: string;\n      readonly amount: string;\n      readonly jetton: {\n        readonly address: string;\n        readonly name: string;\n        readonly symbol: string;\n        readonly decimals: number;\n      };\n    };\n    readonly status: string;\n  }>;\n  readonly involved: Readonly<Record<string, unknown>>;\n}\n\nfunction eventStatus(event: Readonly<TonEvent>): TxStatus {\n  if (event.in_progress) return \"pending\";\n  return event.actions[0]?.status === \"ok\" ? \"success\" : \"failed\";\n}\n\nfunction mapEventToTx(event: Readonly<TonEvent>): Transaction {\n  const firstAction = event.actions[0];\n  const timestamp = new Date(event.timestamp * 1000).toISOString();\n  let from = \"\";\n  let to: string | null = null;\n  let value: string | number = 0;\n\n  if (firstAction?.TonTransfer) {\n    from = firstAction.TonTransfer.sender.address;\n    to = firstAction.TonTransfer.recipient.address;\n    value = firstAction.TonTransfer.amount;\n  } else if (firstAction?.JettonTransfer) {\n    from = firstAction.JettonTransfer.sender.address;\n    to = firstAction.JettonTransfer.recipient.address;\n  }\n\n  const tokenTransfers: TokenTransfer[] = event.actions.flatMap((action) => {\n    const transfer = action.JettonTransfer;\n    if (!transfer || action.status !== \"ok\") return [];\n    return [\n      {\n        contract: transfer.jetton.address,\n        symbol: transfer.jetton.symbol,\n        name: transfer.jetton.name,\n        decimals: transfer.jetton.decimals,\n        value: transfer.amount,\n        valueFormatted: formatWei(transfer.amount, transfer.jetton.decimals),\n        from: transfer.sender.address,\n        to: transfer.recipient.address,\n        txHash: event.event_id,\n        blockNumber: 0,\n        timestamp,\n      },\n    ];\n  });\n\n  return {\n    hash: event.event_id,\n    blockNumber: 0,\n    timestamp,\n    from,\n    to,\n    value: value.toString(),\n    valueFormatted: formatWei(String(value), 9),\n    status: eventStatus(event),\n    isContractInteraction: firstAction?.type !== \"TonTransfer\",\n    tokenTransfers,\n  };\n}\n\nexport class Ton extends Provider {\n  static readonly key = \"ton\";\n\n  private baseUrl: string;\n\n  constructor(config: Readonly<ProviderConfig>) {\n    super(config);\n    this.baseUrl = normalizeBaseUrl(config.baseUrl ?? DEFAULT_BASE);\n  }\n  get capabilities(): ProviderCapabilities {\n    return {\n      balances: true,\n      txHistory: true,\n      txDetail: false,\n      utxos: false,\n      contractInfo: false,\n      tokenBalances: false,\n      tokenTransfers: false,\n      gasData: false,\n      blockInfo: false,\n    };\n  }\n\n  async getBalance(address: string, chain?: ChainKey): Promise<Balance> {\n    const c = chain ?? \"ton\";\n    if (c !== \"ton\") throw new UnsupportedChainError(c, \"ton\");\n\n    assertSafePathSegment(address, \"address\");\n    const data = await this.getJSON<TonAccount>(\n      `${this.baseUrl}/v2/accounts/${encodeURIComponent(address)}`,\n    );\n\n    return this.snapshotBalance({\n      address,\n      chain: \"ton\",\n      balance: data.balance.toString(),\n      balanceFormatted: formatWei(String(data.balance), 9),\n      symbol: \"TON\",\n    });\n  }\n\n  async getTxHistory(\n    address: string,\n    chain?: ChainKey,\n    options?: Readonly<TxHistoryOptions>,\n  ): Promise<Transaction[]> {\n    const c = chain ?? \"ton\";\n    if (c !== \"ton\") throw new UnsupportedChainError(c, \"ton\");\n    const limit = clampMaxResults(options?.limit);\n\n    assertSafePathSegment(address, \"address\");\n    const data = await this.getJSON<{ events: TonEvent[] }>(\n      `${this.baseUrl}/v2/accounts/${encodeURIComponent(address)}/events?limit=${limit}`,\n    );\n\n    if (!data.events?.length) return [];\n\n    return data.events.map(mapEventToTx);\n  }\n}\n"],"mappings":";;;;AAwBA,MAAM,eAAe;AA0CrB,SAAS,YAAY,OAAqC;CACxD,IAAI,MAAM,aAAa,OAAO;CAC9B,OAAO,MAAM,QAAQ,EAAE,EAAE,WAAW,OAAO,YAAY;AACzD;AAEA,SAAS,aAAa,OAAwC;CAC5D,MAAM,cAAc,MAAM,QAAQ;CAClC,MAAM,6BAAY,IAAI,KAAK,MAAM,YAAY,GAAI,EAAA,CAAE,YAAY;CAC/D,IAAI,OAAO;CACX,IAAI,KAAoB;CACxB,IAAI,QAAyB;CAE7B,IAAI,aAAa,aAAa;EAC5B,OAAO,YAAY,YAAY,OAAO;EACtC,KAAK,YAAY,YAAY,UAAU;EACvC,QAAQ,YAAY,YAAY;CAClC,OAAO,IAAI,aAAa,gBAAgB;EACtC,OAAO,YAAY,eAAe,OAAO;EACzC,KAAK,YAAY,eAAe,UAAU;CAC5C;CAEA,MAAM,iBAAkC,MAAM,QAAQ,SAAS,WAAW;EACxE,MAAM,WAAW,OAAO;EACxB,IAAI,CAAC,YAAY,OAAO,WAAW,MAAM,OAAO,CAAC;EACjD,OAAO,CACL;GACE,UAAU,SAAS,OAAO;GAC1B,QAAQ,SAAS,OAAO;GACxB,MAAM,SAAS,OAAO;GACtB,UAAU,SAAS,OAAO;GAC1B,OAAO,SAAS;GAChB,gBAAgB,UAAU,SAAS,QAAQ,SAAS,OAAO,QAAQ;GACnE,MAAM,SAAS,OAAO;GACtB,IAAI,SAAS,UAAU;GACvB,QAAQ,MAAM;GACd,aAAa;GACb;EACF,CACF;CACF,CAAC;CAED,OAAO;EACL,MAAM,MAAM;EACZ,aAAa;EACb;EACA;EACA;EACA,OAAO,MAAM,SAAS;EACtB,gBAAgB,UAAU,OAAO,KAAK,GAAG,CAAC;EAC1C,QAAQ,YAAY,KAAK;EACzB,uBAAuB,aAAa,SAAS;EAC7C;CACF;AACF;AAEA,IAAa,MAAb,cAAyB,SAAS;CAChC,OAAgB,MAAM;CAEtB;CAEA,YAAY,QAAkC;EAC5C,MAAM,MAAM;EACZ,KAAK,UAAU,iBAAiB,OAAO,WAAW,YAAY;CAChE;CACA,IAAI,eAAqC;EACvC,OAAO;GACL,UAAU;GACV,WAAW;GACX,UAAU;GACV,OAAO;GACP,cAAc;GACd,eAAe;GACf,gBAAgB;GAChB,SAAS;GACT,WAAW;EACb;CACF;CAEA,MAAM,WAAW,SAAiB,OAAoC;EACpE,MAAM,IAAI,SAAS;EACnB,IAAI,MAAM,OAAO,MAAM,IAAI,sBAAsB,GAAG,KAAK;EAEzD,sBAAsB,SAAS,SAAS;EACxC,MAAM,OAAO,MAAM,KAAK,QACtB,GAAG,KAAK,QAAQ,eAAe,mBAAmB,OAAO,GAC3D;EAEA,OAAO,KAAK,gBAAgB;GAC1B;GACA,OAAO;GACP,SAAS,KAAK,QAAQ,SAAS;GAC/B,kBAAkB,UAAU,OAAO,KAAK,OAAO,GAAG,CAAC;GACnD,QAAQ;EACV,CAAC;CACH;CAEA,MAAM,aACJ,SACA,OACA,SACwB;EACxB,MAAM,IAAI,SAAS;EACnB,IAAI,MAAM,OAAO,MAAM,IAAI,sBAAsB,GAAG,KAAK;EACzD,MAAM,QAAQ,gBAAgB,SAAS,KAAK;EAE5C,sBAAsB,SAAS,SAAS;EACxC,MAAM,OAAO,MAAM,KAAK,QACtB,GAAG,KAAK,QAAQ,eAAe,mBAAmB,OAAO,EAAE,gBAAgB,OAC7E;EAEA,IAAI,CAAC,KAAK,QAAQ,QAAQ,OAAO,CAAC;EAElC,OAAO,KAAK,OAAO,IAAI,YAAY;CACrC;AACF"}