{"version":3,"sources":["../src/index.ts","../src/core/config.ts","../src/core/http.ts","../src/core/errors.ts","../src/core/result.ts","../src/core/context.ts","../src/services/account.service.ts","../src/services/auth.service.ts","../src/services/premium.service.ts","../src/services/wallet.service.ts","../src/services/stars.service.ts","../src/services/ton.service.ts","../src/services/users.service.ts","../src/services/utils.service.ts","../src/parsers/decoder.ts","../src/Fragment.ts"],"sourcesContent":["/**\n * telegram-fragment-api — unofficial, fully-typed TypeScript client for\n * Fragment.com (Telegram Stars, Premium, usernames and TON).\n */\n\nexport { Fragment } from \"./Fragment.js\";\nexport { Fragment as default } from \"./Fragment.js\";\n\n// Services (exported so consumers can type/extend them)\nexport { AccountService, parseProfile, parseSessions } from \"./services/account.service.js\";\nexport { AuthService } from \"./services/auth.service.js\";\nexport { PremiumService, parsePremium } from \"./services/premium.service.js\";\nexport { StarsService } from \"./services/stars.service.js\";\nexport { TonService, intToIp } from \"./services/ton.service.js\";\nexport { UsersService } from \"./services/users.service.js\";\nexport { UtilsService } from \"./services/utils.service.js\";\nexport { V4R2Service, WalletService } from \"./services/wallet.service.js\";\n\n// Core: config, errors, result\nexport type {\n  FragmentConfig,\n  FragmentCredentials,\n  ResolvedCredentials,\n} from \"./core/config.js\";\nexport {\n  FragmentError,\n  type FragmentErrorCode,\n  type FragmentErrorOptions,\n} from \"./core/errors.js\";\nexport {\n  isErr,\n  isOk,\n  ok,\n  err,\n  type Err,\n  type Ok,\n  type Result,\n} from \"./core/result.js\";\n\n// Pure helpers\nexport { decodePayload } from \"./parsers/decoder.js\";\n/** Re-exported TON unit helpers — exact, no floating point. */\nexport { fromNano, toNano } from \"@ton/ton\";\n\n// Domain + parameter types\nexport type * from \"./types.js\";\n","/**\n * Credentials and runtime configuration for a {@link Fragment} client.\n */\n\nimport type { AxiosInstance } from \"axios\";\n\n/** Credentials grabbed from an authenticated fragment.com session + TON providers. */\nexport interface FragmentCredentials {\n  /** Per-request CSRF hash from the Fragment page (`?hash=...`). */\n  hash?: string;\n  /** Cookie: `stel_ssid`. */\n  stelSsid?: string;\n  /** Cookie: `stel_dt` (timezone offset, e.g. `\"-180\"`). */\n  stelDt?: string;\n  /** Cookie: `stel_token`. */\n  stelToken?: string;\n  /** Cookie: `stel_ton_token`. */\n  stelTonToken?: string;\n  /** API key for toncenter.com (balances + sending TON). */\n  toncenterApiKey?: string;\n  /** API key for tonconsole / tonapi.io (alternative balance source). */\n  tonconsoleApiKey?: string;\n  /** Wallet mnemonic seed (space-separated words) — only needed to send TON. */\n  walletSeed?: string;\n}\n\n/** Full client configuration: credentials plus transport options. */\nexport interface FragmentConfig extends FragmentCredentials {\n  /** Request timeout in milliseconds (default `30000`). */\n  timeout?: number;\n  /**\n   * Inject a custom axios instance — primarily for testing\n   * (e.g. with `axios-mock-adapter`).\n   */\n  axiosInstance?: AxiosInstance;\n}\n\n/** Credentials with all fields present (empty string when unset). */\nexport type ResolvedCredentials = Required<FragmentCredentials>;\n\nconst DEFAULTS: ResolvedCredentials = {\n  hash: \"\",\n  stelSsid: \"\",\n  stelDt: \"-180\",\n  stelToken: \"\",\n  stelTonToken: \"\",\n  toncenterApiKey: \"\",\n  tonconsoleApiKey: \"\",\n  walletSeed: \"\",\n};\n\n/** Fill missing credential fields with defaults. */\nexport function resolveCredentials(\n  creds: FragmentCredentials = {},\n): ResolvedCredentials {\n  return {\n    hash: creds.hash ?? DEFAULTS.hash,\n    stelSsid: creds.stelSsid ?? DEFAULTS.stelSsid,\n    stelDt: creds.stelDt ?? DEFAULTS.stelDt,\n    stelToken: creds.stelToken ?? DEFAULTS.stelToken,\n    stelTonToken: creds.stelTonToken ?? DEFAULTS.stelTonToken,\n    toncenterApiKey: creds.toncenterApiKey ?? DEFAULTS.toncenterApiKey,\n    tonconsoleApiKey: creds.tonconsoleApiKey ?? DEFAULTS.tonconsoleApiKey,\n    walletSeed: creds.walletSeed ?? DEFAULTS.walletSeed,\n  };\n}\n\nexport const USER_AGENT =\n  \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0) Gecko/20100101 Firefox/143.0\";\n\n/** Build the `Cookie` header value from the configured stel_* tokens. */\nexport function buildCookieHeader(creds: ResolvedCredentials): string {\n  return [\n    `stel_ssid=${creds.stelSsid}`,\n    `stel_dt=${creds.stelDt}`,\n    `stel_token=${creds.stelToken}`,\n    `stel_ton_token=${creds.stelTonToken}`,\n  ].join(\"; \");\n}\n\n/** Headers for the JSON `https://fragment.com/api` endpoint. */\nexport function buildApiHeaders(\n  creds: ResolvedCredentials,\n): Record<string, string> {\n  return {\n    Cookie: buildCookieHeader(creds),\n    \"User-Agent\": USER_AGENT,\n    Accept: \"application/json, text/javascript, */*; q=0.01\",\n    \"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n    \"X-Requested-With\": \"XMLHttpRequest\",\n    Origin: \"https://fragment.com\",\n    Referer: \"https://fragment.com/stars/buy?quantity=500\",\n  };\n}\n\n/** Headers for the HTML page-scraping endpoints (profile, sessions, premium). */\nexport function buildHtmlHeaders(\n  creds: ResolvedCredentials,\n): Record<string, string> {\n  return {\n    Cookie: buildCookieHeader(creds),\n    \"User-Agent\": USER_AGENT,\n    Accept: \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n    \"Accept-Language\": \"ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3\",\n    \"Upgrade-Insecure-Requests\": \"1\",\n  };\n}\n","/**\n * Thin axios wrapper. Every method returns a {@link Result} — transport and\n * HTTP errors are mapped to a structured {@link FragmentError} instead of being\n * thrown.\n */\n\nimport axios, { type AxiosInstance, type AxiosRequestConfig } from \"axios\";\nimport { FragmentError } from \"./errors.js\";\nimport { err, ok, type Result } from \"./result.js\";\n\nexport interface HttpClientOptions {\n  /** Inject a pre-built axios instance (used by tests). */\n  axiosInstance?: AxiosInstance;\n  /** Request timeout in ms (default `30000`). Ignored if `axiosInstance` is set. */\n  timeout?: number;\n}\n\nexport interface RequestOptions {\n  params?: Record<string, string | number>;\n  headers?: Record<string, string>;\n}\n\nexport class HttpClient {\n  /** The underlying axios instance (exposed so tests can mock it). */\n  readonly axios: AxiosInstance;\n\n  constructor(options: HttpClientOptions = {}) {\n    this.axios =\n      options.axiosInstance ??\n      axios.create({\n        timeout: options.timeout ?? 30_000,\n        // Force the Node `http` adapter (fall back to `fetch`). Some runtimes —\n        // notably Bun — expose a global `XMLHttpRequest`, which makes axios pick\n        // the `xhr` adapter, and XHR silently strips the `Cookie` header. That\n        // breaks every authenticated Fragment request (e.g. buying stars fails\n        // with \"Access denied\" while public reads still work).\n        adapter: [\"http\", \"fetch\"],\n      });\n  }\n\n  /** POST `application/x-www-form-urlencoded`, parse a JSON response. */\n  async postForm<T>(\n    url: string,\n    data: Record<string, string | number>,\n    options: RequestOptions = {},\n  ): Promise<Result<T>> {\n    const body = new URLSearchParams(\n      Object.fromEntries(\n        Object.entries(data).map(([k, v]) => [k, String(v)]),\n      ),\n    );\n    return this.request<T>({\n      method: \"POST\",\n      url,\n      data: body,\n      params: options.params,\n      headers: options.headers,\n    });\n  }\n\n  /**\n   * POST `application/x-www-form-urlencoded` and return both the parsed JSON\n   * body and any `Set-Cookie` headers. Used by the TON Connect proof flow, which\n   * mints a fresh `stel_ton_token` delivered via `Set-Cookie`.\n   */\n  async postFormRaw<T>(\n    url: string,\n    data: Record<string, string | number>,\n    options: RequestOptions = {},\n  ): Promise<Result<{ data: T; setCookies: string[] }>> {\n    const body = new URLSearchParams(\n      Object.fromEntries(\n        Object.entries(data).map(([k, v]) => [k, String(v)]),\n      ),\n    );\n    try {\n      const response = await this.axios.request<T>({\n        method: \"POST\",\n        url,\n        data: body,\n        params: options.params,\n        headers: options.headers,\n      });\n      const raw = response.headers?.[\"set-cookie\"];\n      const setCookies = Array.isArray(raw) ? raw : raw ? [String(raw)] : [];\n      return ok({ data: response.data, setCookies });\n    } catch (error) {\n      return err(this.toFragmentError(error));\n    }\n  }\n\n  /** GET, parse a JSON response. */\n  async getJson<T>(\n    url: string,\n    options: RequestOptions = {},\n  ): Promise<Result<T>> {\n    return this.request<T>({\n      method: \"GET\",\n      url,\n      params: options.params,\n      headers: options.headers,\n    });\n  }\n\n  /** GET, return the raw response body as text. */\n  async getText(\n    url: string,\n    options: RequestOptions = {},\n  ): Promise<Result<string>> {\n    return this.request<string>({\n      method: \"GET\",\n      url,\n      params: options.params,\n      headers: options.headers,\n      responseType: \"text\",\n    });\n  }\n\n  private async request<T>(config: AxiosRequestConfig): Promise<Result<T>> {\n    try {\n      const response = await this.axios.request<T>(config);\n      return ok(response.data);\n    } catch (error) {\n      return err(this.toFragmentError(error));\n    }\n  }\n\n  private toFragmentError(error: unknown): FragmentError {\n    if (axios.isAxiosError(error)) {\n      if (error.response) {\n        const status = error.response.status;\n        if (status === 401 || status === 403) {\n          return new FragmentError(\n            \"AUTH\",\n            `Authentication failed (HTTP ${status}). Check your stel_* cookies and hash.`,\n            { status, details: error.response.data, cause: error },\n          );\n        }\n        return new FragmentError(\n          \"API\",\n          `Request failed with HTTP ${status}.`,\n          { status, details: error.response.data, cause: error },\n        );\n      }\n      // Request was made but no response (timeout / connection error).\n      return new FragmentError(\n        \"NETWORK\",\n        error.message || \"Network request failed with no response.\",\n        { cause: error },\n      );\n    }\n    return new FragmentError(\n      \"UNKNOWN\",\n      error instanceof Error ? error.message : \"Unknown error\",\n      { cause: error },\n    );\n  }\n}\n","/**\n * Structured error type returned inside {@link Result} objects.\n *\n * Errors are never thrown by the public API — every method returns\n * `{ ok: false, error: FragmentError }` on failure. `FragmentError` still\n * extends `Error` so it carries a stack trace and works with `instanceof`.\n */\n\n/** Discriminator describing the category of a failure. */\nexport type FragmentErrorCode =\n  /** Bad or missing input parameters. */\n  | \"VALIDATION\"\n  /** Missing/invalid credentials, or a 401/403 from Fragment. */\n  | \"AUTH\"\n  /** Transport failure: timeout, DNS, connection reset, etc. */\n  | \"NETWORK\"\n  /** The remote API responded but signalled an error (non-2xx or `ok: false`). */\n  | \"API\"\n  /** The response could not be parsed into the expected shape. */\n  | \"PARSE\"\n  /** A resource was not found (e.g. nickname has no recipient). */\n  | \"NOT_FOUND\"\n  /** Wallet balance is lower than the requested transfer amount. */\n  | \"INSUFFICIENT_FUNDS\"\n  /** Anything that doesn't fit the buckets above. */\n  | \"UNKNOWN\";\n\n/** Extra context attached to a {@link FragmentError}. */\nexport interface FragmentErrorOptions {\n  /** HTTP status code, when the failure came from an HTTP response. */\n  status?: number;\n  /** The underlying error / payload that caused this one. */\n  cause?: unknown;\n  /** Arbitrary structured details (e.g. the raw API body). */\n  details?: unknown;\n}\n\nexport class FragmentError extends Error {\n  readonly code: FragmentErrorCode;\n  readonly status?: number;\n  readonly details?: unknown;\n\n  constructor(\n    code: FragmentErrorCode,\n    message: string,\n    options: FragmentErrorOptions = {},\n  ) {\n    super(message, options.cause !== undefined ? { cause: options.cause } : undefined);\n    this.name = \"FragmentError\";\n    this.code = code;\n    this.status = options.status;\n    this.details = options.details;\n    // Restore prototype chain for instanceof when targeting ES5-ish output.\n    Object.setPrototypeOf(this, FragmentError.prototype);\n  }\n\n  /** Serialize to a plain object (safe for logging / JSON). */\n  toJSON(): {\n    name: string;\n    code: FragmentErrorCode;\n    message: string;\n    status?: number;\n  } {\n    return {\n      name: this.name,\n      code: this.code,\n      message: this.message,\n      status: this.status,\n    };\n  }\n}\n\n// ---- Convenience constructors --------------------------------------------\n\nexport const validationError = (\n  message: string,\n  options?: FragmentErrorOptions,\n): FragmentError => new FragmentError(\"VALIDATION\", message, options);\n\nexport const authError = (\n  message: string,\n  options?: FragmentErrorOptions,\n): FragmentError => new FragmentError(\"AUTH\", message, options);\n\nexport const networkError = (\n  message: string,\n  options?: FragmentErrorOptions,\n): FragmentError => new FragmentError(\"NETWORK\", message, options);\n\nexport const apiError = (\n  message: string,\n  options?: FragmentErrorOptions,\n): FragmentError => new FragmentError(\"API\", message, options);\n\nexport const parseError = (\n  message: string,\n  options?: FragmentErrorOptions,\n): FragmentError => new FragmentError(\"PARSE\", message, options);\n\nexport const notFoundError = (\n  message: string,\n  options?: FragmentErrorOptions,\n): FragmentError => new FragmentError(\"NOT_FOUND\", message, options);\n\nexport const insufficientFundsError = (\n  message: string,\n  options?: FragmentErrorOptions,\n): FragmentError => new FragmentError(\"INSUFFICIENT_FUNDS\", message, options);\n","/**\n * A discriminated-union result type. Every public method resolves to one of\n * these instead of throwing.\n *\n * ```ts\n * const res = await client.stars.getPrice({ quantity: 50 });\n * if (res.ok) {\n *   console.log(res.data.curPrice.TON);\n * } else {\n *   console.error(res.error.code, res.error.message);\n * }\n * ```\n */\n\nimport { FragmentError } from \"./errors.js\";\n\nexport interface Ok<T> {\n  ok: true;\n  data: T;\n}\n\nexport interface Err<E = FragmentError> {\n  ok: false;\n  error: E;\n}\n\nexport type Result<T, E = FragmentError> = Ok<T> | Err<E>;\n\n/** Build a success result. */\nexport function ok<T>(data: T): Ok<T> {\n  return { ok: true, data };\n}\n\n/** Build a failure result. */\nexport function err<E = FragmentError>(error: E): Err<E> {\n  return { ok: false, error };\n}\n\n/** Type guard narrowing a {@link Result} to its success branch. */\nexport function isOk<T, E>(result: Result<T, E>): result is Ok<T> {\n  return result.ok;\n}\n\n/** Type guard narrowing a {@link Result} to its failure branch. */\nexport function isErr<T, E>(result: Result<T, E>): result is Err<E> {\n  return !result.ok;\n}\n","/**\n * Shared runtime state handed to every service: the resolved (mutable)\n * credentials and the HTTP client.\n */\n\nimport {\n  buildApiHeaders,\n  buildHtmlHeaders,\n  resolveCredentials,\n  type FragmentConfig,\n  type FragmentCredentials,\n  type ResolvedCredentials,\n} from \"./config.js\";\nimport { HttpClient } from \"./http.js\";\n\nexport class FragmentContext {\n  /** Live credentials — mutated by `update()` and `auth.fetchHash()`. */\n  credentials: ResolvedCredentials;\n  readonly http: HttpClient;\n\n  constructor(config: FragmentConfig = {}) {\n    this.credentials = resolveCredentials(config);\n    this.http = new HttpClient({\n      axiosInstance: config.axiosInstance,\n      timeout: config.timeout,\n    });\n  }\n\n  /** Merge in new credential values. */\n  update(creds: Partial<FragmentCredentials>): void {\n    this.credentials = { ...this.credentials, ...stripUndefined(creds) };\n  }\n\n  /** `https://fragment.com/api?hash=...` for the configured hash. */\n  apiUrl(): string {\n    return `https://fragment.com/api?hash=${encodeURIComponent(this.credentials.hash)}`;\n  }\n\n  apiHeaders(): Record<string, string> {\n    return buildApiHeaders(this.credentials);\n  }\n\n  htmlHeaders(): Record<string, string> {\n    return buildHtmlHeaders(this.credentials);\n  }\n}\n\nfunction stripUndefined(\n  obj: Partial<FragmentCredentials>,\n): Partial<FragmentCredentials> {\n  return Object.fromEntries(\n    Object.entries(obj).filter(([, v]) => v !== undefined),\n  );\n}\n\n/** Base class for all services — just holds the shared context. */\nexport abstract class BaseService {\n  constructor(protected readonly ctx: FragmentContext) {}\n}\n","import * as cheerio from \"cheerio\";\nimport { BaseService } from \"../core/context.js\";\nimport { ok, type Result } from \"../core/result.js\";\nimport type { Session, SessionList, UserProfile } from \"../types.js\";\n\n/** Authenticated account info: profile and active sessions. */\nexport class AccountService extends BaseService {\n  /**\n   * Get the authenticated account's Fragment profile.\n   *\n   * @example\n   * ```ts\n   * const res = await client.account.getProfile();\n   * if (res.ok) console.log(res.data.username, res.data.wallet);\n   * ```\n   */\n  async getProfile(): Promise<Result<UserProfile>> {\n    const res = await this.ctx.http.getJson<{ h?: string }>(\n      \"https://fragment.com/my/profile\",\n      {\n        headers: {\n          ...this.ctx.htmlHeaders(),\n          Accept: \"application/json, text/javascript, */*; q=0.01\",\n          \"X-Requested-With\": \"XMLHttpRequest\",\n          Referer: \"https://fragment.com/convert\",\n        },\n      },\n    );\n    if (!res.ok) return res;\n\n    return ok(parseProfile(res.data.h ?? \"\"));\n  }\n\n  /**\n   * Get the list of active sessions plus basic account info.\n   *\n   * @example\n   * ```ts\n   * const res = await client.account.getSessions();\n   * if (res.ok) console.log(res.data.account.username, res.data.sessions.length);\n   * ```\n   */\n  async getSessions(): Promise<Result<SessionList>> {\n    const res = await this.ctx.http.getText(\"https://fragment.com/my/sessions\", {\n      headers: this.ctx.htmlHeaders(),\n    });\n    if (!res.ok) return res;\n\n    return ok(parseSessions(res.data));\n  }\n}\n\n/** Exported for unit testing. */\nexport function parseProfile(html: string): UserProfile {\n  const $ = cheerio.load(html);\n  const info: UserProfile = {};\n\n  const block = $(\".tm-settings-item.tm-settings-head-item\").first();\n  if (block.length) {\n    info.name = block.find(\".tm-settings-item-head\").text().trim();\n    info.username = block.find(\".tm-settings-item-desc\").text().trim();\n    const img = block.find(\"img\").first();\n    info.avatar = img.length ? (img.attr(\"src\") ?? null) : null;\n    info.verified = block.find(\".tm-badge-verified\").length > 0;\n  }\n\n  const wallet = $(\".tm-settings-item.icon-before.icon-menu-wallet\").first();\n  if (wallet.length) {\n    info.wallet = wallet.find(\".tm-settings-item-desc\").text().trim();\n    info.walletVerified = wallet.find(\".tm-badge-verified\").length > 0;\n  }\n\n  return info;\n}\n\n/** Exported for unit testing. */\nexport function parseSessions(html: string): SessionList {\n  const $ = cheerio.load(html);\n\n  const account: SessionList[\"account\"] = {};\n\n  const userBtn = $(\".tm-header-action .btn .tm-button-label\").first();\n  if (userBtn.length) account.username = userBtn.text().trim();\n\n  const userImg = $(\".tm-header-button-photo img\").first();\n  const imgSrc = userImg.attr(\"src\");\n  if (imgSrc) account.avatar = imgSrc;\n\n  const wallet = $(\".tm-wallet\").first();\n  if (wallet.length) account.tonWallet = wallet.text().trim();\n\n  const script = $(\"script#aj_script\").first();\n  if (script.length) {\n    const match = script.html()?.match(/Wallet\\.init\\((\\{.*?\\})\\);/s);\n    if (match) {\n      try {\n        Object.assign(account, JSON.parse(match[1]!));\n      } catch {\n        // ignore malformed wallet init payload\n      }\n    }\n  }\n\n  const sessions: Session[] = [];\n  $(\"table.tm-table tbody tr\").each((_, row) => {\n    const $row = $(row);\n    const session: Session = {};\n\n    const device = $row.find(\".table-cell-value.tm-value\").first();\n    if (device.length) session.device = device.text().trim();\n\n    const status = $row.find(\".table-cell-status-thin\").first();\n    if (status.length) session.status = status.text().trim();\n\n    const location = $row.find(\".table-cell-desc-col\").first();\n    if (location.length) session.location = location.text().trim();\n\n    const time = $row.find(\"time\").first();\n    if (time.length) {\n      session.datetime = time.attr(\"datetime\");\n      session.dateText = time.text().trim();\n    } else {\n      const dateCell = $row.find(\"td.wide-only .tm-value\").first();\n      if (dateCell.length) session.dateText = dateCell.text().trim();\n    }\n\n    const action = $row.find(\".tm-table-actions\").first();\n    const sessionId = action.attr(\"data-session-id\");\n    if (sessionId) session.sessionId = sessionId;\n\n    sessions.push(session);\n  });\n\n  return { account, sessions };\n}\n","import { BaseService } from \"../core/context.js\";\nimport { parseError } from \"../core/errors.js\";\nimport { err, ok, type Result } from \"../core/result.js\";\nimport type { FetchHashData, FetchHashParams } from \"../types.js\";\n\nconst HASH_PATTERNS: RegExp[] = [\n  /api\\?hash=([0-9a-f]{16,})/i,\n  /\"apiUrl\":\"\\\\?\\/api\\?hash=([0-9a-f]{16,})/i,\n  /hash=([0-9a-f]{16,})/i,\n];\n\n/** Session / authentication helpers. */\nexport class AuthService extends BaseService {\n  /**\n   * Scrape the per-session api `hash` from a Fragment page and store it in the\n   * client config, so you don't have to copy it by hand.\n   *\n   * Requires the `stel_*` cookies to already be configured. The extracted hash\n   * is saved into the client (subsequent calls use it automatically).\n   *\n   * @example\n   * ```ts\n   * const res = await client.auth.fetchHash();\n   * if (res.ok) console.log(\"hash:\", res.data.hash);\n   * ```\n   */\n  async fetchHash({\n    url = \"https://fragment.com/\",\n  }: FetchHashParams = {}): Promise<Result<FetchHashData>> {\n    const res = await this.ctx.http.getText(url, {\n      headers: this.ctx.htmlHeaders(),\n    });\n    if (!res.ok) return res;\n\n    for (const pattern of HASH_PATTERNS) {\n      const match = res.data.match(pattern);\n      if (match?.[1]) {\n        const hash = match[1];\n        this.ctx.update({ hash });\n        return ok({ hash });\n      }\n    }\n\n    return err(\n      parseError(\n        \"Could not extract the api hash from the page. Are your stel_* cookies valid?\",\n      ),\n    );\n  }\n}\n","import * as cheerio from \"cheerio\";\nimport { BaseService } from \"../core/context.js\";\nimport { ok, type Result } from \"../core/result.js\";\nimport type {\n  GetPremiumPriceParams,\n  PremiumOption,\n  PremiumPrice,\n} from \"../types.js\";\n\n/** Telegram Premium gift pricing (scraped from the gift page). */\nexport class PremiumService extends BaseService {\n  /**\n   * Get Telegram Premium gift pricing options for a given duration.\n   *\n   * @example\n   * ```ts\n   * const res = await client.premium.getPrice({ months: 12 });\n   * if (res.ok) console.log(res.data.tonRate, res.data.options);\n   * ```\n   */\n  async getPrice({\n    months = 12,\n  }: GetPremiumPriceParams = {}): Promise<Result<PremiumPrice>> {\n    const url = `https://fragment.com/premium/gift?months=${months}`;\n    const res = await this.ctx.http.getText(url, {\n      headers: this.ctx.htmlHeaders(),\n    });\n    if (!res.ok) return res;\n\n    return ok(parsePremium(res.data));\n  }\n}\n\n/** Exported for unit testing. */\nexport function parsePremium(html: string): PremiumPrice {\n  const $ = cheerio.load(html);\n\n  const options: PremiumOption[] = [];\n  $(\".tm-form-radio-item\").each((_, el) => {\n    const item = $(el);\n    const pick = (sel: string): string | null => {\n      const node = item.find(sel).first();\n      return node.length ? node.text().trim() : null;\n    };\n    options.push({\n      duration: pick(\".tm-radio-label\"),\n      priceTon: pick(\".tm-value\"),\n      priceUsd: pick(\".tm-radio-desc\"),\n      sale: pick(\".tm-radio-label-badge\"),\n    });\n  });\n\n  let tonRate: number | null = null;\n  const marker = \"ajInit(\";\n  const start = html.indexOf(marker);\n  if (start !== -1) {\n    const from = start + marker.length;\n    const end = html.indexOf(\");\", from);\n    if (end !== -1) {\n      try {\n        const aj = JSON.parse(html.slice(from, end)) as {\n          state?: { tonRate?: number };\n        };\n        tonRate = aj.state?.tonRate ?? null;\n      } catch {\n        // leave tonRate as null\n      }\n    }\n  }\n\n  return { options, tonRate };\n}\n","import { createHash } from \"node:crypto\";\nimport {\n  Cell,\n  beginCell,\n  external,\n  storeMessage,\n  storeStateInit,\n} from \"@ton/core\";\nimport { mnemonicToPrivateKey, sign } from \"@ton/crypto\";\nimport { TonClient, WalletContractV4, fromNano, internal, toNano } from \"@ton/ton\";\nimport { BaseService, type FragmentContext } from \"../core/context.js\";\nimport {\n  apiError,\n  FragmentError,\n  insufficientFundsError,\n  validationError,\n} from \"../core/errors.js\";\nimport { err, ok, type Result } from \"../core/result.js\";\nimport type {\n  ConnectTonWalletData,\n  GetBalanceParams,\n  SendTonData,\n  SendTonParams,\n  SignTonProofParams,\n  TonConnectAccount,\n  TonConnectDevice,\n  TonProof,\n  WaitConfirmationData,\n  WaitConfirmationParams,\n  WalletAddress,\n  WalletBalance,\n} from \"../types.js\";\n\nconst sleep = (ms: number): Promise<void> =>\n  new Promise((resolve) => setTimeout(resolve, ms));\n\nconst NANO = 1_000_000_000;\nconst TONCENTER_RPC = \"https://toncenter.com/api/v2/jsonRPC\";\n\n/** Default app domain the TON Connect proof is bound to. */\nconst FRAGMENT_DOMAIN = \"fragment.com\";\n\n/**\n * TON Connect device hint sent with `checkTonProofAuth` / confirm calls.\n * Fragment doesn't verify the contents, but the field must be present.\n */\nexport const DEFAULT_DEVICE: TonConnectDevice = {\n  platform: \"windows\",\n  appName: \"tonkeeper\",\n  appVersion: \"4.10.0\",\n  maxProtocolVersion: 2,\n  features: [\n    \"SendTransaction\",\n    { name: \"SendTransaction\", maxMessages: 4 },\n    { name: \"SignData\", types: [\"text\", \"binary\", \"cell\"] },\n  ],\n};\n\nconst sha256 = (buf: Buffer): Buffer => createHash(\"sha256\").update(buf).digest();\n\n/** v4r2 wallet transfers. */\nexport class V4R2Service extends BaseService {\n  /**\n   * Send TON from your v4r2 wallet, attaching an optional text comment.\n   *\n   * Requires `toncenterApiKey` and `walletSeed`. Performs a balance check\n   * before broadcasting.\n   *\n   * Pass the amount **either** as `amount` (human TON, e.g. `0.21`) **or**\n   * `amountNano` (exact nanoTON, e.g. Fragment's `msg.amount`). Prefer\n   * `amountNano` when forwarding a Fragment payment — it's exact and avoids the\n   * float-division footgun.\n   *\n   * @example\n   * ```ts\n   * // human amount\n   * await client.ton.wallet.v4r2.send({ destinationAddress: \"UQ...\", amount: 0.21 });\n   *\n   * // exact Fragment payment — pass amount + payload straight from getPaymentInfo\n   * await client.ton.wallet.v4r2.send({\n   *   destinationAddress: msg.address,\n   *   amountNano: msg.amount,            // \"456100000\"\n   *   payloadCell: msg.payload,          // exact BoC cell, byte-matches the site\n   * });\n   * ```\n   */\n  async send({\n    destinationAddress,\n    amount,\n    amountNano,\n    payload = \"\",\n    payloadCell,\n  }: SendTonParams): Promise<Result<SendTonData>> {\n    const { toncenterApiKey, walletSeed } = this.ctx.credentials;\n\n    if (typeof destinationAddress !== \"string\" || destinationAddress.length === 0) {\n      return err(validationError(\"`destinationAddress` must be a non-empty string.\"));\n    }\n\n    // Resolve the value to send as exact nanoTON (bigint) — no floats.\n    const valueResult = resolveValueNano(amount, amountNano);\n    if (!valueResult.ok) return valueResult;\n    const valueNano = valueResult.data;\n\n    // Body: an exact base64 BoC cell (preferred for Fragment payments — it is\n    // byte-identical to what the website sends) or a plain text comment.\n    let body: Cell | string = payload;\n    if (payloadCell !== undefined) {\n      try {\n        body = Cell.fromBase64(payloadCell);\n      } catch {\n        return err(validationError(\"`payloadCell` is not a valid base64 BoC cell.\"));\n      }\n    }\n\n    if (!toncenterApiKey) {\n      return err(validationError(\"toncenterApiKey is not set.\"));\n    }\n    if (!walletSeed) {\n      return err(validationError(\"walletSeed is not set.\"));\n    }\n\n    try {\n      const client = new TonClient({\n        endpoint: TONCENTER_RPC,\n        apiKey: toncenterApiKey,\n      });\n\n      const mnemonics = walletSeed.trim().split(/\\s+/);\n      const keyPair = await mnemonicToPrivateKey(mnemonics);\n      const wallet = WalletContractV4.create({\n        workchain: 0,\n        publicKey: keyPair.publicKey,\n      });\n      const contract = client.open(wallet);\n      const sender = wallet.address.toString();\n\n      const balanceNano = await contract.getBalance();\n\n      if (balanceNano < valueNano) {\n        return err(\n          insufficientFundsError(\n            `Insufficient funds. Required ${fromNano(valueNano)} TON, available ${fromNano(balanceNano)} TON.`,\n            {\n              details: {\n                requiredNano: valueNano.toString(),\n                availableNano: balanceNano.toString(),\n              },\n            },\n          ),\n        );\n      }\n\n      const seqno = await contract.getSeqno();\n      // Sign the transfer body locally — we need the resulting cell separately\n      // so we can serialize the outer external message and capture its base64\n      // BoC. Fragment's `confirm_method` POST needs that BoC verbatim (see\n      // `StarsService.confirmPayment`); without it, the TON tx broadcasts but\n      // Fragment never credits the Stars.\n      const transferBody = wallet.createTransfer({\n        secretKey: keyPair.secretKey,\n        seqno,\n        messages: [\n          internal({\n            to: destinationAddress,\n            value: valueNano,\n            body,\n            bounce: false,\n          }),\n        ],\n      });\n\n      const externalCell = beginCell()\n        .store(\n          storeMessage(\n            external({ to: wallet.address, body: transferBody }),\n          ),\n        )\n        .endCell();\n      const boc = externalCell.toBoc().toString(\"base64\");\n\n      await client.sendFile(externalCell.toBoc());\n\n      return ok({\n        destination: destinationAddress,\n        amount: Number(fromNano(valueNano)),\n        amountNano: valueNano.toString(),\n        payload: payloadCell ?? payload,\n        sender,\n        boc,\n        balanceBefore: {\n          nano: Number(balanceNano),\n          ton: Number(fromNano(balanceNano)),\n        },\n      });\n    } catch (e) {\n      return err(\n        new FragmentError(\"UNKNOWN\", e instanceof Error ? e.message : \"Failed to send TON.\", {\n          cause: e,\n        }),\n      );\n    }\n  }\n}\n\n/** Resolve `amount` (TON) / `amountNano` (nanoTON) into an exact bigint nano value. */\nfunction resolveValueNano(\n  amount: number | undefined,\n  amountNano: string | bigint | undefined,\n): Result<bigint> {\n  if (amount !== undefined && amountNano !== undefined) {\n    return err(\n      validationError(\"Provide either `amount` or `amountNano`, not both.\"),\n    );\n  }\n  if (amountNano !== undefined) {\n    let v: bigint;\n    try {\n      v = BigInt(amountNano);\n    } catch {\n      return err(validationError(\"`amountNano` must be an integer (nanoTON).\"));\n    }\n    if (v <= 0n) {\n      return err(validationError(\"`amountNano` must be greater than 0.\"));\n    }\n    return ok(v);\n  }\n  if (amount !== undefined) {\n    if (!Number.isFinite(amount) || amount <= 0) {\n      return err(validationError(\"`amount` must be greater than 0.\"));\n    }\n    return ok(toNano(amount.toString()));\n  }\n  return err(validationError(\"Provide `amount` (TON) or `amountNano` (nanoTON).\"));\n}\n\n/** TON wallet operations: balance + nested v4r2 transfers. */\nexport class WalletService extends BaseService {\n  readonly v4r2: V4R2Service;\n\n  constructor(ctx: FragmentContext) {\n    super(ctx);\n    this.v4r2 = new V4R2Service(ctx);\n  }\n\n  /**\n   * Derive your wallet's v4r2 address from the configured `walletSeed` — no\n   * network. Compare `raw` with a Fragment `transaction.from` to confirm the\n   * payment will originate from the wallet the order expects.\n   *\n   * @example\n   * ```ts\n   * const me = await client.ton.wallet.getAddress();\n   * if (me.ok) console.log(me.data.friendly, me.data.raw);\n   * ```\n   */\n  async getAddress(): Promise<Result<WalletAddress>> {\n    const { walletSeed } = this.ctx.credentials;\n    if (!walletSeed) return err(validationError(\"walletSeed is not set.\"));\n    try {\n      const keyPair = await mnemonicToPrivateKey(walletSeed.trim().split(/\\s+/));\n      const wallet = WalletContractV4.create({\n        workchain: 0,\n        publicKey: keyPair.publicKey,\n      });\n      return ok({\n        friendly: wallet.address.toString(),\n        raw: wallet.address.toRawString(),\n      });\n    } catch (e) {\n      return err(\n        new FragmentError(\"VALIDATION\", \"Invalid walletSeed.\", { cause: e }),\n      );\n    }\n  }\n\n  /**\n   * Build the TON Connect-style account JSON Fragment expects in the\n   * post-broadcast confirm call (see {@link StarsService.confirmPayment}).\n   *\n   * The shape matches what `tonConnectUI.wallet.account` carries on\n   * fragment.com — raw address, hex public key, mainnet chain, and the BoC of\n   * the wallet's StateInit.\n   *\n   * @example\n   * ```ts\n   * const account = await client.ton.wallet.getAccount();\n   * if (account.ok) console.log(account.data.address);\n   * ```\n   */\n  async getAccount(): Promise<Result<TonConnectAccount>> {\n    const { walletSeed } = this.ctx.credentials;\n    if (!walletSeed) return err(validationError(\"walletSeed is not set.\"));\n    try {\n      const keyPair = await mnemonicToPrivateKey(walletSeed.trim().split(/\\s+/));\n      const wallet = WalletContractV4.create({\n        workchain: 0,\n        publicKey: keyPair.publicKey,\n      });\n      const stateInitCell = beginCell()\n        .store(\n          storeStateInit({\n            code: wallet.init.code,\n            data: wallet.init.data,\n          }),\n        )\n        .endCell();\n      return ok({\n        address: wallet.address.toRawString(),\n        publicKey: keyPair.publicKey.toString(\"hex\"),\n        chain: \"-239\",\n        walletStateInit: stateInitCell.toBoc().toString(\"base64\"),\n      });\n    } catch (e) {\n      return err(\n        new FragmentError(\"VALIDATION\", \"Invalid walletSeed.\", { cause: e }),\n      );\n    }\n  }\n\n  /**\n   * Sign a TON Connect `ton_proof` challenge with your `walletSeed`.\n   *\n   * Wallet-side of Fragment's TON Connect login. Normally you don't call this\n   * directly — {@link connectTonWallet} scrapes the challenge and runs the whole\n   * handshake for you.\n   */\n  async signTonProof({\n    payload,\n    domain = FRAGMENT_DOMAIN,\n  }: SignTonProofParams): Promise<Result<TonProof>> {\n    if (typeof payload !== \"string\" || payload.length === 0) {\n      return err(validationError(\"`payload` (ton_proof challenge) is required.\"));\n    }\n    const { walletSeed } = this.ctx.credentials;\n    if (!walletSeed) return err(validationError(\"walletSeed is not set.\"));\n    try {\n      const keyPair = await mnemonicToPrivateKey(walletSeed.trim().split(/\\s+/));\n      const wallet = WalletContractV4.create({\n        workchain: 0,\n        publicKey: keyPair.publicKey,\n      });\n      const stateInit = beginCell()\n        .store(storeStateInit({ code: wallet.init.code, data: wallet.init.data }))\n        .endCell()\n        .toBoc()\n        .toString(\"base64\");\n\n      const timestamp = Math.floor(Date.now() / 1000);\n      const domainBuf = Buffer.from(domain, \"utf8\");\n      const wc = Buffer.alloc(4);\n      wc.writeInt32BE(wallet.address.workChain);\n      const domainLen = Buffer.alloc(4);\n      domainLen.writeUInt32LE(domainBuf.length);\n      const ts = Buffer.alloc(8);\n      ts.writeBigUInt64LE(BigInt(timestamp));\n\n      // TON Connect ton_proof message (ton-connect spec):\n      //   \"ton-proof-item-v2/\" ++ workchain(int32 BE) ++ addrHash(32) ++\n      //   domainLen(uint32 LE) ++ domain ++ timestamp(uint64 LE) ++ payload\n      const message = Buffer.concat([\n        Buffer.from(\"ton-proof-item-v2/\", \"utf8\"),\n        wc,\n        wallet.address.hash,\n        domainLen,\n        domainBuf,\n        ts,\n        Buffer.from(payload, \"utf8\"),\n      ]);\n      // signature = ed25519( sha256( 0xffff ++ \"ton-connect\" ++ sha256(message) ) )\n      const signInput = sha256(\n        Buffer.concat([\n          Buffer.from([0xff, 0xff]),\n          Buffer.from(\"ton-connect\", \"utf8\"),\n          sha256(message),\n        ]),\n      );\n      const signature = sign(signInput, keyPair.secretKey).toString(\"base64\");\n\n      return ok({\n        timestamp,\n        domain: { lengthBytes: domainBuf.length, value: domain },\n        signature,\n        payload,\n        state_init: stateInit,\n      });\n    } catch (e) {\n      return err(\n        new FragmentError(\"VALIDATION\", \"Invalid walletSeed.\", { cause: e }),\n      );\n    }\n  }\n\n  /**\n   * Establish a **fully-proven** TON Connect session with Fragment from your\n   * `walletSeed`, and store the fresh `stel_ton_token` on the client.\n   *\n   * Fragment accepts an ordinary `stel_ton_token` for *creating* Stars orders,\n   * but it only **credits** a purchase when the paying wallet's TON Connect\n   * session was proven this session (`checkTonProofAuth` → `verified: true`) —\n   * the same handshake fragment.com runs on every page load. Without it the TON\n   * debits but Stars never arrive. {@link StarsService.purchase} calls this\n   * automatically; call it yourself before a manual buy flow.\n   *\n   * @example\n   * ```ts\n   * const c = await client.ton.wallet.connectTonWallet();\n   * if (c.ok && c.data.verified) console.log(\"session proven ✅\");\n   * ```\n   */\n  async connectTonWallet({\n    url = \"https://fragment.com/\",\n  }: { url?: string } = {}): Promise<Result<ConnectTonWalletData>> {\n    const { walletSeed } = this.ctx.credentials;\n    if (!walletSeed) return err(validationError(\"walletSeed is not set.\"));\n\n    // 1) Scrape the `ton_proof` challenge Fragment embeds in its page state.\n    const page = await this.ctx.http.getText(url, {\n      headers: this.ctx.htmlHeaders(),\n    });\n    if (!page.ok) return page;\n\n    // Keep the session hash fresh while we're on the page.\n    const hashMatch = page.data.match(/api\\?hash=([0-9a-f]{16,})/i);\n    if (hashMatch?.[1]) this.ctx.update({ hash: hashMatch[1] });\n\n    const proofMatch = page.data.match(/\"ton_proof\":\"([^\"]*)\"/);\n    const payload = proofMatch?.[1];\n    if (!payload) {\n      return err(\n        new FragmentError(\n          \"AUTH\",\n          \"No `ton_proof` challenge found on the page — check your stel_* cookies and that a wallet is connected on fragment.com.\",\n        ),\n      );\n    }\n\n    // 2) Build the account JSON + sign the proof.\n    const account = await this.getAccount();\n    if (!account.ok) return account;\n    const proof = await this.signTonProof({ payload });\n    if (!proof.ok) return proof;\n\n    // 3) POST checkTonProofAuth — Fragment returns {verified} + a Set-Cookie\n    //    carrying a freshly-proven stel_ton_token.\n    const res = await this.ctx.http.postFormRaw<{\n      verified?: boolean;\n      error?: string;\n    }>(\n      this.ctx.apiUrl(),\n      {\n        account: JSON.stringify(account.data),\n        device: JSON.stringify(DEFAULT_DEVICE),\n        proof: JSON.stringify(proof.data),\n        method: \"checkTonProofAuth\",\n      },\n      { headers: this.ctx.apiHeaders() },\n    );\n    if (!res.ok) return res;\n\n    const { data: body, setCookies } = res.data;\n    if (!body.verified) {\n      return err(\n        apiError(body.error ?? \"Fragment rejected the TON proof (verified=false).\", {\n          details: body,\n        }),\n      );\n    }\n\n    // 4) Capture and store the fresh stel_ton_token so later calls send it.\n    let tonToken: string | undefined;\n    for (const cookie of setCookies) {\n      const m = cookie.match(/(?:^|\\s)stel_ton_token=([^;]+)/);\n      if (m?.[1] && m[1] !== \"DELETED\") {\n        tonToken = m[1];\n        break;\n      }\n    }\n    if (tonToken) this.ctx.update({ stelTonToken: tonToken });\n\n    return ok({ verified: true, tonToken });\n  }\n\n  /**\n   * Poll toncenter until the broadcast external message lands in a confirmed\n   * transaction — the same wait the working Go client does before it considers a\n   * purchase done. Fragment credits Stars off the confirmed on-chain payment, so\n   * this both confirms success and gives Fragment's watcher time to see it.\n   *\n   * @example\n   * ```ts\n   * const tx = await client.ton.wallet.v4r2.send({ ... });\n   * if (tx.ok) await client.ton.wallet.waitForConfirmation({ boc: tx.data.boc });\n   * ```\n   */\n  async waitForConfirmation({\n    boc,\n    address,\n    timeoutMs = 90_000,\n    pollIntervalMs = 5_000,\n  }: WaitConfirmationParams): Promise<Result<WaitConfirmationData>> {\n    const { toncenterApiKey } = this.ctx.credentials;\n    if (!toncenterApiKey) {\n      return err(validationError(\"toncenterApiKey is not set.\"));\n    }\n    let wantHash: string;\n    try {\n      wantHash = Cell.fromBase64(boc).hash().toString(\"base64\");\n    } catch {\n      return err(validationError(\"`boc` is not a valid base64 BoC cell.\"));\n    }\n\n    let sender = address;\n    if (!sender) {\n      const addr = await this.getAddress();\n      if (!addr.ok) return addr;\n      sender = addr.data.raw;\n    }\n\n    const deadline = Date.now() + timeoutMs;\n    let firstPoll = true;\n    while (Date.now() < deadline) {\n      if (!firstPoll) await sleep(pollIntervalMs);\n      firstPoll = false;\n\n      const res = await this.ctx.http.getJson<{\n        ok?: boolean;\n        result?: Array<{\n          transaction_id?: { hash?: string };\n          in_msg?: { hash?: string };\n        }>;\n      }>(\"https://toncenter.com/api/v2/getTransactions\", {\n        params: { address: sender, limit: 12 },\n        headers: { \"X-API-Key\": toncenterApiKey },\n      });\n      // Transient errors (rate limits etc.) — keep polling until the deadline.\n      if (res.ok) {\n        for (const tx of res.data.result ?? []) {\n          if (tx.in_msg?.hash === wantHash) {\n            return ok({ txHash: tx.transaction_id?.hash ?? \"\" });\n          }\n        }\n      }\n    }\n\n    return err(\n      new FragmentError(\n        \"NETWORK\",\n        `Timed out after ${timeoutMs}ms waiting for the TON transfer to confirm on-chain.`,\n      ),\n    );\n  }\n\n  /**\n   * Check a TON wallet balance. Uses toncenter when `toncenterApiKey` is set,\n   * otherwise tonconsole (tonapi.io) when `tonconsoleApiKey` is set.\n   *\n   * @example\n   * ```ts\n   * const res = await client.ton.wallet.getBalance({ address: \"UQ...\" });\n   * if (res.ok) console.log(res.data.ton);\n   * ```\n   */\n  async getBalance({\n    address,\n  }: GetBalanceParams): Promise<Result<WalletBalance>> {\n    if (typeof address !== \"string\" || address.length === 0) {\n      return err(validationError(\"`address` must be a non-empty string.\"));\n    }\n\n    const { toncenterApiKey, tonconsoleApiKey } = this.ctx.credentials;\n    if (toncenterApiKey) return this.balanceFromToncenter(address);\n    if (tonconsoleApiKey) return this.balanceFromTonconsole(address);\n    return err(\n      validationError(\n        \"No API key set. Provide toncenterApiKey or tonconsoleApiKey.\",\n      ),\n    );\n  }\n\n  private async balanceFromToncenter(\n    address: string,\n  ): Promise<Result<WalletBalance>> {\n    const res = await this.ctx.http.getJson<{\n      ok?: boolean;\n      result?: string;\n      error?: string;\n    }>(\"https://toncenter.com/api/v2/getAddressBalance\", {\n      params: { address },\n      headers: { \"X-API-Key\": this.ctx.credentials.toncenterApiKey },\n    });\n    if (!res.ok) return res;\n\n    if (res.data.ok && res.data.result !== undefined) {\n      const nano = Number.parseInt(res.data.result, 10);\n      return ok({ nano, ton: nano / NANO, source: \"toncenter\" });\n    }\n    return err(toApiError(res.data.error ?? \"Unknown toncenter error\", res.data));\n  }\n\n  private async balanceFromTonconsole(\n    address: string,\n  ): Promise<Result<WalletBalance>> {\n    const res = await this.ctx.http.getJson<{ balance?: number | string }>(\n      `https://tonapi.io/v2/accounts/${encodeURIComponent(address)}`,\n      { headers: { Authorization: `Bearer ${this.ctx.credentials.tonconsoleApiKey}` } },\n    );\n    if (!res.ok) return res;\n\n    if (res.data.balance !== undefined) {\n      const nano =\n        typeof res.data.balance === \"string\"\n          ? Number.parseInt(res.data.balance, 10)\n          : res.data.balance;\n      return ok({ nano, ton: nano / NANO, source: \"tonconsole\" });\n    }\n    return err(toApiError(\"Balance not found in tonconsole response\", res.data));\n  }\n}\n\nfunction toApiError(message: string, details: unknown): FragmentError {\n  return new FragmentError(\"API\", message, { details });\n}\n","import { BaseService, type FragmentContext } from \"../core/context.js\";\nimport { FragmentError, apiError, validationError } from \"../core/errors.js\";\nimport { err, ok, type Result } from \"../core/result.js\";\nimport type {\n  ConfirmStarsPaymentData,\n  ConfirmStarsPaymentParams,\n  GetPaymentInfoParams,\n  GetStarsPriceParams,\n  InitStarsPaymentParams,\n  PaymentInfo,\n  PaymentInit,\n  PurchaseStarsData,\n  PurchaseStarsParams,\n  StarsPrice,\n  TonConnectDevice,\n} from \"../types.js\";\nimport { WalletService } from \"./wallet.service.js\";\n\ninterface RawPriceResponse {\n  ok?: boolean;\n  cur_price?: string;\n}\n\n/**\n * Default TonConnect device hint sent with the confirm call. Fragment doesn't\n * verify the contents, but the field must be present and well-formed JSON.\n */\nconst DEFAULT_DEVICE: TonConnectDevice = {\n  platform: \"windows\",\n  appName: \"tonkeeper\",\n  appVersion: \"4.10.0\",\n  maxProtocolVersion: 2,\n  features: [\n    \"SendTransaction\",\n    { name: \"SendTransaction\", maxMessages: 4 },\n    { name: \"SignData\", types: [\"text\", \"binary\", \"cell\"] },\n  ],\n};\n\n/** Telegram Stars: pricing and the purchase flow. */\nexport class StarsService extends BaseService {\n  private readonly wallet: WalletService;\n\n  constructor(ctx: FragmentContext, wallet: WalletService) {\n    super(ctx);\n    this.wallet = wallet;\n  }\n  /**\n   * Get the current price for a given quantity of Telegram Stars.\n   *\n   * @example\n   * ```ts\n   * const res = await client.stars.getPrice({ quantity: 5050 });\n   * if (res.ok) console.log(res.data.curPrice.TON, res.data.curPrice.USDT);\n   * ```\n   */\n  async getPrice({\n    quantity,\n  }: GetStarsPriceParams): Promise<Result<StarsPrice>> {\n    const qty =\n      typeof quantity === \"string\" ? Number.parseInt(quantity, 10) : quantity;\n    if (!Number.isFinite(qty) || qty <= 0) {\n      return err(validationError(\"`quantity` must be a positive number.\"));\n    }\n\n    const res = await this.ctx.http.postForm<RawPriceResponse>(\n      this.ctx.apiUrl(),\n      { stars: 0, quantity: Math.trunc(qty), method: \"updateStarsPrices\" },\n      { headers: this.ctx.apiHeaders() },\n    );\n    if (!res.ok) return res;\n\n    if (!res.data.ok) {\n      return err(\n        apiError(\"Fragment returned ok=false for the price request.\", {\n          details: res.data,\n        }),\n      );\n    }\n\n    const html = res.data.cur_price ?? \"\";\n    const tonMatch = html.match(\n      /icon-ton\">(\\d+)<span class=\"mini-frac\">\\.(\\d+)<\\/span>/,\n    );\n    const ton = tonMatch ? `${tonMatch[1]}.${tonMatch[2]}` : \"0\";\n    // USD is rendered as `&#036;75.75` / `&#36;75.75` / `$75.75` (entity or literal).\n    const usdtMatch = html.match(/(?:&#0?36;|\\$)\\s*(\\d+(?:\\.\\d+)?)/);\n    const usdt = usdtMatch ? usdtMatch[1]! : \"0\";\n\n    return ok({ ok: true, curPrice: { TON: ton, USDT: usdt } });\n  }\n\n  /**\n   * Initialize a Stars purchase for a recipient.\n   *\n   * Sends `payment_method` (default `\"ton\"`) — this is **required** by Fragment;\n   * omitting it yields `Access denied`. If the Fragment account has no connected\n   * wallet, the response carries `need_ton`, surfaced here as an `AUTH` error.\n   *\n   * @example\n   * ```ts\n   * const res = await client.stars.initPayment({ recipient, quantity: 50 });\n   * if (res.ok) console.log(res.data.req_id, res.data.amount);\n   * ```\n   */\n  async initPayment({\n    recipient,\n    quantity,\n    paymentMethod = \"ton\",\n  }: InitStarsPaymentParams): Promise<Result<PaymentInit>> {\n    if (typeof recipient !== \"string\" || recipient.length === 0) {\n      return err(validationError(\"`recipient` must be a non-empty string.\"));\n    }\n    if (!Number.isFinite(quantity) || quantity <= 0) {\n      return err(validationError(\"`quantity` must be a positive number.\"));\n    }\n\n    // Fragment rejects a \"cold\" init with \"Price was changed\" unless the\n    // session's TON price was just synced. The website does this by polling\n    // updateStarsBuyState; we sync once before each attempt and retry if the\n    // (volatile) TON price moves in between.\n    let last: PaymentInit | undefined;\n    for (let attempt = 0; attempt < 3; attempt++) {\n      await this.syncBuyState();\n\n      const res = await this.ctx.http.postForm<PaymentInit>(\n        this.ctx.apiUrl(),\n        {\n          recipient,\n          quantity,\n          payment_method: paymentMethod,\n          method: \"initBuyStarsRequest\",\n        },\n        { headers: this.ctx.apiHeaders() },\n      );\n      if (!res.ok) return res;\n      last = res.data;\n\n      if (res.data.req_id) return ok(res.data);\n      if (res.data.need_ton) {\n        return err(\n          new FragmentError(\n            \"AUTH\",\n            \"Fragment requires a connected TON wallet (need_ton). Connect a wallet on fragment.com first.\",\n            { details: res.data },\n          ),\n        );\n      }\n      // Price drifted between sync and init — re-sync and try again.\n      if (res.data.error && /price/i.test(res.data.error)) continue;\n      if (res.data.error) {\n        return err(apiError(res.data.error, { details: res.data }));\n      }\n      return err(\n        apiError(\"Fragment did not return a req_id.\", { details: res.data }),\n      );\n    }\n    return err(\n      apiError(\"Could not lock a price (it kept changing). Try again.\", {\n        details: last,\n      }),\n    );\n  }\n\n  /** Sync the session's Stars buy state (TON price) like the website's poller. */\n  private async syncBuyState(): Promise<void> {\n    await this.ctx.http.postForm(\n      this.ctx.apiUrl(),\n      { mode: \"new\", lv: \"false\", method: \"updateStarsBuyState\" },\n      { headers: this.ctx.apiHeaders() },\n    );\n  }\n\n  /**\n   * Get the on-chain transaction (address, amount, payload) for a Stars purchase\n   * initialized with {@link StarsService.initPayment}. The returned\n   * `transaction.messages[0]` can be signed and broadcast with\n   * {@link V4R2Service.send}.\n   *\n   * @example\n   * ```ts\n   * const info = await client.stars.getPaymentInfo({ requestId });\n   * if (info.ok) {\n   *   const msg = info.data.transaction!.messages[0]!;\n   *   // msg.address, msg.amount, msg.payload\n   * }\n   * ```\n   */\n  async getPaymentInfo({\n    requestId,\n    showSender = false,\n    account,\n    device = DEFAULT_DEVICE,\n  }: GetPaymentInfoParams): Promise<Result<PaymentInfo>> {\n    if (typeof requestId !== \"string\" || requestId.length === 0) {\n      return err(validationError(\"`requestId` must be a non-empty string.\"));\n    }\n\n    // Mirror the website's generic `Wallet.sendTransaction`: the\n    // `getBuyStarsLink` request carries the paying wallet's `account` (and a\n    // `device` hint). Fragment binds the order to that account here and only\n    // then returns a `confirm_method`/`confirm_params` that its post-broadcast\n    // matcher will honour. Without `account`, the TON debits but Stars are\n    // never credited.\n    const body: Record<string, string | number> = {\n      id: requestId,\n      show_sender: showSender ? 1 : 0,\n      transaction: 1,\n      method: \"getBuyStarsLink\",\n    };\n    if (account) {\n      body.account = JSON.stringify(account);\n      body.device = JSON.stringify(device);\n    }\n\n    const res = await this.ctx.http.postForm<PaymentInfo>(\n      this.ctx.apiUrl(),\n      body,\n      { headers: this.ctx.apiHeaders() },\n    );\n    if (!res.ok) return res;\n\n    if (res.data.need_verify) {\n      return err(\n        new FragmentError(\n          \"AUTH\",\n          \"Fragment requires additional verification (need_verify) for this purchase.\",\n          { details: res.data },\n        ),\n      );\n    }\n    if (!res.data.ok || !res.data.transaction) {\n      return err(\n        apiError(res.data.error ?? \"Fragment returned no transaction.\", {\n          details: res.data,\n        }),\n      );\n    }\n    return ok(res.data);\n  }\n\n  /**\n   * Tell Fragment that a Stars TON payment has been broadcast.\n   *\n   * The website does this automatically after TonConnect signs the transfer\n   * (see `Wallet.sendTransaction` in `auction.js`). It POSTs the `confirm_method`\n   * returned by {@link getPaymentInfo} with `{account, device, boc, ...confirm_params}`.\n   * **Without this call Fragment never matches the on-chain TON to the order**,\n   * so Stars are not credited — even though the TON debits successfully.\n   *\n   * @example\n   * ```ts\n   * const tx = await client.ton.wallet.v4r2.send({ ... });\n   * const account = await client.ton.wallet.getAccount();\n   * if (tx.ok && account.ok) {\n   *   await client.stars.confirmPayment({\n   *     method: info.data.confirm_method!,\n   *     params: info.data.confirm_params,\n   *     account: account.data,\n   *     boc: tx.data.boc,\n   *   });\n   * }\n   * ```\n   */\n  async confirmPayment({\n    method,\n    params = {},\n    account,\n    device = DEFAULT_DEVICE,\n    boc,\n  }: ConfirmStarsPaymentParams): Promise<Result<ConfirmStarsPaymentData>> {\n    if (typeof method !== \"string\" || method.length === 0) {\n      return err(validationError(\"`method` must be a non-empty string.\"));\n    }\n    if (typeof boc !== \"string\" || boc.length === 0) {\n      return err(validationError(\"`boc` must be a non-empty string.\"));\n    }\n    if (!account || typeof account.address !== \"string\") {\n      return err(validationError(\"`account` is required.\"));\n    }\n\n    const body: Record<string, string | number> = {\n      account: JSON.stringify(account),\n      device: JSON.stringify(device),\n      boc,\n    };\n    for (const [k, v] of Object.entries(params)) {\n      if (v === undefined || v === null) continue;\n      body[k] = typeof v === \"object\" ? JSON.stringify(v) : String(v);\n    }\n    body.method = method;\n\n    const res = await this.ctx.http.postForm<ConfirmStarsPaymentData>(\n      this.ctx.apiUrl(),\n      body,\n      { headers: this.ctx.apiHeaders() },\n    );\n    if (!res.ok) return res;\n\n    if (res.data && res.data.ok === false) {\n      const raw = res.data as unknown as { error?: unknown };\n      const errMsg =\n        typeof raw.error === \"string\"\n          ? raw.error\n          : \"Fragment did not credit the Stars purchase.\";\n      return err(apiError(errMsg, { details: res.data }));\n    }\n    return ok(res.data ?? { ok: true });\n  }\n\n  /**\n   * High-level Stars purchase — runs Fragment's real flow end-to-end:\n   * `initBuyStarsRequest` → `getBuyStarsLink` (bound to your wallet `account`)\n   * → broadcast the TON transfer → wait for on-chain confirmation.\n   *\n   * This mirrors a known-good headless implementation: Fragment credits Stars\n   * off the confirmed on-chain payment matched to the order — there is **no\n   * post-broadcast `confirm_method` POST** and **no TON Connect proof** in this\n   * path (both are available as {@link confirmPayment} / {@link WalletService.connectTonWallet}\n   * for the website-style flow, but are not needed here).\n   *\n   * Requires `walletSeed` and `toncenterApiKey` in addition to the usual\n   * `stel_*` cookies + `hash`. **The paying wallet must be the one connected to\n   * your Fragment session** (v4r2, derived from `walletSeed`).\n   *\n   * @example\n   * ```ts\n   * const user = await client.users.nickToHash({ nickname: \"maksim_dremin\" });\n   * if (!user.ok) return;\n   * const res = await client.stars.purchase({\n   *   recipient: user.data.found!.recipient,\n   *   quantity: 50,\n   * });\n   * if (res.ok) console.log(\"Stars sent:\", res.data.amount, \"TON, tx\", res.data.txHash);\n   * ```\n   */\n  async purchase({\n    recipient,\n    quantity,\n    showSender = false,\n    device = DEFAULT_DEVICE,\n    waitForConfirmation = true,\n  }: PurchaseStarsParams): Promise<Result<PurchaseStarsData>> {\n    const init = await this.initPayment({ recipient, quantity });\n    if (!init.ok) return init;\n\n    // Resolve the paying wallet up front: Fragment binds the order to the\n    // `account` sent on `getBuyStarsLink`, then credits the on-chain payment\n    // that arrives from it.\n    const account = await this.wallet.getAccount();\n    if (!account.ok) return account;\n\n    const info = await this.getPaymentInfo({\n      requestId: init.data.req_id,\n      showSender,\n      account: account.data,\n      device,\n    });\n    if (!info.ok) return info;\n\n    const message = info.data.transaction?.messages[0];\n    if (!message) {\n      return err(\n        apiError(\"Fragment returned no transaction message.\", {\n          details: info.data,\n        }),\n      );\n    }\n\n    const tx = await this.wallet.v4r2.send({\n      destinationAddress: message.address,\n      amountNano: message.amount,\n      payloadCell: message.payload,\n    });\n    if (!tx.ok) return tx;\n\n    let txHash = \"\";\n    if (waitForConfirmation) {\n      const confirmed = await this.wallet.waitForConfirmation({\n        boc: tx.data.boc,\n        address: tx.data.sender,\n      });\n      if (!confirmed.ok) return confirmed;\n      txHash = confirmed.data.txHash;\n    }\n\n    return ok({\n      reqId: init.data.req_id,\n      amount: tx.data.amount,\n      amountNano: tx.data.amountNano,\n      destination: tx.data.destination,\n      sender: tx.data.sender,\n      boc: tx.data.boc,\n      txHash,\n    });\n  }\n}\n","import { BaseService, type FragmentContext } from \"../core/context.js\";\nimport { notFoundError } from \"../core/errors.js\";\nimport { err, ok, type Result } from \"../core/result.js\";\nimport type { LiteServer, TonGlobalConfig } from \"../types.js\";\nimport { WalletService } from \"./wallet.service.js\";\n\nconst CONFIG_URL = \"https://ton-blockchain.github.io/global.config.json\";\n\n/** Convert a (possibly signed) int32 IP to a dotted-decimal string. */\nexport function intToIp(ipInt: number): string {\n  const v = ipInt < 0 ? ipInt + 2 ** 32 : ipInt;\n  return [\n    (v >>> 24) & 0xff,\n    (v >>> 16) & 0xff,\n    (v >>> 8) & 0xff,\n    v & 0xff,\n  ].join(\".\");\n}\n\n/** TON blockchain: liteservers and wallet operations. */\nexport class TonService extends BaseService {\n  readonly wallet: WalletService;\n\n  constructor(ctx: FragmentContext) {\n    super(ctx);\n    this.wallet = new WalletService(ctx);\n  }\n\n  /** Fetch the full TON global config (contains the liteserver list). */\n  async getLiteServers(): Promise<Result<TonGlobalConfig>> {\n    return this.ctx.http.getJson<TonGlobalConfig>(CONFIG_URL);\n  }\n\n  /**\n   * Pick a random liteserver, with the integer IP resolved to a readable\n   * `ip_readable` field.\n   *\n   * @example\n   * ```ts\n   * const res = await client.ton.getRandomLiteServer();\n   * if (res.ok) console.log(res.data.ip_readable, res.data.port);\n   * ```\n   */\n  async getRandomLiteServer(): Promise<Result<LiteServer>> {\n    const res = await this.getLiteServers();\n    if (!res.ok) return res;\n\n    const servers = res.data.liteservers ?? [];\n    if (servers.length === 0) {\n      return err(notFoundError(\"No liteservers found in the TON config.\"));\n    }\n\n    const server = servers[Math.floor(Math.random() * servers.length)]!;\n    if (typeof server.ip === \"number\") {\n      return ok({ ...server, ip_readable: intToIp(server.ip) });\n    }\n    return ok(server);\n  }\n}\n","import { BaseService } from \"../core/context.js\";\nimport { notFoundError, validationError } from \"../core/errors.js\";\nimport { err, ok, type Result } from \"../core/result.js\";\nimport type { NickToHashData, NickToHashParams } from \"../types.js\";\n\n/** Username lookups against the Fragment API. */\nexport class UsersService extends BaseService {\n  /**\n   * Resolve a Telegram nickname to its Fragment `recipient` hash.\n   *\n   * @example\n   * ```ts\n   * const res = await client.users.nickToHash({ nickname: \"durov\" });\n   * if (res.ok) console.log(res.data.found?.recipient);\n   * ```\n   */\n  async nickToHash({\n    nickname,\n  }: NickToHashParams): Promise<Result<NickToHashData>> {\n    if (typeof nickname !== \"string\" || nickname.trim().length === 0) {\n      return err(validationError(\"`nickname` must be a non-empty string.\"));\n    }\n\n    const res = await this.ctx.http.postForm<NickToHashData>(\n      this.ctx.apiUrl(),\n      { query: nickname, quantity: \"\", method: \"searchStarsRecipient\" },\n      { headers: this.ctx.apiHeaders() },\n    );\n    if (!res.ok) return res;\n\n    if (!res.data.ok || !res.data.found) {\n      return err(\n        notFoundError(\n          res.data.error ?? `No recipient found for \"@${nickname}\".`,\n          { details: res.data },\n        ),\n      );\n    }\n    return ok(res.data);\n  }\n}\n","import { fromNano, toNano } from \"@ton/ton\";\nimport { BaseService } from \"../core/context.js\";\nimport { validationError } from \"../core/errors.js\";\nimport { err, ok, type Result } from \"../core/result.js\";\nimport { decodePayload } from \"../parsers/decoder.js\";\nimport type { DecodePayloadData, DecodePayloadParams } from \"../types.js\";\n\n/** Stateless helpers (no network). */\nexport class UtilsService extends BaseService {\n  /**\n   * Decode a base64 transaction payload into its readable comment text.\n   *\n   * @example\n   * ```ts\n   * const res = client.utils.decodePayload({ payload: \"te6ccg...\" });\n   * if (res.ok) console.log(res.data.decoded);\n   * ```\n   */\n  decodePayload({\n    payload,\n  }: DecodePayloadParams): Result<DecodePayloadData> {\n    if (typeof payload !== \"string\" || payload.length === 0) {\n      return err(validationError(\"`payload` must be a non-empty string.\"));\n    }\n    return ok({ payload, decoded: decodePayload(payload) });\n  }\n\n  /**\n   * Convert human TON to exact nanoTON (1 TON = 1e9 nanoTON), with no floating\n   * point. `toTon(\"0.4561\")` → `456100000n`.\n   */\n  toNano(ton: string | number): bigint {\n    return toNano(typeof ton === \"number\" ? ton.toFixed(9) : ton);\n  }\n\n  /**\n   * Convert nanoTON to a human TON decimal string. `fromNano(\"456100000\")` →\n   * `\"0.4561\"`. Safe alternative to `Number(nano) / 1e9`.\n   */\n  fromNano(nano: string | bigint): string {\n    return fromNano(nano);\n  }\n}\n","/**\n * Pure base64 payload decoder (no network). Extracts the readable comment text\n * carried by a Fragment transaction cell.\n */\n\n/** Pad a base64 string with `=` up to a multiple of 4. */\nfunction padBase64(s: string): string {\n  return s + \"=\".repeat((4 - (s.length % 4)) % 4);\n}\n\n/**\n * Find the first run of printable characters (ASCII 0x20–0x7E plus tab/CR/LF)\n * at least `minLen` long.\n */\nfunction findPrintableText(buf: Buffer, minLen = 3): string | null {\n  // latin1 maps each byte 1:1 to a char, so the regex sees the raw bytes.\n  const s = buf.toString(\"latin1\");\n  const pattern = new RegExp(`[\\\\t\\\\r\\\\n\\\\x20-\\\\x7E]{${minLen},}`);\n  const match = s.match(pattern);\n  return match ? match[0] : null;\n}\n\n/**\n * Decode a Fragment transaction `payload` (base64 cell) into the readable\n * comment text it carries, e.g. `\"50 Telegram Stars\\n\\nRef#Im2y5itd6\"`.\n */\nexport function decodePayload(payload: string): string {\n  const padded = padBase64(payload.trim());\n\n  let raw: Buffer;\n  try {\n    raw = Buffer.from(padded, \"base64\");\n  } catch {\n    raw = Buffer.from(payload, \"utf-8\");\n  }\n\n  const cleaned = findPrintableText(raw, 3);\n  if (cleaned) {\n    return cleaned.replace(/^[\\r\\n]+|[\\r\\n]+$/g, \"\");\n  }\n\n  const decodedUtf = raw.toString(\"utf-8\").trim();\n  if (decodedUtf) return decodedUtf;\n\n  return raw.toString(\"hex\");\n}\n","/**\n * Main entry point — a class-based, fully-typed client for Fragment.com.\n *\n * ```ts\n * import { Fragment } from \"telegram-fragment-api\";\n *\n * const client = new Fragment({\n *   hash: \"...\",\n *   stelSsid: \"...\",\n *   stelToken: \"...\",\n *   stelTonToken: \"...\",\n *   toncenterApiKey: \"...\",\n *   walletSeed: \"word1 word2 ...\",\n * });\n *\n * const res = await client.stars.getPrice({ quantity: 5050 });\n * if (res.ok) console.log(res.data.curPrice.TON);\n * else console.error(res.error.code, res.error.message);\n * ```\n */\n\nimport type {\n  FragmentConfig,\n  FragmentCredentials,\n  ResolvedCredentials,\n} from \"./core/config.js\";\nimport { FragmentContext } from \"./core/context.js\";\nimport { AccountService } from \"./services/account.service.js\";\nimport { AuthService } from \"./services/auth.service.js\";\nimport { PremiumService } from \"./services/premium.service.js\";\nimport { StarsService } from \"./services/stars.service.js\";\nimport { TonService } from \"./services/ton.service.js\";\nimport { UsersService } from \"./services/users.service.js\";\nimport { UtilsService } from \"./services/utils.service.js\";\n\nexport class Fragment {\n  private readonly ctx: FragmentContext;\n\n  /** Session / authentication helpers (`fetchHash`). */\n  readonly auth: AuthService;\n  /** Username lookups (`nickToHash`). */\n  readonly users: UsersService;\n  /** Stateless helpers (`decodePayload`). */\n  readonly utils: UtilsService;\n  /** Telegram Stars (`getPrice`, `initPayment`, `getPaymentInfo`). */\n  readonly stars: StarsService;\n  /** Telegram Premium (`getPrice`). */\n  readonly premium: PremiumService;\n  /** TON blockchain (`getRandomLiteServer`, `wallet.getBalance`, `wallet.v4r2.send`). */\n  readonly ton: TonService;\n  /** Authenticated account info (`getProfile`, `getSessions`). */\n  readonly account: AccountService;\n\n  constructor(config: FragmentConfig = {}) {\n    this.ctx = new FragmentContext(config);\n    this.auth = new AuthService(this.ctx);\n    this.users = new UsersService(this.ctx);\n    this.utils = new UtilsService(this.ctx);\n    this.premium = new PremiumService(this.ctx);\n    this.ton = new TonService(this.ctx);\n    this.stars = new StarsService(this.ctx, this.ton.wallet);\n    this.account = new AccountService(this.ctx);\n  }\n\n  /** Update credentials at runtime (chainable). */\n  configure(credentials: Partial<FragmentCredentials>): this {\n    this.ctx.update(credentials);\n    return this;\n  }\n\n  /** A read-only snapshot of the current credentials. */\n  getCredentials(): ResolvedCredentials {\n    return { ...this.ctx.credentials };\n  }\n}\n"],"mappings":"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","names":["axios","cheerio","DEFAULT_DEVICE","import_ton","import_ton"]}