@outlayer/sdk 0.1.0-alpha.1 → 0.1.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -165,7 +165,8 @@ Reusing the same key returns the original result without re-executing.
165
165
  ```ts
166
166
  const client = new OutlayerClient({
167
167
  apiKey: process.env.OUTLAYER_API_KEY!,
168
- baseUrl: 'https://api.outlayer.fastnear.com', // default
168
+ network: 'mainnet', // default; or 'testnet'
169
+ baseUrl: 'https://api.outlayer.fastnear.com', // optional, overrides network
169
170
  fetch: customFetch, // optional, for SSR/proxies
170
171
  retry: {
171
172
  maxAttempts: 5,
@@ -175,6 +176,17 @@ const client = new OutlayerClient({
175
176
  });
176
177
  ```
177
178
 
179
+ ### Testnet vs mainnet
180
+
181
+ `network: 'testnet'` targets `https://api.testnet.outlayer.fastnear.com`. Useful for development without spending real funds.
182
+
183
+ **Important**: NEAR Intents (cross-chain swaps and gasless withdrawals) only work on mainnet. On testnet you can still:
184
+ - register a wallet, derive addresses
185
+ - read balances, set policy, sign messages
186
+ - submit NEAR contract calls
187
+
188
+ …but `swap`, `intentsWithdraw`, and `intentsDeposit` will fail at the intents layer.
189
+
178
190
  ## Browser usage
179
191
 
180
192
  Don't ship your API key to a browser. The key has full wallet authority. Either:
package/dist/index.cjs CHANGED
@@ -94,7 +94,16 @@ async function errorFromResponse(response, parsed) {
94
94
  }
95
95
 
96
96
  // src/http.ts
97
- var DEFAULT_BASE_URL = "https://api.outlayer.fastnear.com";
97
+ var NETWORK_BASE_URLS = {
98
+ mainnet: "https://api.outlayer.fastnear.com",
99
+ testnet: "https://api.testnet.outlayer.fastnear.com"
100
+ };
101
+ var DEFAULT_BASE_URL = NETWORK_BASE_URLS.mainnet;
102
+ function resolveBaseUrl(opts) {
103
+ if (opts.baseUrl) return opts.baseUrl;
104
+ if (opts.network) return NETWORK_BASE_URLS[opts.network];
105
+ return DEFAULT_BASE_URL;
106
+ }
98
107
  var DEFAULT_RETRY = {
99
108
  maxAttempts: 3,
100
109
  initialDelayMs: 100,
@@ -102,7 +111,7 @@ var DEFAULT_RETRY = {
102
111
  };
103
112
  function makeClient(opts) {
104
113
  const init = {
105
- baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,
114
+ baseUrl: resolveBaseUrl(opts),
106
115
  headers: { Authorization: `Bearer ${opts.apiKey}` }
107
116
  };
108
117
  if (opts.fetch) init.fetch = opts.fetch;
@@ -112,7 +121,7 @@ function makeClient(opts) {
112
121
  }
113
122
  function makeUnauthenticatedClient(opts = {}) {
114
123
  const init = {
115
- baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL
124
+ baseUrl: resolveBaseUrl(opts)
116
125
  };
117
126
  if (opts.fetch) init.fetch = opts.fetch;
118
127
  return createClient__default.default(init);
@@ -359,6 +368,23 @@ var OutlayerClient = class {
359
368
  this.retry
360
369
  );
361
370
  }
371
+ // ------- Cross-chain deposit (1Click) -------
372
+ /**
373
+ * Create a one-time deposit address on a source chain. Send funds there,
374
+ * then poll {@link getDepositStatus} until `success`.
375
+ */
376
+ createDepositIntent(opts) {
377
+ return runWithRetry(
378
+ () => this.client.POST("/wallet/v1/deposit-intent", { body: opts }),
379
+ this.retry
380
+ );
381
+ }
382
+ getDepositStatus(intentId) {
383
+ return runWithRetry(
384
+ () => this.client.GET("/wallet/v1/deposit-status", { params: { query: { id: intentId } } }),
385
+ this.retry
386
+ );
387
+ }
362
388
  // ------- Async request tracking -------
363
389
  getRequest(id) {
364
390
  return runWithRetry(
@@ -377,6 +403,7 @@ var OutlayerClient = class {
377
403
  exports.ApprovalsAPI = ApprovalsAPI;
378
404
  exports.AuditAPI = AuditAPI;
379
405
  exports.BadRequestError = BadRequestError;
406
+ exports.NETWORK_BASE_URLS = NETWORK_BASE_URLS;
380
407
  exports.NotFoundError = NotFoundError;
381
408
  exports.OutlayerClient = OutlayerClient;
382
409
  exports.OutlayerError = OutlayerError;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/client.ts"],"names":["createClient"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { components } from './types.js';\n\nexport type ApiErrorCode = components['schemas']['ErrorCode'];\nexport type ErrorCode = ApiErrorCode | 'network_error' | 'parse_error';\n\nexport type ErrorBody = {\n error?: ApiErrorCode;\n message?: string;\n details?: unknown;\n};\n\nexport interface OutlayerErrorOptions {\n code: ErrorCode;\n message: string;\n status: number;\n details?: unknown;\n}\n\nexport class OutlayerError extends Error {\n readonly code: ErrorCode;\n readonly status: number;\n readonly details: unknown;\n\n constructor(opts: OutlayerErrorOptions) {\n super(opts.message);\n this.name = 'OutlayerError';\n this.code = opts.code;\n this.status = opts.status;\n this.details = opts.details;\n }\n}\n\nexport class PolicyDeniedError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'PolicyDeniedError';\n }\n}\n\nexport class WalletFrozenError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'WalletFrozenError';\n }\n}\n\nexport class UnauthorizedError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'UnauthorizedError';\n }\n}\n\nexport class RateLimitedError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'RateLimitedError';\n }\n}\n\nexport class NotFoundError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'NotFoundError';\n }\n}\n\nexport class BadRequestError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'BadRequestError';\n }\n}\n\nconst codeToCtor: Partial<Record<ErrorCode, new (opts: OutlayerErrorOptions) => OutlayerError>> = {\n policy_denied: PolicyDeniedError,\n wallet_frozen: WalletFrozenError,\n missing_auth: UnauthorizedError,\n invalid_api_key: UnauthorizedError,\n timestamp_expired: UnauthorizedError,\n rate_limited: RateLimitedError,\n request_not_found: NotFoundError,\n approval_not_found: NotFoundError,\n bad_request: BadRequestError,\n invalid_address: BadRequestError,\n insufficient_balance: BadRequestError,\n unsupported_chain: BadRequestError,\n unsupported_token: BadRequestError,\n};\n\nexport function makeError(body: ErrorBody, status: number): OutlayerError {\n const code: ErrorCode = body.error ?? 'parse_error';\n const message = body.message ?? `HTTP ${status}`;\n const opts: OutlayerErrorOptions = body.details !== undefined\n ? { code, message, status, details: body.details }\n : { code, message, status };\n const Ctor = codeToCtor[code] ?? OutlayerError;\n return new Ctor(opts);\n}\n\nexport async function errorFromResponse(response: Response, parsed?: unknown): Promise<OutlayerError> {\n let body: ErrorBody;\n if (parsed && typeof parsed === 'object') {\n body = parsed as ErrorBody;\n } else {\n try {\n body = (await response.clone().json()) as ErrorBody;\n } catch {\n body = { error: 'internal_error', message: response.statusText };\n }\n }\n return makeError(body, response.status);\n}\n","import createClient, { type Client } from 'openapi-fetch';\nimport type { paths } from './types.js';\nimport { OutlayerError, errorFromResponse } from './errors.js';\n\nexport const DEFAULT_BASE_URL = 'https://api.outlayer.fastnear.com';\n\nexport type RetryConfig = {\n maxAttempts?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n};\n\nexport type ClientOptions = {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n retry?: RetryConfig;\n};\n\nexport type UnauthenticatedOptions = {\n baseUrl?: string;\n fetch?: typeof fetch;\n};\n\nexport const DEFAULT_RETRY: Required<RetryConfig> = {\n maxAttempts: 3,\n initialDelayMs: 100,\n maxDelayMs: 1600,\n};\n\nexport type FetchClient = Client<paths, `${string}/${string}`>;\n\nexport function makeClient(opts: ClientOptions): { client: FetchClient; retry: Required<RetryConfig> } {\n const init: Parameters<typeof createClient<paths>>[0] = {\n baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,\n headers: { Authorization: `Bearer ${opts.apiKey}` },\n };\n if (opts.fetch) init.fetch = opts.fetch;\n const client = createClient<paths>(init);\n const retry: Required<RetryConfig> = { ...DEFAULT_RETRY, ...opts.retry };\n return { client, retry };\n}\n\nexport function makeUnauthenticatedClient(opts: UnauthenticatedOptions = {}): FetchClient {\n const init: Parameters<typeof createClient<paths>>[0] = {\n baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,\n };\n if (opts.fetch) init.fetch = opts.fetch;\n return createClient<paths>(init);\n}\n\nexport type FetchCall<T> = () => Promise<{\n data?: T;\n error?: unknown;\n response: Response;\n}>;\n\nexport async function runWithRetry<T>(\n call: FetchCall<T>,\n retry: Required<RetryConfig>,\n): Promise<T> {\n let lastError: unknown;\n for (let attempt = 1; attempt <= retry.maxAttempts; attempt++) {\n try {\n const { data, error, response } = await call();\n if (response.ok) {\n return data as T;\n }\n const err = await errorFromResponse(response, error);\n if (err.status >= 500 && attempt < retry.maxAttempts) {\n lastError = err;\n await sleep(backoff(attempt, retry));\n continue;\n }\n throw err;\n } catch (e) {\n if (e instanceof OutlayerError) throw e;\n lastError = e;\n if (attempt < retry.maxAttempts && isNetworkError(e)) {\n await sleep(backoff(attempt, retry));\n continue;\n }\n throw new OutlayerError({\n code: 'network_error',\n message: e instanceof Error ? e.message : String(e),\n status: 0,\n });\n }\n }\n throw lastError;\n}\n\nfunction backoff(attempt: number, cfg: Required<RetryConfig>): number {\n return Math.min(cfg.maxDelayMs, cfg.initialDelayMs * 2 ** (attempt - 1));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction isNetworkError(e: unknown): boolean {\n return e instanceof TypeError;\n}\n\nexport function newIdempotencyKey(): string {\n return crypto.randomUUID();\n}\n","import type { components } from './types.js';\nimport {\n type ClientOptions,\n type FetchClient,\n type RetryConfig,\n type UnauthenticatedOptions,\n DEFAULT_RETRY,\n makeClient,\n makeUnauthenticatedClient,\n newIdempotencyKey,\n runWithRetry,\n} from './http.js';\nimport { errorFromResponse } from './errors.js';\n\ntype Schemas = components['schemas'];\n\n// ---------------------------------------------------------------------------\n// Re-exported user-facing types (so consumers don't import paths/components)\n// ---------------------------------------------------------------------------\n\nexport type Chain = Schemas['Chain'];\nexport type RequestType = Schemas['RequestType'];\nexport type RequestStatus = Schemas['RequestStatus'];\n\nexport type RegisterRequest = Schemas['RegisterRequest'];\nexport type RegisterResponse = Schemas['RegisterResponse'];\nexport type AddressResponse = Schemas['AddressResponse'];\nexport type BalanceResponse = Schemas['BalanceResponse'];\nexport type TokensResponse = Schemas['TokensResponse'];\n\nexport type CallRequest = Schemas['CallRequest'];\nexport type CallResponse = Schemas['CallResponse'];\nexport type TransferRequest = Schemas['TransferRequest'];\nexport type IntentsDepositRequest = Schemas['IntentsDepositRequest'];\nexport type IntentsDepositResponse = Schemas['IntentsDepositResponse'];\n\nexport type WithdrawRequest = Schemas['WithdrawRequest'];\nexport type WithdrawResponse = Schemas['WithdrawResponse'];\nexport type DryRunResponse = Schemas['DryRunResponse'];\n\nexport type SwapRequest = Schemas['SwapRequest'];\nexport type SwapResponse = Schemas['SwapResponse'];\nexport type SwapQuoteResponse = Schemas['SwapQuoteResponse'];\n\nexport type SignMessageRequest = Schemas['SignMessageRequest'];\nexport type SignMessageResponse = Schemas['SignMessageResponse'];\n\nexport type RequestStatusResponse = Schemas['RequestStatusResponse'];\nexport type RequestListResponse = Schemas['RequestListResponse'];\n\nexport type PolicyResponse = Schemas['PolicyResponse'];\nexport type PolicyRules = Schemas['PolicyRules'];\nexport type ApprovalConfig = Schemas['ApprovalConfig'];\nexport type EncryptPolicyRequest = Schemas['EncryptPolicyRequest'];\nexport type EncryptPolicyResponse = Schemas['EncryptPolicyResponse'];\nexport type SignPolicyResponse = Schemas['SignPolicyResponse'];\n\nexport type PendingApproval = Schemas['PendingApproval'];\nexport type PendingApprovalsResponse = Schemas['PendingApprovalsResponse'];\nexport type Nep413Auth = Schemas['Nep413Auth'];\nexport type ApproveResponse = Schemas['ApproveResponse'];\n\nexport type AuditEvent = Schemas['AuditEvent'];\nexport type AuditResponse = Schemas['AuditResponse'];\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\ntype Idempotent = { idempotencyKey?: string };\n\nfunction idempotencyHeader(key: string | undefined): Record<string, string> {\n return { 'Idempotency-Key': key ?? newIdempotencyKey() };\n}\n\n// ---------------------------------------------------------------------------\n// Sub-namespaces\n// ---------------------------------------------------------------------------\n\nexport class PolicyAPI {\n constructor(\n private readonly client: FetchClient,\n private readonly retry: Required<RetryConfig>,\n ) {}\n\n get(): Promise<PolicyResponse> {\n return runWithRetry(() => this.client.GET('/wallet/v1/policy'), this.retry);\n }\n\n encrypt(body: EncryptPolicyRequest): Promise<EncryptPolicyResponse> {\n return runWithRetry(() => this.client.POST('/wallet/v1/encrypt-policy', { body }), this.retry);\n }\n\n sign(encryptedData: string): Promise<SignPolicyResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/sign-policy', { body: { encrypted_data: encryptedData } }),\n this.retry,\n );\n }\n\n invalidateCache(walletId: string): Promise<void> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/invalidate-cache', { body: { wallet_id: walletId } }),\n this.retry,\n ).then(() => undefined);\n }\n}\n\nexport class ApprovalsAPI {\n constructor(\n private readonly client: FetchClient,\n private readonly retry: Required<RetryConfig>,\n ) {}\n\n listPending(): Promise<PendingApprovalsResponse> {\n return runWithRetry(() => this.client.GET('/wallet/v1/pending_approvals'), this.retry);\n }\n\n approve(approvalId: string, auth: Nep413Auth): Promise<ApproveResponse> {\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/approve/{id}', {\n params: { path: { id: approvalId } },\n body: auth,\n }),\n this.retry,\n );\n }\n\n reject(approvalId: string, auth: Nep413Auth, reason?: string): Promise<ApproveResponse> {\n const body = reason !== undefined ? { ...auth, reason } : auth;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/reject/{id}', {\n params: { path: { id: approvalId } },\n body,\n }),\n this.retry,\n );\n }\n}\n\nexport class AuditAPI {\n constructor(\n private readonly client: FetchClient,\n private readonly retry: Required<RetryConfig>,\n ) {}\n\n list(opts: { limit?: number; offset?: number } = {}): Promise<AuditResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/audit', { params: { query: opts } }),\n this.retry,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main client\n// ---------------------------------------------------------------------------\n\nexport class OutlayerClient {\n private readonly client: FetchClient;\n private readonly retry: Required<RetryConfig>;\n\n readonly policy: PolicyAPI;\n readonly approvals: ApprovalsAPI;\n readonly audit: AuditAPI;\n\n constructor(opts: ClientOptions) {\n const { client, retry } = makeClient(opts);\n this.client = client;\n this.retry = retry;\n this.policy = new PolicyAPI(client, retry);\n this.approvals = new ApprovalsAPI(client, retry);\n this.audit = new AuditAPI(client, retry);\n }\n\n // ------- Static factory: register a new wallet (no auth) -------\n\n /**\n * Register a new wallet and obtain an API key.\n *\n * - Empty call: anonymous wallet on OutLayer's shared master. Convenient, no setup.\n * - With `vaultId`: bind to a deployed customer vault so keys derive through\n * the per-vault master. Vault binding is permanent.\n * - With `body`: full control — pass any `RegisterRequest` field (e.g., NEP-413\n * account-binding fields). `vaultId` is merged into `body.vault_id` if not\n * already set.\n *\n * Vault deployment is NOT done here — use the dashboard\n * (https://outlayer.fastnear.com/vault) or `outlayer vault init` CLI.\n * See docs/vaults.md for the full flow.\n */\n static async register(\n opts: {\n vaultId?: string;\n body?: RegisterRequest;\n } & UnauthenticatedOptions = {},\n ): Promise<RegisterResponse> {\n const client = makeUnauthenticatedClient(opts);\n const body: RegisterRequest = { ...(opts.body ?? {}) };\n if (opts.vaultId !== undefined && body.vault_id === undefined) {\n body.vault_id = opts.vaultId;\n }\n const { data, error, response } = await client.POST('/register', { body });\n if (!response.ok) throw await errorFromResponse(response, error);\n return data as RegisterResponse;\n }\n\n // ------- Wallet read -------\n\n getAddress(chain: Chain): Promise<AddressResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/address', { params: { query: { chain } } }),\n this.retry,\n );\n }\n\n getBalance(\n opts: { chain?: Chain; token?: string; source?: 'chain' | 'intents' } = {},\n ): Promise<BalanceResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/balance', { params: { query: opts } }),\n this.retry,\n );\n }\n\n listTokens(): Promise<TokensResponse> {\n return runWithRetry(() => this.client.GET('/wallet/v1/tokens'), this.retry);\n }\n\n // ------- Wallet write -------\n\n call(opts: CallRequest & Idempotent): Promise<CallResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/call', {\n body: body as CallRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n transfer(opts: TransferRequest & Idempotent): Promise<CallResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/transfer', {\n body: body as TransferRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n intentsDeposit(opts: IntentsDepositRequest & Idempotent): Promise<IntentsDepositResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/intents/deposit', {\n body: body as IntentsDepositRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n withdraw(opts: WithdrawRequest & Idempotent): Promise<WithdrawResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/intents/withdraw', {\n body: body as WithdrawRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n withdrawDryRun(opts: WithdrawRequest): Promise<DryRunResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/intents/withdraw/dry-run', { body: opts }),\n this.retry,\n );\n }\n\n swap(opts: SwapRequest & Idempotent): Promise<SwapResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/intents/swap', {\n body: body as SwapRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n swapQuote(opts: SwapRequest): Promise<SwapQuoteResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/intents/swap/quote', { body: opts }),\n this.retry,\n );\n }\n\n signMessage(opts: SignMessageRequest): Promise<SignMessageResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/sign-message', { body: opts }),\n this.retry,\n );\n }\n\n // ------- Async request tracking -------\n\n getRequest(id: string): Promise<RequestStatusResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/requests/{id}', { params: { path: { id } } }),\n this.retry,\n );\n }\n\n listRequests(\n opts: { type?: RequestType; status?: RequestStatus; limit?: number; offset?: number } = {},\n ): Promise<RequestListResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/requests', { params: { query: opts } }),\n this.retry,\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/client.ts"],"names":["createClient"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { components } from './types.js';\n\nexport type ApiErrorCode = components['schemas']['ErrorCode'];\nexport type ErrorCode = ApiErrorCode | 'network_error' | 'parse_error';\n\nexport type ErrorBody = {\n error?: ApiErrorCode;\n message?: string;\n details?: unknown;\n};\n\nexport interface OutlayerErrorOptions {\n code: ErrorCode;\n message: string;\n status: number;\n details?: unknown;\n}\n\nexport class OutlayerError extends Error {\n readonly code: ErrorCode;\n readonly status: number;\n readonly details: unknown;\n\n constructor(opts: OutlayerErrorOptions) {\n super(opts.message);\n this.name = 'OutlayerError';\n this.code = opts.code;\n this.status = opts.status;\n this.details = opts.details;\n }\n}\n\nexport class PolicyDeniedError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'PolicyDeniedError';\n }\n}\n\nexport class WalletFrozenError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'WalletFrozenError';\n }\n}\n\nexport class UnauthorizedError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'UnauthorizedError';\n }\n}\n\nexport class RateLimitedError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'RateLimitedError';\n }\n}\n\nexport class NotFoundError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'NotFoundError';\n }\n}\n\nexport class BadRequestError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'BadRequestError';\n }\n}\n\nconst codeToCtor: Partial<Record<ErrorCode, new (opts: OutlayerErrorOptions) => OutlayerError>> = {\n policy_denied: PolicyDeniedError,\n wallet_frozen: WalletFrozenError,\n missing_auth: UnauthorizedError,\n invalid_api_key: UnauthorizedError,\n timestamp_expired: UnauthorizedError,\n rate_limited: RateLimitedError,\n request_not_found: NotFoundError,\n approval_not_found: NotFoundError,\n bad_request: BadRequestError,\n invalid_address: BadRequestError,\n insufficient_balance: BadRequestError,\n unsupported_chain: BadRequestError,\n unsupported_token: BadRequestError,\n};\n\nexport function makeError(body: ErrorBody, status: number): OutlayerError {\n const code: ErrorCode = body.error ?? 'parse_error';\n const message = body.message ?? `HTTP ${status}`;\n const opts: OutlayerErrorOptions = body.details !== undefined\n ? { code, message, status, details: body.details }\n : { code, message, status };\n const Ctor = codeToCtor[code] ?? OutlayerError;\n return new Ctor(opts);\n}\n\nexport async function errorFromResponse(response: Response, parsed?: unknown): Promise<OutlayerError> {\n let body: ErrorBody;\n if (parsed && typeof parsed === 'object') {\n body = parsed as ErrorBody;\n } else {\n try {\n body = (await response.clone().json()) as ErrorBody;\n } catch {\n body = { error: 'internal_error', message: response.statusText };\n }\n }\n return makeError(body, response.status);\n}\n","import createClient, { type Client } from 'openapi-fetch';\nimport type { paths } from './types.js';\nimport { OutlayerError, errorFromResponse } from './errors.js';\n\nexport type Network = 'mainnet' | 'testnet';\n\nexport const NETWORK_BASE_URLS: Record<Network, string> = {\n mainnet: 'https://api.outlayer.fastnear.com',\n testnet: 'https://api.testnet.outlayer.fastnear.com',\n};\n\nexport const DEFAULT_BASE_URL = NETWORK_BASE_URLS.mainnet;\n\nexport type RetryConfig = {\n maxAttempts?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n};\n\nexport type ClientOptions = {\n apiKey: string;\n /**\n * NEAR network to target. Defaults to `mainnet`. NEAR Intents (cross-chain\n * swaps + gasless withdrawals) only work on mainnet — use testnet for the\n * register / policy / sign-message flow while developing.\n */\n network?: Network;\n /** Overrides `network` for self-hosted or staging deployments. */\n baseUrl?: string;\n fetch?: typeof fetch;\n retry?: RetryConfig;\n};\n\nexport type UnauthenticatedOptions = {\n network?: Network;\n baseUrl?: string;\n fetch?: typeof fetch;\n};\n\nfunction resolveBaseUrl(opts: { network?: Network; baseUrl?: string }): string {\n if (opts.baseUrl) return opts.baseUrl;\n if (opts.network) return NETWORK_BASE_URLS[opts.network];\n return DEFAULT_BASE_URL;\n}\n\nexport const DEFAULT_RETRY: Required<RetryConfig> = {\n maxAttempts: 3,\n initialDelayMs: 100,\n maxDelayMs: 1600,\n};\n\nexport type FetchClient = Client<paths, `${string}/${string}`>;\n\nexport function makeClient(opts: ClientOptions): { client: FetchClient; retry: Required<RetryConfig> } {\n const init: Parameters<typeof createClient<paths>>[0] = {\n baseUrl: resolveBaseUrl(opts),\n headers: { Authorization: `Bearer ${opts.apiKey}` },\n };\n if (opts.fetch) init.fetch = opts.fetch;\n const client = createClient<paths>(init);\n const retry: Required<RetryConfig> = { ...DEFAULT_RETRY, ...opts.retry };\n return { client, retry };\n}\n\nexport function makeUnauthenticatedClient(opts: UnauthenticatedOptions = {}): FetchClient {\n const init: Parameters<typeof createClient<paths>>[0] = {\n baseUrl: resolveBaseUrl(opts),\n };\n if (opts.fetch) init.fetch = opts.fetch;\n return createClient<paths>(init);\n}\n\nexport type FetchCall<T> = () => Promise<{\n data?: T;\n error?: unknown;\n response: Response;\n}>;\n\nexport async function runWithRetry<T>(\n call: FetchCall<T>,\n retry: Required<RetryConfig>,\n): Promise<T> {\n let lastError: unknown;\n for (let attempt = 1; attempt <= retry.maxAttempts; attempt++) {\n try {\n const { data, error, response } = await call();\n if (response.ok) {\n return data as T;\n }\n const err = await errorFromResponse(response, error);\n if (err.status >= 500 && attempt < retry.maxAttempts) {\n lastError = err;\n await sleep(backoff(attempt, retry));\n continue;\n }\n throw err;\n } catch (e) {\n if (e instanceof OutlayerError) throw e;\n lastError = e;\n if (attempt < retry.maxAttempts && isNetworkError(e)) {\n await sleep(backoff(attempt, retry));\n continue;\n }\n throw new OutlayerError({\n code: 'network_error',\n message: e instanceof Error ? e.message : String(e),\n status: 0,\n });\n }\n }\n throw lastError;\n}\n\nfunction backoff(attempt: number, cfg: Required<RetryConfig>): number {\n return Math.min(cfg.maxDelayMs, cfg.initialDelayMs * 2 ** (attempt - 1));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction isNetworkError(e: unknown): boolean {\n return e instanceof TypeError;\n}\n\nexport function newIdempotencyKey(): string {\n return crypto.randomUUID();\n}\n","import type { components } from './types.js';\nimport {\n type ClientOptions,\n type FetchClient,\n type RetryConfig,\n type UnauthenticatedOptions,\n DEFAULT_RETRY,\n makeClient,\n makeUnauthenticatedClient,\n newIdempotencyKey,\n runWithRetry,\n} from './http.js';\nimport { errorFromResponse } from './errors.js';\n\ntype Schemas = components['schemas'];\n\n// ---------------------------------------------------------------------------\n// Re-exported user-facing types (so consumers don't import paths/components)\n// ---------------------------------------------------------------------------\n\nexport type Chain = Schemas['Chain'];\nexport type RequestType = Schemas['RequestType'];\nexport type RequestStatus = Schemas['RequestStatus'];\n\nexport type RegisterRequest = Schemas['RegisterRequest'];\nexport type RegisterResponse = Schemas['RegisterResponse'];\nexport type AddressResponse = Schemas['AddressResponse'];\nexport type BalanceResponse = Schemas['BalanceResponse'];\nexport type TokensResponse = Schemas['TokensResponse'];\n\nexport type CallRequest = Schemas['CallRequest'];\nexport type CallResponse = Schemas['CallResponse'];\nexport type TransferRequest = Schemas['TransferRequest'];\nexport type IntentsDepositRequest = Schemas['IntentsDepositRequest'];\nexport type IntentsDepositResponse = Schemas['IntentsDepositResponse'];\n\nexport type WithdrawRequest = Schemas['WithdrawRequest'];\nexport type WithdrawResponse = Schemas['WithdrawResponse'];\nexport type DryRunResponse = Schemas['DryRunResponse'];\n\nexport type SwapRequest = Schemas['SwapRequest'];\nexport type SwapResponse = Schemas['SwapResponse'];\nexport type SwapQuoteResponse = Schemas['SwapQuoteResponse'];\n\nexport type SignMessageRequest = Schemas['SignMessageRequest'];\nexport type SignMessageResponse = Schemas['SignMessageResponse'];\n\nexport type DepositIntentRequest = Schemas['DepositIntentRequest'];\nexport type DepositIntentResponse = Schemas['DepositIntentResponse'];\nexport type DepositStatusResponse = Schemas['DepositStatusResponse'];\n\nexport type RequestStatusResponse = Schemas['RequestStatusResponse'];\nexport type RequestListResponse = Schemas['RequestListResponse'];\n\nexport type PolicyResponse = Schemas['PolicyResponse'];\nexport type PolicyRules = Schemas['PolicyRules'];\nexport type ApprovalConfig = Schemas['ApprovalConfig'];\nexport type EncryptPolicyRequest = Schemas['EncryptPolicyRequest'];\nexport type EncryptPolicyResponse = Schemas['EncryptPolicyResponse'];\nexport type SignPolicyResponse = Schemas['SignPolicyResponse'];\n\nexport type PendingApproval = Schemas['PendingApproval'];\nexport type PendingApprovalsResponse = Schemas['PendingApprovalsResponse'];\nexport type Nep413Auth = Schemas['Nep413Auth'];\nexport type ApproveResponse = Schemas['ApproveResponse'];\n\nexport type AuditEvent = Schemas['AuditEvent'];\nexport type AuditResponse = Schemas['AuditResponse'];\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\ntype Idempotent = { idempotencyKey?: string };\n\nfunction idempotencyHeader(key: string | undefined): Record<string, string> {\n return { 'Idempotency-Key': key ?? newIdempotencyKey() };\n}\n\n// ---------------------------------------------------------------------------\n// Sub-namespaces\n// ---------------------------------------------------------------------------\n\nexport class PolicyAPI {\n constructor(\n private readonly client: FetchClient,\n private readonly retry: Required<RetryConfig>,\n ) {}\n\n get(): Promise<PolicyResponse> {\n return runWithRetry(() => this.client.GET('/wallet/v1/policy'), this.retry);\n }\n\n encrypt(body: EncryptPolicyRequest): Promise<EncryptPolicyResponse> {\n return runWithRetry(() => this.client.POST('/wallet/v1/encrypt-policy', { body }), this.retry);\n }\n\n sign(encryptedData: string): Promise<SignPolicyResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/sign-policy', { body: { encrypted_data: encryptedData } }),\n this.retry,\n );\n }\n\n invalidateCache(walletId: string): Promise<void> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/invalidate-cache', { body: { wallet_id: walletId } }),\n this.retry,\n ).then(() => undefined);\n }\n}\n\nexport class ApprovalsAPI {\n constructor(\n private readonly client: FetchClient,\n private readonly retry: Required<RetryConfig>,\n ) {}\n\n listPending(): Promise<PendingApprovalsResponse> {\n return runWithRetry(() => this.client.GET('/wallet/v1/pending_approvals'), this.retry);\n }\n\n approve(approvalId: string, auth: Nep413Auth): Promise<ApproveResponse> {\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/approve/{id}', {\n params: { path: { id: approvalId } },\n body: auth,\n }),\n this.retry,\n );\n }\n\n reject(approvalId: string, auth: Nep413Auth, reason?: string): Promise<ApproveResponse> {\n const body = reason !== undefined ? { ...auth, reason } : auth;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/reject/{id}', {\n params: { path: { id: approvalId } },\n body,\n }),\n this.retry,\n );\n }\n}\n\nexport class AuditAPI {\n constructor(\n private readonly client: FetchClient,\n private readonly retry: Required<RetryConfig>,\n ) {}\n\n list(opts: { limit?: number; offset?: number } = {}): Promise<AuditResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/audit', { params: { query: opts } }),\n this.retry,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main client\n// ---------------------------------------------------------------------------\n\nexport class OutlayerClient {\n private readonly client: FetchClient;\n private readonly retry: Required<RetryConfig>;\n\n readonly policy: PolicyAPI;\n readonly approvals: ApprovalsAPI;\n readonly audit: AuditAPI;\n\n constructor(opts: ClientOptions) {\n const { client, retry } = makeClient(opts);\n this.client = client;\n this.retry = retry;\n this.policy = new PolicyAPI(client, retry);\n this.approvals = new ApprovalsAPI(client, retry);\n this.audit = new AuditAPI(client, retry);\n }\n\n // ------- Static factory: register a new wallet (no auth) -------\n\n /**\n * Register a new wallet and obtain an API key.\n *\n * - Empty call: anonymous wallet on OutLayer's shared master. Convenient, no setup.\n * - With `vaultId`: bind to a deployed customer vault so keys derive through\n * the per-vault master. Vault binding is permanent.\n * - With `body`: full control — pass any `RegisterRequest` field (e.g., NEP-413\n * account-binding fields). `vaultId` is merged into `body.vault_id` if not\n * already set.\n *\n * Vault deployment is NOT done here — use the dashboard\n * (https://outlayer.fastnear.com/vault) or `outlayer vault init` CLI.\n * See docs/vaults.md for the full flow.\n */\n static async register(\n opts: {\n vaultId?: string;\n body?: RegisterRequest;\n } & UnauthenticatedOptions = {},\n ): Promise<RegisterResponse> {\n const client = makeUnauthenticatedClient(opts);\n const body: RegisterRequest = { ...(opts.body ?? {}) };\n if (opts.vaultId !== undefined && body.vault_id === undefined) {\n body.vault_id = opts.vaultId;\n }\n const { data, error, response } = await client.POST('/register', { body });\n if (!response.ok) throw await errorFromResponse(response, error);\n return data as RegisterResponse;\n }\n\n // ------- Wallet read -------\n\n getAddress(chain: Chain): Promise<AddressResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/address', { params: { query: { chain } } }),\n this.retry,\n );\n }\n\n getBalance(\n opts: { chain?: Chain; token?: string; source?: 'chain' | 'intents' } = {},\n ): Promise<BalanceResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/balance', { params: { query: opts } }),\n this.retry,\n );\n }\n\n listTokens(): Promise<TokensResponse> {\n return runWithRetry(() => this.client.GET('/wallet/v1/tokens'), this.retry);\n }\n\n // ------- Wallet write -------\n\n call(opts: CallRequest & Idempotent): Promise<CallResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/call', {\n body: body as CallRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n transfer(opts: TransferRequest & Idempotent): Promise<CallResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/transfer', {\n body: body as TransferRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n intentsDeposit(opts: IntentsDepositRequest & Idempotent): Promise<IntentsDepositResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/intents/deposit', {\n body: body as IntentsDepositRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n withdraw(opts: WithdrawRequest & Idempotent): Promise<WithdrawResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/intents/withdraw', {\n body: body as WithdrawRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n withdrawDryRun(opts: WithdrawRequest): Promise<DryRunResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/intents/withdraw/dry-run', { body: opts }),\n this.retry,\n );\n }\n\n swap(opts: SwapRequest & Idempotent): Promise<SwapResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/intents/swap', {\n body: body as SwapRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n swapQuote(opts: SwapRequest): Promise<SwapQuoteResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/intents/swap/quote', { body: opts }),\n this.retry,\n );\n }\n\n signMessage(opts: SignMessageRequest): Promise<SignMessageResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/sign-message', { body: opts }),\n this.retry,\n );\n }\n\n // ------- Cross-chain deposit (1Click) -------\n\n /**\n * Create a one-time deposit address on a source chain. Send funds there,\n * then poll {@link getDepositStatus} until `success`.\n */\n createDepositIntent(opts: DepositIntentRequest): Promise<DepositIntentResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/deposit-intent', { body: opts }),\n this.retry,\n );\n }\n\n getDepositStatus(intentId: string): Promise<DepositStatusResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/deposit-status', { params: { query: { id: intentId } } }),\n this.retry,\n );\n }\n\n // ------- Async request tracking -------\n\n getRequest(id: string): Promise<RequestStatusResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/requests/{id}', { params: { path: { id } } }),\n this.retry,\n );\n }\n\n listRequests(\n opts: { type?: RequestType; status?: RequestStatus; limit?: number; offset?: number } = {},\n ): Promise<RequestListResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/requests', { params: { query: opts } }),\n this.retry,\n );\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -261,6 +261,49 @@ interface paths {
261
261
  patch?: never;
262
262
  trace?: never;
263
263
  };
264
+ "/wallet/v1/deposit-intent": {
265
+ parameters: {
266
+ query?: never;
267
+ header?: never;
268
+ path?: never;
269
+ cookie?: never;
270
+ };
271
+ get?: never;
272
+ put?: never;
273
+ /**
274
+ * Create a cross-chain deposit intent (1Click)
275
+ * @description Requests a one-time deposit address on a source chain via NEAR Intents
276
+ * 1Click. The caller sends `amount` of `token` to the returned
277
+ * `deposit_address` on `chain`; the solver bridges it and credits the
278
+ * wallet's intents.near balance. Poll `getDepositStatus` until `success`.
279
+ *
280
+ * Amounts are in the token's smallest unit. There's a small bridge fee,
281
+ * so `amount_out` < `amount`.
282
+ */
283
+ post: operations["createDepositIntent"];
284
+ delete?: never;
285
+ options?: never;
286
+ head?: never;
287
+ patch?: never;
288
+ trace?: never;
289
+ };
290
+ "/wallet/v1/deposit-status": {
291
+ parameters: {
292
+ query?: never;
293
+ header?: never;
294
+ path?: never;
295
+ cookie?: never;
296
+ };
297
+ /** Poll a cross-chain deposit intent's status */
298
+ get: operations["getDepositStatus"];
299
+ put?: never;
300
+ post?: never;
301
+ delete?: never;
302
+ options?: never;
303
+ head?: never;
304
+ patch?: never;
305
+ trace?: never;
306
+ };
264
307
  "/wallet/v1/sign-message": {
265
308
  parameters: {
266
309
  query?: never;
@@ -677,6 +720,37 @@ interface components {
677
720
  deadline?: string;
678
721
  time_estimate_seconds?: number;
679
722
  };
723
+ DepositIntentRequest: {
724
+ /**
725
+ * @description Source chain to bridge from. Common values: `ethereum`, `solana`,
726
+ * `base`, `arbitrum`, `polygon`, `optimism`, `avalanche`.
727
+ */
728
+ chain: string;
729
+ /** @description Amount in the token's smallest unit (e.g. `5000000` = 5 USDC). */
730
+ amount: string;
731
+ /** @description Token symbol to deposit, e.g. `USDC`. */
732
+ token: string;
733
+ };
734
+ DepositIntentResponse: {
735
+ intent_id: string;
736
+ /** @description One-time address on the source chain — send funds here. */
737
+ deposit_address: string;
738
+ amount: string;
739
+ /** @description Amount credited after the bridge fee. */
740
+ amount_out: string;
741
+ min_amount_out: string;
742
+ /** Format: date-time */
743
+ expires_at: string;
744
+ estimated_time_secs: number;
745
+ };
746
+ DepositStatusResponse: {
747
+ intent_id: string;
748
+ /** @enum {string} */
749
+ status: "pending" | "bridging" | "success" | "failed" | "expired";
750
+ result?: {
751
+ [key: string]: unknown;
752
+ } | null;
753
+ };
680
754
  SignMessageRequest: {
681
755
  message: string;
682
756
  recipient: string;
@@ -1323,6 +1397,66 @@ interface operations {
1323
1397
  500: components["responses"]["InternalError"];
1324
1398
  };
1325
1399
  };
1400
+ createDepositIntent: {
1401
+ parameters: {
1402
+ query?: never;
1403
+ header?: never;
1404
+ path?: never;
1405
+ cookie?: never;
1406
+ };
1407
+ requestBody: {
1408
+ content: {
1409
+ /**
1410
+ * @example {
1411
+ * "chain": "ethereum",
1412
+ * "amount": "5000000",
1413
+ * "token": "USDC"
1414
+ * }
1415
+ */
1416
+ "application/json": components["schemas"]["DepositIntentRequest"];
1417
+ };
1418
+ };
1419
+ responses: {
1420
+ /** @description Deposit intent created */
1421
+ 200: {
1422
+ headers: {
1423
+ [name: string]: unknown;
1424
+ };
1425
+ content: {
1426
+ "application/json": components["schemas"]["DepositIntentResponse"];
1427
+ };
1428
+ };
1429
+ 400: components["responses"]["BadRequest"];
1430
+ 401: components["responses"]["Unauthorized"];
1431
+ 500: components["responses"]["InternalError"];
1432
+ };
1433
+ };
1434
+ getDepositStatus: {
1435
+ parameters: {
1436
+ query: {
1437
+ /** @description The `intent_id` from `createDepositIntent`. */
1438
+ id: string;
1439
+ };
1440
+ header?: never;
1441
+ path?: never;
1442
+ cookie?: never;
1443
+ };
1444
+ requestBody?: never;
1445
+ responses: {
1446
+ /** @description Deposit status */
1447
+ 200: {
1448
+ headers: {
1449
+ [name: string]: unknown;
1450
+ };
1451
+ content: {
1452
+ "application/json": components["schemas"]["DepositStatusResponse"];
1453
+ };
1454
+ };
1455
+ 401: components["responses"]["Unauthorized"];
1456
+ 404: components["responses"]["NotFound"];
1457
+ 500: components["responses"]["InternalError"];
1458
+ };
1459
+ };
1326
1460
  signMessage: {
1327
1461
  parameters: {
1328
1462
  query?: never;
@@ -1621,6 +1755,8 @@ interface operations {
1621
1755
  };
1622
1756
  }
1623
1757
 
1758
+ type Network = 'mainnet' | 'testnet';
1759
+ declare const NETWORK_BASE_URLS: Record<Network, string>;
1624
1760
  type RetryConfig = {
1625
1761
  maxAttempts?: number;
1626
1762
  initialDelayMs?: number;
@@ -1628,11 +1764,19 @@ type RetryConfig = {
1628
1764
  };
1629
1765
  type ClientOptions = {
1630
1766
  apiKey: string;
1767
+ /**
1768
+ * NEAR network to target. Defaults to `mainnet`. NEAR Intents (cross-chain
1769
+ * swaps + gasless withdrawals) only work on mainnet — use testnet for the
1770
+ * register / policy / sign-message flow while developing.
1771
+ */
1772
+ network?: Network;
1773
+ /** Overrides `network` for self-hosted or staging deployments. */
1631
1774
  baseUrl?: string;
1632
1775
  fetch?: typeof fetch;
1633
1776
  retry?: RetryConfig;
1634
1777
  };
1635
1778
  type UnauthenticatedOptions = {
1779
+ network?: Network;
1636
1780
  baseUrl?: string;
1637
1781
  fetch?: typeof fetch;
1638
1782
  };
@@ -1660,6 +1804,9 @@ type SwapResponse = Schemas['SwapResponse'];
1660
1804
  type SwapQuoteResponse = Schemas['SwapQuoteResponse'];
1661
1805
  type SignMessageRequest = Schemas['SignMessageRequest'];
1662
1806
  type SignMessageResponse = Schemas['SignMessageResponse'];
1807
+ type DepositIntentRequest = Schemas['DepositIntentRequest'];
1808
+ type DepositIntentResponse = Schemas['DepositIntentResponse'];
1809
+ type DepositStatusResponse = Schemas['DepositStatusResponse'];
1663
1810
  type RequestStatusResponse = Schemas['RequestStatusResponse'];
1664
1811
  type RequestListResponse = Schemas['RequestListResponse'];
1665
1812
  type PolicyResponse = Schemas['PolicyResponse'];
@@ -1743,6 +1890,12 @@ declare class OutlayerClient {
1743
1890
  swap(opts: SwapRequest & Idempotent): Promise<SwapResponse>;
1744
1891
  swapQuote(opts: SwapRequest): Promise<SwapQuoteResponse>;
1745
1892
  signMessage(opts: SignMessageRequest): Promise<SignMessageResponse>;
1893
+ /**
1894
+ * Create a one-time deposit address on a source chain. Send funds there,
1895
+ * then poll {@link getDepositStatus} until `success`.
1896
+ */
1897
+ createDepositIntent(opts: DepositIntentRequest): Promise<DepositIntentResponse>;
1898
+ getDepositStatus(intentId: string): Promise<DepositStatusResponse>;
1746
1899
  getRequest(id: string): Promise<RequestStatusResponse>;
1747
1900
  listRequests(opts?: {
1748
1901
  type?: RequestType;
@@ -1785,4 +1938,4 @@ declare class BadRequestError extends OutlayerError {
1785
1938
  constructor(opts: OutlayerErrorOptions);
1786
1939
  }
1787
1940
 
1788
- export { type AddressResponse, type ApiErrorCode, type ApprovalConfig, ApprovalsAPI, type ApproveResponse, AuditAPI, type AuditEvent, type AuditResponse, BadRequestError, type BalanceResponse, type CallRequest, type CallResponse, type Chain, type ClientOptions, type DryRunResponse, type EncryptPolicyRequest, type EncryptPolicyResponse, type ErrorCode, type IntentsDepositRequest, type IntentsDepositResponse, type Nep413Auth, NotFoundError, OutlayerClient, OutlayerError, type PendingApproval, type PendingApprovalsResponse, PolicyAPI, PolicyDeniedError, type PolicyResponse, type PolicyRules, RateLimitedError, type RegisterRequest, type RegisterResponse, type RequestListResponse, type RequestStatus, type RequestStatusResponse, type RequestType, type RetryConfig, type SignMessageRequest, type SignMessageResponse, type SignPolicyResponse, type SwapQuoteResponse, type SwapRequest, type SwapResponse, type TokensResponse, type TransferRequest, type UnauthenticatedOptions, UnauthorizedError, WalletFrozenError, type WithdrawRequest, type WithdrawResponse };
1941
+ export { type AddressResponse, type ApiErrorCode, type ApprovalConfig, ApprovalsAPI, type ApproveResponse, AuditAPI, type AuditEvent, type AuditResponse, BadRequestError, type BalanceResponse, type CallRequest, type CallResponse, type Chain, type ClientOptions, type DepositIntentRequest, type DepositIntentResponse, type DepositStatusResponse, type DryRunResponse, type EncryptPolicyRequest, type EncryptPolicyResponse, type ErrorCode, type IntentsDepositRequest, type IntentsDepositResponse, NETWORK_BASE_URLS, type Nep413Auth, type Network, NotFoundError, OutlayerClient, OutlayerError, type PendingApproval, type PendingApprovalsResponse, PolicyAPI, PolicyDeniedError, type PolicyResponse, type PolicyRules, RateLimitedError, type RegisterRequest, type RegisterResponse, type RequestListResponse, type RequestStatus, type RequestStatusResponse, type RequestType, type RetryConfig, type SignMessageRequest, type SignMessageResponse, type SignPolicyResponse, type SwapQuoteResponse, type SwapRequest, type SwapResponse, type TokensResponse, type TransferRequest, type UnauthenticatedOptions, UnauthorizedError, WalletFrozenError, type WithdrawRequest, type WithdrawResponse };
package/dist/index.d.ts CHANGED
@@ -261,6 +261,49 @@ interface paths {
261
261
  patch?: never;
262
262
  trace?: never;
263
263
  };
264
+ "/wallet/v1/deposit-intent": {
265
+ parameters: {
266
+ query?: never;
267
+ header?: never;
268
+ path?: never;
269
+ cookie?: never;
270
+ };
271
+ get?: never;
272
+ put?: never;
273
+ /**
274
+ * Create a cross-chain deposit intent (1Click)
275
+ * @description Requests a one-time deposit address on a source chain via NEAR Intents
276
+ * 1Click. The caller sends `amount` of `token` to the returned
277
+ * `deposit_address` on `chain`; the solver bridges it and credits the
278
+ * wallet's intents.near balance. Poll `getDepositStatus` until `success`.
279
+ *
280
+ * Amounts are in the token's smallest unit. There's a small bridge fee,
281
+ * so `amount_out` < `amount`.
282
+ */
283
+ post: operations["createDepositIntent"];
284
+ delete?: never;
285
+ options?: never;
286
+ head?: never;
287
+ patch?: never;
288
+ trace?: never;
289
+ };
290
+ "/wallet/v1/deposit-status": {
291
+ parameters: {
292
+ query?: never;
293
+ header?: never;
294
+ path?: never;
295
+ cookie?: never;
296
+ };
297
+ /** Poll a cross-chain deposit intent's status */
298
+ get: operations["getDepositStatus"];
299
+ put?: never;
300
+ post?: never;
301
+ delete?: never;
302
+ options?: never;
303
+ head?: never;
304
+ patch?: never;
305
+ trace?: never;
306
+ };
264
307
  "/wallet/v1/sign-message": {
265
308
  parameters: {
266
309
  query?: never;
@@ -677,6 +720,37 @@ interface components {
677
720
  deadline?: string;
678
721
  time_estimate_seconds?: number;
679
722
  };
723
+ DepositIntentRequest: {
724
+ /**
725
+ * @description Source chain to bridge from. Common values: `ethereum`, `solana`,
726
+ * `base`, `arbitrum`, `polygon`, `optimism`, `avalanche`.
727
+ */
728
+ chain: string;
729
+ /** @description Amount in the token's smallest unit (e.g. `5000000` = 5 USDC). */
730
+ amount: string;
731
+ /** @description Token symbol to deposit, e.g. `USDC`. */
732
+ token: string;
733
+ };
734
+ DepositIntentResponse: {
735
+ intent_id: string;
736
+ /** @description One-time address on the source chain — send funds here. */
737
+ deposit_address: string;
738
+ amount: string;
739
+ /** @description Amount credited after the bridge fee. */
740
+ amount_out: string;
741
+ min_amount_out: string;
742
+ /** Format: date-time */
743
+ expires_at: string;
744
+ estimated_time_secs: number;
745
+ };
746
+ DepositStatusResponse: {
747
+ intent_id: string;
748
+ /** @enum {string} */
749
+ status: "pending" | "bridging" | "success" | "failed" | "expired";
750
+ result?: {
751
+ [key: string]: unknown;
752
+ } | null;
753
+ };
680
754
  SignMessageRequest: {
681
755
  message: string;
682
756
  recipient: string;
@@ -1323,6 +1397,66 @@ interface operations {
1323
1397
  500: components["responses"]["InternalError"];
1324
1398
  };
1325
1399
  };
1400
+ createDepositIntent: {
1401
+ parameters: {
1402
+ query?: never;
1403
+ header?: never;
1404
+ path?: never;
1405
+ cookie?: never;
1406
+ };
1407
+ requestBody: {
1408
+ content: {
1409
+ /**
1410
+ * @example {
1411
+ * "chain": "ethereum",
1412
+ * "amount": "5000000",
1413
+ * "token": "USDC"
1414
+ * }
1415
+ */
1416
+ "application/json": components["schemas"]["DepositIntentRequest"];
1417
+ };
1418
+ };
1419
+ responses: {
1420
+ /** @description Deposit intent created */
1421
+ 200: {
1422
+ headers: {
1423
+ [name: string]: unknown;
1424
+ };
1425
+ content: {
1426
+ "application/json": components["schemas"]["DepositIntentResponse"];
1427
+ };
1428
+ };
1429
+ 400: components["responses"]["BadRequest"];
1430
+ 401: components["responses"]["Unauthorized"];
1431
+ 500: components["responses"]["InternalError"];
1432
+ };
1433
+ };
1434
+ getDepositStatus: {
1435
+ parameters: {
1436
+ query: {
1437
+ /** @description The `intent_id` from `createDepositIntent`. */
1438
+ id: string;
1439
+ };
1440
+ header?: never;
1441
+ path?: never;
1442
+ cookie?: never;
1443
+ };
1444
+ requestBody?: never;
1445
+ responses: {
1446
+ /** @description Deposit status */
1447
+ 200: {
1448
+ headers: {
1449
+ [name: string]: unknown;
1450
+ };
1451
+ content: {
1452
+ "application/json": components["schemas"]["DepositStatusResponse"];
1453
+ };
1454
+ };
1455
+ 401: components["responses"]["Unauthorized"];
1456
+ 404: components["responses"]["NotFound"];
1457
+ 500: components["responses"]["InternalError"];
1458
+ };
1459
+ };
1326
1460
  signMessage: {
1327
1461
  parameters: {
1328
1462
  query?: never;
@@ -1621,6 +1755,8 @@ interface operations {
1621
1755
  };
1622
1756
  }
1623
1757
 
1758
+ type Network = 'mainnet' | 'testnet';
1759
+ declare const NETWORK_BASE_URLS: Record<Network, string>;
1624
1760
  type RetryConfig = {
1625
1761
  maxAttempts?: number;
1626
1762
  initialDelayMs?: number;
@@ -1628,11 +1764,19 @@ type RetryConfig = {
1628
1764
  };
1629
1765
  type ClientOptions = {
1630
1766
  apiKey: string;
1767
+ /**
1768
+ * NEAR network to target. Defaults to `mainnet`. NEAR Intents (cross-chain
1769
+ * swaps + gasless withdrawals) only work on mainnet — use testnet for the
1770
+ * register / policy / sign-message flow while developing.
1771
+ */
1772
+ network?: Network;
1773
+ /** Overrides `network` for self-hosted or staging deployments. */
1631
1774
  baseUrl?: string;
1632
1775
  fetch?: typeof fetch;
1633
1776
  retry?: RetryConfig;
1634
1777
  };
1635
1778
  type UnauthenticatedOptions = {
1779
+ network?: Network;
1636
1780
  baseUrl?: string;
1637
1781
  fetch?: typeof fetch;
1638
1782
  };
@@ -1660,6 +1804,9 @@ type SwapResponse = Schemas['SwapResponse'];
1660
1804
  type SwapQuoteResponse = Schemas['SwapQuoteResponse'];
1661
1805
  type SignMessageRequest = Schemas['SignMessageRequest'];
1662
1806
  type SignMessageResponse = Schemas['SignMessageResponse'];
1807
+ type DepositIntentRequest = Schemas['DepositIntentRequest'];
1808
+ type DepositIntentResponse = Schemas['DepositIntentResponse'];
1809
+ type DepositStatusResponse = Schemas['DepositStatusResponse'];
1663
1810
  type RequestStatusResponse = Schemas['RequestStatusResponse'];
1664
1811
  type RequestListResponse = Schemas['RequestListResponse'];
1665
1812
  type PolicyResponse = Schemas['PolicyResponse'];
@@ -1743,6 +1890,12 @@ declare class OutlayerClient {
1743
1890
  swap(opts: SwapRequest & Idempotent): Promise<SwapResponse>;
1744
1891
  swapQuote(opts: SwapRequest): Promise<SwapQuoteResponse>;
1745
1892
  signMessage(opts: SignMessageRequest): Promise<SignMessageResponse>;
1893
+ /**
1894
+ * Create a one-time deposit address on a source chain. Send funds there,
1895
+ * then poll {@link getDepositStatus} until `success`.
1896
+ */
1897
+ createDepositIntent(opts: DepositIntentRequest): Promise<DepositIntentResponse>;
1898
+ getDepositStatus(intentId: string): Promise<DepositStatusResponse>;
1746
1899
  getRequest(id: string): Promise<RequestStatusResponse>;
1747
1900
  listRequests(opts?: {
1748
1901
  type?: RequestType;
@@ -1785,4 +1938,4 @@ declare class BadRequestError extends OutlayerError {
1785
1938
  constructor(opts: OutlayerErrorOptions);
1786
1939
  }
1787
1940
 
1788
- export { type AddressResponse, type ApiErrorCode, type ApprovalConfig, ApprovalsAPI, type ApproveResponse, AuditAPI, type AuditEvent, type AuditResponse, BadRequestError, type BalanceResponse, type CallRequest, type CallResponse, type Chain, type ClientOptions, type DryRunResponse, type EncryptPolicyRequest, type EncryptPolicyResponse, type ErrorCode, type IntentsDepositRequest, type IntentsDepositResponse, type Nep413Auth, NotFoundError, OutlayerClient, OutlayerError, type PendingApproval, type PendingApprovalsResponse, PolicyAPI, PolicyDeniedError, type PolicyResponse, type PolicyRules, RateLimitedError, type RegisterRequest, type RegisterResponse, type RequestListResponse, type RequestStatus, type RequestStatusResponse, type RequestType, type RetryConfig, type SignMessageRequest, type SignMessageResponse, type SignPolicyResponse, type SwapQuoteResponse, type SwapRequest, type SwapResponse, type TokensResponse, type TransferRequest, type UnauthenticatedOptions, UnauthorizedError, WalletFrozenError, type WithdrawRequest, type WithdrawResponse };
1941
+ export { type AddressResponse, type ApiErrorCode, type ApprovalConfig, ApprovalsAPI, type ApproveResponse, AuditAPI, type AuditEvent, type AuditResponse, BadRequestError, type BalanceResponse, type CallRequest, type CallResponse, type Chain, type ClientOptions, type DepositIntentRequest, type DepositIntentResponse, type DepositStatusResponse, type DryRunResponse, type EncryptPolicyRequest, type EncryptPolicyResponse, type ErrorCode, type IntentsDepositRequest, type IntentsDepositResponse, NETWORK_BASE_URLS, type Nep413Auth, type Network, NotFoundError, OutlayerClient, OutlayerError, type PendingApproval, type PendingApprovalsResponse, PolicyAPI, PolicyDeniedError, type PolicyResponse, type PolicyRules, RateLimitedError, type RegisterRequest, type RegisterResponse, type RequestListResponse, type RequestStatus, type RequestStatusResponse, type RequestType, type RetryConfig, type SignMessageRequest, type SignMessageResponse, type SignPolicyResponse, type SwapQuoteResponse, type SwapRequest, type SwapResponse, type TokensResponse, type TransferRequest, type UnauthenticatedOptions, UnauthorizedError, WalletFrozenError, type WithdrawRequest, type WithdrawResponse };
package/dist/index.js CHANGED
@@ -88,7 +88,16 @@ async function errorFromResponse(response, parsed) {
88
88
  }
89
89
 
90
90
  // src/http.ts
91
- var DEFAULT_BASE_URL = "https://api.outlayer.fastnear.com";
91
+ var NETWORK_BASE_URLS = {
92
+ mainnet: "https://api.outlayer.fastnear.com",
93
+ testnet: "https://api.testnet.outlayer.fastnear.com"
94
+ };
95
+ var DEFAULT_BASE_URL = NETWORK_BASE_URLS.mainnet;
96
+ function resolveBaseUrl(opts) {
97
+ if (opts.baseUrl) return opts.baseUrl;
98
+ if (opts.network) return NETWORK_BASE_URLS[opts.network];
99
+ return DEFAULT_BASE_URL;
100
+ }
92
101
  var DEFAULT_RETRY = {
93
102
  maxAttempts: 3,
94
103
  initialDelayMs: 100,
@@ -96,7 +105,7 @@ var DEFAULT_RETRY = {
96
105
  };
97
106
  function makeClient(opts) {
98
107
  const init = {
99
- baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,
108
+ baseUrl: resolveBaseUrl(opts),
100
109
  headers: { Authorization: `Bearer ${opts.apiKey}` }
101
110
  };
102
111
  if (opts.fetch) init.fetch = opts.fetch;
@@ -106,7 +115,7 @@ function makeClient(opts) {
106
115
  }
107
116
  function makeUnauthenticatedClient(opts = {}) {
108
117
  const init = {
109
- baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL
118
+ baseUrl: resolveBaseUrl(opts)
110
119
  };
111
120
  if (opts.fetch) init.fetch = opts.fetch;
112
121
  return createClient(init);
@@ -353,6 +362,23 @@ var OutlayerClient = class {
353
362
  this.retry
354
363
  );
355
364
  }
365
+ // ------- Cross-chain deposit (1Click) -------
366
+ /**
367
+ * Create a one-time deposit address on a source chain. Send funds there,
368
+ * then poll {@link getDepositStatus} until `success`.
369
+ */
370
+ createDepositIntent(opts) {
371
+ return runWithRetry(
372
+ () => this.client.POST("/wallet/v1/deposit-intent", { body: opts }),
373
+ this.retry
374
+ );
375
+ }
376
+ getDepositStatus(intentId) {
377
+ return runWithRetry(
378
+ () => this.client.GET("/wallet/v1/deposit-status", { params: { query: { id: intentId } } }),
379
+ this.retry
380
+ );
381
+ }
356
382
  // ------- Async request tracking -------
357
383
  getRequest(id) {
358
384
  return runWithRetry(
@@ -368,6 +394,6 @@ var OutlayerClient = class {
368
394
  }
369
395
  };
370
396
 
371
- export { ApprovalsAPI, AuditAPI, BadRequestError, NotFoundError, OutlayerClient, OutlayerError, PolicyAPI, PolicyDeniedError, RateLimitedError, UnauthorizedError, WalletFrozenError };
397
+ export { ApprovalsAPI, AuditAPI, BadRequestError, NETWORK_BASE_URLS, NotFoundError, OutlayerClient, OutlayerError, PolicyAPI, PolicyDeniedError, RateLimitedError, UnauthorizedError, WalletFrozenError };
372
398
  //# sourceMappingURL=index.js.map
373
399
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { components } from './types.js';\n\nexport type ApiErrorCode = components['schemas']['ErrorCode'];\nexport type ErrorCode = ApiErrorCode | 'network_error' | 'parse_error';\n\nexport type ErrorBody = {\n error?: ApiErrorCode;\n message?: string;\n details?: unknown;\n};\n\nexport interface OutlayerErrorOptions {\n code: ErrorCode;\n message: string;\n status: number;\n details?: unknown;\n}\n\nexport class OutlayerError extends Error {\n readonly code: ErrorCode;\n readonly status: number;\n readonly details: unknown;\n\n constructor(opts: OutlayerErrorOptions) {\n super(opts.message);\n this.name = 'OutlayerError';\n this.code = opts.code;\n this.status = opts.status;\n this.details = opts.details;\n }\n}\n\nexport class PolicyDeniedError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'PolicyDeniedError';\n }\n}\n\nexport class WalletFrozenError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'WalletFrozenError';\n }\n}\n\nexport class UnauthorizedError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'UnauthorizedError';\n }\n}\n\nexport class RateLimitedError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'RateLimitedError';\n }\n}\n\nexport class NotFoundError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'NotFoundError';\n }\n}\n\nexport class BadRequestError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'BadRequestError';\n }\n}\n\nconst codeToCtor: Partial<Record<ErrorCode, new (opts: OutlayerErrorOptions) => OutlayerError>> = {\n policy_denied: PolicyDeniedError,\n wallet_frozen: WalletFrozenError,\n missing_auth: UnauthorizedError,\n invalid_api_key: UnauthorizedError,\n timestamp_expired: UnauthorizedError,\n rate_limited: RateLimitedError,\n request_not_found: NotFoundError,\n approval_not_found: NotFoundError,\n bad_request: BadRequestError,\n invalid_address: BadRequestError,\n insufficient_balance: BadRequestError,\n unsupported_chain: BadRequestError,\n unsupported_token: BadRequestError,\n};\n\nexport function makeError(body: ErrorBody, status: number): OutlayerError {\n const code: ErrorCode = body.error ?? 'parse_error';\n const message = body.message ?? `HTTP ${status}`;\n const opts: OutlayerErrorOptions = body.details !== undefined\n ? { code, message, status, details: body.details }\n : { code, message, status };\n const Ctor = codeToCtor[code] ?? OutlayerError;\n return new Ctor(opts);\n}\n\nexport async function errorFromResponse(response: Response, parsed?: unknown): Promise<OutlayerError> {\n let body: ErrorBody;\n if (parsed && typeof parsed === 'object') {\n body = parsed as ErrorBody;\n } else {\n try {\n body = (await response.clone().json()) as ErrorBody;\n } catch {\n body = { error: 'internal_error', message: response.statusText };\n }\n }\n return makeError(body, response.status);\n}\n","import createClient, { type Client } from 'openapi-fetch';\nimport type { paths } from './types.js';\nimport { OutlayerError, errorFromResponse } from './errors.js';\n\nexport const DEFAULT_BASE_URL = 'https://api.outlayer.fastnear.com';\n\nexport type RetryConfig = {\n maxAttempts?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n};\n\nexport type ClientOptions = {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n retry?: RetryConfig;\n};\n\nexport type UnauthenticatedOptions = {\n baseUrl?: string;\n fetch?: typeof fetch;\n};\n\nexport const DEFAULT_RETRY: Required<RetryConfig> = {\n maxAttempts: 3,\n initialDelayMs: 100,\n maxDelayMs: 1600,\n};\n\nexport type FetchClient = Client<paths, `${string}/${string}`>;\n\nexport function makeClient(opts: ClientOptions): { client: FetchClient; retry: Required<RetryConfig> } {\n const init: Parameters<typeof createClient<paths>>[0] = {\n baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,\n headers: { Authorization: `Bearer ${opts.apiKey}` },\n };\n if (opts.fetch) init.fetch = opts.fetch;\n const client = createClient<paths>(init);\n const retry: Required<RetryConfig> = { ...DEFAULT_RETRY, ...opts.retry };\n return { client, retry };\n}\n\nexport function makeUnauthenticatedClient(opts: UnauthenticatedOptions = {}): FetchClient {\n const init: Parameters<typeof createClient<paths>>[0] = {\n baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,\n };\n if (opts.fetch) init.fetch = opts.fetch;\n return createClient<paths>(init);\n}\n\nexport type FetchCall<T> = () => Promise<{\n data?: T;\n error?: unknown;\n response: Response;\n}>;\n\nexport async function runWithRetry<T>(\n call: FetchCall<T>,\n retry: Required<RetryConfig>,\n): Promise<T> {\n let lastError: unknown;\n for (let attempt = 1; attempt <= retry.maxAttempts; attempt++) {\n try {\n const { data, error, response } = await call();\n if (response.ok) {\n return data as T;\n }\n const err = await errorFromResponse(response, error);\n if (err.status >= 500 && attempt < retry.maxAttempts) {\n lastError = err;\n await sleep(backoff(attempt, retry));\n continue;\n }\n throw err;\n } catch (e) {\n if (e instanceof OutlayerError) throw e;\n lastError = e;\n if (attempt < retry.maxAttempts && isNetworkError(e)) {\n await sleep(backoff(attempt, retry));\n continue;\n }\n throw new OutlayerError({\n code: 'network_error',\n message: e instanceof Error ? e.message : String(e),\n status: 0,\n });\n }\n }\n throw lastError;\n}\n\nfunction backoff(attempt: number, cfg: Required<RetryConfig>): number {\n return Math.min(cfg.maxDelayMs, cfg.initialDelayMs * 2 ** (attempt - 1));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction isNetworkError(e: unknown): boolean {\n return e instanceof TypeError;\n}\n\nexport function newIdempotencyKey(): string {\n return crypto.randomUUID();\n}\n","import type { components } from './types.js';\nimport {\n type ClientOptions,\n type FetchClient,\n type RetryConfig,\n type UnauthenticatedOptions,\n DEFAULT_RETRY,\n makeClient,\n makeUnauthenticatedClient,\n newIdempotencyKey,\n runWithRetry,\n} from './http.js';\nimport { errorFromResponse } from './errors.js';\n\ntype Schemas = components['schemas'];\n\n// ---------------------------------------------------------------------------\n// Re-exported user-facing types (so consumers don't import paths/components)\n// ---------------------------------------------------------------------------\n\nexport type Chain = Schemas['Chain'];\nexport type RequestType = Schemas['RequestType'];\nexport type RequestStatus = Schemas['RequestStatus'];\n\nexport type RegisterRequest = Schemas['RegisterRequest'];\nexport type RegisterResponse = Schemas['RegisterResponse'];\nexport type AddressResponse = Schemas['AddressResponse'];\nexport type BalanceResponse = Schemas['BalanceResponse'];\nexport type TokensResponse = Schemas['TokensResponse'];\n\nexport type CallRequest = Schemas['CallRequest'];\nexport type CallResponse = Schemas['CallResponse'];\nexport type TransferRequest = Schemas['TransferRequest'];\nexport type IntentsDepositRequest = Schemas['IntentsDepositRequest'];\nexport type IntentsDepositResponse = Schemas['IntentsDepositResponse'];\n\nexport type WithdrawRequest = Schemas['WithdrawRequest'];\nexport type WithdrawResponse = Schemas['WithdrawResponse'];\nexport type DryRunResponse = Schemas['DryRunResponse'];\n\nexport type SwapRequest = Schemas['SwapRequest'];\nexport type SwapResponse = Schemas['SwapResponse'];\nexport type SwapQuoteResponse = Schemas['SwapQuoteResponse'];\n\nexport type SignMessageRequest = Schemas['SignMessageRequest'];\nexport type SignMessageResponse = Schemas['SignMessageResponse'];\n\nexport type RequestStatusResponse = Schemas['RequestStatusResponse'];\nexport type RequestListResponse = Schemas['RequestListResponse'];\n\nexport type PolicyResponse = Schemas['PolicyResponse'];\nexport type PolicyRules = Schemas['PolicyRules'];\nexport type ApprovalConfig = Schemas['ApprovalConfig'];\nexport type EncryptPolicyRequest = Schemas['EncryptPolicyRequest'];\nexport type EncryptPolicyResponse = Schemas['EncryptPolicyResponse'];\nexport type SignPolicyResponse = Schemas['SignPolicyResponse'];\n\nexport type PendingApproval = Schemas['PendingApproval'];\nexport type PendingApprovalsResponse = Schemas['PendingApprovalsResponse'];\nexport type Nep413Auth = Schemas['Nep413Auth'];\nexport type ApproveResponse = Schemas['ApproveResponse'];\n\nexport type AuditEvent = Schemas['AuditEvent'];\nexport type AuditResponse = Schemas['AuditResponse'];\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\ntype Idempotent = { idempotencyKey?: string };\n\nfunction idempotencyHeader(key: string | undefined): Record<string, string> {\n return { 'Idempotency-Key': key ?? newIdempotencyKey() };\n}\n\n// ---------------------------------------------------------------------------\n// Sub-namespaces\n// ---------------------------------------------------------------------------\n\nexport class PolicyAPI {\n constructor(\n private readonly client: FetchClient,\n private readonly retry: Required<RetryConfig>,\n ) {}\n\n get(): Promise<PolicyResponse> {\n return runWithRetry(() => this.client.GET('/wallet/v1/policy'), this.retry);\n }\n\n encrypt(body: EncryptPolicyRequest): Promise<EncryptPolicyResponse> {\n return runWithRetry(() => this.client.POST('/wallet/v1/encrypt-policy', { body }), this.retry);\n }\n\n sign(encryptedData: string): Promise<SignPolicyResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/sign-policy', { body: { encrypted_data: encryptedData } }),\n this.retry,\n );\n }\n\n invalidateCache(walletId: string): Promise<void> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/invalidate-cache', { body: { wallet_id: walletId } }),\n this.retry,\n ).then(() => undefined);\n }\n}\n\nexport class ApprovalsAPI {\n constructor(\n private readonly client: FetchClient,\n private readonly retry: Required<RetryConfig>,\n ) {}\n\n listPending(): Promise<PendingApprovalsResponse> {\n return runWithRetry(() => this.client.GET('/wallet/v1/pending_approvals'), this.retry);\n }\n\n approve(approvalId: string, auth: Nep413Auth): Promise<ApproveResponse> {\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/approve/{id}', {\n params: { path: { id: approvalId } },\n body: auth,\n }),\n this.retry,\n );\n }\n\n reject(approvalId: string, auth: Nep413Auth, reason?: string): Promise<ApproveResponse> {\n const body = reason !== undefined ? { ...auth, reason } : auth;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/reject/{id}', {\n params: { path: { id: approvalId } },\n body,\n }),\n this.retry,\n );\n }\n}\n\nexport class AuditAPI {\n constructor(\n private readonly client: FetchClient,\n private readonly retry: Required<RetryConfig>,\n ) {}\n\n list(opts: { limit?: number; offset?: number } = {}): Promise<AuditResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/audit', { params: { query: opts } }),\n this.retry,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main client\n// ---------------------------------------------------------------------------\n\nexport class OutlayerClient {\n private readonly client: FetchClient;\n private readonly retry: Required<RetryConfig>;\n\n readonly policy: PolicyAPI;\n readonly approvals: ApprovalsAPI;\n readonly audit: AuditAPI;\n\n constructor(opts: ClientOptions) {\n const { client, retry } = makeClient(opts);\n this.client = client;\n this.retry = retry;\n this.policy = new PolicyAPI(client, retry);\n this.approvals = new ApprovalsAPI(client, retry);\n this.audit = new AuditAPI(client, retry);\n }\n\n // ------- Static factory: register a new wallet (no auth) -------\n\n /**\n * Register a new wallet and obtain an API key.\n *\n * - Empty call: anonymous wallet on OutLayer's shared master. Convenient, no setup.\n * - With `vaultId`: bind to a deployed customer vault so keys derive through\n * the per-vault master. Vault binding is permanent.\n * - With `body`: full control — pass any `RegisterRequest` field (e.g., NEP-413\n * account-binding fields). `vaultId` is merged into `body.vault_id` if not\n * already set.\n *\n * Vault deployment is NOT done here — use the dashboard\n * (https://outlayer.fastnear.com/vault) or `outlayer vault init` CLI.\n * See docs/vaults.md for the full flow.\n */\n static async register(\n opts: {\n vaultId?: string;\n body?: RegisterRequest;\n } & UnauthenticatedOptions = {},\n ): Promise<RegisterResponse> {\n const client = makeUnauthenticatedClient(opts);\n const body: RegisterRequest = { ...(opts.body ?? {}) };\n if (opts.vaultId !== undefined && body.vault_id === undefined) {\n body.vault_id = opts.vaultId;\n }\n const { data, error, response } = await client.POST('/register', { body });\n if (!response.ok) throw await errorFromResponse(response, error);\n return data as RegisterResponse;\n }\n\n // ------- Wallet read -------\n\n getAddress(chain: Chain): Promise<AddressResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/address', { params: { query: { chain } } }),\n this.retry,\n );\n }\n\n getBalance(\n opts: { chain?: Chain; token?: string; source?: 'chain' | 'intents' } = {},\n ): Promise<BalanceResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/balance', { params: { query: opts } }),\n this.retry,\n );\n }\n\n listTokens(): Promise<TokensResponse> {\n return runWithRetry(() => this.client.GET('/wallet/v1/tokens'), this.retry);\n }\n\n // ------- Wallet write -------\n\n call(opts: CallRequest & Idempotent): Promise<CallResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/call', {\n body: body as CallRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n transfer(opts: TransferRequest & Idempotent): Promise<CallResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/transfer', {\n body: body as TransferRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n intentsDeposit(opts: IntentsDepositRequest & Idempotent): Promise<IntentsDepositResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/intents/deposit', {\n body: body as IntentsDepositRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n withdraw(opts: WithdrawRequest & Idempotent): Promise<WithdrawResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/intents/withdraw', {\n body: body as WithdrawRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n withdrawDryRun(opts: WithdrawRequest): Promise<DryRunResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/intents/withdraw/dry-run', { body: opts }),\n this.retry,\n );\n }\n\n swap(opts: SwapRequest & Idempotent): Promise<SwapResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/intents/swap', {\n body: body as SwapRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n swapQuote(opts: SwapRequest): Promise<SwapQuoteResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/intents/swap/quote', { body: opts }),\n this.retry,\n );\n }\n\n signMessage(opts: SignMessageRequest): Promise<SignMessageResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/sign-message', { body: opts }),\n this.retry,\n );\n }\n\n // ------- Async request tracking -------\n\n getRequest(id: string): Promise<RequestStatusResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/requests/{id}', { params: { path: { id } } }),\n this.retry,\n );\n }\n\n listRequests(\n opts: { type?: RequestType; status?: RequestStatus; limit?: number; offset?: number } = {},\n ): Promise<RequestListResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/requests', { params: { query: opts } }),\n this.retry,\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { components } from './types.js';\n\nexport type ApiErrorCode = components['schemas']['ErrorCode'];\nexport type ErrorCode = ApiErrorCode | 'network_error' | 'parse_error';\n\nexport type ErrorBody = {\n error?: ApiErrorCode;\n message?: string;\n details?: unknown;\n};\n\nexport interface OutlayerErrorOptions {\n code: ErrorCode;\n message: string;\n status: number;\n details?: unknown;\n}\n\nexport class OutlayerError extends Error {\n readonly code: ErrorCode;\n readonly status: number;\n readonly details: unknown;\n\n constructor(opts: OutlayerErrorOptions) {\n super(opts.message);\n this.name = 'OutlayerError';\n this.code = opts.code;\n this.status = opts.status;\n this.details = opts.details;\n }\n}\n\nexport class PolicyDeniedError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'PolicyDeniedError';\n }\n}\n\nexport class WalletFrozenError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'WalletFrozenError';\n }\n}\n\nexport class UnauthorizedError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'UnauthorizedError';\n }\n}\n\nexport class RateLimitedError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'RateLimitedError';\n }\n}\n\nexport class NotFoundError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'NotFoundError';\n }\n}\n\nexport class BadRequestError extends OutlayerError {\n constructor(opts: OutlayerErrorOptions) {\n super(opts);\n this.name = 'BadRequestError';\n }\n}\n\nconst codeToCtor: Partial<Record<ErrorCode, new (opts: OutlayerErrorOptions) => OutlayerError>> = {\n policy_denied: PolicyDeniedError,\n wallet_frozen: WalletFrozenError,\n missing_auth: UnauthorizedError,\n invalid_api_key: UnauthorizedError,\n timestamp_expired: UnauthorizedError,\n rate_limited: RateLimitedError,\n request_not_found: NotFoundError,\n approval_not_found: NotFoundError,\n bad_request: BadRequestError,\n invalid_address: BadRequestError,\n insufficient_balance: BadRequestError,\n unsupported_chain: BadRequestError,\n unsupported_token: BadRequestError,\n};\n\nexport function makeError(body: ErrorBody, status: number): OutlayerError {\n const code: ErrorCode = body.error ?? 'parse_error';\n const message = body.message ?? `HTTP ${status}`;\n const opts: OutlayerErrorOptions = body.details !== undefined\n ? { code, message, status, details: body.details }\n : { code, message, status };\n const Ctor = codeToCtor[code] ?? OutlayerError;\n return new Ctor(opts);\n}\n\nexport async function errorFromResponse(response: Response, parsed?: unknown): Promise<OutlayerError> {\n let body: ErrorBody;\n if (parsed && typeof parsed === 'object') {\n body = parsed as ErrorBody;\n } else {\n try {\n body = (await response.clone().json()) as ErrorBody;\n } catch {\n body = { error: 'internal_error', message: response.statusText };\n }\n }\n return makeError(body, response.status);\n}\n","import createClient, { type Client } from 'openapi-fetch';\nimport type { paths } from './types.js';\nimport { OutlayerError, errorFromResponse } from './errors.js';\n\nexport type Network = 'mainnet' | 'testnet';\n\nexport const NETWORK_BASE_URLS: Record<Network, string> = {\n mainnet: 'https://api.outlayer.fastnear.com',\n testnet: 'https://api.testnet.outlayer.fastnear.com',\n};\n\nexport const DEFAULT_BASE_URL = NETWORK_BASE_URLS.mainnet;\n\nexport type RetryConfig = {\n maxAttempts?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n};\n\nexport type ClientOptions = {\n apiKey: string;\n /**\n * NEAR network to target. Defaults to `mainnet`. NEAR Intents (cross-chain\n * swaps + gasless withdrawals) only work on mainnet — use testnet for the\n * register / policy / sign-message flow while developing.\n */\n network?: Network;\n /** Overrides `network` for self-hosted or staging deployments. */\n baseUrl?: string;\n fetch?: typeof fetch;\n retry?: RetryConfig;\n};\n\nexport type UnauthenticatedOptions = {\n network?: Network;\n baseUrl?: string;\n fetch?: typeof fetch;\n};\n\nfunction resolveBaseUrl(opts: { network?: Network; baseUrl?: string }): string {\n if (opts.baseUrl) return opts.baseUrl;\n if (opts.network) return NETWORK_BASE_URLS[opts.network];\n return DEFAULT_BASE_URL;\n}\n\nexport const DEFAULT_RETRY: Required<RetryConfig> = {\n maxAttempts: 3,\n initialDelayMs: 100,\n maxDelayMs: 1600,\n};\n\nexport type FetchClient = Client<paths, `${string}/${string}`>;\n\nexport function makeClient(opts: ClientOptions): { client: FetchClient; retry: Required<RetryConfig> } {\n const init: Parameters<typeof createClient<paths>>[0] = {\n baseUrl: resolveBaseUrl(opts),\n headers: { Authorization: `Bearer ${opts.apiKey}` },\n };\n if (opts.fetch) init.fetch = opts.fetch;\n const client = createClient<paths>(init);\n const retry: Required<RetryConfig> = { ...DEFAULT_RETRY, ...opts.retry };\n return { client, retry };\n}\n\nexport function makeUnauthenticatedClient(opts: UnauthenticatedOptions = {}): FetchClient {\n const init: Parameters<typeof createClient<paths>>[0] = {\n baseUrl: resolveBaseUrl(opts),\n };\n if (opts.fetch) init.fetch = opts.fetch;\n return createClient<paths>(init);\n}\n\nexport type FetchCall<T> = () => Promise<{\n data?: T;\n error?: unknown;\n response: Response;\n}>;\n\nexport async function runWithRetry<T>(\n call: FetchCall<T>,\n retry: Required<RetryConfig>,\n): Promise<T> {\n let lastError: unknown;\n for (let attempt = 1; attempt <= retry.maxAttempts; attempt++) {\n try {\n const { data, error, response } = await call();\n if (response.ok) {\n return data as T;\n }\n const err = await errorFromResponse(response, error);\n if (err.status >= 500 && attempt < retry.maxAttempts) {\n lastError = err;\n await sleep(backoff(attempt, retry));\n continue;\n }\n throw err;\n } catch (e) {\n if (e instanceof OutlayerError) throw e;\n lastError = e;\n if (attempt < retry.maxAttempts && isNetworkError(e)) {\n await sleep(backoff(attempt, retry));\n continue;\n }\n throw new OutlayerError({\n code: 'network_error',\n message: e instanceof Error ? e.message : String(e),\n status: 0,\n });\n }\n }\n throw lastError;\n}\n\nfunction backoff(attempt: number, cfg: Required<RetryConfig>): number {\n return Math.min(cfg.maxDelayMs, cfg.initialDelayMs * 2 ** (attempt - 1));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction isNetworkError(e: unknown): boolean {\n return e instanceof TypeError;\n}\n\nexport function newIdempotencyKey(): string {\n return crypto.randomUUID();\n}\n","import type { components } from './types.js';\nimport {\n type ClientOptions,\n type FetchClient,\n type RetryConfig,\n type UnauthenticatedOptions,\n DEFAULT_RETRY,\n makeClient,\n makeUnauthenticatedClient,\n newIdempotencyKey,\n runWithRetry,\n} from './http.js';\nimport { errorFromResponse } from './errors.js';\n\ntype Schemas = components['schemas'];\n\n// ---------------------------------------------------------------------------\n// Re-exported user-facing types (so consumers don't import paths/components)\n// ---------------------------------------------------------------------------\n\nexport type Chain = Schemas['Chain'];\nexport type RequestType = Schemas['RequestType'];\nexport type RequestStatus = Schemas['RequestStatus'];\n\nexport type RegisterRequest = Schemas['RegisterRequest'];\nexport type RegisterResponse = Schemas['RegisterResponse'];\nexport type AddressResponse = Schemas['AddressResponse'];\nexport type BalanceResponse = Schemas['BalanceResponse'];\nexport type TokensResponse = Schemas['TokensResponse'];\n\nexport type CallRequest = Schemas['CallRequest'];\nexport type CallResponse = Schemas['CallResponse'];\nexport type TransferRequest = Schemas['TransferRequest'];\nexport type IntentsDepositRequest = Schemas['IntentsDepositRequest'];\nexport type IntentsDepositResponse = Schemas['IntentsDepositResponse'];\n\nexport type WithdrawRequest = Schemas['WithdrawRequest'];\nexport type WithdrawResponse = Schemas['WithdrawResponse'];\nexport type DryRunResponse = Schemas['DryRunResponse'];\n\nexport type SwapRequest = Schemas['SwapRequest'];\nexport type SwapResponse = Schemas['SwapResponse'];\nexport type SwapQuoteResponse = Schemas['SwapQuoteResponse'];\n\nexport type SignMessageRequest = Schemas['SignMessageRequest'];\nexport type SignMessageResponse = Schemas['SignMessageResponse'];\n\nexport type DepositIntentRequest = Schemas['DepositIntentRequest'];\nexport type DepositIntentResponse = Schemas['DepositIntentResponse'];\nexport type DepositStatusResponse = Schemas['DepositStatusResponse'];\n\nexport type RequestStatusResponse = Schemas['RequestStatusResponse'];\nexport type RequestListResponse = Schemas['RequestListResponse'];\n\nexport type PolicyResponse = Schemas['PolicyResponse'];\nexport type PolicyRules = Schemas['PolicyRules'];\nexport type ApprovalConfig = Schemas['ApprovalConfig'];\nexport type EncryptPolicyRequest = Schemas['EncryptPolicyRequest'];\nexport type EncryptPolicyResponse = Schemas['EncryptPolicyResponse'];\nexport type SignPolicyResponse = Schemas['SignPolicyResponse'];\n\nexport type PendingApproval = Schemas['PendingApproval'];\nexport type PendingApprovalsResponse = Schemas['PendingApprovalsResponse'];\nexport type Nep413Auth = Schemas['Nep413Auth'];\nexport type ApproveResponse = Schemas['ApproveResponse'];\n\nexport type AuditEvent = Schemas['AuditEvent'];\nexport type AuditResponse = Schemas['AuditResponse'];\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\ntype Idempotent = { idempotencyKey?: string };\n\nfunction idempotencyHeader(key: string | undefined): Record<string, string> {\n return { 'Idempotency-Key': key ?? newIdempotencyKey() };\n}\n\n// ---------------------------------------------------------------------------\n// Sub-namespaces\n// ---------------------------------------------------------------------------\n\nexport class PolicyAPI {\n constructor(\n private readonly client: FetchClient,\n private readonly retry: Required<RetryConfig>,\n ) {}\n\n get(): Promise<PolicyResponse> {\n return runWithRetry(() => this.client.GET('/wallet/v1/policy'), this.retry);\n }\n\n encrypt(body: EncryptPolicyRequest): Promise<EncryptPolicyResponse> {\n return runWithRetry(() => this.client.POST('/wallet/v1/encrypt-policy', { body }), this.retry);\n }\n\n sign(encryptedData: string): Promise<SignPolicyResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/sign-policy', { body: { encrypted_data: encryptedData } }),\n this.retry,\n );\n }\n\n invalidateCache(walletId: string): Promise<void> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/invalidate-cache', { body: { wallet_id: walletId } }),\n this.retry,\n ).then(() => undefined);\n }\n}\n\nexport class ApprovalsAPI {\n constructor(\n private readonly client: FetchClient,\n private readonly retry: Required<RetryConfig>,\n ) {}\n\n listPending(): Promise<PendingApprovalsResponse> {\n return runWithRetry(() => this.client.GET('/wallet/v1/pending_approvals'), this.retry);\n }\n\n approve(approvalId: string, auth: Nep413Auth): Promise<ApproveResponse> {\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/approve/{id}', {\n params: { path: { id: approvalId } },\n body: auth,\n }),\n this.retry,\n );\n }\n\n reject(approvalId: string, auth: Nep413Auth, reason?: string): Promise<ApproveResponse> {\n const body = reason !== undefined ? { ...auth, reason } : auth;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/reject/{id}', {\n params: { path: { id: approvalId } },\n body,\n }),\n this.retry,\n );\n }\n}\n\nexport class AuditAPI {\n constructor(\n private readonly client: FetchClient,\n private readonly retry: Required<RetryConfig>,\n ) {}\n\n list(opts: { limit?: number; offset?: number } = {}): Promise<AuditResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/audit', { params: { query: opts } }),\n this.retry,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main client\n// ---------------------------------------------------------------------------\n\nexport class OutlayerClient {\n private readonly client: FetchClient;\n private readonly retry: Required<RetryConfig>;\n\n readonly policy: PolicyAPI;\n readonly approvals: ApprovalsAPI;\n readonly audit: AuditAPI;\n\n constructor(opts: ClientOptions) {\n const { client, retry } = makeClient(opts);\n this.client = client;\n this.retry = retry;\n this.policy = new PolicyAPI(client, retry);\n this.approvals = new ApprovalsAPI(client, retry);\n this.audit = new AuditAPI(client, retry);\n }\n\n // ------- Static factory: register a new wallet (no auth) -------\n\n /**\n * Register a new wallet and obtain an API key.\n *\n * - Empty call: anonymous wallet on OutLayer's shared master. Convenient, no setup.\n * - With `vaultId`: bind to a deployed customer vault so keys derive through\n * the per-vault master. Vault binding is permanent.\n * - With `body`: full control — pass any `RegisterRequest` field (e.g., NEP-413\n * account-binding fields). `vaultId` is merged into `body.vault_id` if not\n * already set.\n *\n * Vault deployment is NOT done here — use the dashboard\n * (https://outlayer.fastnear.com/vault) or `outlayer vault init` CLI.\n * See docs/vaults.md for the full flow.\n */\n static async register(\n opts: {\n vaultId?: string;\n body?: RegisterRequest;\n } & UnauthenticatedOptions = {},\n ): Promise<RegisterResponse> {\n const client = makeUnauthenticatedClient(opts);\n const body: RegisterRequest = { ...(opts.body ?? {}) };\n if (opts.vaultId !== undefined && body.vault_id === undefined) {\n body.vault_id = opts.vaultId;\n }\n const { data, error, response } = await client.POST('/register', { body });\n if (!response.ok) throw await errorFromResponse(response, error);\n return data as RegisterResponse;\n }\n\n // ------- Wallet read -------\n\n getAddress(chain: Chain): Promise<AddressResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/address', { params: { query: { chain } } }),\n this.retry,\n );\n }\n\n getBalance(\n opts: { chain?: Chain; token?: string; source?: 'chain' | 'intents' } = {},\n ): Promise<BalanceResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/balance', { params: { query: opts } }),\n this.retry,\n );\n }\n\n listTokens(): Promise<TokensResponse> {\n return runWithRetry(() => this.client.GET('/wallet/v1/tokens'), this.retry);\n }\n\n // ------- Wallet write -------\n\n call(opts: CallRequest & Idempotent): Promise<CallResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/call', {\n body: body as CallRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n transfer(opts: TransferRequest & Idempotent): Promise<CallResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/transfer', {\n body: body as TransferRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n intentsDeposit(opts: IntentsDepositRequest & Idempotent): Promise<IntentsDepositResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/intents/deposit', {\n body: body as IntentsDepositRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n withdraw(opts: WithdrawRequest & Idempotent): Promise<WithdrawResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/intents/withdraw', {\n body: body as WithdrawRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n withdrawDryRun(opts: WithdrawRequest): Promise<DryRunResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/intents/withdraw/dry-run', { body: opts }),\n this.retry,\n );\n }\n\n swap(opts: SwapRequest & Idempotent): Promise<SwapResponse> {\n const { idempotencyKey, ...body } = opts;\n return runWithRetry(\n () =>\n this.client.POST('/wallet/v1/intents/swap', {\n body: body as SwapRequest,\n headers: idempotencyHeader(idempotencyKey),\n }),\n this.retry,\n );\n }\n\n swapQuote(opts: SwapRequest): Promise<SwapQuoteResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/intents/swap/quote', { body: opts }),\n this.retry,\n );\n }\n\n signMessage(opts: SignMessageRequest): Promise<SignMessageResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/sign-message', { body: opts }),\n this.retry,\n );\n }\n\n // ------- Cross-chain deposit (1Click) -------\n\n /**\n * Create a one-time deposit address on a source chain. Send funds there,\n * then poll {@link getDepositStatus} until `success`.\n */\n createDepositIntent(opts: DepositIntentRequest): Promise<DepositIntentResponse> {\n return runWithRetry(\n () => this.client.POST('/wallet/v1/deposit-intent', { body: opts }),\n this.retry,\n );\n }\n\n getDepositStatus(intentId: string): Promise<DepositStatusResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/deposit-status', { params: { query: { id: intentId } } }),\n this.retry,\n );\n }\n\n // ------- Async request tracking -------\n\n getRequest(id: string): Promise<RequestStatusResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/requests/{id}', { params: { path: { id } } }),\n this.retry,\n );\n }\n\n listRequests(\n opts: { type?: RequestType; status?: RequestStatus; limit?: number; offset?: number } = {},\n ): Promise<RequestListResponse> {\n return runWithRetry(\n () => this.client.GET('/wallet/v1/requests', { params: { query: opts } }),\n this.retry,\n );\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@outlayer/sdk",
3
- "version": "0.1.0-alpha.1",
3
+ "version": "0.1.0-alpha.3",
4
4
  "description": "TypeScript SDK for OutLayer Agent Custody — multi-chain wallets with TEE-enforced policy.",
5
5
  "license": "MIT",
6
6
  "repository": {
package/spec/openapi.yaml CHANGED
@@ -477,6 +477,69 @@ paths:
477
477
  '500':
478
478
  $ref: '#/components/responses/InternalError'
479
479
 
480
+ /wallet/v1/deposit-intent:
481
+ post:
482
+ tags: [Wallet]
483
+ operationId: createDepositIntent
484
+ summary: Create a cross-chain deposit intent (1Click)
485
+ description: |
486
+ Requests a one-time deposit address on a source chain via NEAR Intents
487
+ 1Click. The caller sends `amount` of `token` to the returned
488
+ `deposit_address` on `chain`; the solver bridges it and credits the
489
+ wallet's intents.near balance. Poll `getDepositStatus` until `success`.
490
+
491
+ Amounts are in the token's smallest unit. There's a small bridge fee,
492
+ so `amount_out` < `amount`.
493
+ requestBody:
494
+ required: true
495
+ content:
496
+ application/json:
497
+ schema:
498
+ $ref: '#/components/schemas/DepositIntentRequest'
499
+ example:
500
+ chain: ethereum
501
+ amount: '5000000'
502
+ token: USDC
503
+ responses:
504
+ '200':
505
+ description: Deposit intent created
506
+ content:
507
+ application/json:
508
+ schema:
509
+ $ref: '#/components/schemas/DepositIntentResponse'
510
+ '400':
511
+ $ref: '#/components/responses/BadRequest'
512
+ '401':
513
+ $ref: '#/components/responses/Unauthorized'
514
+ '500':
515
+ $ref: '#/components/responses/InternalError'
516
+
517
+ /wallet/v1/deposit-status:
518
+ get:
519
+ tags: [Wallet]
520
+ operationId: getDepositStatus
521
+ summary: Poll a cross-chain deposit intent's status
522
+ parameters:
523
+ - name: id
524
+ in: query
525
+ required: true
526
+ schema:
527
+ type: string
528
+ description: The `intent_id` from `createDepositIntent`.
529
+ responses:
530
+ '200':
531
+ description: Deposit status
532
+ content:
533
+ application/json:
534
+ schema:
535
+ $ref: '#/components/schemas/DepositStatusResponse'
536
+ '401':
537
+ $ref: '#/components/responses/Unauthorized'
538
+ '404':
539
+ $ref: '#/components/responses/NotFound'
540
+ '500':
541
+ $ref: '#/components/responses/InternalError'
542
+
480
543
  /wallet/v1/sign-message:
481
544
  post:
482
545
  tags: [Wallet]
@@ -1285,6 +1348,64 @@ components:
1285
1348
  time_estimate_seconds:
1286
1349
  type: integer
1287
1350
 
1351
+ DepositIntentRequest:
1352
+ type: object
1353
+ required: [chain, amount, token]
1354
+ properties:
1355
+ chain:
1356
+ type: string
1357
+ description: |
1358
+ Source chain to bridge from. Common values: `ethereum`, `solana`,
1359
+ `base`, `arbitrum`, `polygon`, `optimism`, `avalanche`.
1360
+ amount:
1361
+ type: string
1362
+ description: Amount in the token's smallest unit (e.g. `5000000` = 5 USDC).
1363
+ token:
1364
+ type: string
1365
+ description: Token symbol to deposit, e.g. `USDC`.
1366
+
1367
+ DepositIntentResponse:
1368
+ type: object
1369
+ required:
1370
+ - intent_id
1371
+ - deposit_address
1372
+ - amount
1373
+ - amount_out
1374
+ - min_amount_out
1375
+ - expires_at
1376
+ - estimated_time_secs
1377
+ properties:
1378
+ intent_id:
1379
+ type: string
1380
+ deposit_address:
1381
+ type: string
1382
+ description: One-time address on the source chain — send funds here.
1383
+ amount:
1384
+ type: string
1385
+ amount_out:
1386
+ type: string
1387
+ description: Amount credited after the bridge fee.
1388
+ min_amount_out:
1389
+ type: string
1390
+ expires_at:
1391
+ type: string
1392
+ format: date-time
1393
+ estimated_time_secs:
1394
+ type: integer
1395
+
1396
+ DepositStatusResponse:
1397
+ type: object
1398
+ required: [intent_id, status]
1399
+ properties:
1400
+ intent_id:
1401
+ type: string
1402
+ status:
1403
+ type: string
1404
+ enum: [pending, bridging, success, failed, expired]
1405
+ result:
1406
+ type: [object, 'null']
1407
+ additionalProperties: {}
1408
+
1288
1409
  SignMessageRequest:
1289
1410
  type: object
1290
1411
  required: [message, recipient]