@anywalletkit/wallet-ton 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-RCL4PSJZ.js → chunk-ZFENRKRW.js} +1 -1
- package/dist/{chunk-RCL4PSJZ.js.map → chunk-ZFENRKRW.js.map} +1 -1
- package/dist/history.cjs.map +1 -1
- package/dist/history.js +1 -1
- package/dist/index.cjs +107 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +32 -11
- package/dist/index.d.ts +32 -11
- package/dist/index.js +104 -26
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/buffer-global.ts","../src/errors.ts","../src/toncenter.ts","../src/emulation.ts","../src/wallet-v5r1.ts","../src/describe.ts","../src/read-only-account.ts","../src/account.ts","../src/tonconnect.ts","../src/manager.ts","../src/index.ts"],"sourcesContent":["// @ton/core and @ton/crypto read the GLOBAL `Buffer` (Node convention). Browsers\n// and Hermes have none, so the package installs the `buffer` polyfill once, at\n// import time, only when it is missing. Node and React Native entries that\n// already set it are untouched. Called as a function from index.ts (not a bare\n// import): bundlers drop bare imports of modules they consider side-effect\n// free, and this one was silently dropped from dist before.\nimport { Buffer } from 'buffer'\n\n/**\n * Set `globalThis.Buffer` to the `buffer` polyfill when the runtime has none (Hermes, browsers).\n * Runs on import.\n */\nexport function installBufferGlobal(): void {\n const g = globalThis as { Buffer?: unknown }\n g.Buffer ??= Buffer\n}\n\ninstallBufferGlobal()\n","import { SignerError } from '@anywalletkit/core'\n\n/**\n * Refused before signing: the message would almost certainly misbehave or\n * strand funds (zero value, wrong network flag, exotic workchain, a\n * `valid_until` further away than the wallet contract tolerates…).\n */\nexport class UnsafeTransactionError extends SignerError {\n readonly code: string\n constructor(code: string, message: string) {\n super(message)\n this.name = 'UnsafeTransactionError'\n this.code = code\n }\n}\n\n/**\n * `sign()` refused a 32-byte message: the wallet contract checks a transfer's signature over the\n * 32-byte hash of its signing cell, so a signature over 32 raw bytes may authorise one. TON Connect\n * proofs and signData go through `signTonProof` / `signTonConnectData`; transactions through\n * `signTransaction` / `sendTransaction`, where they are reviewed.\n */\nexport class MessageIsTransactionError extends SignerError {\n readonly code = 'message-is-transaction'\n constructor() {\n super('This message has the shape of a transaction (a 32-byte TON hash, or bytes naming this key as a Solana signer) and is not signed; use signTonProof / signTonConnectData for TON Connect, or signTransaction so it can be reviewed.')\n this.name = 'MessageIsTransactionError'\n }\n}\n\n/** Emulation of the external message failed (non-zero compute exit, aborted, action phase failed); nothing was signed or sent. */\nexport class SimulationError extends Error {\n readonly exitCode: number | undefined\n readonly aborted: boolean\n constructor(reason: string, details: { exitCode?: number; aborted?: boolean } = {}) {\n super(`Transaction simulation failed: ${reason}`)\n this.name = 'SimulationError'\n this.exitCode = details.exitCode\n this.aborted = details.aborted ?? false\n }\n}\n\n/**\n * The external message was handed to the network but no definitive answer came back (no response,\n * a timeout, a non-JSON body): it MAY be on chain. Do not sign again (the next seqno would pay\n * twice) — watch `hash`, the body hash `sendTransaction` returns.\n */\nexport class BroadcastUnknownError extends Error {\n /** Always true: the transaction may be on its way. */\n readonly maybeSent = true\n /** Hex hash of the signed body. */\n readonly hash: string\n constructor(hash: string, cause: unknown) {\n super(`Broadcast outcome unknown for ${hash}: ${cause instanceof Error ? cause.message.slice(0, 200) : String(cause).slice(0, 200)}`, { cause })\n this.name = 'BroadcastUnknownError'\n this.hash = hash\n }\n}\n","/**\n * toncenter v2 JSON-RPC client — the handful of calls a wallet needs, with\n * failover across endpoints, timeouts, api keys and response-shape checks.\n * No axios, no dataloader, no caches: one `fetch` per call.\n */\nimport { NetworkError } from '@anywalletkit/core'\nimport { Buffer } from 'buffer'\nimport { Address, Cell, TupleReader, loadTransaction, type StateInit, type Transaction, type TupleItem } from '@ton/core'\nimport type { TonConfig, TonEndpoint, TonFees, TonProvider, TonRpc } from './types.js'\n\nconst DEFAULT_TIMEOUT_MS = 15_000\n\nconst isRpc = (p: TonProvider): p is TonRpc => typeof (p as TonRpc).call === 'function'\n\n/** JSON-RPC over one toncenter v2 endpoint. */\nexport function tonCenterEndpoint(endpoint: TonEndpoint, opts: { fetch?: typeof fetch; timeoutMs?: number } = {}): TonRpc {\n const url = endpoint.url\n const doFetch = opts.fetch ?? globalThis.fetch\n if (typeof doFetch !== 'function') throw new NetworkError('No fetch available; pass config.fetch', { provider: url })\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS\n return {\n async call<T>(method: string, params: Record<string, unknown>): Promise<T> {\n let res: Response\n try {\n res = await doFetch(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json',\n ...(endpoint.secretKey ? { 'X-API-Key': endpoint.secretKey } : {}),\n },\n body: JSON.stringify({ id: '1', jsonrpc: '2.0', method, params }),\n signal: AbortSignal.timeout(timeoutMs),\n })\n } catch (e) {\n throw new NetworkError(`${method}: ${e instanceof Error ? e.message : String(e)}`, { provider: url, cause: e })\n }\n let json: { ok?: boolean; result?: T; error?: unknown; code?: unknown }\n try { json = (await res.json()) as typeof json } catch (e) {\n throw new NetworkError(`${method}: HTTP ${res.status}, non-JSON body`, { provider: url, cause: e })\n }\n if (!res.ok || json.ok !== true) {\n const detail = typeof json.error === 'string' ? json.error : JSON.stringify(json.error ?? json)\n // The node answered and said no: a definitive refusal, not a lost request.\n throw Object.assign(new NetworkError(`${method}: ${detail} (HTTP ${res.status})`, { provider: url }), { answered: true })\n }\n return json.result as T\n },\n }\n}\n\n/** An endpoint answered with a refusal (`ok: false`): nothing was taken. A thrown fetch, a timeout or a non-JSON body may have been. */\nexport function isAnsweredRefusal(e: unknown): boolean {\n return (e as { answered?: unknown } | null)?.answered === true\n}\n\n/** One RPC, or a failover RPC walking the configured list (`retries` extra rounds after the first full pass). */\nexport function createTonRpc(config: TonConfig): TonRpc | undefined {\n const target = config.tonClient ?? config.provider\n if (target === undefined) return undefined\n const list = (Array.isArray(target) ? target : [target]).map((p) =>\n isRpc(p) ? p : tonCenterEndpoint(p, { ...(config.fetch ? { fetch: config.fetch } : {}), ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}) }),\n )\n if (list.length === 0) throw new Error(\"The 'tonClient' option cannot be set to an empty list.\")\n if (list.length === 1) return list[0]!\n const attempts = list.length + (config.retries ?? 3)\n return {\n async call<T>(method: string, params: Record<string, unknown>): Promise<T> {\n let lastError: unknown\n let answered = true\n for (let i = 0; i < attempts; i++) {\n try { return await list[i % list.length]!.call<T>(method, params) } catch (e) { lastError = e; answered &&= isAnsweredRefusal(e) }\n }\n // Refused everywhere is a refusal; one endpoint that never answered may have taken it.\n const err = new NetworkError(`All TON endpoints failed for ${method}`, { cause: lastError })\n throw answered ? Object.assign(err, { answered: true }) : err\n },\n }\n}\n\n// ── Stack (de)serialization, toncenter v2 wire format ───────────────────────\n\nfunction serializeStackItem(item: TupleItem): [string, unknown] {\n switch (item.type) {\n case 'int': return ['num', item.value.toString()]\n case 'cell': return ['tvm.Cell', item.cell.toBoc().toString('base64')]\n case 'slice': return ['tvm.Slice', item.cell.toBoc().toString('base64')]\n case 'builder': return ['tvm.Builder', item.cell.toBoc().toString('base64')]\n default: throw new Error(`Unsupported stack item type: ${item.type}`)\n }\n}\n\nconst hexBigInt = (s: string): bigint => (s.startsWith('-') ? -BigInt(s.slice(1)) : BigInt(s))\nconst cellFromBase64 = (b64: string): Cell => Cell.fromBoc(Buffer.from(b64, 'base64'))[0]!\n\nfunction parseStackEntry(x: unknown): TupleItem {\n const o = x as Record<string, unknown>\n switch (o['@type']) {\n case 'tvm.list':\n case 'tvm.tuple': return { type: 'tuple', items: (o.elements as unknown[]).map(parseStackEntry) }\n case 'tvm.cell': return { type: 'cell', cell: cellFromBase64(o.bytes as string) }\n case 'tvm.stackEntryCell': return parseStackEntry(o.cell)\n case 'tvm.stackEntryTuple': return parseStackEntry(o.tuple)\n case 'tvm.stackEntryNumber': return parseStackEntry(o.number)\n case 'tvm.numberDecimal': return { type: 'int', value: BigInt(o.number as string) }\n default: throw new NetworkError(`Malformed stack entry: ${JSON.stringify(x)}`)\n }\n}\n\nfunction parseStackItem(s: unknown): TupleItem {\n if (!Array.isArray(s) || s.length < 2) throw new NetworkError(`Malformed stack item: ${JSON.stringify(s)}`)\n const [kind, value] = s as [string, unknown]\n switch (kind) {\n case 'num': return { type: 'int', value: hexBigInt(value as string) }\n case 'null': return { type: 'null' }\n case 'cell': return { type: 'cell', cell: cellFromBase64((value as { bytes: string }).bytes) }\n case 'slice': return { type: 'slice', cell: cellFromBase64((value as { bytes: string }).bytes) }\n case 'builder': return { type: 'builder', cell: cellFromBase64((value as { bytes: string }).bytes) }\n case 'tuple':\n case 'list': return { type: 'tuple', items: ((value as { elements: unknown[] }).elements ?? []).map(parseStackEntry) }\n default: throw new NetworkError(`Malformed stack item kind: ${kind}`)\n }\n}\n\n// ── Typed API ───────────────────────────────────────────────────────────────\n\n/** State of a TON account on chain. */\nexport type TonAccountStatus = 'active' | 'uninitialized' | 'frozen' | 'nonexist'\n\n/** Balance, status, code and data of an account. */\nexport interface TonAccountState {\n balance: bigint\n state: TonAccountStatus\n code: Cell | null\n data: Cell | null\n lastTransaction: { lt: string; hash: string } | null\n}\n\n/** Result of a contract get-method call. */\nexport interface GetMethodResult { exitCode: number; gasUsed: number; stack: TupleReader }\n\nconst need = <T>(cond: unknown, what: string, value: T): T => {\n if (!cond) throw new NetworkError(`Malformed toncenter response: ${what}`)\n return value\n}\n\n/** The toncenter calls a wallet uses, with parsed results. */\nexport class TonCenter {\n constructor(readonly rpc: TonRpc) {}\n\n /** Balance, status, code and data of an account. */\n async getAddressInformation(address: Address): Promise<TonAccountState> {\n const r = await this.rpc.call<Record<string, unknown>>('getAddressInformation', { address: address.toString() })\n need(r && typeof r === 'object' && typeof r.balance === 'string', 'getAddressInformation', r)\n const state = r.state as string\n const last = r.last_transaction_id as { lt?: string; hash?: string } | undefined\n return {\n balance: BigInt(r.balance as string),\n state: (['active', 'uninitialized', 'frozen', 'nonexist'] as const).includes(state as TonAccountStatus) ? (state as TonAccountStatus) : 'nonexist',\n code: typeof r.code === 'string' && r.code !== '' ? cellFromBase64(r.code) : null,\n data: typeof r.data === 'string' && r.data !== '' ? cellFromBase64(r.data) : null,\n lastTransaction: last && last.lt && last.lt !== '0' ? { lt: last.lt, hash: last.hash ?? '' } : null,\n }\n }\n\n /** Call a contract get-method; the result carries the exit code. */\n async runGetMethod(address: Address, method: string, stack: TupleItem[] = []): Promise<GetMethodResult> {\n const r = await this.rpc.call<Record<string, unknown>>('runGetMethod', {\n address: address.toString(), method, stack: stack.map(serializeStackItem),\n })\n need(r && typeof r === 'object' && typeof r.exit_code === 'number' && Array.isArray(r.stack), 'runGetMethod', r)\n return { exitCode: r.exit_code as number, gasUsed: Number(r.gas_used ?? 0), stack: new TupleReader((r.stack as unknown[]).map(parseStackItem)) }\n }\n\n /** Like runGetMethod but throws on a non-zero exit code. */\n async runGetMethodOk(address: Address, method: string, stack: TupleItem[] = []): Promise<GetMethodResult> {\n const r = await this.runGetMethod(address, method, stack)\n if (r.exitCode !== 0) throw new NetworkError(`Get method ${method} failed with exit_code: ${r.exitCode}`)\n return r\n }\n\n /** Broadcast a signed external message. */\n async sendBoc(message: Cell): Promise<void> {\n await this.rpc.call('sendBoc', { boc: message.toBoc().toString('base64') })\n }\n\n /** Broadcast and return the external-message hash (base64) toncenter reports. */\n async sendBocReturnHash(message: Cell): Promise<string> {\n const r = await this.rpc.call<{ hash?: string }>('sendBocReturnHash', { boc: message.toBoc().toString('base64') })\n return need(r && typeof r.hash === 'string', 'sendBocReturnHash', r.hash as string)\n }\n\n async getTransactions(address: Address, opts: { limit: number; lt?: string; hash?: string; archival?: boolean }): Promise<Transaction[]> {\n const params: Record<string, unknown> = { address: address.toString(), limit: opts.limit }\n if (opts.lt) params.lt = opts.lt\n if (opts.hash) params.hash = Buffer.from(opts.hash, 'base64').toString('hex')\n if (opts.archival) params.archival = true\n const r = await this.rpc.call<unknown>('getTransactions', params)\n need(Array.isArray(r), 'getTransactions', r)\n return (r as Array<{ data?: string }>).map((t) => {\n need(typeof t.data === 'string', 'getTransactions[].data', t)\n return loadTransaction(cellFromBase64(t.data as string).beginParse())\n })\n }\n\n async estimateFee(address: Address, args: { body: Cell; init?: StateInit; ignoreSignature?: boolean }): Promise<TonFees> {\n const r = await this.rpc.call<{ source_fees?: Record<string, unknown> }>('estimateFee', {\n address: address.toString(),\n body: args.body.toBoc().toString('base64'),\n init_code: args.init ? args.init.code!.toBoc().toString('base64') : '',\n init_data: args.init ? args.init.data!.toBoc().toString('base64') : '',\n ignore_chksig: args.ignoreSignature ?? true,\n })\n const f = r?.source_fees\n need(f && ['in_fwd_fee', 'storage_fee', 'gas_fee', 'fwd_fee'].every((k) => typeof f[k] === 'number' || typeof f[k] === 'string'), 'estimateFee', r)\n const fees = {\n inFwdFee: BigInt(f!.in_fwd_fee as number), storageFee: BigInt(f!.storage_fee as number),\n gasFee: BigInt(f!.gas_fee as number), fwdFee: BigInt(f!.fwd_fee as number),\n }\n return { ...fees, total: fees.inFwdFee + fees.storageFee + fees.gasFee + fees.fwdFee }\n }\n}\n\n// ── Emulation (toncenter v3 emulateTrace) ───────────────────────────────────\n\n/**\n * Whether an emulated wallet transaction succeeded: compute exit code, abort flag, action phase.\n */\nexport interface EmulationVerdict {\n ok: boolean\n exitCode?: number\n aborted?: boolean\n actionSuccess?: boolean\n reason?: string\n}\n\n/**\n * Reduce an `emulateTrace` response to a verdict for the ROOT transaction (the\n * wallet's own): compute-phase exit code, aborted flag, action-phase success.\n * Tolerant of the field spellings the v3 API has used (`description.compute_ph`\n * / `compute`, `action.success`); anything unrecognisable is a NetworkError, not\n * a silent pass.\n */\nexport function parseEmulation(json: unknown): EmulationVerdict {\n const j = json as Record<string, unknown> | null\n if (!j || typeof j !== 'object') throw new NetworkError('Malformed emulation response')\n if (typeof j.error === 'string') return { ok: false, reason: j.error }\n const txs = j.transactions as Record<string, Record<string, unknown>> | Array<Record<string, unknown>> | undefined\n const rootHash = (j.trace as { tx_hash?: string } | undefined)?.tx_hash\n let tx: Record<string, unknown> | undefined\n if (Array.isArray(txs)) tx = txs[0]\n else if (txs && typeof txs === 'object') tx = (rootHash && txs[rootHash]) || Object.values(txs)[0]\n if (!tx) {\n if (typeof j.exit_code === 'number') return verdict(j.exit_code, j.aborted === true, undefined)\n throw new NetworkError('Malformed emulation response: no transactions')\n }\n const d = (tx.description as Record<string, unknown> | undefined) ?? tx\n const compute = (d.compute_ph ?? d.compute) as Record<string, unknown> | undefined\n const action = d.action as Record<string, unknown> | undefined\n const exitCode = typeof compute?.exit_code === 'number' ? compute.exit_code : compute?.success === true ? 0 : undefined\n const actionSuccess = typeof action?.success === 'boolean' ? action.success : undefined\n if (exitCode === undefined && d.aborted === undefined && actionSuccess === undefined) throw new NetworkError('Malformed emulation response: no phases')\n return verdict(exitCode, d.aborted === true, actionSuccess)\n}\n\nfunction verdict(exitCode: number | undefined, aborted: boolean, actionSuccess: boolean | undefined): EmulationVerdict {\n const ok = !aborted && (exitCode === undefined || exitCode === 0) && actionSuccess !== false\n const reason = aborted ? 'transaction aborted' : exitCode !== undefined && exitCode !== 0 ? `compute phase exit_code ${exitCode}` : actionSuccess === false ? 'action phase failed' : undefined\n return { ok, ...(exitCode !== undefined ? { exitCode } : {}), aborted, ...(actionSuccess !== undefined ? { actionSuccess } : {}), ...(reason ? { reason } : {}) }\n}\n\n/** POST the external message to a toncenter v3 emulation endpoint and reduce the trace. */\nexport async function emulateExternal(url: string, message: Cell, opts: { fetch?: typeof fetch; timeoutMs?: number; apiKey?: string } = {}): Promise<EmulationVerdict> {\n const doFetch = opts.fetch ?? globalThis.fetch\n let res: Response\n try {\n res = await doFetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json', ...(opts.apiKey ? { 'X-API-Key': opts.apiKey } : {}) },\n body: JSON.stringify({ boc: message.toBoc().toString('base64'), ignore_chksig: true, include_code_data: false, with_actions: false }),\n signal: AbortSignal.timeout(opts.timeoutMs ?? DEFAULT_TIMEOUT_MS),\n })\n } catch (e) {\n throw new NetworkError(`emulate: ${e instanceof Error ? e.message : String(e)}`, { provider: url, cause: e })\n }\n let json: unknown\n try { json = await res.json() } catch (e) { throw new NetworkError(`emulate: HTTP ${res.status}, non-JSON body`, { provider: url, cause: e }) }\n if (!res.ok) {\n const err = (json as { error?: unknown; detail?: unknown })\n return { ok: false, reason: `HTTP ${res.status}: ${typeof err.error === 'string' ? err.error : JSON.stringify(err.detail ?? err.error ?? json)}` }\n }\n return parseEmulation(json)\n}\n","/**\n * Preflight emulation of a zero-signed external through tonapi\n * (`POST /v2/wallet/emulate`, fallback `POST /v2/traces/emulate`) or a\n * toncenter v3 `emulateTrace` endpoint. The verdict decides whether the\n * account signs at all; `risk` (tonapi only) summarises what would leave the\n * wallet so a foreign body cannot quietly drain it.\n *\n * tonapi shapes used (OpenAPI v2):\n * MessageConsequences = { trace: Trace, event: AccountEvent, risk: Risk }\n * Trace = { transaction: Transaction, interfaces: string[], children?: Trace[], emulated?: boolean }\n * Transaction.compute_phase = { skipped, skip_reason?, success?, exit_code?, exit_code_description? }\n * Transaction.action_phase = { success, result_code, … }\n * Transaction.{ success, aborted, bounce_phase? }\n * Risk = { transfer_all_remaining_balance, ton, jettons: [{ quantity, wallet_address: { address }, jetton: { address, symbol, decimals } }], nfts }\n */\nimport type { Cell } from '@ton/core'\nimport { NetworkError } from '@anywalletkit/core'\nimport { emulateExternal as emulateToncenter, type EmulationVerdict } from './toncenter.js'\nimport type { TonEmulateConfig, TonRisk } from './types.js'\n\nconst DEFAULT_TIMEOUT_MS = 15_000\n/** Default tonapi root used for emulation. */\nexport const DEFAULT_TONAPI = 'https://tonapi.io/v2'\n\n/** Service an emulation came from. */\nexport type EmulationSource = 'tonapi' | 'toncenter-v3'\n\n/** An emulation verdict with its source and any deeper failures. */\nexport interface EmulationOutcome extends EmulationVerdict {\n source: EmulationSource\n /** Failed/bounced transactions deeper than the first hop — informational. */\n warnings: string[]\n /** tonapi `risk`: what the message would move out of the wallet. */\n risk?: TonRisk\n}\n\ninterface TonapiTx {\n hash?: string\n account?: { address?: string } | string\n success?: boolean\n aborted?: boolean\n compute_phase?: { skipped?: boolean; skip_reason?: string; success?: boolean; exit_code?: number; exit_code_description?: string }\n action_phase?: { success?: boolean; result_code?: number; result_code_description?: string }\n bounce_phase?: string\n}\ninterface TonapiTrace { transaction?: TonapiTx; children?: TonapiTrace[] }\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return !!v && typeof v === 'object' && !Array.isArray(v)\n}\n\n/**\n * A plain value transfer to an account that does not exist yet: the chain\n * credits the coins and leaves the account `uninit`; tonapi reports the hop as\n * `success: true, aborted: true, compute skipped (cskip_no_state)` with no\n * bounce phase. That is the normal shape of funding a fresh deposit address\n * (NEAR Intents TON deposits, 2026-10-09) — not a failure. A BOUNCEABLE\n * message to the same account bounces instead (`bounce_phase` set) and stays\n * fatal, since the value comes back minus fees.\n */\nfunction creditedUninit(tx: TonapiTx): boolean {\n const c = tx.compute_phase\n return tx.success === true && c?.skipped === true && c.skip_reason === 'cskip_no_state' && tx.bounce_phase === undefined && (tx.action_phase === undefined || tx.action_phase.success !== false)\n}\n\nfunction txFailure(tx: TonapiTx): string | undefined {\n const c = tx.compute_phase\n if (creditedUninit(tx)) return undefined\n if (tx.aborted === true) return 'aborted'\n if (c && c.skipped !== true && typeof c.exit_code === 'number' && c.exit_code !== 0) return `compute exit_code ${c.exit_code}${c.exit_code_description ? ` (${c.exit_code_description})` : ''}`\n if (c && c.skipped === true && tx.success === false) return `compute skipped${c.skip_reason ? ` (${c.skip_reason})` : ''}`\n if (tx.action_phase && tx.action_phase.success === false) return `action phase failed${typeof tx.action_phase.result_code === 'number' ? ` (code ${tx.action_phase.result_code})` : ''}`\n if (typeof tx.bounce_phase === 'string' && tx.bounce_phase !== 'TrPhaseBounceOk' && tx.success === false) return `bounced (${tx.bounce_phase})`\n if (tx.success === false) return 'failed'\n return undefined\n}\n\nfunction accountOf(tx: TonapiTx): string {\n return typeof tx.account === 'string' ? tx.account : tx.account?.address ?? '?'\n}\n\n/**\n * Reduce a tonapi `Trace` to a verdict. The root (the wallet's own transaction)\n * decides: compute exit ≠ 0, aborted or a failed action phase → not ok. A\n * failing FIRST-HOP child is also fatal: for every message this wallet builds\n * (TON to a contract, jetton transfer to its own jetton wallet) a bounced\n * first hop means the operation did not happen and the value comes back minus\n * fees. Deeper failures (e.g. a jetton notify the recipient's wallet rejects)\n * become warnings — the transfer itself already settled.\n */\nexport function parseTonapiTrace(trace: unknown): Omit<EmulationOutcome, 'source' | 'risk'> {\n if (!isObject(trace) || !isObject(trace.transaction)) throw new NetworkError('Malformed tonapi emulation: no root transaction')\n const root = trace.transaction as TonapiTx\n const compute = root.compute_phase\n const exitCode = compute && compute.skipped !== true && typeof compute.exit_code === 'number' ? compute.exit_code : compute?.success === true ? 0 : undefined\n const actionSuccess = typeof root.action_phase?.success === 'boolean' ? root.action_phase.success : undefined\n if (exitCode === undefined && actionSuccess === undefined && typeof root.success !== 'boolean' && typeof root.aborted !== 'boolean') {\n throw new NetworkError('Malformed tonapi emulation: root transaction has no phases')\n }\n const aborted = root.aborted === true\n const rootFailure = txFailure(root)\n const warnings: string[] = []\n let firstHopFailure: string | undefined\n const walk = (t: TonapiTrace, depth: number) => {\n for (const child of t.children ?? []) {\n const tx = child.transaction\n if (tx) {\n const f = txFailure(tx)\n if (f) {\n const line = `${accountOf(tx)}: ${f}`\n if (depth === 1) firstHopFailure ??= line\n else warnings.push(line)\n }\n }\n walk(child, depth + 1)\n }\n }\n walk(trace as TonapiTrace, 1)\n const reason = rootFailure ? (aborted ? 'transaction aborted' : rootFailure) : firstHopFailure ? `internal message failed — ${firstHopFailure}` : undefined\n return {\n ok: reason === undefined,\n ...(exitCode !== undefined ? { exitCode } : {}),\n aborted,\n ...(actionSuccess !== undefined ? { actionSuccess } : {}),\n ...(reason ? { reason } : {}),\n warnings,\n }\n}\n\n/** tonapi `Risk` → nanotons / jetton base units as bigints. Malformed → NetworkError. */\nexport function parseTonapiRisk(risk: unknown): TonRisk {\n if (!isObject(risk)) throw new NetworkError('Malformed tonapi emulation: no risk')\n const big = (v: unknown): bigint => {\n if (typeof v === 'bigint') return v\n if (typeof v === 'number' && Number.isFinite(v)) return BigInt(Math.trunc(v))\n if (typeof v === 'string' && /^-?\\d+$/.test(v)) return BigInt(v)\n throw new NetworkError('Malformed tonapi emulation: risk amount')\n }\n const jettons = Array.isArray(risk.jettons) ? risk.jettons : []\n return {\n ton: big(risk.ton ?? 0),\n transferAllRemainingBalance: risk.transfer_all_remaining_balance === true,\n jettons: jettons.map((j) => {\n if (!isObject(j)) throw new NetworkError('Malformed tonapi emulation: risk jetton')\n const jetton = isObject(j.jetton) ? j.jetton : {}\n const wallet = isObject(j.wallet_address) ? j.wallet_address : {}\n return {\n amount: big(j.quantity ?? 0),\n address: typeof jetton.address === 'string' ? jetton.address : '',\n walletAddress: typeof wallet.address === 'string' ? wallet.address : '',\n ...(typeof jetton.symbol === 'string' ? { symbol: jetton.symbol } : {}),\n ...(typeof jetton.decimals === 'number' ? { decimals: jetton.decimals } : {}),\n }\n }),\n }\n}\n\n/** tonapi `MessageConsequences` (wallet/emulate) → outcome with risk. */\nexport function parseTonapiConsequences(json: unknown): EmulationOutcome {\n if (!isObject(json)) throw new NetworkError('Malformed tonapi emulation response')\n if (typeof json.error === 'string') return { ok: false, reason: json.error, aborted: false, warnings: [], source: 'tonapi' }\n const verdict = parseTonapiTrace(json.trace)\n return { ...verdict, source: 'tonapi', risk: parseTonapiRisk(json.risk) }\n}\n\n/** Options for emulating a message through tonapi or toncenter v3. */\nexport interface EmulateOptions {\n fetch?: typeof fetch\n timeoutMs?: number\n /** tonapi bearer key / toncenter X-API-Key. */\n apiKey?: string\n}\n\nasync function post(doFetch: typeof fetch, url: string, body: unknown, opts: EmulateOptions): Promise<{ status: number; ok: boolean; json: unknown }> {\n let res: Response\n try {\n res = await doFetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json', ...(opts.apiKey ? { authorization: `Bearer ${opts.apiKey}` } : {}) },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(opts.timeoutMs ?? DEFAULT_TIMEOUT_MS),\n })\n } catch (e) {\n throw new NetworkError(`emulate: ${e instanceof Error ? e.message : String(e)}`, { provider: url, cause: e })\n }\n if (res.status === 404) return { status: 404, ok: false, json: undefined }\n let json: unknown\n try { json = await res.json() } catch (e) { throw new NetworkError(`emulate: HTTP ${res.status}, non-JSON body`, { provider: url, cause: e }) }\n return { status: res.status, ok: res.ok, json }\n}\n\nfunction httpFailure(status: number, json: unknown): EmulationOutcome {\n const err = isObject(json) ? json : {}\n const text = typeof err.error === 'string' ? err.error : JSON.stringify(err.detail ?? err.error ?? json)\n return { ok: false, reason: `HTTP ${status}: ${text}`, aborted: false, warnings: [], source: 'tonapi' }\n}\n\n/**\n * Emulate through tonapi: `/wallet/emulate` first (verdict + risk), then\n * `/traces/emulate` when the first is not served (404). The external carries a\n * zero signature; `ignore_signature_check=true` is sent on both calls.\n */\nexport async function emulateViaTonapi(baseUrl: string, message: Cell, opts: EmulateOptions = {}): Promise<EmulationOutcome> {\n const doFetch = opts.fetch ?? globalThis.fetch\n const base = baseUrl.replace(/\\/+$/, '')\n const boc = message.toBoc().toString('base64')\n const first = await post(doFetch, `${base}/wallet/emulate?ignore_signature_check=true`, { boc }, opts)\n if (first.status !== 404) {\n if (!first.ok) return httpFailure(first.status, first.json)\n return parseTonapiConsequences(first.json)\n }\n const second = await post(doFetch, `${base}/traces/emulate?ignore_signature_check=true`, { boc }, opts)\n if (second.status === 404) throw new NetworkError('emulate: tonapi serves neither /wallet/emulate nor /traces/emulate', { provider: base })\n if (!second.ok) return httpFailure(second.status, second.json)\n if (isObject(second.json) && typeof second.json.error === 'string') return { ok: false, reason: second.json.error, aborted: false, warnings: [], source: 'tonapi' }\n return { ...parseTonapiTrace(second.json), source: 'tonapi' }\n}\n\n/** Resolve the effective emulation config: explicit `emulate`, legacy `emulateUrl`, else tonapi by default. */\nexport function resolveEmulate(config: { emulate?: TonEmulateConfig; emulateUrl?: string; tonApiUrl?: string }): Exclude<TonEmulateConfig, false> | false {\n if (config.emulate === false) return false\n if (config.emulate) return config.emulate\n if (config.emulateUrl) return { kind: 'toncenter-v3', url: config.emulateUrl }\n return { kind: 'tonapi' }\n}\n\n/** Run the configured emulation for an external message. */\nexport async function runEmulation(config: { emulate?: TonEmulateConfig; emulateUrl?: string; tonApiUrl?: string; tonApiKey?: string; fetch?: typeof fetch; timeoutMs?: number }, message: Cell): Promise<EmulationOutcome | undefined> {\n const target = resolveEmulate(config)\n if (!target) return undefined\n const opts: EmulateOptions = {\n ...(config.fetch ? { fetch: config.fetch } : {}),\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n ...(config.tonApiKey ? { apiKey: config.tonApiKey } : {}),\n }\n if (target.kind === 'tonapi') return emulateViaTonapi(target.url ?? config.tonApiUrl ?? DEFAULT_TONAPI, message, opts)\n const v = await emulateToncenter(target.url, message, opts)\n return { ...v, aborted: v.aborted ?? false, source: 'toncenter-v3', warnings: [] }\n}\n","/**\n * Wallet V5R1 (the contract Tonkeeper \"W5\" and Tonhub deploy) without\n * @ton/ton: state init, address, the signed-external body and its parser.\n *\n * Contract code and wire layout follow @ton/ton's WalletContractV5R1\n * (Copyright (c) Whales Corp., MIT) and the reference contract\n * https://github.com/ton-blockchain/wallet-contract-v5 (commit 4fab977,\n * build/wallet_v5.compiled.json). Only the parts a sending wallet needs are\n * here: extensions and the internal/extension auth paths are not implemented.\n */\nimport { Buffer } from 'buffer'\nimport {\n Address, Cell, SendMode, beginCell, contractAddress, external, loadOutList, storeMessage, storeOutList,\n type MessageRelaxed, type OutActionSendMsg, type StateInit,\n} from '@ton/core'\n\n// https://github.com/ton-blockchain/wallet-contract-v5/blob/4fab977f4fae3a37c1aac216ed2b7e611a9bc2af/build/wallet_v5.compiled.json\n/** Code of the Wallet V5R1 contract (BoC hex). */\nexport const V5R1_CODE_HEX =\n 'b5ee9c7241021401000281000114ff00f4a413f4bcf2c80b01020120020d020148030402dcd020d749c120915b8f6320d70b1f2082106578746ebd21821073696e74bdb0925f03e082106578746eba8eb48020d72101d074d721fa4030fa44f828fa443058bd915be0ed44d0810141d721f4058307f40e6fa1319130e18040d721707fdb3ce03120d749810280b99130e070e2100f020120050c020120060902016e07080019adce76a2684020eb90eb85ffc00019af1df6a2684010eb90eb858fc00201480a0b0017b325fb51341c75c875c2c7e00011b262fb513435c280200019be5f0f6a2684080a0eb90fa02c0102f20e011e20d70b1f82107369676ebaf2e08a7f0f01e68ef0eda2edfb218308d722028308d723208020d721d31fd31fd31fed44d0d200d31f20d31fd3ffd70a000af90140ccf9109a28945f0adb31e1f2c087df02b35007b0f2d0845125baf2e0855036baf2e086f823bbf2d0882292f800de01a47fc8ca00cb1f01cf16c9ed542092f80fde70db3cd81003f6eda2edfb02f404216e926c218e4c0221d73930709421c700b38e2d01d72820761e436c20d749c008f2e09320d74ac002f2e09320d71d06c712c2005230b0f2d089d74cd7393001a4e86c128407bbf2e093d74ac000f2e093ed55e2d20001c000915be0ebd72c08142091709601d72c081c12e25210b1e30f20d74a111213009601fa4001fa44f828fa443058baf2e091ed44d0810141d718f405049d7fc8ca0040048307f453f2e08b8e14038307f45bf2e08c22d70a00216e01b3b0f2d090e2c85003cf1612f400c9ed54007230d72c08248e2d21f2e092d200ed44d0d2005113baf2d08f54503091319c01810140d721d70a00f2e08ee2c8ca0058cf16c9ed5493f2c08de20010935bdb31e1d74cd0b4d6c35e'\n\nlet codeCell: Cell | undefined\n/** The V5R1 contract code cell (parsed once). */\nexport function v5r1Code(): Cell {\n codeCell ??= Cell.fromBoc(Buffer.from(V5R1_CODE_HEX, 'hex'))[0]!\n return codeCell\n}\n\n/** Op codes of Wallet V5R1 messages. */\nexport const V5R1_OP = {\n signedExternal: 0x7369676e,\n signedInternal: 0x73696e74,\n extension: 0x6578746e,\n} as const\n\n/** Global id of TON mainnet, part of the V5R1 wallet id. */\nexport const MAINNET_GLOBAL_ID = -239\n/** Global id of TON testnet. */\nexport const TESTNET_GLOBAL_ID = -3\n/** PAY_GAS_SEPARATELY | IGNORE_ERRORS — the mode every external-message action carries. */\nexport const DEFAULT_SEND_MODE = SendMode.PAY_GAS_SEPARATELY | SendMode.IGNORE_ERRORS\n/** Most outgoing messages one V5R1 transaction can carry. */\nexport const MAX_ACTIONS = 255\n\nexport interface V5R1WalletIdParts { networkGlobalId?: number; workchain?: number; subwalletNumber?: number }\n\n/**\n * Serialized wallet_id (int32): `networkGlobalId XOR context`, where the client\n * context is {1 bit \"client\", int8 workchain, uint8 version (0 = v5r1), uint15 subwallet}.\n */\nexport function v5r1WalletId(parts: V5R1WalletIdParts = {}): bigint {\n const context = beginCell()\n .storeUint(1, 1)\n .storeInt(parts.workchain ?? 0, 8)\n .storeUint(0, 8)\n .storeUint(parts.subwalletNumber ?? 0, 15)\n .endCell().beginParse().loadInt(32)\n return BigInt(parts.networkGlobalId ?? MAINNET_GLOBAL_ID) ^ BigInt(context)\n}\n\n/** State init (code and data) of a V5R1 wallet for a public key. */\nexport function v5r1StateInit(publicKey: Uint8Array, walletId: bigint = v5r1WalletId()): StateInit {\n if (publicKey.length !== 32) throw new Error('V5R1: public key must be 32 bytes')\n const data = beginCell()\n .storeUint(1, 1) // signature auth allowed\n .storeUint(0, 32) // seqno\n .storeInt(walletId, 32)\n .storeBuffer(Buffer.from(publicKey), 32)\n .storeBit(0) // no extensions\n .endCell()\n return { code: v5r1Code(), data }\n}\n\n/** Address of the V5R1 wallet for a public key. */\nexport function v5r1Address(publicKey: Uint8Array, opts: { workchain?: number; walletId?: bigint } = {}): Address {\n return contractAddress(opts.workchain ?? 0, v5r1StateInit(publicKey, opts.walletId))\n}\n\nexport interface V5R1Message { message: MessageRelaxed; mode?: number }\n\nexport interface V5R1SigningParams {\n walletId: bigint\n /** Unix seconds. */\n validUntil: number\n seqno: number\n messages: V5R1Message[]\n}\n\n/** The cell that gets hashed and signed: op | wallet_id | valid_until | seqno | out-list ref | no extended actions. */\nexport function v5r1SigningMessage(p: V5R1SigningParams): Cell {\n if (p.messages.length > MAX_ACTIONS) throw new Error(`V5R1: at most ${MAX_ACTIONS} messages per external (got ${p.messages.length})`)\n const actions: OutActionSendMsg[] = p.messages.map((m) => ({\n type: 'sendMsg',\n // Externals must carry IGNORE_ERRORS or the wallet contract rejects them.\n mode: (m.mode ?? DEFAULT_SEND_MODE) | SendMode.IGNORE_ERRORS,\n outMsg: m.message,\n }))\n const outList = actions.length ? beginCell().store(storeOutList(actions)).endCell() : null\n return beginCell()\n .storeUint(V5R1_OP.signedExternal, 32)\n .storeInt(p.walletId, 32)\n .storeUint(p.validUntil, 32)\n .storeUint(p.seqno, 32)\n .storeMaybeRef(outList)\n .storeUint(0, 1)\n .endCell()\n}\n\n/** Signature goes at the tail (V5R1 layout). */\nexport function v5r1PackSigned(signing: Cell, signature: Uint8Array): Cell {\n if (signature.length !== 64) throw new Error('V5R1: signature must be 64 bytes')\n return beginCell().storeSlice(signing.beginParse()).storeBuffer(Buffer.from(signature), 64).endCell()\n}\n\n/** Same body with a zero signature — what `estimateFee(ignore_chksig)` and emulation take. */\nexport function v5r1PackUnsigned(signing: Cell): Cell {\n return v5r1PackSigned(signing, new Uint8Array(64))\n}\n\n/** The external-in message (as a cell, ready for sendBoc) carrying `body` to the wallet, with `init` when it is not deployed yet. */\nexport function v5r1ExternalMessage(to: Address, body: Cell, init?: StateInit): Cell {\n return beginCell().store(storeMessage(external({ to, body, ...(init ? { init } : {}) }))).endCell()\n}\n\nexport interface ParsedV5R1Body {\n op: number\n walletId: bigint\n validUntil: number\n seqno: number\n messages: Array<{ message: MessageRelaxed; mode: number }>\n /** True when the 64-byte tail signature is present (externals and internals carry one). */\n signed: boolean\n}\n\n/** Parse a signed (or zero-signed) V5R1 external body back into its messages. Returns null for anything else. */\nexport function parseV5R1Body(body: Cell): ParsedV5R1Body | null {\n try {\n const s = body.beginParse()\n const op = s.loadUint(32)\n if (op !== V5R1_OP.signedExternal && op !== V5R1_OP.signedInternal) return null\n const walletId = BigInt(s.loadInt(32))\n const validUntil = s.loadUint(32)\n const seqno = s.loadUint(32)\n const outList = s.loadMaybeRef()\n const hasExtended = s.loadBit()\n if (hasExtended) return null // extension management: not a plain send\n const messages: ParsedV5R1Body['messages'] = []\n if (outList) {\n for (const a of loadOutList(outList.beginParse())) {\n if (a.type !== 'sendMsg') return null\n messages.push({ message: a.outMsg, mode: a.mode })\n }\n }\n const signed = s.remainingBits >= 512\n return { op, walletId, validUntil, seqno, messages, signed }\n } catch {\n return null\n }\n}\n","/**\n * \"What am I signing\" for TON — offline. Decodes the messages of a\n * {@link TonSendable} (or a prebuilt V5R1 body) into human-checkable items and\n * flags the classic mistakes before any key is touched.\n */\nimport { Address, Cell, beginCell, type MessageRelaxed, type Slice } from '@ton/core'\nimport { DEFAULT_SEND_MODE, parseV5R1Body } from './wallet-v5r1.js'\nimport type { TonSendable, TonTransaction } from './types.js'\n\n/** TEP-74 `transfer` op code of a jetton wallet. */\nexport const JETTON_TRANSFER_OP = 0x0f8a7ea5\nconst LARGE_FORWARD_NANOTON = 500_000_000n // 0.5 TON\n\n/** What one outgoing message does. */\nexport type TonDescribedKind = 'ton-transfer' | 'jetton-transfer' | 'contract-call'\n\n/** Fields of a TEP-74 jetton `transfer` body. */\nexport interface TonJettonDetails {\n queryId: bigint\n amount: bigint\n destination: string\n responseDestination: string | null\n forwardTonAmount: bigint\n forwardPayload: 'none' | 'comment' | 'cell'\n forwardComment?: string\n hasCustomPayload: boolean\n}\n\n/** One outgoing message of a wallet transaction, decoded. */\nexport interface TonDescribedMessage {\n kind: TonDescribedKind\n /** Destination as given (friendly) or raw `wc:hex`. */\n to: string\n value: bigint\n bounceable: boolean\n /** Test-only flag of a friendly address; undefined for raw addresses. */\n testOnly?: boolean\n /** Text comment (op 0). */\n comment?: string\n /** Body op code for contract calls (hex). */\n op?: string\n jetton?: TonJettonDetails\n hasStateInit: boolean\n bodyBits: number\n /**\n * Send mode the wallet sends the message with (IGNORE_ERRORS is always added for an external).\n * 128 carries the whole remaining balance, 32 destroys the account when it is left empty.\n */\n mode?: number\n}\n\n/** Problems a TON description is flagged with. */\nexport type TonWarningCode =\n | 'zero-value'\n | 'non-bounceable-contract-call'\n | 'unknown-body'\n | 'large-forward-amount'\n | 'testnet-address'\n | 'mainnet-address'\n | 'exotic-workchain'\n | 'extended-actions'\n | 'carries-all-balance'\n | 'destroys-account'\n\n/** One flagged problem; `index` is the message it is about. */\nexport interface TonWarning { code: TonWarningCode; message: string; index?: number }\n\n/**\n * A TON wallet transaction decoded for a confirmation screen: each outgoing message and the\n * warnings.\n */\nexport interface TonDescription {\n kind: TonDescribedKind | 'mixed'\n items: TonDescribedMessage[]\n warnings: TonWarning[]\n /** Present when the input was a prebuilt V5R1 body. */\n external?: { seqno: number; validUntil: number; walletId: bigint; signed: boolean }\n}\n\n/** A message body decoded: empty, a text comment, a jetton transfer, or unknown. */\nexport type DecodedBody =\n | { type: 'empty' }\n | { type: 'comment'; text: string }\n | { type: 'jetton-transfer'; jetton: TonJettonDetails }\n | { type: 'op'; op: number }\n | { type: 'unknown' }\n\n/** Decode a message body cell. */\nexport function decodeBody(body: Cell): DecodedBody {\n const s = body.beginParse()\n if (s.remainingBits === 0 && s.remainingRefs === 0) return { type: 'empty' }\n if (s.remainingBits < 32) return { type: 'unknown' }\n const op = s.loadUint(32)\n try {\n if (op === 0) return { type: 'comment', text: s.loadStringTail() }\n if (op === JETTON_TRANSFER_OP) return { type: 'jetton-transfer', jetton: loadJettonTransfer(s) }\n } catch {\n return { type: 'unknown' }\n }\n return { type: 'op', op }\n}\n\nfunction loadJettonTransfer(s: Slice): TonJettonDetails {\n const queryId = s.loadUintBig(64)\n const amount = s.loadCoins()\n const destination = s.loadAddress()\n const responseDestination = s.loadMaybeAddress()\n const customPayload = s.loadMaybeRef()\n const forwardTonAmount = s.loadCoins()\n const inRef = s.loadBit()\n const payload: Slice = inRef ? s.loadRef().beginParse() : s\n let forwardPayload: TonJettonDetails['forwardPayload'] = 'none'\n let forwardComment: string | undefined\n if (payload.remainingBits > 0 || payload.remainingRefs > 0) {\n forwardPayload = 'cell'\n if (payload.remainingBits >= 32) {\n const p = payload.clone()\n if (p.loadUint(32) === 0) {\n try { forwardComment = p.loadStringTail(); forwardPayload = 'comment' } catch { /* not utf-8 */ }\n }\n }\n }\n return {\n queryId, amount, destination: destination.toString(), responseDestination: responseDestination ? responseDestination.toString() : null,\n forwardTonAmount, forwardPayload, ...(forwardComment !== undefined ? { forwardComment } : {}), hasCustomPayload: customPayload !== null,\n }\n}\n\nfunction parseTo(to: string): { to: string; bounceable: boolean; testOnly?: boolean; workchain: number } {\n if (Address.isFriendly(to)) {\n const f = Address.parseFriendly(to)\n return { to, bounceable: f.isBounceable, testOnly: f.isTestOnly, workchain: f.address.workChain }\n }\n const a = Address.parse(to)\n return { to: a.toRawString(), bounceable: true, workchain: a.workChain }\n}\n\nfunction bodyOf(tx: TonTransaction): Cell | undefined {\n if (tx.body instanceof Cell) return tx.body\n if (typeof tx.body === 'string') return tx.body === '' ? undefined : commentCell(tx.body)\n if (tx.bodyBoc) return Cell.fromBase64(tx.bodyBoc)\n return undefined\n}\n\n/** A text comment body (op 0 plus the text), as wallets show it. */\nexport function commentCell(text: string): Cell {\n return beginCell().storeUint(0, 32).storeStringTail(text).endCell()\n}\n\nfunction describeOne(\n i: number, to: ReturnType<typeof parseTo>, value: bigint, body: Cell | undefined, hasStateInit: boolean,\n bounceableOverride: boolean | undefined, warnings: TonWarning[], ctx: { network?: 'mainnet' | 'testnet' },\n): TonDescribedMessage {\n const bounceable = bounceableOverride ?? to.bounceable\n const decoded = body ? decodeBody(body) : ({ type: 'empty' } as DecodedBody)\n const base = { to: to.to, value, bounceable, ...(to.testOnly !== undefined ? { testOnly: to.testOnly } : {}), hasStateInit, bodyBits: body ? body.bits.length : 0 }\n if (value <= 0n) warnings.push({ code: 'zero-value', message: 'message carries no TON; it cannot pay for gas at the destination', index: i })\n if (to.workchain !== 0 && to.workchain !== -1) warnings.push({ code: 'exotic-workchain', message: `workchain ${to.workchain}`, index: i })\n if (ctx.network && to.testOnly !== undefined) {\n if (to.testOnly && ctx.network !== 'testnet') warnings.push({ code: 'testnet-address', message: 'test-only address on a mainnet wallet', index: i })\n if (!to.testOnly && ctx.network === 'testnet') warnings.push({ code: 'mainnet-address', message: 'mainnet address on a testnet wallet', index: i })\n }\n let item: TonDescribedMessage\n switch (decoded.type) {\n case 'empty': item = { kind: 'ton-transfer', ...base }; break\n case 'comment': item = { kind: 'ton-transfer', ...base, comment: decoded.text }; break\n case 'jetton-transfer':\n item = { kind: 'jetton-transfer', ...base, jetton: decoded.jetton, op: hex(JETTON_TRANSFER_OP) }\n if (decoded.jetton.forwardTonAmount > LARGE_FORWARD_NANOTON) warnings.push({ code: 'large-forward-amount', message: `forward_ton_amount ${decoded.jetton.forwardTonAmount} > 0.5 TON`, index: i })\n break\n case 'op': item = { kind: 'contract-call', ...base, op: hex(decoded.op) }; break\n default:\n item = { kind: 'contract-call', ...base }\n warnings.push({ code: 'unknown-body', message: 'message body could not be decoded', index: i })\n }\n if (item.kind !== 'ton-transfer' && !bounceable) {\n warnings.push({ code: 'non-bounceable-contract-call', message: 'contract call to a non-bounceable address: TON is lost if the call fails', index: i })\n }\n return item\n}\n\nconst hex = (n: number) => `0x${n.toString(16).padStart(8, '0')}`\n\n/** SendMode.IGNORE_ERRORS: the V5R1 wallet always adds it to an external's messages. */\nconst IGNORE_ERRORS = 2\n/** The mode a message given as {@link TonTransaction} is sent with: its `sendMode` or the default, plus IGNORE_ERRORS. */\nexport function sendModeOf(sendMode: number | undefined): number {\n return (sendMode ?? DEFAULT_SEND_MODE) | IGNORE_ERRORS\n}\n/** The drain modes in `mode`: 128 carries the whole remaining balance, 32 destroys the account once it is empty. */\nexport function drainModes(mode: number): Array<'carries-all-balance' | 'destroys-account'> {\n return [...((mode & 128) !== 0 ? ['carries-all-balance' as const] : []), ...((mode & 32) !== 0 ? ['destroys-account' as const] : [])]\n}\n\nfunction withMode(i: number, item: TonDescribedMessage, mode: number, warnings: TonWarning[]): TonDescribedMessage {\n for (const code of drainModes(mode)) {\n warnings.push({ code, message: code === 'carries-all-balance' ? 'send mode 128: the message carries the whole remaining balance' : 'send mode 32: the wallet account is destroyed once it is empty', index: i })\n }\n return { ...item, mode }\n}\n\n/** Describe one outgoing message and push its warnings into `warnings`. */\nexport function describeMessageRelaxed(i: number, m: MessageRelaxed, warnings: TonWarning[], ctx: { network?: 'mainnet' | 'testnet' } = {}): TonDescribedMessage {\n if (m.info.type !== 'internal') {\n warnings.push({ code: 'unknown-body', message: 'not an internal message', index: i })\n return { kind: 'contract-call', to: '', value: 0n, bounceable: false, hasStateInit: false, bodyBits: 0 }\n }\n const dest = m.info.dest\n const to = { to: dest.toString({ bounceable: m.info.bounce }), bounceable: m.info.bounce, workchain: dest.workChain }\n const body = m.body.bits.length === 0 && m.body.refs.length === 0 ? undefined : m.body\n return describeOne(i, to, m.info.value.coins, body, !!m.init, m.info.bounce, warnings, ctx)\n}\n\n/** Describe what a {@link TonSendable} will do. Offline; never throws on malformed bodies (they become warnings). */\nexport function describeTransaction(tx: TonSendable, ctx: { network?: 'mainnet' | 'testnet' } = {}): TonDescription {\n const warnings: TonWarning[] = []\n const items: TonDescribedMessage[] = []\n let external: TonDescription['external'] | undefined\n if (tx instanceof Cell) {\n const parsed = parseV5R1Body(tx)\n if (!parsed) {\n warnings.push({ code: 'unknown-body', message: 'not a V5R1 signed-external body' })\n return { kind: 'contract-call', items, warnings }\n }\n external = { seqno: parsed.seqno, validUntil: parsed.validUntil, walletId: parsed.walletId, signed: parsed.signed }\n parsed.messages.forEach((m, i) => items.push(withMode(i, describeMessageRelaxed(i, m.message, warnings, ctx), m.mode, warnings)))\n } else {\n const list = Array.isArray(tx) ? tx : [tx]\n list.forEach((t, i) => {\n let to: ReturnType<typeof parseTo>\n try { to = parseTo(t.to) } catch {\n warnings.push({ code: 'unknown-body', message: `invalid address: ${t.to}`, index: i })\n items.push({ kind: 'contract-call', to: t.to, value: 0n, bounceable: false, hasStateInit: false, bodyBits: 0 })\n return\n }\n let body: Cell | undefined\n try { body = bodyOf(t) } catch { warnings.push({ code: 'unknown-body', message: 'bodyBoc is not a valid BoC', index: i }) }\n items.push(withMode(i, describeOne(i, to, BigInt(t.value), body, t.stateInit !== undefined, t.bounceable, warnings, ctx), sendModeOf(t.sendMode), warnings))\n })\n }\n const kinds = new Set(items.map((x) => x.kind))\n const kind: TonDescription['kind'] = kinds.size === 1 ? items[0]!.kind : kinds.size === 0 ? 'contract-call' : 'mixed'\n return { kind, items, warnings, ...(external ? { external } : {}) }\n}\n","import { NetworkError, type IWalletAccountReadOnly } from '@anywalletkit/core'\nimport { ed25519 } from '@noble/curves/ed25519.js'\nimport { Address, Cell, beginCell, internal, loadStateInit, type StateInit } from '@ton/core'\nimport { commentCell, describeTransaction, type TonDescription } from './describe.js'\nimport { UnsafeTransactionError } from './errors.js'\nimport { TonCenter, createTonRpc } from './toncenter.js'\nimport { runEmulation } from './emulation.js'\nimport {\n DEFAULT_SEND_MODE, MAINNET_GLOBAL_ID, TESTNET_GLOBAL_ID, v5r1Address, v5r1ExternalMessage, v5r1PackUnsigned, v5r1SigningMessage, v5r1StateInit, v5r1WalletId,\n type V5R1Message,\n} from './wallet-v5r1.js'\nimport { CAIP2, type TonConfig, type TonFees, type TonReceipt, type TonSendable, type TonSimulation, type TonTransaction, type TonTransferOptions } from './types.js'\n\nconst JETTON_TRANSFER_OP = 0x0f8a7ea5\nconst DEFAULT_JETTON_ATTACHED = 50_000_000n // 0.05 TON\nconst DEFAULT_INDEXER = 'https://toncenter.com/api/v3'\nconst DEFAULT_VALID_SECONDS = 60\nconst MAX_VALID_SECONDS = 600\n/** PAY_GAS_SEPARATELY | IGNORE_ERRORS, the mode every action in an external carries. */\nexport const SEND_MODE = DEFAULT_SEND_MODE\n\nconst utf8 = (s: string | Uint8Array) => (typeof s === 'string' ? new TextEncoder().encode(s) : s)\nconst hexToBytes = (h: string) => Uint8Array.from(h.match(/.{2}/g) ?? [], (b) => parseInt(b, 16))\nconst big = (v: bigint | number | string) => BigInt(v)\n\n/**\n * A TON V5R1 wallet without a key: balance, jetton balances, seqno, fee estimates, emulation,\n * receipts and signature checks.\n */\nexport class WalletAccountReadOnlyTon implements IWalletAccountReadOnly {\n readonly chain: string\n /** Ed25519 public key the wallet is derived from. */\n readonly publicKey: Uint8Array\n /** User-friendly address. */\n readonly address: string\n protected readonly _config: TonConfig\n protected readonly _walletId: bigint\n protected readonly _init: StateInit\n protected readonly _address: Address\n protected readonly _rpc: TonCenter | undefined\n\n constructor(publicKey: Uint8Array | string, config: TonConfig = {}) {\n this.publicKey = typeof publicKey === 'string' ? hexToBytes(publicKey) : publicKey\n this._config = config\n // The network_global_id inside wallet_id is the only thing that binds a signed external to one\n // network: a testnet wallet must carry -3, or every external it signs is also valid on mainnet\n // (same state init, address and wallet_id). It follows config.network; a contradicting override is refused.\n const networkGlobalId = config.network === 'testnet' ? TESTNET_GLOBAL_ID : MAINNET_GLOBAL_ID\n if (config.walletId?.networkGlobalId !== undefined && config.walletId.networkGlobalId !== networkGlobalId) {\n throw new UnsafeTransactionError('network-mismatch', `walletId.networkGlobalId ${config.walletId.networkGlobalId} contradicts network '${config.network ?? 'mainnet'}' (expected ${networkGlobalId}): externals signed this way would be valid on the other network.`)\n }\n this._walletId = v5r1WalletId({ networkGlobalId, ...(config.walletId?.subwalletNumber !== undefined ? { subwalletNumber: config.walletId.subwalletNumber } : {}) })\n this._init = v5r1StateInit(this.publicKey, this._walletId)\n this._address = v5r1Address(this.publicKey, { walletId: this._walletId })\n this.address = this._address.toString({ bounceable: false, testOnly: config.network === 'testnet' })\n this.chain = CAIP2[config.network ?? 'mainnet']\n const rpc = createTonRpc(config)\n this._rpc = rpc ? new TonCenter(rpc) : undefined\n }\n\n protected requireRpc(what: string): TonCenter {\n if (!this._rpc) throw new NetworkError(`The wallet must be connected to a provider (toncenter) to ${what}.`)\n return this._rpc\n }\n\n /** The user-friendly address. */\n async getAddress(): Promise<string> { return this.address }\n\n /** Native balance in nanotons. */\n async getBalance(): Promise<bigint> {\n return (await this.requireRpc('get balances').getAddressInformation(this._address)).balance\n }\n\n /** Current seqno — 0 until the wallet contract is deployed. Always fetched fresh. */\n async getSeqno(): Promise<number> {\n const rpc = this.requireRpc('read the seqno')\n const state = await rpc.getAddressInformation(this._address)\n if (state.state !== 'active') return 0\n return (await rpc.runGetMethodOk(this._address, 'seqno')).stack.readNumber()\n }\n\n /** Resolve this wallet's jetton wallet for a jetton master. */\n async getJettonWalletAddress(token: string): Promise<Address> {\n const rpc = this.requireRpc('resolve jetton wallets')\n const r = await rpc.runGetMethodOk(Address.parse(token), 'get_wallet_address', [\n { type: 'slice', cell: beginCell().storeAddress(this._address).endCell() },\n ])\n return r.stack.readAddress()\n }\n\n /**\n * Read a jetton wallet and prove it is ours for `token`: `get_wallet_data`\n * must name this wallet as owner and `token` as master. The master's own\n * `get_wallet_address` answer is not trusted on its own — a fake master could\n * point at our real wallet of another jetton (e.g. USDT).\n */\n protected async jettonWalletData(token: string, jw: Address): Promise<bigint> {\n const stack = (await this.requireRpc('read jetton wallets').runGetMethodOk(jw, 'get_wallet_data')).stack\n const balance = stack.readBigNumber()\n const owner = stack.readAddress()\n const master = stack.readAddress()\n if (!owner.equals(this._address) || !master.equals(Address.parse(token))) {\n throw new UnsafeTransactionError('jetton-wallet', `The jetton wallet ${jw.toString()} does not belong to this wallet for ${token}.`)\n }\n return balance\n }\n\n /**\n * Jetton balance in base units, read from this wallet's jetton wallet; 0 when it does not exist.\n */\n async getTokenBalance(token: string): Promise<bigint> {\n const rpc = this.requireRpc('get token balances')\n const jw = await this.getJettonWalletAddress(token)\n if ((await rpc.getAddressInformation(jw)).state !== 'active') return 0n // never received this jetton\n return this.jettonWalletData(token, jw)\n }\n\n // ── Message building ──────────────────────────────────────────────────────\n\n protected stateInitOf(src: TonTransaction['stateInit']): StateInit | undefined {\n if (src === undefined) return undefined\n if (typeof src === 'string') return loadStateInit(Cell.fromBase64(src).beginParse())\n if (src instanceof Cell) return loadStateInit(src.beginParse())\n return src\n }\n\n /**\n * A destination address with the checks every payment gets: workchain 0 or -1, and a friendly\n * address's test-only flag matching the wallet's network. Used for a native message's `to` and a\n * jetton transfer's recipient and response destination (round 3, L8).\n */\n protected checkedAddress(to: string): { address: Address; bounceable: boolean } {\n let address: Address\n let bounceable = true\n let testOnly: boolean | undefined\n if (Address.isFriendly(to)) {\n const f = Address.parseFriendly(to)\n address = f.address; bounceable = f.isBounceable; testOnly = f.isTestOnly\n } else {\n address = Address.parse(to)\n }\n if (address.workChain !== 0 && address.workChain !== -1) throw new UnsafeTransactionError('exotic-workchain', `Refusing to send to workchain ${address.workChain}.`)\n const testnet = this._config.network === 'testnet'\n if (testOnly !== undefined && testOnly !== testnet) {\n throw new UnsafeTransactionError('network-mismatch', testOnly ? 'Test-only address on a mainnet wallet.' : 'Mainnet address on a testnet wallet.')\n }\n return { address, bounceable }\n }\n\n protected transactionMessage(tx: TonTransaction): V5R1Message {\n const value = big(tx.value)\n if (value <= 0n) throw new UnsafeTransactionError('zero-value', 'TON message value must be positive.')\n const { address, bounceable } = this.checkedAddress(tx.to)\n const body = tx.body instanceof Cell ? tx.body : typeof tx.body === 'string' ? (tx.body === '' ? undefined : commentCell(tx.body)) : tx.bodyBoc ? Cell.fromBase64(tx.bodyBoc) : undefined\n const init = this.stateInitOf(tx.stateInit)\n const message = internal({ to: address, value, bounce: tx.bounceable ?? bounceable, ...(body ? { body } : {}), ...(init ? { init } : {}) })\n return { message, ...(tx.sendMode !== undefined ? { mode: tx.sendMode } : {}) }\n }\n\n protected async jettonTransferMessage(o: TonTransferOptions): Promise<V5R1Message> {\n const amount = big(o.amount)\n if (amount <= 0n) throw new UnsafeTransactionError('zero-value', 'Jetton amount must be positive.')\n const recipient = this.checkedAddress(o.recipient).address\n const response = o.responseDestination ? this.checkedAddress(o.responseDestination).address : undefined\n const jw = await this.getJettonWalletAddress(o.token!)\n await this.jettonWalletData(o.token!, jw)\n const forwardTonAmount = o.forwardTonAmount !== undefined ? big(o.forwardTonAmount) : 1n\n if (o.memo !== undefined && o.forwardPayload !== undefined) throw new UnsafeTransactionError('memo-and-payload', 'Pass either memo or forwardPayload, not both: a jetton transfer carries one forward payload.')\n const payload = o.forwardPayload ?? o.memo\n const forwardPayload = payload === undefined ? null : typeof payload === 'string' ? commentCell(payload) : payload\n const body = beginCell()\n .storeUint(JETTON_TRANSFER_OP, 32)\n .storeUint(o.queryId !== undefined ? BigInt(o.queryId) : randomQueryId(), 64)\n .storeCoins(amount)\n .storeAddress(recipient)\n .storeAddress(response ?? this._address)\n .storeMaybeRef(o.customPayload ?? null)\n .storeCoins(forwardTonAmount)\n .storeMaybeRef(forwardPayload) // either-ref form: payloads always travel in a ref\n .endCell()\n const attached = o.attachedValue !== undefined\n ? big(o.attachedValue)\n : (this._config.jettonAttachedValue !== undefined ? big(this._config.jettonAttachedValue) : DEFAULT_JETTON_ATTACHED) + forwardTonAmount\n return { message: internal({ to: jw, value: attached, bounce: true, body }) }\n }\n\n protected toMessages(tx: TonTransaction | TonTransaction[]): V5R1Message[] {\n const list = Array.isArray(tx) ? tx : [tx]\n if (list.length === 0) throw new UnsafeTransactionError('empty', 'Nothing to send.')\n return list.map((t) => this.transactionMessage(t))\n }\n\n protected validUntil(): number {\n const seconds = this._config.validUntilSeconds ?? DEFAULT_VALID_SECONDS\n if (!Number.isInteger(seconds) || seconds <= 0 || seconds > MAX_VALID_SECONDS) {\n throw new UnsafeTransactionError('valid-until', `validUntilSeconds must be an integer between 1 and ${MAX_VALID_SECONDS}.`)\n }\n return Math.floor(Date.now() / 1000) + seconds\n }\n\n /** The cell to sign for `messages` at the CURRENT seqno (fetched fresh every time). */\n protected async signingCell(messages: V5R1Message[]): Promise<{ signing: Cell; seqno: number; validUntil: number }> {\n const seqno = await this.getSeqno()\n const validUntil = this.validUntil()\n return { signing: v5r1SigningMessage({ walletId: this._walletId, validUntil, seqno, messages }), seqno, validUntil }\n }\n\n // ── Fees / preflight ──────────────────────────────────────────────────────\n\n /** StateInit to attach to an external when the wallet is not deployed yet. */\n protected async initIfNeeded(): Promise<StateInit | undefined> {\n const state = await this.requireRpc('read the account state').getAddressInformation(this._address)\n return state.state === 'active' ? undefined : this._init\n }\n\n /** in_fwd + storage + gas + fwd from toncenter's estimateFee (signature ignored). */\n async estimateFees(body: Cell): Promise<TonFees> {\n const rpc = this.requireRpc('quote transfers')\n const init = await this.initIfNeeded()\n return rpc.estimateFee(this._address, { body, ...(init ? { init } : {}), ignoreSignature: true })\n }\n\n /**\n * Preflight an external body: fees via estimateFee and, unless\n * `config.emulate === false`, a trace emulation (tonapi by default, see\n * {@link TonConfig.emulate}) whose compute/action phases — and the first-hop\n * internal messages — decide `ok`. Never throws for a failing emulation,\n * only for transport problems or a malformed emulator response.\n */\n async simulateBody(body: Cell): Promise<TonSimulation> {\n const fees = await this.estimateFees(body)\n const init = await this.initIfNeeded()\n const outcome = await runEmulation(this._config, v5r1ExternalMessage(this._address, body, init))\n if (!outcome) return { ok: true, fees, emulated: false, source: 'estimate-only', warnings: [] }\n const common = {\n fees, emulated: true as const, source: outcome.source, warnings: outcome.warnings,\n ...(outcome.exitCode !== undefined ? { exitCode: outcome.exitCode } : {}),\n ...(outcome.risk ? { risk: outcome.risk } : {}),\n }\n if (outcome.ok) return { ok: true, ...common, ...(outcome.actionSuccess !== undefined ? { actionSuccess: outcome.actionSuccess } : {}) }\n return { ok: false, ...common, reason: outcome.reason ?? 'emulation failed', ...(outcome.aborted !== undefined ? { aborted: outcome.aborted } : {}) }\n }\n\n /** Preflight a {@link TonSendable} (unsigned body, current seqno). */\n async simulateTransaction(tx: TonSendable): Promise<TonSimulation> {\n const body = tx instanceof Cell ? tx : v5r1PackUnsigned((await this.signingCell(this.toMessages(tx))).signing)\n return this.simulateBody(body)\n }\n\n /** Estimated fee of a transaction, in nanotons. */\n async quoteSendTransaction(tx: TonSendable): Promise<{ fee: bigint }> {\n const body = tx instanceof Cell ? tx : v5r1PackUnsigned((await this.signingCell(this.toMessages(tx))).signing)\n return { fee: (await this.estimateFees(body)).total }\n }\n\n /** Estimated fee of a transfer, in nanotons. */\n async quoteTransfer(o: TonTransferOptions): Promise<{ fee: bigint }> {\n const message = o.token ? await this.jettonTransferMessage(o) : this.transactionMessage({ to: o.recipient, value: o.amount, ...(o.memo !== undefined ? { body: o.memo } : {}) })\n const { signing } = await this.signingCell([message])\n return { fee: (await this.estimateFees(v5r1PackUnsigned(signing))).total }\n }\n\n /** Offline description of what `tx` does — see {@link describeTransaction}. */\n describe(tx: TonSendable): TonDescription {\n return describeTransaction(tx, { network: this._config.network ?? 'mainnet' })\n }\n\n /**\n * Receipt for a body hash returned by sendTransaction: toncenter v3 maps the\n * message body hash to the account transaction, which is then fetched.\n */\n async getTransactionReceipt(hash: string): Promise<TonReceipt | undefined> {\n const rpc = this.requireRpc('fetch transaction receipts')\n const base = this._config.indexerUrl ?? DEFAULT_INDEXER\n const doFetch = this._config.fetch ?? globalThis.fetch\n const res = await doFetch(`${base}/transactionsByMessage?${new URLSearchParams({ body_hash: hash, limit: '1' })}`, { signal: AbortSignal.timeout(this._config.timeoutMs ?? 15_000) })\n if (!res.ok) throw new NetworkError(`toncenter v3 ${res.status}`, { provider: base })\n const { transactions } = (await res.json()) as { transactions?: Array<{ account: string; hash: string; lt: string }> }\n const found = transactions?.[0]\n if (!found) return undefined\n const account = Address.parse(found.account)\n let tx\n try { [tx] = await rpc.getTransactions(account, { limit: 1, hash: found.hash }) }\n catch { [tx] = await rpc.getTransactions(account, { limit: 1, lt: found.lt, hash: found.hash, archival: true }) }\n if (!tx) return undefined\n const d = tx.description as { type: string; aborted?: boolean }\n return { hash, status: d.type === 'generic' && !d.aborted ? 1 : 0, blockNumber: tx.lt, transactionHash: tx.hash().toString('base64'), totalFees: tx.totalFees.coins, raw: tx }\n }\n\n /** ed25519 over the raw message bytes; `signature` hex. */\n async verify(message: string | Uint8Array, signature: string): Promise<boolean> {\n try { return ed25519.verify(hexToBytes(signature), utf8(message), this.publicKey) } catch { return false }\n }\n}\n\nfunction randomQueryId(): bigint {\n const r = new Uint32Array(2)\n globalThis.crypto.getRandomValues(r)\n return (BigInt(r[0]!) << 32n) | BigInt(r[1]!)\n}\n","import { LocalSigner, feeLimit, requireCurve, type IWalletAccount, type IWalletAccountReadOnly, type Signer, type TransferResult, type WriteOptions } from '@anywalletkit/core'\nimport { Buffer } from 'buffer'\nimport { Cell } from '@ton/core'\nimport { BroadcastUnknownError, MessageIsTransactionError, SimulationError, UnsafeTransactionError } from './errors.js'\nimport { isAnsweredRefusal } from './toncenter.js'\nimport { tonProofDigest, tonSignDataDigest, type TonProof, type TonProofRequest, type TonSignDataRequest, type TonSignedData } from './tonconnect.js'\nimport { WalletAccountReadOnlyTon } from './read-only-account.js'\nimport { parseV5R1Body, v5r1ExternalMessage, v5r1PackSigned, v5r1PackUnsigned, type V5R1Message } from './wallet-v5r1.js'\nimport { drainModes, sendModeOf } from './describe.js'\nimport type { TonConfig, TonSendable, TonTransferOptions } from './types.js'\n\nconst toHex = (u8: Uint8Array) => Array.from(u8, (b) => b.toString(16).padStart(2, '0')).join('')\n\n/** Does `bytes` carry `key` anywhere? A Solana transaction names each signer's 32-byte key. */\nconst carriesKey = (bytes: Uint8Array, key: Uint8Array): boolean => {\n outer: for (let i = 0; i + key.length <= bytes.length; i++) {\n for (let j = 0; j < key.length; j++) if (bytes[i + j] !== key[j]) continue outer\n return true\n }\n return false\n}\n\n/**\n * Signing TON account on Wallet V5R1. It never holds a key: the V5R1 body is\n * signed by `signer.sign(signingCell.hash(), {scheme: 'ed25519', context:\n * 'ton-external'})` — a {@link LocalSigner} for seed wallets, anything else\n * (hardware, MPC, backend) through `externalSigner()`.\n *\n * Every send runs: hard checks → fresh seqno → preflight on the zero-signed\n * body (estimateFee, emulation when configured, fee cap) → sign → broadcast.\n * The preflight body carries a zero signature, so the signer is only asked\n * once the transaction has passed.\n */\nexport class WalletAccountTon extends WalletAccountReadOnlyTon implements IWalletAccount {\n /** seqno and fees come from the network before signing. */\n readonly needsNetwork = true\n /** Derivation path, `ton-mnemonic`, or `external`. */\n readonly path: string\n /** The signer that holds the key. */\n readonly signer: Signer\n private _readOnly: WalletAccountReadOnlyTon | undefined\n\n /** `publicKey` is the signer's 32-byte ed25519 key; the V5R1 address derives from it synchronously. */\n constructor(signer: Signer, publicKey: Uint8Array, path: string, config: TonConfig = {}) {\n super(publicKey, config)\n this.signer = requireCurve(signer, 'ed25519')\n this.path = path\n }\n\n /** Back-compat: wrap a raw derived key in a {@link LocalSigner} (the account takes ownership; it cannot derive). */\n static fromPrivateKey(privateKey: Uint8Array, publicKey: Uint8Array, path: string, config: TonConfig = {}): WalletAccountTon {\n return new WalletAccountTon(LocalSigner.fromPrivateKey('ed25519', privateKey, publicKey, path), publicKey, path, config)\n }\n\n /** Account index for the standard m/44'/607'/i' path. */\n get index(): number | undefined {\n const m = /^m\\/44'\\/607'\\/(\\d+)'$/.exec(this.path)\n return m ? Number(m[1]) : undefined\n }\n\n /**\n * Hex ed25519 signature over the raw message bytes. A 32-byte message — string or bytes — is\n * refused with {@link MessageIsTransactionError}: the wallet contract checks a transfer's\n * signature over the 32-byte hash of its signing cell, so those bytes could be one. Bytes that\n * carry this account's public key are refused as well: one ed25519 key (an external signer) may\n * also be a Solana wallet, and a Solana transaction names its signer's key. TON Connect goes\n * through {@link signTonProof} and {@link signTonConnectData}.\n */\n async sign(message: string | Uint8Array): Promise<string> {\n const bytes = typeof message === 'string' ? new TextEncoder().encode(message) : message\n if (bytes.length === 32 || carriesKey(bytes, this.publicKey)) throw new MessageIsTransactionError()\n return toHex(await this.signer.sign(bytes, { scheme: 'ed25519', context: 'ton-message' }))\n }\n\n /**\n * TON Connect `ton_proof` for this wallet's address: the `proof` object of the connect reply. The\n * digest is built here (0xffff ‖ \"ton-connect\" ‖ …), so no request can turn it into a transfer.\n * `domain` is the host the wallet saw the request come from.\n */\n async signTonProof(request: TonProofRequest): Promise<TonProof> {\n const digest = tonProofDigest(this._address, request)\n const signature = await this.signer.sign(digest, { scheme: 'ed25519', context: 'ton-proof' })\n return {\n timestamp: request.timestamp,\n domain: { lengthBytes: new TextEncoder().encode(request.domain).length, value: request.domain },\n payload: request.payload,\n signature: Buffer.from(signature).toString('base64'),\n }\n }\n\n /** TON Connect `signData` (text / binary) for this wallet's address: the reply the dApp gets. */\n async signTonConnectData(request: TonSignDataRequest): Promise<TonSignedData> {\n const digest = tonSignDataDigest(this._address, request)\n const signature = await this.signer.sign(digest, { scheme: 'ed25519', context: 'ton-sign-data' })\n return {\n signature: Buffer.from(signature).toString('base64'),\n address: this._address.toRawString(),\n timestamp: request.timestamp,\n domain: request.domain,\n payload: request.payload.type === 'text' ? { type: 'text', text: request.payload.text } : { type: 'binary', bytes: request.payload.bytes },\n }\n }\n\n private checkMaxFee(fee: bigint, limit: bigint | number | undefined, op: string) {\n if (limit !== undefined && fee > BigInt(limit)) throw new Error(`Exceeded maximum fee cost for ${op} operation.`)\n }\n\n /**\n * Checks → seqno → preflight → signed body. The preflight runs on the\n * zero-signed body (ignore_chksig), so nothing is signed before it passes.\n */\n /**\n * Refuse send modes that drain the wallet — 128 (the whole remaining balance) and 32 (the account\n * destroyed once empty) — unless `allowDrainingTransactions`. Checked locally, before any seqno or\n * emulation, so it holds with `simulate: false` too (round 3, M11); the emulation check stays.\n */\n private assertNoDrain(modes: number[]): void {\n if (this._config.allowDrainingTransactions === true) return\n const found = modes.flatMap(drainModes)\n if (found.length) throw new UnsafeTransactionError('drain', `Refusing a message with send mode ${found.includes('carries-all-balance') ? '128 (it carries the whole remaining balance)' : '32 (it destroys the wallet account once empty)'}; set allowDrainingTransactions to override.`)\n }\n\n /** The send modes of a prebuilt V5R1 body; an unreadable body is left to the emulation and the node. */\n private bodyModes(body: Cell): number[] {\n return parseV5R1Body(body)?.messages.map((m) => m.mode) ?? []\n }\n\n private async signMessages(messages: V5R1Message[], limit: bigint | number | undefined, op: string): Promise<{ body: Cell; fee: bigint }> {\n this.assertNoDrain(messages.map((m) => sendModeOf(m.mode)))\n // The wallet sends with IGNORE_ERRORS: a message whose value exceeds the\n // balance is silently dropped by the action phase — the external still\n // \"succeeds\", the seqno moves, the fee is paid and nothing leaves\n // (2026-10-09: a 2 GRAM deposit on a 0.46 GRAM balance). Refuse up front,\n // and again after emulation if the risk shows less TON leaving than asked.\n const want = messages.reduce((sum, m) => sum + (m.message.info.type === 'internal' ? m.message.info.value.coins : 0n), 0n)\n if (want > 0n) {\n const balance = await this.getBalance()\n if (balance < want) throw new UnsafeTransactionError('insufficient-balance', `Insufficient TON balance: the messages carry ${want} nanotons, the wallet holds ${balance} (fees come on top).`)\n }\n const { signing } = await this.signingCell(messages)\n const fee = await this.preflight(v5r1PackUnsigned(signing), limit, op, want)\n const signature = await this.signer.sign(new Uint8Array(signing.hash()), { scheme: 'ed25519', context: 'ton-external' })\n return { body: v5r1PackSigned(signing, signature), fee }\n }\n\n private async preflight(body: Cell, limit: bigint | number | undefined, op: string, expectedTonOut?: bigint): Promise<bigint> {\n if (this._config.simulate === false) {\n if (limit === undefined) return 0n\n const fee = (await this.estimateFees(body)).total\n this.checkMaxFee(fee, limit, op)\n return fee\n }\n const sim = await this.simulateBody(body)\n if (!sim.ok) throw new SimulationError(sim.reason, { ...(sim.exitCode !== undefined ? { exitCode: sim.exitCode } : {}), ...(sim.aborted !== undefined ? { aborted: sim.aborted } : {}) })\n if (sim.risk?.transferAllRemainingBalance && this._config.allowDrainingTransactions !== true) {\n throw new UnsafeTransactionError('drain', 'Refusing a message that carries the whole remaining balance (send mode 128); set allowDrainingTransactions to override.')\n }\n if (expectedTonOut !== undefined && sim.risk && sim.risk.ton < expectedTonOut) {\n throw new SimulationError(`The emulation shows only ${sim.risk.ton} nanotons leaving the wallet for messages carrying ${expectedTonOut}: a message would be dropped (insufficient balance for value + fees).`)\n }\n this.checkMaxFee(sim.fees.total, limit, op)\n return sim.fees.total\n }\n\n /** Sign without broadcasting. Returns the external-message BODY as base64 BoC (pass it back to sendTransaction as a Cell). */\n async signTransaction(tx: TonSendable, options: WriteOptions = {}): Promise<string> {\n if (tx instanceof Cell) {\n this.assertNoDrain(this.bodyModes(tx))\n await this.preflight(tx, feeLimit(this._config.transactionMaxFee, options), 'transaction')\n return tx.toBoc().toString('base64')\n }\n const { body } = await this.signMessages(this.toMessages(tx), feeLimit(this._config.transactionMaxFee, options), 'transaction')\n return body.toBoc().toString('base64')\n }\n\n private async broadcast(body: Cell): Promise<string> {\n const rpc = this.requireRpc('send transactions')\n const init = await this.initIfNeeded()\n const hash = body.hash().toString('hex')\n try {\n await rpc.sendBoc(v5r1ExternalMessage(this._address, body, init))\n } catch (e) {\n // Only a node's explicit refusal means nothing went out (round 3, M12).\n if (isAnsweredRefusal(e)) throw e\n throw new BroadcastUnknownError(hash, e)\n }\n return hash\n }\n\n /** Sign and broadcast; `hash` is the body hash (hex) — resolve it with getTransactionReceipt. */\n async sendTransaction(tx: TonSendable, options: WriteOptions = {}): Promise<TransferResult> {\n this.requireRpc('send transactions')\n if (tx instanceof Cell) this.assertNoDrain(this.bodyModes(tx))\n const { body, fee } = tx instanceof Cell\n ? { body: tx, fee: await this.preflight(tx, feeLimit(this._config.transactionMaxFee, options), 'transaction') }\n : await this.signMessages(this.toMessages(tx), feeLimit(this._config.transactionMaxFee, options), 'transaction')\n return { hash: await this.broadcast(body), fee }\n }\n\n /** TON (no `token`) or jetton transfer. */\n async transfer(o: TonTransferOptions, writeOptions: WriteOptions = {}): Promise<TransferResult> {\n this.requireRpc('transfer tokens')\n const message = o.token ? await this.jettonTransferMessage(o) : this.transactionMessage({ to: o.recipient, value: o.amount, ...(o.memo !== undefined ? { body: o.memo } : {}) })\n const { body, fee } = await this.signMessages([message], feeLimit(this._config.transferMaxFee, writeOptions), 'transfer')\n return { hash: await this.broadcast(body), fee }\n }\n\n /** The same wallet as a {@link WalletAccountReadOnlyTon}. */\n toReadOnlyAccount(): IWalletAccountReadOnly {\n this._readOnly ??= new WalletAccountReadOnlyTon(this.publicKey, this._config)\n return this._readOnly\n }\n\n /** Disposes the signer: a local key is zeroized, an external one is released. */\n dispose(): void {\n this.signer.dispose()\n }\n}\n","/**\n * TON Connect signatures (docs.ton.org/develop/dapps/ton-connect/sign): `ton_proof` and\n * `signData` (text / binary). The account builds the digest itself, from the request fields and\n * its own address, so what it signs always starts with the TON Connect prefix (0xffff ‖\n * \"ton-connect…\") and can never be the cell hash a wallet contract checks a transfer against.\n *\n * ton_proof:\n * sha256(0xffff ‖ \"ton-connect\" ‖ sha256(\"ton-proof-item-v2/\" ‖ workchain:int32BE ‖\n * address_hash:32 ‖ domain_len:uint32LE ‖ domain ‖ timestamp:uint64LE ‖ payload))\n * signData (text | binary):\n * sha256(0xffff ‖ \"ton-connect/sign-data/\" ‖ workchain:int32BE ‖ address_hash:32 ‖\n * domain_len:uint32BE ‖ domain ‖ timestamp:uint64BE ‖ \"txt\"|\"bin\" ‖ payload_len:uint32BE ‖ payload)\n */\nimport { sha256 } from '@noble/hashes/sha2.js'\nimport { Buffer } from 'buffer'\n\n/** What a dApp asks `ton_proof` for: its domain (host), the time of the proof, its nonce. */\nexport interface TonProofRequest {\n /** The dApp's host as the wallet saw it (`app.example`), never the dApp's own claim. */\n domain: string\n /** Unix seconds. */\n timestamp: number\n /** The dApp's `ton_proof` payload. */\n payload: string\n}\n\n/** The `proof` object of a TON Connect `ton_proof` reply. */\nexport interface TonProof {\n timestamp: number\n domain: { lengthBytes: number; value: string }\n payload: string\n /** Base64 ed25519 signature. */\n signature: string\n}\n\n/** A `signData` payload. `cell` payloads need schema-aware rendering and are not signed here. */\nexport type TonSignDataPayload = { type: 'text'; text: string } | { type: 'binary'; bytes: string }\n\n/** What a dApp asks `signData` for. */\nexport interface TonSignDataRequest {\n /** The dApp's host as the wallet saw it. */\n domain: string\n /** Unix seconds. */\n timestamp: number\n payload: TonSignDataPayload\n}\n\n/** The TON Connect `signData` reply. */\nexport interface TonSignedData {\n /** Base64 ed25519 signature. */\n signature: string\n /** Raw form (`0:…`) of the address that signed. */\n address: string\n timestamp: number\n domain: string\n payload: TonSignDataPayload\n}\n\n/** The address parts the digests bind to. */\nexport interface TonAddressParts { workChain: number; hash: Uint8Array }\n\nconst utf8 = (s: string) => new TextEncoder().encode(s)\nconst int32BE = (n: number) => { const b = new Uint8Array(4); new DataView(b.buffer).setInt32(0, n, false); return b }\nconst uint32 = (n: number, littleEndian: boolean) => { const b = new Uint8Array(4); new DataView(b.buffer).setUint32(0, n, littleEndian); return b }\nconst uint64 = (n: number, littleEndian: boolean) => { const b = new Uint8Array(8); new DataView(b.buffer).setBigUint64(0, BigInt(n), littleEndian); return b }\nconst concat = (...parts: Uint8Array[]) => { const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0)); let o = 0; for (const p of parts) { out.set(p, o); o += p.length } return out }\n\nfunction checkCommon(address: TonAddressParts, domain: unknown, timestamp: unknown): void {\n if (address.hash.length !== 32) throw new RangeError('TON address hash must be 32 bytes.')\n if (!Number.isInteger(address.workChain)) throw new TypeError('TON address workChain must be an integer.')\n if (typeof domain !== 'string' || domain.length === 0) throw new TypeError('TON Connect domain must be a non-empty string.')\n if (typeof timestamp !== 'number' || !Number.isSafeInteger(timestamp) || timestamp < 0) throw new TypeError('TON Connect timestamp must be a non-negative integer (unix seconds).')\n}\n\n/** Standard base64 (padding optional, ASCII whitespace ignored as `atob` does), strictly: a malformed `bytes` is refused, not half-decoded. */\nfunction base64Bytes(raw: string): Uint8Array {\n const s = raw.replace(/[\\t\\n\\f\\r ]/g, '')\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(s) || s.replace(/=+$/, '').length % 4 === 1) throw new TypeError('signData binary payload must be base64.')\n return new Uint8Array(Buffer.from(s, 'base64'))\n}\n\n/** The 32 bytes a wallet signs for `ton_proof`. */\nexport function tonProofDigest(address: TonAddressParts, request: TonProofRequest): Uint8Array {\n checkCommon(address, request.domain, request.timestamp)\n if (typeof request.payload !== 'string') throw new TypeError('ton_proof payload must be a string.')\n const domain = utf8(request.domain)\n const inner = concat(utf8('ton-proof-item-v2/'), int32BE(address.workChain), address.hash, uint32(domain.length, true), domain, uint64(request.timestamp, true), utf8(request.payload))\n return sha256(concat(new Uint8Array([0xff, 0xff]), utf8('ton-connect'), sha256(inner)))\n}\n\n/** The 32 bytes a wallet signs for `signData` (text / binary). */\nexport function tonSignDataDigest(address: TonAddressParts, request: TonSignDataRequest): Uint8Array {\n checkCommon(address, request.domain, request.timestamp)\n const p = request.payload as { type?: unknown; text?: unknown; bytes?: unknown } | undefined\n let payload: Uint8Array\n if (p?.type === 'text' && typeof p.text === 'string') payload = utf8(p.text)\n else if (p?.type === 'binary' && typeof p.bytes === 'string') payload = base64Bytes(p.bytes)\n else throw new TypeError('signData payload must be { type: \"text\", text } or { type: \"binary\", bytes }; cell payloads are not supported.')\n const domain = utf8(request.domain)\n return sha256(concat(new Uint8Array([0xff, 0xff]), utf8('ton-connect/sign-data/'), int32BE(address.workChain), address.hash, uint32(domain.length, false), domain, uint64(request.timestamp, false), utf8(p.type === 'text' ? 'txt' : 'bin'), uint32(payload.length, false), payload))\n}\n","import { LocalSigner, SignerError, WalletManager, isSeedSigner, zeroize, type FeeRates, type Signer } from '@anywalletkit/core'\nimport { mnemonicToPrivateKey, mnemonicValidate } from '@ton/crypto'\nimport { WalletAccountTon } from './account.js'\nimport { WalletAccountReadOnlyTon } from './read-only-account.js'\nimport type { TonConfig } from './types.js'\n\n/** Base derivation path for BIP-39 seeds; account `i` is at `m/44'/607'/i'`. */\nexport const TON_BASE_PATH = \"m/44'/607'\"\n/** Path label of the account a TON-native (Tonkeeper-style) mnemonic yields — there is exactly one. */\nexport const TON_MNEMONIC_PATH = 'ton-mnemonic'\nimport { DEFAULT_TONAPI } from './emulation.js'\n\n/**\n * One seed → TON accounts at m/44'/607'/i' (SLIP-10 ed25519) on Wallet V5R1 —\n * the derivation Trust Wallet and Ledger use for a BIP-39 phrase. Paths\n * may be relative to m/44'/607' (\"0'\") or full.\n *\n * Built with an ed25519 `Signer` instead of a seed, the manager wraps it:\n * - a derivable `SeedSigner` sitting at `m/44'/607'` yields `getAccount(i)` → `i'` children;\n * - a `SeedSigner` at a leaf, or any external signer, is `getAccount(0)` (path = the\n * signer's path, or 'external'); other indexes/paths throw.\n *\n * Tonkeeper-style 24-word TON mnemonics (not BIP-39) are imported with\n * {@link WalletManagerTon.fromTonMnemonic}; they yield one account at `ton-mnemonic`.\n */\nexport class WalletManagerTon extends WalletManager<WalletAccountTon, TonConfig> {\n constructor(seedOrSigner: string | Uint8Array | Signer, config: TonConfig = {}) {\n super(seedOrSigner, config)\n }\n\n\n /**\n * Import a TON-native mnemonic (24 words, Tonkeeper / Tonhub / MyTonWallet\n * default): PBKDF2 per @ton/crypto, one ed25519 key, one V5R1 account at\n * path `ton-mnemonic` with the address those wallets show.\n */\n static async fromTonMnemonic(words: string[] | string, config: TonConfig = {}): Promise<WalletManagerTon> {\n const list = (Array.isArray(words) ? words : words.trim().split(/\\s+/)).map((w) => w.toLowerCase())\n if (list.length !== 24) throw new Error('A TON mnemonic has 24 words.')\n // TON mnemonics carry their own check: a typo (or a BIP-39 phrase) would derive another, empty wallet.\n if (!(await mnemonicValidate(list))) throw new Error('Not a valid TON mnemonic: check the words (a typo would open a different, empty wallet).')\n const pair = await mnemonicToPrivateKey(list)\n const privateKey = new Uint8Array(pair.secretKey.subarray(0, 32)) // nacl secret key = seed || public key\n const publicKey = new Uint8Array(pair.publicKey)\n zeroize(new Uint8Array(pair.secretKey.buffer, pair.secretKey.byteOffset, pair.secretKey.byteLength))\n return new WalletManagerTon(LocalSigner.fromPrivateKey('ed25519', privateKey, publicKey, TON_MNEMONIC_PATH), config)\n }\n\n async getAccount(index = 0): Promise<WalletAccountTon> {\n const external = this.externalSigner()\n if (external && !(isSeedSigner(external) && external.path === TON_BASE_PATH)) {\n // A leaf signer (TON mnemonic, hardware, MPC…) is exactly one account.\n if (index !== 0) throw new SignerError(`This signer yields a single account (index 0); ${index} is not derivable from it.`)\n return this.fromSigner(external, this.singlePath(external))\n }\n return this.getAccountByPath(`${TON_BASE_PATH}/${index}'`)\n }\n\n async getAccountByPath(path: string): Promise<WalletAccountTon> {\n const external = this.externalSigner()\n if (external) {\n const single = this.singlePath(external)\n const full = path === single || path.startsWith('m/') ? path : `${TON_BASE_PATH}/${path}`\n return this.fromSigner(external, full)\n }\n const full = path.startsWith('m/') ? path : `${TON_BASE_PATH}/${path}`\n const cached = this._accounts.get(full)\n if (cached) return cached\n return this.cachedAccount(full, () => {\n const signer = LocalSigner.leafFromSeed(this.seedBytes(), 'ed25519', full)\n return new WalletAccountTon(signer, signer.publicKey, full, this._config)\n })\n }\n\n /** The one path a non-derivable signer answers to: its own, or 'external'. */\n private singlePath(signer: Signer): string {\n return isSeedSigner(signer) ? signer.path : 'external'\n }\n\n /** Resolve `path` against an injected signer: the signer itself, or a child when it can derive there. */\n private async fromSigner(signer: Signer, path: string): Promise<WalletAccountTon> {\n this.requireSigner('ed25519')\n let rel: string | undefined\n let key = this.singlePath(signer)\n if (isSeedSigner(signer)) {\n if (path === signer.path) key = path\n else if (path.startsWith(`${signer.path}/`)) { rel = path.slice(signer.path.length + 1); key = path }\n else throw new SignerError(`This signer yields a single account at path '${signer.path}'; it cannot provide ${path}.`)\n } else if (path !== `${TON_BASE_PATH}/0'` && path !== 'external') {\n throw new SignerError(`An external signer yields a single account; ${path} is not derivable from it.`)\n }\n return this.signerAccount(key, signer, rel, (leaf, publicKey) => new WalletAccountTon(leaf, publicKey, key, this._config))\n }\n\n /** Watch-only account for a public key (hex or bytes) — TON addresses derive from the key, not the other way round. */\n getReadOnlyAccount(publicKey: Uint8Array | string): WalletAccountReadOnlyTon {\n return new WalletAccountReadOnlyTon(publicKey, this._config)\n }\n\n /** Gas price from config param 21 via tonapi (normal = fast there; slow = ×0.8 here). */\n async getFeeRates(): Promise<FeeRates> {\n const doFetch = this._config.fetch ?? globalThis.fetch\n const res = await doFetch(`${this._config.tonApiUrl ?? DEFAULT_TONAPI}/blockchain/config/raw`, { signal: AbortSignal.timeout(this._config.timeoutMs ?? 15_000) })\n const json = (await res.json()) as { config: { config_param21: { gas_limits_prices: { gas_flat_pfx: { other: { gas_prices_ext: { gas_price: number } } } } } } }\n const normal = BigInt(Math.round(json.config.config_param21.gas_limits_prices.gas_flat_pfx.other.gas_prices_ext.gas_price / 65_536))\n return { slow: (normal * 80n) / 100n, normal, fast: normal }\n }\n\n}\n","import { installBufferGlobal } from './buffer-global.js'\ninstallBufferGlobal()\nexport { installBufferGlobal }\nexport * from './types.js'\nexport * from './errors.js'\nexport { createTonClient } from './client.js'\nexport { TonCenter, createTonRpc, tonCenterEndpoint, isAnsweredRefusal, emulateExternal, parseEmulation, type TonAccountState, type TonAccountStatus, type GetMethodResult, type EmulationVerdict } from './toncenter.js'\nexport { emulateViaTonapi, parseTonapiConsequences, parseTonapiTrace, parseTonapiRisk, runEmulation, resolveEmulate, DEFAULT_TONAPI, type EmulationOutcome, type EmulationSource, type EmulateOptions } from './emulation.js'\nexport {\n V5R1_CODE_HEX, V5R1_OP, MAINNET_GLOBAL_ID, TESTNET_GLOBAL_ID, DEFAULT_SEND_MODE, MAX_ACTIONS,\n v5r1Code, v5r1WalletId, v5r1StateInit, v5r1Address, v5r1SigningMessage, v5r1PackSigned, v5r1PackUnsigned, v5r1ExternalMessage, parseV5R1Body,\n type V5R1Message, type V5R1SigningParams, type V5R1WalletIdParts, type ParsedV5R1Body,\n} from './wallet-v5r1.js'\nexport {\n describeTransaction, describeMessageRelaxed, decodeBody, commentCell, JETTON_TRANSFER_OP,\n type TonDescription, type TonDescribedMessage, type TonDescribedKind, type TonJettonDetails, type TonWarning, type TonWarningCode, type DecodedBody,\n} from './describe.js'\nexport { WalletAccountReadOnlyTon, SEND_MODE } from './read-only-account.js'\nexport { WalletAccountTon } from './account.js'\nexport { tonProofDigest, tonSignDataDigest, type TonProof, type TonProofRequest, type TonSignDataPayload, type TonSignDataRequest, type TonSignedData, type TonAddressParts } from './tonconnect.js'\nexport { WalletManagerTon, TON_BASE_PATH, TON_MNEMONIC_PATH } from './manager.js'\nexport {\n createTonHistory, mapTonapiEvent, mapToncenterTransaction, mapActions as mapTonapiActions, valueFlowTransfers, rawTonAddress, tonExplorerTxUrl, HistoryUnavailableError,\n encodeCursor as encodeHistoryCursor, decodeCursor as decodeHistoryCursor,\n type TonHistoryOptions, type TonHistorySource, type TonHistoryPage, type TonChainTx, type TonHistoryRaw, type TonHistoryBackend, type TonHistoryCursor, type TonapiEvent, type TonapiAction, type V3Transaction, type HistoryFetch,\n} from './history.js'\nexport { WalletManagerTon as default } from './manager.js'\nexport type { MappedActions, TonapiAccount, TonapiJetton, V3Message } from './history.js'\n"],"mappings":"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","names":["Buffer","NetworkError","DEFAULT_TIMEOUT_MS","NetworkError","big","verdict","Buffer","Cell","Address","Cell","beginCell","Address","Cell","beginCell","external","NetworkError","Address","Cell","beginCell","JETTON_TRANSFER_OP","NetworkError","Address","beginCell","Cell","Buffer","Cell","Buffer","utf8","Buffer","Cell","LocalSigner","SignerError","LocalSigner","external","SignerError","full"]}
|
|
1
|
+
{"version":3,"sources":["../src/buffer-global.ts","../src/errors.ts","../src/toncenter.ts","../src/emulation.ts","../src/wallet-v5r1.ts","../src/describe.ts","../src/read-only-account.ts","../src/account.ts","../src/tonconnect.ts","../src/manager.ts","../src/index.ts"],"sourcesContent":["// @ton/core and @ton/crypto read the GLOBAL `Buffer` (Node convention). Browsers\n// and Hermes have none, so the package installs the `buffer` polyfill once, at\n// import time, only when it is missing. Node and React Native entries that\n// already set it are untouched. Called as a function from index.ts (not a bare\n// import): bundlers drop bare imports of modules they consider side-effect\n// free, and this one was silently dropped from dist before.\nimport { Buffer } from 'buffer'\n\n/**\n * Set `globalThis.Buffer` to the `buffer` polyfill when the runtime has none (Hermes, browsers).\n * Runs on import.\n */\nexport function installBufferGlobal(): void {\n const g = globalThis as { Buffer?: unknown }\n g.Buffer ??= Buffer\n}\n\ninstallBufferGlobal()\n","import { SignerError } from '@anywalletkit/core'\n\n/**\n * Refused before signing: the message would almost certainly misbehave or\n * strand funds (zero value, wrong network flag, exotic workchain, a\n * `valid_until` further away than the wallet contract tolerates…).\n */\nexport class UnsafeTransactionError extends SignerError {\n readonly code: string\n constructor(code: string, message: string) {\n super(message)\n this.name = 'UnsafeTransactionError'\n this.code = code\n }\n}\n\n/**\n * `sign()` refused a 32-byte message: the wallet contract checks a transfer's signature over the\n * 32-byte hash of its signing cell, so a signature over 32 raw bytes may authorise one. TON Connect\n * proofs and signData go through `signTonProof` / `signTonConnectData`; transactions through\n * `signTransaction` / `sendTransaction`, where they are reviewed.\n */\nexport class MessageIsTransactionError extends SignerError {\n readonly code = 'message-is-transaction'\n constructor() {\n super('This message has the shape of a transaction (a 32-byte TON hash, or bytes naming this key as a Solana signer) and is not signed; use signTonProof / signTonConnectData for TON Connect, or signTransaction so it can be reviewed.')\n this.name = 'MessageIsTransactionError'\n }\n}\n\n/** Emulation of the external message failed (non-zero compute exit, aborted, action phase failed); nothing was signed or sent. */\nexport class SimulationError extends Error {\n readonly exitCode: number | undefined\n readonly aborted: boolean\n constructor(reason: string, details: { exitCode?: number; aborted?: boolean } = {}) {\n super(`Transaction simulation failed: ${reason}`)\n this.name = 'SimulationError'\n this.exitCode = details.exitCode\n this.aborted = details.aborted ?? false\n }\n}\n\n/**\n * The external message was handed to the network but no definitive answer came back (no response,\n * a timeout, a non-JSON body): it MAY be on chain. Do not sign again (the next seqno would pay\n * twice) — watch `hash`, the body hash `sendTransaction` returns.\n */\nexport class BroadcastUnknownError extends Error {\n /** Always true: the transaction may be on its way. */\n readonly maybeSent = true\n /** Hex hash of the signed body. */\n readonly hash: string\n constructor(hash: string, cause: unknown) {\n super(`Broadcast outcome unknown for ${hash}: ${cause instanceof Error ? cause.message.slice(0, 200) : String(cause).slice(0, 200)}`, { cause })\n this.name = 'BroadcastUnknownError'\n this.hash = hash\n }\n}\n","/**\n * toncenter v2 JSON-RPC client — the handful of calls a wallet needs, with\n * failover across endpoints, timeouts, api keys and response-shape checks.\n * No axios, no dataloader, no caches: one `fetch` per call.\n */\nimport { NetworkError } from '@anywalletkit/core'\nimport { Buffer } from 'buffer'\nimport { Address, Cell, TupleReader, loadTransaction, type StateInit, type Transaction, type TupleItem } from '@ton/core'\nimport type { TonConfig, TonEndpoint, TonFees, TonProvider, TonRpc } from './types.js'\n\nconst DEFAULT_TIMEOUT_MS = 15_000\n\nconst isRpc = (p: TonProvider): p is TonRpc => typeof (p as TonRpc).call === 'function'\n\n/** JSON-RPC over one toncenter v2 endpoint. */\nexport function tonCenterEndpoint(endpoint: TonEndpoint, opts: { fetch?: typeof fetch; timeoutMs?: number } = {}): TonRpc {\n const url = endpoint.url\n const doFetch = opts.fetch ?? globalThis.fetch\n if (typeof doFetch !== 'function') throw new NetworkError('No fetch available; pass config.fetch', { provider: url })\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS\n return {\n async call<T>(method: string, params: Record<string, unknown>): Promise<T> {\n let res: Response\n try {\n res = await doFetch(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json',\n ...(endpoint.secretKey ? { 'X-API-Key': endpoint.secretKey } : {}),\n },\n body: JSON.stringify({ id: '1', jsonrpc: '2.0', method, params }),\n signal: AbortSignal.timeout(timeoutMs),\n })\n } catch (e) {\n throw new NetworkError(`${method}: ${e instanceof Error ? e.message : String(e)}`, { provider: url, cause: e })\n }\n let json: { ok?: boolean; result?: T; error?: unknown; code?: unknown }\n try { json = (await res.json()) as typeof json } catch (e) {\n throw new NetworkError(`${method}: HTTP ${res.status}, non-JSON body`, { provider: url, cause: e })\n }\n if (!res.ok || json.ok !== true) {\n const detail = typeof json.error === 'string' ? json.error : JSON.stringify(json.error ?? json)\n // The node answered and said no: a definitive refusal, not a lost request.\n throw Object.assign(new NetworkError(`${method}: ${detail} (HTTP ${res.status})`, { provider: url }), { answered: true })\n }\n return json.result as T\n },\n }\n}\n\n/** An endpoint answered with a refusal (`ok: false`): nothing was taken. A thrown fetch, a timeout or a non-JSON body may have been. */\nexport function isAnsweredRefusal(e: unknown): boolean {\n return (e as { answered?: unknown } | null)?.answered === true\n}\n\n/** One RPC, or a failover RPC walking the configured list (`retries` extra rounds after the first full pass). */\nexport function createTonRpc(config: TonConfig): TonRpc | undefined {\n const target = config.tonClient ?? config.provider\n if (target === undefined) return undefined\n const list = (Array.isArray(target) ? target : [target]).map((p) =>\n isRpc(p) ? p : tonCenterEndpoint(p, { ...(config.fetch ? { fetch: config.fetch } : {}), ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}) }),\n )\n if (list.length === 0) throw new Error(\"The 'tonClient' option cannot be set to an empty list.\")\n if (list.length === 1) return list[0]!\n const attempts = list.length + (config.retries ?? 3)\n return {\n async call<T>(method: string, params: Record<string, unknown>): Promise<T> {\n let lastError: unknown\n let answered = true\n for (let i = 0; i < attempts; i++) {\n try { return await list[i % list.length]!.call<T>(method, params) } catch (e) { lastError = e; answered &&= isAnsweredRefusal(e) }\n }\n // Refused everywhere is a refusal; one endpoint that never answered may have taken it.\n const err = new NetworkError(`All TON endpoints failed for ${method}`, { cause: lastError })\n throw answered ? Object.assign(err, { answered: true }) : err\n },\n }\n}\n\n// ── Stack (de)serialization, toncenter v2 wire format ───────────────────────\n\nfunction serializeStackItem(item: TupleItem): [string, unknown] {\n switch (item.type) {\n case 'int': return ['num', item.value.toString()]\n case 'cell': return ['tvm.Cell', item.cell.toBoc().toString('base64')]\n case 'slice': return ['tvm.Slice', item.cell.toBoc().toString('base64')]\n case 'builder': return ['tvm.Builder', item.cell.toBoc().toString('base64')]\n default: throw new Error(`Unsupported stack item type: ${item.type}`)\n }\n}\n\nconst hexBigInt = (s: string): bigint => (s.startsWith('-') ? -BigInt(s.slice(1)) : BigInt(s))\nconst cellFromBase64 = (b64: string): Cell => Cell.fromBoc(Buffer.from(b64, 'base64'))[0]!\n\nfunction parseStackEntry(x: unknown): TupleItem {\n const o = x as Record<string, unknown>\n switch (o['@type']) {\n case 'tvm.list':\n case 'tvm.tuple': return { type: 'tuple', items: (o.elements as unknown[]).map(parseStackEntry) }\n case 'tvm.cell': return { type: 'cell', cell: cellFromBase64(o.bytes as string) }\n case 'tvm.stackEntryCell': return parseStackEntry(o.cell)\n case 'tvm.stackEntryTuple': return parseStackEntry(o.tuple)\n case 'tvm.stackEntryNumber': return parseStackEntry(o.number)\n case 'tvm.numberDecimal': return { type: 'int', value: BigInt(o.number as string) }\n default: throw new NetworkError(`Malformed stack entry: ${JSON.stringify(x)}`)\n }\n}\n\nfunction parseStackItem(s: unknown): TupleItem {\n if (!Array.isArray(s) || s.length < 2) throw new NetworkError(`Malformed stack item: ${JSON.stringify(s)}`)\n const [kind, value] = s as [string, unknown]\n switch (kind) {\n case 'num': return { type: 'int', value: hexBigInt(value as string) }\n case 'null': return { type: 'null' }\n case 'cell': return { type: 'cell', cell: cellFromBase64((value as { bytes: string }).bytes) }\n case 'slice': return { type: 'slice', cell: cellFromBase64((value as { bytes: string }).bytes) }\n case 'builder': return { type: 'builder', cell: cellFromBase64((value as { bytes: string }).bytes) }\n case 'tuple':\n case 'list': return { type: 'tuple', items: ((value as { elements: unknown[] }).elements ?? []).map(parseStackEntry) }\n default: throw new NetworkError(`Malformed stack item kind: ${kind}`)\n }\n}\n\n// ── Typed API ───────────────────────────────────────────────────────────────\n\n/** State of a TON account on chain. */\nexport type TonAccountStatus = 'active' | 'uninitialized' | 'frozen' | 'nonexist'\n\n/** Balance, status, code and data of an account. */\nexport interface TonAccountState {\n balance: bigint\n state: TonAccountStatus\n code: Cell | null\n data: Cell | null\n lastTransaction: { lt: string; hash: string } | null\n}\n\n/** Result of a contract get-method call. */\nexport interface GetMethodResult { exitCode: number; gasUsed: number; stack: TupleReader }\n\nconst need = <T>(cond: unknown, what: string, value: T): T => {\n if (!cond) throw new NetworkError(`Malformed toncenter response: ${what}`)\n return value\n}\n\n/** The toncenter calls a wallet uses, with parsed results. */\nexport class TonCenter {\n constructor(readonly rpc: TonRpc) {}\n\n /** Balance, status, code and data of an account. */\n async getAddressInformation(address: Address): Promise<TonAccountState> {\n const r = await this.rpc.call<Record<string, unknown>>('getAddressInformation', { address: address.toString() })\n need(r && typeof r === 'object' && typeof r.balance === 'string', 'getAddressInformation', r)\n const state = r.state as string\n const last = r.last_transaction_id as { lt?: string; hash?: string } | undefined\n return {\n balance: BigInt(r.balance as string),\n state: (['active', 'uninitialized', 'frozen', 'nonexist'] as const).includes(state as TonAccountStatus) ? (state as TonAccountStatus) : 'nonexist',\n code: typeof r.code === 'string' && r.code !== '' ? cellFromBase64(r.code) : null,\n data: typeof r.data === 'string' && r.data !== '' ? cellFromBase64(r.data) : null,\n lastTransaction: last && last.lt && last.lt !== '0' ? { lt: last.lt, hash: last.hash ?? '' } : null,\n }\n }\n\n /** Call a contract get-method; the result carries the exit code. */\n async runGetMethod(address: Address, method: string, stack: TupleItem[] = []): Promise<GetMethodResult> {\n const r = await this.rpc.call<Record<string, unknown>>('runGetMethod', {\n address: address.toString(), method, stack: stack.map(serializeStackItem),\n })\n need(r && typeof r === 'object' && typeof r.exit_code === 'number' && Array.isArray(r.stack), 'runGetMethod', r)\n return { exitCode: r.exit_code as number, gasUsed: Number(r.gas_used ?? 0), stack: new TupleReader((r.stack as unknown[]).map(parseStackItem)) }\n }\n\n /** Like runGetMethod but throws on a non-zero exit code. */\n async runGetMethodOk(address: Address, method: string, stack: TupleItem[] = []): Promise<GetMethodResult> {\n const r = await this.runGetMethod(address, method, stack)\n if (r.exitCode !== 0) throw new NetworkError(`Get method ${method} failed with exit_code: ${r.exitCode}`)\n return r\n }\n\n /** Broadcast a signed external message. */\n async sendBoc(message: Cell): Promise<void> {\n await this.rpc.call('sendBoc', { boc: message.toBoc().toString('base64') })\n }\n\n /** Broadcast and return the external-message hash (base64) toncenter reports. */\n async sendBocReturnHash(message: Cell): Promise<string> {\n const r = await this.rpc.call<{ hash?: string }>('sendBocReturnHash', { boc: message.toBoc().toString('base64') })\n return need(r && typeof r.hash === 'string', 'sendBocReturnHash', r.hash as string)\n }\n\n async getTransactions(address: Address, opts: { limit: number; lt?: string; hash?: string; archival?: boolean }): Promise<Transaction[]> {\n const params: Record<string, unknown> = { address: address.toString(), limit: opts.limit }\n if (opts.lt) params.lt = opts.lt\n if (opts.hash) params.hash = Buffer.from(opts.hash, 'base64').toString('hex')\n if (opts.archival) params.archival = true\n const r = await this.rpc.call<unknown>('getTransactions', params)\n need(Array.isArray(r), 'getTransactions', r)\n return (r as Array<{ data?: string }>).map((t) => {\n need(typeof t.data === 'string', 'getTransactions[].data', t)\n return loadTransaction(cellFromBase64(t.data as string).beginParse())\n })\n }\n\n async estimateFee(address: Address, args: { body: Cell; init?: StateInit; ignoreSignature?: boolean }): Promise<TonFees> {\n const r = await this.rpc.call<{ source_fees?: Record<string, unknown> }>('estimateFee', {\n address: address.toString(),\n body: args.body.toBoc().toString('base64'),\n init_code: args.init ? args.init.code!.toBoc().toString('base64') : '',\n init_data: args.init ? args.init.data!.toBoc().toString('base64') : '',\n ignore_chksig: args.ignoreSignature ?? true,\n })\n const f = r?.source_fees\n need(f && ['in_fwd_fee', 'storage_fee', 'gas_fee', 'fwd_fee'].every((k) => typeof f[k] === 'number' || typeof f[k] === 'string'), 'estimateFee', r)\n const fees = {\n inFwdFee: BigInt(f!.in_fwd_fee as number), storageFee: BigInt(f!.storage_fee as number),\n gasFee: BigInt(f!.gas_fee as number), fwdFee: BigInt(f!.fwd_fee as number),\n }\n return { ...fees, total: fees.inFwdFee + fees.storageFee + fees.gasFee + fees.fwdFee }\n }\n}\n\n// ── Emulation (toncenter v3 emulateTrace) ───────────────────────────────────\n\n/**\n * Whether an emulated wallet transaction succeeded: compute exit code, abort flag, action phase.\n */\nexport interface EmulationVerdict {\n ok: boolean\n exitCode?: number\n aborted?: boolean\n actionSuccess?: boolean\n reason?: string\n}\n\n/**\n * Reduce an `emulateTrace` response to a verdict for the ROOT transaction (the\n * wallet's own): compute-phase exit code, aborted flag, action-phase success.\n * Tolerant of the field spellings the v3 API has used (`description.compute_ph`\n * / `compute`, `action.success`); anything unrecognisable is a NetworkError, not\n * a silent pass.\n */\nexport function parseEmulation(json: unknown): EmulationVerdict {\n const j = json as Record<string, unknown> | null\n if (!j || typeof j !== 'object') throw new NetworkError('Malformed emulation response')\n if (typeof j.error === 'string') return { ok: false, reason: j.error }\n const txs = j.transactions as Record<string, Record<string, unknown>> | Array<Record<string, unknown>> | undefined\n const rootHash = (j.trace as { tx_hash?: string } | undefined)?.tx_hash\n let tx: Record<string, unknown> | undefined\n if (Array.isArray(txs)) tx = txs[0]\n else if (txs && typeof txs === 'object') tx = (rootHash && txs[rootHash]) || Object.values(txs)[0]\n if (!tx) {\n if (typeof j.exit_code === 'number') return verdict(j.exit_code, j.aborted === true, undefined)\n throw new NetworkError('Malformed emulation response: no transactions')\n }\n const d = (tx.description as Record<string, unknown> | undefined) ?? tx\n const compute = (d.compute_ph ?? d.compute) as Record<string, unknown> | undefined\n const action = d.action as Record<string, unknown> | undefined\n const exitCode = typeof compute?.exit_code === 'number' ? compute.exit_code : compute?.success === true ? 0 : undefined\n const actionSuccess = typeof action?.success === 'boolean' ? action.success : undefined\n if (exitCode === undefined && d.aborted === undefined && actionSuccess === undefined) throw new NetworkError('Malformed emulation response: no phases')\n return verdict(exitCode, d.aborted === true, actionSuccess)\n}\n\nfunction verdict(exitCode: number | undefined, aborted: boolean, actionSuccess: boolean | undefined): EmulationVerdict {\n const ok = !aborted && (exitCode === undefined || exitCode === 0) && actionSuccess !== false\n const reason = aborted ? 'transaction aborted' : exitCode !== undefined && exitCode !== 0 ? `compute phase exit_code ${exitCode}` : actionSuccess === false ? 'action phase failed' : undefined\n return { ok, ...(exitCode !== undefined ? { exitCode } : {}), aborted, ...(actionSuccess !== undefined ? { actionSuccess } : {}), ...(reason ? { reason } : {}) }\n}\n\n/** POST the external message to a toncenter v3 emulation endpoint and reduce the trace. */\nexport async function emulateExternal(url: string, message: Cell, opts: { fetch?: typeof fetch; timeoutMs?: number; apiKey?: string } = {}): Promise<EmulationVerdict> {\n const doFetch = opts.fetch ?? globalThis.fetch\n let res: Response\n try {\n res = await doFetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json', ...(opts.apiKey ? { 'X-API-Key': opts.apiKey } : {}) },\n body: JSON.stringify({ boc: message.toBoc().toString('base64'), ignore_chksig: true, include_code_data: false, with_actions: false }),\n signal: AbortSignal.timeout(opts.timeoutMs ?? DEFAULT_TIMEOUT_MS),\n })\n } catch (e) {\n throw new NetworkError(`emulate: ${e instanceof Error ? e.message : String(e)}`, { provider: url, cause: e })\n }\n let json: unknown\n try { json = await res.json() } catch (e) { throw new NetworkError(`emulate: HTTP ${res.status}, non-JSON body`, { provider: url, cause: e }) }\n if (!res.ok) {\n const err = (json as { error?: unknown; detail?: unknown })\n return { ok: false, reason: `HTTP ${res.status}: ${typeof err.error === 'string' ? err.error : JSON.stringify(err.detail ?? err.error ?? json)}` }\n }\n return parseEmulation(json)\n}\n","/**\n * Preflight emulation of a zero-signed external through tonapi\n * (`POST /v2/wallet/emulate`, fallback `POST /v2/traces/emulate`) or a\n * toncenter v3 `emulateTrace` endpoint. The verdict decides whether the\n * account signs at all; `risk` (tonapi only) summarises what would leave the\n * wallet so a foreign body cannot quietly drain it.\n *\n * tonapi shapes used (OpenAPI v2):\n * MessageConsequences = { trace: Trace, event: AccountEvent, risk: Risk }\n * Trace = { transaction: Transaction, interfaces: string[], children?: Trace[], emulated?: boolean }\n * Transaction.compute_phase = { skipped, skip_reason?, success?, exit_code?, exit_code_description? }\n * Transaction.action_phase = { success, result_code, … }\n * Transaction.{ success, aborted, bounce_phase? }\n * Risk = { transfer_all_remaining_balance, ton, jettons: [{ quantity, wallet_address: { address }, jetton: { address, symbol, decimals } }], nfts }\n */\nimport type { Cell } from '@ton/core'\nimport { NetworkError } from '@anywalletkit/core'\nimport { emulateExternal as emulateToncenter, type EmulationVerdict } from './toncenter.js'\nimport type { TonEmulateConfig, TonRisk } from './types.js'\n\nconst DEFAULT_TIMEOUT_MS = 15_000\n/** Default tonapi root used for emulation. */\nexport const DEFAULT_TONAPI = 'https://tonapi.io/v2'\n\n/** Service an emulation came from. */\nexport type EmulationSource = 'tonapi' | 'toncenter-v3'\n\n/** An emulation verdict with its source and any deeper failures. */\nexport interface EmulationOutcome extends EmulationVerdict {\n source: EmulationSource\n /** Failed/bounced transactions deeper than the first hop — informational. */\n warnings: string[]\n /** tonapi `risk`: what the message would move out of the wallet. */\n risk?: TonRisk\n}\n\ninterface TonapiTx {\n hash?: string\n account?: { address?: string } | string\n success?: boolean\n aborted?: boolean\n compute_phase?: { skipped?: boolean; skip_reason?: string; success?: boolean; exit_code?: number; exit_code_description?: string }\n action_phase?: { success?: boolean; result_code?: number; result_code_description?: string }\n bounce_phase?: string\n}\ninterface TonapiTrace { transaction?: TonapiTx; children?: TonapiTrace[] }\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return !!v && typeof v === 'object' && !Array.isArray(v)\n}\n\n/**\n * A plain value transfer to an account that does not exist yet: the chain\n * credits the coins and leaves the account `uninit`; tonapi reports the hop as\n * `success: true, aborted: true, compute skipped (cskip_no_state)` with no\n * bounce phase. That is the normal shape of funding a fresh deposit address\n * (NEAR Intents TON deposits, 2026-10-09) — not a failure. A BOUNCEABLE\n * message to the same account bounces instead (`bounce_phase` set) and stays\n * fatal, since the value comes back minus fees.\n */\nfunction creditedUninit(tx: TonapiTx): boolean {\n const c = tx.compute_phase\n return tx.success === true && c?.skipped === true && c.skip_reason === 'cskip_no_state' && tx.bounce_phase === undefined && (tx.action_phase === undefined || tx.action_phase.success !== false)\n}\n\nfunction txFailure(tx: TonapiTx): string | undefined {\n const c = tx.compute_phase\n if (creditedUninit(tx)) return undefined\n if (tx.aborted === true) return 'aborted'\n if (c && c.skipped !== true && typeof c.exit_code === 'number' && c.exit_code !== 0) return `compute exit_code ${c.exit_code}${c.exit_code_description ? ` (${c.exit_code_description})` : ''}`\n if (c && c.skipped === true && tx.success === false) return `compute skipped${c.skip_reason ? ` (${c.skip_reason})` : ''}`\n if (tx.action_phase && tx.action_phase.success === false) return `action phase failed${typeof tx.action_phase.result_code === 'number' ? ` (code ${tx.action_phase.result_code})` : ''}`\n if (typeof tx.bounce_phase === 'string' && tx.bounce_phase !== 'TrPhaseBounceOk' && tx.success === false) return `bounced (${tx.bounce_phase})`\n if (tx.success === false) return 'failed'\n return undefined\n}\n\nfunction accountOf(tx: TonapiTx): string {\n return typeof tx.account === 'string' ? tx.account : tx.account?.address ?? '?'\n}\n\n/**\n * Reduce a tonapi `Trace` to a verdict. The root (the wallet's own transaction)\n * decides: compute exit ≠ 0, aborted or a failed action phase → not ok. A\n * failing FIRST-HOP child is also fatal: for every message this wallet builds\n * (TON to a contract, jetton transfer to its own jetton wallet) a bounced\n * first hop means the operation did not happen and the value comes back minus\n * fees. Deeper failures (e.g. a jetton notify the recipient's wallet rejects)\n * become warnings — the transfer itself already settled.\n */\nexport function parseTonapiTrace(trace: unknown): Omit<EmulationOutcome, 'source' | 'risk'> {\n if (!isObject(trace) || !isObject(trace.transaction)) throw new NetworkError('Malformed tonapi emulation: no root transaction')\n const root = trace.transaction as TonapiTx\n const compute = root.compute_phase\n const exitCode = compute && compute.skipped !== true && typeof compute.exit_code === 'number' ? compute.exit_code : compute?.success === true ? 0 : undefined\n const actionSuccess = typeof root.action_phase?.success === 'boolean' ? root.action_phase.success : undefined\n if (exitCode === undefined && actionSuccess === undefined && typeof root.success !== 'boolean' && typeof root.aborted !== 'boolean') {\n throw new NetworkError('Malformed tonapi emulation: root transaction has no phases')\n }\n const aborted = root.aborted === true\n const rootFailure = txFailure(root)\n const warnings: string[] = []\n let firstHopFailure: string | undefined\n const walk = (t: TonapiTrace, depth: number) => {\n for (const child of t.children ?? []) {\n const tx = child.transaction\n if (tx) {\n const f = txFailure(tx)\n if (f) {\n const line = `${accountOf(tx)}: ${f}`\n if (depth === 1) firstHopFailure ??= line\n else warnings.push(line)\n }\n }\n walk(child, depth + 1)\n }\n }\n walk(trace as TonapiTrace, 1)\n const reason = rootFailure ? (aborted ? 'transaction aborted' : rootFailure) : firstHopFailure ? `internal message failed — ${firstHopFailure}` : undefined\n return {\n ok: reason === undefined,\n ...(exitCode !== undefined ? { exitCode } : {}),\n aborted,\n ...(actionSuccess !== undefined ? { actionSuccess } : {}),\n ...(reason ? { reason } : {}),\n warnings,\n }\n}\n\n/** tonapi `Risk` → nanotons / jetton base units as bigints. Malformed → NetworkError. */\nexport function parseTonapiRisk(risk: unknown): TonRisk {\n if (!isObject(risk)) throw new NetworkError('Malformed tonapi emulation: no risk')\n const big = (v: unknown): bigint => {\n if (typeof v === 'bigint') return v\n if (typeof v === 'number' && Number.isFinite(v)) return BigInt(Math.trunc(v))\n if (typeof v === 'string' && /^-?\\d+$/.test(v)) return BigInt(v)\n throw new NetworkError('Malformed tonapi emulation: risk amount')\n }\n const jettons = Array.isArray(risk.jettons) ? risk.jettons : []\n return {\n ton: big(risk.ton ?? 0),\n transferAllRemainingBalance: risk.transfer_all_remaining_balance === true,\n jettons: jettons.map((j) => {\n if (!isObject(j)) throw new NetworkError('Malformed tonapi emulation: risk jetton')\n const jetton = isObject(j.jetton) ? j.jetton : {}\n const wallet = isObject(j.wallet_address) ? j.wallet_address : {}\n return {\n amount: big(j.quantity ?? 0),\n address: typeof jetton.address === 'string' ? jetton.address : '',\n walletAddress: typeof wallet.address === 'string' ? wallet.address : '',\n ...(typeof jetton.symbol === 'string' ? { symbol: jetton.symbol } : {}),\n ...(typeof jetton.decimals === 'number' ? { decimals: jetton.decimals } : {}),\n }\n }),\n }\n}\n\n/** tonapi `MessageConsequences` (wallet/emulate) → outcome with risk. */\nexport function parseTonapiConsequences(json: unknown): EmulationOutcome {\n if (!isObject(json)) throw new NetworkError('Malformed tonapi emulation response')\n if (typeof json.error === 'string') return { ok: false, reason: json.error, aborted: false, warnings: [], source: 'tonapi' }\n const verdict = parseTonapiTrace(json.trace)\n return { ...verdict, source: 'tonapi', risk: parseTonapiRisk(json.risk) }\n}\n\n/** Options for emulating a message through tonapi or toncenter v3. */\nexport interface EmulateOptions {\n fetch?: typeof fetch\n timeoutMs?: number\n /** tonapi bearer key / toncenter X-API-Key. */\n apiKey?: string\n}\n\nasync function post(doFetch: typeof fetch, url: string, body: unknown, opts: EmulateOptions): Promise<{ status: number; ok: boolean; json: unknown }> {\n let res: Response\n try {\n res = await doFetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json', ...(opts.apiKey ? { authorization: `Bearer ${opts.apiKey}` } : {}) },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(opts.timeoutMs ?? DEFAULT_TIMEOUT_MS),\n })\n } catch (e) {\n throw new NetworkError(`emulate: ${e instanceof Error ? e.message : String(e)}`, { provider: url, cause: e })\n }\n if (res.status === 404) return { status: 404, ok: false, json: undefined }\n let json: unknown\n try { json = await res.json() } catch (e) { throw new NetworkError(`emulate: HTTP ${res.status}, non-JSON body`, { provider: url, cause: e }) }\n return { status: res.status, ok: res.ok, json }\n}\n\nfunction httpFailure(status: number, json: unknown): EmulationOutcome {\n const err = isObject(json) ? json : {}\n const text = typeof err.error === 'string' ? err.error : JSON.stringify(err.detail ?? err.error ?? json)\n return { ok: false, reason: `HTTP ${status}: ${text}`, aborted: false, warnings: [], source: 'tonapi' }\n}\n\n/**\n * Emulate through tonapi: `/wallet/emulate` first (verdict + risk), then\n * `/traces/emulate` when the first is not served (404). The external carries a\n * zero signature; `ignore_signature_check=true` is sent on both calls.\n */\nexport async function emulateViaTonapi(baseUrl: string, message: Cell, opts: EmulateOptions = {}): Promise<EmulationOutcome> {\n const doFetch = opts.fetch ?? globalThis.fetch\n const base = baseUrl.replace(/\\/+$/, '')\n const boc = message.toBoc().toString('base64')\n const first = await post(doFetch, `${base}/wallet/emulate?ignore_signature_check=true`, { boc }, opts)\n if (first.status !== 404) {\n if (!first.ok) return httpFailure(first.status, first.json)\n return parseTonapiConsequences(first.json)\n }\n const second = await post(doFetch, `${base}/traces/emulate?ignore_signature_check=true`, { boc }, opts)\n if (second.status === 404) throw new NetworkError('emulate: tonapi serves neither /wallet/emulate nor /traces/emulate', { provider: base })\n if (!second.ok) return httpFailure(second.status, second.json)\n if (isObject(second.json) && typeof second.json.error === 'string') return { ok: false, reason: second.json.error, aborted: false, warnings: [], source: 'tonapi' }\n return { ...parseTonapiTrace(second.json), source: 'tonapi' }\n}\n\n/** Resolve the effective emulation config: explicit `emulate`, legacy `emulateUrl`, else tonapi by default. */\nexport function resolveEmulate(config: { emulate?: TonEmulateConfig; emulateUrl?: string; tonApiUrl?: string }): Exclude<TonEmulateConfig, false> | false {\n if (config.emulate === false) return false\n if (config.emulate) return config.emulate\n if (config.emulateUrl) return { kind: 'toncenter-v3', url: config.emulateUrl }\n return { kind: 'tonapi' }\n}\n\n/** Run the configured emulation for an external message. */\nexport async function runEmulation(config: { emulate?: TonEmulateConfig; emulateUrl?: string; tonApiUrl?: string; tonApiKey?: string; fetch?: typeof fetch; timeoutMs?: number }, message: Cell): Promise<EmulationOutcome | undefined> {\n const target = resolveEmulate(config)\n if (!target) return undefined\n const opts: EmulateOptions = {\n ...(config.fetch ? { fetch: config.fetch } : {}),\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n ...(config.tonApiKey ? { apiKey: config.tonApiKey } : {}),\n }\n if (target.kind === 'tonapi') return emulateViaTonapi(target.url ?? config.tonApiUrl ?? DEFAULT_TONAPI, message, opts)\n const v = await emulateToncenter(target.url, message, opts)\n return { ...v, aborted: v.aborted ?? false, source: 'toncenter-v3', warnings: [] }\n}\n","/**\n * Wallet V5R1 (the contract Tonkeeper \"W5\" and Tonhub deploy) without\n * @ton/ton: state init, address, the signed-external body and its parser.\n *\n * Contract code and wire layout follow @ton/ton's WalletContractV5R1\n * (Copyright (c) Whales Corp., MIT) and the reference contract\n * https://github.com/ton-blockchain/wallet-contract-v5 (commit 4fab977,\n * build/wallet_v5.compiled.json). Only the parts a sending wallet needs are\n * here: extensions and the internal/extension auth paths are not implemented.\n */\nimport { Buffer } from 'buffer'\nimport {\n Address, Cell, SendMode, beginCell, contractAddress, external, loadOutList, storeMessage, storeOutList,\n type MessageRelaxed, type OutActionSendMsg, type StateInit,\n} from '@ton/core'\n\n// https://github.com/ton-blockchain/wallet-contract-v5/blob/4fab977f4fae3a37c1aac216ed2b7e611a9bc2af/build/wallet_v5.compiled.json\n/** Code of the Wallet V5R1 contract (BoC hex). */\nexport const V5R1_CODE_HEX =\n 'b5ee9c7241021401000281000114ff00f4a413f4bcf2c80b01020120020d020148030402dcd020d749c120915b8f6320d70b1f2082106578746ebd21821073696e74bdb0925f03e082106578746eba8eb48020d72101d074d721fa4030fa44f828fa443058bd915be0ed44d0810141d721f4058307f40e6fa1319130e18040d721707fdb3ce03120d749810280b99130e070e2100f020120050c020120060902016e07080019adce76a2684020eb90eb85ffc00019af1df6a2684010eb90eb858fc00201480a0b0017b325fb51341c75c875c2c7e00011b262fb513435c280200019be5f0f6a2684080a0eb90fa02c0102f20e011e20d70b1f82107369676ebaf2e08a7f0f01e68ef0eda2edfb218308d722028308d723208020d721d31fd31fd31fed44d0d200d31f20d31fd3ffd70a000af90140ccf9109a28945f0adb31e1f2c087df02b35007b0f2d0845125baf2e0855036baf2e086f823bbf2d0882292f800de01a47fc8ca00cb1f01cf16c9ed542092f80fde70db3cd81003f6eda2edfb02f404216e926c218e4c0221d73930709421c700b38e2d01d72820761e436c20d749c008f2e09320d74ac002f2e09320d71d06c712c2005230b0f2d089d74cd7393001a4e86c128407bbf2e093d74ac000f2e093ed55e2d20001c000915be0ebd72c08142091709601d72c081c12e25210b1e30f20d74a111213009601fa4001fa44f828fa443058baf2e091ed44d0810141d718f405049d7fc8ca0040048307f453f2e08b8e14038307f45bf2e08c22d70a00216e01b3b0f2d090e2c85003cf1612f400c9ed54007230d72c08248e2d21f2e092d200ed44d0d2005113baf2d08f54503091319c01810140d721d70a00f2e08ee2c8ca0058cf16c9ed5493f2c08de20010935bdb31e1d74cd0b4d6c35e'\n\nlet codeCell: Cell | undefined\n/** The V5R1 contract code cell (parsed once). */\nexport function v5r1Code(): Cell {\n codeCell ??= Cell.fromBoc(Buffer.from(V5R1_CODE_HEX, 'hex'))[0]!\n return codeCell\n}\n\n/** Op codes of Wallet V5R1 messages. */\nexport const V5R1_OP = {\n signedExternal: 0x7369676e,\n signedInternal: 0x73696e74,\n extension: 0x6578746e,\n} as const\n\n/** Global id of TON mainnet, part of the V5R1 wallet id. */\nexport const MAINNET_GLOBAL_ID = -239\n/** Global id of TON testnet. */\nexport const TESTNET_GLOBAL_ID = -3\n/** PAY_GAS_SEPARATELY | IGNORE_ERRORS — the mode every external-message action carries. */\nexport const DEFAULT_SEND_MODE = SendMode.PAY_GAS_SEPARATELY | SendMode.IGNORE_ERRORS\n/** Most outgoing messages one V5R1 transaction can carry. */\nexport const MAX_ACTIONS = 255\n\nexport interface V5R1WalletIdParts { networkGlobalId?: number; workchain?: number; subwalletNumber?: number }\n\n/**\n * Serialized wallet_id (int32): `networkGlobalId XOR context`, where the client\n * context is {1 bit \"client\", int8 workchain, uint8 version (0 = v5r1), uint15 subwallet}.\n */\nexport function v5r1WalletId(parts: V5R1WalletIdParts = {}): bigint {\n const context = beginCell()\n .storeUint(1, 1)\n .storeInt(parts.workchain ?? 0, 8)\n .storeUint(0, 8)\n .storeUint(parts.subwalletNumber ?? 0, 15)\n .endCell().beginParse().loadInt(32)\n return BigInt(parts.networkGlobalId ?? MAINNET_GLOBAL_ID) ^ BigInt(context)\n}\n\n/** State init (code and data) of a V5R1 wallet for a public key. */\nexport function v5r1StateInit(publicKey: Uint8Array, walletId: bigint = v5r1WalletId()): StateInit {\n if (publicKey.length !== 32) throw new Error('V5R1: public key must be 32 bytes')\n const data = beginCell()\n .storeUint(1, 1) // signature auth allowed\n .storeUint(0, 32) // seqno\n .storeInt(walletId, 32)\n .storeBuffer(Buffer.from(publicKey), 32)\n .storeBit(0) // no extensions\n .endCell()\n return { code: v5r1Code(), data }\n}\n\n/** Address of the V5R1 wallet for a public key. */\nexport function v5r1Address(publicKey: Uint8Array, opts: { workchain?: number; walletId?: bigint } = {}): Address {\n return contractAddress(opts.workchain ?? 0, v5r1StateInit(publicKey, opts.walletId))\n}\n\nexport interface V5R1Message { message: MessageRelaxed; mode?: number }\n\nexport interface V5R1SigningParams {\n walletId: bigint\n /** Unix seconds. */\n validUntil: number\n seqno: number\n messages: V5R1Message[]\n}\n\n/** The cell that gets hashed and signed: op | wallet_id | valid_until | seqno | out-list ref | no extended actions. */\nexport function v5r1SigningMessage(p: V5R1SigningParams): Cell {\n if (p.messages.length > MAX_ACTIONS) throw new Error(`V5R1: at most ${MAX_ACTIONS} messages per external (got ${p.messages.length})`)\n const actions: OutActionSendMsg[] = p.messages.map((m) => ({\n type: 'sendMsg',\n // Externals must carry IGNORE_ERRORS or the wallet contract rejects them.\n mode: (m.mode ?? DEFAULT_SEND_MODE) | SendMode.IGNORE_ERRORS,\n outMsg: m.message,\n }))\n const outList = actions.length ? beginCell().store(storeOutList(actions)).endCell() : null\n return beginCell()\n .storeUint(V5R1_OP.signedExternal, 32)\n .storeInt(p.walletId, 32)\n .storeUint(p.validUntil, 32)\n .storeUint(p.seqno, 32)\n .storeMaybeRef(outList)\n .storeUint(0, 1)\n .endCell()\n}\n\n/** Signature goes at the tail (V5R1 layout). */\nexport function v5r1PackSigned(signing: Cell, signature: Uint8Array): Cell {\n if (signature.length !== 64) throw new Error('V5R1: signature must be 64 bytes')\n return beginCell().storeSlice(signing.beginParse()).storeBuffer(Buffer.from(signature), 64).endCell()\n}\n\n/** Same body with a zero signature — what `estimateFee(ignore_chksig)` and emulation take. */\nexport function v5r1PackUnsigned(signing: Cell): Cell {\n return v5r1PackSigned(signing, new Uint8Array(64))\n}\n\n/** The external-in message (as a cell, ready for sendBoc) carrying `body` to the wallet, with `init` when it is not deployed yet. */\nexport function v5r1ExternalMessage(to: Address, body: Cell, init?: StateInit): Cell {\n return beginCell().store(storeMessage(external({ to, body, ...(init ? { init } : {}) }))).endCell()\n}\n\nexport interface ParsedV5R1Body {\n op: number\n walletId: bigint\n validUntil: number\n seqno: number\n messages: Array<{ message: MessageRelaxed; mode: number }>\n /** True when the 64-byte tail signature is present (externals and internals carry one). */\n signed: boolean\n}\n\n/** Parse a signed (or zero-signed) V5R1 external body back into its messages. Returns null for anything else. */\nexport function parseV5R1Body(body: Cell): ParsedV5R1Body | null {\n try {\n const s = body.beginParse()\n const op = s.loadUint(32)\n if (op !== V5R1_OP.signedExternal && op !== V5R1_OP.signedInternal) return null\n const walletId = BigInt(s.loadInt(32))\n const validUntil = s.loadUint(32)\n const seqno = s.loadUint(32)\n const outList = s.loadMaybeRef()\n const hasExtended = s.loadBit()\n if (hasExtended) return null // extension management: not a plain send\n const messages: ParsedV5R1Body['messages'] = []\n if (outList) {\n for (const a of loadOutList(outList.beginParse())) {\n if (a.type !== 'sendMsg') return null\n messages.push({ message: a.outMsg, mode: a.mode })\n }\n }\n const signed = s.remainingBits >= 512\n return { op, walletId, validUntil, seqno, messages, signed }\n } catch {\n return null\n }\n}\n","/**\n * \"What am I signing\" for TON — offline. Decodes the messages of a\n * {@link TonSendable} (or a prebuilt V5R1 body) into human-checkable items and\n * flags the classic mistakes before any key is touched.\n */\nimport { Buffer } from 'buffer'\nimport { Address, Cell, beginCell, type MessageRelaxed, type Slice } from '@ton/core'\nimport { UnsafeTransactionError } from './errors.js'\nimport { DEFAULT_SEND_MODE, parseV5R1Body } from './wallet-v5r1.js'\nimport type { TonSendable, TonTransaction } from './types.js'\n\n/** TEP-74 `transfer` op code of a jetton wallet. */\nexport const JETTON_TRANSFER_OP = 0x0f8a7ea5\nconst LARGE_FORWARD_NANOTON = 500_000_000n // 0.5 TON\n\n/** What one outgoing message does. */\nexport type TonDescribedKind = 'ton-transfer' | 'jetton-transfer' | 'contract-call'\n\n/** Fields of a TEP-74 jetton `transfer` body. */\nexport interface TonJettonDetails {\n queryId: bigint\n amount: bigint\n destination: string\n responseDestination: string | null\n forwardTonAmount: bigint\n forwardPayload: 'none' | 'comment' | 'cell'\n forwardComment?: string\n hasCustomPayload: boolean\n}\n\n/** One outgoing message of a wallet transaction, decoded. */\nexport interface TonDescribedMessage {\n kind: TonDescribedKind\n /** Destination as given (friendly) or raw `wc:hex`. */\n to: string\n value: bigint\n bounceable: boolean\n /** Test-only flag of a friendly address; undefined for raw addresses. */\n testOnly?: boolean\n /** Text comment (op 0). */\n comment?: string\n /** Body op code for contract calls (hex). */\n op?: string\n jetton?: TonJettonDetails\n hasStateInit: boolean\n bodyBits: number\n /**\n * Send mode the wallet sends the message with (IGNORE_ERRORS is always added for an external).\n * 128 carries the whole remaining balance, 32 destroys the account when it is left empty.\n */\n mode?: number\n}\n\n/** Problems a TON description is flagged with. */\nexport type TonWarningCode =\n | 'zero-value'\n | 'non-bounceable-contract-call'\n | 'unknown-body'\n | 'large-forward-amount'\n | 'testnet-address'\n | 'mainnet-address'\n | 'exotic-workchain'\n | 'extended-actions'\n | 'carries-all-balance'\n | 'destroys-account'\n\n/** One flagged problem; `index` is the message it is about. */\nexport interface TonWarning { code: TonWarningCode; message: string; index?: number }\n\n/**\n * A TON wallet transaction decoded for a confirmation screen: each outgoing message and the\n * warnings.\n */\nexport interface TonDescription {\n kind: TonDescribedKind | 'mixed'\n items: TonDescribedMessage[]\n warnings: TonWarning[]\n /** Present when the input was a prebuilt V5R1 body. */\n external?: { seqno: number; validUntil: number; walletId: bigint; signed: boolean }\n}\n\n/** A message body decoded: empty, a text comment, a jetton transfer, or unknown. */\nexport type DecodedBody =\n | { type: 'empty' }\n | { type: 'comment'; text: string }\n | { type: 'jetton-transfer'; jetton: TonJettonDetails }\n | { type: 'op'; op: number }\n | { type: 'unknown' }\n\n/** Decode a message body cell. */\nexport function decodeBody(body: Cell): DecodedBody {\n const s = body.beginParse()\n if (s.remainingBits === 0 && s.remainingRefs === 0) return { type: 'empty' }\n if (s.remainingBits < 32) return { type: 'unknown' }\n const op = s.loadUint(32)\n try {\n if (op === 0) return { type: 'comment', text: s.loadStringTail() }\n if (op === JETTON_TRANSFER_OP) return { type: 'jetton-transfer', jetton: loadJettonTransfer(s) }\n } catch {\n return { type: 'unknown' }\n }\n return { type: 'op', op }\n}\n\nfunction loadJettonTransfer(s: Slice): TonJettonDetails {\n const queryId = s.loadUintBig(64)\n const amount = s.loadCoins()\n const destination = s.loadAddress()\n const responseDestination = s.loadMaybeAddress()\n const customPayload = s.loadMaybeRef()\n const forwardTonAmount = s.loadCoins()\n const inRef = s.loadBit()\n const payload: Slice = inRef ? s.loadRef().beginParse() : s\n let forwardPayload: TonJettonDetails['forwardPayload'] = 'none'\n let forwardComment: string | undefined\n if (payload.remainingBits > 0 || payload.remainingRefs > 0) {\n forwardPayload = 'cell'\n if (payload.remainingBits >= 32) {\n const p = payload.clone()\n if (p.loadUint(32) === 0) {\n try { forwardComment = p.loadStringTail(); forwardPayload = 'comment' } catch { /* not utf-8 */ }\n }\n }\n }\n return {\n queryId, amount, destination: destination.toString(), responseDestination: responseDestination ? responseDestination.toString() : null,\n forwardTonAmount, forwardPayload, ...(forwardComment !== undefined ? { forwardComment } : {}), hasCustomPayload: customPayload !== null,\n }\n}\n\nfunction parseTo(to: string): { to: string; bounceable: boolean; testOnly?: boolean; workchain: number } {\n if (Address.isFriendly(to)) {\n const f = Address.parseFriendly(to)\n return { to, bounceable: f.isBounceable, testOnly: f.isTestOnly, workchain: f.address.workChain }\n }\n const a = Address.parse(to)\n return { to: a.toRawString(), bounceable: true, workchain: a.workChain }\n}\n\n/**\n * A base64 BoC as its single root Cell, refused when its layout is one other readers may parse\n * differently from @ton/core: a magic other than the generic one, more than one root, absent cells,\n * or any cell that stores its hashes (with_hashes: @ton/core skips a hash area another reader takes\n * for data), has a level mask, or is exotic. What remains is read the same by every reader, the\n * kit's policy reader included, whatever order the serializer put the cells in (scan 2026-10-27\n * F2, F4). Real provider BoCs order cells differently from @ton/core, so the bytes are not required\n * to round-trip.\n */\nexport function canonicalBocCell(b64: string, what = 'bodyBoc'): Cell {\n if (!/^[A-Za-z0-9+/_-]+={0,2}$/.test(b64)) throw new UnsafeTransactionError('non-canonical-boc', `${what} is not a base64 string.`)\n const bytes = Buffer.from(b64, 'base64')\n const layout = plainBocLayout(bytes)\n if (layout !== null) throw new UnsafeTransactionError('non-canonical-boc', `${what} is not a plain single-root BoC (${layout}), so what was reviewed may not be what is signed.`)\n let roots: Cell[]\n try { roots = Cell.fromBoc(bytes) } catch { throw new UnsafeTransactionError('non-canonical-boc', `${what} is not a valid BoC.`) }\n if (roots.length !== 1) throw new UnsafeTransactionError('non-canonical-boc', `${what} has ${roots.length} roots.`)\n return roots[0]!\n}\n\n/** Why a BoC's layout is outside the plain subset every reader parses alike, or null when it is inside. */\nfunction plainBocLayout(b: Uint8Array): string | null {\n if (b.length < 6 || b[0] !== 0xb5 || b[1] !== 0xee || b[2] !== 0x9c || b[3] !== 0x72) return 'not the generic BoC magic'\n const flags = b[4]!\n const size = flags & 0x07\n const offBytes = b[5]!\n if (size < 1 || size > 4 || offBytes < 1 || offBytes > 8) return 'bad size fields'\n let i = 6\n const int = (n: number): number => {\n if (i + n > b.length) throw new RangeError('truncated')\n let v = 0\n for (let k = 0; k < n; k++) v = v * 256 + b[i++]!\n return v\n }\n try {\n const cells = int(size)\n const roots = int(size)\n const absent = int(size)\n int(offBytes) // total cells size\n if (roots !== 1) return `${roots} roots`\n if (absent !== 0) return 'absent cells'\n i += roots * size\n if (flags & 0x80) i += cells * offBytes // index\n for (let c = 0; c < cells; c++) {\n if (i + 2 > b.length) return 'truncated'\n const d1 = b[i++]!\n const d2 = b[i++]!\n if (d1 & 0x10) return 'a cell stores its hashes'\n if (d1 >> 5 !== 0) return 'a cell has a level mask'\n if (d1 & 0x08) return 'an exotic cell'\n if ((d1 & 0x07) > 4) return 'a cell with more than 4 refs'\n i += Math.ceil(d2 / 2) + (d1 & 0x07) * size\n }\n if (i + (flags & 0x40 ? 4 : 0) !== b.length) return 'trailing or missing bytes'\n } catch {\n return 'truncated'\n }\n return null\n}\n\n/**\n * The body a message is built with: a Cell, a text comment, or a canonical `bodyBoc`. A `body` that is\n * neither a string nor a Cell is refused rather than replaced by `bodyBoc` (scan 2026-10-27 F4).\n */\nexport function messageBody(tx: TonTransaction): Cell | undefined {\n if (tx.body instanceof Cell) return tx.body\n if (typeof tx.body === 'string') return tx.body === '' ? undefined : commentCell(tx.body)\n if (tx.body !== undefined) throw new UnsafeTransactionError('body', 'A message body must be a Cell or a string (a text comment).')\n if (tx.bodyBoc !== undefined && typeof tx.bodyBoc !== 'string') throw new UnsafeTransactionError('body', 'bodyBoc must be a base64 string.')\n return tx.bodyBoc ? canonicalBocCell(tx.bodyBoc) : undefined\n}\n\nfunction bodyOf(tx: TonTransaction): Cell | undefined {\n return messageBody(tx)\n}\n\n/** A text comment body (op 0 plus the text), as wallets show it. */\nexport function commentCell(text: string): Cell {\n return beginCell().storeUint(0, 32).storeStringTail(text).endCell()\n}\n\nfunction describeOne(\n i: number, to: ReturnType<typeof parseTo>, value: bigint, body: Cell | undefined, hasStateInit: boolean,\n bounceableOverride: boolean | undefined, warnings: TonWarning[], ctx: { network?: 'mainnet' | 'testnet' },\n): TonDescribedMessage {\n const bounceable = bounceableOverride ?? to.bounceable\n const decoded = body ? decodeBody(body) : ({ type: 'empty' } as DecodedBody)\n const base = { to: to.to, value, bounceable, ...(to.testOnly !== undefined ? { testOnly: to.testOnly } : {}), hasStateInit, bodyBits: body ? body.bits.length : 0 }\n if (value <= 0n) warnings.push({ code: 'zero-value', message: 'message carries no TON; it cannot pay for gas at the destination', index: i })\n if (to.workchain !== 0 && to.workchain !== -1) warnings.push({ code: 'exotic-workchain', message: `workchain ${to.workchain}`, index: i })\n if (ctx.network && to.testOnly !== undefined) {\n if (to.testOnly && ctx.network !== 'testnet') warnings.push({ code: 'testnet-address', message: 'test-only address on a mainnet wallet', index: i })\n if (!to.testOnly && ctx.network === 'testnet') warnings.push({ code: 'mainnet-address', message: 'mainnet address on a testnet wallet', index: i })\n }\n let item: TonDescribedMessage\n switch (decoded.type) {\n case 'empty': item = { kind: 'ton-transfer', ...base }; break\n case 'comment': item = { kind: 'ton-transfer', ...base, comment: decoded.text }; break\n case 'jetton-transfer':\n item = { kind: 'jetton-transfer', ...base, jetton: decoded.jetton, op: hex(JETTON_TRANSFER_OP) }\n if (decoded.jetton.forwardTonAmount > LARGE_FORWARD_NANOTON) warnings.push({ code: 'large-forward-amount', message: `forward_ton_amount ${decoded.jetton.forwardTonAmount} > 0.5 TON`, index: i })\n break\n case 'op': item = { kind: 'contract-call', ...base, op: hex(decoded.op) }; break\n default:\n item = { kind: 'contract-call', ...base }\n warnings.push({ code: 'unknown-body', message: 'message body could not be decoded', index: i })\n }\n if (item.kind !== 'ton-transfer' && !bounceable) {\n warnings.push({ code: 'non-bounceable-contract-call', message: 'contract call to a non-bounceable address: TON is lost if the call fails', index: i })\n }\n return item\n}\n\nconst hex = (n: number) => `0x${n.toString(16).padStart(8, '0')}`\n\n/** SendMode.IGNORE_ERRORS: the V5R1 wallet always adds it to an external's messages. */\nconst IGNORE_ERRORS = 2\n/** The mode a message given as {@link TonTransaction} is sent with: its `sendMode` or the default, plus IGNORE_ERRORS. */\nexport function sendModeOf(sendMode: number | undefined): number {\n return (sendMode ?? DEFAULT_SEND_MODE) | IGNORE_ERRORS\n}\n/** The drain modes in `mode`: 128 carries the whole remaining balance, 32 destroys the account once it is empty. */\nexport function drainModes(mode: number): Array<'carries-all-balance' | 'destroys-account'> {\n return [...((mode & 128) !== 0 ? ['carries-all-balance' as const] : []), ...((mode & 32) !== 0 ? ['destroys-account' as const] : [])]\n}\n\nfunction withMode(i: number, item: TonDescribedMessage, mode: number, warnings: TonWarning[]): TonDescribedMessage {\n for (const code of drainModes(mode)) {\n warnings.push({ code, message: code === 'carries-all-balance' ? 'send mode 128: the message carries the whole remaining balance' : 'send mode 32: the wallet account is destroyed once it is empty', index: i })\n }\n return { ...item, mode }\n}\n\n/** Describe one outgoing message and push its warnings into `warnings`. */\nexport function describeMessageRelaxed(i: number, m: MessageRelaxed, warnings: TonWarning[], ctx: { network?: 'mainnet' | 'testnet' } = {}): TonDescribedMessage {\n if (m.info.type !== 'internal') {\n warnings.push({ code: 'unknown-body', message: 'not an internal message', index: i })\n return { kind: 'contract-call', to: '', value: 0n, bounceable: false, hasStateInit: false, bodyBits: 0 }\n }\n const dest = m.info.dest\n const to = { to: dest.toString({ bounceable: m.info.bounce }), bounceable: m.info.bounce, workchain: dest.workChain }\n const body = m.body.bits.length === 0 && m.body.refs.length === 0 ? undefined : m.body\n return describeOne(i, to, m.info.value.coins, body, !!m.init, m.info.bounce, warnings, ctx)\n}\n\n/** Describe what a {@link TonSendable} will do. Offline; never throws on malformed bodies (they become warnings). */\nexport function describeTransaction(tx: TonSendable, ctx: { network?: 'mainnet' | 'testnet' } = {}): TonDescription {\n const warnings: TonWarning[] = []\n const items: TonDescribedMessage[] = []\n let external: TonDescription['external'] | undefined\n if (tx instanceof Cell) {\n const parsed = parseV5R1Body(tx)\n if (!parsed) {\n warnings.push({ code: 'unknown-body', message: 'not a V5R1 signed-external body' })\n return { kind: 'contract-call', items, warnings }\n }\n external = { seqno: parsed.seqno, validUntil: parsed.validUntil, walletId: parsed.walletId, signed: parsed.signed }\n parsed.messages.forEach((m, i) => items.push(withMode(i, describeMessageRelaxed(i, m.message, warnings, ctx), m.mode, warnings)))\n } else {\n const list = Array.isArray(tx) ? tx : [tx]\n list.forEach((t, i) => {\n let to: ReturnType<typeof parseTo>\n try { to = parseTo(t.to) } catch {\n warnings.push({ code: 'unknown-body', message: `invalid address: ${t.to}`, index: i })\n items.push({ kind: 'contract-call', to: t.to, value: 0n, bounceable: false, hasStateInit: false, bodyBits: 0 })\n return\n }\n let body: Cell | undefined\n try { body = bodyOf(t) } catch { warnings.push({ code: 'unknown-body', message: 'bodyBoc is not a valid BoC', index: i }) }\n items.push(withMode(i, describeOne(i, to, BigInt(t.value), body, t.stateInit !== undefined, t.bounceable, warnings, ctx), sendModeOf(t.sendMode), warnings))\n })\n }\n const kinds = new Set(items.map((x) => x.kind))\n const kind: TonDescription['kind'] = kinds.size === 1 ? items[0]!.kind : kinds.size === 0 ? 'contract-call' : 'mixed'\n return { kind, items, warnings, ...(external ? { external } : {}) }\n}\n","import { NetworkError, type IWalletAccountReadOnly } from '@anywalletkit/core'\nimport { ed25519 } from '@noble/curves/ed25519.js'\nimport { Address, Cell, beginCell, internal, loadStateInit, type StateInit } from '@ton/core'\nimport { commentCell, describeTransaction, messageBody, type TonDescription } from './describe.js'\nimport { UnsafeTransactionError } from './errors.js'\nimport { TonCenter, createTonRpc } from './toncenter.js'\nimport { runEmulation } from './emulation.js'\nimport {\n DEFAULT_SEND_MODE, MAINNET_GLOBAL_ID, TESTNET_GLOBAL_ID, v5r1Address, v5r1ExternalMessage, v5r1PackUnsigned, v5r1SigningMessage, v5r1StateInit, v5r1WalletId,\n type V5R1Message,\n} from './wallet-v5r1.js'\nimport { CAIP2, type TonConfig, type TonFees, type TonReceipt, type TonSendable, type TonSimulation, type TonTransaction, type TonTransferOptions } from './types.js'\n\nconst JETTON_TRANSFER_OP = 0x0f8a7ea5\nconst DEFAULT_JETTON_ATTACHED = 50_000_000n // 0.05 TON\nconst DEFAULT_MAX_JETTON_ATTACHED = 1_000_000_000n // 1 TON\n/** The one raw spelling the wallet pays: workchain digits, a colon, 64 hex digits. */\nconst RAW_ADDRESS = /^-?\\d+:[0-9a-fA-F]{64}$/\nconst DEFAULT_INDEXER = 'https://toncenter.com/api/v3'\nconst DEFAULT_VALID_SECONDS = 60\nconst MAX_VALID_SECONDS = 600\n/** PAY_GAS_SEPARATELY | IGNORE_ERRORS, the mode every action in an external carries. */\nexport const SEND_MODE = DEFAULT_SEND_MODE\n\nconst utf8 = (s: string | Uint8Array) => (typeof s === 'string' ? new TextEncoder().encode(s) : s)\nconst hexToBytes = (h: string) => Uint8Array.from(h.match(/.{2}/g) ?? [], (b) => parseInt(b, 16))\nconst big = (v: bigint | number | string) => BigInt(v)\n\n/**\n * A TON V5R1 wallet without a key: balance, jetton balances, seqno, fee estimates, emulation,\n * receipts and signature checks.\n */\nexport class WalletAccountReadOnlyTon implements IWalletAccountReadOnly {\n readonly chain: string\n /** Ed25519 public key the wallet is derived from. */\n readonly publicKey: Uint8Array\n /** User-friendly address. */\n readonly address: string\n protected readonly _config: TonConfig\n protected readonly _walletId: bigint\n protected readonly _init: StateInit\n protected readonly _address: Address\n protected readonly _rpc: TonCenter | undefined\n\n constructor(publicKey: Uint8Array | string, config: TonConfig = {}) {\n this.publicKey = typeof publicKey === 'string' ? hexToBytes(publicKey) : publicKey\n this._config = config\n // The network_global_id inside wallet_id is the only thing that binds a signed external to one\n // network: a testnet wallet must carry -3, or every external it signs is also valid on mainnet\n // (same state init, address and wallet_id). It follows config.network; a contradicting override is refused.\n const networkGlobalId = config.network === 'testnet' ? TESTNET_GLOBAL_ID : MAINNET_GLOBAL_ID\n if (config.walletId?.networkGlobalId !== undefined && config.walletId.networkGlobalId !== networkGlobalId) {\n throw new UnsafeTransactionError('network-mismatch', `walletId.networkGlobalId ${config.walletId.networkGlobalId} contradicts network '${config.network ?? 'mainnet'}' (expected ${networkGlobalId}): externals signed this way would be valid on the other network.`)\n }\n this._walletId = v5r1WalletId({ networkGlobalId, ...(config.walletId?.subwalletNumber !== undefined ? { subwalletNumber: config.walletId.subwalletNumber } : {}) })\n this._init = v5r1StateInit(this.publicKey, this._walletId)\n this._address = v5r1Address(this.publicKey, { walletId: this._walletId })\n this.address = this._address.toString({ bounceable: false, testOnly: config.network === 'testnet' })\n this.chain = CAIP2[config.network ?? 'mainnet']\n const rpc = createTonRpc(config)\n this._rpc = rpc ? new TonCenter(rpc) : undefined\n }\n\n protected requireRpc(what: string): TonCenter {\n if (!this._rpc) throw new NetworkError(`The wallet must be connected to a provider (toncenter) to ${what}.`)\n return this._rpc\n }\n\n /** The user-friendly address. */\n async getAddress(): Promise<string> { return this.address }\n\n /** Native balance in nanotons. */\n async getBalance(): Promise<bigint> {\n return (await this.requireRpc('get balances').getAddressInformation(this._address)).balance\n }\n\n /** Current seqno — 0 until the wallet contract is deployed. Always fetched fresh. */\n async getSeqno(): Promise<number> {\n const rpc = this.requireRpc('read the seqno')\n const state = await rpc.getAddressInformation(this._address)\n if (state.state !== 'active') return 0\n return (await rpc.runGetMethodOk(this._address, 'seqno')).stack.readNumber()\n }\n\n /** Resolve this wallet's jetton wallet for a jetton master. */\n async getJettonWalletAddress(token: string): Promise<Address> {\n const rpc = this.requireRpc('resolve jetton wallets')\n const r = await rpc.runGetMethodOk(Address.parse(token), 'get_wallet_address', [\n { type: 'slice', cell: beginCell().storeAddress(this._address).endCell() },\n ])\n return r.stack.readAddress()\n }\n\n /**\n * Read a jetton wallet and prove it is ours for `token`: `get_wallet_data`\n * must name this wallet as owner and `token` as master. The master's own\n * `get_wallet_address` answer is not trusted on its own — a fake master could\n * point at our real wallet of another jetton (e.g. USDT).\n */\n protected async jettonWalletData(token: string, jw: Address): Promise<bigint> {\n const stack = (await this.requireRpc('read jetton wallets').runGetMethodOk(jw, 'get_wallet_data')).stack\n const balance = stack.readBigNumber()\n const owner = stack.readAddress()\n const master = stack.readAddress()\n if (!owner.equals(this._address) || !master.equals(Address.parse(token))) {\n throw new UnsafeTransactionError('jetton-wallet', `The jetton wallet ${jw.toString()} does not belong to this wallet for ${token}.`)\n }\n return balance\n }\n\n /**\n * Jetton balance in base units, read from this wallet's jetton wallet; 0 when it does not exist.\n */\n async getTokenBalance(token: string): Promise<bigint> {\n const rpc = this.requireRpc('get token balances')\n const jw = await this.getJettonWalletAddress(token)\n if ((await rpc.getAddressInformation(jw)).state !== 'active') return 0n // never received this jetton\n return this.jettonWalletData(token, jw)\n }\n\n // ── Message building ──────────────────────────────────────────────────────\n\n protected stateInitOf(src: TonTransaction['stateInit']): StateInit | undefined {\n if (src === undefined) return undefined\n if (typeof src === 'string') return loadStateInit(Cell.fromBase64(src).beginParse())\n if (src instanceof Cell) return loadStateInit(src.beginParse())\n return src\n }\n\n /**\n * A destination address with the checks every payment gets: workchain 0 or -1, and a friendly\n * address's test-only flag matching the wallet's network. Used for a native message's `to` and a\n * jetton transfer's recipient and response destination (round 3, L8).\n */\n protected checkedAddress(to: string): { address: Address; bounceable: boolean } {\n let address: Address\n let bounceable = true\n let testOnly: boolean | undefined\n if (typeof to === 'string' && Address.isFriendly(to)) {\n const f = Address.parseFriendly(to) // checks the CRC\n address = f.address; bounceable = f.isBounceable; testOnly = f.isTestOnly\n } else if (typeof to === 'string' && RAW_ADDRESS.test(to)) {\n address = Address.parse(to)\n } else {\n // @ton/core also parses '+0:…', ' 0:…', '0.0:…' and '0:…:x' as 0:…, spellings a blocklist does not match (scan 2026-10-27 F18).\n throw new UnsafeTransactionError('address', `${JSON.stringify(to)} is not a TON address in a strict form (raw wc:hex, or a friendly address with its checksum).`)\n }\n if (address.workChain !== 0 && address.workChain !== -1) throw new UnsafeTransactionError('exotic-workchain', `Refusing to send to workchain ${address.workChain}.`)\n const testnet = this._config.network === 'testnet'\n if (testOnly !== undefined && testOnly !== testnet) {\n throw new UnsafeTransactionError('network-mismatch', testOnly ? 'Test-only address on a mainnet wallet.' : 'Mainnet address on a testnet wallet.')\n }\n return { address, bounceable }\n }\n\n protected transactionMessage(tx: TonTransaction): V5R1Message {\n const value = big(tx.value)\n if (value <= 0n) throw new UnsafeTransactionError('zero-value', 'TON message value must be positive.')\n const { address, bounceable } = this.checkedAddress(tx.to)\n const body = messageBody(tx)\n const init = this.stateInitOf(tx.stateInit)\n const message = internal({ to: address, value, bounce: tx.bounceable ?? bounceable, ...(body ? { body } : {}), ...(init ? { init } : {}) })\n return { message, ...(tx.sendMode !== undefined ? { mode: tx.sendMode } : {}) }\n }\n\n protected async jettonTransferMessage(o: TonTransferOptions): Promise<V5R1Message> {\n const amount = big(o.amount)\n if (amount <= 0n) throw new UnsafeTransactionError('zero-value', 'Jetton amount must be positive.')\n const recipient = this.checkedAddress(o.recipient).address\n const response = o.responseDestination ? this.checkedAddress(o.responseDestination).address : undefined\n // The excess of attachedValue goes to the response destination: another address than this wallet\n // is paid TON that a recipient check never sees (scan 2026-10-27 F3).\n if (response && !response.equals(this._address) && o.allowForeignResponseDestination !== true) {\n throw new UnsafeTransactionError('foreign-response-destination', `The excess TON of this jetton transfer would go to ${response.toString()}, not to this wallet; pass allowForeignResponseDestination to allow it.`)\n }\n const forwardTon = o.forwardTonAmount !== undefined ? big(o.forwardTonAmount) : 1n\n const attached = o.attachedValue !== undefined\n ? big(o.attachedValue)\n : (this._config.jettonAttachedValue !== undefined ? big(this._config.jettonAttachedValue) : DEFAULT_JETTON_ATTACHED) + forwardTon\n // The jetton master the caller names picks the contract that receives this (scan 2026-10-27 F5, F9).\n const maxAttached = this._config.maxJettonAttachedValue !== undefined ? big(this._config.maxJettonAttachedValue) : DEFAULT_MAX_JETTON_ATTACHED\n if (attached > maxAttached || forwardTon > attached) {\n throw new UnsafeTransactionError('attached-value', `A jetton transfer may attach at most ${maxAttached} nanotons, forwardTonAmount included (asked: ${attached}, forward ${forwardTon}); raise config.maxJettonAttachedValue if this is intended.`)\n }\n const jw = await this.getJettonWalletAddress(o.token!)\n await this.jettonWalletData(o.token!, jw)\n const forwardTonAmount = forwardTon\n if (o.memo !== undefined && o.forwardPayload !== undefined) throw new UnsafeTransactionError('memo-and-payload', 'Pass either memo or forwardPayload, not both: a jetton transfer carries one forward payload.')\n const payload = o.forwardPayload ?? o.memo\n const forwardPayload = payload === undefined ? null : typeof payload === 'string' ? commentCell(payload) : payload\n const body = beginCell()\n .storeUint(JETTON_TRANSFER_OP, 32)\n .storeUint(o.queryId !== undefined ? BigInt(o.queryId) : randomQueryId(), 64)\n .storeCoins(amount)\n .storeAddress(recipient)\n .storeAddress(response ?? this._address)\n .storeMaybeRef(o.customPayload ?? null)\n .storeCoins(forwardTonAmount)\n .storeMaybeRef(forwardPayload) // either-ref form: payloads always travel in a ref\n .endCell()\n return { message: internal({ to: jw, value: attached, bounce: true, body }) }\n }\n\n protected toMessages(tx: TonTransaction | TonTransaction[]): V5R1Message[] {\n const list = Array.isArray(tx) ? tx : [tx]\n if (list.length === 0) throw new UnsafeTransactionError('empty', 'Nothing to send.')\n return list.map((t) => this.transactionMessage(t))\n }\n\n protected validUntil(): number {\n const seconds = this._config.validUntilSeconds ?? DEFAULT_VALID_SECONDS\n if (!Number.isInteger(seconds) || seconds <= 0 || seconds > MAX_VALID_SECONDS) {\n throw new UnsafeTransactionError('valid-until', `validUntilSeconds must be an integer between 1 and ${MAX_VALID_SECONDS}.`)\n }\n return Math.floor(Date.now() / 1000) + seconds\n }\n\n /** The cell to sign for `messages` at the CURRENT seqno (fetched fresh every time). */\n protected async signingCell(messages: V5R1Message[]): Promise<{ signing: Cell; seqno: number; validUntil: number }> {\n const seqno = await this.getSeqno()\n const validUntil = this.validUntil()\n return { signing: v5r1SigningMessage({ walletId: this._walletId, validUntil, seqno, messages }), seqno, validUntil }\n }\n\n // ── Fees / preflight ──────────────────────────────────────────────────────\n\n /** StateInit to attach to an external when the wallet is not deployed yet. */\n protected async initIfNeeded(): Promise<StateInit | undefined> {\n const state = await this.requireRpc('read the account state').getAddressInformation(this._address)\n return state.state === 'active' ? undefined : this._init\n }\n\n /** in_fwd + storage + gas + fwd from toncenter's estimateFee (signature ignored). */\n async estimateFees(body: Cell): Promise<TonFees> {\n const rpc = this.requireRpc('quote transfers')\n const init = await this.initIfNeeded()\n return rpc.estimateFee(this._address, { body, ...(init ? { init } : {}), ignoreSignature: true })\n }\n\n /**\n * Preflight an external body: fees via estimateFee and, unless\n * `config.emulate === false`, a trace emulation (tonapi by default, see\n * {@link TonConfig.emulate}) whose compute/action phases — and the first-hop\n * internal messages — decide `ok`. Never throws for a failing emulation,\n * only for transport problems or a malformed emulator response.\n */\n async simulateBody(body: Cell): Promise<TonSimulation> {\n const fees = await this.estimateFees(body)\n const init = await this.initIfNeeded()\n const outcome = await runEmulation(this._config, v5r1ExternalMessage(this._address, body, init))\n if (!outcome) return { ok: true, fees, emulated: false, source: 'estimate-only', warnings: [] }\n const common = {\n fees, emulated: true as const, source: outcome.source, warnings: outcome.warnings,\n ...(outcome.exitCode !== undefined ? { exitCode: outcome.exitCode } : {}),\n ...(outcome.risk ? { risk: outcome.risk } : {}),\n }\n if (outcome.ok) return { ok: true, ...common, ...(outcome.actionSuccess !== undefined ? { actionSuccess: outcome.actionSuccess } : {}) }\n return { ok: false, ...common, reason: outcome.reason ?? 'emulation failed', ...(outcome.aborted !== undefined ? { aborted: outcome.aborted } : {}) }\n }\n\n /** Preflight a {@link TonSendable} (unsigned body, current seqno). */\n async simulateTransaction(tx: TonSendable): Promise<TonSimulation> {\n const body = tx instanceof Cell ? tx : v5r1PackUnsigned((await this.signingCell(this.toMessages(tx))).signing)\n return this.simulateBody(body)\n }\n\n /** Estimated fee of a transaction, in nanotons. */\n async quoteSendTransaction(tx: TonSendable): Promise<{ fee: bigint }> {\n const body = tx instanceof Cell ? tx : v5r1PackUnsigned((await this.signingCell(this.toMessages(tx))).signing)\n return { fee: (await this.estimateFees(body)).total }\n }\n\n /** Estimated fee of a transfer, in nanotons. */\n async quoteTransfer(o: TonTransferOptions): Promise<{ fee: bigint }> {\n const message = o.token ? await this.jettonTransferMessage(o) : this.transactionMessage({ to: o.recipient, value: o.amount, ...(o.memo !== undefined ? { body: o.memo } : {}) })\n const { signing } = await this.signingCell([message])\n return { fee: (await this.estimateFees(v5r1PackUnsigned(signing))).total }\n }\n\n /** Offline description of what `tx` does — see {@link describeTransaction}. */\n describe(tx: TonSendable): TonDescription {\n return describeTransaction(tx, { network: this._config.network ?? 'mainnet' })\n }\n\n /**\n * Receipt for a body hash returned by sendTransaction: toncenter v3 maps the\n * message body hash to the account transaction, which is then fetched.\n */\n async getTransactionReceipt(hash: string): Promise<TonReceipt | undefined> {\n const rpc = this.requireRpc('fetch transaction receipts')\n const base = this._config.indexerUrl ?? DEFAULT_INDEXER\n const doFetch = this._config.fetch ?? globalThis.fetch\n const res = await doFetch(`${base}/transactionsByMessage?${new URLSearchParams({ body_hash: hash, limit: '1' })}`, { signal: AbortSignal.timeout(this._config.timeoutMs ?? 15_000) })\n if (!res.ok) throw new NetworkError(`toncenter v3 ${res.status}`, { provider: base })\n const { transactions } = (await res.json()) as { transactions?: Array<{ account: string; hash: string; lt: string }> }\n const found = transactions?.[0]\n if (!found) return undefined\n const account = Address.parse(found.account)\n let tx\n try { [tx] = await rpc.getTransactions(account, { limit: 1, hash: found.hash }) }\n catch { [tx] = await rpc.getTransactions(account, { limit: 1, lt: found.lt, hash: found.hash, archival: true }) }\n if (!tx) return undefined\n const d = tx.description as { type: string; aborted?: boolean }\n return { hash, status: d.type === 'generic' && !d.aborted ? 1 : 0, blockNumber: tx.lt, transactionHash: tx.hash().toString('base64'), totalFees: tx.totalFees.coins, raw: tx }\n }\n\n /** ed25519 over the raw message bytes; `signature` hex. */\n async verify(message: string | Uint8Array, signature: string): Promise<boolean> {\n try { return ed25519.verify(hexToBytes(signature), utf8(message), this.publicKey) } catch { return false }\n }\n}\n\nfunction randomQueryId(): bigint {\n const r = new Uint32Array(2)\n globalThis.crypto.getRandomValues(r)\n return (BigInt(r[0]!) << 32n) | BigInt(r[1]!)\n}\n","import { LocalSigner, feeLimit, requireCurve, type IWalletAccount, type IWalletAccountReadOnly, type Signer, type TransferResult, type WriteOptions } from '@anywalletkit/core'\nimport { Buffer } from 'buffer'\nimport { Cell } from '@ton/core'\nimport { BroadcastUnknownError, MessageIsTransactionError, SimulationError, UnsafeTransactionError } from './errors.js'\nimport { isAnsweredRefusal } from './toncenter.js'\nimport { tonProofDigest, tonSignDataDigest, type TonProof, type TonProofRequest, type TonSignDataRequest, type TonSignedData } from './tonconnect.js'\nimport { WalletAccountReadOnlyTon } from './read-only-account.js'\nimport { parseV5R1Body, v5r1ExternalMessage, v5r1PackSigned, v5r1PackUnsigned, type V5R1Message } from './wallet-v5r1.js'\nimport { drainModes, sendModeOf } from './describe.js'\nimport type { TonConfig, TonSendable, TonTransferOptions } from './types.js'\n\nconst toHex = (u8: Uint8Array) => Array.from(u8, (b) => b.toString(16).padStart(2, '0')).join('')\n\n/** Does `bytes` carry `key` anywhere? A Solana transaction names each signer's 32-byte key. */\nconst carriesKey = (bytes: Uint8Array, key: Uint8Array): boolean => {\n outer: for (let i = 0; i + key.length <= bytes.length; i++) {\n for (let j = 0; j < key.length; j++) if (bytes[i + j] !== key[j]) continue outer\n return true\n }\n return false\n}\n\n/**\n * Signing TON account on Wallet V5R1. It never holds a key: the V5R1 body is\n * signed by `signer.sign(signingCell.hash(), {scheme: 'ed25519', context:\n * 'ton-external'})` — a {@link LocalSigner} for seed wallets, anything else\n * (hardware, MPC, backend) through `externalSigner()`.\n *\n * Every send runs: hard checks → fresh seqno → preflight on the zero-signed\n * body (estimateFee, emulation when configured, fee cap) → sign → broadcast.\n * The preflight body carries a zero signature, so the signer is only asked\n * once the transaction has passed.\n */\nexport class WalletAccountTon extends WalletAccountReadOnlyTon implements IWalletAccount {\n /** seqno and fees come from the network before signing. */\n readonly needsNetwork = true\n /** Derivation path, `ton-mnemonic`, or `external`. */\n readonly path: string\n /**\n * The signer that holds the key, in a private field: not a property of the account, so no code\n * the account is handed to (a protocol module, a logger) can reach it and sign around the\n * account's checks (audit 2026-10-29 A1).\n */\n readonly #signer: Signer\n /** What holds the key: `seed`, `key` (one imported key) or `external`. */\n readonly signerKind: Signer['kind']\n private _readOnly: WalletAccountReadOnlyTon | undefined\n\n /** `publicKey` is the signer's 32-byte ed25519 key; the V5R1 address derives from it synchronously. */\n constructor(signer: Signer, publicKey: Uint8Array, path: string, config: TonConfig = {}) {\n super(publicKey, config)\n this.#signer = requireCurve(signer, 'ed25519')\n this.signerKind = this.#signer.kind\n this.path = path\n }\n\n /** Back-compat: wrap a raw derived key in a {@link LocalSigner} (the account takes ownership; it cannot derive). */\n static fromPrivateKey(privateKey: Uint8Array, publicKey: Uint8Array, path: string, config: TonConfig = {}): WalletAccountTon {\n return new WalletAccountTon(LocalSigner.fromPrivateKey('ed25519', privateKey, publicKey, path), publicKey, path, config)\n }\n\n /** Account index for the standard m/44'/607'/i' path. */\n get index(): number | undefined {\n const m = /^m\\/44'\\/607'\\/(\\d+)'$/.exec(this.path)\n return m ? Number(m[1]) : undefined\n }\n\n /**\n * Hex ed25519 signature over the raw message bytes. A 32-byte message — string or bytes — is\n * refused with {@link MessageIsTransactionError}: the wallet contract checks a transfer's\n * signature over the 32-byte hash of its signing cell, so those bytes could be one. Bytes that\n * carry this account's public key are refused as well: one ed25519 key (an external signer) may\n * also be a Solana wallet, and a Solana transaction names its signer's key. TON Connect goes\n * through {@link signTonProof} and {@link signTonConnectData}.\n */\n async sign(message: string | Uint8Array): Promise<string> {\n const bytes = typeof message === 'string' ? new TextEncoder().encode(message) : message\n if (bytes.length === 32 || carriesKey(bytes, this.publicKey)) throw new MessageIsTransactionError()\n return toHex(await this.#signer.sign(bytes, { scheme: 'ed25519', context: 'ton-message' }))\n }\n\n /**\n * TON Connect `ton_proof` for this wallet's address: the `proof` object of the connect reply. The\n * digest is built here (0xffff ‖ \"ton-connect\" ‖ …), so no request can turn it into a transfer.\n * `domain` is the host the wallet saw the request come from.\n */\n async signTonProof(request: TonProofRequest): Promise<TonProof> {\n const digest = tonProofDigest(this._address, request)\n const signature = await this.#signer.sign(digest, { scheme: 'ed25519', context: 'ton-proof' })\n return {\n timestamp: request.timestamp,\n domain: { lengthBytes: new TextEncoder().encode(request.domain).length, value: request.domain },\n payload: request.payload,\n signature: Buffer.from(signature).toString('base64'),\n }\n }\n\n /** TON Connect `signData` (text / binary) for this wallet's address: the reply the dApp gets. */\n async signTonConnectData(request: TonSignDataRequest): Promise<TonSignedData> {\n const digest = tonSignDataDigest(this._address, request)\n const signature = await this.#signer.sign(digest, { scheme: 'ed25519', context: 'ton-sign-data' })\n return {\n signature: Buffer.from(signature).toString('base64'),\n address: this._address.toRawString(),\n timestamp: request.timestamp,\n domain: request.domain,\n payload: request.payload.type === 'text' ? { type: 'text', text: request.payload.text } : { type: 'binary', bytes: request.payload.bytes },\n }\n }\n\n private checkMaxFee(fee: bigint, limit: bigint | number | undefined, op: string) {\n if (limit !== undefined && fee > BigInt(limit)) throw new Error(`Exceeded maximum fee cost for ${op} operation.`)\n }\n\n /**\n * Checks → seqno → preflight → signed body. The preflight runs on the\n * zero-signed body (ignore_chksig), so nothing is signed before it passes.\n */\n /**\n * Refuse send modes that drain the wallet — 128 (the whole remaining balance) and 32 (the account\n * destroyed once empty) — unless `allowDrainingTransactions`. Checked locally, before any seqno or\n * emulation, so it holds with `simulate: false` too (round 3, M11); the emulation check stays.\n */\n private assertNoDrain(modes: number[]): void {\n if (this._config.allowDrainingTransactions === true) return\n const found = modes.flatMap(drainModes)\n if (found.length) throw new UnsafeTransactionError('drain', `Refusing a message with send mode ${found.includes('carries-all-balance') ? '128 (it carries the whole remaining balance)' : '32 (it destroys the wallet account once empty)'}; set allowDrainingTransactions to override.`)\n }\n\n /** The send modes of a prebuilt V5R1 body; an unreadable body is left to the emulation and the node. */\n private bodyModes(body: Cell): number[] {\n return parseV5R1Body(body)?.messages.map((m) => m.mode) ?? []\n }\n\n async #signMessages(messages: V5R1Message[], limit: bigint | number | undefined, op: string): Promise<{ body: Cell; fee: bigint }> {\n this.assertNoDrain(messages.map((m) => sendModeOf(m.mode)))\n // The wallet sends with IGNORE_ERRORS: a message whose value exceeds the\n // balance is silently dropped by the action phase — the external still\n // \"succeeds\", the seqno moves, the fee is paid and nothing leaves\n // (2026-10-09: a 2 GRAM deposit on a 0.46 GRAM balance). Refuse up front,\n // and again after emulation if the risk shows less TON leaving than asked.\n const want = messages.reduce((sum, m) => sum + (m.message.info.type === 'internal' ? m.message.info.value.coins : 0n), 0n)\n if (want > 0n) {\n const balance = await this.getBalance()\n if (balance < want) throw new UnsafeTransactionError('insufficient-balance', `Insufficient TON balance: the messages carry ${want} nanotons, the wallet holds ${balance} (fees come on top).`)\n }\n const { signing } = await this.signingCell(messages)\n const fee = await this.preflight(v5r1PackUnsigned(signing), limit, op, want)\n const signature = await this.#signer.sign(new Uint8Array(signing.hash()), { scheme: 'ed25519', context: 'ton-external' })\n return { body: v5r1PackSigned(signing, signature), fee }\n }\n\n private async preflight(body: Cell, limit: bigint | number | undefined, op: string, expectedTonOut?: bigint): Promise<bigint> {\n if (this._config.simulate === false) {\n if (limit === undefined) return 0n\n const fee = (await this.estimateFees(body)).total\n this.checkMaxFee(fee, limit, op)\n return fee\n }\n const sim = await this.simulateBody(body)\n if (!sim.ok) throw new SimulationError(sim.reason, { ...(sim.exitCode !== undefined ? { exitCode: sim.exitCode } : {}), ...(sim.aborted !== undefined ? { aborted: sim.aborted } : {}) })\n if (sim.risk?.transferAllRemainingBalance && this._config.allowDrainingTransactions !== true) {\n throw new UnsafeTransactionError('drain', 'Refusing a message that carries the whole remaining balance (send mode 128); set allowDrainingTransactions to override.')\n }\n if (expectedTonOut !== undefined && sim.risk && sim.risk.ton < expectedTonOut) {\n throw new SimulationError(`The emulation shows only ${sim.risk.ton} nanotons leaving the wallet for messages carrying ${expectedTonOut}: a message would be dropped (insufficient balance for value + fees).`)\n }\n this.checkMaxFee(sim.fees.total, limit, op)\n return sim.fees.total\n }\n\n /** Sign without broadcasting. Returns the external-message BODY as base64 BoC (pass it back to sendTransaction as a Cell). */\n async signTransaction(tx: TonSendable, options: WriteOptions = {}): Promise<string> {\n if (tx instanceof Cell) {\n this.assertNoDrain(this.bodyModes(tx))\n await this.preflight(tx, feeLimit(this._config.transactionMaxFee, options), 'transaction')\n return tx.toBoc().toString('base64')\n }\n const { body } = await this.#signMessages(this.toMessages(tx), feeLimit(this._config.transactionMaxFee, options), 'transaction')\n return body.toBoc().toString('base64')\n }\n\n private async broadcast(body: Cell): Promise<string> {\n const rpc = this.requireRpc('send transactions')\n const init = await this.initIfNeeded()\n const hash = body.hash().toString('hex')\n try {\n await rpc.sendBoc(v5r1ExternalMessage(this._address, body, init))\n } catch (e) {\n // Only a node's explicit refusal means nothing went out (round 3, M12).\n if (isAnsweredRefusal(e)) throw e\n throw new BroadcastUnknownError(hash, e)\n }\n return hash\n }\n\n /** Sign and broadcast; `hash` is the body hash (hex) — resolve it with getTransactionReceipt. */\n async sendTransaction(tx: TonSendable, options: WriteOptions = {}): Promise<TransferResult> {\n this.requireRpc('send transactions')\n if (tx instanceof Cell) this.assertNoDrain(this.bodyModes(tx))\n const { body, fee } = tx instanceof Cell\n ? { body: tx, fee: await this.preflight(tx, feeLimit(this._config.transactionMaxFee, options), 'transaction') }\n : await this.#signMessages(this.toMessages(tx), feeLimit(this._config.transactionMaxFee, options), 'transaction')\n return { hash: await this.broadcast(body), fee }\n }\n\n /** TON (no `token`) or jetton transfer. */\n async transfer(o: TonTransferOptions, writeOptions: WriteOptions = {}): Promise<TransferResult> {\n this.requireRpc('transfer tokens')\n const message = o.token ? await this.jettonTransferMessage(o) : this.transactionMessage({ to: o.recipient, value: o.amount, ...(o.memo !== undefined ? { body: o.memo } : {}) })\n const { body, fee } = await this.#signMessages([message], feeLimit(this._config.transferMaxFee, writeOptions), 'transfer')\n return { hash: await this.broadcast(body), fee }\n }\n\n /** The same wallet as a {@link WalletAccountReadOnlyTon}. */\n toReadOnlyAccount(): IWalletAccountReadOnly {\n this._readOnly ??= new WalletAccountReadOnlyTon(this.publicKey, this._config)\n return this._readOnly\n }\n\n /** Disposes the signer: a local key is zeroized, an external one is released. */\n dispose(): void {\n this.#signer.dispose()\n }\n}\n","/**\n * TON Connect signatures (docs.ton.org/develop/dapps/ton-connect/sign): `ton_proof` and\n * `signData` (text / binary). The account builds the digest itself, from the request fields and\n * its own address, so what it signs always starts with the TON Connect prefix (0xffff ‖\n * \"ton-connect…\") and can never be the cell hash a wallet contract checks a transfer against.\n *\n * ton_proof:\n * sha256(0xffff ‖ \"ton-connect\" ‖ sha256(\"ton-proof-item-v2/\" ‖ workchain:int32BE ‖\n * address_hash:32 ‖ domain_len:uint32LE ‖ domain ‖ timestamp:uint64LE ‖ payload))\n * signData (text | binary):\n * sha256(0xffff ‖ \"ton-connect/sign-data/\" ‖ workchain:int32BE ‖ address_hash:32 ‖\n * domain_len:uint32BE ‖ domain ‖ timestamp:uint64BE ‖ \"txt\"|\"bin\" ‖ payload_len:uint32BE ‖ payload)\n */\nimport { sha256 } from '@noble/hashes/sha2.js'\nimport { Buffer } from 'buffer'\n\n/** What a dApp asks `ton_proof` for: its domain (host), the time of the proof, its nonce. */\nexport interface TonProofRequest {\n /** The dApp's host as the wallet saw it (`app.example`), never the dApp's own claim. */\n domain: string\n /** Unix seconds. */\n timestamp: number\n /** The dApp's `ton_proof` payload. */\n payload: string\n}\n\n/** The `proof` object of a TON Connect `ton_proof` reply. */\nexport interface TonProof {\n timestamp: number\n domain: { lengthBytes: number; value: string }\n payload: string\n /** Base64 ed25519 signature. */\n signature: string\n}\n\n/** A `signData` payload. `cell` payloads need schema-aware rendering and are not signed here. */\nexport type TonSignDataPayload = { type: 'text'; text: string } | { type: 'binary'; bytes: string }\n\n/** What a dApp asks `signData` for. */\nexport interface TonSignDataRequest {\n /** The dApp's host as the wallet saw it. */\n domain: string\n /** Unix seconds. */\n timestamp: number\n payload: TonSignDataPayload\n}\n\n/** The TON Connect `signData` reply. */\nexport interface TonSignedData {\n /** Base64 ed25519 signature. */\n signature: string\n /** Raw form (`0:…`) of the address that signed. */\n address: string\n timestamp: number\n domain: string\n payload: TonSignDataPayload\n}\n\n/** The address parts the digests bind to. */\nexport interface TonAddressParts { workChain: number; hash: Uint8Array }\n\nconst utf8 = (s: string) => new TextEncoder().encode(s)\nconst int32BE = (n: number) => { const b = new Uint8Array(4); new DataView(b.buffer).setInt32(0, n, false); return b }\nconst uint32 = (n: number, littleEndian: boolean) => { const b = new Uint8Array(4); new DataView(b.buffer).setUint32(0, n, littleEndian); return b }\nconst uint64 = (n: number, littleEndian: boolean) => { const b = new Uint8Array(8); new DataView(b.buffer).setBigUint64(0, BigInt(n), littleEndian); return b }\nconst concat = (...parts: Uint8Array[]) => { const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0)); let o = 0; for (const p of parts) { out.set(p, o); o += p.length } return out }\n\nfunction checkCommon(address: TonAddressParts, domain: unknown, timestamp: unknown): void {\n if (address.hash.length !== 32) throw new RangeError('TON address hash must be 32 bytes.')\n if (!Number.isInteger(address.workChain)) throw new TypeError('TON address workChain must be an integer.')\n if (typeof domain !== 'string' || domain.length === 0) throw new TypeError('TON Connect domain must be a non-empty string.')\n if (typeof timestamp !== 'number' || !Number.isSafeInteger(timestamp) || timestamp < 0) throw new TypeError('TON Connect timestamp must be a non-negative integer (unix seconds).')\n}\n\n/** Standard base64 (padding optional, ASCII whitespace ignored as `atob` does), strictly: a malformed `bytes` is refused, not half-decoded. */\nfunction base64Bytes(raw: string): Uint8Array {\n const s = raw.replace(/[\\t\\n\\f\\r ]/g, '')\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(s) || s.replace(/=+$/, '').length % 4 === 1) throw new TypeError('signData binary payload must be base64.')\n return new Uint8Array(Buffer.from(s, 'base64'))\n}\n\n/** The 32 bytes a wallet signs for `ton_proof`. */\nexport function tonProofDigest(address: TonAddressParts, request: TonProofRequest): Uint8Array {\n checkCommon(address, request.domain, request.timestamp)\n if (typeof request.payload !== 'string') throw new TypeError('ton_proof payload must be a string.')\n const domain = utf8(request.domain)\n const inner = concat(utf8('ton-proof-item-v2/'), int32BE(address.workChain), address.hash, uint32(domain.length, true), domain, uint64(request.timestamp, true), utf8(request.payload))\n return sha256(concat(new Uint8Array([0xff, 0xff]), utf8('ton-connect'), sha256(inner)))\n}\n\n/** The 32 bytes a wallet signs for `signData` (text / binary). */\nexport function tonSignDataDigest(address: TonAddressParts, request: TonSignDataRequest): Uint8Array {\n checkCommon(address, request.domain, request.timestamp)\n const p = request.payload as { type?: unknown; text?: unknown; bytes?: unknown } | undefined\n let payload: Uint8Array\n if (p?.type === 'text' && typeof p.text === 'string') payload = utf8(p.text)\n else if (p?.type === 'binary' && typeof p.bytes === 'string') payload = base64Bytes(p.bytes)\n else throw new TypeError('signData payload must be { type: \"text\", text } or { type: \"binary\", bytes }; cell payloads are not supported.')\n const domain = utf8(request.domain)\n return sha256(concat(new Uint8Array([0xff, 0xff]), utf8('ton-connect/sign-data/'), int32BE(address.workChain), address.hash, uint32(domain.length, false), domain, uint64(request.timestamp, false), utf8(p.type === 'text' ? 'txt' : 'bin'), uint32(payload.length, false), payload))\n}\n","import { LocalSigner, SignerError, WalletManager, isSeedSigner, zeroize, type FeeRates, type Signer } from '@anywalletkit/core'\nimport { mnemonicToPrivateKey, mnemonicValidate } from '@ton/crypto'\nimport { WalletAccountTon } from './account.js'\nimport { WalletAccountReadOnlyTon } from './read-only-account.js'\nimport type { TonConfig } from './types.js'\n\n/** Base derivation path for BIP-39 seeds; account `i` is at `m/44'/607'/i'`. */\nexport const TON_BASE_PATH = \"m/44'/607'\"\n/** Path label of the account a TON-native (Tonkeeper-style) mnemonic yields — there is exactly one. */\nexport const TON_MNEMONIC_PATH = 'ton-mnemonic'\nimport { DEFAULT_TONAPI } from './emulation.js'\n\n/**\n * One seed → TON accounts at m/44'/607'/i' (SLIP-10 ed25519) on Wallet V5R1 —\n * the derivation Trust Wallet and Ledger use for a BIP-39 phrase. Paths\n * may be relative to m/44'/607' (\"0'\") or full.\n *\n * Built with an ed25519 `Signer` instead of a seed, the manager wraps it:\n * - a derivable `SeedSigner` sitting at `m/44'/607'` yields `getAccount(i)` → `i'` children;\n * - a `SeedSigner` at a leaf, or any external signer, is `getAccount(0)` (path = the\n * signer's path, or 'external'); other indexes/paths throw.\n *\n * Tonkeeper-style 24-word TON mnemonics (not BIP-39) are imported with\n * {@link WalletManagerTon.fromTonMnemonic}; they yield one account at `ton-mnemonic`.\n */\nexport class WalletManagerTon extends WalletManager<WalletAccountTon, TonConfig> {\n constructor(seedOrSigner: string | Uint8Array | Signer, config: TonConfig = {}) {\n super(seedOrSigner, config)\n }\n\n\n /**\n * Import a TON-native mnemonic (24 words, Tonkeeper / Tonhub / MyTonWallet\n * default): PBKDF2 per @ton/crypto, one ed25519 key, one V5R1 account at\n * path `ton-mnemonic` with the address those wallets show.\n */\n static async fromTonMnemonic(words: string[] | string, config: TonConfig = {}): Promise<WalletManagerTon> {\n const list = (Array.isArray(words) ? words : words.trim().split(/\\s+/)).map((w) => w.toLowerCase())\n if (list.length !== 24) throw new Error('A TON mnemonic has 24 words.')\n // TON mnemonics carry their own check: a typo (or a BIP-39 phrase) would derive another, empty wallet.\n if (!(await mnemonicValidate(list))) throw new Error('Not a valid TON mnemonic: check the words (a typo would open a different, empty wallet).')\n const pair = await mnemonicToPrivateKey(list)\n const privateKey = new Uint8Array(pair.secretKey.subarray(0, 32)) // nacl secret key = seed || public key\n const publicKey = new Uint8Array(pair.publicKey)\n zeroize(new Uint8Array(pair.secretKey.buffer, pair.secretKey.byteOffset, pair.secretKey.byteLength))\n return new WalletManagerTon(LocalSigner.fromPrivateKey('ed25519', privateKey, publicKey, TON_MNEMONIC_PATH), config)\n }\n\n async getAccount(index = 0): Promise<WalletAccountTon> {\n const external = this.externalSigner()\n if (external && !(isSeedSigner(external) && external.path === TON_BASE_PATH)) {\n // A leaf signer (TON mnemonic, hardware, MPC…) is exactly one account.\n if (index !== 0) throw new SignerError(`This signer yields a single account (index 0); ${index} is not derivable from it.`)\n return this.fromSigner(external, this.singlePath(external))\n }\n return this.getAccountByPath(`${TON_BASE_PATH}/${index}'`)\n }\n\n async getAccountByPath(path: string): Promise<WalletAccountTon> {\n const external = this.externalSigner()\n if (external) {\n const single = this.singlePath(external)\n const full = path === single || path.startsWith('m/') ? path : `${TON_BASE_PATH}/${path}`\n return this.fromSigner(external, full)\n }\n const full = path.startsWith('m/') ? path : `${TON_BASE_PATH}/${path}`\n const cached = this._accounts.get(full)\n if (cached) return cached\n return this.cachedAccount(full, () => {\n const signer = LocalSigner.leafFromSeed(this.seedBytes(), 'ed25519', full)\n return new WalletAccountTon(signer, signer.publicKey, full, this._config)\n })\n }\n\n /** The one path a non-derivable signer answers to: its own, or 'external'. */\n private singlePath(signer: Signer): string {\n return isSeedSigner(signer) ? signer.path : 'external'\n }\n\n /** Resolve `path` against an injected signer: the signer itself, or a child when it can derive there. */\n private async fromSigner(signer: Signer, path: string): Promise<WalletAccountTon> {\n this.requireSigner('ed25519')\n let rel: string | undefined\n let key = this.singlePath(signer)\n if (isSeedSigner(signer)) {\n if (path === signer.path) key = path\n else if (path.startsWith(`${signer.path}/`)) { rel = path.slice(signer.path.length + 1); key = path }\n else throw new SignerError(`This signer yields a single account at path '${signer.path}'; it cannot provide ${path}.`)\n } else if (path !== `${TON_BASE_PATH}/0'` && path !== 'external') {\n throw new SignerError(`An external signer yields a single account; ${path} is not derivable from it.`)\n }\n return this.signerAccount(key, signer, rel, (leaf, publicKey) => new WalletAccountTon(leaf, publicKey, key, this._config))\n }\n\n /** Watch-only account for a public key (hex or bytes) — TON addresses derive from the key, not the other way round. */\n getReadOnlyAccount(publicKey: Uint8Array | string): WalletAccountReadOnlyTon {\n return new WalletAccountReadOnlyTon(publicKey, this._config)\n }\n\n /** Gas price from config param 21 via tonapi (normal = fast there; slow = ×0.8 here). */\n async getFeeRates(): Promise<FeeRates> {\n const doFetch = this._config.fetch ?? globalThis.fetch\n const res = await doFetch(`${this._config.tonApiUrl ?? DEFAULT_TONAPI}/blockchain/config/raw`, { signal: AbortSignal.timeout(this._config.timeoutMs ?? 15_000) })\n const json = (await res.json()) as { config: { config_param21: { gas_limits_prices: { gas_flat_pfx: { other: { gas_prices_ext: { gas_price: number } } } } } } }\n const normal = BigInt(Math.round(json.config.config_param21.gas_limits_prices.gas_flat_pfx.other.gas_prices_ext.gas_price / 65_536))\n return { slow: (normal * 80n) / 100n, normal, fast: normal }\n }\n\n}\n","import { installBufferGlobal } from './buffer-global.js'\ninstallBufferGlobal()\nexport { installBufferGlobal }\nexport * from './types.js'\nexport * from './errors.js'\nexport { createTonClient } from './client.js'\nexport { TonCenter, createTonRpc, tonCenterEndpoint, isAnsweredRefusal, emulateExternal, parseEmulation, type TonAccountState, type TonAccountStatus, type GetMethodResult, type EmulationVerdict } from './toncenter.js'\nexport { emulateViaTonapi, parseTonapiConsequences, parseTonapiTrace, parseTonapiRisk, runEmulation, resolveEmulate, DEFAULT_TONAPI, type EmulationOutcome, type EmulationSource, type EmulateOptions } from './emulation.js'\nexport {\n V5R1_CODE_HEX, V5R1_OP, MAINNET_GLOBAL_ID, TESTNET_GLOBAL_ID, DEFAULT_SEND_MODE, MAX_ACTIONS,\n v5r1Code, v5r1WalletId, v5r1StateInit, v5r1Address, v5r1SigningMessage, v5r1PackSigned, v5r1PackUnsigned, v5r1ExternalMessage, parseV5R1Body,\n type V5R1Message, type V5R1SigningParams, type V5R1WalletIdParts, type ParsedV5R1Body,\n} from './wallet-v5r1.js'\nexport {\n describeTransaction, describeMessageRelaxed, decodeBody, commentCell, canonicalBocCell, messageBody, JETTON_TRANSFER_OP,\n type TonDescription, type TonDescribedMessage, type TonDescribedKind, type TonJettonDetails, type TonWarning, type TonWarningCode, type DecodedBody,\n} from './describe.js'\nexport { WalletAccountReadOnlyTon, SEND_MODE } from './read-only-account.js'\nexport { WalletAccountTon } from './account.js'\nexport { tonProofDigest, tonSignDataDigest, type TonProof, type TonProofRequest, type TonSignDataPayload, type TonSignDataRequest, type TonSignedData, type TonAddressParts } from './tonconnect.js'\nexport { WalletManagerTon, TON_BASE_PATH, TON_MNEMONIC_PATH } from './manager.js'\nexport {\n createTonHistory, mapTonapiEvent, mapToncenterTransaction, mapActions as mapTonapiActions, valueFlowTransfers, rawTonAddress, tonExplorerTxUrl, HistoryUnavailableError,\n encodeCursor as encodeHistoryCursor, decodeCursor as decodeHistoryCursor,\n type TonHistoryOptions, type TonHistorySource, type TonHistoryPage, type TonChainTx, type TonHistoryRaw, type TonHistoryBackend, type TonHistoryCursor, type TonapiEvent, type TonapiAction, type V3Transaction, type HistoryFetch,\n} from './history.js'\nexport { WalletManagerTon as default } from './manager.js'\nexport type { MappedActions, TonapiAccount, TonapiJetton, V3Message } from './history.js'\n"],"mappings":"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","names":["Buffer","NetworkError","DEFAULT_TIMEOUT_MS","NetworkError","big","verdict","Buffer","Cell","Buffer","Address","Cell","beginCell","Address","Buffer","Cell","beginCell","external","NetworkError","Address","Cell","beginCell","JETTON_TRANSFER_OP","NetworkError","Address","beginCell","Cell","Buffer","Cell","Buffer","utf8","Buffer","Cell","LocalSigner","SignerError","LocalSigner","external","SignerError","full"]}
|