@fastnear/intents 1.6.3 → 2.1.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,5 +1,5 @@
1
- /* ⋈ 🏃🏻💨 FastNear intents - CJS (@fastnear/intents version 1.6.3) */
2
- /* https://www.npmjs.com/package/@fastnear/intents/v/1.6.3 */
1
+ /* ⋈ 🏃🏻💨 FastNear intents - CJS (@fastnear/intents version 2.1.0) */
2
+ /* https://www.npmjs.com/package/@fastnear/intents/v/2.1.0 */
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
5
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
package/dist/cjs/node.cjs CHANGED
@@ -1,5 +1,5 @@
1
- /* ⋈ 🏃🏻💨 FastNear intents - CJS (@fastnear/intents version 1.6.3) */
2
- /* https://www.npmjs.com/package/@fastnear/intents/v/1.6.3 */
1
+ /* ⋈ 🏃🏻💨 FastNear intents - CJS (@fastnear/intents version 2.1.0) */
2
+ /* https://www.npmjs.com/package/@fastnear/intents/v/2.1.0 */
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
5
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,5 +1,5 @@
1
- /* ⋈ 🏃🏻💨 FastNear intents - CJS (@fastnear/intents version 1.6.3) */
2
- /* https://www.npmjs.com/package/@fastnear/intents/v/1.6.3 */
1
+ /* ⋈ 🏃🏻💨 FastNear intents - CJS (@fastnear/intents version 2.1.0) */
2
+ /* https://www.npmjs.com/package/@fastnear/intents/v/2.1.0 */
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
5
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
package/dist/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
- /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 1.6.3) */
2
- /* https://www.npmjs.com/package/@fastnear/intents/v/1.6.3 */
1
+ /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 2.1.0) */
2
+ /* https://www.npmjs.com/package/@fastnear/intents/v/2.1.0 */
3
3
  export * from "./types.js";
4
4
  export * from "./one-click.js";
5
5
  export * from "./signing.js";
package/dist/esm/node.js CHANGED
@@ -1,5 +1,5 @@
1
- /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 1.6.3) */
2
- /* https://www.npmjs.com/package/@fastnear/intents/v/1.6.3 */
1
+ /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 2.1.0) */
2
+ /* https://www.npmjs.com/package/@fastnear/intents/v/2.1.0 */
3
3
  var __defProp = Object.defineProperty;
4
4
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
5
  import {
@@ -1,5 +1,5 @@
1
- /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 1.6.3) */
2
- /* https://www.npmjs.com/package/@fastnear/intents/v/1.6.3 */
1
+ /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 2.1.0) */
2
+ /* https://www.npmjs.com/package/@fastnear/intents/v/2.1.0 */
3
3
  var __defProp = Object.defineProperty;
4
4
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
5
  import {
package/dist/esm/relay.js CHANGED
@@ -1,5 +1,5 @@
1
- /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 1.6.3) */
2
- /* https://www.npmjs.com/package/@fastnear/intents/v/1.6.3 */
1
+ /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 2.1.0) */
2
+ /* https://www.npmjs.com/package/@fastnear/intents/v/2.1.0 */
3
3
  var __defProp = Object.defineProperty;
4
4
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
5
  import { IntentsHttpError } from "./one-click.js";
@@ -1,5 +1,5 @@
1
- /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 1.6.3) */
2
- /* https://www.npmjs.com/package/@fastnear/intents/v/1.6.3 */
1
+ /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 2.1.0) */
2
+ /* https://www.npmjs.com/package/@fastnear/intents/v/2.1.0 */
3
3
  var __defProp = Object.defineProperty;
4
4
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
5
  import { base64ToBytes, bytesToBase64, toBase58 } from "@fastnear/utils";
package/dist/esm/types.js CHANGED
@@ -1,5 +1,5 @@
1
- /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 1.6.3) */
2
- /* https://www.npmjs.com/package/@fastnear/intents/v/1.6.3 */
1
+ /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 2.1.0) */
2
+ /* https://www.npmjs.com/package/@fastnear/intents/v/2.1.0 */
3
3
  const INTENTS_CONTRACT_ID = "intents.near";
4
4
  const ONE_CLICK_BASE_URL = "https://1click.chaindefuser.com";
5
5
  const SOLVER_RELAY_URL = "https://solver-relay-v2.chaindefuser.com/rpc";
@@ -1,5 +1,5 @@
1
- /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 1.6.3) */
2
- /* https://www.npmjs.com/package/@fastnear/intents/v/1.6.3 */
1
+ /* ⋈ 🏃🏻💨 FastNear intents - ESM (@fastnear/intents version 2.1.0) */
2
+ /* https://www.npmjs.com/package/@fastnear/intents/v/2.1.0 */
3
3
  var __defProp = Object.defineProperty;
4
4
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
5
  import { INTENTS_CONTRACT_ID } from "./types.js";
@@ -1,5 +1,5 @@
1
- /* ⋈ 🏃🏻💨 FastNear intents - IIFE/UMD (@fastnear/intents version 1.6.3) */
2
- /* https://www.npmjs.com/package/@fastnear/intents/v/1.6.3 */
1
+ /* ⋈ 🏃🏻💨 FastNear intents - IIFE/UMD (@fastnear/intents version 2.1.0) */
2
+ /* https://www.npmjs.com/package/@fastnear/intents/v/2.1.0 */
3
3
  "use strict";
4
4
  var nearIntents = (() => {
5
5
  var __defProp = Object.defineProperty;
@@ -427,6 +427,7 @@ var nearIntents = (() => {
427
427
 
428
428
  // ../utils/src/transaction.ts
429
429
  var SCHEMA = getBorshSchema();
430
+ var NEP461_DELEGATE_TAG = 2 ** 30 + 366;
430
431
 
431
432
  // src/signing.ts
432
433
  function randomNonce() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/types.ts","../../src/one-click.ts","../../../utils/node_modules/base58-js/base58_chars.js","../../../utils/node_modules/base58-js/create_base58_map.js","../../../utils/node_modules/base58-js/binary_to_base58.js","../../../../node_modules/js-base64/base64.mjs","../../../utils/src/storage.ts","../../../utils/src/misc.ts","../../../borsh-schema/src/index.ts","../../../utils/src/transaction.ts","../../src/signing.ts","../../src/verifier.ts","../../src/relay.ts"],"sourcesContent":["/**\n * @fastnear/intents — NEAR Intents (intents.near) for end users and agents:\n * a zero-dependency 1Click swap client, NEP-413 intent signing (wallet and\n * local-key), verifier deposit/withdraw/balance helpers, and a solver-relay\n * JSON-RPC client.\n *\n * Browser-safe: this root entry never touches private keys. The local-key\n * signer lives in @fastnear/intents/node.\n */\nexport * from \"./types.js\";\nexport * from \"./one-click.js\";\nexport * from \"./signing.js\";\nexport * from \"./verifier.js\";\nexport * from \"./relay.js\";\n","/**\n * Protocol types for NEAR Intents (the verifier contract `intents.near`,\n * the 1Click swap API, and the solver relay).\n *\n * Sources of truth:\n * - 1Click OpenAPI: https://1click.chaindefuser.com/docs/v0/openapi.yaml\n * - Verifier docs: https://docs.near-intents.org/integration/verifier-contract\n * - Solver relay: https://docs.near-intents.org/integration/market-makers/message-bus/rpc.md\n */\n\n/** The NEAR Intents verifier contract (mainnet). */\nexport const INTENTS_CONTRACT_ID = \"intents.near\";\n\n/** Hosted 1Click swap API base URL. */\nexport const ONE_CLICK_BASE_URL = \"https://1click.chaindefuser.com\";\n\n/** Hosted solver relay JSON-RPC endpoint. */\nexport const SOLVER_RELAY_URL = \"https://solver-relay-v2.chaindefuser.com/rpc\";\n\n/**\n * A multi-token id inside the verifier's NEP-245 ledger:\n * `nep141:<contract>`, `nep171:<contract>:<token_id>`, or\n * `nep245:<contract>:<token_id>`.\n */\nexport type IntentsTokenId = string;\n\n// ---------------------------------------------------------------------------\n// Intent types executed by intents.near\n// ---------------------------------------------------------------------------\n\n/**\n * Trade intent: per-token balance deltas for the signer. Negative amounts are\n * paid by the signer, positive amounts are received. The verifier requires all\n * diffs in a batch to sum to zero per token, so a counterparty (solver) signs\n * the mirror diff.\n */\nexport interface TokenDiffIntent {\n intent: \"token_diff\";\n diff: Record<IntentsTokenId, string>;\n memo?: string;\n referral?: string;\n}\n\n/** Internal ledger transfer to another intents.near account. */\nexport interface TransferIntent {\n intent: \"transfer\";\n receiver_id: string;\n tokens: Record<IntentsTokenId, string>;\n memo?: string;\n}\n\n/**\n * Withdraw a NEP-141 token out of the verifier. `token` is the plain token\n * contract id (no `nep141:` prefix). Omit `msg` for refundable ft_transfer\n * semantics; passing `msg` switches to ft_transfer_call with no refund.\n */\nexport interface FtWithdrawIntent {\n intent: \"ft_withdraw\";\n token: string;\n receiver_id: string;\n amount: string;\n memo?: string;\n msg?: string;\n storage_deposit?: string;\n}\n\nexport interface NftWithdrawIntent {\n intent: \"nft_withdraw\";\n token: string;\n receiver_id: string;\n token_id: string;\n memo?: string;\n msg?: string;\n storage_deposit?: string;\n}\n\nexport interface MtWithdrawIntent {\n intent: \"mt_withdraw\";\n token: string;\n receiver_id: string;\n token_ids: string[];\n amounts: string[];\n memo?: string;\n msg?: string;\n storage_deposit?: string;\n}\n\n/** The only way to withdraw native NEAR: unwraps internal wNEAR on exit. */\nexport interface NativeWithdrawIntent {\n intent: \"native_withdraw\";\n receiver_id: string;\n amount: string;\n}\n\n/**\n * Pay a NEP-145 storage_deposit on a token contract from the signer's\n * internal wNEAR balance (registers a receiver before a withdrawal lands).\n */\nexport interface StorageDepositIntent {\n intent: \"storage_deposit\";\n contract_id: string;\n account_id: string;\n amount: string;\n}\n\nexport type Intent =\n | TokenDiffIntent\n | TransferIntent\n | FtWithdrawIntent\n | NftWithdrawIntent\n | MtWithdrawIntent\n | NativeWithdrawIntent\n | StorageDepositIntent;\n\n/**\n * The inner message that gets signed. For the `nep413` standard this JSON\n * string becomes the NEP-413 `message`, while the verifying contract and\n * replay nonce live in the NEP-413 envelope (`recipient` / `nonce`).\n */\nexport interface IntentMessage {\n signer_id: string;\n /** ISO-8601 timestamp after which the signed intent is invalid. */\n deadline: string;\n intents: Intent[];\n}\n\n// ---------------------------------------------------------------------------\n// Signed payloads (MultiPayload)\n// ---------------------------------------------------------------------------\n\n/**\n * A NEP-413-signed intent as `intents.near`, the solver relay, and 1Click\n * accept it. Note the encodings: `nonce` is base64 of 32 bytes, while\n * `signature` and `public_key` are `ed25519:<base58>` strings — NOT the\n * base64 signature NEAR wallets return.\n */\nexport interface SignedIntentNep413 {\n standard: \"nep413\";\n payload: {\n message: string;\n nonce: string;\n recipient: string;\n callbackUrl?: string;\n };\n public_key: string;\n signature: string;\n}\n\n/**\n * Any signed payload standard the verifier accepts. This package produces\n * `nep413`; the other variants (erc191, tip191, raw_ed25519, webauthn,\n * ton_connect, sep53) are documented pass-through shapes.\n */\nexport type SignedIntent =\n | SignedIntentNep413\n | { standard: string; [key: string]: unknown };\n\n/**\n * An unsigned NEP-413 payload, as returned by 1Click's generate-intent\n * endpoint (nonce is base64 of 32 bytes when it arrives as a string).\n */\nexport interface UnsignedNep413Payload {\n message: string;\n nonce: string | Uint8Array;\n recipient: string;\n callbackUrl?: string;\n}\n\n/**\n * What signPayload accepts: a bare unsigned payload or the\n * { standard, payload } wrapper 1Click's generate-intent returns.\n */\nexport type GeneratedUnsignedIntent =\n | UnsignedNep413Payload\n | { standard: string; payload: UnsignedNep413Payload };\n\nexport interface SignPayloadOptions {\n /**\n * The verifying contract the payload's recipient must equal. Defaults to\n * intents.near — a server response naming any other recipient throws\n * instead of being signed. Set explicitly to sign for a different\n * (e.g. staging) verifier deployment.\n */\n expectedRecipient?: string;\n}\n\n/** The signer surface shared by the wallet and local-key implementations. */\nexport interface IntentSigner {\n /** Build and sign an intent message this client composes itself. */\n signIntents(params: SignIntentsParams): Promise<SignedIntentNep413>;\n /**\n * Sign a pre-built NEP-413 payload verbatim — the 1Click generate-intent\n * flow, where the server chooses the message, nonce, and recipient. The\n * recipient is pinned to intents.near unless options.expectedRecipient\n * overrides it, so a malicious or buggy server cannot redirect the\n * signature to another contract.\n */\n signPayload(\n payload: GeneratedUnsignedIntent,\n options?: SignPayloadOptions,\n ): Promise<SignedIntentNep413>;\n}\n\nexport interface SignIntentsParams {\n intents: Intent[];\n /** Defaults to the connected wallet account / the local signer account. */\n signerId?: string;\n /** ISO-8601; defaults to 5 minutes from now. */\n deadline?: string;\n /** 32 bytes; defaults to crypto-random. */\n nonce?: Uint8Array;\n /** Defaults to intents.near. Override only for a different verifier deployment. */\n verifyingContract?: string;\n}\n\n// ---------------------------------------------------------------------------\n// 1Click API shapes (v0)\n// ---------------------------------------------------------------------------\n\nexport type OneClickSwapType =\n | \"EXACT_INPUT\"\n | \"EXACT_OUTPUT\"\n | \"FLEX_INPUT\"\n | \"ANY_INPUT\";\n\nexport type OneClickDepositType =\n | \"ORIGIN_CHAIN\"\n | \"INTENTS\"\n | \"CONFIDENTIAL_INTENTS\";\n\nexport type OneClickRecipientType =\n | \"DESTINATION_CHAIN\"\n | \"INTENTS\"\n | \"CONFIDENTIAL_INTENTS\";\n\nexport type OneClickDepositMode = \"SIMPLE\" | \"MEMO\";\n\nexport interface OneClickToken {\n assetId: string;\n decimals: number;\n blockchain: string;\n symbol: string;\n price?: number;\n priceUpdatedAt?: string;\n contractAddress?: string;\n coingeckoId?: string;\n}\n\nexport interface OneClickAppFee {\n /** intents.near account that collects the fee. */\n recipient: string;\n /** Basis points. */\n fee: number;\n}\n\nexport interface OneClickQuoteRequest {\n /** true = price preview only (no depositAddress); false commits the quote. */\n dry: boolean;\n swapType: OneClickSwapType;\n /** Basis points, e.g. 100 = 1%. */\n slippageTolerance: number;\n originAsset: string;\n destinationAsset: string;\n /** Base units of the exact side selected by swapType. */\n amount: string;\n depositType: OneClickDepositType;\n refundTo: string;\n refundType: OneClickDepositType;\n recipient: string;\n recipientType: OneClickRecipientType;\n /** ISO-8601. */\n deadline: string;\n depositMode?: OneClickDepositMode;\n referral?: string;\n quoteWaitingTimeMs?: number;\n appFees?: OneClickAppFee[];\n insured?: boolean;\n connectedWallets?: unknown[];\n sessionId?: string;\n virtualChainRecipient?: string;\n virtualChainRefundRecipient?: string;\n customRecipientMsg?: string;\n}\n\nexport interface OneClickQuote {\n depositAddress?: string;\n depositMemo?: string;\n chainDepositAddresses?: Array<{ chain: string; depositAddress?: string; memo?: string }>;\n amountIn: string;\n amountInFormatted?: string;\n amountInUsd?: string;\n minAmountIn?: string;\n amountOut: string;\n amountOutFormatted?: string;\n amountOutUsd?: string;\n minAmountOut?: string;\n deadline?: string;\n timeWhenInactive?: string;\n timeEstimate?: number;\n refundFee?: string;\n withdrawFee?: string;\n virtualChainRecipient?: string;\n virtualChainRefundRecipient?: string;\n customRecipientMsg?: string;\n}\n\nexport interface OneClickQuoteResponse {\n correlationId?: string;\n timestamp: string;\n /** Server-signed quote (verifiable per the 1Click docs). */\n signature: string;\n quoteRequest: OneClickQuoteRequest;\n quote: OneClickQuote;\n}\n\nexport type OneClickStatus =\n | \"KNOWN_DEPOSIT_TX\"\n | \"PENDING_DEPOSIT\"\n | \"INCOMPLETE_DEPOSIT\"\n | \"PROCESSING\"\n | \"SUCCESS\"\n | \"REFUNDED\"\n | \"FAILED\";\n\nexport interface OneClickStatusResponse {\n correlationId?: string;\n quoteResponse: OneClickQuoteResponse;\n status: OneClickStatus;\n updatedAt: string;\n swapDetails?: {\n intentHashes?: string[];\n nearTxHashes?: string[];\n originChainTxHashes?: Array<{ hash: string; explorerUrl?: string }>;\n destinationChainTxHashes?: Array<{ hash: string; explorerUrl?: string }>;\n amountIn?: string;\n amountInFormatted?: string;\n amountInUsd?: string;\n amountOut?: string;\n amountOutFormatted?: string;\n amountOutUsd?: string;\n slippage?: number;\n depositedAmount?: string;\n refundedAmount?: string;\n refundReason?: string;\n withdrawFee?: string;\n referral?: string;\n };\n}\n\nexport interface OneClickSubmitDepositRequest {\n txHash: string;\n depositAddress: string;\n nearSenderAccount?: string;\n memo?: string;\n}\n\nexport type OneClickSigningStandard =\n | \"nep413\"\n | \"erc191\"\n | \"raw_ed25519\"\n | \"webauthn\"\n | \"ton_connect\"\n | \"sep53\"\n | \"tip191\";\n\nexport interface OneClickGenerateIntentRequest {\n signerId: string;\n depositAddress: string;\n standard?: OneClickSigningStandard;\n}\n\nexport interface OneClickGenerateIntentResponse {\n /** Unsigned payload to sign — pass it to an IntentSigner's signPayload. */\n intent: GeneratedUnsignedIntent;\n correlationId?: string;\n}\n\nexport interface OneClickSubmitIntentResponse {\n intentHash: string;\n correlationId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Solver relay JSON-RPC shapes\n// ---------------------------------------------------------------------------\n\nexport interface RelayQuoteParams {\n defuse_asset_identifier_in: IntentsTokenId;\n defuse_asset_identifier_out: IntentsTokenId;\n exact_amount_in?: string;\n exact_amount_out?: string;\n /** Milliseconds; relay default is 60000. */\n min_deadline_ms?: number;\n}\n\nexport interface RelayQuote {\n quote_hash: string;\n defuse_asset_identifier_in: IntentsTokenId;\n defuse_asset_identifier_out: IntentsTokenId;\n amount_in: string;\n amount_out: string;\n expiration_time: string;\n}\n\nexport type RelayIntentStatus =\n | \"PENDING\"\n | \"TX_BROADCASTED\"\n | \"SETTLED\"\n | \"NOT_FOUND_OR_NOT_VALID\";\n\nexport interface RelayPublishResult {\n status: string;\n intent_hash: string;\n}\n\nexport interface RelayStatusResult {\n intent_hash: string;\n status: RelayIntentStatus;\n status_details?: string;\n data?: { hash?: string };\n filled_amounts?: string[];\n}\n","import {\n ONE_CLICK_BASE_URL,\n type OneClickGenerateIntentRequest,\n type OneClickGenerateIntentResponse,\n type OneClickQuoteRequest,\n type OneClickQuoteResponse,\n type OneClickStatusResponse,\n type OneClickSubmitDepositRequest,\n type OneClickSubmitIntentResponse,\n type OneClickToken,\n type SignedIntent,\n} from \"./types.js\";\n\n/** Error thrown for non-2xx 1Click (and solver relay) HTTP responses. */\nexport class IntentsHttpError extends Error {\n readonly status: number;\n readonly body: unknown;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = \"IntentsHttpError\";\n this.status = status;\n this.body = body;\n }\n}\n\nexport interface OneClickClientOptions {\n baseUrl?: string;\n /** Partner API key (X-API-Key). Without one, quotes carry a 0.2% platform fee. */\n apiKey?: string;\n /** Legacy JWT bearer token — same fee waiver as apiKey. */\n jwt?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport interface OneClickClient {\n /** List supported assets; each entry's assetId is used in quotes. */\n tokens(): Promise<OneClickToken[]>;\n /** Request a quote. dry:true previews pricing; dry:false allocates the depositAddress. */\n quote(request: OneClickQuoteRequest): Promise<OneClickQuoteResponse>;\n /** Poll swap execution by deposit address. */\n status(params: {\n depositAddress: string;\n depositMemo?: string;\n }): Promise<OneClickStatusResponse>;\n /** Optional accelerator: report the deposit tx hash. */\n submitDeposit(\n request: OneClickSubmitDepositRequest,\n ): Promise<OneClickStatusResponse>;\n /** INTENTS deposit type: server builds the swap_transfer intent to sign. */\n generateIntent(\n request: OneClickGenerateIntentRequest,\n ): Promise<OneClickGenerateIntentResponse>;\n /** INTENTS deposit type: submit the signed intent. */\n submitIntent(params: {\n signedData: SignedIntent;\n }): Promise<OneClickSubmitIntentResponse>;\n}\n\nasync function parseBody(response: Response): Promise<unknown> {\n const text = await response.text();\n try {\n return text ? JSON.parse(text) : null;\n } catch {\n return text;\n }\n}\n\n/**\n * Zero-dependency typed client for the hosted 1Click swap API.\n * Works unauthenticated (0.2% platform fee baked into quotes); pass an\n * apiKey from https://partners.near-intents.org/ to waive it.\n */\nexport function createOneClickClient(\n options: OneClickClientOptions = {},\n): OneClickClient {\n const baseUrl = (options.baseUrl ?? ONE_CLICK_BASE_URL).replace(/\\/$/, \"\");\n const fetchImplementation = options.fetch ?? globalThis.fetch;\n if (typeof fetchImplementation !== \"function\") {\n throw new Error(\"A fetch implementation is required\");\n }\n\n const authHeaders: Record<string, string> = {};\n if (options.apiKey) authHeaders[\"X-API-Key\"] = options.apiKey;\n if (options.jwt) authHeaders.Authorization = `Bearer ${options.jwt}`;\n\n async function request<T>(\n method: \"GET\" | \"POST\",\n path: string,\n body?: unknown,\n ): Promise<T> {\n // Content-Type only when a body exists — a bodyless GET with\n // application/json forces an unnecessary CORS preflight in browsers.\n const headers =\n body === undefined\n ? authHeaders\n : { ...authHeaders, \"Content-Type\": \"application/json\" };\n const response = await fetchImplementation(`${baseUrl}${path}`, {\n method,\n headers,\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n });\n const parsed = await parseBody(response);\n if (!response.ok) {\n const detail =\n parsed && typeof parsed === \"object\" && \"message\" in parsed\n ? ` — ${JSON.stringify((parsed as { message: unknown }).message)}`\n : \"\";\n throw new IntentsHttpError(\n `1Click ${method} ${path} failed with ${response.status}${detail}`,\n response.status,\n parsed,\n );\n }\n return parsed as T;\n }\n\n return {\n tokens: () => request(\"GET\", \"/v0/tokens\"),\n quote: (quoteRequest) => request(\"POST\", \"/v0/quote\", quoteRequest),\n status: ({ depositAddress, depositMemo }) => {\n const query = new URLSearchParams({ depositAddress });\n if (depositMemo) query.set(\"depositMemo\", depositMemo);\n return request(\"GET\", `/v0/status?${query}`);\n },\n submitDeposit: (submitRequest) =>\n request(\"POST\", \"/v0/deposit/submit\", submitRequest),\n generateIntent: ({ standard = \"nep413\", signerId, depositAddress }) =>\n request(\"POST\", \"/v0/generate-intent\", {\n type: \"swap_transfer\",\n standard,\n signerId,\n depositAddress,\n }),\n submitIntent: ({ signedData }) =>\n request(\"POST\", \"/v0/submit-intent\", {\n type: \"swap_transfer\",\n signedData,\n }),\n };\n}\n","// @ts-check\n\n/**\n * Base58 characters include numbers 123456789, uppercase ABCDEFGHJKLMNPQRSTUVWXYZ and lowercase abcdefghijkmnopqrstuvwxyz.\n * @typedef {String} base58_chars Base58 characters include numbers 123456789, uppercase ABCDEFGHJKLMNPQRSTUVWXYZ and lowercase abcdefghijkmnopqrstuvwxyz.\n */\nconst base58_chars =\n \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n\nexport default base58_chars;\n","// @ts-check\n\nimport base58_chars from \"./base58_chars.js\";\n\n/**\n * Generates a mapping between base58 and ascii.\n * @returns {Array<Number>} mapping between ascii and base58.\n */\nconst create_base58_map = () => {\n const base58M = Array(256).fill(-1);\n for (let i = 0; i < base58_chars.length; ++i)\n base58M[base58_chars.charCodeAt(i)] = i;\n\n return base58M;\n};\n\nexport default create_base58_map;\n","// @ts-check\n\nimport base58_chars from \"./base58_chars.js\";\nimport create_base58_map from \"./create_base58_map.js\";\n\nconst base58Map = create_base58_map();\n\n/** @typedef {import(\"./base58_chars.js\").base58_chars} base58_chars */\n\n/**\n * Converts a Uint8Array into a base58 string.\n * @param {Uint8Array} uint8array Unsigned integer array.\n * @returns { import(\"./base58_chars.js\").base58_chars } base58 string representation of the binary array.\n * @example <caption>Usage.</caption>\n * ```js\n * const str = binary_to_base58([15, 239, 64])\n * console.log(str)\n * ```\n * Logged output will be 6MRy.\n */\nfunction binary_to_base58(uint8array) {\n const result = [];\n\n for (const byte of uint8array) {\n let carry = byte;\n for (let j = 0; j < result.length; ++j) {\n // @ts-ignore\n const x = (base58Map[result[j]] << 8) + carry;\n result[j] = base58_chars.charCodeAt(x % 58);\n carry = (x / 58) | 0;\n }\n while (carry) {\n result.push(base58_chars.charCodeAt(carry % 58));\n carry = (carry / 58) | 0;\n }\n }\n\n for (const byte of uint8array)\n if (byte) break;\n else result.push(\"1\".charCodeAt(0));\n\n result.reverse();\n\n return String.fromCharCode(...result);\n}\n\nexport default binary_to_base58;\n","/**\n * base64.ts\n *\n * Licensed under the BSD 3-Clause License.\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * References:\n * http://en.wikipedia.org/wiki/Base64\n *\n * @author Dan Kogai (https://github.com/dankogai)\n */\nconst version = '3.7.7';\n/**\n * @deprecated use lowercase `version`.\n */\nconst VERSION = version;\nconst _hasBuffer = typeof Buffer === 'function';\nconst _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined;\nconst _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;\nconst b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nconst b64chs = Array.prototype.slice.call(b64ch);\nconst b64tab = ((a) => {\n let tab = {};\n a.forEach((c, i) => tab[c] = i);\n return tab;\n})(b64chs);\nconst b64re = /^(?:[A-Za-z\\d+\\/]{4})*?(?:[A-Za-z\\d+\\/]{2}(?:==)?|[A-Za-z\\d+\\/]{3}=?)?$/;\nconst _fromCC = String.fromCharCode.bind(String);\nconst _U8Afrom = typeof Uint8Array.from === 'function'\n ? Uint8Array.from.bind(Uint8Array)\n : (it) => new Uint8Array(Array.prototype.slice.call(it, 0));\nconst _mkUriSafe = (src) => src\n .replace(/=/g, '').replace(/[+\\/]/g, (m0) => m0 == '+' ? '-' : '_');\nconst _tidyB64 = (s) => s.replace(/[^A-Za-z0-9\\+\\/]/g, '');\n/**\n * polyfill version of `btoa`\n */\nconst btoaPolyfill = (bin) => {\n // console.log('polyfilled');\n let u32, c0, c1, c2, asc = '';\n const pad = bin.length % 3;\n for (let i = 0; i < bin.length;) {\n if ((c0 = bin.charCodeAt(i++)) > 255 ||\n (c1 = bin.charCodeAt(i++)) > 255 ||\n (c2 = bin.charCodeAt(i++)) > 255)\n throw new TypeError('invalid character found');\n u32 = (c0 << 16) | (c1 << 8) | c2;\n asc += b64chs[u32 >> 18 & 63]\n + b64chs[u32 >> 12 & 63]\n + b64chs[u32 >> 6 & 63]\n + b64chs[u32 & 63];\n }\n return pad ? asc.slice(0, pad - 3) + \"===\".substring(pad) : asc;\n};\n/**\n * does what `window.btoa` of web browsers do.\n * @param {String} bin binary string\n * @returns {string} Base64-encoded string\n */\nconst _btoa = typeof btoa === 'function' ? (bin) => btoa(bin)\n : _hasBuffer ? (bin) => Buffer.from(bin, 'binary').toString('base64')\n : btoaPolyfill;\nconst _fromUint8Array = _hasBuffer\n ? (u8a) => Buffer.from(u8a).toString('base64')\n : (u8a) => {\n // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326\n const maxargs = 0x1000;\n let strs = [];\n for (let i = 0, l = u8a.length; i < l; i += maxargs) {\n strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));\n }\n return _btoa(strs.join(''));\n };\n/**\n * converts a Uint8Array to a Base64 string.\n * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5\n * @returns {string} Base64 string\n */\nconst fromUint8Array = (u8a, urlsafe = false) => urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const utob = (src: string) => unescape(encodeURIComponent(src));\n// reverting good old fationed regexp\nconst cb_utob = (c) => {\n if (c.length < 2) {\n var cc = c.charCodeAt(0);\n return cc < 0x80 ? c\n : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))\n + _fromCC(0x80 | (cc & 0x3f)))\n : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))\n + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n + _fromCC(0x80 | (cc & 0x3f)));\n }\n else {\n var cc = 0x10000\n + (c.charCodeAt(0) - 0xD800) * 0x400\n + (c.charCodeAt(1) - 0xDC00);\n return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))\n + _fromCC(0x80 | ((cc >>> 12) & 0x3f))\n + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n + _fromCC(0x80 | (cc & 0x3f)));\n }\n};\nconst re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-8 string\n * @returns {string} UTF-16 string\n */\nconst utob = (u) => u.replace(re_utob, cb_utob);\n//\nconst _encode = _hasBuffer\n ? (s) => Buffer.from(s, 'utf8').toString('base64')\n : _TE\n ? (s) => _fromUint8Array(_TE.encode(s))\n : (s) => _btoa(utob(s));\n/**\n * converts a UTF-8-encoded string to a Base64 string.\n * @param {boolean} [urlsafe] if `true` make the result URL-safe\n * @returns {string} Base64 string\n */\nconst encode = (src, urlsafe = false) => urlsafe\n ? _mkUriSafe(_encode(src))\n : _encode(src);\n/**\n * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5.\n * @returns {string} Base64 string\n */\nconst encodeURI = (src) => encode(src, true);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const btou = (src: string) => decodeURIComponent(escape(src));\n// reverting good old fationed regexp\nconst re_btou = /[\\xC0-\\xDF][\\x80-\\xBF]|[\\xE0-\\xEF][\\x80-\\xBF]{2}|[\\xF0-\\xF7][\\x80-\\xBF]{3}/g;\nconst cb_btou = (cccc) => {\n switch (cccc.length) {\n case 4:\n var cp = ((0x07 & cccc.charCodeAt(0)) << 18)\n | ((0x3f & cccc.charCodeAt(1)) << 12)\n | ((0x3f & cccc.charCodeAt(2)) << 6)\n | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;\n return (_fromCC((offset >>> 10) + 0xD800)\n + _fromCC((offset & 0x3FF) + 0xDC00));\n case 3:\n return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)\n | ((0x3f & cccc.charCodeAt(1)) << 6)\n | (0x3f & cccc.charCodeAt(2)));\n default:\n return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)\n | (0x3f & cccc.charCodeAt(1)));\n }\n};\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-16 string\n * @returns {string} UTF-8 string\n */\nconst btou = (b) => b.replace(re_btou, cb_btou);\n/**\n * polyfill version of `atob`\n */\nconst atobPolyfill = (asc) => {\n // console.log('polyfilled');\n asc = asc.replace(/\\s+/g, '');\n if (!b64re.test(asc))\n throw new TypeError('malformed base64.');\n asc += '=='.slice(2 - (asc.length & 3));\n let u24, bin = '', r1, r2;\n for (let i = 0; i < asc.length;) {\n u24 = b64tab[asc.charAt(i++)] << 18\n | b64tab[asc.charAt(i++)] << 12\n | (r1 = b64tab[asc.charAt(i++)]) << 6\n | (r2 = b64tab[asc.charAt(i++)]);\n bin += r1 === 64 ? _fromCC(u24 >> 16 & 255)\n : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255)\n : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255);\n }\n return bin;\n};\n/**\n * does what `window.atob` of web browsers do.\n * @param {String} asc Base64-encoded string\n * @returns {string} binary string\n */\nconst _atob = typeof atob === 'function' ? (asc) => atob(_tidyB64(asc))\n : _hasBuffer ? (asc) => Buffer.from(asc, 'base64').toString('binary')\n : atobPolyfill;\n//\nconst _toUint8Array = _hasBuffer\n ? (a) => _U8Afrom(Buffer.from(a, 'base64'))\n : (a) => _U8Afrom(_atob(a).split('').map(c => c.charCodeAt(0)));\n/**\n * converts a Base64 string to a Uint8Array.\n */\nconst toUint8Array = (a) => _toUint8Array(_unURI(a));\n//\nconst _decode = _hasBuffer\n ? (a) => Buffer.from(a, 'base64').toString('utf8')\n : _TD\n ? (a) => _TD.decode(_toUint8Array(a))\n : (a) => btou(_atob(a));\nconst _unURI = (a) => _tidyB64(a.replace(/[-_]/g, (m0) => m0 == '-' ? '+' : '/'));\n/**\n * converts a Base64 string to a UTF-8 string.\n * @param {String} src Base64 string. Both normal and URL-safe are supported\n * @returns {string} UTF-8 string\n */\nconst decode = (src) => _decode(_unURI(src));\n/**\n * check if a value is a valid Base64 string\n * @param {String} src a value to check\n */\nconst isValid = (src) => {\n if (typeof src !== 'string')\n return false;\n const s = src.replace(/\\s+/g, '').replace(/={0,2}$/, '');\n return !/[^\\s0-9a-zA-Z\\+/]/.test(s) || !/[^\\s0-9a-zA-Z\\-_]/.test(s);\n};\n//\nconst _noEnum = (v) => {\n return {\n value: v, enumerable: false, writable: true, configurable: true\n };\n};\n/**\n * extend String.prototype with relevant methods\n */\nconst extendString = function () {\n const _add = (name, body) => Object.defineProperty(String.prototype, name, _noEnum(body));\n _add('fromBase64', function () { return decode(this); });\n _add('toBase64', function (urlsafe) { return encode(this, urlsafe); });\n _add('toBase64URI', function () { return encode(this, true); });\n _add('toBase64URL', function () { return encode(this, true); });\n _add('toUint8Array', function () { return toUint8Array(this); });\n};\n/**\n * extend Uint8Array.prototype with relevant methods\n */\nconst extendUint8Array = function () {\n const _add = (name, body) => Object.defineProperty(Uint8Array.prototype, name, _noEnum(body));\n _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });\n _add('toBase64URI', function () { return fromUint8Array(this, true); });\n _add('toBase64URL', function () { return fromUint8Array(this, true); });\n};\n/**\n * extend Builtin prototypes with relevant methods\n */\nconst extendBuiltins = () => {\n extendString();\n extendUint8Array();\n};\nconst gBase64 = {\n version: version,\n VERSION: VERSION,\n atob: _atob,\n atobPolyfill: atobPolyfill,\n btoa: _btoa,\n btoaPolyfill: btoaPolyfill,\n fromBase64: decode,\n toBase64: encode,\n encode: encode,\n encodeURI: encodeURI,\n encodeURL: encodeURI,\n utob: utob,\n btou: btou,\n decode: decode,\n isValid: isValid,\n fromUint8Array: fromUint8Array,\n toUint8Array: toUint8Array,\n extendString: extendString,\n extendUint8Array: extendUint8Array,\n extendBuiltins: extendBuiltins\n};\n// makecjs:CUT //\nexport { version };\nexport { VERSION };\nexport { _atob as atob };\nexport { atobPolyfill };\nexport { _btoa as btoa };\nexport { btoaPolyfill };\nexport { decode as fromBase64 };\nexport { encode as toBase64 };\nexport { utob };\nexport { encode };\nexport { encodeURI };\nexport { encodeURI as encodeURL };\nexport { btou };\nexport { decode };\nexport { isValid };\nexport { fromUint8Array };\nexport { toUint8Array };\nexport { extendString };\nexport { extendUint8Array };\nexport { extendBuiltins };\n// and finally,\nexport { gBase64 as Base64 };\n","export const LsPrefix = \"__fastnear_\";\n\nexport interface StorageBackend {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n clear(): void;\n}\n\nexport const memoryStore = new Map<string, string>(); // Internal memory storage\n\nconst memoryStorageBackend: StorageBackend = {\n getItem: (key) => memoryStore.get(key) || null,\n setItem: (key, value) => memoryStore.set(key, value),\n removeItem: (key) => memoryStore.delete(key),\n clear: () => memoryStore.clear(),\n};\n\n// Default: Use `localStorage` if available, otherwise an in-memory fallback.\n// Some environments expose `localStorage` but throw on access, such as `data:` URLs.\nexport const createDefaultStorage = (): StorageBackend => {\n try {\n if (\n typeof globalThis !== \"undefined\" &&\n \"localStorage\" in globalThis &&\n globalThis.localStorage\n ) {\n return globalThis.localStorage;\n }\n } catch {\n // Fall through to memory storage.\n }\n\n return memoryStorageBackend;\n};\n\nlet storageBackend: StorageBackend = createDefaultStorage();\n\n// Functional storage module\nexport const storage = {\n setBackend: (customBackend: StorageBackend) => {\n storageBackend = customBackend;\n },\n\n set: (key: string, value: any) => {\n if (value === null || value === undefined) {\n storageBackend.removeItem(LsPrefix + key);\n } else {\n storageBackend.setItem(LsPrefix + key, JSON.stringify(value));\n }\n },\n\n get: (key: string): any => {\n const value = storageBackend.getItem(LsPrefix + key);\n if (value === null) return null;\n try {\n return JSON.parse(value);\n } catch {\n return value; // Return raw string if not JSON\n }\n },\n\n remove: (key: string) => storageBackend.removeItem(key),\n clear: () => storageBackend.clear(),\n};\n","import {\n binary_to_base58 as toBase58,\n base58_to_binary as fromBase58,\n} from \"base58-js\";\nimport {\n encode as JsBase64Encode,\n decode as JsBase64Decode,\n fromUint8Array as JsBase64FromUint8Array,\n toUint8Array as JsBase64ToUint8Array\n} from 'js-base64';\nimport { storage } from \"./storage.js\";\n\nexport { toBase58, fromBase58 };\n\nexport function toHex(data: Uint8Array): string {\n return Array.from(data)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nexport function fromHex(hex: string): Uint8Array {\n if (hex.length % 2) throw new Error('Hex string must be even length');\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i/2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n}\n\nexport function base64ToBytes(b64Val: string): Uint8Array {\n return JsBase64ToUint8Array(b64Val);\n}\n\nexport function bytesToBase64(bytesArr: Uint8Array): string {\n return JsBase64FromUint8Array(bytesArr);\n}\n\nexport function toBase64(strVal: string) {\n try {\n return JsBase64Encode(strVal);\n } catch (e) {\n console.error('Issue base64 encoding', e);\n return null;\n }\n}\n\nexport function fromBase64(strVal: string) {\n try {\n return JsBase64Decode(strVal);\n } catch (e) {\n console.error('Issue base64 decoding', e);\n return null;\n }\n}\n\n// NEAR unit math lives in the dependency-free ./units.js so it can be pulled\n// into size-sensitive bundles without dragging misc's storage/codec imports.\nexport { convertUnit } from \"./units.js\";\n\nexport function lsSet(key: string, value: any) {\n storage.set(key, value);\n}\n\nexport function lsGet(key: string): any {\n return storage.get(key);\n}\n\nexport function deepCopy(obj: any) {\n return JSON.parse(JSON.stringify(obj));\n}\n\nexport function tryParseJson(...args: any[]) {\n try {\n return JSON.parse(args[0]);\n } catch {\n if (args.length > 1) {\n return args[1];\n }\n return args[0];\n }\n}\n\nexport function parseJsonFromBytes(bytes: Uint8Array) {\n try {\n const decoder = new TextDecoder();\n return JSON.parse(\n decoder.decode(bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes))\n );\n } catch (e) {\n try {\n return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n } catch (e) {\n return bytes;\n }\n }\n}\n\n/**\n * NEP-413 standard message payload for wallet signing.\n */\nexport interface NEP413Message {\n message: string;\n nonce: Uint8Array;\n recipient: string;\n callbackUrl?: string | null;\n state?: string | null;\n}\n\nexport function canSignWithLAK(\n actions: ReadonlyArray<{\n type: string;\n deposit?: string | number | bigint;\n }>,\n) {\n return (\n actions.length === 1 &&\n actions[0].type === \"FunctionCall\" &&\n BigInt(actions[0]?.deposit ?? \"0\") === 0n\n );\n}\n","import type { Schema } from \"@fastnear/borsh\"\n\nexport const nearChainSchema = new (class BorshSchema {\n Ed25519Signature: Schema = {\n struct: {\n data: { array: { type: \"u8\", len: 64 } },\n },\n };\n Secp256k1Signature: Schema = {\n struct: {\n data: { array: { type: \"u8\", len: 65 } },\n },\n };\n MlDsa65Signature: Schema = {\n struct: {\n data: { array: { type: \"u8\", len: 3309 } },\n },\n };\n Signature: Schema = {\n enum: [\n { struct: { ed25519Signature: this.Ed25519Signature } },\n { struct: { secp256k1Signature: this.Secp256k1Signature } },\n { struct: { mlDsa65Signature: this.MlDsa65Signature } },\n ],\n };\n Ed25519Data: Schema = {\n struct: {\n data: { array: { type: \"u8\", len: 32 } },\n },\n };\n Secp256k1Data: Schema = {\n struct: {\n data: { array: { type: \"u8\", len: 64 } },\n },\n };\n MlDsa65Data: Schema = {\n struct: {\n data: { array: { type: \"u8\", len: 1952 } },\n },\n };\n PublicKey: Schema = {\n enum: [\n { struct: { ed25519Key: this.Ed25519Data } },\n { struct: { secp256k1Key: this.Secp256k1Data } },\n { struct: { mlDsa65Key: this.MlDsa65Data } },\n ],\n };\n FunctionCallPermission: Schema = {\n struct: {\n allowance: { option: \"u128\" },\n receiverId: \"string\",\n methodNames: { array: { type: \"string\" } },\n },\n };\n FullAccessPermission: Schema = {\n struct: {},\n };\n AccessKeyPermission: Schema = {\n enum: [\n { struct: { functionCall: this.FunctionCallPermission } },\n { struct: { fullAccess: this.FullAccessPermission } },\n ],\n };\n AccessKey: Schema = {\n struct: {\n nonce: \"u64\",\n permission: this.AccessKeyPermission,\n },\n };\n CreateAccount: Schema = {\n struct: {},\n };\n DeployContract: Schema = {\n struct: {\n code: { array: { type: \"u8\" } },\n },\n };\n FunctionCall: Schema = {\n struct: {\n methodName: \"string\",\n args: { array: { type: \"u8\" } },\n gas: \"u64\",\n deposit: \"u128\",\n },\n };\n Transfer: Schema = {\n struct: {\n deposit: \"u128\",\n },\n };\n Stake: Schema = {\n struct: {\n stake: \"u128\",\n publicKey: this.PublicKey,\n },\n };\n AddKey: Schema = {\n struct: {\n publicKey: this.PublicKey,\n accessKey: this.AccessKey,\n },\n };\n DeleteKey: Schema = {\n struct: {\n publicKey: this.PublicKey,\n },\n };\n DeleteAccount: Schema = {\n struct: {\n beneficiaryId: \"string\",\n },\n };\n ClassicAction: Schema = {\n enum: [\n { struct: { createAccount: this.CreateAccount } },\n { struct: { deployContract: this.DeployContract } },\n { struct: { functionCall: this.FunctionCall } },\n { struct: { transfer: this.Transfer } },\n { struct: { stake: this.Stake } },\n { struct: { addKey: this.AddKey } },\n { struct: { deleteKey: this.DeleteKey } },\n { struct: { deleteAccount: this.DeleteAccount } },\n ],\n };\n DelegateAction: Schema = {\n struct: {\n senderId: \"string\",\n receiverId: \"string\",\n actions: { array: { type: this.ClassicAction } },\n nonce: \"u64\",\n maxBlockHeight: \"u64\",\n publicKey: this.PublicKey,\n },\n };\n SignedDelegate: Schema = {\n struct: {\n delegateAction: this.DelegateAction,\n signature: this.Signature,\n },\n };\n Action: Schema = {\n enum: [\n { struct: { createAccount: this.CreateAccount } },\n { struct: { deployContract: this.DeployContract } },\n { struct: { functionCall: this.FunctionCall } },\n { struct: { transfer: this.Transfer } },\n { struct: { stake: this.Stake } },\n { struct: { addKey: this.AddKey } },\n { struct: { deleteKey: this.DeleteKey } },\n { struct: { deleteAccount: this.DeleteAccount } },\n { struct: { signedDelegate: this.SignedDelegate } },\n ],\n };\n Transaction: Schema = {\n struct: {\n signerId: \"string\",\n publicKey: this.PublicKey,\n nonce: \"u64\",\n receiverId: \"string\",\n blockHash: { array: { type: \"u8\", len: 32 } },\n actions: { array: { type: this.Action } },\n },\n };\n SignedTransaction: Schema = {\n struct: {\n transaction: this.Transaction,\n signature: this.Signature,\n },\n };\n})();\n\nexport const getBorshSchema = () => nearChainSchema;\n","import { serialize as borshSerialize } from \"@fastnear/borsh\";\nimport {\n assertNearValidatorPublicKey,\n decodeNearPublicKey,\n keyFromString,\n keyTypeFromString,\n NEAR_KEY_DESCRIPTORS,\n type NearPublicKey,\n} from \"./crypto.js\";\nimport { base64ToBytes, fromBase58 } from \"./misc.js\";\nimport { convertUnit } from \"./units.js\";\nimport { getBorshSchema } from \"@fastnear/borsh-schema\";\n\nexport type NearInteger = string | bigint | number;\n\n/**\n * Coerce a NearInteger amount field (gas, deposit, stake, allowance) to bigint.\n *\n * String values may carry a human unit suffix — \"100 Tgas\", \"0.01 NEAR\" —\n * which is exactly the shape the wallet path and the demo site's action\n * config use. `convertUnit` scales those to a plain yocto/gas integer string\n * (and is a no-op on unit-less digits), so local signing via `near.sendTx`\n * accepts the same action shape the wallet path does instead of throwing a\n * bare `BigInt` conversion error.\n */\nfunction toNearAmount(\n value: NearInteger | null | undefined,\n fallback: NearInteger = 0,\n): bigint {\n const resolved = value ?? fallback;\n if (typeof resolved === \"bigint\") return resolved;\n if (typeof resolved === \"number\") return BigInt(resolved);\n return BigInt(convertUnit(resolved.trim()));\n}\n\nexport interface NearCreateAccountAction {\n type: \"CreateAccount\";\n}\n\nexport interface NearDeployContractAction {\n type: \"DeployContract\";\n codeBase64: string;\n}\n\nexport interface NearFunctionCallAction {\n type: \"FunctionCall\";\n methodName: string;\n args?: unknown;\n argsBase64?: string | null;\n gas?: NearInteger;\n deposit?: NearInteger;\n}\n\nexport interface NearTransferAction {\n type: \"Transfer\";\n deposit: NearInteger;\n}\n\nexport interface NearStakeAction {\n type: \"Stake\";\n stake: NearInteger;\n publicKey: NearPublicKey;\n}\n\nexport interface NearFunctionCallPermission {\n receiverId: string;\n methodNames?: string[];\n allowance?: NearInteger | null;\n}\n\nexport interface NearAccessKey {\n nonce?: NearInteger;\n permission: \"FullAccess\" | \"FunctionCall\" | NearFunctionCallPermission;\n receiverId?: string;\n methodNames?: string[];\n allowance?: NearInteger | null;\n}\n\nexport interface NearAddKeyAction {\n type: \"AddKey\";\n publicKey: NearPublicKey;\n accessKey: NearAccessKey;\n}\n\nexport interface NearDeleteKeyAction {\n type: \"DeleteKey\";\n publicKey: NearPublicKey;\n}\n\nexport interface NearDeleteAccountAction {\n type: \"DeleteAccount\";\n beneficiaryId: string;\n}\n\nexport type NearClassicAction =\n | NearCreateAccountAction\n | NearDeployContractAction\n | NearFunctionCallAction\n | NearTransferAction\n | NearStakeAction\n | NearAddKeyAction\n | NearDeleteKeyAction\n | NearDeleteAccountAction;\n\nexport interface NearDelegateAction {\n senderId: string;\n receiverId: string;\n actions: NearClassicAction[];\n nonce: NearInteger;\n maxBlockHeight: NearInteger;\n publicKey: NearPublicKey;\n}\n\nexport interface NearSignedDelegateAction {\n type: \"SignedDelegate\";\n delegateAction: NearDelegateAction;\n signature: string | Uint8Array;\n publicKey?: NearPublicKey;\n}\n\nexport type NearAction = NearClassicAction | NearSignedDelegateAction;\n\nexport interface PlainTransaction {\n signerId: string;\n publicKey: NearPublicKey;\n nonce: NearInteger;\n receiverId: string;\n blockHash: string;\n actions: NearAction[];\n}\n\nexport interface PlainSignedTransaction {\n transaction: object;\n signature: object;\n}\n\n// Function to return a JSON-ready version of the transaction\nexport const txToJson = (tx: PlainTransaction): Record<string, any> => {\n return JSON.parse(\n JSON.stringify(tx, (_key, value) =>\n typeof value === \"bigint\" ? value.toString() : value,\n ),\n );\n};\n\n// Return a compact JSON string of the transaction (for display/logging)\nexport const txToJsonStringified = (tx: PlainTransaction): string => {\n return JSON.stringify(txToJson(tx));\n};\n\nfunction mapPublicKey(keyString: string) {\n const { keyType, data } = decodeNearPublicKey(keyString);\n return { [NEAR_KEY_DESCRIPTORS[keyType].publicKeyVariant]: { data } };\n}\n\nfunction mapSignature(signature: string | Uint8Array, signerKeyString: string) {\n const keyType = keyTypeFromString(signerKeyString);\n let data: Uint8Array;\n if (typeof signature === \"string\") {\n if (signature.includes(\":\")) {\n const signatureKeyType = keyTypeFromString(signature);\n if (signatureKeyType !== keyType) {\n throw new Error(\n `Signature key type ${signatureKeyType} does not match signer key type ${keyType}`,\n );\n }\n data = keyFromString(signature);\n } else {\n data = keyFromString(`${keyType}:${signature}`);\n }\n } else {\n data = signature;\n }\n const expected = NEAR_KEY_DESCRIPTORS[keyType].signatureLength;\n if (data.length !== expected) {\n throw new Error(\n `Invalid ${keyType} signature length: expected ${expected} bytes, got ${data.length}`,\n );\n }\n\n return { [NEAR_KEY_DESCRIPTORS[keyType].signatureVariant]: { data } };\n}\n\nexport function mapTransaction(jsonTransaction: PlainTransaction) {\n return {\n signerId: jsonTransaction.signerId,\n publicKey: mapPublicKey(jsonTransaction.publicKey),\n nonce: BigInt(jsonTransaction.nonce),\n receiverId: jsonTransaction.receiverId,\n blockHash: fromBase58(jsonTransaction.blockHash),\n actions: jsonTransaction.actions.map(mapAction),\n };\n}\n\nexport function serializeTransaction(jsonTransaction: PlainTransaction) {\n const transaction = mapTransaction(jsonTransaction);\n return borshSerialize(SCHEMA.Transaction, transaction);\n}\n\nexport function serializeSignedTransaction(\n jsonTransaction: PlainTransaction,\n signature: string | Uint8Array,\n) {\n const mappedSignedTx = mapTransaction(jsonTransaction);\n\n const plainSignedTransaction: PlainSignedTransaction = {\n transaction: mappedSignedTx,\n signature: mapSignature(signature, jsonTransaction.publicKey),\n };\n\n return borshSerialize(SCHEMA.SignedTransaction, plainSignedTransaction);\n}\n\nexport function mapAction(action: NearAction): object {\n switch (action.type) {\n case \"CreateAccount\": {\n return {\n createAccount: {},\n };\n }\n case \"DeployContract\": {\n return {\n deployContract: {\n code: base64ToBytes(action.codeBase64),\n },\n };\n }\n case \"FunctionCall\": {\n return {\n functionCall: {\n methodName: action.methodName,\n args:\n action.argsBase64 !== null && action.argsBase64 !== undefined\n ? base64ToBytes(action.argsBase64)\n : new TextEncoder().encode(JSON.stringify(action.args ?? {})),\n gas: toNearAmount(action.gas, \"300000000000000\"),\n deposit: toNearAmount(action.deposit),\n },\n };\n }\n case \"Transfer\": {\n return {\n transfer: {\n deposit: toNearAmount(action.deposit),\n },\n };\n }\n case \"Stake\": {\n assertNearValidatorPublicKey(action.publicKey);\n return {\n stake: {\n stake: toNearAmount(action.stake),\n publicKey: mapPublicKey(action.publicKey),\n },\n };\n }\n case \"AddKey\": {\n const permission = action.accessKey.permission;\n if (\n permission !== \"FullAccess\" &&\n permission !== \"FunctionCall\" &&\n (permission == null || typeof permission !== \"object\")\n ) {\n throw new Error(`Unsupported access-key permission: ${String(permission)}`);\n }\n const functionCall =\n typeof permission === \"object\" ? permission : action.accessKey;\n if (\n permission !== \"FullAccess\" &&\n typeof functionCall.receiverId !== \"string\"\n ) {\n throw new Error(\"Function-call access keys require a receiverId\");\n }\n\n return {\n addKey: {\n publicKey: mapPublicKey(action.publicKey),\n accessKey: {\n nonce: BigInt(action.accessKey.nonce ?? 0),\n permission:\n permission === \"FullAccess\"\n ? { fullAccess: {} }\n : {\n functionCall: {\n allowance: functionCall.allowance != null\n ? toNearAmount(functionCall.allowance)\n : null,\n receiverId: functionCall.receiverId,\n methodNames: functionCall.methodNames ?? [],\n },\n },\n },\n },\n };\n }\n case \"DeleteKey\": {\n return {\n deleteKey: {\n publicKey: mapPublicKey(action.publicKey),\n },\n };\n }\n case \"DeleteAccount\": {\n return {\n deleteAccount: {\n beneficiaryId: action.beneficiaryId,\n },\n };\n }\n case \"SignedDelegate\": {\n const delegate = action.delegateAction;\n if (action.publicKey && action.publicKey !== delegate.publicKey) {\n throw new Error(\n \"SignedDelegate publicKey must match delegateAction.publicKey\",\n );\n }\n return {\n signedDelegate: {\n delegateAction: {\n senderId: delegate.senderId,\n receiverId: delegate.receiverId,\n actions: delegate.actions.map(mapAction),\n nonce: BigInt(delegate.nonce),\n maxBlockHeight: BigInt(delegate.maxBlockHeight),\n publicKey: mapPublicKey(delegate.publicKey),\n },\n signature: mapSignature(action.signature, delegate.publicKey),\n },\n };\n }\n default: {\n throw new Error(\n \"Not implemented action: \" + (action as { type?: unknown }).type,\n );\n }\n }\n}\n\nexport const SCHEMA = getBorshSchema();\n","import { base64ToBytes, bytesToBase64, toBase58 } from \"@fastnear/utils\";\nimport {\n INTENTS_CONTRACT_ID,\n type Intent,\n type IntentMessage,\n type IntentSigner,\n type SignIntentsParams,\n type GeneratedUnsignedIntent,\n type SignPayloadOptions,\n type SignedIntentNep413,\n type UnsignedNep413Payload,\n} from \"./types.js\";\n\n/** Crypto-random 32-byte NEP-413 nonce (the verifier's replay nonce). */\nexport function randomNonce(): Uint8Array {\n return crypto.getRandomValues(new Uint8Array(32));\n}\n\nconst DEFAULT_DEADLINE_MS = 5 * 60 * 1000;\n\n/** ISO-8601 deadline `ms` milliseconds from now (default 5 minutes). */\nexport function defaultDeadline(ms: number = DEFAULT_DEADLINE_MS): string {\n return new Date(Date.now() + ms).toISOString();\n}\n\n/** Build the inner intent message that gets signed. */\nexport function buildIntentMessage({\n signerId,\n intents,\n deadline,\n}: {\n signerId: string;\n intents: Intent[];\n deadline?: string;\n}): IntentMessage {\n if (!signerId) throw new Error(\"signerId is required\");\n if (!Array.isArray(intents) || intents.length === 0) {\n throw new Error(\"At least one intent is required\");\n }\n return {\n signer_id: signerId,\n deadline: deadline ?? defaultDeadline(),\n intents,\n };\n}\n\n/**\n * Encode a NEP-413 signature the way intents.near expects it:\n * `ed25519:<base58>` (or `secp256k1:<base58>` for 65-byte signatures).\n *\n * NEAR wallets return the signature as plain base64 per NEP-413 — passing\n * that through unconverted is the most common integration bug.\n */\nexport function encodeIntentSignature(\n signature: string | Uint8Array,\n): string {\n if (typeof signature === \"string\") {\n if (\n signature.startsWith(\"ed25519:\") ||\n signature.startsWith(\"secp256k1:\")\n ) {\n return signature;\n }\n return encodeIntentSignature(base64ToBytes(signature));\n }\n if (signature.length === 64) return `ed25519:${toBase58(signature)}`;\n if (signature.length === 65) return `secp256k1:${toBase58(signature)}`;\n throw new Error(\n `Unsupported NEP-413 signature length: ${signature.length} (expected 64 or 65 bytes)`,\n );\n}\n\n/** Ensure a public key string carries its curve prefix. */\nexport function normalizeIntentPublicKey(publicKey: string): string {\n if (!publicKey) throw new Error(\"A public key is required\");\n return publicKey.includes(\":\") ? publicKey : `ed25519:${publicKey}`;\n}\n\n/**\n * Assemble the signed MultiPayload from NEP-413 parts. Accepts the\n * signature as wallet base64, raw bytes, or an already-prefixed string.\n */\nexport function toSignedIntent({\n message,\n nonce,\n recipient = INTENTS_CONTRACT_ID,\n publicKey,\n signature,\n callbackUrl,\n}: {\n message: IntentMessage | string;\n nonce: Uint8Array;\n recipient?: string;\n publicKey: string;\n signature: string | Uint8Array;\n callbackUrl?: string;\n}): SignedIntentNep413 {\n if (nonce.length !== 32) {\n throw new Error(`NEP-413 nonce must be exactly 32 bytes, got ${nonce.length}`);\n }\n return {\n standard: \"nep413\",\n payload: {\n message: typeof message === \"string\" ? message : JSON.stringify(message),\n nonce: bytesToBase64(nonce),\n recipient,\n ...(callbackUrl ? { callbackUrl } : {}),\n },\n public_key: normalizeIntentPublicKey(publicKey),\n signature: encodeIntentSignature(signature),\n };\n}\n\n/**\n * Normalize an unsigned payload as 1Click's generate-intent returns it.\n * Accepts either the bare payload or the `{ standard, payload }` wrapper,\n * and decodes a base64 nonce string to bytes.\n */\nexport function unsignedPayloadParts(\n input: GeneratedUnsignedIntent,\n): { message: string; nonce: Uint8Array; recipient: string; callbackUrl?: string } {\n const payload =\n \"payload\" in input && typeof input.payload === \"object\"\n ? input.payload\n : (input as UnsignedNep413Payload);\n if (\n \"standard\" in input &&\n typeof input.standard === \"string\" &&\n input.standard !== \"nep413\"\n ) {\n throw new Error(\n `This signer only signs nep413 payloads; got standard \"${input.standard}\"`,\n );\n }\n if (typeof payload?.message !== \"string\" || typeof payload?.recipient !== \"string\") {\n throw new Error(\"Unsigned payload must carry message and recipient strings\");\n }\n const nonce =\n typeof payload.nonce === \"string\"\n ? base64ToBytes(payload.nonce)\n : payload.nonce;\n if (!(nonce instanceof Uint8Array) || nonce.length !== 32) {\n throw new Error(\"Unsigned payload nonce must decode to exactly 32 bytes\");\n }\n return {\n message: payload.message,\n nonce,\n recipient: payload.recipient,\n ...(payload.callbackUrl ? { callbackUrl: payload.callbackUrl } : {}),\n };\n}\n\nfunction assertExpectedRecipient(\n recipient: string,\n options?: SignPayloadOptions,\n): void {\n const expected = options?.expectedRecipient ?? INTENTS_CONTRACT_ID;\n if (recipient !== expected) {\n throw new Error(\n `Refusing to sign a payload for recipient \"${recipient}\" — expected \"${expected}\". ` +\n \"Pass { expectedRecipient } only when intentionally targeting a different verifier.\",\n );\n }\n}\n\n/** Best-effort signer_id extraction from an intent-message JSON string. */\nfunction signerIdFromMessage(message: string): string | undefined {\n try {\n const parsed = JSON.parse(message);\n return typeof parsed?.signer_id === \"string\" ? parsed.signer_id : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * The @fastnear/wallet surface this package needs — structural, so any\n * object with a NEP-413 `signMessage` (and optionally `accountId`) works.\n */\nexport interface FastNearWalletLike {\n accountId?(options?: { network?: \"mainnet\" | \"testnet\" }): string | null;\n signMessage(params: {\n message: string;\n recipient: string;\n nonce: Uint8Array;\n network?: \"mainnet\" | \"testnet\";\n }): Promise<{ accountId: string; publicKey: string; signature: string }>;\n}\n\nexport interface WalletIntentSignerOptions {\n wallet: FastNearWalletLike;\n /** NEAR Intents is mainnet-oriented; override only for test deployments. */\n network?: \"mainnet\" | \"testnet\";\n}\n\n/**\n * Sign intent messages with a connected FastNEAR wallet via NEP-413.\n *\n * NEP-413 requires a full-access key, so wallets sign with the account's\n * own key — FunctionCall-access session keys cannot authorize intents.\n * The wallet's base64 signature is re-encoded to `ed25519:<base58>`.\n */\nexport function createWalletIntentSigner({\n wallet,\n network = \"mainnet\",\n}: WalletIntentSignerOptions): IntentSigner {\n if (!wallet || typeof wallet.signMessage !== \"function\") {\n throw new Error(\n \"A FastNEAR wallet module with signMessage is required (connect @fastnear/wallet first)\",\n );\n }\n\n async function signParts({\n message,\n nonce,\n recipient,\n callbackUrl,\n expectedSigner,\n }: {\n message: string;\n nonce: Uint8Array;\n recipient: string;\n callbackUrl?: string;\n expectedSigner?: string;\n }): Promise<SignedIntentNep413> {\n if (callbackUrl) {\n // NEP-413 binds callbackUrl into the signed digest, but the wallet\n // signMessage transport has no callbackUrl parameter — signing would\n // produce a payload that advertises a callbackUrl the signature does\n // not cover, which the verifier rejects.\n throw new Error(\n \"Wallet intent signing cannot bind callbackUrl payloads; use the local signer or drop callbackUrl\",\n );\n }\n const signed = await wallet.signMessage({\n message,\n recipient,\n nonce,\n network,\n });\n\n if (expectedSigner && signed.accountId && signed.accountId !== expectedSigner) {\n throw new Error(\n `Wallet signed as ${signed.accountId} but the intent names ${expectedSigner}; reconnect the intended account`,\n );\n }\n\n return toSignedIntent({\n message,\n nonce,\n recipient,\n publicKey: signed.publicKey,\n signature: signed.signature,\n callbackUrl,\n });\n }\n\n return {\n async signIntents(params: SignIntentsParams): Promise<SignedIntentNep413> {\n const signerId =\n params.signerId ??\n (typeof wallet.accountId === \"function\"\n ? wallet.accountId({ network })\n : null);\n if (!signerId) {\n throw new Error(`No wallet account connected on ${network}`);\n }\n\n const message = buildIntentMessage({\n signerId,\n intents: params.intents,\n deadline: params.deadline,\n });\n return signParts({\n message: JSON.stringify(message),\n nonce: params.nonce ?? randomNonce(),\n recipient: params.verifyingContract ?? INTENTS_CONTRACT_ID,\n expectedSigner: signerId,\n });\n },\n\n async signPayload(\n payload: GeneratedUnsignedIntent,\n options?: SignPayloadOptions,\n ): Promise<SignedIntentNep413> {\n const parts = unsignedPayloadParts(payload);\n assertExpectedRecipient(parts.recipient, options);\n return signParts({\n ...parts,\n expectedSigner: signerIdFromMessage(parts.message),\n });\n },\n };\n}\n","import { INTENTS_CONTRACT_ID, type IntentsTokenId } from \"./types.js\";\n\n/** Gas / deposit defaults for verifier interactions. */\nexport const FT_TRANSFER_CALL_GAS = \"100000000000000\"; // 100 TGas\nexport const WITHDRAW_GAS = \"100000000000000\"; // 100 TGas\nexport const WRAP_NEAR_GAS = \"30000000000000\"; // 30 TGas\nexport const ONE_YOCTO = \"1\";\n\n/** wNEAR contract — native NEAR must be wrapped before depositing. */\nexport const WRAP_NEAR_CONTRACT_ID = \"wrap.near\";\n\n/**\n * The flat FastNEAR action shape. near.sendTx serializes these fields\n * directly, and @fastnear/wallet converts flat actions for near-connect\n * wallets — so one shape works on both signing paths.\n */\nexport interface FunctionCallActionShape {\n type: \"FunctionCall\";\n methodName: string;\n args: Record<string, unknown>;\n gas: string;\n deposit: string;\n}\n\n/**\n * Build the `ft_transfer_call` action that deposits a NEP-141 token into the\n * verifier. Apply it ON the token contract:\n *\n * near.sendTx({ receiverId: \"usdt.tether-token.near\",\n * actions: [ftDepositAction({ amount })] })\n *\n * `msg` semantics (per the verifier docs): \"\" credits the sender; an\n * account-id string credits that account (`creditTo`); a JSON string enables\n * execute_intents-on-deposit. Native NEAR is rejected by the verifier —\n * wrap it first (see wrapNearAction).\n */\nexport function ftDepositAction({\n amount,\n creditTo,\n msg,\n verifierId = INTENTS_CONTRACT_ID,\n gas = FT_TRANSFER_CALL_GAS,\n}: {\n amount: string;\n creditTo?: string;\n msg?: string;\n verifierId?: string;\n gas?: string;\n}): FunctionCallActionShape {\n if (creditTo !== undefined && msg !== undefined) {\n throw new Error(\"Pass either creditTo or msg, not both\");\n }\n return {\n type: \"FunctionCall\",\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: verifierId,\n amount,\n msg: msg ?? creditTo ?? \"\",\n },\n gas,\n deposit: ONE_YOCTO,\n };\n}\n\n/**\n * Build the `near_deposit` action that wraps native NEAR into wNEAR.\n * Apply it ON wrap.near:\n *\n * near.sendTx({ receiverId: \"wrap.near\",\n * actions: [wrapNearAction({ amountYocto })] })\n */\nexport function wrapNearAction({\n amountYocto,\n gas = WRAP_NEAR_GAS,\n}: {\n amountYocto: string;\n gas?: string;\n}): FunctionCallActionShape {\n return {\n type: \"FunctionCall\",\n methodName: \"near_deposit\",\n args: {},\n gas,\n deposit: amountYocto,\n };\n}\n\n/**\n * Build the direct-call `ft_withdraw` action that moves a NEP-141 token out\n * of the verifier back to a NEAR account. Apply it ON intents.near. `token`\n * is the plain contract id (no `nep141:` prefix). Omit `msg` so failed\n * withdrawals stay refundable.\n */\nexport function ftWithdrawAction({\n token,\n receiverId,\n amount,\n memo,\n msg,\n storageDeposit,\n gas = WITHDRAW_GAS,\n}: {\n token: string;\n receiverId: string;\n amount: string;\n memo?: string;\n msg?: string;\n storageDeposit?: string;\n gas?: string;\n}): FunctionCallActionShape {\n if (token.includes(\":\")) {\n throw new Error(\n `ft_withdraw takes the plain token contract id, not a prefixed multi-token id: ${token}`,\n );\n }\n return {\n type: \"FunctionCall\",\n methodName: \"ft_withdraw\",\n args: {\n token,\n receiver_id: receiverId,\n amount,\n ...(memo !== undefined ? { memo } : {}),\n ...(msg !== undefined ? { msg } : {}),\n ...(storageDeposit !== undefined\n ? { storage_deposit: storageDeposit }\n : {}),\n },\n gas,\n deposit: ONE_YOCTO,\n };\n}\n\n/** A near.view-compatible function, injected so this package stays api-free. */\nexport type ViewFunction = (params: {\n contractId: string;\n methodName: string;\n args: Record<string, unknown>;\n}) => Promise<unknown>;\n\n/** Read one internal balance from the verifier's NEP-245 ledger. */\nexport async function mtBalance({\n accountId,\n tokenId,\n view,\n verifierId = INTENTS_CONTRACT_ID,\n}: {\n accountId: string;\n tokenId: IntentsTokenId;\n view: ViewFunction;\n verifierId?: string;\n}): Promise<string> {\n const result = await view({\n contractId: verifierId,\n methodName: \"mt_balance_of\",\n args: { account_id: accountId, token_id: tokenId },\n });\n return String(result ?? \"0\");\n}\n\n/**\n * Read many internal balances in one view call. Returns a map keyed by\n * token id (the RPC returns base-unit strings in request order).\n */\nexport async function mtBatchBalances({\n accountId,\n tokenIds,\n view,\n verifierId = INTENTS_CONTRACT_ID,\n}: {\n accountId: string;\n tokenIds: IntentsTokenId[];\n view: ViewFunction;\n verifierId?: string;\n}): Promise<Record<IntentsTokenId, string>> {\n const result = (await view({\n contractId: verifierId,\n methodName: \"mt_batch_balance_of\",\n args: { account_id: accountId, token_ids: tokenIds },\n })) as unknown[];\n if (!Array.isArray(result) || result.length !== tokenIds.length) {\n throw new Error(\n `mt_batch_balance_of returned ${Array.isArray(result) ? result.length : typeof result} results for ${tokenIds.length} token ids`,\n );\n }\n return Object.fromEntries(\n tokenIds.map((tokenId, index) => [tokenId, String(result[index] ?? \"0\")]),\n );\n}\n","import { IntentsHttpError } from \"./one-click.js\";\nimport {\n SOLVER_RELAY_URL,\n type RelayPublishResult,\n type RelayQuote,\n type RelayQuoteParams,\n type RelayStatusResult,\n type SignedIntent,\n} from \"./types.js\";\n\nexport interface SolverRelayClientOptions {\n url?: string;\n /** Relay API key (X-API-Key header), issued via the partner dashboard. */\n apiKey?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport interface SolverRelayClient {\n /** Ask connected solvers for quotes (relay-side timeout ~3s). null = no quotes. */\n quote(params: RelayQuoteParams): Promise<RelayQuote[] | null>;\n /** Publish one signed intent against the quote hashes it fills. */\n publishIntent(params: {\n signedData: SignedIntent;\n quoteHashes: string[];\n }): Promise<RelayPublishResult>;\n /** Publish a batch of signed intents. */\n publishIntents(params: {\n signedDatas: SignedIntent[];\n quoteHashes: string[];\n requote?: boolean;\n }): Promise<RelayPublishResult>;\n /** Poll a published intent: PENDING → TX_BROADCASTED → SETTLED. */\n getStatus(params: { intentHash: string }): Promise<RelayStatusResult>;\n}\n\n/** Error carrying the JSON-RPC error object from the solver relay. */\nexport class SolverRelayError extends Error {\n readonly rpcError: unknown;\n\n constructor(message: string, rpcError: unknown) {\n super(message);\n this.name = \"SolverRelayError\";\n this.rpcError = rpcError;\n }\n}\n\n/**\n * Zero-dependency JSON-RPC client for the NEAR Intents solver relay\n * (the message bus that brokers quotes between users and solvers and\n * submits matched intent bundles to intents.near).\n */\nexport function createSolverRelayClient(\n options: SolverRelayClientOptions = {},\n): SolverRelayClient {\n const url = options.url ?? SOLVER_RELAY_URL;\n const fetchImplementation = options.fetch ?? globalThis.fetch;\n if (typeof fetchImplementation !== \"function\") {\n throw new Error(\"A fetch implementation is required\");\n }\n\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (options.apiKey) headers[\"X-API-Key\"] = options.apiKey;\n\n let nextId = 0;\n\n async function call<T>(method: string, params: unknown): Promise<T> {\n const id = ++nextId;\n const response = await fetchImplementation(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ id, jsonrpc: \"2.0\", method, params: [params] }),\n });\n const text = await response.text();\n let parsed: unknown = null;\n try {\n parsed = text ? JSON.parse(text) : null;\n } catch {\n parsed = text;\n }\n if (!response.ok) {\n throw new IntentsHttpError(\n `Solver relay ${method} failed with ${response.status}`,\n response.status,\n parsed,\n );\n }\n const body = parsed as { result?: T; error?: unknown };\n if (body && typeof body === \"object\" && body.error != null) {\n throw new SolverRelayError(\n `Solver relay ${method} returned an error: ${JSON.stringify(body.error)}`,\n body.error,\n );\n }\n if (!body || typeof body !== \"object\" || !(\"result\" in body)) {\n throw new SolverRelayError(\n `Solver relay ${method} returned a malformed JSON-RPC envelope`,\n parsed,\n );\n }\n return body.result as T;\n }\n\n return {\n quote: (params) => call(\"quote\", params),\n publishIntent: ({ signedData, quoteHashes }) =>\n call(\"publish_intent\", {\n signed_data: signedData,\n quote_hashes: quoteHashes,\n }),\n publishIntents: ({ signedDatas, quoteHashes, requote }) =>\n call(\"publish_intents\", {\n signed_datas: signedDatas,\n quote_hashes: quoteHashes,\n ...(requote === undefined ? {} : { requote }),\n }),\n getStatus: ({ intentHash }) =>\n call(\"get_status\", { intent_hash: intentHash }),\n };\n}\n"],"mappings":"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","names":["src_exports"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/types.ts","../../src/one-click.ts","../../../utils/node_modules/base58-js/base58_chars.js","../../../utils/node_modules/base58-js/create_base58_map.js","../../../utils/node_modules/base58-js/binary_to_base58.js","../../../../node_modules/js-base64/base64.mjs","../../../utils/src/storage.ts","../../../utils/src/misc.ts","../../../borsh-schema/src/index.ts","../../../utils/src/transaction.ts","../../src/signing.ts","../../src/verifier.ts","../../src/relay.ts"],"sourcesContent":["/**\n * @fastnear/intents — NEAR Intents (intents.near) for end users and agents:\n * a zero-dependency 1Click swap client, NEP-413 intent signing (wallet and\n * local-key), verifier deposit/withdraw/balance helpers, and a solver-relay\n * JSON-RPC client.\n *\n * Browser-safe: this root entry never touches private keys. The local-key\n * signer lives in @fastnear/intents/node.\n */\nexport * from \"./types.js\";\nexport * from \"./one-click.js\";\nexport * from \"./signing.js\";\nexport * from \"./verifier.js\";\nexport * from \"./relay.js\";\n","/**\n * Protocol types for NEAR Intents (the verifier contract `intents.near`,\n * the 1Click swap API, and the solver relay).\n *\n * Sources of truth:\n * - 1Click OpenAPI: https://1click.chaindefuser.com/docs/v0/openapi.yaml\n * - Verifier docs: https://docs.near-intents.org/integration/verifier-contract\n * - Solver relay: https://docs.near-intents.org/integration/market-makers/message-bus/rpc.md\n */\n\n/** The NEAR Intents verifier contract (mainnet). */\nexport const INTENTS_CONTRACT_ID = \"intents.near\";\n\n/** Hosted 1Click swap API base URL. */\nexport const ONE_CLICK_BASE_URL = \"https://1click.chaindefuser.com\";\n\n/** Hosted solver relay JSON-RPC endpoint. */\nexport const SOLVER_RELAY_URL = \"https://solver-relay-v2.chaindefuser.com/rpc\";\n\n/**\n * A multi-token id inside the verifier's NEP-245 ledger:\n * `nep141:<contract>`, `nep171:<contract>:<token_id>`, or\n * `nep245:<contract>:<token_id>`.\n */\nexport type IntentsTokenId = string;\n\n// ---------------------------------------------------------------------------\n// Intent types executed by intents.near\n// ---------------------------------------------------------------------------\n\n/**\n * Trade intent: per-token balance deltas for the signer. Negative amounts are\n * paid by the signer, positive amounts are received. The verifier requires all\n * diffs in a batch to sum to zero per token, so a counterparty (solver) signs\n * the mirror diff.\n */\nexport interface TokenDiffIntent {\n intent: \"token_diff\";\n diff: Record<IntentsTokenId, string>;\n memo?: string;\n referral?: string;\n}\n\n/** Internal ledger transfer to another intents.near account. */\nexport interface TransferIntent {\n intent: \"transfer\";\n receiver_id: string;\n tokens: Record<IntentsTokenId, string>;\n memo?: string;\n}\n\n/**\n * Withdraw a NEP-141 token out of the verifier. `token` is the plain token\n * contract id (no `nep141:` prefix). Omit `msg` for refundable ft_transfer\n * semantics; passing `msg` switches to ft_transfer_call with no refund.\n */\nexport interface FtWithdrawIntent {\n intent: \"ft_withdraw\";\n token: string;\n receiver_id: string;\n amount: string;\n memo?: string;\n msg?: string;\n storage_deposit?: string;\n}\n\nexport interface NftWithdrawIntent {\n intent: \"nft_withdraw\";\n token: string;\n receiver_id: string;\n token_id: string;\n memo?: string;\n msg?: string;\n storage_deposit?: string;\n}\n\nexport interface MtWithdrawIntent {\n intent: \"mt_withdraw\";\n token: string;\n receiver_id: string;\n token_ids: string[];\n amounts: string[];\n memo?: string;\n msg?: string;\n storage_deposit?: string;\n}\n\n/** The only way to withdraw native NEAR: unwraps internal wNEAR on exit. */\nexport interface NativeWithdrawIntent {\n intent: \"native_withdraw\";\n receiver_id: string;\n amount: string;\n}\n\n/**\n * Pay a NEP-145 storage_deposit on a token contract from the signer's\n * internal wNEAR balance (registers a receiver before a withdrawal lands).\n */\nexport interface StorageDepositIntent {\n intent: \"storage_deposit\";\n contract_id: string;\n account_id: string;\n amount: string;\n}\n\nexport type Intent =\n | TokenDiffIntent\n | TransferIntent\n | FtWithdrawIntent\n | NftWithdrawIntent\n | MtWithdrawIntent\n | NativeWithdrawIntent\n | StorageDepositIntent;\n\n/**\n * The inner message that gets signed. For the `nep413` standard this JSON\n * string becomes the NEP-413 `message`, while the verifying contract and\n * replay nonce live in the NEP-413 envelope (`recipient` / `nonce`).\n */\nexport interface IntentMessage {\n signer_id: string;\n /** ISO-8601 timestamp after which the signed intent is invalid. */\n deadline: string;\n intents: Intent[];\n}\n\n// ---------------------------------------------------------------------------\n// Signed payloads (MultiPayload)\n// ---------------------------------------------------------------------------\n\n/**\n * A NEP-413-signed intent as `intents.near`, the solver relay, and 1Click\n * accept it. Note the encodings: `nonce` is base64 of 32 bytes, while\n * `signature` and `public_key` are `ed25519:<base58>` strings — NOT the\n * base64 signature NEAR wallets return.\n */\nexport interface SignedIntentNep413 {\n standard: \"nep413\";\n payload: {\n message: string;\n nonce: string;\n recipient: string;\n callbackUrl?: string;\n };\n public_key: string;\n signature: string;\n}\n\n/**\n * Any signed payload standard the verifier accepts. This package produces\n * `nep413`; the other variants (erc191, tip191, raw_ed25519, webauthn,\n * ton_connect, sep53) are documented pass-through shapes.\n */\nexport type SignedIntent =\n | SignedIntentNep413\n | { standard: string; [key: string]: unknown };\n\n/**\n * An unsigned NEP-413 payload, as returned by 1Click's generate-intent\n * endpoint (nonce is base64 of 32 bytes when it arrives as a string).\n */\nexport interface UnsignedNep413Payload {\n message: string;\n nonce: string | Uint8Array;\n recipient: string;\n callbackUrl?: string;\n}\n\n/**\n * What signPayload accepts: a bare unsigned payload or the\n * { standard, payload } wrapper 1Click's generate-intent returns.\n */\nexport type GeneratedUnsignedIntent =\n | UnsignedNep413Payload\n | { standard: string; payload: UnsignedNep413Payload };\n\nexport interface SignPayloadOptions {\n /**\n * The verifying contract the payload's recipient must equal. Defaults to\n * intents.near — a server response naming any other recipient throws\n * instead of being signed. Set explicitly to sign for a different\n * (e.g. staging) verifier deployment.\n */\n expectedRecipient?: string;\n}\n\n/** The signer surface shared by the wallet and local-key implementations. */\nexport interface IntentSigner {\n /** Build and sign an intent message this client composes itself. */\n signIntents(params: SignIntentsParams): Promise<SignedIntentNep413>;\n /**\n * Sign a pre-built NEP-413 payload verbatim — the 1Click generate-intent\n * flow, where the server chooses the message, nonce, and recipient. The\n * recipient is pinned to intents.near unless options.expectedRecipient\n * overrides it, so a malicious or buggy server cannot redirect the\n * signature to another contract.\n */\n signPayload(\n payload: GeneratedUnsignedIntent,\n options?: SignPayloadOptions,\n ): Promise<SignedIntentNep413>;\n}\n\nexport interface SignIntentsParams {\n intents: Intent[];\n /** Defaults to the connected wallet account / the local signer account. */\n signerId?: string;\n /** ISO-8601; defaults to 5 minutes from now. */\n deadline?: string;\n /** 32 bytes; defaults to crypto-random. */\n nonce?: Uint8Array;\n /** Defaults to intents.near. Override only for a different verifier deployment. */\n verifyingContract?: string;\n}\n\n// ---------------------------------------------------------------------------\n// 1Click API shapes (v0)\n// ---------------------------------------------------------------------------\n\nexport type OneClickSwapType =\n | \"EXACT_INPUT\"\n | \"EXACT_OUTPUT\"\n | \"FLEX_INPUT\"\n | \"ANY_INPUT\";\n\nexport type OneClickDepositType =\n | \"ORIGIN_CHAIN\"\n | \"INTENTS\"\n | \"CONFIDENTIAL_INTENTS\";\n\nexport type OneClickRecipientType =\n | \"DESTINATION_CHAIN\"\n | \"INTENTS\"\n | \"CONFIDENTIAL_INTENTS\";\n\nexport type OneClickDepositMode = \"SIMPLE\" | \"MEMO\";\n\nexport interface OneClickToken {\n assetId: string;\n decimals: number;\n blockchain: string;\n symbol: string;\n price?: number;\n priceUpdatedAt?: string;\n contractAddress?: string;\n coingeckoId?: string;\n}\n\nexport interface OneClickAppFee {\n /** intents.near account that collects the fee. */\n recipient: string;\n /** Basis points. */\n fee: number;\n}\n\nexport interface OneClickQuoteRequest {\n /** true = price preview only (no depositAddress); false commits the quote. */\n dry: boolean;\n swapType: OneClickSwapType;\n /** Basis points, e.g. 100 = 1%. */\n slippageTolerance: number;\n originAsset: string;\n destinationAsset: string;\n /** Base units of the exact side selected by swapType. */\n amount: string;\n depositType: OneClickDepositType;\n refundTo: string;\n refundType: OneClickDepositType;\n recipient: string;\n recipientType: OneClickRecipientType;\n /** ISO-8601. */\n deadline: string;\n depositMode?: OneClickDepositMode;\n referral?: string;\n quoteWaitingTimeMs?: number;\n appFees?: OneClickAppFee[];\n insured?: boolean;\n connectedWallets?: unknown[];\n sessionId?: string;\n virtualChainRecipient?: string;\n virtualChainRefundRecipient?: string;\n customRecipientMsg?: string;\n}\n\nexport interface OneClickQuote {\n depositAddress?: string;\n depositMemo?: string;\n chainDepositAddresses?: Array<{ chain: string; depositAddress?: string; memo?: string }>;\n amountIn: string;\n amountInFormatted?: string;\n amountInUsd?: string;\n minAmountIn?: string;\n amountOut: string;\n amountOutFormatted?: string;\n amountOutUsd?: string;\n minAmountOut?: string;\n deadline?: string;\n timeWhenInactive?: string;\n timeEstimate?: number;\n refundFee?: string;\n withdrawFee?: string;\n virtualChainRecipient?: string;\n virtualChainRefundRecipient?: string;\n customRecipientMsg?: string;\n}\n\nexport interface OneClickQuoteResponse {\n correlationId?: string;\n timestamp: string;\n /** Server-signed quote (verifiable per the 1Click docs). */\n signature: string;\n quoteRequest: OneClickQuoteRequest;\n quote: OneClickQuote;\n}\n\nexport type OneClickStatus =\n | \"KNOWN_DEPOSIT_TX\"\n | \"PENDING_DEPOSIT\"\n | \"INCOMPLETE_DEPOSIT\"\n | \"PROCESSING\"\n | \"SUCCESS\"\n | \"REFUNDED\"\n | \"FAILED\";\n\nexport interface OneClickStatusResponse {\n correlationId?: string;\n quoteResponse: OneClickQuoteResponse;\n status: OneClickStatus;\n updatedAt: string;\n swapDetails?: {\n intentHashes?: string[];\n nearTxHashes?: string[];\n originChainTxHashes?: Array<{ hash: string; explorerUrl?: string }>;\n destinationChainTxHashes?: Array<{ hash: string; explorerUrl?: string }>;\n amountIn?: string;\n amountInFormatted?: string;\n amountInUsd?: string;\n amountOut?: string;\n amountOutFormatted?: string;\n amountOutUsd?: string;\n slippage?: number;\n depositedAmount?: string;\n refundedAmount?: string;\n refundReason?: string;\n withdrawFee?: string;\n referral?: string;\n };\n}\n\nexport interface OneClickSubmitDepositRequest {\n txHash: string;\n depositAddress: string;\n nearSenderAccount?: string;\n memo?: string;\n}\n\nexport type OneClickSigningStandard =\n | \"nep413\"\n | \"erc191\"\n | \"raw_ed25519\"\n | \"webauthn\"\n | \"ton_connect\"\n | \"sep53\"\n | \"tip191\";\n\nexport interface OneClickGenerateIntentRequest {\n signerId: string;\n depositAddress: string;\n standard?: OneClickSigningStandard;\n}\n\nexport interface OneClickGenerateIntentResponse {\n /** Unsigned payload to sign — pass it to an IntentSigner's signPayload. */\n intent: GeneratedUnsignedIntent;\n correlationId?: string;\n}\n\nexport interface OneClickSubmitIntentResponse {\n intentHash: string;\n correlationId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Solver relay JSON-RPC shapes\n// ---------------------------------------------------------------------------\n\nexport interface RelayQuoteParams {\n defuse_asset_identifier_in: IntentsTokenId;\n defuse_asset_identifier_out: IntentsTokenId;\n exact_amount_in?: string;\n exact_amount_out?: string;\n /** Milliseconds; relay default is 60000. */\n min_deadline_ms?: number;\n}\n\nexport interface RelayQuote {\n quote_hash: string;\n defuse_asset_identifier_in: IntentsTokenId;\n defuse_asset_identifier_out: IntentsTokenId;\n amount_in: string;\n amount_out: string;\n expiration_time: string;\n}\n\nexport type RelayIntentStatus =\n | \"PENDING\"\n | \"TX_BROADCASTED\"\n | \"SETTLED\"\n | \"NOT_FOUND_OR_NOT_VALID\";\n\nexport interface RelayPublishResult {\n status: string;\n intent_hash: string;\n}\n\nexport interface RelayStatusResult {\n intent_hash: string;\n status: RelayIntentStatus;\n status_details?: string;\n data?: { hash?: string };\n filled_amounts?: string[];\n}\n","import {\n ONE_CLICK_BASE_URL,\n type OneClickGenerateIntentRequest,\n type OneClickGenerateIntentResponse,\n type OneClickQuoteRequest,\n type OneClickQuoteResponse,\n type OneClickStatusResponse,\n type OneClickSubmitDepositRequest,\n type OneClickSubmitIntentResponse,\n type OneClickToken,\n type SignedIntent,\n} from \"./types.js\";\n\n/** Error thrown for non-2xx 1Click (and solver relay) HTTP responses. */\nexport class IntentsHttpError extends Error {\n readonly status: number;\n readonly body: unknown;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = \"IntentsHttpError\";\n this.status = status;\n this.body = body;\n }\n}\n\nexport interface OneClickClientOptions {\n baseUrl?: string;\n /** Partner API key (X-API-Key). Without one, quotes carry a 0.2% platform fee. */\n apiKey?: string;\n /** Legacy JWT bearer token — same fee waiver as apiKey. */\n jwt?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport interface OneClickClient {\n /** List supported assets; each entry's assetId is used in quotes. */\n tokens(): Promise<OneClickToken[]>;\n /** Request a quote. dry:true previews pricing; dry:false allocates the depositAddress. */\n quote(request: OneClickQuoteRequest): Promise<OneClickQuoteResponse>;\n /** Poll swap execution by deposit address. */\n status(params: {\n depositAddress: string;\n depositMemo?: string;\n }): Promise<OneClickStatusResponse>;\n /** Optional accelerator: report the deposit tx hash. */\n submitDeposit(\n request: OneClickSubmitDepositRequest,\n ): Promise<OneClickStatusResponse>;\n /** INTENTS deposit type: server builds the swap_transfer intent to sign. */\n generateIntent(\n request: OneClickGenerateIntentRequest,\n ): Promise<OneClickGenerateIntentResponse>;\n /** INTENTS deposit type: submit the signed intent. */\n submitIntent(params: {\n signedData: SignedIntent;\n }): Promise<OneClickSubmitIntentResponse>;\n}\n\nasync function parseBody(response: Response): Promise<unknown> {\n const text = await response.text();\n try {\n return text ? JSON.parse(text) : null;\n } catch {\n return text;\n }\n}\n\n/**\n * Zero-dependency typed client for the hosted 1Click swap API.\n * Works unauthenticated (0.2% platform fee baked into quotes); pass an\n * apiKey from https://partners.near-intents.org/ to waive it.\n */\nexport function createOneClickClient(\n options: OneClickClientOptions = {},\n): OneClickClient {\n const baseUrl = (options.baseUrl ?? ONE_CLICK_BASE_URL).replace(/\\/$/, \"\");\n const fetchImplementation = options.fetch ?? globalThis.fetch;\n if (typeof fetchImplementation !== \"function\") {\n throw new Error(\"A fetch implementation is required\");\n }\n\n const authHeaders: Record<string, string> = {};\n if (options.apiKey) authHeaders[\"X-API-Key\"] = options.apiKey;\n if (options.jwt) authHeaders.Authorization = `Bearer ${options.jwt}`;\n\n async function request<T>(\n method: \"GET\" | \"POST\",\n path: string,\n body?: unknown,\n ): Promise<T> {\n // Content-Type only when a body exists — a bodyless GET with\n // application/json forces an unnecessary CORS preflight in browsers.\n const headers =\n body === undefined\n ? authHeaders\n : { ...authHeaders, \"Content-Type\": \"application/json\" };\n const response = await fetchImplementation(`${baseUrl}${path}`, {\n method,\n headers,\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n });\n const parsed = await parseBody(response);\n if (!response.ok) {\n const detail =\n parsed && typeof parsed === \"object\" && \"message\" in parsed\n ? ` — ${JSON.stringify((parsed as { message: unknown }).message)}`\n : \"\";\n throw new IntentsHttpError(\n `1Click ${method} ${path} failed with ${response.status}${detail}`,\n response.status,\n parsed,\n );\n }\n return parsed as T;\n }\n\n return {\n tokens: () => request(\"GET\", \"/v0/tokens\"),\n quote: (quoteRequest) => request(\"POST\", \"/v0/quote\", quoteRequest),\n status: ({ depositAddress, depositMemo }) => {\n const query = new URLSearchParams({ depositAddress });\n if (depositMemo) query.set(\"depositMemo\", depositMemo);\n return request(\"GET\", `/v0/status?${query}`);\n },\n submitDeposit: (submitRequest) =>\n request(\"POST\", \"/v0/deposit/submit\", submitRequest),\n generateIntent: ({ standard = \"nep413\", signerId, depositAddress }) =>\n request(\"POST\", \"/v0/generate-intent\", {\n type: \"swap_transfer\",\n standard,\n signerId,\n depositAddress,\n }),\n submitIntent: ({ signedData }) =>\n request(\"POST\", \"/v0/submit-intent\", {\n type: \"swap_transfer\",\n signedData,\n }),\n };\n}\n","// @ts-check\n\n/**\n * Base58 characters include numbers 123456789, uppercase ABCDEFGHJKLMNPQRSTUVWXYZ and lowercase abcdefghijkmnopqrstuvwxyz.\n * @typedef {String} base58_chars Base58 characters include numbers 123456789, uppercase ABCDEFGHJKLMNPQRSTUVWXYZ and lowercase abcdefghijkmnopqrstuvwxyz.\n */\nconst base58_chars =\n \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n\nexport default base58_chars;\n","// @ts-check\n\nimport base58_chars from \"./base58_chars.js\";\n\n/**\n * Generates a mapping between base58 and ascii.\n * @returns {Array<Number>} mapping between ascii and base58.\n */\nconst create_base58_map = () => {\n const base58M = Array(256).fill(-1);\n for (let i = 0; i < base58_chars.length; ++i)\n base58M[base58_chars.charCodeAt(i)] = i;\n\n return base58M;\n};\n\nexport default create_base58_map;\n","// @ts-check\n\nimport base58_chars from \"./base58_chars.js\";\nimport create_base58_map from \"./create_base58_map.js\";\n\nconst base58Map = create_base58_map();\n\n/** @typedef {import(\"./base58_chars.js\").base58_chars} base58_chars */\n\n/**\n * Converts a Uint8Array into a base58 string.\n * @param {Uint8Array} uint8array Unsigned integer array.\n * @returns { import(\"./base58_chars.js\").base58_chars } base58 string representation of the binary array.\n * @example <caption>Usage.</caption>\n * ```js\n * const str = binary_to_base58([15, 239, 64])\n * console.log(str)\n * ```\n * Logged output will be 6MRy.\n */\nfunction binary_to_base58(uint8array) {\n const result = [];\n\n for (const byte of uint8array) {\n let carry = byte;\n for (let j = 0; j < result.length; ++j) {\n // @ts-ignore\n const x = (base58Map[result[j]] << 8) + carry;\n result[j] = base58_chars.charCodeAt(x % 58);\n carry = (x / 58) | 0;\n }\n while (carry) {\n result.push(base58_chars.charCodeAt(carry % 58));\n carry = (carry / 58) | 0;\n }\n }\n\n for (const byte of uint8array)\n if (byte) break;\n else result.push(\"1\".charCodeAt(0));\n\n result.reverse();\n\n return String.fromCharCode(...result);\n}\n\nexport default binary_to_base58;\n","/**\n * base64.ts\n *\n * Licensed under the BSD 3-Clause License.\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * References:\n * http://en.wikipedia.org/wiki/Base64\n *\n * @author Dan Kogai (https://github.com/dankogai)\n */\nconst version = '3.7.7';\n/**\n * @deprecated use lowercase `version`.\n */\nconst VERSION = version;\nconst _hasBuffer = typeof Buffer === 'function';\nconst _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined;\nconst _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;\nconst b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nconst b64chs = Array.prototype.slice.call(b64ch);\nconst b64tab = ((a) => {\n let tab = {};\n a.forEach((c, i) => tab[c] = i);\n return tab;\n})(b64chs);\nconst b64re = /^(?:[A-Za-z\\d+\\/]{4})*?(?:[A-Za-z\\d+\\/]{2}(?:==)?|[A-Za-z\\d+\\/]{3}=?)?$/;\nconst _fromCC = String.fromCharCode.bind(String);\nconst _U8Afrom = typeof Uint8Array.from === 'function'\n ? Uint8Array.from.bind(Uint8Array)\n : (it) => new Uint8Array(Array.prototype.slice.call(it, 0));\nconst _mkUriSafe = (src) => src\n .replace(/=/g, '').replace(/[+\\/]/g, (m0) => m0 == '+' ? '-' : '_');\nconst _tidyB64 = (s) => s.replace(/[^A-Za-z0-9\\+\\/]/g, '');\n/**\n * polyfill version of `btoa`\n */\nconst btoaPolyfill = (bin) => {\n // console.log('polyfilled');\n let u32, c0, c1, c2, asc = '';\n const pad = bin.length % 3;\n for (let i = 0; i < bin.length;) {\n if ((c0 = bin.charCodeAt(i++)) > 255 ||\n (c1 = bin.charCodeAt(i++)) > 255 ||\n (c2 = bin.charCodeAt(i++)) > 255)\n throw new TypeError('invalid character found');\n u32 = (c0 << 16) | (c1 << 8) | c2;\n asc += b64chs[u32 >> 18 & 63]\n + b64chs[u32 >> 12 & 63]\n + b64chs[u32 >> 6 & 63]\n + b64chs[u32 & 63];\n }\n return pad ? asc.slice(0, pad - 3) + \"===\".substring(pad) : asc;\n};\n/**\n * does what `window.btoa` of web browsers do.\n * @param {String} bin binary string\n * @returns {string} Base64-encoded string\n */\nconst _btoa = typeof btoa === 'function' ? (bin) => btoa(bin)\n : _hasBuffer ? (bin) => Buffer.from(bin, 'binary').toString('base64')\n : btoaPolyfill;\nconst _fromUint8Array = _hasBuffer\n ? (u8a) => Buffer.from(u8a).toString('base64')\n : (u8a) => {\n // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326\n const maxargs = 0x1000;\n let strs = [];\n for (let i = 0, l = u8a.length; i < l; i += maxargs) {\n strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));\n }\n return _btoa(strs.join(''));\n };\n/**\n * converts a Uint8Array to a Base64 string.\n * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5\n * @returns {string} Base64 string\n */\nconst fromUint8Array = (u8a, urlsafe = false) => urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const utob = (src: string) => unescape(encodeURIComponent(src));\n// reverting good old fationed regexp\nconst cb_utob = (c) => {\n if (c.length < 2) {\n var cc = c.charCodeAt(0);\n return cc < 0x80 ? c\n : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))\n + _fromCC(0x80 | (cc & 0x3f)))\n : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))\n + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n + _fromCC(0x80 | (cc & 0x3f)));\n }\n else {\n var cc = 0x10000\n + (c.charCodeAt(0) - 0xD800) * 0x400\n + (c.charCodeAt(1) - 0xDC00);\n return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))\n + _fromCC(0x80 | ((cc >>> 12) & 0x3f))\n + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n + _fromCC(0x80 | (cc & 0x3f)));\n }\n};\nconst re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-8 string\n * @returns {string} UTF-16 string\n */\nconst utob = (u) => u.replace(re_utob, cb_utob);\n//\nconst _encode = _hasBuffer\n ? (s) => Buffer.from(s, 'utf8').toString('base64')\n : _TE\n ? (s) => _fromUint8Array(_TE.encode(s))\n : (s) => _btoa(utob(s));\n/**\n * converts a UTF-8-encoded string to a Base64 string.\n * @param {boolean} [urlsafe] if `true` make the result URL-safe\n * @returns {string} Base64 string\n */\nconst encode = (src, urlsafe = false) => urlsafe\n ? _mkUriSafe(_encode(src))\n : _encode(src);\n/**\n * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5.\n * @returns {string} Base64 string\n */\nconst encodeURI = (src) => encode(src, true);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const btou = (src: string) => decodeURIComponent(escape(src));\n// reverting good old fationed regexp\nconst re_btou = /[\\xC0-\\xDF][\\x80-\\xBF]|[\\xE0-\\xEF][\\x80-\\xBF]{2}|[\\xF0-\\xF7][\\x80-\\xBF]{3}/g;\nconst cb_btou = (cccc) => {\n switch (cccc.length) {\n case 4:\n var cp = ((0x07 & cccc.charCodeAt(0)) << 18)\n | ((0x3f & cccc.charCodeAt(1)) << 12)\n | ((0x3f & cccc.charCodeAt(2)) << 6)\n | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;\n return (_fromCC((offset >>> 10) + 0xD800)\n + _fromCC((offset & 0x3FF) + 0xDC00));\n case 3:\n return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)\n | ((0x3f & cccc.charCodeAt(1)) << 6)\n | (0x3f & cccc.charCodeAt(2)));\n default:\n return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)\n | (0x3f & cccc.charCodeAt(1)));\n }\n};\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-16 string\n * @returns {string} UTF-8 string\n */\nconst btou = (b) => b.replace(re_btou, cb_btou);\n/**\n * polyfill version of `atob`\n */\nconst atobPolyfill = (asc) => {\n // console.log('polyfilled');\n asc = asc.replace(/\\s+/g, '');\n if (!b64re.test(asc))\n throw new TypeError('malformed base64.');\n asc += '=='.slice(2 - (asc.length & 3));\n let u24, bin = '', r1, r2;\n for (let i = 0; i < asc.length;) {\n u24 = b64tab[asc.charAt(i++)] << 18\n | b64tab[asc.charAt(i++)] << 12\n | (r1 = b64tab[asc.charAt(i++)]) << 6\n | (r2 = b64tab[asc.charAt(i++)]);\n bin += r1 === 64 ? _fromCC(u24 >> 16 & 255)\n : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255)\n : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255);\n }\n return bin;\n};\n/**\n * does what `window.atob` of web browsers do.\n * @param {String} asc Base64-encoded string\n * @returns {string} binary string\n */\nconst _atob = typeof atob === 'function' ? (asc) => atob(_tidyB64(asc))\n : _hasBuffer ? (asc) => Buffer.from(asc, 'base64').toString('binary')\n : atobPolyfill;\n//\nconst _toUint8Array = _hasBuffer\n ? (a) => _U8Afrom(Buffer.from(a, 'base64'))\n : (a) => _U8Afrom(_atob(a).split('').map(c => c.charCodeAt(0)));\n/**\n * converts a Base64 string to a Uint8Array.\n */\nconst toUint8Array = (a) => _toUint8Array(_unURI(a));\n//\nconst _decode = _hasBuffer\n ? (a) => Buffer.from(a, 'base64').toString('utf8')\n : _TD\n ? (a) => _TD.decode(_toUint8Array(a))\n : (a) => btou(_atob(a));\nconst _unURI = (a) => _tidyB64(a.replace(/[-_]/g, (m0) => m0 == '-' ? '+' : '/'));\n/**\n * converts a Base64 string to a UTF-8 string.\n * @param {String} src Base64 string. Both normal and URL-safe are supported\n * @returns {string} UTF-8 string\n */\nconst decode = (src) => _decode(_unURI(src));\n/**\n * check if a value is a valid Base64 string\n * @param {String} src a value to check\n */\nconst isValid = (src) => {\n if (typeof src !== 'string')\n return false;\n const s = src.replace(/\\s+/g, '').replace(/={0,2}$/, '');\n return !/[^\\s0-9a-zA-Z\\+/]/.test(s) || !/[^\\s0-9a-zA-Z\\-_]/.test(s);\n};\n//\nconst _noEnum = (v) => {\n return {\n value: v, enumerable: false, writable: true, configurable: true\n };\n};\n/**\n * extend String.prototype with relevant methods\n */\nconst extendString = function () {\n const _add = (name, body) => Object.defineProperty(String.prototype, name, _noEnum(body));\n _add('fromBase64', function () { return decode(this); });\n _add('toBase64', function (urlsafe) { return encode(this, urlsafe); });\n _add('toBase64URI', function () { return encode(this, true); });\n _add('toBase64URL', function () { return encode(this, true); });\n _add('toUint8Array', function () { return toUint8Array(this); });\n};\n/**\n * extend Uint8Array.prototype with relevant methods\n */\nconst extendUint8Array = function () {\n const _add = (name, body) => Object.defineProperty(Uint8Array.prototype, name, _noEnum(body));\n _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });\n _add('toBase64URI', function () { return fromUint8Array(this, true); });\n _add('toBase64URL', function () { return fromUint8Array(this, true); });\n};\n/**\n * extend Builtin prototypes with relevant methods\n */\nconst extendBuiltins = () => {\n extendString();\n extendUint8Array();\n};\nconst gBase64 = {\n version: version,\n VERSION: VERSION,\n atob: _atob,\n atobPolyfill: atobPolyfill,\n btoa: _btoa,\n btoaPolyfill: btoaPolyfill,\n fromBase64: decode,\n toBase64: encode,\n encode: encode,\n encodeURI: encodeURI,\n encodeURL: encodeURI,\n utob: utob,\n btou: btou,\n decode: decode,\n isValid: isValid,\n fromUint8Array: fromUint8Array,\n toUint8Array: toUint8Array,\n extendString: extendString,\n extendUint8Array: extendUint8Array,\n extendBuiltins: extendBuiltins\n};\n// makecjs:CUT //\nexport { version };\nexport { VERSION };\nexport { _atob as atob };\nexport { atobPolyfill };\nexport { _btoa as btoa };\nexport { btoaPolyfill };\nexport { decode as fromBase64 };\nexport { encode as toBase64 };\nexport { utob };\nexport { encode };\nexport { encodeURI };\nexport { encodeURI as encodeURL };\nexport { btou };\nexport { decode };\nexport { isValid };\nexport { fromUint8Array };\nexport { toUint8Array };\nexport { extendString };\nexport { extendUint8Array };\nexport { extendBuiltins };\n// and finally,\nexport { gBase64 as Base64 };\n","export const LsPrefix = \"__fastnear_\";\n\nexport interface StorageBackend {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n clear(): void;\n}\n\nexport const memoryStore = new Map<string, string>(); // Internal memory storage\n\nconst memoryStorageBackend: StorageBackend = {\n getItem: (key) => memoryStore.get(key) || null,\n setItem: (key, value) => memoryStore.set(key, value),\n removeItem: (key) => memoryStore.delete(key),\n clear: () => memoryStore.clear(),\n};\n\n// Default: Use `localStorage` if available, otherwise an in-memory fallback.\n// Some environments expose `localStorage` but throw on access, such as `data:` URLs.\nexport const createDefaultStorage = (): StorageBackend => {\n try {\n if (\n typeof globalThis !== \"undefined\" &&\n \"localStorage\" in globalThis &&\n globalThis.localStorage\n ) {\n return globalThis.localStorage;\n }\n } catch {\n // Fall through to memory storage.\n }\n\n return memoryStorageBackend;\n};\n\nlet storageBackend: StorageBackend = createDefaultStorage();\n\n// Functional storage module\nexport const storage = {\n setBackend: (customBackend: StorageBackend) => {\n storageBackend = customBackend;\n },\n\n set: (key: string, value: any) => {\n if (value === null || value === undefined) {\n storageBackend.removeItem(LsPrefix + key);\n } else {\n storageBackend.setItem(LsPrefix + key, JSON.stringify(value));\n }\n },\n\n get: (key: string): any => {\n const value = storageBackend.getItem(LsPrefix + key);\n if (value === null) return null;\n try {\n return JSON.parse(value);\n } catch {\n return value; // Return raw string if not JSON\n }\n },\n\n remove: (key: string) => storageBackend.removeItem(key),\n clear: () => storageBackend.clear(),\n};\n","import {\n binary_to_base58 as toBase58,\n base58_to_binary as fromBase58,\n} from \"base58-js\";\nimport {\n encode as JsBase64Encode,\n decode as JsBase64Decode,\n fromUint8Array as JsBase64FromUint8Array,\n toUint8Array as JsBase64ToUint8Array\n} from 'js-base64';\nimport { storage } from \"./storage.js\";\n\nexport { toBase58, fromBase58 };\n\nexport function toHex(data: Uint8Array): string {\n return Array.from(data)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nexport function fromHex(hex: string): Uint8Array {\n if (hex.length % 2) throw new Error('Hex string must be even length');\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i/2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n}\n\nexport function base64ToBytes(b64Val: string): Uint8Array {\n return JsBase64ToUint8Array(b64Val);\n}\n\nexport function bytesToBase64(bytesArr: Uint8Array): string {\n return JsBase64FromUint8Array(bytesArr);\n}\n\nexport function toBase64(strVal: string) {\n try {\n return JsBase64Encode(strVal);\n } catch (e) {\n console.error('Issue base64 encoding', e);\n return null;\n }\n}\n\nexport function fromBase64(strVal: string) {\n try {\n return JsBase64Decode(strVal);\n } catch (e) {\n console.error('Issue base64 decoding', e);\n return null;\n }\n}\n\n// NEAR unit math lives in the dependency-free ./units.js so it can be pulled\n// into size-sensitive bundles without dragging misc's storage/codec imports.\nexport { convertUnit } from \"./units.js\";\n\nexport function lsSet(key: string, value: any) {\n storage.set(key, value);\n}\n\nexport function lsGet(key: string): any {\n return storage.get(key);\n}\n\nexport function deepCopy(obj: any) {\n return JSON.parse(JSON.stringify(obj));\n}\n\nexport function tryParseJson(...args: any[]) {\n try {\n return JSON.parse(args[0]);\n } catch {\n if (args.length > 1) {\n return args[1];\n }\n return args[0];\n }\n}\n\nexport function parseJsonFromBytes(bytes: Uint8Array) {\n try {\n const decoder = new TextDecoder();\n return JSON.parse(\n decoder.decode(bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes))\n );\n } catch (e) {\n try {\n return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n } catch (e) {\n return bytes;\n }\n }\n}\n\n/**\n * NEP-413 standard message payload for wallet signing.\n */\nexport interface NEP413Message {\n message: string;\n nonce: Uint8Array;\n recipient: string;\n callbackUrl?: string | null;\n state?: string | null;\n}\n\nexport function canSignWithLAK(\n actions: ReadonlyArray<{\n type: string;\n deposit?: string | number | bigint;\n }>,\n) {\n return (\n actions.length === 1 &&\n actions[0].type === \"FunctionCall\" &&\n BigInt(actions[0]?.deposit ?? \"0\") === 0n\n );\n}\n","import type { Schema } from \"@fastnear/borsh\"\n\nexport const nearChainSchema = new (class BorshSchema {\n Ed25519Signature: Schema = {\n struct: {\n data: { array: { type: \"u8\", len: 64 } },\n },\n };\n Secp256k1Signature: Schema = {\n struct: {\n data: { array: { type: \"u8\", len: 65 } },\n },\n };\n MlDsa65Signature: Schema = {\n struct: {\n data: { array: { type: \"u8\", len: 3309 } },\n },\n };\n Signature: Schema = {\n enum: [\n { struct: { ed25519Signature: this.Ed25519Signature } },\n { struct: { secp256k1Signature: this.Secp256k1Signature } },\n { struct: { mlDsa65Signature: this.MlDsa65Signature } },\n ],\n };\n Ed25519Data: Schema = {\n struct: {\n data: { array: { type: \"u8\", len: 32 } },\n },\n };\n Secp256k1Data: Schema = {\n struct: {\n data: { array: { type: \"u8\", len: 64 } },\n },\n };\n MlDsa65Data: Schema = {\n struct: {\n data: { array: { type: \"u8\", len: 1952 } },\n },\n };\n PublicKey: Schema = {\n enum: [\n { struct: { ed25519Key: this.Ed25519Data } },\n { struct: { secp256k1Key: this.Secp256k1Data } },\n { struct: { mlDsa65Key: this.MlDsa65Data } },\n ],\n };\n FunctionCallPermission: Schema = {\n struct: {\n allowance: { option: \"u128\" },\n receiverId: \"string\",\n methodNames: { array: { type: \"string\" } },\n },\n };\n FullAccessPermission: Schema = {\n struct: {},\n };\n AccessKeyPermission: Schema = {\n enum: [\n { struct: { functionCall: this.FunctionCallPermission } },\n { struct: { fullAccess: this.FullAccessPermission } },\n ],\n };\n AccessKey: Schema = {\n struct: {\n nonce: \"u64\",\n permission: this.AccessKeyPermission,\n },\n };\n CreateAccount: Schema = {\n struct: {},\n };\n DeployContract: Schema = {\n struct: {\n code: { array: { type: \"u8\" } },\n },\n };\n FunctionCall: Schema = {\n struct: {\n methodName: \"string\",\n args: { array: { type: \"u8\" } },\n gas: \"u64\",\n deposit: \"u128\",\n },\n };\n Transfer: Schema = {\n struct: {\n deposit: \"u128\",\n },\n };\n Stake: Schema = {\n struct: {\n stake: \"u128\",\n publicKey: this.PublicKey,\n },\n };\n AddKey: Schema = {\n struct: {\n publicKey: this.PublicKey,\n accessKey: this.AccessKey,\n },\n };\n DeleteKey: Schema = {\n struct: {\n publicKey: this.PublicKey,\n },\n };\n DeleteAccount: Schema = {\n struct: {\n beneficiaryId: \"string\",\n },\n };\n ClassicAction: Schema = {\n enum: [\n { struct: { createAccount: this.CreateAccount } },\n { struct: { deployContract: this.DeployContract } },\n { struct: { functionCall: this.FunctionCall } },\n { struct: { transfer: this.Transfer } },\n { struct: { stake: this.Stake } },\n { struct: { addKey: this.AddKey } },\n { struct: { deleteKey: this.DeleteKey } },\n { struct: { deleteAccount: this.DeleteAccount } },\n ],\n };\n DelegateAction: Schema = {\n struct: {\n senderId: \"string\",\n receiverId: \"string\",\n actions: { array: { type: this.ClassicAction } },\n nonce: \"u64\",\n maxBlockHeight: \"u64\",\n publicKey: this.PublicKey,\n },\n };\n SignedDelegate: Schema = {\n struct: {\n delegateAction: this.DelegateAction,\n signature: this.Signature,\n },\n };\n Action: Schema = {\n enum: [\n { struct: { createAccount: this.CreateAccount } },\n { struct: { deployContract: this.DeployContract } },\n { struct: { functionCall: this.FunctionCall } },\n { struct: { transfer: this.Transfer } },\n { struct: { stake: this.Stake } },\n { struct: { addKey: this.AddKey } },\n { struct: { deleteKey: this.DeleteKey } },\n { struct: { deleteAccount: this.DeleteAccount } },\n { struct: { signedDelegate: this.SignedDelegate } },\n ],\n };\n Transaction: Schema = {\n struct: {\n signerId: \"string\",\n publicKey: this.PublicKey,\n nonce: \"u64\",\n receiverId: \"string\",\n blockHash: { array: { type: \"u8\", len: 32 } },\n actions: { array: { type: this.Action } },\n },\n };\n SignedTransaction: Schema = {\n struct: {\n transaction: this.Transaction,\n signature: this.Signature,\n },\n };\n})();\n\nexport const getBorshSchema = () => nearChainSchema;\n","import { serialize as borshSerialize } from \"@fastnear/borsh\";\nimport {\n assertNearValidatorPublicKey,\n decodeNearPublicKey,\n keyFromString,\n keyTypeFromString,\n NEAR_KEY_DESCRIPTORS,\n sha256,\n type NearPublicKey,\n} from \"./crypto.js\";\nimport { base64ToBytes, fromBase58 } from \"./misc.js\";\nimport { convertUnit } from \"./units.js\";\nimport { getBorshSchema } from \"@fastnear/borsh-schema\";\n\nexport type NearInteger = string | bigint | number;\n\n/**\n * Coerce a NearInteger amount field (gas, deposit, stake, allowance) to bigint.\n *\n * String values may carry a human unit suffix — \"100 Tgas\", \"0.01 NEAR\" —\n * which is exactly the shape the wallet path and the demo site's action\n * config use. `convertUnit` scales those to a plain yocto/gas integer string\n * (and is a no-op on unit-less digits), so local signing via `near.sendTx`\n * accepts the same action shape the wallet path does instead of throwing a\n * bare `BigInt` conversion error.\n */\nfunction toNearAmount(\n value: NearInteger | null | undefined,\n fallback: NearInteger = 0,\n): bigint {\n const resolved = value ?? fallback;\n if (typeof resolved === \"bigint\") return resolved;\n if (typeof resolved === \"number\") return BigInt(resolved);\n return BigInt(convertUnit(resolved.trim()));\n}\n\nexport interface NearCreateAccountAction {\n type: \"CreateAccount\";\n}\n\nexport interface NearDeployContractAction {\n type: \"DeployContract\";\n codeBase64: string;\n}\n\nexport interface NearFunctionCallAction {\n type: \"FunctionCall\";\n methodName: string;\n args?: unknown;\n argsBase64?: string | null;\n gas?: NearInteger;\n deposit?: NearInteger;\n}\n\nexport interface NearTransferAction {\n type: \"Transfer\";\n deposit: NearInteger;\n}\n\nexport interface NearStakeAction {\n type: \"Stake\";\n stake: NearInteger;\n publicKey: NearPublicKey;\n}\n\nexport interface NearFunctionCallPermission {\n receiverId: string;\n methodNames?: string[];\n allowance?: NearInteger | null;\n}\n\nexport interface NearAccessKey {\n nonce?: NearInteger;\n permission: \"FullAccess\" | \"FunctionCall\" | NearFunctionCallPermission;\n receiverId?: string;\n methodNames?: string[];\n allowance?: NearInteger | null;\n}\n\nexport interface NearAddKeyAction {\n type: \"AddKey\";\n publicKey: NearPublicKey;\n accessKey: NearAccessKey;\n}\n\nexport interface NearDeleteKeyAction {\n type: \"DeleteKey\";\n publicKey: NearPublicKey;\n}\n\nexport interface NearDeleteAccountAction {\n type: \"DeleteAccount\";\n beneficiaryId: string;\n}\n\nexport type NearClassicAction =\n | NearCreateAccountAction\n | NearDeployContractAction\n | NearFunctionCallAction\n | NearTransferAction\n | NearStakeAction\n | NearAddKeyAction\n | NearDeleteKeyAction\n | NearDeleteAccountAction;\n\nexport interface NearDelegateAction {\n senderId: string;\n receiverId: string;\n actions: NearClassicAction[];\n nonce: NearInteger;\n maxBlockHeight: NearInteger;\n publicKey: NearPublicKey;\n}\n\nexport interface NearSignedDelegateAction {\n type: \"SignedDelegate\";\n delegateAction: NearDelegateAction;\n signature: string | Uint8Array;\n publicKey?: NearPublicKey;\n}\n\nexport type NearAction = NearClassicAction | NearSignedDelegateAction;\n\nexport interface PlainTransaction {\n signerId: string;\n publicKey: NearPublicKey;\n nonce: NearInteger;\n receiverId: string;\n blockHash: string;\n actions: NearAction[];\n}\n\nexport interface PlainSignedTransaction {\n transaction: object;\n signature: object;\n}\n\n// Function to return a JSON-ready version of the transaction\nexport const txToJson = (tx: PlainTransaction): Record<string, any> => {\n return JSON.parse(\n JSON.stringify(tx, (_key, value) =>\n typeof value === \"bigint\" ? value.toString() : value,\n ),\n );\n};\n\n// Return a compact JSON string of the transaction (for display/logging)\nexport const txToJsonStringified = (tx: PlainTransaction): string => {\n return JSON.stringify(txToJson(tx));\n};\n\nfunction mapPublicKey(keyString: string) {\n const { keyType, data } = decodeNearPublicKey(keyString);\n return { [NEAR_KEY_DESCRIPTORS[keyType].publicKeyVariant]: { data } };\n}\n\nfunction mapSignature(signature: string | Uint8Array, signerKeyString: string) {\n const keyType = keyTypeFromString(signerKeyString);\n let data: Uint8Array;\n if (typeof signature === \"string\") {\n if (signature.includes(\":\")) {\n const signatureKeyType = keyTypeFromString(signature);\n if (signatureKeyType !== keyType) {\n throw new Error(\n `Signature key type ${signatureKeyType} does not match signer key type ${keyType}`,\n );\n }\n data = keyFromString(signature);\n } else {\n data = keyFromString(`${keyType}:${signature}`);\n }\n } else {\n data = signature;\n }\n const expected = NEAR_KEY_DESCRIPTORS[keyType].signatureLength;\n if (data.length !== expected) {\n throw new Error(\n `Invalid ${keyType} signature length: expected ${expected} bytes, got ${data.length}`,\n );\n }\n\n return { [NEAR_KEY_DESCRIPTORS[keyType].signatureVariant]: { data } };\n}\n\nexport function mapTransaction(jsonTransaction: PlainTransaction) {\n return {\n signerId: jsonTransaction.signerId,\n publicKey: mapPublicKey(jsonTransaction.publicKey),\n nonce: BigInt(jsonTransaction.nonce),\n receiverId: jsonTransaction.receiverId,\n blockHash: fromBase58(jsonTransaction.blockHash),\n actions: jsonTransaction.actions.map(mapAction),\n };\n}\n\nexport function serializeTransaction(jsonTransaction: PlainTransaction) {\n const transaction = mapTransaction(jsonTransaction);\n return borshSerialize(SCHEMA.Transaction, transaction);\n}\n\nexport function serializeSignedTransaction(\n jsonTransaction: PlainTransaction,\n signature: string | Uint8Array,\n) {\n const mappedSignedTx = mapTransaction(jsonTransaction);\n\n const plainSignedTransaction: PlainSignedTransaction = {\n transaction: mappedSignedTx,\n signature: mapSignature(signature, jsonTransaction.publicKey),\n };\n\n return borshSerialize(SCHEMA.SignedTransaction, plainSignedTransaction);\n}\n\nexport function mapAction(action: NearAction): object {\n switch (action.type) {\n case \"CreateAccount\": {\n return {\n createAccount: {},\n };\n }\n case \"DeployContract\": {\n return {\n deployContract: {\n code: base64ToBytes(action.codeBase64),\n },\n };\n }\n case \"FunctionCall\": {\n return {\n functionCall: {\n methodName: action.methodName,\n args:\n action.argsBase64 !== null && action.argsBase64 !== undefined\n ? base64ToBytes(action.argsBase64)\n : new TextEncoder().encode(JSON.stringify(action.args ?? {})),\n gas: toNearAmount(action.gas, \"300000000000000\"),\n deposit: toNearAmount(action.deposit),\n },\n };\n }\n case \"Transfer\": {\n return {\n transfer: {\n deposit: toNearAmount(action.deposit),\n },\n };\n }\n case \"Stake\": {\n assertNearValidatorPublicKey(action.publicKey);\n return {\n stake: {\n stake: toNearAmount(action.stake),\n publicKey: mapPublicKey(action.publicKey),\n },\n };\n }\n case \"AddKey\": {\n const permission = action.accessKey.permission;\n if (\n permission !== \"FullAccess\" &&\n permission !== \"FunctionCall\" &&\n (permission == null || typeof permission !== \"object\")\n ) {\n throw new Error(`Unsupported access-key permission: ${String(permission)}`);\n }\n const functionCall =\n typeof permission === \"object\" ? permission : action.accessKey;\n if (\n permission !== \"FullAccess\" &&\n typeof functionCall.receiverId !== \"string\"\n ) {\n throw new Error(\"Function-call access keys require a receiverId\");\n }\n\n return {\n addKey: {\n publicKey: mapPublicKey(action.publicKey),\n accessKey: {\n nonce: BigInt(action.accessKey.nonce ?? 0),\n permission:\n permission === \"FullAccess\"\n ? { fullAccess: {} }\n : {\n functionCall: {\n allowance: functionCall.allowance != null\n ? toNearAmount(functionCall.allowance)\n : null,\n receiverId: functionCall.receiverId,\n methodNames: functionCall.methodNames ?? [],\n },\n },\n },\n },\n };\n }\n case \"DeleteKey\": {\n return {\n deleteKey: {\n publicKey: mapPublicKey(action.publicKey),\n },\n };\n }\n case \"DeleteAccount\": {\n return {\n deleteAccount: {\n beneficiaryId: action.beneficiaryId,\n },\n };\n }\n case \"SignedDelegate\": {\n const delegate = action.delegateAction;\n if (action.publicKey && action.publicKey !== delegate.publicKey) {\n throw new Error(\n \"SignedDelegate publicKey must match delegateAction.publicKey\",\n );\n }\n return {\n signedDelegate: {\n delegateAction: {\n senderId: delegate.senderId,\n receiverId: delegate.receiverId,\n actions: delegate.actions.map(mapAction),\n nonce: BigInt(delegate.nonce),\n maxBlockHeight: BigInt(delegate.maxBlockHeight),\n publicKey: mapPublicKey(delegate.publicKey),\n },\n signature: mapSignature(action.signature, delegate.publicKey),\n },\n };\n }\n default: {\n throw new Error(\n \"Not implemented action: \" + (action as { type?: unknown }).type,\n );\n }\n }\n}\n\nexport const SCHEMA = getBorshSchema();\n\n/**\n * NEP-461 domain-separation tag for delegate actions (2^30 + 366), written as a\n * little-endian u32 in front of the borsh DelegateAction before hashing. Single-\n * sourced here so the api's local signer and the wallet-adapter's validator\n * can't drift on the prefix.\n */\nexport const NEP461_DELEGATE_TAG = 2 ** 30 + 366;\n\n/** Map a flat DelegateAction into the borsh chain-schema shape. */\nfunction mapDelegateAction(delegate: NearDelegateAction) {\n return {\n senderId: delegate.senderId,\n receiverId: delegate.receiverId,\n actions: delegate.actions.map(mapAction),\n nonce: BigInt(delegate.nonce),\n maxBlockHeight: BigInt(delegate.maxBlockHeight),\n publicKey: mapPublicKey(delegate.publicKey),\n };\n}\n\n/** Borsh-serialize a NEP-366 DelegateAction, mapped to the chain schema shape. */\nexport function serializeDelegateAction(delegate: NearDelegateAction): Uint8Array {\n return new Uint8Array(borshSerialize(SCHEMA.DelegateAction, mapDelegateAction(delegate)));\n}\n\n/** Borsh-serialize a NEP-366 SignedDelegate from a flat delegate + signature. */\nexport function serializeSignedDelegate(\n delegate: NearDelegateAction,\n signature: string | Uint8Array,\n): Uint8Array {\n return new Uint8Array(\n borshSerialize(SCHEMA.SignedDelegate, {\n delegateAction: mapDelegateAction(delegate),\n signature: mapSignature(signature, delegate.publicKey),\n }),\n );\n}\n\n/**\n * The 32-byte hash a signer authorizes for a delegate action:\n * `sha256(NEP461_DELEGATE_TAG_le_u32 ‖ borsh(DelegateAction))`. Signing this and\n * pairing the signature with the delegate yields a NEP-366 SignedDelegate.\n */\nexport function delegateSigningHash(delegate: NearDelegateAction): Uint8Array {\n const body = serializeDelegateAction(delegate);\n const prefixed = new Uint8Array(4 + body.length);\n new DataView(prefixed.buffer).setUint32(0, NEP461_DELEGATE_TAG, true);\n prefixed.set(body, 4);\n return sha256(prefixed);\n}\n","import { base64ToBytes, bytesToBase64, toBase58 } from \"@fastnear/utils\";\nimport {\n INTENTS_CONTRACT_ID,\n type Intent,\n type IntentMessage,\n type IntentSigner,\n type SignIntentsParams,\n type GeneratedUnsignedIntent,\n type SignPayloadOptions,\n type SignedIntentNep413,\n type UnsignedNep413Payload,\n} from \"./types.js\";\n\n/** Crypto-random 32-byte NEP-413 nonce (the verifier's replay nonce). */\nexport function randomNonce(): Uint8Array {\n return crypto.getRandomValues(new Uint8Array(32));\n}\n\nconst DEFAULT_DEADLINE_MS = 5 * 60 * 1000;\n\n/** ISO-8601 deadline `ms` milliseconds from now (default 5 minutes). */\nexport function defaultDeadline(ms: number = DEFAULT_DEADLINE_MS): string {\n return new Date(Date.now() + ms).toISOString();\n}\n\n/** Build the inner intent message that gets signed. */\nexport function buildIntentMessage({\n signerId,\n intents,\n deadline,\n}: {\n signerId: string;\n intents: Intent[];\n deadline?: string;\n}): IntentMessage {\n if (!signerId) throw new Error(\"signerId is required\");\n if (!Array.isArray(intents) || intents.length === 0) {\n throw new Error(\"At least one intent is required\");\n }\n return {\n signer_id: signerId,\n deadline: deadline ?? defaultDeadline(),\n intents,\n };\n}\n\n/**\n * Encode a NEP-413 signature the way intents.near expects it:\n * `ed25519:<base58>` (or `secp256k1:<base58>` for 65-byte signatures).\n *\n * NEAR wallets return the signature as plain base64 per NEP-413 — passing\n * that through unconverted is the most common integration bug.\n */\nexport function encodeIntentSignature(\n signature: string | Uint8Array,\n): string {\n if (typeof signature === \"string\") {\n if (\n signature.startsWith(\"ed25519:\") ||\n signature.startsWith(\"secp256k1:\")\n ) {\n return signature;\n }\n return encodeIntentSignature(base64ToBytes(signature));\n }\n if (signature.length === 64) return `ed25519:${toBase58(signature)}`;\n if (signature.length === 65) return `secp256k1:${toBase58(signature)}`;\n throw new Error(\n `Unsupported NEP-413 signature length: ${signature.length} (expected 64 or 65 bytes)`,\n );\n}\n\n/** Ensure a public key string carries its curve prefix. */\nexport function normalizeIntentPublicKey(publicKey: string): string {\n if (!publicKey) throw new Error(\"A public key is required\");\n return publicKey.includes(\":\") ? publicKey : `ed25519:${publicKey}`;\n}\n\n/**\n * Assemble the signed MultiPayload from NEP-413 parts. Accepts the\n * signature as wallet base64, raw bytes, or an already-prefixed string.\n */\nexport function toSignedIntent({\n message,\n nonce,\n recipient = INTENTS_CONTRACT_ID,\n publicKey,\n signature,\n callbackUrl,\n}: {\n message: IntentMessage | string;\n nonce: Uint8Array;\n recipient?: string;\n publicKey: string;\n signature: string | Uint8Array;\n callbackUrl?: string;\n}): SignedIntentNep413 {\n if (nonce.length !== 32) {\n throw new Error(`NEP-413 nonce must be exactly 32 bytes, got ${nonce.length}`);\n }\n return {\n standard: \"nep413\",\n payload: {\n message: typeof message === \"string\" ? message : JSON.stringify(message),\n nonce: bytesToBase64(nonce),\n recipient,\n ...(callbackUrl ? { callbackUrl } : {}),\n },\n public_key: normalizeIntentPublicKey(publicKey),\n signature: encodeIntentSignature(signature),\n };\n}\n\n/**\n * Normalize an unsigned payload as 1Click's generate-intent returns it.\n * Accepts either the bare payload or the `{ standard, payload }` wrapper,\n * and decodes a base64 nonce string to bytes.\n */\nexport function unsignedPayloadParts(\n input: GeneratedUnsignedIntent,\n): { message: string; nonce: Uint8Array; recipient: string; callbackUrl?: string } {\n const payload =\n \"payload\" in input && typeof input.payload === \"object\"\n ? input.payload\n : (input as UnsignedNep413Payload);\n if (\n \"standard\" in input &&\n typeof input.standard === \"string\" &&\n input.standard !== \"nep413\"\n ) {\n throw new Error(\n `This signer only signs nep413 payloads; got standard \"${input.standard}\"`,\n );\n }\n if (typeof payload?.message !== \"string\" || typeof payload?.recipient !== \"string\") {\n throw new Error(\"Unsigned payload must carry message and recipient strings\");\n }\n const nonce =\n typeof payload.nonce === \"string\"\n ? base64ToBytes(payload.nonce)\n : payload.nonce;\n if (!(nonce instanceof Uint8Array) || nonce.length !== 32) {\n throw new Error(\"Unsigned payload nonce must decode to exactly 32 bytes\");\n }\n return {\n message: payload.message,\n nonce,\n recipient: payload.recipient,\n ...(payload.callbackUrl ? { callbackUrl: payload.callbackUrl } : {}),\n };\n}\n\nfunction assertExpectedRecipient(\n recipient: string,\n options?: SignPayloadOptions,\n): void {\n const expected = options?.expectedRecipient ?? INTENTS_CONTRACT_ID;\n if (recipient !== expected) {\n throw new Error(\n `Refusing to sign a payload for recipient \"${recipient}\" — expected \"${expected}\". ` +\n \"Pass { expectedRecipient } only when intentionally targeting a different verifier.\",\n );\n }\n}\n\n/** Best-effort signer_id extraction from an intent-message JSON string. */\nfunction signerIdFromMessage(message: string): string | undefined {\n try {\n const parsed = JSON.parse(message);\n return typeof parsed?.signer_id === \"string\" ? parsed.signer_id : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * The @fastnear/wallet surface this package needs — structural, so any\n * object with a NEP-413 `signMessage` (and optionally `accountId`) works.\n */\nexport interface FastNearWalletLike {\n accountId?(options?: { network?: \"mainnet\" | \"testnet\" }): string | null;\n signMessage(params: {\n message: string;\n recipient: string;\n nonce: Uint8Array;\n network?: \"mainnet\" | \"testnet\";\n }): Promise<{ accountId: string; publicKey: string; signature: string }>;\n}\n\nexport interface WalletIntentSignerOptions {\n wallet: FastNearWalletLike;\n /** NEAR Intents is mainnet-oriented; override only for test deployments. */\n network?: \"mainnet\" | \"testnet\";\n}\n\n/**\n * Sign intent messages with a connected FastNEAR wallet via NEP-413.\n *\n * NEP-413 requires a full-access key, so wallets sign with the account's\n * own key — FunctionCall-access session keys cannot authorize intents.\n * The wallet's base64 signature is re-encoded to `ed25519:<base58>`.\n */\nexport function createWalletIntentSigner({\n wallet,\n network = \"mainnet\",\n}: WalletIntentSignerOptions): IntentSigner {\n if (!wallet || typeof wallet.signMessage !== \"function\") {\n throw new Error(\n \"A FastNEAR wallet module with signMessage is required (connect @fastnear/wallet first)\",\n );\n }\n\n async function signParts({\n message,\n nonce,\n recipient,\n callbackUrl,\n expectedSigner,\n }: {\n message: string;\n nonce: Uint8Array;\n recipient: string;\n callbackUrl?: string;\n expectedSigner?: string;\n }): Promise<SignedIntentNep413> {\n if (callbackUrl) {\n // NEP-413 binds callbackUrl into the signed digest, but the wallet\n // signMessage transport has no callbackUrl parameter — signing would\n // produce a payload that advertises a callbackUrl the signature does\n // not cover, which the verifier rejects.\n throw new Error(\n \"Wallet intent signing cannot bind callbackUrl payloads; use the local signer or drop callbackUrl\",\n );\n }\n const signed = await wallet.signMessage({\n message,\n recipient,\n nonce,\n network,\n });\n\n if (expectedSigner && signed.accountId && signed.accountId !== expectedSigner) {\n throw new Error(\n `Wallet signed as ${signed.accountId} but the intent names ${expectedSigner}; reconnect the intended account`,\n );\n }\n\n return toSignedIntent({\n message,\n nonce,\n recipient,\n publicKey: signed.publicKey,\n signature: signed.signature,\n callbackUrl,\n });\n }\n\n return {\n async signIntents(params: SignIntentsParams): Promise<SignedIntentNep413> {\n const signerId =\n params.signerId ??\n (typeof wallet.accountId === \"function\"\n ? wallet.accountId({ network })\n : null);\n if (!signerId) {\n throw new Error(`No wallet account connected on ${network}`);\n }\n\n const message = buildIntentMessage({\n signerId,\n intents: params.intents,\n deadline: params.deadline,\n });\n return signParts({\n message: JSON.stringify(message),\n nonce: params.nonce ?? randomNonce(),\n recipient: params.verifyingContract ?? INTENTS_CONTRACT_ID,\n expectedSigner: signerId,\n });\n },\n\n async signPayload(\n payload: GeneratedUnsignedIntent,\n options?: SignPayloadOptions,\n ): Promise<SignedIntentNep413> {\n const parts = unsignedPayloadParts(payload);\n assertExpectedRecipient(parts.recipient, options);\n return signParts({\n ...parts,\n expectedSigner: signerIdFromMessage(parts.message),\n });\n },\n };\n}\n","import { INTENTS_CONTRACT_ID, type IntentsTokenId } from \"./types.js\";\n\n/** Gas / deposit defaults for verifier interactions. */\nexport const FT_TRANSFER_CALL_GAS = \"100000000000000\"; // 100 TGas\nexport const WITHDRAW_GAS = \"100000000000000\"; // 100 TGas\nexport const WRAP_NEAR_GAS = \"30000000000000\"; // 30 TGas\nexport const ONE_YOCTO = \"1\";\n\n/** wNEAR contract — native NEAR must be wrapped before depositing. */\nexport const WRAP_NEAR_CONTRACT_ID = \"wrap.near\";\n\n/**\n * The flat FastNEAR action shape. near.sendTx serializes these fields\n * directly, and @fastnear/wallet converts flat actions for near-connect\n * wallets — so one shape works on both signing paths.\n */\nexport interface FunctionCallActionShape {\n type: \"FunctionCall\";\n methodName: string;\n args: Record<string, unknown>;\n gas: string;\n deposit: string;\n}\n\n/**\n * Build the `ft_transfer_call` action that deposits a NEP-141 token into the\n * verifier. Apply it ON the token contract:\n *\n * near.sendTx({ receiverId: \"usdt.tether-token.near\",\n * actions: [ftDepositAction({ amount })] })\n *\n * `msg` semantics (per the verifier docs): \"\" credits the sender; an\n * account-id string credits that account (`creditTo`); a JSON string enables\n * execute_intents-on-deposit. Native NEAR is rejected by the verifier —\n * wrap it first (see wrapNearAction).\n */\nexport function ftDepositAction({\n amount,\n creditTo,\n msg,\n verifierId = INTENTS_CONTRACT_ID,\n gas = FT_TRANSFER_CALL_GAS,\n}: {\n amount: string;\n creditTo?: string;\n msg?: string;\n verifierId?: string;\n gas?: string;\n}): FunctionCallActionShape {\n if (creditTo !== undefined && msg !== undefined) {\n throw new Error(\"Pass either creditTo or msg, not both\");\n }\n return {\n type: \"FunctionCall\",\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: verifierId,\n amount,\n msg: msg ?? creditTo ?? \"\",\n },\n gas,\n deposit: ONE_YOCTO,\n };\n}\n\n/**\n * Build the `near_deposit` action that wraps native NEAR into wNEAR.\n * Apply it ON wrap.near:\n *\n * near.sendTx({ receiverId: \"wrap.near\",\n * actions: [wrapNearAction({ amountYocto })] })\n */\nexport function wrapNearAction({\n amountYocto,\n gas = WRAP_NEAR_GAS,\n}: {\n amountYocto: string;\n gas?: string;\n}): FunctionCallActionShape {\n return {\n type: \"FunctionCall\",\n methodName: \"near_deposit\",\n args: {},\n gas,\n deposit: amountYocto,\n };\n}\n\n/**\n * Build the direct-call `ft_withdraw` action that moves a NEP-141 token out\n * of the verifier back to a NEAR account. Apply it ON intents.near. `token`\n * is the plain contract id (no `nep141:` prefix). Omit `msg` so failed\n * withdrawals stay refundable.\n */\nexport function ftWithdrawAction({\n token,\n receiverId,\n amount,\n memo,\n msg,\n storageDeposit,\n gas = WITHDRAW_GAS,\n}: {\n token: string;\n receiverId: string;\n amount: string;\n memo?: string;\n msg?: string;\n storageDeposit?: string;\n gas?: string;\n}): FunctionCallActionShape {\n if (token.includes(\":\")) {\n throw new Error(\n `ft_withdraw takes the plain token contract id, not a prefixed multi-token id: ${token}`,\n );\n }\n return {\n type: \"FunctionCall\",\n methodName: \"ft_withdraw\",\n args: {\n token,\n receiver_id: receiverId,\n amount,\n ...(memo !== undefined ? { memo } : {}),\n ...(msg !== undefined ? { msg } : {}),\n ...(storageDeposit !== undefined\n ? { storage_deposit: storageDeposit }\n : {}),\n },\n gas,\n deposit: ONE_YOCTO,\n };\n}\n\n/** A near.view-compatible function, injected so this package stays api-free. */\nexport type ViewFunction = (params: {\n contractId: string;\n methodName: string;\n args: Record<string, unknown>;\n}) => Promise<unknown>;\n\n/** Read one internal balance from the verifier's NEP-245 ledger. */\nexport async function mtBalance({\n accountId,\n tokenId,\n view,\n verifierId = INTENTS_CONTRACT_ID,\n}: {\n accountId: string;\n tokenId: IntentsTokenId;\n view: ViewFunction;\n verifierId?: string;\n}): Promise<string> {\n const result = await view({\n contractId: verifierId,\n methodName: \"mt_balance_of\",\n args: { account_id: accountId, token_id: tokenId },\n });\n return String(result ?? \"0\");\n}\n\n/**\n * Read many internal balances in one view call. Returns a map keyed by\n * token id (the RPC returns base-unit strings in request order).\n */\nexport async function mtBatchBalances({\n accountId,\n tokenIds,\n view,\n verifierId = INTENTS_CONTRACT_ID,\n}: {\n accountId: string;\n tokenIds: IntentsTokenId[];\n view: ViewFunction;\n verifierId?: string;\n}): Promise<Record<IntentsTokenId, string>> {\n const result = (await view({\n contractId: verifierId,\n methodName: \"mt_batch_balance_of\",\n args: { account_id: accountId, token_ids: tokenIds },\n })) as unknown[];\n if (!Array.isArray(result) || result.length !== tokenIds.length) {\n throw new Error(\n `mt_batch_balance_of returned ${Array.isArray(result) ? result.length : typeof result} results for ${tokenIds.length} token ids`,\n );\n }\n return Object.fromEntries(\n tokenIds.map((tokenId, index) => [tokenId, String(result[index] ?? \"0\")]),\n );\n}\n","import { IntentsHttpError } from \"./one-click.js\";\nimport {\n SOLVER_RELAY_URL,\n type RelayPublishResult,\n type RelayQuote,\n type RelayQuoteParams,\n type RelayStatusResult,\n type SignedIntent,\n} from \"./types.js\";\n\nexport interface SolverRelayClientOptions {\n url?: string;\n /** Relay API key (X-API-Key header), issued via the partner dashboard. */\n apiKey?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport interface SolverRelayClient {\n /** Ask connected solvers for quotes (relay-side timeout ~3s). null = no quotes. */\n quote(params: RelayQuoteParams): Promise<RelayQuote[] | null>;\n /** Publish one signed intent against the quote hashes it fills. */\n publishIntent(params: {\n signedData: SignedIntent;\n quoteHashes: string[];\n }): Promise<RelayPublishResult>;\n /** Publish a batch of signed intents. */\n publishIntents(params: {\n signedDatas: SignedIntent[];\n quoteHashes: string[];\n requote?: boolean;\n }): Promise<RelayPublishResult>;\n /** Poll a published intent: PENDING → TX_BROADCASTED → SETTLED. */\n getStatus(params: { intentHash: string }): Promise<RelayStatusResult>;\n}\n\n/** Error carrying the JSON-RPC error object from the solver relay. */\nexport class SolverRelayError extends Error {\n readonly rpcError: unknown;\n\n constructor(message: string, rpcError: unknown) {\n super(message);\n this.name = \"SolverRelayError\";\n this.rpcError = rpcError;\n }\n}\n\n/**\n * Zero-dependency JSON-RPC client for the NEAR Intents solver relay\n * (the message bus that brokers quotes between users and solvers and\n * submits matched intent bundles to intents.near).\n */\nexport function createSolverRelayClient(\n options: SolverRelayClientOptions = {},\n): SolverRelayClient {\n const url = options.url ?? SOLVER_RELAY_URL;\n const fetchImplementation = options.fetch ?? globalThis.fetch;\n if (typeof fetchImplementation !== \"function\") {\n throw new Error(\"A fetch implementation is required\");\n }\n\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (options.apiKey) headers[\"X-API-Key\"] = options.apiKey;\n\n let nextId = 0;\n\n async function call<T>(method: string, params: unknown): Promise<T> {\n const id = ++nextId;\n const response = await fetchImplementation(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ id, jsonrpc: \"2.0\", method, params: [params] }),\n });\n const text = await response.text();\n let parsed: unknown = null;\n try {\n parsed = text ? JSON.parse(text) : null;\n } catch {\n parsed = text;\n }\n if (!response.ok) {\n throw new IntentsHttpError(\n `Solver relay ${method} failed with ${response.status}`,\n response.status,\n parsed,\n );\n }\n const body = parsed as { result?: T; error?: unknown };\n if (body && typeof body === \"object\" && body.error != null) {\n throw new SolverRelayError(\n `Solver relay ${method} returned an error: ${JSON.stringify(body.error)}`,\n body.error,\n );\n }\n if (!body || typeof body !== \"object\" || !(\"result\" in body)) {\n throw new SolverRelayError(\n `Solver relay ${method} returned a malformed JSON-RPC envelope`,\n parsed,\n );\n }\n return body.result as T;\n }\n\n return {\n quote: (params) => call(\"quote\", params),\n publishIntent: ({ signedData, quoteHashes }) =>\n call(\"publish_intent\", {\n signed_data: signedData,\n quote_hashes: quoteHashes,\n }),\n publishIntents: ({ signedDatas, quoteHashes, requote }) =>\n call(\"publish_intents\", {\n signed_datas: signedDatas,\n quote_hashes: quoteHashes,\n ...(requote === undefined ? {} : { requote }),\n }),\n getStatus: ({ intentHash }) =>\n call(\"get_status\", { intent_hash: intentHash }),\n };\n}\n"],"mappings":"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","names":["src_exports"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fastnear/intents",
3
- "version": "1.6.3",
3
+ "version": "2.1.0",
4
4
  "description": "NEAR Intents for end users and agents: 1Click swaps, NEP-413 intent signing, verifier deposits/withdrawals, and the solver relay",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -59,10 +59,10 @@
59
59
  }
60
60
  },
61
61
  "dependencies": {
62
- "@fastnear/utils": "1.6.3"
62
+ "@fastnear/utils": "2.1.0"
63
63
  },
64
64
  "peerDependencies": {
65
- "@fastnear/wallet": "1.6.3"
65
+ "@fastnear/wallet": "2.1.0"
66
66
  },
67
67
  "peerDependenciesMeta": {
68
68
  "@fastnear/wallet": {
@@ -70,7 +70,7 @@
70
70
  }
71
71
  },
72
72
  "devDependencies": {
73
- "@fastnear/wallet": "1.6.3",
73
+ "@fastnear/wallet": "2.1.0",
74
74
  "rimraf": "^6.0.1",
75
75
  "tsup": "^8.3.6",
76
76
  "typescript": "^5.7.2"