@anywalletkit/wallet-near 0.3.1 → 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/history.ts","../src/rpc.ts","../src/types.ts"],"sourcesContent":["/**\n * Activity history for NEAR: a `HistorySource` over the nearblocks API\n * (`/v1/account/{id}/txns` receipt rows + `/v1/account/{id}/ft-txns` NEP-141\n * movements, merged by transaction hash), with an optional archival RPC\n * (`EXPERIMENTAL_tx_status`) that makes single-transaction reads exact.\n *\n * nearblocks serializes large yoctoNEAR amounts as JSON numbers; integer\n * literals are kept exact by re-quoting them before `JSON.parse`, values the\n * API already rounded (`7e+23`) stay approximate and are flagged in `raw`.\n * Both lists page by keyset cursor (`id` / `event_index`), merged newest-first.\n * `fetch` + `AbortSignal.timeout` only — Hermes-safe.\n */\nimport type { ChainCall, ChainTransfer, ChainTx, HistoryPage, HistoryQuery, HistorySource } from '@anywalletkit/core'\nimport { fromBase64 } from './rpc.js'\nimport { CAIP2 } from './types.js'\nimport { bigintToNumber } from '@anywalletkit/core'\n\n// ── Public types ─────────────────────────────────────────────────────────────\n\nexport type HistoryFetch = (\n input: string,\n init?: { method?: string; headers?: Record<string, string>; body?: string; signal?: AbortSignal },\n) => Promise<{ ok: boolean; status: number; text(): Promise<string> }>\n\n/** Options for {@link createNearHistory}. */\nexport interface NearHistoryOptions {\n /** nearblocks root. Default `https://api.nearblocks.io` (`https://api-testnet.nearblocks.io` on testnet). */\n nearblocksUrl?: string\n /** nearblocks Bearer key. Keyless use is limited to a few requests per minute. */\n apiKey?: string\n /** Archival JSON-RPC (`https://archival-rpc.mainnet.near.org`). When set, `getTransaction` is refined with exact amounts, fee and NEP-141 events. */\n rpcUrl?: string\n network?: 'mainnet' | 'testnet'\n fetch?: HistoryFetch\n /** nearblocks requests per second. Default 0.1 (6/min) without a key, 5 with one. */\n rateLimit?: number\n /** Per request, ms. Default 15 000. */\n timeoutMs?: number\n}\n\nexport interface NearHistoryRaw {\n /** nearblocks receipt rows of this transaction (account `/txns`). */\n receipts: NearblocksReceiptRow[]\n /** nearblocks NEP-141 rows of this transaction (account `/ft-txns`). */\n ft: NearblocksFtRow[]\n /** `/v1/txns/{hash}` row (single-transaction reads). */\n txn?: NearblocksTxn\n /** `EXPERIMENTAL_tx_status` result when the RPC answered. */\n rpc?: RpcTxStatus\n /** Set when an amount or the fee came from a value nearblocks had already rounded to a double. */\n approximate?: true\n}\n\nexport interface NearChainTx extends ChainTx {\n raw: NearHistoryRaw\n}\n\nexport interface NearHistoryPage extends HistoryPage {\n items: NearChainTx[]\n}\n\n/**\n * NEAR history from the nearblocks API, with an archival RPC for single transactions. Build it with\n * {@link createNearHistory}.\n */\nexport interface NearHistorySource extends HistorySource {\n listActivity(address: string, query?: HistoryQuery): Promise<NearHistoryPage>\n getTransaction(hash: string, address: string): Promise<NearChainTx | undefined>\n}\n\n/** Every configured history backend failed. */\nexport class HistoryUnavailableError extends Error {\n readonly chain: string\n readonly reason: string\n readonly attempts: readonly string[]\n constructor(chain: string, reason: string, attempts: readonly string[] = []) {\n super(`History unavailable for ${chain}: ${reason}`)\n this.name = 'HistoryUnavailableError'\n this.chain = chain\n this.reason = reason\n this.attempts = attempts\n }\n}\n\nconst DEFAULT_LIMIT = 25\nconst MAX_LIMIT = 25\nconst DEFAULT_TIMEOUT_MS = 15_000\n/** NEP-141 convention: 1 yoctoNEAR attached to prove a full-access key; not a payment. */\nconst ONE_YOCTO = 1n\n\n// ── Cursor: per-list keyset positions, base64 JSON ───────────────────────────\n\nexport interface NearHistoryCursor {\n v: 1\n /** `/txns`: `id` of the last consumed row; '' = not started; null = exhausted. */\n tx: string | null\n /** `/ft-txns`: `event_index` of the last consumed row; '' = not started; null = exhausted. */\n ft: string | null\n /**\n * Transactions already emitted that have rows on the next page: a transaction with more receipt\n * rows than a page goes out with the rows that fit, and the rest are consumed without emitting it\n * again (round 3, M13).\n */\n skip?: string[]\n}\n\nconst B64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\nfunction b64encode(s: string): string {\n let out = ''\n for (let i = 0; i < s.length; i += 3) {\n const c = [s.charCodeAt(i), s.charCodeAt(i + 1), s.charCodeAt(i + 2)]\n for (const x of c) if (x > 0xff) throw new Error('cursor must be ASCII')\n const n = (c[0]! << 16) | ((c[1]! || 0) << 8) | (c[2]! || 0)\n out += B64[(n >> 18) & 63]! + B64[(n >> 12) & 63]! + (Number.isNaN(c[1]) ? '=' : B64[(n >> 6) & 63]!) + (Number.isNaN(c[2]) ? '=' : B64[n & 63]!)\n }\n return out\n}\n\nfunction b64decode(s: string): string {\n const clean = s.replace(/[^A-Za-z0-9+/]/g, '')\n let out = ''\n for (let i = 0; i < clean.length; i += 4) {\n const c = [0, 1, 2, 3].map((k) => (i + k < clean.length ? B64.indexOf(clean[i + k]!) : -1))\n if (c[0]! < 0 || c[1]! < 0) throw new Error('bad base64')\n const n = (c[0]! << 18) | (c[1]! << 12) | ((c[2]! < 0 ? 0 : c[2]!) << 6) | (c[3]! < 0 ? 0 : c[3]!)\n out += String.fromCharCode((n >> 16) & 0xff)\n if (c[2]! >= 0) out += String.fromCharCode((n >> 8) & 0xff)\n if (c[3]! >= 0) out += String.fromCharCode(n & 0xff)\n }\n return out\n}\n\nexport function encodeCursor(c: NearHistoryCursor): string {\n return b64encode(JSON.stringify(c))\n}\n\nexport function decodeCursor(s: string): NearHistoryCursor {\n let parsed: unknown\n try {\n parsed = JSON.parse(b64decode(s))\n } catch {\n throw new Error('@anywalletkit/wallet-near: malformed history cursor')\n }\n const c = parsed as Partial<NearHistoryCursor> | null\n const ok = (v: unknown) => v === null || typeof v === 'string'\n if (!c || c.v !== 1 || !ok(c.tx) || !ok(c.ft)) throw new Error('@anywalletkit/wallet-near: malformed history cursor')\n if (c.skip !== undefined && (!Array.isArray(c.skip) || c.skip.length > 4 || !c.skip.every((h) => typeof h === 'string'))) throw new Error('@anywalletkit/wallet-near: malformed history cursor')\n return { v: 1, tx: c.tx as string | null, ft: c.ft as string | null, ...(c.skip?.length ? { skip: c.skip } : {}) }\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nclass TokenBucket {\n private tokens: number\n private last = Date.now()\n private chain: Promise<void> = Promise.resolve()\n constructor(private readonly rate: number, private readonly burst = Math.max(2, Math.ceil(rate))) {\n this.tokens = burst\n }\n acquire(): Promise<void> {\n const next = this.chain.then(() => this.take())\n this.chain = next.catch(() => undefined)\n return next\n }\n private refill(): void {\n const now = Date.now()\n this.tokens = Math.min(this.burst, this.tokens + ((now - this.last) / 1000) * this.rate)\n this.last = now\n }\n private async take(): Promise<void> {\n this.refill()\n if (this.tokens >= 1) {\n this.tokens -= 1\n return\n }\n await new Promise((r) => setTimeout(r, Math.ceil(((1 - this.tokens) / this.rate) * 1000)))\n this.refill()\n this.tokens = Math.max(0, this.tokens - 1)\n }\n}\n\nfunction timeoutSignal(ms: number): AbortSignal | undefined {\n const ctor = (globalThis as { AbortSignal?: { timeout?: (ms: number) => AbortSignal } }).AbortSignal\n return typeof ctor?.timeout === 'function' ? ctor.timeout(ms) : undefined\n}\n\n/**\n * `JSON.parse` that keeps integer literals of 16+ digits exact by quoting them\n * first (outside strings only). Numbers with a fraction or exponent are left\n * to the double parser — nearblocks already rounded those.\n */\nexport function parseJsonPreservingBigInts(text: string): unknown {\n let out = ''\n let i = 0\n let inString = false\n while (i < text.length) {\n const ch = text[i]!\n if (inString) {\n out += ch\n if (ch === '\\\\') {\n out += text[i + 1] ?? ''\n i += 2\n continue\n }\n if (ch === '\"') inString = false\n i++\n continue\n }\n if (ch === '\"') {\n inString = true\n out += ch\n i++\n continue\n }\n if (ch === '-' || (ch >= '0' && ch <= '9')) {\n let j = i\n if (text[j] === '-') j++\n while (j < text.length && text[j]! >= '0' && text[j]! <= '9') j++\n const next = text[j]\n const isInteger = next !== '.' && next !== 'e' && next !== 'E'\n if (isInteger) {\n const tok = text.slice(i, j)\n out += tok.replace('-', '').length >= 16 ? `\"${tok}\"` : tok\n i = j\n continue\n }\n while (j < text.length && /[0-9.eE+-]/.test(text[j]!)) j++\n out += text.slice(i, j)\n i = j\n continue\n }\n out += ch\n i++\n }\n return JSON.parse(out)\n}\n\n/** Number / decimal string → bigint; `approx` is set when a double had to be used. */\nfunction big(v: unknown, approx: { value: boolean }): bigint | undefined {\n if (typeof v === 'bigint') return v\n if (typeof v === 'string' && /^-?\\d+$/.test(v)) return BigInt(v)\n if (typeof v === 'number' && Number.isFinite(v)) {\n if (!Number.isSafeInteger(v)) approx.value = true\n return BigInt(Math.trunc(v))\n }\n return undefined\n}\n\nconst nsToSeconds = (ts: unknown): number => {\n if (typeof ts === 'string' && /^\\d+$/.test(ts)) return bigintToNumber(BigInt(ts) / 1_000_000_000n)\n if (typeof ts === 'number') return Math.floor(ts / 1e9)\n return 0\n}\n\n// ── nearblocks shapes ────────────────────────────────────────────────────────\n\nexport interface NearblocksAction {\n action: string\n method?: string | null\n deposit?: number | string | null\n args?: string | null\n}\nexport interface NearblocksReceiptRow {\n id: string\n receipt_id?: string\n predecessor_account_id: string\n receiver_account_id: string\n receipt_kind?: string\n transaction_hash: string\n /** ns, decimal string (the transaction's block). */\n block_timestamp: string | number\n block?: { block_height?: number }\n actions?: NearblocksAction[] | null\n outcomes?: { status?: boolean | null }\n outcomes_agg?: { transaction_fee?: number | string | null }\n}\nexport interface NearblocksFtRow {\n event_index: string\n affected_account_id: string\n involved_account_id?: string | null\n /** Signed, decimal string (exact). */\n delta_amount: string | number\n cause?: string\n transaction_hash: string\n block_timestamp: string | number\n block?: { block_height?: number }\n outcomes?: { status?: boolean | null }\n ft?: { contract: string; symbol?: string | null; decimals?: number | null }\n ft_meta?: { contract: string; symbol?: string | null; decimals?: number | null }\n}\nexport interface NearblocksTxn {\n transaction_hash: string\n block_timestamp: string | number\n signer_account_id: string\n receiver_account_id: string\n block?: { block_height?: number }\n actions?: NearblocksAction[] | null\n outcomes?: { status?: boolean | null }\n outcomes_agg?: { transaction_fee?: number | string | null }\n receipts?: Array<{ fts?: Array<Pick<NearblocksFtRow, 'affected_account_id' | 'involved_account_id' | 'delta_amount' | 'cause' | 'ft_meta'>> }>\n}\n\nfunction ftTransfer(row: Pick<NearblocksFtRow, 'affected_account_id' | 'involved_account_id' | 'delta_amount' | 'cause' | 'ft' | 'ft_meta'>, approx: { value: boolean }): ChainTransfer | undefined {\n const meta = row.ft ?? row.ft_meta\n if (!meta?.contract) return undefined\n const delta = big(row.delta_amount, approx)\n if (delta === undefined || delta === 0n) return undefined\n const other = row.involved_account_id ?? meta.contract\n const t: ChainTransfer = { token: meta.contract, from: delta < 0n ? row.affected_account_id : other, to: delta < 0n ? other : row.affected_account_id, amount: delta < 0n ? -delta : delta, standard: 'nep141' }\n if (typeof meta.symbol === 'string') t.symbol = meta.symbol\n if (typeof meta.decimals === 'number') t.decimals = meta.decimals\n return t\n}\n\ninterface ActionFold {\n transfers: ChainTransfer[]\n programs: string[]\n call?: ChainCall\n}\n\n/** Fold nearblocks actions of one receipt (predecessor → receiver) into transfers / call; the first non-transfer action becomes the call. */\nfunction foldActions(actions: NearblocksAction[] | null | undefined, from: string, to: string, fold: ActionFold, approx: { value: boolean }): void {\n for (const a of actions ?? []) {\n const deposit = big(a.deposit, approx) ?? 0n\n if (a.action === 'TRANSFER') {\n if (deposit > 0n) fold.transfers.push({ token: null, from, to, amount: deposit })\n continue\n }\n if (a.action === 'DELEGATE_ACTION') continue\n const method = a.action === 'FUNCTION_CALL' ? (a.method ?? 'function_call') : a.action.toLowerCase()\n fold.programs.push(method)\n if (a.action === 'FUNCTION_CALL' && deposit > 0n && deposit !== ONE_YOCTO) fold.transfers.push({ token: null, from, to, amount: deposit })\n fold.call ??= { to, method, programs: fold.programs }\n }\n}\n\n/** One transaction from its nearblocks receipt rows + NEP-141 rows. */\nexport function mapNearblocksGroup(chain: string, address: string, receipts: NearblocksReceiptRow[], ft: NearblocksFtRow[]): NearChainTx {\n const approx = { value: false }\n const rows = [...receipts].sort((a, b) => (BigInt(a.id) < BigInt(b.id) ? -1 : BigInt(a.id) > BigInt(b.id) ? 1 : 0))\n const real = rows.filter((r) => r.predecessor_account_id !== 'system' && (r.receipt_kind ?? 'ACTION') === 'ACTION')\n const fold: ActionFold = { transfers: [], programs: [] }\n // The receipt addressed to someone else carries the call that matters; a receipt to ourselves (delegate wrapper, refund) is secondary.\n const ordered = [...real.filter((r) => r.receiver_account_id !== address), ...real.filter((r) => r.receiver_account_id === address)]\n for (const r of ordered) foldActions(r.actions, r.predecessor_account_id, r.receiver_account_id, fold, approx)\n for (const f of ft) {\n const t = ftTransfer(f, approx)\n if (t) fold.transfers.push(t)\n }\n const head = ordered[0] ?? rows[0] ?? ft[0]\n const hash = head?.transaction_hash ?? ''\n const from = ordered[0]?.predecessor_account_id ?? (ft.length ? (ftTransfer(ft[0]!, approx)?.from ?? address) : address)\n const involves = (t: ChainTransfer) => t.from === address || t.to === address\n const primary = fold.transfers.find((t) => t.token !== null && involves(t)) ?? fold.transfers.find(involves) ?? fold.transfers[0]\n const to = fold.call?.to ?? primary?.to ?? ordered[0]?.receiver_account_id ?? null\n let nativeValue = 0n\n for (const t of fold.transfers) if (t.token === null && t.from === from) nativeValue += t.amount\n const statuses = [...rows.map((r) => r.outcomes?.status), ...ft.map((r) => r.outcomes?.status)].filter((s): s is boolean => typeof s === 'boolean')\n const status: ChainTx['status'] = statuses.length === 0 ? 'confirmed' : statuses.every(Boolean) ? 'confirmed' : 'failed'\n const feeSrc = rows.find((r) => r.outcomes_agg?.transaction_fee != null)?.outcomes_agg?.transaction_fee\n const fee = big(feeSrc, approx)\n const heights = [...rows, ...ft].map((r) => r.block?.block_height).filter((h): h is number => typeof h === 'number')\n const raw: NearHistoryRaw = { receipts: rows, ft }\n if (approx.value) raw.approximate = true\n const out: NearChainTx = {\n chain, hash, time: nsToSeconds(head?.block_timestamp), status, address, from, to, nativeValue, transfers: fold.transfers, raw,\n }\n if (fee !== undefined) out.fee = fee\n if (fold.call) out.call = fold.call\n if (heights.length) out.block = BigInt(Math.min(...heights))\n return out\n}\n\n/** `/v1/txns/{hash}`: transaction-level actions, signer / receiver, approximate NEP-141 deltas from the receipts. */\nexport function mapNearblocksTxn(chain: string, address: string, txn: NearblocksTxn): NearChainTx {\n const approx = { value: false }\n const fold: ActionFold = { transfers: [], programs: [] }\n foldActions(txn.actions, txn.signer_account_id, txn.receiver_account_id, fold, approx)\n for (const r of txn.receipts ?? []) {\n for (const f of r.fts ?? []) {\n // nearblocks lists both sides of a movement; keep the one whose affected account is in the pair's \"from\" position.\n const delta = big(f.delta_amount, approx)\n if (delta === undefined || delta >= 0n) continue\n const t = ftTransfer(f, approx)\n if (t) fold.transfers.push(t)\n }\n }\n const from = txn.signer_account_id\n const involves = (t: ChainTransfer) => t.from === address || t.to === address\n const primary = fold.transfers.find((t) => t.token !== null && involves(t)) ?? fold.transfers.find(involves) ?? fold.transfers[0]\n let nativeValue = 0n\n for (const t of fold.transfers) if (t.token === null && t.from === from) nativeValue += t.amount\n const fee = big(txn.outcomes_agg?.transaction_fee, approx)\n const raw: NearHistoryRaw = { receipts: [], ft: [], txn }\n if (approx.value) raw.approximate = true\n const out: NearChainTx = {\n chain, hash: txn.transaction_hash, time: nsToSeconds(txn.block_timestamp), status: txn.outcomes?.status === false ? 'failed' : 'confirmed', address, from,\n to: fold.call?.to ?? primary?.to ?? txn.receiver_account_id, nativeValue, transfers: fold.transfers, raw,\n }\n if (fee !== undefined) out.fee = fee\n if (fold.call) out.call = fold.call\n if (typeof txn.block?.block_height === 'number') out.block = BigInt(txn.block.block_height)\n return out\n}\n\n// ── RPC refinement ───────────────────────────────────────────────────────────\n\nexport interface RpcAction {\n Transfer?: { deposit: string }\n FunctionCall?: { method_name: string; args: string; deposit: string; gas?: number }\n Delegate?: { delegate_action: { sender_id: string; receiver_id: string; actions: RpcAction[] } }\n [other: string]: unknown\n}\nexport interface RpcTxStatus {\n status?: Record<string, unknown>\n transaction?: { signer_id: string; receiver_id: string; hash?: string; actions?: RpcAction[] }\n transaction_outcome?: { outcome?: { tokens_burnt?: string; executor_id?: string; logs?: string[] } }\n receipts_outcome?: Array<{ outcome?: { executor_id?: string; tokens_burnt?: string; logs?: string[]; status?: Record<string, unknown> } }>\n}\n\nconst utf8 = (bytes: Uint8Array): string => {\n let s = ''\n for (let i = 0; i < bytes.length; ) {\n const b0 = bytes[i++]!\n let cp: number\n if (b0 < 0x80) cp = b0\n else if (b0 < 0xe0) cp = ((b0 & 0x1f) << 6) | (bytes[i++]! & 0x3f)\n else if (b0 < 0xf0) cp = ((b0 & 0x0f) << 12) | ((bytes[i++]! & 0x3f) << 6) | (bytes[i++]! & 0x3f)\n else cp = ((b0 & 0x07) << 18) | ((bytes[i++]! & 0x3f) << 12) | ((bytes[i++]! & 0x3f) << 6) | (bytes[i++]! & 0x3f)\n s += String.fromCodePoint(cp)\n }\n return s\n}\n\n/** Rebuild transfers / call / fee / status exactly from an `EXPERIMENTAL_tx_status` result. */\nexport function mapRpcTxStatus(chain: string, address: string, r: RpcTxStatus, base?: NearChainTx): NearChainTx {\n const tx = r.transaction\n const transfers: ChainTransfer[] = []\n const programs: string[] = []\n let call: ChainCall | undefined\n const walk = (actions: RpcAction[] | undefined, from: string, to: string) => {\n for (const a of actions ?? []) {\n if (a.Transfer) {\n const d = BigInt(a.Transfer.deposit)\n if (d > 0n) transfers.push({ token: null, from, to, amount: d })\n } else if (a.FunctionCall) {\n const d = BigInt(a.FunctionCall.deposit || '0')\n programs.push(a.FunctionCall.method_name)\n if (d > 0n && d !== ONE_YOCTO) transfers.push({ token: null, from, to, amount: d })\n call ??= { to, method: a.FunctionCall.method_name, programs }\n } else if (a.Delegate) {\n walk(a.Delegate.delegate_action.actions, a.Delegate.delegate_action.sender_id, a.Delegate.delegate_action.receiver_id)\n } else {\n const name = Object.keys(a)[0]\n if (name) {\n const method = name.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase()\n programs.push(method)\n call ??= { to, method, programs }\n }\n }\n }\n }\n if (tx) walk(tx.actions, tx.signer_id, tx.receiver_id)\n let fee = 0n\n const burnt = r.transaction_outcome?.outcome?.tokens_burnt\n if (burnt) fee += BigInt(burnt)\n let failed = false\n for (const ro of r.receipts_outcome ?? []) {\n const o = ro.outcome\n if (!o) continue\n if (o.tokens_burnt) fee += BigInt(o.tokens_burnt)\n if (o.status && 'Failure' in o.status) failed = true\n const token = o.executor_id\n for (const log of o.logs ?? []) {\n if (!token) continue\n const legacy = /^Transfer (\\d+) from (\\S+) to (\\S+)$/.exec(log)\n if (legacy) {\n transfers.push({ token, from: legacy[2]!, to: legacy[3]!, amount: BigInt(legacy[1]!), standard: 'nep141' })\n continue\n }\n if (!log.startsWith('EVENT_JSON:')) continue\n let ev: { standard?: string; event?: string; data?: Array<{ old_owner_id?: string; new_owner_id?: string; owner_id?: string; amount?: string }> }\n try {\n ev = JSON.parse(log.slice('EVENT_JSON:'.length)) as typeof ev\n } catch {\n continue\n }\n if (ev.standard !== 'nep141') continue\n for (const d of ev.data ?? []) {\n if (!d.amount || !/^\\d+$/.test(d.amount)) continue\n if (ev.event === 'ft_transfer' && d.old_owner_id && d.new_owner_id) transfers.push({ token, from: d.old_owner_id, to: d.new_owner_id, amount: BigInt(d.amount), standard: 'nep141' })\n else if (ev.event === 'ft_mint' && d.owner_id) transfers.push({ token, from: token, to: d.owner_id, amount: BigInt(d.amount), standard: 'nep141' })\n else if (ev.event === 'ft_burn' && d.owner_id) transfers.push({ token, from: d.owner_id, to: token, amount: BigInt(d.amount), standard: 'nep141' })\n }\n }\n }\n if (r.status && 'Failure' in r.status) failed = true\n // Keep symbol / decimals nearblocks knew for the same token.\n for (const t of transfers) {\n const known = base?.transfers.find((x) => x.token === t.token && (x.symbol !== undefined || x.decimals !== undefined))\n if (known?.symbol !== undefined) t.symbol = known.symbol\n if (known?.decimals !== undefined) t.decimals = known.decimals\n }\n const from = tx?.signer_id ?? base?.from ?? address\n const involves = (t: ChainTransfer) => t.from === address || t.to === address\n const primary = transfers.find((t) => t.token !== null && involves(t)) ?? transfers.find(involves) ?? transfers[0]\n let nativeValue = 0n\n for (const t of transfers) if (t.token === null && t.from === from) nativeValue += t.amount\n const raw: NearHistoryRaw = { ...(base?.raw ?? { receipts: [], ft: [] }), rpc: r }\n delete raw.approximate\n const out: NearChainTx = {\n chain, hash: tx?.hash ?? base?.hash ?? '', time: base?.time ?? 0, status: failed ? 'failed' : 'confirmed', address, from,\n to: call?.to ?? primary?.to ?? tx?.receiver_id ?? base?.to ?? null, nativeValue, transfers, fee, raw,\n }\n if (call) out.call = call\n if (base?.block !== undefined) out.block = base.block\n return out\n}\n\n/** Decode `FunctionCall.args` (base64 JSON) — exported for callers that want the arguments of a call. */\nexport function decodeFunctionCallArgs(args: string): unknown {\n try {\n return JSON.parse(utf8(fromBase64(args)))\n } catch {\n return undefined\n }\n}\n\n// ── Source ───────────────────────────────────────────────────────────────────\n\n/** Nearblocks link for a transaction. */\nexport function nearExplorerTxUrl(hash: string, network: 'mainnet' | 'testnet' = 'mainnet'): string {\n return `https://${network === 'testnet' ? 'testnet.' : ''}nearblocks.io/txns/${hash}`\n}\n\n/** A history source for NEAR accounts backed by nearblocks. */\nexport function createNearHistory(options: NearHistoryOptions = {}): NearHistorySource {\n const network = options.network ?? 'mainnet'\n const chain = CAIP2[network] ?? CAIP2.mainnet!\n const base = (options.nearblocksUrl ?? (network === 'testnet' ? 'https://api-testnet.nearblocks.io' : 'https://api.nearblocks.io')).replace(/\\/+$/, '')\n const fetchFn: HistoryFetch = options.fetch ?? ((globalThis as { fetch?: HistoryFetch }).fetch as HistoryFetch)\n if (typeof fetchFn !== 'function') throw new Error('@anywalletkit/wallet-near: no global fetch; pass `fetch` in the options')\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const bucket = new TokenBucket(options.rateLimit ?? (options.apiKey ? 5 : 0.1))\n\n async function get(path: string): Promise<unknown> {\n await bucket.acquire()\n const url = `${base}${path}`\n let res: Awaited<ReturnType<HistoryFetch>>\n try {\n const signal = timeoutSignal(timeoutMs)\n res = await fetchFn(url, { headers: { accept: 'application/json', ...(options.apiKey ? { authorization: `Bearer ${options.apiKey}` } : {}) }, ...(signal ? { signal } : {}) })\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n throw new HistoryUnavailableError(chain, `${path}: ${msg}`, [`nearblocks: ${msg}`])\n }\n const text = await res.text()\n let body: unknown\n try {\n body = parseJsonPreservingBigInts(text)\n } catch {\n body = undefined\n }\n if (!res.ok) {\n const msg = (body as { message?: string } | undefined)?.message ?? `HTTP ${res.status}`\n throw new HistoryUnavailableError(chain, `${path}: ${msg}`, [`nearblocks: HTTP ${res.status} ${msg}`])\n }\n return body\n }\n\n async function rpcTxStatus(hash: string, signer: string): Promise<RpcTxStatus | undefined> {\n if (!options.rpcUrl) return undefined\n const signal = timeoutSignal(timeoutMs)\n const res = await fetchFn(options.rpcUrl, {\n method: 'POST', headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ jsonrpc: '2.0', id: '1', method: 'EXPERIMENTAL_tx_status', params: { tx_hash: hash, sender_account_id: signer, wait_until: 'NONE' } }),\n ...(signal ? { signal } : {}),\n })\n const json = JSON.parse(await res.text()) as { result?: RpcTxStatus; error?: unknown }\n if (!res.ok || json.error || !json.result) return undefined\n return json.result\n }\n\n return {\n chain,\n\n async listActivity(address: string, query: HistoryQuery = {}): Promise<NearHistoryPage> {\n const limit = Math.min(MAX_LIMIT, Math.max(1, Math.floor(query.limit ?? DEFAULT_LIMIT)))\n const cursor = query.cursor ? decodeCursor(query.cursor) : { v: 1 as const, tx: '', ft: '' }\n const acct = encodeURIComponent(address)\n // Receipt rows come ~2 per transaction (the call and its refund), so the receipt list is asked for twice the limit.\n // Each list is asked for one row more than it uses: that row tells whether the page's last transaction goes on (round 3, M13).\n const perPage = Math.min(MAX_LIMIT - 1, limit * 2)\n const ftPer = Math.min(MAX_LIMIT - 1, limit)\n const txFetched: NearblocksReceiptRow[] = cursor.tx === null ? [] : (((await get(`/v1/account/${acct}/txns?per_page=${perPage + 1}&order=desc${cursor.tx ? `&cursor=${encodeURIComponent(cursor.tx)}` : ''}`)) as { txns?: NearblocksReceiptRow[] } | undefined)?.txns ?? [])\n const ftFetched: NearblocksFtRow[] = cursor.ft === null ? [] : (((await get(`/v1/account/${acct}/ft-txns?per_page=${ftPer + 1}&order=desc${cursor.ft ? `&cursor=${encodeURIComponent(cursor.ft)}` : ''}`)) as { txns?: NearblocksFtRow[] } | undefined)?.txns ?? [])\n // Rows of a transaction an earlier page already emitted (it had more rows than a page) are consumed silently.\n const skip = new Set(cursor.skip ?? [])\n const leading = (rows: Array<{ transaction_hash: string }>) => { let n = 0; while (n < rows.length && skip.has(rows[n]!.transaction_hash)) n++; return n }\n const txSkipped = leading(txFetched)\n const ftSkipped = leading(ftFetched)\n const txAll = txFetched.slice(txSkipped)\n const ftAll = ftFetched.slice(ftSkipped)\n const txRows = txAll.slice(0, perPage)\n const ftRows = ftAll.slice(0, ftPer)\n // A list that came back full goes on past this page, whatever was skipped.\n const txMore = txFetched.length > perPage\n const ftMore = ftFetched.length > ftPer\n // Global order by the transaction's block time; emit the top `limit` hashes plus ties, so each list's consumed rows are a prefix.\n const key = (r: { block_timestamp: string | number }) => BigInt(typeof r.block_timestamp === 'string' ? r.block_timestamp : Math.trunc(r.block_timestamp))\n const all = [...txRows.map((r) => ({ k: key(r), h: r.transaction_hash })), ...ftRows.map((r) => ({ k: key(r), h: r.transaction_hash }))]\n all.sort((a, b) => (a.k > b.k ? -1 : a.k < b.k ? 1 : 0))\n // A transaction whose rows go on past the page (the lookahead row is the same transaction) waits\n // for the next page, whole, so it is emitted once (round 3, M13). When it is all this page has\n // (more rows than a page), it goes out with the rows that fit and the next cursor skips the rest.\n const cut = new Set<string>()\n // The lookahead row when there is one; after skipped rows there may be none, and the last transaction may go on.\n const goesOnPast = (rows: Array<{ transaction_hash: string }>, all: Array<{ transaction_hash: string }>, per: number, more: boolean) => {\n const last = rows[rows.length - 1]\n if (!more || !last) return\n const next = all[per]\n if (next === undefined || next.transaction_hash === last.transaction_hash) cut.add(last.transaction_hash)\n }\n goesOnPast(txRows, txAll, perPage, txMore)\n goesOnPast(ftRows, ftAll, ftPer, ftMore)\n const partial = all.length > 0 && all.every((e) => cut.has(e.h)) ? [...cut] : []\n if (partial.length) cut.clear()\n const chosen = new Set<string>()\n let boundary: bigint | undefined\n for (const e of all) {\n if (chosen.has(e.h) || cut.has(e.h)) continue\n if (chosen.size >= limit && boundary !== undefined && e.k < boundary) break\n chosen.add(e.h)\n if (chosen.size === limit) boundary = e.k\n }\n // Consumed = the skipped rows, then the prefix of each list whose hashes were chosen; a list is\n // exhausted once nothing lies past the page and it was fully consumed.\n const consume = <T extends { transaction_hash: string }>(fetched: T[], skipped: number, rows: T[], more: boolean, wasAt: string | null, pos: (r: T) => string): { used: T[]; next: string | null } => {\n if (wasAt === null) return { used: [], next: null }\n let n = 0\n while (n < rows.length && chosen.has(rows[n]!.transaction_hash)) n++\n const used = rows.slice(0, n)\n if (!more && n === rows.length) return { used, next: null }\n const last = n > 0 ? used[n - 1] : skipped > 0 ? fetched[skipped - 1] : undefined\n return { used, next: last ? pos(last) : wasAt }\n }\n const txC = consume(txFetched, txSkipped, txRows, txMore, cursor.tx, (r) => r.id)\n const ftC = consume(ftFetched, ftSkipped, ftRows, ftMore, cursor.ft, (r) => r.event_index)\n const nextTx = txC.next, nextFt = ftC.next\n const groups = new Map<string, { receipts: NearblocksReceiptRow[]; ft: NearblocksFtRow[] }>()\n for (const h of chosen) groups.set(h, { receipts: [], ft: [] })\n for (const r of txC.used) groups.get(r.transaction_hash)!.receipts.push(r)\n for (const r of ftC.used) groups.get(r.transaction_hash)!.ft.push(r)\n let items = [...groups.entries()].map(([, g]) => mapNearblocksGroup(chain, address, g.receipts, g.ft)).filter((t) => t.hash)\n items.sort((a, b) => b.time - a.time)\n let more = nextTx !== null || nextFt !== null\n if (query.since !== undefined) {\n const since = query.since\n if (items.some((t) => t.time < since)) more = false\n items = items.filter((t) => t.time >= since)\n }\n const page: NearHistoryPage = { items }\n // Emitted in part, or skipped through to the page's end: its remaining rows come next and are skipped.\n const goesOn = (fetched: Array<{ transaction_hash: string }>, skipped: number, rows: unknown[]) => (rows.length === 0 && skipped > 0 && skipped === fetched.length ? [fetched[skipped - 1]!.transaction_hash] : [])\n const nextSkip = [...new Set([...partial, ...goesOn(txFetched, txSkipped, txRows), ...goesOn(ftFetched, ftSkipped, ftRows)])]\n if (more) page.cursor = encodeCursor({ v: 1, tx: nextTx, ft: nextFt, ...(nextSkip.length ? { skip: nextSkip } : {}) })\n return page\n },\n\n async getTransaction(hash: string, address: string): Promise<NearChainTx | undefined> {\n const body = (await get(`/v1/txns/${encodeURIComponent(hash)}`)) as { txns?: NearblocksTxn[] } | undefined\n const txn = body?.txns?.[0]\n if (!txn) return undefined\n const base = mapNearblocksTxn(chain, address, txn)\n if (!options.rpcUrl) return base\n try {\n const r = await rpcTxStatus(hash, txn.signer_account_id)\n return r ? mapRpcTxStatus(chain, address, r, base) : base\n } catch {\n return base\n }\n },\n\n explorerTxUrl(hash: string): string {\n return nearExplorerTxUrl(hash, network)\n },\n }\n}\n","import { NetworkError } from '@anywalletkit/core'\nimport { NearRpcError } from './errors.js'\nimport type { NearConfig, NearFetch } from './types.js'\n\n/** Base64 helpers that work in Node, browsers and Hermes (no Buffer). */\nexport function toBase64(bytes: Uint8Array): string {\n if (typeof btoa === 'function') {\n let s = ''\n for (let i = 0; i < bytes.length; i += 0x8000) s += String.fromCharCode.apply(null, Array.from(bytes.subarray(i, i + 0x8000)))\n return btoa(s)\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (globalThis as any).Buffer.from(bytes).toString('base64')\n}\nexport function fromBase64(s: string): Uint8Array {\n if (typeof atob === 'function') {\n const bin = atob(s)\n const out = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i)\n return out\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new Uint8Array((globalThis as any).Buffer.from(s, 'base64'))\n}\n\n/** Default per-request timeout for url providers. */\nexport const DEFAULT_TIMEOUT_MS = 15_000\n\n/** A signal that aborts after `ms`: `AbortSignal.timeout` where the runtime has it, else a timer (Hermes without runtime-hermes). */\nfunction timeoutSignal(ms: number): AbortSignal | undefined {\n if (typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function') return AbortSignal.timeout(ms)\n if (typeof AbortController === 'undefined') return undefined\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(new Error(`timed out after ${ms} ms`)), ms) as unknown as { unref?: () => void }\n timer.unref?.()\n return controller.signal\n}\n\nfunction httpTransport(url: string, headers: Record<string, string> | undefined, timeoutMs: number): NearFetch {\n let id = 0\n return async (method, params) => {\n const signal = timeoutSignal(timeoutMs)\n let res: Response\n try {\n res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json', ...headers },\n body: JSON.stringify({ jsonrpc: '2.0', id: String(++id), method, params }),\n ...(signal ? { signal } : {}),\n })\n } catch (e) {\n throw new NetworkError(`${method}: ${signal?.aborted ? `no answer within ${timeoutMs} ms` : 'request failed'}`, { provider: url, cause: e })\n }\n if (!res.ok) throw new NetworkError(`${method}: HTTP ${res.status}`, { provider: url })\n const json = (await res.json()) as { result?: unknown; error?: { name?: string; message?: string; cause?: { name?: string }; data?: unknown; code?: number } }\n if (json.error) throw new NearRpcError(method, json.error)\n return json.result\n }\n}\n\n/** An `error` from the node is a definitive answer (unknown account, invalid tx…) — never failed over. */\nexport const isDefinitive = (e: unknown) => e instanceof NearRpcError && !/TIMEOUT|INTERNAL|UNAVAILABLE|NO_SYNCED/i.test(e.errorName ?? '')\n\n/** Methods that hand a signed transaction to the network: a lost answer is ambiguous, so they are never re-sent elsewhere. */\nconst BROADCAST_METHODS: ReadonlySet<string> = new Set(['send_tx', 'broadcast_tx_commit', 'broadcast_tx_async'])\n\n/**\n * One transport, or a failover transport over the list. Reads fail over on anything but a\n * definitive node answer; a broadcast is sent once — the account turns an unanswered one into\n * `BroadcastUnknownError`.\n */\nexport function createClient(config: NearConfig): NearFetch | undefined {\n if (config.provider === undefined) return undefined\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const list = (Array.isArray(config.provider) ? config.provider : [config.provider]).map((p) =>\n typeof p === 'string' ? httpTransport(p, config.headers, timeoutMs) : p,\n )\n if (list.length === 0) throw new Error(\"The 'provider' 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 async (method, params) => {\n if (BROADCAST_METHODS.has(method)) return list[0]!(method, params)\n let lastError: unknown\n for (let i = 0; i < attempts; i++) {\n try { return await list[i % list.length]!(method, params) } catch (e) {\n if (isDefinitive(e)) throw e\n lastError = e\n }\n }\n throw new NetworkError(`All NEAR providers failed for ${method}`, { cause: lastError })\n }\n}\n\n// ── Typed helpers over `query` ───────────────────────────────────────────────\n\nexport interface RawAccountView { amount: string; locked: string; storage_usage: number; code_hash?: string; block_height?: number; block_hash?: string }\nexport interface RawAccessKeyView { nonce: number; permission: 'FullAccess' | { FunctionCall: { allowance: string | null; receiver_id: string; method_names: string[] } }; block_hash?: string; block_height?: number }\nexport interface RawCallResult { result: number[]; logs?: string[]; block_hash?: string; block_height?: number; error?: string }\nexport interface RawFinalOutcome {\n status?: Record<string, unknown>\n final_execution_status?: string\n transaction?: { hash?: string; signer_id?: string }\n transaction_outcome?: { id?: string; block_hash?: string; outcome?: { status?: Record<string, unknown>; gas_burnt?: number; tokens_burnt?: string } }\n receipts_outcome?: Array<{ id?: string; block_hash?: string; outcome?: { status?: Record<string, unknown>; gas_burnt?: number; tokens_burnt?: string } }>\n}\n\nconst UNKNOWN = /UNKNOWN_ACCOUNT|UNKNOWN_ACCESS_KEY|UNKNOWN_TRANSACTION|does not exist/i\n\n/** The NEAR JSON-RPC calls a wallet uses, with parsed results. */\nexport class NearRpc {\n constructor(readonly fetch: NearFetch) {}\n\n /** `undefined` when the account does not exist. */\n async viewAccount(accountId: string): Promise<RawAccountView | undefined> {\n try {\n return (await this.fetch('query', { request_type: 'view_account', finality: 'final', account_id: accountId })) as RawAccountView\n } catch (e) {\n if (e instanceof NearRpcError && UNKNOWN.test(e.errorName ?? e.message)) return undefined\n throw e\n }\n }\n\n /** `undefined` when the key is not on the account. */\n async viewAccessKey(accountId: string, publicKey: string): Promise<RawAccessKeyView | undefined> {\n try {\n return (await this.fetch('query', { request_type: 'view_access_key', finality: 'final', account_id: accountId, public_key: publicKey })) as RawAccessKeyView\n } catch (e) {\n if (e instanceof NearRpcError && UNKNOWN.test(e.errorName ?? e.message)) return undefined\n throw e\n }\n }\n\n /** View call; the JSON-decoded return value (`null` for an empty result). */\n async callFunction<T = unknown>(contract: string, method: string, args: Record<string, unknown> = {}): Promise<T> {\n const r = (await this.fetch('query', {\n request_type: 'call_function', finality: 'final', account_id: contract, method_name: method, args_base64: toBase64(new TextEncoder().encode(JSON.stringify(args))),\n })) as RawCallResult\n if (r.error) throw new NearRpcError('query', { name: 'HANDLER_ERROR', message: r.error, cause: { name: 'CONTRACT_EXECUTION_ERROR' } })\n const text = new TextDecoder().decode(Uint8Array.from(r.result ?? []))\n if (!text.length) return null as T\n return JSON.parse(text) as T\n }\n\n async latestBlockHash(): Promise<string> {\n const b = (await this.fetch('block', { finality: 'final' })) as { header?: { hash?: string } }\n if (!b.header?.hash) throw new NetworkError('block: no header hash in the response')\n return b.header.hash\n }\n\n async gasPrice(): Promise<bigint> {\n const r = (await this.fetch('gas_price', [null])) as { gas_price?: string }\n if (!r.gas_price) throw new NetworkError('gas_price: no price in the response')\n return BigInt(r.gas_price)\n }\n\n async sendTx(signedTxBase64: string, waitUntil: 'NONE' | 'INCLUDED' | 'EXECUTED_OPTIMISTIC' | 'INCLUDED_FINAL' | 'EXECUTED' | 'FINAL' = 'EXECUTED_OPTIMISTIC'): Promise<RawFinalOutcome> {\n return (await this.fetch('send_tx', { signed_tx_base64: signedTxBase64, wait_until: waitUntil })) as RawFinalOutcome\n }\n\n /** `undefined` when the node does not know the transaction. */\n async txStatus(hash: string, senderId: string): Promise<RawFinalOutcome | undefined> {\n try {\n return (await this.fetch('tx', { tx_hash: hash, sender_account_id: senderId, wait_until: 'NONE' })) as RawFinalOutcome\n } catch (e) {\n if (e instanceof NearRpcError && UNKNOWN.test(e.errorName ?? e.message)) return undefined\n throw e\n }\n }\n}\n\n/** Human-readable failure from an execution `status` (`{Failure: {...}}`), or undefined on success. */\nexport function failureOf(status: Record<string, unknown> | undefined): string | undefined {\n if (!status || !('Failure' in status)) return undefined\n const f = status.Failure\n try {\n const json = JSON.stringify(f)\n const m = /\"ExecutionError\":\"([^\"]+)\"/.exec(json) ?? /\"error_message\":\"([^\"]+)\"/.exec(json) ?? /\"kind\":(\\{[^}]*\\})/.exec(json)\n return m?.[1] ?? json.slice(0, 300)\n } catch { return String(f) }\n}\n\n/** Did the whole transaction (every receipt) succeed? */\nexport function outcomeFailed(o: RawFinalOutcome): string | undefined {\n const top = failureOf(o.status)\n if (top) return top\n for (const r of o.receipts_outcome ?? []) {\n const f = failureOf(r.outcome?.status)\n if (f) return f\n }\n return undefined\n}\n","/** JSON-RPC transport: `method` + `params`, returns the `result` (throws on `error`). */\nexport type NearFetch = (method: string, params: unknown) => Promise<unknown>\n\n/** One RPC base url (e.g. \"https://free.rpc.fastnear.com\") or a ready transport. */\nexport type NearProvider = string | NearFetch\n\n/**\n * Options for a NEAR wallet manager or account: RPC endpoints, network, fee caps and the\n * pre-sign checks.\n */\nexport interface NearConfig {\n /** RPC url(s) / transport(s). A list fails over in order. Omit for an offline (sign-only) wallet. */\n provider?: NearProvider | NearProvider[]\n /** Extra attempts across the provider list after the first failure (default 3). */\n retries?: number\n /** Optional headers for every request (e.g. an API key). */\n headers?: Record<string, string>\n /** Per-request timeout for url providers, in ms (default 15 000): a node that never answers fails over (reads) or ends as \"maybe sent\" (`send_tx`). */\n timeoutMs?: number\n /** \"mainnet\" (default) | \"testnet\" | any CAIP-2 suffix. */\n network?: 'mainnet' | 'testnet' | string\n /** Max fee (yoctoNEAR) for `transfer`. */\n transferMaxFee?: bigint | number\n /** Max fee (yoctoNEAR) for `sendTransaction` / `signTransaction`. */\n transactionMaxFee?: bigint | number\n /** Run the balance / account / access-key preflight before signing (default true). */\n simulate?: boolean\n /**\n * Allow actions that change the account itself or deploy code (AddKey, DeleteKey,\n * DeleteAccount, DeployContract, Stake, CreateAccount, global-contract actions,\n * SignedDelegate). Default false: they are refused with `dangerous-action`.\n */\n allowDangerousActions?: boolean\n /**\n * Most yoctoNEAR a token `transfer` may attach as `storage_deposit` to register the\n * recipient (the amount comes from the token contract itself). Default 0.0125 NEAR,\n * ten times the usual NEP-145 minimum.\n */\n maxStorageDeposit?: bigint | number\n}\n\n// ── Actions ──────────────────────────────────────────────────────────────────\n\nexport interface NearTransferAction { transfer: { deposit: bigint } }\nexport interface NearFunctionCallAction {\n functionCall: {\n methodName: string\n /** Raw bytes, or a JSON-serialisable object / string (encoded as UTF-8 JSON). */\n args: Uint8Array | Record<string, unknown> | string\n /** Prepaid gas (default 30 Tgas). Max 300 Tgas. */\n gas?: bigint\n /** Attached deposit in yoctoNEAR (default 0). */\n deposit?: bigint\n }\n}\nexport interface NearCreateAccountAction { createAccount: Record<string, never> }\nexport interface NearDeployContractAction { deployContract: { code: Uint8Array } }\nexport interface NearStakeAction { stake: { stake: bigint; publicKey: NearPublicKey } }\n/** An access key's nonce and permission (full access or a function-call key). */\nexport interface NearAccessKey {\n nonce: bigint\n permission: { fullAccess: Record<string, never> } | { functionCall: { allowance?: bigint; receiverId: string; methodNames: string[] } }\n}\nexport interface NearAddKeyAction { addKey: { publicKey: NearPublicKey; accessKey: NearAccessKey } }\nexport interface NearDeleteKeyAction { deleteKey: { publicKey: NearPublicKey } }\nexport interface NearDeleteAccountAction { deleteAccount: { beneficiaryId: string } }\nexport interface NearDelegateAction {\n senderId: string\n receiverId: string\n actions: NearAction[]\n nonce: bigint\n maxBlockHeight: bigint\n publicKey: NearPublicKey\n}\nexport interface NearSignedDelegateAction { signedDelegate: { delegateAction: NearDelegateAction; signature: NearSignature } }\nexport interface NearDeployGlobalContractAction { deployGlobalContract: { code: Uint8Array; deployMode: 'codeHash' | 'accountId' } }\nexport interface NearUseGlobalContractAction { useGlobalContract: { codeHash: Uint8Array } | { accountId: string } }\n\n/** One action of a NEAR transaction. */\nexport type NearAction =\n | NearCreateAccountAction\n | NearDeployContractAction\n | NearFunctionCallAction\n | NearTransferAction\n | NearStakeAction\n | NearAddKeyAction\n | NearDeleteKeyAction\n | NearDeleteAccountAction\n | NearSignedDelegateAction\n | NearDeployGlobalContractAction\n | NearUseGlobalContractAction\n\n/** A public key as NEAR encodes it: curve tag + raw bytes. */\nexport interface NearPublicKey { keyType: 'ed25519' | 'secp256k1'; data: Uint8Array }\nexport interface NearSignature { keyType: 'ed25519' | 'secp256k1'; data: Uint8Array }\n\n/**\n * A transaction to sign. `signerId` / `publicKey` default to the account's; `nonce` /\n * `blockHash` are fetched from the network when omitted (the account `needsNetwork`).\n */\nexport interface NearTransaction {\n receiverId: string\n actions: NearAction[]\n signerId?: string\n publicKey?: NearPublicKey\n nonce?: bigint\n /** 32 bytes, or base58. */\n blockHash?: Uint8Array | string\n}\n\n/** Fully specified transaction as it is hashed and signed. */\nexport interface NearBuiltTransaction {\n signerId: string\n publicKey: NearPublicKey\n nonce: bigint\n receiverId: string\n blockHash: Uint8Array\n actions: NearAction[]\n}\n\nexport interface NearSignedTransaction { transaction: NearBuiltTransaction; signature: NearSignature }\n\n/** Shorthand for `transfer`: native NEAR (no `token`) or a NEP-141 token (`token` = contract account id). */\nexport interface NearTransferOptions {\n token?: string\n recipient: string\n amount: bigint | number | string\n /** NEP-141 `memo` (ignored for native transfers — NEAR transfers carry no memo). */\n memo?: string\n}\n\n// ── Fees / preflight ────────────────────────────────────────────────────────\n\n/** Gas a transaction may burn and its cost in yoctoNEAR. */\nexport interface NearFeeEstimate {\n /** Gas the transaction can burn at most (prepaid function-call gas counts in full). */\n gas: bigint\n /** yoctoNEAR per gas unit at quote time. */\n gasPrice: bigint\n /** Upper bound of the fee in yoctoNEAR (`gas * gasPrice`, plus the account-creation charge when `createsAccount`). */\n fee: bigint\n /** yoctoNEAR the actions attach (transfer deposits + function-call deposits). */\n deposit: bigint\n /** True when a native transfer will create an implicit account (extra gas included). */\n createsAccount: boolean\n}\n\n/** Fee of a transaction in yoctoNEAR, with the estimate behind it. */\nexport interface NearQuote {\n /** = `estimate.fee`. */\n fee: bigint\n estimate: NearFeeEstimate\n}\n\n/** Whether a transaction is expected to succeed, and why not. */\nexport interface NearSimulation {\n ok: boolean\n reason?: string\n}\n\n/** An account's balance, locked stake and storage. */\nexport interface NearAccountView {\n amount: bigint\n locked: bigint\n storageUsage: bigint\n /** `amount - locked - storageUsage * STORAGE_PRICE_PER_BYTE` (never below 0). */\n available: bigint\n}\n\n/** Outcome of a NEAR transaction. */\nexport interface NearReceipt {\n hash: string\n /** 1 success, 0 failed. */\n status: 0 | 1\n blockNumber?: bigint\n /** Decoded failure, when any receipt failed. */\n failure?: string\n /** Raw `tx` RPC payload. */\n raw: Record<string, unknown>\n}\n\n// ── Describe ─────────────────────────────────────────────────────────────────\n\n/** What a NEAR transaction does. */\nexport type NearTxKind =\n | 'near-transfer'\n | 'ft-transfer'\n | 'ft-storage-deposit'\n | 'function-call'\n | 'batch'\n | 'create-account'\n | 'deploy-contract'\n | 'stake'\n | 'add-key'\n | 'delete-key'\n | 'delete-account'\n | 'delegate'\n | 'global-contract'\n/** Problems a NEAR description is flagged with. */\nexport type NearTxWarningCode = 'dangerous-action' | 'full-access-key' | 'zero-amount' | 'implicit-new-account' | 'self-transfer' | 'high-gas' | 'unknown-method' | 'invalid-account'\n/** One flagged problem, with a sentence a wallet can show. */\nexport interface NearTxWarning { code: NearTxWarningCode; message: string }\n\n/** A NEAR transaction decoded for a confirmation screen. */\nexport interface NearTxDescription {\n kind: NearTxKind\n warnings: NearTxWarning[]\n /** Signer account id when known. */\n from?: string\n /** Receiver account id (native transfer) or NEP-141 `receiver_id` (ft-transfer). */\n to?: string\n /** yoctoNEAR (native) or token base units (ft-transfer). */\n amount?: bigint\n /** NEP-141 contract account id. */\n token?: string\n /** NEP-141 memo. */\n memo?: string\n /** Called contract (function-call / batch). */\n contract?: string\n /** Methods called, in order. */\n methods?: string[]\n /** Total yoctoNEAR attached across actions. */\n deposit: bigint\n /** Total prepaid gas across function calls. */\n gas: bigint\n actionCount: number\n}\n\n// ── Constants ────────────────────────────────────────────────────────────────\n\n/** CAIP-2 ids of NEAR mainnet and testnet. */\nexport const CAIP2: Record<string, string> = { mainnet: 'near:mainnet', testnet: 'near:testnet' }\n\n/** 1 NEAR = 10^24 yoctoNEAR. */\nexport const YOCTO = 10n ** 24n\n/** 1 Tgas. */\nexport const TGAS = 10n ** 12n\n/** Hard per-transaction prepaid gas limit. */\nexport const MAX_GAS = 300n * TGAS\n/** Protocol storage price: 10^19 yoctoNEAR per byte. */\nexport const STORAGE_PRICE_PER_BYTE = 10n ** 19n\n/** NEP-141 `ft_transfer` requires exactly 1 yoctoNEAR attached. */\nexport const ONE_YOCTO = 1n\n/** Default gas for `ft_transfer` / `storage_deposit`. */\nexport const FT_TRANSFER_GAS = 30n * TGAS\n/** Gas attached to a NEP-145 `storage_deposit` call. */\nexport const STORAGE_DEPOSIT_GAS = 10n * TGAS\n/** Minimum native transfer that can create an implicit account (covers its storage). */\nexport const IMPLICIT_ACCOUNT_MIN_DEPOSIT = 2n * 10n ** 21n // 0.002 NEAR\n"],"mappings":"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","names":["import_core","from","all","more","base"]}
1
+ {"version":3,"sources":["../src/history.ts","../src/rpc.ts","../src/types.ts"],"sourcesContent":["/**\n * Activity history for NEAR: a `HistorySource` over the nearblocks API\n * (`/v1/account/{id}/txns` receipt rows + `/v1/account/{id}/ft-txns` NEP-141\n * movements, merged by transaction hash), with an optional archival RPC\n * (`EXPERIMENTAL_tx_status`) that makes single-transaction reads exact.\n *\n * nearblocks serializes large yoctoNEAR amounts as JSON numbers; integer\n * literals are kept exact by re-quoting them before `JSON.parse`, values the\n * API already rounded (`7e+23`) stay approximate and are flagged in `raw`.\n * Both lists page by keyset cursor (`id` / `event_index`), merged newest-first.\n * `fetch` + `AbortSignal.timeout` only — Hermes-safe.\n */\nimport type { ChainCall, ChainTransfer, ChainTx, HistoryPage, HistoryQuery, HistorySource } from '@anywalletkit/core'\nimport { fromBase64 } from './rpc.js'\nimport { CAIP2 } from './types.js'\nimport { bigintToNumber } from '@anywalletkit/core'\n\n// ── Public types ─────────────────────────────────────────────────────────────\n\nexport type HistoryFetch = (\n input: string,\n init?: { method?: string; headers?: Record<string, string>; body?: string; signal?: AbortSignal },\n) => Promise<{ ok: boolean; status: number; text(): Promise<string> }>\n\n/** Options for {@link createNearHistory}. */\nexport interface NearHistoryOptions {\n /** nearblocks root. Default `https://api.nearblocks.io` (`https://api-testnet.nearblocks.io` on testnet). */\n nearblocksUrl?: string\n /** nearblocks Bearer key. Keyless use is limited to a few requests per minute. */\n apiKey?: string\n /** Archival JSON-RPC (`https://archival-rpc.mainnet.near.org`). When set, `getTransaction` is refined with exact amounts, fee and NEP-141 events. */\n rpcUrl?: string\n network?: 'mainnet' | 'testnet'\n fetch?: HistoryFetch\n /** nearblocks requests per second. Default 0.1 (6/min) without a key, 5 with one. */\n rateLimit?: number\n /** Per request, ms. Default 15 000. */\n timeoutMs?: number\n}\n\nexport interface NearHistoryRaw {\n /** nearblocks receipt rows of this transaction (account `/txns`). */\n receipts: NearblocksReceiptRow[]\n /** nearblocks NEP-141 rows of this transaction (account `/ft-txns`). */\n ft: NearblocksFtRow[]\n /** `/v1/txns/{hash}` row (single-transaction reads). */\n txn?: NearblocksTxn\n /** `EXPERIMENTAL_tx_status` result when the RPC answered. */\n rpc?: RpcTxStatus\n /** Set when an amount or the fee came from a value nearblocks had already rounded to a double. */\n approximate?: true\n}\n\nexport interface NearChainTx extends ChainTx {\n raw: NearHistoryRaw\n}\n\nexport interface NearHistoryPage extends HistoryPage {\n items: NearChainTx[]\n}\n\n/**\n * NEAR history from the nearblocks API, with an archival RPC for single transactions. Build it with\n * {@link createNearHistory}.\n */\nexport interface NearHistorySource extends HistorySource {\n listActivity(address: string, query?: HistoryQuery): Promise<NearHistoryPage>\n getTransaction(hash: string, address: string): Promise<NearChainTx | undefined>\n}\n\n/** Every configured history backend failed. */\nexport class HistoryUnavailableError extends Error {\n readonly chain: string\n readonly reason: string\n readonly attempts: readonly string[]\n constructor(chain: string, reason: string, attempts: readonly string[] = []) {\n super(`History unavailable for ${chain}: ${reason}`)\n this.name = 'HistoryUnavailableError'\n this.chain = chain\n this.reason = reason\n this.attempts = attempts\n }\n}\n\nconst DEFAULT_LIMIT = 25\nconst MAX_LIMIT = 25\nconst DEFAULT_TIMEOUT_MS = 15_000\n/** NEP-141 convention: 1 yoctoNEAR attached to prove a full-access key; not a payment. */\nconst ONE_YOCTO = 1n\n\n// ── Cursor: per-list keyset positions, base64 JSON ───────────────────────────\n\nexport interface NearHistoryCursor {\n v: 1\n /** `/txns`: `id` of the last consumed row; '' = not started; null = exhausted. */\n tx: string | null\n /** `/ft-txns`: `event_index` of the last consumed row; '' = not started; null = exhausted. */\n ft: string | null\n /**\n * Transactions already emitted that have rows on the next page: a transaction with more receipt\n * rows than a page goes out with the rows that fit, and the rest are consumed without emitting it\n * again (round 3, M13).\n */\n skip?: string[]\n}\n\nconst B64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\nfunction b64encode(s: string): string {\n let out = ''\n for (let i = 0; i < s.length; i += 3) {\n const c = [s.charCodeAt(i), s.charCodeAt(i + 1), s.charCodeAt(i + 2)]\n for (const x of c) if (x > 0xff) throw new Error('cursor must be ASCII')\n const n = (c[0]! << 16) | ((c[1]! || 0) << 8) | (c[2]! || 0)\n out += B64[(n >> 18) & 63]! + B64[(n >> 12) & 63]! + (Number.isNaN(c[1]) ? '=' : B64[(n >> 6) & 63]!) + (Number.isNaN(c[2]) ? '=' : B64[n & 63]!)\n }\n return out\n}\n\nfunction b64decode(s: string): string {\n const clean = s.replace(/[^A-Za-z0-9+/]/g, '')\n let out = ''\n for (let i = 0; i < clean.length; i += 4) {\n const c = [0, 1, 2, 3].map((k) => (i + k < clean.length ? B64.indexOf(clean[i + k]!) : -1))\n if (c[0]! < 0 || c[1]! < 0) throw new Error('bad base64')\n const n = (c[0]! << 18) | (c[1]! << 12) | ((c[2]! < 0 ? 0 : c[2]!) << 6) | (c[3]! < 0 ? 0 : c[3]!)\n out += String.fromCharCode((n >> 16) & 0xff)\n if (c[2]! >= 0) out += String.fromCharCode((n >> 8) & 0xff)\n if (c[3]! >= 0) out += String.fromCharCode(n & 0xff)\n }\n return out\n}\n\nexport function encodeCursor(c: NearHistoryCursor): string {\n return b64encode(JSON.stringify(c))\n}\n\nexport function decodeCursor(s: string): NearHistoryCursor {\n let parsed: unknown\n try {\n parsed = JSON.parse(b64decode(s))\n } catch {\n throw new Error('@anywalletkit/wallet-near: malformed history cursor')\n }\n const c = parsed as Partial<NearHistoryCursor> | null\n const ok = (v: unknown) => v === null || typeof v === 'string'\n if (!c || c.v !== 1 || !ok(c.tx) || !ok(c.ft)) throw new Error('@anywalletkit/wallet-near: malformed history cursor')\n if (c.skip !== undefined && (!Array.isArray(c.skip) || c.skip.length > 4 || !c.skip.every((h) => typeof h === 'string'))) throw new Error('@anywalletkit/wallet-near: malformed history cursor')\n return { v: 1, tx: c.tx as string | null, ft: c.ft as string | null, ...(c.skip?.length ? { skip: c.skip } : {}) }\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nclass TokenBucket {\n private tokens: number\n private last = Date.now()\n private chain: Promise<void> = Promise.resolve()\n constructor(private readonly rate: number, private readonly burst = Math.max(2, Math.ceil(rate))) {\n this.tokens = burst\n }\n acquire(): Promise<void> {\n const next = this.chain.then(() => this.take())\n this.chain = next.catch(() => undefined)\n return next\n }\n private refill(): void {\n const now = Date.now()\n this.tokens = Math.min(this.burst, this.tokens + ((now - this.last) / 1000) * this.rate)\n this.last = now\n }\n private async take(): Promise<void> {\n this.refill()\n if (this.tokens >= 1) {\n this.tokens -= 1\n return\n }\n await new Promise((r) => setTimeout(r, Math.ceil(((1 - this.tokens) / this.rate) * 1000)))\n this.refill()\n this.tokens = Math.max(0, this.tokens - 1)\n }\n}\n\nfunction timeoutSignal(ms: number): AbortSignal | undefined {\n const ctor = (globalThis as { AbortSignal?: { timeout?: (ms: number) => AbortSignal } }).AbortSignal\n return typeof ctor?.timeout === 'function' ? ctor.timeout(ms) : undefined\n}\n\n/**\n * `JSON.parse` that keeps integer literals of 16+ digits exact by quoting them\n * first (outside strings only). Numbers with a fraction or exponent are left\n * to the double parser — nearblocks already rounded those.\n */\nexport function parseJsonPreservingBigInts(text: string): unknown {\n let out = ''\n let i = 0\n let inString = false\n while (i < text.length) {\n const ch = text[i]!\n if (inString) {\n out += ch\n if (ch === '\\\\') {\n out += text[i + 1] ?? ''\n i += 2\n continue\n }\n if (ch === '\"') inString = false\n i++\n continue\n }\n if (ch === '\"') {\n inString = true\n out += ch\n i++\n continue\n }\n if (ch === '-' || (ch >= '0' && ch <= '9')) {\n let j = i\n if (text[j] === '-') j++\n while (j < text.length && text[j]! >= '0' && text[j]! <= '9') j++\n const next = text[j]\n const isInteger = next !== '.' && next !== 'e' && next !== 'E'\n if (isInteger) {\n const tok = text.slice(i, j)\n out += tok.replace('-', '').length >= 16 ? `\"${tok}\"` : tok\n i = j\n continue\n }\n while (j < text.length && /[0-9.eE+-]/.test(text[j]!)) j++\n out += text.slice(i, j)\n i = j\n continue\n }\n out += ch\n i++\n }\n return JSON.parse(out)\n}\n\n/** Number / decimal string → bigint; `approx` is set when a double had to be used. */\nfunction big(v: unknown, approx: { value: boolean }): bigint | undefined {\n if (typeof v === 'bigint') return v\n if (typeof v === 'string' && /^-?\\d+$/.test(v)) return BigInt(v)\n if (typeof v === 'number' && Number.isFinite(v)) {\n if (!Number.isSafeInteger(v)) approx.value = true\n return BigInt(Math.trunc(v))\n }\n return undefined\n}\n\nconst nsToSeconds = (ts: unknown): number => {\n if (typeof ts === 'string' && /^\\d+$/.test(ts)) return bigintToNumber(BigInt(ts) / 1_000_000_000n)\n if (typeof ts === 'number') return Math.floor(ts / 1e9)\n return 0\n}\n\n// ── nearblocks shapes ────────────────────────────────────────────────────────\n\nexport interface NearblocksAction {\n action: string\n method?: string | null\n deposit?: number | string | null\n args?: string | null\n}\nexport interface NearblocksReceiptRow {\n id: string\n receipt_id?: string\n predecessor_account_id: string\n receiver_account_id: string\n receipt_kind?: string\n transaction_hash: string\n /** ns, decimal string (the transaction's block). */\n block_timestamp: string | number\n block?: { block_height?: number }\n actions?: NearblocksAction[] | null\n outcomes?: { status?: boolean | null }\n outcomes_agg?: { transaction_fee?: number | string | null }\n}\nexport interface NearblocksFtRow {\n event_index: string\n affected_account_id: string\n involved_account_id?: string | null\n /** Signed, decimal string (exact). */\n delta_amount: string | number\n cause?: string\n transaction_hash: string\n block_timestamp: string | number\n block?: { block_height?: number }\n outcomes?: { status?: boolean | null }\n ft?: { contract: string; symbol?: string | null; decimals?: number | null }\n ft_meta?: { contract: string; symbol?: string | null; decimals?: number | null }\n}\nexport interface NearblocksTxn {\n transaction_hash: string\n block_timestamp: string | number\n signer_account_id: string\n receiver_account_id: string\n block?: { block_height?: number }\n actions?: NearblocksAction[] | null\n outcomes?: { status?: boolean | null }\n outcomes_agg?: { transaction_fee?: number | string | null }\n receipts?: Array<{ fts?: Array<Pick<NearblocksFtRow, 'affected_account_id' | 'involved_account_id' | 'delta_amount' | 'cause' | 'ft_meta'>> }>\n}\n\nfunction ftTransfer(row: Pick<NearblocksFtRow, 'affected_account_id' | 'involved_account_id' | 'delta_amount' | 'cause' | 'ft' | 'ft_meta'>, approx: { value: boolean }): ChainTransfer | undefined {\n const meta = row.ft ?? row.ft_meta\n if (!meta?.contract) return undefined\n const delta = big(row.delta_amount, approx)\n if (delta === undefined || delta === 0n) return undefined\n const other = row.involved_account_id ?? meta.contract\n const t: ChainTransfer = { token: meta.contract, from: delta < 0n ? row.affected_account_id : other, to: delta < 0n ? other : row.affected_account_id, amount: delta < 0n ? -delta : delta, standard: 'nep141' }\n if (typeof meta.symbol === 'string') t.symbol = meta.symbol\n if (typeof meta.decimals === 'number') t.decimals = meta.decimals\n return t\n}\n\ninterface ActionFold {\n transfers: ChainTransfer[]\n programs: string[]\n call?: ChainCall\n}\n\n/** Fold nearblocks actions of one receipt (predecessor → receiver) into transfers / call; the first non-transfer action becomes the call. */\nfunction foldActions(actions: NearblocksAction[] | null | undefined, from: string, to: string, fold: ActionFold, approx: { value: boolean }): void {\n for (const a of actions ?? []) {\n const deposit = big(a.deposit, approx) ?? 0n\n if (a.action === 'TRANSFER') {\n if (deposit > 0n) fold.transfers.push({ token: null, from, to, amount: deposit })\n continue\n }\n if (a.action === 'DELEGATE_ACTION') continue\n const method = a.action === 'FUNCTION_CALL' ? (a.method ?? 'function_call') : a.action.toLowerCase()\n fold.programs.push(method)\n if (a.action === 'FUNCTION_CALL' && deposit > 0n && deposit !== ONE_YOCTO) fold.transfers.push({ token: null, from, to, amount: deposit })\n fold.call ??= { to, method, programs: fold.programs }\n }\n}\n\n/** One transaction from its nearblocks receipt rows + NEP-141 rows. */\nexport function mapNearblocksGroup(chain: string, address: string, receipts: NearblocksReceiptRow[], ft: NearblocksFtRow[]): NearChainTx {\n const approx = { value: false }\n const rows = [...receipts].sort((a, b) => (BigInt(a.id) < BigInt(b.id) ? -1 : BigInt(a.id) > BigInt(b.id) ? 1 : 0))\n const real = rows.filter((r) => r.predecessor_account_id !== 'system' && (r.receipt_kind ?? 'ACTION') === 'ACTION')\n const fold: ActionFold = { transfers: [], programs: [] }\n // The receipt addressed to someone else carries the call that matters; a receipt to ourselves (delegate wrapper, refund) is secondary.\n const ordered = [...real.filter((r) => r.receiver_account_id !== address), ...real.filter((r) => r.receiver_account_id === address)]\n for (const r of ordered) foldActions(r.actions, r.predecessor_account_id, r.receiver_account_id, fold, approx)\n for (const f of ft) {\n const t = ftTransfer(f, approx)\n if (t) fold.transfers.push(t)\n }\n const head = ordered[0] ?? rows[0] ?? ft[0]\n const hash = head?.transaction_hash ?? ''\n const from = ordered[0]?.predecessor_account_id ?? (ft.length ? (ftTransfer(ft[0]!, approx)?.from ?? address) : address)\n const involves = (t: ChainTransfer) => t.from === address || t.to === address\n const primary = fold.transfers.find((t) => t.token !== null && involves(t)) ?? fold.transfers.find(involves) ?? fold.transfers[0]\n const to = fold.call?.to ?? primary?.to ?? ordered[0]?.receiver_account_id ?? null\n let nativeValue = 0n\n for (const t of fold.transfers) if (t.token === null && t.from === from) nativeValue += t.amount\n const statuses = [...rows.map((r) => r.outcomes?.status), ...ft.map((r) => r.outcomes?.status)].filter((s): s is boolean => typeof s === 'boolean')\n const status: ChainTx['status'] = statuses.length === 0 ? 'confirmed' : statuses.every(Boolean) ? 'confirmed' : 'failed'\n const feeSrc = rows.find((r) => r.outcomes_agg?.transaction_fee != null)?.outcomes_agg?.transaction_fee\n const fee = big(feeSrc, approx)\n const heights = [...rows, ...ft].map((r) => r.block?.block_height).filter((h): h is number => typeof h === 'number')\n const raw: NearHistoryRaw = { receipts: rows, ft }\n if (approx.value) raw.approximate = true\n const out: NearChainTx = {\n chain, hash, time: nsToSeconds(head?.block_timestamp), status, address, from, to, nativeValue, transfers: fold.transfers, raw,\n }\n if (fee !== undefined) out.fee = fee\n if (fold.call) out.call = fold.call\n if (heights.length) out.block = BigInt(Math.min(...heights))\n return out\n}\n\n/** `/v1/txns/{hash}`: transaction-level actions, signer / receiver, approximate NEP-141 deltas from the receipts. */\nexport function mapNearblocksTxn(chain: string, address: string, txn: NearblocksTxn): NearChainTx {\n const approx = { value: false }\n const fold: ActionFold = { transfers: [], programs: [] }\n foldActions(txn.actions, txn.signer_account_id, txn.receiver_account_id, fold, approx)\n for (const r of txn.receipts ?? []) {\n for (const f of r.fts ?? []) {\n // nearblocks lists both sides of a movement; keep the one whose affected account is in the pair's \"from\" position.\n const delta = big(f.delta_amount, approx)\n if (delta === undefined || delta >= 0n) continue\n const t = ftTransfer(f, approx)\n if (t) fold.transfers.push(t)\n }\n }\n const from = txn.signer_account_id\n const involves = (t: ChainTransfer) => t.from === address || t.to === address\n const primary = fold.transfers.find((t) => t.token !== null && involves(t)) ?? fold.transfers.find(involves) ?? fold.transfers[0]\n let nativeValue = 0n\n for (const t of fold.transfers) if (t.token === null && t.from === from) nativeValue += t.amount\n const fee = big(txn.outcomes_agg?.transaction_fee, approx)\n const raw: NearHistoryRaw = { receipts: [], ft: [], txn }\n if (approx.value) raw.approximate = true\n const out: NearChainTx = {\n chain, hash: txn.transaction_hash, time: nsToSeconds(txn.block_timestamp), status: txn.outcomes?.status === false ? 'failed' : 'confirmed', address, from,\n to: fold.call?.to ?? primary?.to ?? txn.receiver_account_id, nativeValue, transfers: fold.transfers, raw,\n }\n if (fee !== undefined) out.fee = fee\n if (fold.call) out.call = fold.call\n if (typeof txn.block?.block_height === 'number') out.block = BigInt(txn.block.block_height)\n return out\n}\n\n// ── RPC refinement ───────────────────────────────────────────────────────────\n\nexport interface RpcAction {\n Transfer?: { deposit: string }\n FunctionCall?: { method_name: string; args: string; deposit: string; gas?: number }\n Delegate?: { delegate_action: { sender_id: string; receiver_id: string; actions: RpcAction[] } }\n [other: string]: unknown\n}\nexport interface RpcTxStatus {\n status?: Record<string, unknown>\n transaction?: { signer_id: string; receiver_id: string; hash?: string; actions?: RpcAction[] }\n transaction_outcome?: { outcome?: { tokens_burnt?: string; executor_id?: string; logs?: string[] } }\n receipts_outcome?: Array<{ outcome?: { executor_id?: string; tokens_burnt?: string; logs?: string[]; status?: Record<string, unknown> } }>\n}\n\nconst utf8 = (bytes: Uint8Array): string => {\n let s = ''\n for (let i = 0; i < bytes.length; ) {\n const b0 = bytes[i++]!\n let cp: number\n if (b0 < 0x80) cp = b0\n else if (b0 < 0xe0) cp = ((b0 & 0x1f) << 6) | (bytes[i++]! & 0x3f)\n else if (b0 < 0xf0) cp = ((b0 & 0x0f) << 12) | ((bytes[i++]! & 0x3f) << 6) | (bytes[i++]! & 0x3f)\n else cp = ((b0 & 0x07) << 18) | ((bytes[i++]! & 0x3f) << 12) | ((bytes[i++]! & 0x3f) << 6) | (bytes[i++]! & 0x3f)\n s += String.fromCodePoint(cp)\n }\n return s\n}\n\n/** Rebuild transfers / call / fee / status exactly from an `EXPERIMENTAL_tx_status` result. */\nexport function mapRpcTxStatus(chain: string, address: string, r: RpcTxStatus, base?: NearChainTx): NearChainTx {\n const tx = r.transaction\n const transfers: ChainTransfer[] = []\n const programs: string[] = []\n let call: ChainCall | undefined\n const walk = (actions: RpcAction[] | undefined, from: string, to: string) => {\n for (const a of actions ?? []) {\n if (a.Transfer) {\n const d = BigInt(a.Transfer.deposit)\n if (d > 0n) transfers.push({ token: null, from, to, amount: d })\n } else if (a.FunctionCall) {\n const d = BigInt(a.FunctionCall.deposit || '0')\n programs.push(a.FunctionCall.method_name)\n if (d > 0n && d !== ONE_YOCTO) transfers.push({ token: null, from, to, amount: d })\n call ??= { to, method: a.FunctionCall.method_name, programs }\n } else if (a.Delegate) {\n walk(a.Delegate.delegate_action.actions, a.Delegate.delegate_action.sender_id, a.Delegate.delegate_action.receiver_id)\n } else {\n const name = Object.keys(a)[0]\n if (name) {\n const method = name.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase()\n programs.push(method)\n call ??= { to, method, programs }\n }\n }\n }\n }\n if (tx) walk(tx.actions, tx.signer_id, tx.receiver_id)\n let fee = 0n\n const burnt = r.transaction_outcome?.outcome?.tokens_burnt\n if (burnt) fee += BigInt(burnt)\n let failed = false\n for (const ro of r.receipts_outcome ?? []) {\n const o = ro.outcome\n if (!o) continue\n if (o.tokens_burnt) fee += BigInt(o.tokens_burnt)\n if (o.status && 'Failure' in o.status) failed = true\n const token = o.executor_id\n for (const log of o.logs ?? []) {\n if (!token) continue\n const legacy = /^Transfer (\\d+) from (\\S+) to (\\S+)$/.exec(log)\n if (legacy) {\n transfers.push({ token, from: legacy[2]!, to: legacy[3]!, amount: BigInt(legacy[1]!), standard: 'nep141' })\n continue\n }\n if (!log.startsWith('EVENT_JSON:')) continue\n let ev: { standard?: string; event?: string; data?: Array<{ old_owner_id?: string; new_owner_id?: string; owner_id?: string; amount?: string }> }\n try {\n ev = JSON.parse(log.slice('EVENT_JSON:'.length)) as typeof ev\n } catch {\n continue\n }\n if (ev.standard !== 'nep141') continue\n for (const d of ev.data ?? []) {\n if (!d.amount || !/^\\d+$/.test(d.amount)) continue\n if (ev.event === 'ft_transfer' && d.old_owner_id && d.new_owner_id) transfers.push({ token, from: d.old_owner_id, to: d.new_owner_id, amount: BigInt(d.amount), standard: 'nep141' })\n else if (ev.event === 'ft_mint' && d.owner_id) transfers.push({ token, from: token, to: d.owner_id, amount: BigInt(d.amount), standard: 'nep141' })\n else if (ev.event === 'ft_burn' && d.owner_id) transfers.push({ token, from: d.owner_id, to: token, amount: BigInt(d.amount), standard: 'nep141' })\n }\n }\n }\n if (r.status && 'Failure' in r.status) failed = true\n // Keep symbol / decimals nearblocks knew for the same token.\n for (const t of transfers) {\n const known = base?.transfers.find((x) => x.token === t.token && (x.symbol !== undefined || x.decimals !== undefined))\n if (known?.symbol !== undefined) t.symbol = known.symbol\n if (known?.decimals !== undefined) t.decimals = known.decimals\n }\n const from = tx?.signer_id ?? base?.from ?? address\n const involves = (t: ChainTransfer) => t.from === address || t.to === address\n const primary = transfers.find((t) => t.token !== null && involves(t)) ?? transfers.find(involves) ?? transfers[0]\n let nativeValue = 0n\n for (const t of transfers) if (t.token === null && t.from === from) nativeValue += t.amount\n const raw: NearHistoryRaw = { ...(base?.raw ?? { receipts: [], ft: [] }), rpc: r }\n delete raw.approximate\n const out: NearChainTx = {\n chain, hash: tx?.hash ?? base?.hash ?? '', time: base?.time ?? 0, status: failed ? 'failed' : 'confirmed', address, from,\n to: call?.to ?? primary?.to ?? tx?.receiver_id ?? base?.to ?? null, nativeValue, transfers, fee, raw,\n }\n if (call) out.call = call\n if (base?.block !== undefined) out.block = base.block\n return out\n}\n\n/** Decode `FunctionCall.args` (base64 JSON) — exported for callers that want the arguments of a call. */\nexport function decodeFunctionCallArgs(args: string): unknown {\n try {\n return JSON.parse(utf8(fromBase64(args)))\n } catch {\n return undefined\n }\n}\n\n// ── Source ───────────────────────────────────────────────────────────────────\n\n/** Nearblocks link for a transaction. */\nexport function nearExplorerTxUrl(hash: string, network: 'mainnet' | 'testnet' = 'mainnet'): string {\n return `https://${network === 'testnet' ? 'testnet.' : ''}nearblocks.io/txns/${hash}`\n}\n\n/** A history source for NEAR accounts backed by nearblocks. */\nexport function createNearHistory(options: NearHistoryOptions = {}): NearHistorySource {\n const network = options.network ?? 'mainnet'\n const chain = CAIP2[network] ?? CAIP2.mainnet!\n const base = (options.nearblocksUrl ?? (network === 'testnet' ? 'https://api-testnet.nearblocks.io' : 'https://api.nearblocks.io')).replace(/\\/+$/, '')\n const fetchFn: HistoryFetch = options.fetch ?? ((globalThis as { fetch?: HistoryFetch }).fetch as HistoryFetch)\n if (typeof fetchFn !== 'function') throw new Error('@anywalletkit/wallet-near: no global fetch; pass `fetch` in the options')\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const bucket = new TokenBucket(options.rateLimit ?? (options.apiKey ? 5 : 0.1))\n\n async function get(path: string): Promise<unknown> {\n await bucket.acquire()\n const url = `${base}${path}`\n let res: Awaited<ReturnType<HistoryFetch>>\n try {\n const signal = timeoutSignal(timeoutMs)\n res = await fetchFn(url, { headers: { accept: 'application/json', ...(options.apiKey ? { authorization: `Bearer ${options.apiKey}` } : {}) }, ...(signal ? { signal } : {}) })\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n throw new HistoryUnavailableError(chain, `${path}: ${msg}`, [`nearblocks: ${msg}`])\n }\n const text = await res.text()\n let body: unknown\n try {\n body = parseJsonPreservingBigInts(text)\n } catch {\n body = undefined\n }\n if (!res.ok) {\n const msg = (body as { message?: string } | undefined)?.message ?? `HTTP ${res.status}`\n throw new HistoryUnavailableError(chain, `${path}: ${msg}`, [`nearblocks: HTTP ${res.status} ${msg}`])\n }\n return body\n }\n\n async function rpcTxStatus(hash: string, signer: string): Promise<RpcTxStatus | undefined> {\n if (!options.rpcUrl) return undefined\n const signal = timeoutSignal(timeoutMs)\n const res = await fetchFn(options.rpcUrl, {\n method: 'POST', headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ jsonrpc: '2.0', id: '1', method: 'EXPERIMENTAL_tx_status', params: { tx_hash: hash, sender_account_id: signer, wait_until: 'NONE' } }),\n ...(signal ? { signal } : {}),\n })\n const json = JSON.parse(await res.text()) as { result?: RpcTxStatus; error?: unknown }\n if (!res.ok || json.error || !json.result) return undefined\n return json.result\n }\n\n return {\n chain,\n\n async listActivity(address: string, query: HistoryQuery = {}): Promise<NearHistoryPage> {\n const limit = Math.min(MAX_LIMIT, Math.max(1, Math.floor(query.limit ?? DEFAULT_LIMIT)))\n const cursor = query.cursor ? decodeCursor(query.cursor) : { v: 1 as const, tx: '', ft: '' }\n const acct = encodeURIComponent(address)\n // Receipt rows come ~2 per transaction (the call and its refund), so the receipt list is asked for twice the limit.\n // Each list is asked for one row more than it uses: that row tells whether the page's last transaction goes on (round 3, M13).\n const perPage = Math.min(MAX_LIMIT - 1, limit * 2)\n const ftPer = Math.min(MAX_LIMIT - 1, limit)\n const txFetched: NearblocksReceiptRow[] = cursor.tx === null ? [] : (((await get(`/v1/account/${acct}/txns?per_page=${perPage + 1}&order=desc${cursor.tx ? `&cursor=${encodeURIComponent(cursor.tx)}` : ''}`)) as { txns?: NearblocksReceiptRow[] } | undefined)?.txns ?? [])\n const ftFetched: NearblocksFtRow[] = cursor.ft === null ? [] : (((await get(`/v1/account/${acct}/ft-txns?per_page=${ftPer + 1}&order=desc${cursor.ft ? `&cursor=${encodeURIComponent(cursor.ft)}` : ''}`)) as { txns?: NearblocksFtRow[] } | undefined)?.txns ?? [])\n // Rows of a transaction an earlier page already emitted (it had more rows than a page) are consumed silently.\n const skip = new Set(cursor.skip ?? [])\n const leading = (rows: Array<{ transaction_hash: string }>) => { let n = 0; while (n < rows.length && skip.has(rows[n]!.transaction_hash)) n++; return n }\n const txSkipped = leading(txFetched)\n const ftSkipped = leading(ftFetched)\n const txAll = txFetched.slice(txSkipped)\n const ftAll = ftFetched.slice(ftSkipped)\n const txRows = txAll.slice(0, perPage)\n const ftRows = ftAll.slice(0, ftPer)\n // A list that came back full goes on past this page, whatever was skipped.\n const txMore = txFetched.length > perPage\n const ftMore = ftFetched.length > ftPer\n // Global order by the transaction's block time; emit the top `limit` hashes plus ties, so each list's consumed rows are a prefix.\n const key = (r: { block_timestamp: string | number }) => BigInt(typeof r.block_timestamp === 'string' ? r.block_timestamp : Math.trunc(r.block_timestamp))\n const all = [...txRows.map((r) => ({ k: key(r), h: r.transaction_hash })), ...ftRows.map((r) => ({ k: key(r), h: r.transaction_hash }))]\n all.sort((a, b) => (a.k > b.k ? -1 : a.k < b.k ? 1 : 0))\n // A transaction whose rows go on past the page (the lookahead row is the same transaction) waits\n // for the next page, whole, so it is emitted once (round 3, M13). When it is all this page has\n // (more rows than a page), it goes out with the rows that fit and the next cursor skips the rest.\n const cut = new Set<string>()\n // The lookahead row when there is one; after skipped rows there may be none, and the last transaction may go on.\n const goesOnPast = (rows: Array<{ transaction_hash: string }>, all: Array<{ transaction_hash: string }>, per: number, more: boolean) => {\n const last = rows[rows.length - 1]\n if (!more || !last) return\n const next = all[per]\n if (next === undefined || next.transaction_hash === last.transaction_hash) cut.add(last.transaction_hash)\n }\n goesOnPast(txRows, txAll, perPage, txMore)\n goesOnPast(ftRows, ftAll, ftPer, ftMore)\n const partial = all.length > 0 && all.every((e) => cut.has(e.h)) ? [...cut] : []\n if (partial.length) cut.clear()\n const chosen = new Set<string>()\n let boundary: bigint | undefined\n for (const e of all) {\n if (chosen.has(e.h) || cut.has(e.h)) continue\n if (chosen.size >= limit && boundary !== undefined && e.k < boundary) break\n chosen.add(e.h)\n if (chosen.size === limit) boundary = e.k\n }\n // Consumed = the skipped rows, then the prefix of each list whose hashes were chosen; a list is\n // exhausted once nothing lies past the page and it was fully consumed.\n const consume = <T extends { transaction_hash: string }>(fetched: T[], skipped: number, rows: T[], more: boolean, wasAt: string | null, pos: (r: T) => string): { used: T[]; next: string | null } => {\n if (wasAt === null) return { used: [], next: null }\n let n = 0\n while (n < rows.length && chosen.has(rows[n]!.transaction_hash)) n++\n const used = rows.slice(0, n)\n if (!more && n === rows.length) return { used, next: null }\n const last = n > 0 ? used[n - 1] : skipped > 0 ? fetched[skipped - 1] : undefined\n return { used, next: last ? pos(last) : wasAt }\n }\n const txC = consume(txFetched, txSkipped, txRows, txMore, cursor.tx, (r) => r.id)\n const ftC = consume(ftFetched, ftSkipped, ftRows, ftMore, cursor.ft, (r) => r.event_index)\n const nextTx = txC.next, nextFt = ftC.next\n const groups = new Map<string, { receipts: NearblocksReceiptRow[]; ft: NearblocksFtRow[] }>()\n for (const h of chosen) groups.set(h, { receipts: [], ft: [] })\n for (const r of txC.used) groups.get(r.transaction_hash)!.receipts.push(r)\n for (const r of ftC.used) groups.get(r.transaction_hash)!.ft.push(r)\n let items = [...groups.entries()].map(([, g]) => mapNearblocksGroup(chain, address, g.receipts, g.ft)).filter((t) => t.hash)\n items.sort((a, b) => b.time - a.time)\n let more = nextTx !== null || nextFt !== null\n if (query.since !== undefined) {\n const since = query.since\n if (items.some((t) => t.time < since)) more = false\n items = items.filter((t) => t.time >= since)\n }\n const page: NearHistoryPage = { items }\n // Emitted in part, or skipped through to the page's end: its remaining rows come next and are skipped.\n const goesOn = (fetched: Array<{ transaction_hash: string }>, skipped: number, rows: unknown[]) => (rows.length === 0 && skipped > 0 && skipped === fetched.length ? [fetched[skipped - 1]!.transaction_hash] : [])\n const nextSkip = [...new Set([...partial, ...goesOn(txFetched, txSkipped, txRows), ...goesOn(ftFetched, ftSkipped, ftRows)])]\n if (more) page.cursor = encodeCursor({ v: 1, tx: nextTx, ft: nextFt, ...(nextSkip.length ? { skip: nextSkip } : {}) })\n return page\n },\n\n async getTransaction(hash: string, address: string): Promise<NearChainTx | undefined> {\n const body = (await get(`/v1/txns/${encodeURIComponent(hash)}`)) as { txns?: NearblocksTxn[] } | undefined\n const txn = body?.txns?.[0]\n if (!txn) return undefined\n const base = mapNearblocksTxn(chain, address, txn)\n if (!options.rpcUrl) return base\n try {\n const r = await rpcTxStatus(hash, txn.signer_account_id)\n return r ? mapRpcTxStatus(chain, address, r, base) : base\n } catch {\n return base\n }\n },\n\n explorerTxUrl(hash: string): string {\n return nearExplorerTxUrl(hash, network)\n },\n }\n}\n","import { NetworkError } from '@anywalletkit/core'\nimport { NearRpcError } from './errors.js'\nimport type { NearConfig, NearFetch } from './types.js'\n\n/** Base64 helpers that work in Node, browsers and Hermes (no Buffer). */\nexport function toBase64(bytes: Uint8Array): string {\n if (typeof btoa === 'function') {\n let s = ''\n for (let i = 0; i < bytes.length; i += 0x8000) s += String.fromCharCode.apply(null, Array.from(bytes.subarray(i, i + 0x8000)))\n return btoa(s)\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (globalThis as any).Buffer.from(bytes).toString('base64')\n}\nexport function fromBase64(s: string): Uint8Array {\n if (typeof atob === 'function') {\n const bin = atob(s)\n const out = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i)\n return out\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new Uint8Array((globalThis as any).Buffer.from(s, 'base64'))\n}\n\n/** Default per-request timeout for url providers. */\nexport const DEFAULT_TIMEOUT_MS = 15_000\n\n/** A signal that aborts after `ms`: `AbortSignal.timeout` where the runtime has it, else a timer (Hermes without runtime-hermes). */\nfunction timeoutSignal(ms: number): AbortSignal | undefined {\n if (typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function') return AbortSignal.timeout(ms)\n if (typeof AbortController === 'undefined') return undefined\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(new Error(`timed out after ${ms} ms`)), ms) as unknown as { unref?: () => void }\n timer.unref?.()\n return controller.signal\n}\n\nfunction httpTransport(url: string, headers: Record<string, string> | undefined, timeoutMs: number): NearFetch {\n let id = 0\n return async (method, params) => {\n const signal = timeoutSignal(timeoutMs)\n let res: Response\n try {\n res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json', ...headers },\n body: JSON.stringify({ jsonrpc: '2.0', id: String(++id), method, params }),\n ...(signal ? { signal } : {}),\n })\n } catch (e) {\n throw new NetworkError(`${method}: ${signal?.aborted ? `no answer within ${timeoutMs} ms` : 'request failed'}`, { provider: url, cause: e })\n }\n if (!res.ok) throw new NetworkError(`${method}: HTTP ${res.status}`, { provider: url })\n const json = (await res.json()) as { result?: unknown; error?: { name?: string; message?: string; cause?: { name?: string }; data?: unknown; code?: number } }\n if (json.error) throw new NearRpcError(method, json.error)\n return json.result\n }\n}\n\n/** An `error` from the node is a definitive answer (unknown account, invalid tx…) — never failed over. */\nexport const isDefinitive = (e: unknown) => e instanceof NearRpcError && !/TIMEOUT|INTERNAL|UNAVAILABLE|NO_SYNCED/i.test(e.errorName ?? '')\n\n/**\n * A broadcast refusal that proves the transaction was not accepted: the node rejected it\n * (`INVALID_TRANSACTION` — bad nonce, signature, balance…) or could not read the request\n * (`REQUEST_VALIDATION_ERROR` / `PARSE_ERROR`). Anything else — a timeout, an internal error, a\n * gateway error with no NEAR error name — may have reached the network.\n */\nexport const isDefinitiveBroadcast = (e: unknown): boolean => {\n if (!(e instanceof NearRpcError)) return false\n const err = e.cause as { name?: unknown; cause?: { name?: unknown } } | undefined\n const name = typeof err?.name === 'string' ? err.name : undefined\n const causeName = typeof err?.cause?.name === 'string' ? err.cause.name : undefined\n return causeName === 'INVALID_TRANSACTION' || causeName === 'PARSE_ERROR' || name === 'REQUEST_VALIDATION_ERROR'\n}\n\n/** Methods that hand a signed transaction to the network: a lost answer is ambiguous, so they are never re-sent elsewhere. */\nconst BROADCAST_METHODS: ReadonlySet<string> = new Set(['send_tx', 'broadcast_tx_commit', 'broadcast_tx_async'])\n\n/**\n * One transport, or a failover transport over the list. Reads fail over on anything but a\n * definitive node answer; a broadcast is sent once — the account turns an unanswered one into\n * `BroadcastUnknownError`.\n */\nexport function createClient(config: NearConfig): NearFetch | undefined {\n if (config.provider === undefined) return undefined\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const list = (Array.isArray(config.provider) ? config.provider : [config.provider]).map((p) =>\n typeof p === 'string' ? httpTransport(p, config.headers, timeoutMs) : p,\n )\n if (list.length === 0) throw new Error(\"The 'provider' 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 async (method, params) => {\n if (BROADCAST_METHODS.has(method)) return list[0]!(method, params)\n let lastError: unknown\n for (let i = 0; i < attempts; i++) {\n try { return await list[i % list.length]!(method, params) } catch (e) {\n if (isDefinitive(e)) throw e\n lastError = e\n }\n }\n throw new NetworkError(`All NEAR providers failed for ${method}`, { cause: lastError })\n }\n}\n\n// ── Typed helpers over `query` ───────────────────────────────────────────────\n\nexport interface RawAccountView { amount: string; locked: string; storage_usage: number; code_hash?: string; block_height?: number; block_hash?: string }\nexport interface RawAccessKeyView { nonce: number; permission: 'FullAccess' | { FunctionCall: { allowance: string | null; receiver_id: string; method_names: string[] } }; block_hash?: string; block_height?: number }\nexport interface RawCallResult { result: number[]; logs?: string[]; block_hash?: string; block_height?: number; error?: string }\nexport interface RawFinalOutcome {\n status?: Record<string, unknown>\n final_execution_status?: string\n transaction?: { hash?: string; signer_id?: string }\n transaction_outcome?: { id?: string; block_hash?: string; outcome?: { status?: Record<string, unknown>; gas_burnt?: number; tokens_burnt?: string } }\n receipts_outcome?: Array<{ id?: string; block_hash?: string; outcome?: { status?: Record<string, unknown>; gas_burnt?: number; tokens_burnt?: string } }>\n}\n\nconst UNKNOWN = /UNKNOWN_ACCOUNT|UNKNOWN_ACCESS_KEY|UNKNOWN_TRANSACTION|does not exist/i\n\n/** The NEAR JSON-RPC calls a wallet uses, with parsed results. */\nexport class NearRpc {\n constructor(readonly fetch: NearFetch) {}\n\n /** `undefined` when the account does not exist. */\n async viewAccount(accountId: string): Promise<RawAccountView | undefined> {\n try {\n return (await this.fetch('query', { request_type: 'view_account', finality: 'final', account_id: accountId })) as RawAccountView\n } catch (e) {\n if (e instanceof NearRpcError && UNKNOWN.test(e.errorName ?? e.message)) return undefined\n throw e\n }\n }\n\n /** `undefined` when the key is not on the account. */\n async viewAccessKey(accountId: string, publicKey: string): Promise<RawAccessKeyView | undefined> {\n try {\n return (await this.fetch('query', { request_type: 'view_access_key', finality: 'final', account_id: accountId, public_key: publicKey })) as RawAccessKeyView\n } catch (e) {\n if (e instanceof NearRpcError && UNKNOWN.test(e.errorName ?? e.message)) return undefined\n throw e\n }\n }\n\n /** View call; the JSON-decoded return value (`null` for an empty result). */\n async callFunction<T = unknown>(contract: string, method: string, args: Record<string, unknown> = {}): Promise<T> {\n const r = (await this.fetch('query', {\n request_type: 'call_function', finality: 'final', account_id: contract, method_name: method, args_base64: toBase64(new TextEncoder().encode(JSON.stringify(args))),\n })) as RawCallResult\n if (r.error) throw new NearRpcError('query', { name: 'HANDLER_ERROR', message: r.error, cause: { name: 'CONTRACT_EXECUTION_ERROR' } })\n const text = new TextDecoder().decode(Uint8Array.from(r.result ?? []))\n if (!text.length) return null as T\n return JSON.parse(text) as T\n }\n\n async latestBlockHash(): Promise<string> {\n const b = (await this.fetch('block', { finality: 'final' })) as { header?: { hash?: string } }\n if (!b.header?.hash) throw new NetworkError('block: no header hash in the response')\n return b.header.hash\n }\n\n async gasPrice(): Promise<bigint> {\n const r = (await this.fetch('gas_price', [null])) as { gas_price?: string }\n if (!r.gas_price) throw new NetworkError('gas_price: no price in the response')\n return BigInt(r.gas_price)\n }\n\n async sendTx(signedTxBase64: string, waitUntil: 'NONE' | 'INCLUDED' | 'EXECUTED_OPTIMISTIC' | 'INCLUDED_FINAL' | 'EXECUTED' | 'FINAL' = 'EXECUTED_OPTIMISTIC'): Promise<RawFinalOutcome> {\n return (await this.fetch('send_tx', { signed_tx_base64: signedTxBase64, wait_until: waitUntil })) as RawFinalOutcome\n }\n\n /** `undefined` when the node does not know the transaction. */\n async txStatus(hash: string, senderId: string): Promise<RawFinalOutcome | undefined> {\n try {\n return (await this.fetch('tx', { tx_hash: hash, sender_account_id: senderId, wait_until: 'NONE' })) as RawFinalOutcome\n } catch (e) {\n if (e instanceof NearRpcError && UNKNOWN.test(e.errorName ?? e.message)) return undefined\n throw e\n }\n }\n}\n\n/** Human-readable failure from an execution `status` (`{Failure: {...}}`), or undefined on success. */\nexport function failureOf(status: Record<string, unknown> | undefined): string | undefined {\n // Unit variants (\"NotStarted\", \"Started\") come back as plain strings.\n if (!status || typeof status !== 'object' || !('Failure' in status)) return undefined\n const f = status.Failure\n try {\n const json = JSON.stringify(f)\n const m = /\"ExecutionError\":\"([^\"]+)\"/.exec(json) ?? /\"error_message\":\"([^\"]+)\"/.exec(json) ?? /\"kind\":(\\{[^}]*\\})/.exec(json)\n return m?.[1] ?? json.slice(0, 300)\n } catch { return String(f) }\n}\n\n/** Did the whole transaction (every receipt) succeed? */\nexport function outcomeFailed(o: RawFinalOutcome): string | undefined {\n const top = failureOf(o.status)\n if (top) return top\n for (const r of o.receipts_outcome ?? []) {\n const f = failureOf(r.outcome?.status)\n if (f) return f\n }\n return undefined\n}\n","/** JSON-RPC transport: `method` + `params`, returns the `result` (throws on `error`). */\nexport type NearFetch = (method: string, params: unknown) => Promise<unknown>\n\n/** One RPC base url (e.g. \"https://free.rpc.fastnear.com\") or a ready transport. */\nexport type NearProvider = string | NearFetch\n\n/**\n * Options for a NEAR wallet manager or account: RPC endpoints, network, fee caps and the\n * pre-sign checks.\n */\nexport interface NearConfig {\n /** RPC url(s) / transport(s). A list fails over in order. Omit for an offline (sign-only) wallet. */\n provider?: NearProvider | NearProvider[]\n /** Extra attempts across the provider list after the first failure (default 3). */\n retries?: number\n /** Optional headers for every request (e.g. an API key). */\n headers?: Record<string, string>\n /** Per-request timeout for url providers, in ms (default 15 000): a node that never answers fails over (reads) or ends as \"maybe sent\" (`send_tx`). */\n timeoutMs?: number\n /** \"mainnet\" (default) | \"testnet\" | any CAIP-2 suffix. */\n network?: 'mainnet' | 'testnet' | string\n /** Max fee (yoctoNEAR) for `transfer`. */\n transferMaxFee?: bigint | number\n /** Max fee (yoctoNEAR) for `sendTransaction` / `signTransaction`. */\n transactionMaxFee?: bigint | number\n /** Run the balance / account / access-key preflight before signing (default true). */\n simulate?: boolean\n /**\n * Allow actions that change the account itself or deploy code (AddKey, DeleteKey,\n * DeleteAccount, DeployContract, Stake, CreateAccount, global-contract actions,\n * SignedDelegate). Default false: they are refused with `dangerous-action`.\n */\n allowDangerousActions?: boolean\n /**\n * Most yoctoNEAR a token `transfer` may attach as `storage_deposit` to register the\n * recipient (the amount comes from the token contract itself). Default 0.0125 NEAR,\n * ten times the usual NEP-145 minimum.\n */\n maxStorageDeposit?: bigint | number\n}\n\n// ── Actions ──────────────────────────────────────────────────────────────────\n\nexport interface NearTransferAction { transfer: { deposit: bigint } }\nexport interface NearFunctionCallAction {\n functionCall: {\n methodName: string\n /** Raw bytes, or a JSON-serialisable object / string (encoded as UTF-8 JSON). */\n args: Uint8Array | Record<string, unknown> | string\n /** Prepaid gas (default 30 Tgas). Max 300 Tgas. */\n gas?: bigint\n /** Attached deposit in yoctoNEAR (default 0). */\n deposit?: bigint\n }\n}\nexport interface NearCreateAccountAction { createAccount: Record<string, never> }\nexport interface NearDeployContractAction { deployContract: { code: Uint8Array } }\nexport interface NearStakeAction { stake: { stake: bigint; publicKey: NearPublicKey } }\n/** An access key's nonce and permission (full access or a function-call key). */\nexport interface NearAccessKey {\n nonce: bigint\n permission: { fullAccess: Record<string, never> } | { functionCall: { allowance?: bigint; receiverId: string; methodNames: string[] } }\n}\nexport interface NearAddKeyAction { addKey: { publicKey: NearPublicKey; accessKey: NearAccessKey } }\nexport interface NearDeleteKeyAction { deleteKey: { publicKey: NearPublicKey } }\nexport interface NearDeleteAccountAction { deleteAccount: { beneficiaryId: string } }\nexport interface NearDelegateAction {\n senderId: string\n receiverId: string\n actions: NearAction[]\n nonce: bigint\n maxBlockHeight: bigint\n publicKey: NearPublicKey\n}\nexport interface NearSignedDelegateAction { signedDelegate: { delegateAction: NearDelegateAction; signature: NearSignature } }\nexport interface NearDeployGlobalContractAction { deployGlobalContract: { code: Uint8Array; deployMode: 'codeHash' | 'accountId' } }\nexport interface NearUseGlobalContractAction { useGlobalContract: { codeHash: Uint8Array } | { accountId: string } }\n\n/** One action of a NEAR transaction. */\nexport type NearAction =\n | NearCreateAccountAction\n | NearDeployContractAction\n | NearFunctionCallAction\n | NearTransferAction\n | NearStakeAction\n | NearAddKeyAction\n | NearDeleteKeyAction\n | NearDeleteAccountAction\n | NearSignedDelegateAction\n | NearDeployGlobalContractAction\n | NearUseGlobalContractAction\n\n/** A public key as NEAR encodes it: curve tag + raw bytes. */\nexport interface NearPublicKey { keyType: 'ed25519' | 'secp256k1'; data: Uint8Array }\nexport interface NearSignature { keyType: 'ed25519' | 'secp256k1'; data: Uint8Array }\n\n/**\n * A transaction to sign. `signerId` / `publicKey` default to the account's; `nonce` /\n * `blockHash` are fetched from the network when omitted (the account `needsNetwork`).\n */\nexport interface NearTransaction {\n receiverId: string\n actions: NearAction[]\n signerId?: string\n publicKey?: NearPublicKey\n nonce?: bigint\n /** 32 bytes, or base58. */\n blockHash?: Uint8Array | string\n}\n\n/** Fully specified transaction as it is hashed and signed. */\nexport interface NearBuiltTransaction {\n signerId: string\n publicKey: NearPublicKey\n nonce: bigint\n receiverId: string\n blockHash: Uint8Array\n actions: NearAction[]\n}\n\nexport interface NearSignedTransaction { transaction: NearBuiltTransaction; signature: NearSignature }\n\n/** Shorthand for `transfer`: native NEAR (no `token`) or a NEP-141 token (`token` = contract account id). */\nexport interface NearTransferOptions {\n token?: string\n recipient: string\n amount: bigint | number | string\n /** NEP-141 `memo` (ignored for native transfers — NEAR transfers carry no memo). */\n memo?: string\n}\n\n// ── Fees / preflight ────────────────────────────────────────────────────────\n\n/** Gas a transaction may burn and its cost in yoctoNEAR. */\nexport interface NearFeeEstimate {\n /** Gas the transaction can burn at most (prepaid function-call gas counts in full). */\n gas: bigint\n /** yoctoNEAR per gas unit at quote time. */\n gasPrice: bigint\n /** Upper bound of the fee in yoctoNEAR (`gas * gasPrice`, plus the account-creation charge when `createsAccount`). */\n fee: bigint\n /** yoctoNEAR the actions attach (transfer deposits + function-call deposits). */\n deposit: bigint\n /** True when a native transfer will create an implicit account (extra gas included). */\n createsAccount: boolean\n}\n\n/** Fee of a transaction in yoctoNEAR, with the estimate behind it. */\nexport interface NearQuote {\n /** = `estimate.fee`. */\n fee: bigint\n estimate: NearFeeEstimate\n}\n\n/** Whether a transaction is expected to succeed, and why not. */\nexport interface NearSimulation {\n ok: boolean\n reason?: string\n}\n\n/** An account's balance, locked stake and storage. */\nexport interface NearAccountView {\n amount: bigint\n locked: bigint\n storageUsage: bigint\n /** `amount - locked - storageUsage * STORAGE_PRICE_PER_BYTE` (never below 0). */\n available: bigint\n}\n\n/** Outcome of a NEAR transaction. */\nexport interface NearReceipt {\n hash: string\n /** 1 success, 0 failed. */\n status: 0 | 1\n blockNumber?: bigint\n /** Decoded failure, when any receipt failed. */\n failure?: string\n /** Raw `tx` RPC payload. */\n raw: Record<string, unknown>\n}\n\n// ── Describe ─────────────────────────────────────────────────────────────────\n\n/** What a NEAR transaction does. */\nexport type NearTxKind =\n | 'near-transfer'\n | 'ft-transfer'\n | 'ft-storage-deposit'\n | 'function-call'\n | 'batch'\n | 'create-account'\n | 'deploy-contract'\n | 'stake'\n | 'add-key'\n | 'delete-key'\n | 'delete-account'\n | 'delegate'\n | 'global-contract'\n/** Problems a NEAR description is flagged with. */\nexport type NearTxWarningCode = 'dangerous-action' | 'full-access-key' | 'zero-amount' | 'implicit-new-account' | 'self-transfer' | 'high-gas' | 'unknown-method' | 'invalid-account'\n/** One flagged problem, with a sentence a wallet can show. */\nexport interface NearTxWarning { code: NearTxWarningCode; message: string }\n\n/** A NEAR transaction decoded for a confirmation screen. */\nexport interface NearTxDescription {\n kind: NearTxKind\n warnings: NearTxWarning[]\n /** Signer account id when known. */\n from?: string\n /** Receiver account id (native transfer) or NEP-141 `receiver_id` (ft-transfer). */\n to?: string\n /** yoctoNEAR (native) or token base units (ft-transfer). */\n amount?: bigint\n /** NEP-141 contract account id. */\n token?: string\n /** NEP-141 memo. */\n memo?: string\n /** Called contract (function-call / batch). */\n contract?: string\n /** Methods called, in order. */\n methods?: string[]\n /** Total yoctoNEAR attached across actions. */\n deposit: bigint\n /** Total prepaid gas across function calls. */\n gas: bigint\n actionCount: number\n}\n\n// ── Constants ────────────────────────────────────────────────────────────────\n\n/** CAIP-2 ids of NEAR mainnet and testnet. */\nexport const CAIP2: Record<string, string> = { mainnet: 'near:mainnet', testnet: 'near:testnet' }\n\n/** 1 NEAR = 10^24 yoctoNEAR. */\nexport const YOCTO = 10n ** 24n\n/** 1 Tgas. */\nexport const TGAS = 10n ** 12n\n/** Hard per-transaction prepaid gas limit. */\nexport const MAX_GAS = 300n * TGAS\n/** Protocol storage price: 10^19 yoctoNEAR per byte. */\nexport const STORAGE_PRICE_PER_BYTE = 10n ** 19n\n/** NEP-141 `ft_transfer` requires exactly 1 yoctoNEAR attached. */\nexport const ONE_YOCTO = 1n\n/** Default gas for `ft_transfer` / `storage_deposit`. */\nexport const FT_TRANSFER_GAS = 30n * TGAS\n/** Gas attached to a NEP-145 `storage_deposit` call. */\nexport const STORAGE_DEPOSIT_GAS = 10n * TGAS\n/** Minimum native transfer that can create an implicit account (covers its storage). */\nexport const IMPLICIT_ACCOUNT_MIN_DEPOSIT = 2n * 10n ** 21n // 0.002 NEAR\n"],"mappings":"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","names":["import_core","from","all","more","base"]}
package/dist/history.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  mapRpcTxStatus,
10
10
  nearExplorerTxUrl,
11
11
  parseJsonPreservingBigInts
12
- } from "./chunk-ZWMEZA5A.js";
12
+ } from "./chunk-5UHDSFWA.js";
13
13
  export {
14
14
  HistoryUnavailableError,
15
15
  createNearHistory,
package/dist/index.cjs CHANGED
@@ -631,6 +631,13 @@ function httpTransport(url, headers, timeoutMs) {
631
631
  };
632
632
  }
633
633
  var isDefinitive = (e) => e instanceof NearRpcError && !/TIMEOUT|INTERNAL|UNAVAILABLE|NO_SYNCED/i.test(e.errorName ?? "");
634
+ var isDefinitiveBroadcast = (e) => {
635
+ if (!(e instanceof NearRpcError)) return false;
636
+ const err = e.cause;
637
+ const name = typeof err?.name === "string" ? err.name : void 0;
638
+ const causeName = typeof err?.cause?.name === "string" ? err.cause.name : void 0;
639
+ return causeName === "INVALID_TRANSACTION" || causeName === "PARSE_ERROR" || name === "REQUEST_VALIDATION_ERROR";
640
+ };
634
641
  var BROADCAST_METHODS = /* @__PURE__ */ new Set(["send_tx", "broadcast_tx_commit", "broadcast_tx_async"]);
635
642
  function createClient(config) {
636
643
  if (config.provider === void 0) return void 0;
@@ -717,7 +724,7 @@ var NearRpc = class {
717
724
  }
718
725
  };
719
726
  function failureOf(status) {
720
- if (!status || !("Failure" in status)) return void 0;
727
+ if (!status || typeof status !== "object" || !("Failure" in status)) return void 0;
721
728
  const f = status.Failure;
722
729
  try {
723
730
  const json = JSON.stringify(f);
@@ -1141,8 +1148,7 @@ var WalletAccountReadOnlyNear = class _WalletAccountReadOnlyNear {
1141
1148
  /** Status of one of this account's transactions (the `tx` RPC needs the sender). */
1142
1149
  async getTransactionReceipt(hash) {
1143
1150
  const o = await this.requireRpc("fetch transaction receipts").txStatus(hash, this.address);
1144
- if (!o) return void 0;
1145
- return receiptOf(hash, o);
1151
+ return o ? receiptOf(hash, o) : void 0;
1146
1152
  }
1147
1153
  /** Verify an `ed25519:<base58>` (or bare base58 / hex) signature produced by `sign`. */
1148
1154
  async verify(message, signature) {
@@ -1163,8 +1169,10 @@ var WalletAccountReadOnlyNear = class _WalletAccountReadOnlyNear {
1163
1169
  };
1164
1170
  function receiptOf(hash, o) {
1165
1171
  const failure = outcomeFailed(o);
1166
- const pending = o.final_execution_status !== void 0 && /NONE|INCLUDED$/.test(o.final_execution_status) && !failureOf(o.status) && o.status === void 0;
1167
- return { hash, status: failure ? 0 : 1, ...failure ? { failure } : {}, raw: { ...o, ...pending ? { pending: true } : {} } };
1172
+ if (failure) return { hash, status: 0, failure, raw: { ...o } };
1173
+ if (o.final_execution_status !== void 0 && /^(?:NONE|INCLUDED|INCLUDED_FINAL)$/.test(o.final_execution_status)) return void 0;
1174
+ const executed = typeof o.status === "object" && o.status !== null && ("SuccessValue" in o.status || "SuccessReceiptId" in o.status);
1175
+ return executed ? { hash, status: 1, raw: { ...o } } : void 0;
1168
1176
  }
1169
1177
  function parseSignature(signature) {
1170
1178
  const s = signature.startsWith("ed25519:") ? signature.slice("ed25519:".length) : signature;
@@ -1272,6 +1280,15 @@ var WalletAccountNear = class _WalletAccountNear extends WalletAccountReadOnlyNe
1272
1280
  signerKind;
1273
1281
  _disposed = false;
1274
1282
  _readOnly;
1283
+ /**
1284
+ * Highest nonce this account has broadcast (accepted, or maybe sent). The access key is read at
1285
+ * `final`, which lags the block that holds our last transaction, so a second send right after
1286
+ * the first would sign the same nonce and be refused. A filled-in nonce is never below it + 1;
1287
+ * NEAR only needs nonces to increase, so a gap left by a transaction that never landed is harmless.
1288
+ */
1289
+ _nonceFloor;
1290
+ /** Tail of this account's send queue: prepare → sign → broadcast runs one send at a time. */
1291
+ _sendTail = Promise.resolve();
1275
1292
  constructor(signer, publicKey, path, config = {}, accountId) {
1276
1293
  super(accountId ?? implicitAccountId(publicKey), config, ed25519Key(publicKey));
1277
1294
  this.#signer = (0, import_core4.requireCurve)(signer, "ed25519");
@@ -1316,15 +1333,44 @@ var WalletAccountNear = class _WalletAccountNear extends WalletAccountReadOnlyNe
1316
1333
  const sig = await this.#signBytes(nep413Hash(payload), "near-nep413");
1317
1334
  return { signature: toBase64(sig), publicKey: publicKeyToString(this.publicKey), accountId: this.address };
1318
1335
  }
1319
- /** Sign a fully built transaction. No checks — see `signTransaction`. */
1336
+ /**
1337
+ * Sign a fully built transaction. It gets the same hard checks as `signTransaction` (this
1338
+ * account's signer and key, no dangerous action unless `allowDangerousActions`, gas limit) but
1339
+ * no node round-trip: no preflight and no fee check.
1340
+ */
1320
1341
  async signBuilt(tx) {
1342
+ const own = this.#ownCopy(tx);
1343
+ this.assertSafe(own);
1344
+ return this.#signChecked(own);
1345
+ }
1346
+ /**
1347
+ * A plain copy of `tx`, decoded from its borsh bytes: the object the checks read is the one that
1348
+ * gets hashed and signed, whatever the caller does with its own object (a getter, or an array
1349
+ * changed while a node call is awaited).
1350
+ */
1351
+ #ownCopy(tx) {
1352
+ let copy;
1353
+ try {
1354
+ copy = decodeTransaction(encodeTransaction(tx));
1355
+ } catch (e) {
1356
+ this.assertSafe(tx);
1357
+ throw new UnsafeTransactionError("non-canonical", `Not an encodable NEAR transaction: ${e.message}`);
1358
+ }
1359
+ return copy;
1360
+ }
1361
+ /** Sign a transaction that has already been through `assertSafe`. */
1362
+ async #signChecked(tx) {
1321
1363
  assertWellFormed(tx);
1322
1364
  const sig = await this.#signBytes(WalletAccountReadOnlyNear.hashOf(tx), "near-tx");
1323
1365
  return { transaction: tx, signature: { keyType: "ed25519", data: sig } };
1324
1366
  }
1325
1367
  /** Build → hard checks → preflight → fee cap. Shared by sign / send / transfer. */
1326
1368
  async prepare(tx, maxFee, op) {
1327
- const built = await this.buildTransaction(tx);
1369
+ let built = await this.buildTransaction(tx);
1370
+ if (typeof tx !== "string" && tx.nonce === void 0 && this._nonceFloor !== void 0 && built.nonce <= this._nonceFloor) {
1371
+ built = { ...built, nonce: this._nonceFloor + 1n };
1372
+ }
1373
+ built = this.#ownCopy(built);
1328
1374
  this.assertSafe(built);
1329
1375
  const estimate = await this.estimate(built);
1330
1376
  this.assertSafe(built, estimate.fee);
@@ -1340,18 +1386,24 @@ var WalletAccountNear = class _WalletAccountNear extends WalletAccountReadOnlyNe
1340
1386
  this.key();
1341
1387
  this.requireRpc("sign transactions");
1342
1388
  const { built } = await this.prepare(tx, (0, import_core4.feeLimit)(this._config.transactionMaxFee, options), "transaction");
1343
- return toBase64(encodeSignedTransaction(await this.signBuilt(built)));
1389
+ return toBase64(encodeSignedTransaction(await this.#signChecked(built)));
1344
1390
  }
1345
1391
  async broadcast(signed) {
1346
1392
  const hash = WalletAccountReadOnlyNear.txHash(signed.transaction);
1347
1393
  const rpc = this.requireRpc("broadcast");
1394
+ const used = () => {
1395
+ const n = signed.transaction.nonce;
1396
+ if (this._nonceFloor === void 0 || n > this._nonceFloor) this._nonceFloor = n;
1397
+ };
1348
1398
  let outcome;
1349
1399
  try {
1350
1400
  outcome = await rpc.sendTx(toBase64(encodeSignedTransaction(signed)));
1351
1401
  } catch (e) {
1352
- if (isDefinitive(e)) throw e;
1402
+ if (isDefinitiveBroadcast(e)) throw e;
1403
+ used();
1353
1404
  throw new BroadcastUnknownError(hash, e);
1354
1405
  }
1406
+ used();
1355
1407
  const failure = outcomeFailed(outcome);
1356
1408
  if (failure) throw new Error(`Transaction ${hash} failed on chain: ${failure}`);
1357
1409
  return outcome.transaction?.hash ?? hash;
@@ -1360,20 +1412,35 @@ var WalletAccountNear = class _WalletAccountNear extends WalletAccountReadOnlyNe
1360
1412
  * Sign and broadcast. Accepts a transaction, or base64 borsh of an unsigned /
1361
1413
  * already-signed transaction (a signed one is checked, not re-signed).
1362
1414
  */
1363
- async sendTransaction(tx, options = {}) {
1415
+ sendTransaction(tx, options = {}) {
1416
+ return this.#serial(() => this.#sendTransactionNow(tx, options));
1417
+ }
1418
+ async #sendTransactionNow(tx, options) {
1364
1419
  this.key();
1365
1420
  this.requireRpc("send transactions");
1366
1421
  const presigned = typeof tx === "string" ? decodeSigned(tx) : void 0;
1367
1422
  const { built, estimate } = await this.prepare(tx, (0, import_core4.feeLimit)(this._config.transactionMaxFee, options), "transaction");
1368
- const signed = presigned ?? await this.signBuilt(built);
1423
+ const signed = presigned ?? await this.#signChecked(built);
1369
1424
  return { hash: await this.broadcast(signed), fee: estimate.fee, estimate };
1370
1425
  }
1371
1426
  /** Native NEAR (no `token`) or NEP-141 `ft_transfer` (with `storage_deposit` when the recipient needs it). */
1372
- async transfer(o, writeOptions = {}) {
1427
+ transfer(o, writeOptions = {}) {
1428
+ return this.#serial(() => this.#transferNow(o, writeOptions));
1429
+ }
1430
+ async #transferNow(o, writeOptions) {
1373
1431
  this.key();
1374
1432
  this.requireRpc("transfer tokens");
1375
1433
  const { built, estimate } = await this.prepare(await this.transferActions(o), (0, import_core4.feeLimit)(this._config.transferMaxFee, writeOptions), "transfer");
1376
- return { hash: await this.broadcast(await this.signBuilt(built)), fee: estimate.fee, estimate };
1434
+ return { hash: await this.broadcast(await this.#signChecked(built)), fee: estimate.fee, estimate };
1435
+ }
1436
+ /**
1437
+ * One send at a time per account: two sends started together would read the same access-key
1438
+ * nonce before either is broadcast. A failed send does not block the next.
1439
+ */
1440
+ #serial(run) {
1441
+ const next = this._sendTail.then(run);
1442
+ this._sendTail = next.then(() => void 0, () => void 0);
1443
+ return next;
1377
1444
  }
1378
1445
  /** The same account as a {@link WalletAccountReadOnlyNear}. */
1379
1446
  toReadOnlyAccount() {