@avalabs/fusion-sdk 0.16.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.cjs +1 -1
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +21 -1
- package/dist/constants.d.ts +21 -1
- package/dist/constants.js +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/mod.cjs +1 -1
- package/dist/mod.d.cts +7 -5
- package/dist/mod.d.ts +7 -5
- package/dist/mod.js +1 -1
- package/dist/transfer-manager.cjs +1 -1
- package/dist/transfer-manager.cjs.map +1 -1
- package/dist/transfer-manager.js +1 -1
- package/dist/transfer-manager.js.map +1 -1
- package/dist/transfer-service/_evm-gas.cjs +1 -1
- package/dist/transfer-service/_evm-gas.js +1 -1
- package/dist/transfer-service/_utils.cjs +1 -1
- package/dist/transfer-service/_utils.cjs.map +1 -1
- package/dist/transfer-service/_utils.js +1 -1
- package/dist/transfer-service/_utils.js.map +1 -1
- package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_type-guards.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_type-guards.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_type-guards.js +2 -0
- package/dist/transfer-service/avalanche-cct/_type-guards.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/addresses.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/addresses.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/addresses.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/addresses.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/fees.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/fees.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/fees.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/fees.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/p-chain.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/p-chain.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/p-chain.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/p-chain.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/polling.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/polling.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/polling.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/polling.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/transactions.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/transactions.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/transactions.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/transactions.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js +2 -0
- package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/constants.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/constants.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/constants.js +2 -0
- package/dist/transfer-service/avalanche-cct/constants.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/types.d.cts +33 -0
- package/dist/transfer-service/avalanche-cct/types.d.ts +33 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.cjs +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.js +1 -1
- package/dist/transfer-service/avalanche-evm/_utils/wrap.cjs +1 -1
- package/dist/transfer-service/avalanche-evm/_utils/wrap.js +1 -1
- package/dist/transfer-service/fetch-utilities.cjs +1 -1
- package/dist/transfer-service/fetch-utilities.cjs.map +1 -1
- package/dist/transfer-service/fetch-utilities.js +1 -1
- package/dist/transfer-service/fetch-utilities.js.map +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +1 -1
- package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/markr/_handlers/track-transfer.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/track-transfer.js +1 -1
- package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/transfer-asset.js +1 -1
- package/dist/transfer-service/markr/markr-service.cjs.map +1 -1
- package/dist/transfer-service/markr/markr-service.js.map +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js +1 -1
- package/dist/types/asset.d.cts +18 -2
- package/dist/types/asset.d.ts +18 -2
- package/dist/types/service.d.cts +95 -7
- package/dist/types/service.d.ts +95 -7
- package/dist/types/transfer-manager.d.cts +19 -10
- package/dist/types/transfer-manager.d.ts +19 -10
- package/dist/types/utility-types.d.cts +8 -1
- package/dist/types/utility-types.d.ts +8 -1
- package/dist/utils/asset-id.cjs +1 -1
- package/dist/utils/asset-id.cjs.map +1 -1
- package/dist/utils/asset-id.js +1 -1
- package/dist/utils/asset-id.js.map +1 -1
- package/dist/utils/bridgeable-assets.cjs +2 -0
- package/dist/utils/bridgeable-assets.cjs.map +1 -0
- package/dist/utils/bridgeable-assets.d.cts +16 -0
- package/dist/utils/bridgeable-assets.d.ts +16 -0
- package/dist/utils/bridgeable-assets.js +2 -0
- package/dist/utils/bridgeable-assets.js.map +1 -0
- package/package.json +5 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-utilities.js","names":[],"sources":["../../src/transfer-service/fetch-utilities.ts"],"sourcesContent":["import { AbortedError, HttpError, isAbortedError, TimeoutError } from '../errors';\nimport type { Fetch } from '../types/utility-types';\n\nconst DEFAULT_BACKOFF_BASE_MS = 200;\nconst DEFAULT_BACKOFF_MAX_MS = 5_000;\nconst DEFAULT_RETRY_COUNT = 3;\n/**\n * Default HTTP methods to retry on.\n *\n * Only includes safe methods.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods#safe_idempotent_and_cacheable_request_methods\n */\nconst DEFAULT_RETRY_METHODS = ['GET', 'HEAD', 'OPTIONS', 'TRACE'];\n\nexport interface BackoffOptions {\n /** Base backoff in milliseconds */\n readonly baseMs?: number;\n /** Maximum backoff in milliseconds */\n readonly maxMs?: number;\n}\n\nexport interface RetryContext {\n /** Zero based attempt index */\n readonly attempt: number;\n /** Network or other thrown error */\n readonly error?: unknown;\n readonly init: RequestInit;\n readonly input: RequestInfo | URL;\n /** Failed response (non-2xx) */\n readonly response?: Response;\n}\n\nexport interface RetryOptions {\n readonly backoff?: BackoffOptions | ((ctx: RetryContext) => number);\n /**\n * Total number of retries to attempt.\n *\n * Default: {@link DEFAULT_RETRY_COUNT}\n */\n readonly retries?: number;\n /**\n * HTTP methods to retry on.\n *\n * Default: {@link DEFAULT_RETRY_METHODS}\n */\n readonly retryMethods?: string[];\n /**\n * Custom retry decider.\n */\n readonly retryOn?: (ctx: RetryContext) => boolean | Promise<boolean>;\n /**\n * Per attempt timeout in milliseconds.\n *\n * A `0` or `undefined` value means no timeout.\n */\n readonly timeoutMs?: number;\n}\n\nexport interface FetchWithRetryOptions extends RetryOptions {\n /**\n * Custom fetch implementation to use for the request.\n * @default globalThis.fetch\n */\n readonly fetch?: Fetch;\n /** Export abort. Applies to all attempts. */\n readonly signal?: AbortSignal;\n}\n\nexport async function _wait(delayMs: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (delayMs <= 0) {\n return resolve();\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayMs);\n\n const onAbort = () => {\n cleanup();\n reject(new AbortedError());\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n };\n\n if (signal) {\n if (signal.aborted) {\n cleanup();\n\n return reject(new AbortedError());\n }\n\n signal.addEventListener('abort', onAbort);\n }\n });\n}\n\n/**\n * @internal\n *\n * Parses a Retry-After header value.\n *\n * @param retryAfter - The value of the Retry-After header.\n * @returns The number of milliseconds to wait before retrying, or null if the header is not present or invalid.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After\n */\nexport function _parseRetryAfterHeader(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const seconds = Number(retryAfter);\n\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return Math.floor(seconds) * 1_000;\n }\n\n const date = new Date(retryAfter);\n\n const delta = date.getTime() - Date.now();\n\n return Number.isFinite(delta) && delta > 0 ? delta : null;\n}\n\nexport function _exponentialBackoff(attempt: number, options: BackoffOptions = {}): number {\n const base = Math.max(1, Math.floor(options.baseMs ?? DEFAULT_BACKOFF_BASE_MS));\n const max = Math.max(base, Math.floor(options.maxMs ?? DEFAULT_BACKOFF_MAX_MS));\n\n const raw = Math.min(max, base * 2 ** attempt);\n\n // Add some jitter.\n return Math.floor(Math.random() * raw);\n}\n\nexport function _shouldRetry(ctx: RetryContext, retryMethods: string[]): boolean {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!retryMethods.includes(method)) {\n return false;\n }\n\n if (ctx.error) {\n if (ctx.error instanceof AbortedError) {\n return false;\n }\n\n return true;\n }\n\n const status = ctx.response?.status ?? 0;\n\n if (status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n}\n\nexport function _composeAbortSignals(\n external?: AbortSignal,\n timeoutMs?: number,\n): { signal: AbortSignal; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeout = false;\n\n const onExternalAbort = () => {\n controller.abort(external?.reason ?? new AbortedError());\n };\n\n if (external) {\n if (external.aborted) {\n controller.abort(external.reason ?? new AbortedError());\n } else {\n external.addEventListener('abort', onExternalAbort);\n }\n }\n\n if (timeoutMs && timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeout = true;\n controller.abort(new TimeoutError());\n }, timeoutMs);\n }\n\n const cleanup = () => {\n if (external) {\n external.removeEventListener('abort', onExternalAbort);\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n return {\n cleanup,\n signal: controller.signal,\n timedOut: () => didTimeout,\n };\n}\n\nexport function _resolveBackoffDelay(\n attempt: number,\n ctx: RetryContext,\n retryAfterMs: number | null,\n options?: RetryOptions,\n): number {\n if (retryAfterMs != null) {\n return retryAfterMs;\n }\n\n if (typeof options?.backoff === 'function') {\n return options.backoff(ctx);\n }\n\n return _exponentialBackoff(attempt, options?.backoff);\n}\n\nasync function _safeParseResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n try {\n return await response.clone().json();\n } catch {\n // Ignore\n }\n }\n\n try {\n return await response.clone().text();\n } catch {\n // Ignore\n }\n\n return undefined;\n}\n\nexport async function _fetchWithRetry(\n input: RequestInfo | URL,\n init: RequestInit = {},\n options: FetchWithRetryOptions = {},\n): Promise<Response> {\n const {\n fetch: customFetch,\n retries = DEFAULT_RETRY_COUNT,\n retryMethods = DEFAULT_RETRY_METHODS,\n retryOn = (ctx: RetryContext) => _shouldRetry(ctx, retryMethods),\n } = options;\n\n const fetchImpl: Fetch = customFetch ?? globalThis.fetch;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const { cleanup, signal, timedOut } = _composeAbortSignals(options.signal, options.timeoutMs);\n\n try {\n const response = await fetchImpl(input, { ...init, signal });\n\n if (response.ok) {\n cleanup();\n return response;\n }\n\n const ctx: RetryContext = {\n attempt,\n init,\n input,\n response,\n };\n\n const doRetry = await retryOn(ctx);\n\n if (!doRetry || attempt === retries) {\n // Try to extract error payload best-effort.\n // Do not throw if stream already consumed.\n let data: unknown;\n try {\n data = await _safeParseResponse(response);\n } catch {\n // Ignore\n }\n\n cleanup();\n\n throw new HttpError(`HTTP ${response.status} ${response.statusText}`, response, data);\n }\n\n const retryAfterMs = _parseRetryAfterHeader(response.headers.get('retry-after'));\n const delay = _resolveBackoffDelay(attempt, ctx, retryAfterMs, options);\n\n cleanup();\n\n await _wait(delay, options.signal);\n\n continue;\n } catch (error: unknown) {\n cleanup();\n\n lastError = error;\n\n const isAbortError = isAbortedError(error);\n\n const ctx: RetryContext = {\n attempt,\n error,\n init,\n input,\n };\n\n const doRetry = !isAbortError && (await retryOn(ctx));\n\n if (!doRetry || attempt === retries) {\n if (timedOut()) {\n throw new TimeoutError();\n }\n\n if (isAbortError) {\n throw new AbortedError(error.message ?? 'Aborted');\n }\n\n throw error;\n }\n\n const delay = _resolveBackoffDelay(attempt, ctx, null, options);\n\n await _wait(delay, options.signal);\n\n continue;\n }\n }\n\n // Should never reach here.\n throw lastError ?? new Error('Unknown fetch error.');\n}\n\nexport function _sseLineParser(): (line: string) => SseEvent | null {\n let currentEvent: Partial<SseEvent> | null = null;\n\n return (line: string): SseEvent | null => {\n // Blank line indicates dispatch.\n if (line.trim() === '') {\n if (currentEvent && typeof currentEvent.data === 'string') {\n const out: SseEvent = {\n data: currentEvent.data,\n event: currentEvent.event,\n id: currentEvent.id,\n retry: currentEvent.retry,\n };\n\n currentEvent = null;\n\n return out;\n }\n\n currentEvent = null;\n\n return null;\n }\n\n const colonIndex = line.indexOf(':');\n const field = colonIndex >= 0 ? line.slice(0, colonIndex) : line;\n let value = colonIndex >= 0 ? line.slice(colonIndex + 1) : '';\n\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n currentEvent = currentEvent ?? {};\n\n switch (field) {\n case 'data': {\n currentEvent.data = (currentEvent.data ? currentEvent.data + '\\n' : '') + value;\n break;\n }\n case 'event': {\n currentEvent.event = value;\n break;\n }\n case 'id': {\n currentEvent.id = value;\n break;\n }\n case 'retry': {\n const retry = Number(value);\n\n if (Number.isFinite(retry)) {\n currentEvent.retry = Math.floor(retry);\n break;\n }\n }\n }\n\n return null;\n };\n}\n\nexport interface JsonRequestOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n}\n\nexport async function fetchJson(input: RequestInfo | URL, options: JsonRequestOptions = {}): Promise<unknown> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? 'application/json',\n ...(options.headers ?? {}),\n };\n\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { method, headers, body }, options);\n\n if (!response.headers.get('content-type')?.includes('application/json')) {\n const text = await response.text();\n\n throw new HttpError('Expected application/json response.', response, text);\n }\n\n const data = (await response.json()) as unknown;\n\n return data;\n}\n\nexport function combineUrlPathnames(baseUrl: URL, pathname: string): URL {\n const baseUrlPathname = baseUrl.pathname;\n\n const newPath =\n baseUrlPathname.endsWith('/') && pathname.startsWith('/')\n ? baseUrlPathname + pathname.slice(1)\n : !baseUrlPathname.endsWith('/') && !pathname.startsWith('/')\n ? baseUrlPathname + '/' + pathname\n : baseUrlPathname + pathname;\n\n return new URL(newPath, baseUrl);\n}\n\nexport interface EventStreamOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n /**\n * When true, parse as SSE (Server-Sent Events);\n * otherwise, return newline-delimited chunks as strings.\n *\n * @default true\n */\n sse?: boolean;\n}\n\nexport interface SseEvent {\n data: string;\n event?: string;\n id?: string;\n retry?: number;\n}\n\n// Generic signature to narrow return type based on `sse` option\nexport function fetchEventStream<S extends boolean | undefined = true>(\n input: RequestInfo | URL,\n options?: Omit<EventStreamOptions, 'sse'> & { sse?: S },\n): S extends false ? AsyncGenerator<string> : AsyncGenerator<SseEvent>;\nexport async function* fetchEventStream(\n input: RequestInfo | URL,\n options: EventStreamOptions = {},\n): AsyncGenerator<SseEvent | string> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? (options.sse === false ? '*/*' : 'text/event-stream'),\n ...(options.headers ?? {}),\n };\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { body, headers, method }, options);\n\n if (!response.body) {\n throw new HttpError('Response body is not a readable stream.', response);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parse = _sseLineParser();\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n let lineEndIndex: number;\n\n while ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, lineEndIndex);\n buffer = buffer.slice(lineEndIndex + 1);\n\n if (options.sse === false) {\n if (line.length) {\n yield line;\n }\n } else {\n const event = parse(line);\n\n if (event) {\n yield event;\n }\n }\n }\n }\n\n if (options.sse === false && buffer.length) {\n yield buffer;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fetch-utilities.js","names":[],"sources":["../../src/transfer-service/fetch-utilities.ts"],"sourcesContent":["import { AbortedError, HttpError, isAbortedError, TimeoutError } from '../errors';\nimport type { Fetch } from '../types/utility-types';\nimport { wait } from './_utils';\n\nconst DEFAULT_BACKOFF_BASE_MS = 200;\nconst DEFAULT_BACKOFF_MAX_MS = 5_000;\nconst DEFAULT_RETRY_COUNT = 3;\n/**\n * Default HTTP methods to retry on.\n *\n * Only includes safe methods.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods#safe_idempotent_and_cacheable_request_methods\n */\nconst DEFAULT_RETRY_METHODS = ['GET', 'HEAD', 'OPTIONS', 'TRACE'];\n\nexport interface BackoffOptions {\n /** Base backoff in milliseconds */\n readonly baseMs?: number;\n /** Maximum backoff in milliseconds */\n readonly maxMs?: number;\n}\n\nexport interface RetryContext {\n /** Zero based attempt index */\n readonly attempt: number;\n /** Network or other thrown error */\n readonly error?: unknown;\n readonly init: RequestInit;\n readonly input: RequestInfo | URL;\n /** Failed response (non-2xx) */\n readonly response?: Response;\n}\n\nexport interface RetryOptions {\n readonly backoff?: BackoffOptions | ((ctx: RetryContext) => number);\n /**\n * Total number of retries to attempt.\n *\n * Default: {@link DEFAULT_RETRY_COUNT}\n */\n readonly retries?: number;\n /**\n * HTTP methods to retry on.\n *\n * Default: {@link DEFAULT_RETRY_METHODS}\n */\n readonly retryMethods?: string[];\n /**\n * Custom retry decider.\n */\n readonly retryOn?: (ctx: RetryContext) => boolean | Promise<boolean>;\n /**\n * Per attempt timeout in milliseconds.\n *\n * A `0` or `undefined` value means no timeout.\n */\n readonly timeoutMs?: number;\n}\n\nexport interface FetchWithRetryOptions extends RetryOptions {\n /**\n * Custom fetch implementation to use for the request.\n * @default globalThis.fetch\n */\n readonly fetch?: Fetch;\n /** Export abort. Applies to all attempts. */\n readonly signal?: AbortSignal;\n}\n\n/**\n * @internal\n *\n * Parses a Retry-After header value.\n *\n * @param retryAfter - The value of the Retry-After header.\n * @returns The number of milliseconds to wait before retrying, or null if the header is not present or invalid.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After\n */\nexport function _parseRetryAfterHeader(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const seconds = Number(retryAfter);\n\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return Math.floor(seconds) * 1_000;\n }\n\n const date = new Date(retryAfter);\n\n const delta = date.getTime() - Date.now();\n\n return Number.isFinite(delta) && delta > 0 ? delta : null;\n}\n\nexport function _exponentialBackoff(attempt: number, options: BackoffOptions = {}): number {\n const base = Math.max(1, Math.floor(options.baseMs ?? DEFAULT_BACKOFF_BASE_MS));\n const max = Math.max(base, Math.floor(options.maxMs ?? DEFAULT_BACKOFF_MAX_MS));\n\n const raw = Math.min(max, base * 2 ** attempt);\n\n // Add some jitter.\n return Math.floor(Math.random() * raw);\n}\n\nexport function _shouldRetry(ctx: RetryContext, retryMethods: string[]): boolean {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!retryMethods.includes(method)) {\n return false;\n }\n\n if (ctx.error) {\n if (ctx.error instanceof AbortedError) {\n return false;\n }\n\n return true;\n }\n\n const status = ctx.response?.status ?? 0;\n\n if (status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n}\n\nexport function _composeAbortSignals(\n external?: AbortSignal,\n timeoutMs?: number,\n): { signal: AbortSignal; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeout = false;\n\n const onExternalAbort = () => {\n controller.abort(external?.reason ?? new AbortedError());\n };\n\n if (external) {\n if (external.aborted) {\n controller.abort(external.reason ?? new AbortedError());\n } else {\n external.addEventListener('abort', onExternalAbort);\n }\n }\n\n if (timeoutMs && timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeout = true;\n controller.abort(new TimeoutError());\n }, timeoutMs);\n }\n\n const cleanup = () => {\n if (external) {\n external.removeEventListener('abort', onExternalAbort);\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n return {\n cleanup,\n signal: controller.signal,\n timedOut: () => didTimeout,\n };\n}\n\nexport function _resolveBackoffDelay(\n attempt: number,\n ctx: RetryContext,\n retryAfterMs: number | null,\n options?: RetryOptions,\n): number {\n if (retryAfterMs != null) {\n return retryAfterMs;\n }\n\n if (typeof options?.backoff === 'function') {\n return options.backoff(ctx);\n }\n\n return _exponentialBackoff(attempt, options?.backoff);\n}\n\nasync function _safeParseResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n try {\n return await response.clone().json();\n } catch {\n // Ignore\n }\n }\n\n try {\n return await response.clone().text();\n } catch {\n // Ignore\n }\n\n return undefined;\n}\n\nexport async function _fetchWithRetry(\n input: RequestInfo | URL,\n init: RequestInit = {},\n options: FetchWithRetryOptions = {},\n): Promise<Response> {\n const {\n fetch: customFetch,\n retries = DEFAULT_RETRY_COUNT,\n retryMethods = DEFAULT_RETRY_METHODS,\n retryOn = (ctx: RetryContext) => _shouldRetry(ctx, retryMethods),\n } = options;\n\n const fetchImpl: Fetch = customFetch ?? globalThis.fetch;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const { cleanup, signal, timedOut } = _composeAbortSignals(options.signal, options.timeoutMs);\n\n try {\n const response = await fetchImpl(input, { ...init, signal });\n\n if (response.ok) {\n cleanup();\n return response;\n }\n\n const ctx: RetryContext = {\n attempt,\n init,\n input,\n response,\n };\n\n const doRetry = await retryOn(ctx);\n\n if (!doRetry || attempt === retries) {\n // Try to extract error payload best-effort.\n // Do not throw if stream already consumed.\n let data: unknown;\n try {\n data = await _safeParseResponse(response);\n } catch {\n // Ignore\n }\n\n cleanup();\n\n throw new HttpError(`HTTP ${response.status} ${response.statusText}`, response, data);\n }\n\n const retryAfterMs = _parseRetryAfterHeader(response.headers.get('retry-after'));\n const delay = _resolveBackoffDelay(attempt, ctx, retryAfterMs, options);\n\n cleanup();\n\n await wait(delay, options.signal);\n\n continue;\n } catch (error: unknown) {\n cleanup();\n\n lastError = error;\n\n const isAbortError = isAbortedError(error);\n\n const ctx: RetryContext = {\n attempt,\n error,\n init,\n input,\n };\n\n const doRetry = !isAbortError && (await retryOn(ctx));\n\n if (!doRetry || attempt === retries) {\n if (timedOut()) {\n throw new TimeoutError();\n }\n\n if (isAbortError) {\n throw new AbortedError(error.message ?? 'Aborted');\n }\n\n throw error;\n }\n\n const delay = _resolveBackoffDelay(attempt, ctx, null, options);\n\n await wait(delay, options.signal);\n\n continue;\n }\n }\n\n // Should never reach here.\n throw lastError ?? new Error('Unknown fetch error.');\n}\n\nexport function _sseLineParser(): (line: string) => SseEvent | null {\n let currentEvent: Partial<SseEvent> | null = null;\n\n return (line: string): SseEvent | null => {\n // Blank line indicates dispatch.\n if (line.trim() === '') {\n if (currentEvent && typeof currentEvent.data === 'string') {\n const out: SseEvent = {\n data: currentEvent.data,\n event: currentEvent.event,\n id: currentEvent.id,\n retry: currentEvent.retry,\n };\n\n currentEvent = null;\n\n return out;\n }\n\n currentEvent = null;\n\n return null;\n }\n\n const colonIndex = line.indexOf(':');\n const field = colonIndex >= 0 ? line.slice(0, colonIndex) : line;\n let value = colonIndex >= 0 ? line.slice(colonIndex + 1) : '';\n\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n currentEvent = currentEvent ?? {};\n\n switch (field) {\n case 'data': {\n currentEvent.data = (currentEvent.data ? currentEvent.data + '\\n' : '') + value;\n break;\n }\n case 'event': {\n currentEvent.event = value;\n break;\n }\n case 'id': {\n currentEvent.id = value;\n break;\n }\n case 'retry': {\n const retry = Number(value);\n\n if (Number.isFinite(retry)) {\n currentEvent.retry = Math.floor(retry);\n break;\n }\n }\n }\n\n return null;\n };\n}\n\nexport interface JsonRequestOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n}\n\nexport async function fetchJson(input: RequestInfo | URL, options: JsonRequestOptions = {}): Promise<unknown> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? 'application/json',\n ...(options.headers ?? {}),\n };\n\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { method, headers, body }, options);\n\n if (!response.headers.get('content-type')?.includes('application/json')) {\n const text = await response.text();\n\n throw new HttpError('Expected application/json response.', response, text);\n }\n\n const data = (await response.json()) as unknown;\n\n return data;\n}\n\nexport function combineUrlPathnames(baseUrl: URL, pathname: string): URL {\n const baseUrlPathname = baseUrl.pathname;\n\n const newPath =\n baseUrlPathname.endsWith('/') && pathname.startsWith('/')\n ? baseUrlPathname + pathname.slice(1)\n : !baseUrlPathname.endsWith('/') && !pathname.startsWith('/')\n ? baseUrlPathname + '/' + pathname\n : baseUrlPathname + pathname;\n\n return new URL(newPath, baseUrl);\n}\n\nexport interface EventStreamOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n /**\n * When true, parse as SSE (Server-Sent Events);\n * otherwise, return newline-delimited chunks as strings.\n *\n * @default true\n */\n sse?: boolean;\n}\n\nexport interface SseEvent {\n data: string;\n event?: string;\n id?: string;\n retry?: number;\n}\n\n// Generic signature to narrow return type based on `sse` option\nexport function fetchEventStream<S extends boolean | undefined = true>(\n input: RequestInfo | URL,\n options?: Omit<EventStreamOptions, 'sse'> & { sse?: S },\n): S extends false ? AsyncGenerator<string> : AsyncGenerator<SseEvent>;\nexport async function* fetchEventStream(\n input: RequestInfo | URL,\n options: EventStreamOptions = {},\n): AsyncGenerator<SseEvent | string> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? (options.sse === false ? '*/*' : 'text/event-stream'),\n ...(options.headers ?? {}),\n };\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { body, headers, method }, options);\n\n if (!response.body) {\n throw new HttpError('Response body is not a readable stream.', response);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parse = _sseLineParser();\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n let lineEndIndex: number;\n\n while ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, lineEndIndex);\n buffer = buffer.slice(lineEndIndex + 1);\n\n if (options.sse === false) {\n if (line.length) {\n yield line;\n }\n } else {\n const event = parse(line);\n\n if (event) {\n yield event;\n }\n }\n }\n }\n\n if (options.sse === false && buffer.length) {\n yield buffer;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore\n }\n }\n}\n"],"mappings":"oIAIA,MASM,EAAwB,CAAC,MAAO,OAAQ,UAAW,QAAQ,CAkEjE,SAAgB,EAAuB,EAA0C,CAC/E,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,EAAU,OAAO,EAAW,CAElC,GAAI,CAAC,OAAO,MAAM,EAAQ,EAAI,GAAW,EACvC,OAAO,KAAK,MAAM,EAAQ,CAAG,IAK/B,IAAM,EAFO,IAAI,KAAK,EAAW,CAEd,SAAS,CAAG,KAAK,KAAK,CAEzC,OAAO,OAAO,SAAS,EAAM,EAAI,EAAQ,EAAI,EAAQ,KAGvD,SAAgB,EAAoB,EAAiB,EAA0B,EAAE,CAAU,CACzF,IAAM,EAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,QAAU,IAAwB,CAAC,CACzE,EAAM,KAAK,IAAI,EAAM,KAAK,MAAM,EAAQ,OAAS,IAAuB,CAAC,CAEzE,EAAM,KAAK,IAAI,EAAK,EAAO,GAAK,EAAQ,CAG9C,OAAO,KAAK,MAAM,KAAK,QAAQ,CAAG,EAAI,CAGxC,SAAgB,EAAa,EAAmB,EAAiC,CAC/E,IAAM,GAAU,EAAI,KAAK,QAAU,OAAO,aAAa,CAEvD,GAAI,CAAC,EAAa,SAAS,EAAO,CAChC,MAAO,GAGT,GAAI,EAAI,MAKN,MAJA,EAAI,EAAI,iBAAiB,GAO3B,IAAM,EAAS,EAAI,UAAU,QAAU,EAMvC,OAJI,IAAW,KAAO,IAAW,KAAO,IAAW,KAAQ,GAAU,KAAO,GAAU,IAOxF,SAAgB,EACd,EACA,EACuE,CACvE,IAAM,EAAa,IAAI,gBAEnB,EACA,EAAa,GAEX,MAAwB,CAC5B,EAAW,MAAM,GAAU,QAAU,IAAI,EAAe,EA4B1D,OAzBI,IACE,EAAS,QACX,EAAW,MAAM,EAAS,QAAU,IAAI,EAAe,CAEvD,EAAS,iBAAiB,QAAS,EAAgB,EAInD,GAAa,EAAY,IAC3B,EAAY,eAAiB,CAC3B,EAAa,GACb,EAAW,MAAM,IAAI,EAAe,EACnC,EAAU,EAaR,CACL,YAXoB,CAChB,GACF,EAAS,oBAAoB,QAAS,EAAgB,CAGpD,GACF,aAAa,EAAU,EAMzB,OAAQ,EAAW,OACnB,aAAgB,EACjB,CAGH,SAAgB,EACd,EACA,EACA,EACA,EACQ,CASR,OARI,IAIA,OAAO,GAAS,SAAY,WACvB,EAAQ,QAAQ,EAAI,CAGtB,EAAoB,EAAS,GAAS,QAAQ,EAGvD,eAAe,EAAmB,EAAsC,CAGtE,IAFoB,EAAS,QAAQ,IAAI,eAAe,EAAI,IAE5C,SAAS,mBAAmB,CAC1C,GAAI,CACF,OAAO,MAAM,EAAS,OAAO,CAAC,MAAM,MAC9B,EAKV,GAAI,CACF,OAAO,MAAM,EAAS,OAAO,CAAC,MAAM,MAC9B,GAOV,eAAsB,EACpB,EACA,EAAoB,EAAE,CACtB,EAAiC,EAAE,CAChB,CACnB,GAAM,CACJ,MAAO,EACP,UAAU,EACV,eAAe,EACf,UAAW,GAAsB,EAAa,EAAK,EAAa,EAC9D,EAEE,EAAmB,GAAe,WAAW,MAE/C,EAEJ,IAAK,IAAI,EAAU,EAAG,GAAW,EAAS,IAAW,CACnD,GAAM,CAAE,UAAS,SAAQ,YAAa,EAAqB,EAAQ,OAAQ,EAAQ,UAAU,CAE7F,GAAI,CACF,IAAM,EAAW,MAAM,EAAU,EAAO,CAAE,GAAG,EAAM,SAAQ,CAAC,CAE5D,GAAI,EAAS,GAEX,OADA,GAAS,CACF,EAGT,IAAM,EAAoB,CACxB,UACA,OACA,QACA,WACD,CAID,GAAI,CAFY,MAAM,EAAQ,EAAI,EAElB,IAAY,EAAS,CAGnC,IAAI,EACJ,GAAI,CACF,EAAO,MAAM,EAAmB,EAAS,MACnC,EAMR,MAFA,GAAS,CAEH,IAAI,EAAU,QAAQ,EAAS,OAAO,GAAG,EAAS,aAAc,EAAU,EAAK,CAGvF,IAAM,EAAe,EAAuB,EAAS,QAAQ,IAAI,cAAc,CAAC,CAC1E,EAAQ,EAAqB,EAAS,EAAK,EAAc,EAAQ,CAEvE,GAAS,CAET,MAAM,EAAK,EAAO,EAAQ,OAAO,CAEjC,eACO,EAAgB,CACvB,GAAS,CAET,EAAY,EAEZ,IAAM,EAAe,EAAe,EAAM,CAEpC,EAAoB,CACxB,UACA,QACA,OACA,QACD,CAID,GAAI,EAFY,CAAC,GAAiB,MAAM,EAAQ,EAAI,GAEpC,IAAY,EAS1B,MARI,GAAU,CACN,IAAI,EAGR,EACI,IAAI,EAAa,EAAM,SAAW,UAAU,CAG9C,EAKR,MAAM,EAFQ,EAAqB,EAAS,EAAK,KAAM,EAAQ,CAE7C,EAAQ,OAAO,CAEjC,UAKJ,MAAM,GAAiB,MAAM,uBAAuB,CAGtD,SAAgB,GAAoD,CAClE,IAAI,EAAyC,KAE7C,MAAQ,IAAkC,CAExC,GAAI,EAAK,MAAM,GAAK,GAAI,CACtB,GAAI,GAAgB,OAAO,EAAa,MAAS,SAAU,CACzD,IAAM,EAAgB,CACpB,KAAM,EAAa,KACnB,MAAO,EAAa,MACpB,GAAI,EAAa,GACjB,MAAO,EAAa,MACrB,CAID,MAFA,GAAe,KAER,EAKT,MAFA,GAAe,KAER,KAGT,IAAM,EAAa,EAAK,QAAQ,IAAI,CAC9B,EAAQ,GAAc,EAAI,EAAK,MAAM,EAAG,EAAW,CAAG,EACxD,EAAQ,GAAc,EAAI,EAAK,MAAM,EAAa,EAAE,CAAG,GAQ3D,OANI,EAAM,WAAW,IAAI,GACvB,EAAQ,EAAM,MAAM,EAAE,EAGxB,IAA+B,EAAE,CAEzB,EAAR,CACE,IAAK,OACH,EAAa,MAAQ,EAAa,KAAO,EAAa,KAAO;EAAO,IAAM,EAC1E,MAEF,IAAK,QACH,EAAa,MAAQ,EACrB,MAEF,IAAK,KACH,EAAa,GAAK,EAClB,MAEF,IAAK,QAAS,CACZ,IAAM,EAAQ,OAAO,EAAM,CAE3B,GAAI,OAAO,SAAS,EAAM,CAAE,CAC1B,EAAa,MAAQ,KAAK,MAAM,EAAM,CACtC,QAKN,OAAO,MAYX,eAAsB,EAAU,EAA0B,EAA8B,EAAE,CAAoB,CAC5G,IAAM,EAAkC,CACtC,OAAQ,EAAQ,QAAU,mBAC1B,GAAI,EAAQ,SAAW,EAAE,CAC1B,CAEK,EAAO,EAAQ,KACf,EAAU,GAA+B,KACzC,GAAU,EAAQ,SAAW,EAAU,OAAS,QAAQ,aAAa,CAE3E,GAAI,EAAS,CACX,IAAM,EAAc,EAAQ,aAAe,mBAE3C,AACE,EAAQ,kBAAkB,EAI9B,IAAM,EAAW,MAAM,EAAgB,EAAO,CAAE,SAAQ,UAAS,OAAM,CAAE,EAAQ,CAEjF,GAAI,CAAC,EAAS,QAAQ,IAAI,eAAe,EAAE,SAAS,mBAAmB,CAGrE,MAAM,IAAI,EAAU,sCAAuC,EAF9C,MAAM,EAAS,MAAM,CAEwC,CAK5E,OAFc,MAAM,EAAS,MAAM,CAKrC,SAAgB,EAAoB,EAAc,EAAuB,CACvE,IAAM,EAAkB,EAAQ,SAE1B,EACJ,EAAgB,SAAS,IAAI,EAAI,EAAS,WAAW,IAAI,CACrD,EAAkB,EAAS,MAAM,EAAE,CACnC,CAAC,EAAgB,SAAS,IAAI,EAAI,CAAC,EAAS,WAAW,IAAI,CAC3D,EAAkB,IAAM,EACxB,EAAkB,EAExB,OAAO,IAAI,IAAI,EAAS,EAAQ,CA8BlC,eAAuB,EACrB,EACA,EAA8B,EAAE,CACG,CACnC,IAAM,EAAkC,CACtC,OAAQ,EAAQ,SAAW,EAAQ,MAAQ,GAAQ,MAAQ,qBAC3D,GAAI,EAAQ,SAAW,EAAE,CAC1B,CACK,EAAO,EAAQ,KACf,EAAU,GAA+B,KACzC,GAAU,EAAQ,SAAW,EAAU,OAAS,QAAQ,aAAa,CAE3E,GAAI,EAAS,CACX,IAAM,EAAc,EAAQ,aAAe,mBAE3C,AACE,EAAQ,kBAAkB,EAI9B,IAAM,EAAW,MAAM,EAAgB,EAAO,CAAE,OAAM,UAAS,SAAQ,CAAE,EAAQ,CAEjF,GAAI,CAAC,EAAS,KACZ,MAAM,IAAI,EAAU,0CAA2C,EAAS,CAG1E,IAAM,EAAS,EAAS,KAAK,WAAW,CAClC,EAAU,IAAI,YACd,EAAQ,GAAgB,CAE1B,EAAS,GAEb,GAAI,CACF,OAAa,CACX,GAAM,CAAE,OAAM,SAAU,MAAM,EAAO,MAAM,CAE3C,GAAI,EACF,MAGF,GAAU,EAAQ,OAAO,EAAO,CAAE,OAAQ,GAAM,CAAC,CAEjD,IAAI,EAEJ,MAAQ,EAAe,EAAO,QAAQ;EAAK,GAAK,GAAG,CACjD,IAAM,EAAO,EAAO,MAAM,EAAG,EAAa,CAG1C,GAFA,EAAS,EAAO,MAAM,EAAe,EAAE,CAEnC,EAAQ,MAAQ,GACd,EAAK,SACP,MAAM,OAEH,CACL,IAAM,EAAQ,EAAM,EAAK,CAErB,IACF,MAAM,KAMV,EAAQ,MAAQ,IAAS,EAAO,SAClC,MAAM,UAEA,CACR,GAAI,CACF,EAAO,aAAa,MACd"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`../../../../constants.cjs`);function
|
|
1
|
+
const e=require(`../../../../constants.cjs`),t=require(`../../../../utils/asset-id.cjs`),n=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function r({config:r}){return async({sourceAsset:i,sourceChainId:a,targetChainId:o,limit:s,page:c})=>{let l=s??100,u=c??1;return a!==r.sourceChain||o!==r.targetChain||i.type!==e.TokenType.NATIVE?n({assets:[],limit:l,page:u}):n({assets:[{...r.targetAsset,id:t.getAssetId(o,r.targetAsset),bridgeProviders:[e.ServiceType.LOMBARD_BTC_TO_BTCB]}],limit:l,page:u})}}exports.getBridgeableAssetsFactory=r;
|
|
2
2
|
//# sourceMappingURL=get-bridgeable-assets.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bridgeable-assets.cjs","names":["TokenType","ServiceType"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../../types/service';\nimport
|
|
1
|
+
{"version":3,"file":"get-bridgeable-assets.cjs","names":["TokenType","getAssetId","ServiceType"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../../types/service';\nimport { getAssetId } from '../../../../utils/asset-id';\nimport type { BtcToBtcbConfig } from '../../types';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: GetBridgeableAssetsResult['assets'];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n config,\n}: {\n config: BtcToBtcbConfig;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (\n sourceChainId !== config.sourceChain ||\n targetChainId !== config.targetChain ||\n sourceAsset.type !== TokenType.NATIVE\n ) {\n return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n }\n\n return paginateAssets({\n assets: [\n {\n ...config.targetAsset,\n id: getAssetId(targetChainId, config.targetAsset),\n bridgeProviders: [ServiceType.LOMBARD_BTC_TO_BTCB],\n },\n ],\n limit: pageLimit,\n page: currentPage,\n });\n };\n}\n"],"mappings":"yFAQM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,UAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAU5B,OAPE,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAASA,EAAAA,UAAU,OAExB,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAGrE,EAAe,CACpB,OAAQ,CACN,CACE,GAAG,EAAO,YACV,GAAIC,EAAAA,WAAW,EAAe,EAAO,YAAY,CACjD,gBAAiB,CAACC,EAAAA,YAAY,oBAAoB,CACnD,CACF,CACD,MAAO,EACP,KAAM,EACP,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ServiceType as e,TokenType as t}from"../../../../constants.js";
|
|
1
|
+
import{ServiceType as e,TokenType as t}from"../../../../constants.js";import{getAssetId as n}from"../../../../utils/asset-id.js";const r=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function i({config:i}){return async({sourceAsset:a,sourceChainId:o,targetChainId:s,limit:c,page:l})=>{let u=c??100,d=l??1;return o!==i.sourceChain||s!==i.targetChain||a.type!==t.NATIVE?r({assets:[],limit:u,page:d}):r({assets:[{...i.targetAsset,id:n(s,i.targetAsset),bridgeProviders:[e.LOMBARD_BTC_TO_BTCB]}],limit:u,page:d})}}export{i as getBridgeableAssetsFactory};
|
|
2
2
|
//# sourceMappingURL=get-bridgeable-assets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../../types/service';\nimport
|
|
1
|
+
{"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../../types/service';\nimport { getAssetId } from '../../../../utils/asset-id';\nimport type { BtcToBtcbConfig } from '../../types';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: GetBridgeableAssetsResult['assets'];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n config,\n}: {\n config: BtcToBtcbConfig;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (\n sourceChainId !== config.sourceChain ||\n targetChainId !== config.targetChain ||\n sourceAsset.type !== TokenType.NATIVE\n ) {\n return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n }\n\n return paginateAssets({\n assets: [\n {\n ...config.targetAsset,\n id: getAssetId(targetChainId, config.targetAsset),\n bridgeProviders: [ServiceType.LOMBARD_BTC_TO_BTCB],\n },\n ],\n limit: pageLimit,\n page: currentPage,\n });\n };\n}\n"],"mappings":"iIAKA,MAGM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,UAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAU5B,OAPE,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAAS,EAAU,OAExB,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAGrE,EAAe,CACpB,OAAQ,CACN,CACE,GAAG,EAAO,YACV,GAAI,EAAW,EAAe,EAAO,YAAY,CACjD,gBAAiB,CAAC,EAAY,oBAAoB,CACnD,CACF,CACD,MAAO,EACP,KAAM,EACP,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`../../../../constants.cjs`);function
|
|
1
|
+
const e=require(`../../../../constants.cjs`),t=require(`../../../../utils/asset-id.cjs`),n=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function r({config:r}){return async({sourceAsset:i,sourceChainId:a,targetChainId:o,limit:s,page:c})=>{let l=s??100,u=c??1;return a!==r.sourceChain||o!==r.targetChain||i.type!==e.TokenType.ERC20||i.address.toLowerCase()!==r.sourceAsset.address.toLowerCase()?n({assets:[],limit:l,page:u}):n({assets:[{...r.targetAsset,id:t.getAssetId(o,r.targetAsset),bridgeProviders:[e.ServiceType.LOMBARD_BTCB_TO_BTC]}],limit:l,page:u})}}exports.getBridgeableAssetsFactory=r;
|
|
2
2
|
//# sourceMappingURL=get-bridgeable-assets.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bridgeable-assets.cjs","names":["TokenType","ServiceType"],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../../types/service';\nimport
|
|
1
|
+
{"version":3,"file":"get-bridgeable-assets.cjs","names":["TokenType","getAssetId","ServiceType"],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../../types/service';\nimport { getAssetId } from '../../../../utils/asset-id';\nimport type { BtcbToBtcConfig } from '../../types';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: GetBridgeableAssetsResult['assets'];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n config,\n}: {\n config: BtcbToBtcConfig;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (\n sourceChainId !== config.sourceChain ||\n targetChainId !== config.targetChain ||\n sourceAsset.type !== TokenType.ERC20 ||\n sourceAsset.address.toLowerCase() !== config.sourceAsset.address.toLowerCase()\n ) {\n return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n }\n\n return paginateAssets({\n assets: [\n {\n ...config.targetAsset,\n id: getAssetId(targetChainId, config.targetAsset),\n bridgeProviders: [ServiceType.LOMBARD_BTCB_TO_BTC],\n },\n ],\n limit: pageLimit,\n page: currentPage,\n });\n };\n}\n"],"mappings":"yFAQM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,UAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAW5B,OARE,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAASA,EAAAA,UAAU,OAC/B,EAAY,QAAQ,aAAa,GAAK,EAAO,YAAY,QAAQ,aAAa,CAEvE,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAGrE,EAAe,CACpB,OAAQ,CACN,CACE,GAAG,EAAO,YACV,GAAIC,EAAAA,WAAW,EAAe,EAAO,YAAY,CACjD,gBAAiB,CAACC,EAAAA,YAAY,oBAAoB,CACnD,CACF,CACD,MAAO,EACP,KAAM,EACP,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ServiceType as e,TokenType as t}from"../../../../constants.js";
|
|
1
|
+
import{ServiceType as e,TokenType as t}from"../../../../constants.js";import{getAssetId as n}from"../../../../utils/asset-id.js";const r=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function i({config:i}){return async({sourceAsset:a,sourceChainId:o,targetChainId:s,limit:c,page:l})=>{let u=c??100,d=l??1;return o!==i.sourceChain||s!==i.targetChain||a.type!==t.ERC20||a.address.toLowerCase()!==i.sourceAsset.address.toLowerCase()?r({assets:[],limit:u,page:d}):r({assets:[{...i.targetAsset,id:n(s,i.targetAsset),bridgeProviders:[e.LOMBARD_BTCB_TO_BTC]}],limit:u,page:d})}}export{i as getBridgeableAssetsFactory};
|
|
2
2
|
//# sourceMappingURL=get-bridgeable-assets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../../types/service';\nimport
|
|
1
|
+
{"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../../types/service';\nimport { getAssetId } from '../../../../utils/asset-id';\nimport type { BtcbToBtcConfig } from '../../types';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: GetBridgeableAssetsResult['assets'];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n config,\n}: {\n config: BtcbToBtcConfig;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (\n sourceChainId !== config.sourceChain ||\n targetChainId !== config.targetChain ||\n sourceAsset.type !== TokenType.ERC20 ||\n sourceAsset.address.toLowerCase() !== config.sourceAsset.address.toLowerCase()\n ) {\n return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n }\n\n return paginateAssets({\n assets: [\n {\n ...config.targetAsset,\n id: getAssetId(targetChainId, config.targetAsset),\n bridgeProviders: [ServiceType.LOMBARD_BTCB_TO_BTC],\n },\n ],\n limit: pageLimit,\n page: currentPage,\n });\n };\n}\n"],"mappings":"iIAKA,MAGM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,UAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAW5B,OARE,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAAS,EAAU,OAC/B,EAAY,QAAQ,aAAa,GAAK,EAAO,YAAY,QAAQ,aAAa,CAEvE,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAGrE,EAAe,CACpB,OAAQ,CACN,CACE,GAAG,EAAO,YACV,GAAI,EAAW,EAAe,EAAO,YAAY,CACjD,gBAAiB,CAAC,EAAY,oBAAoB,CACnD,CACF,CACD,MAAO,EACP,KAAM,EACP,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../../utils/caip.cjs`),n=require(
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../../utils/caip.cjs`),n=require(`../../_utils.cjs`),r=require(`../../../_utils/chain.cjs`),i=require(`../../_evm-gas.cjs`),a=require(`../../_evm-errors.cjs`),o=require(`../_api.cjs`),s=require(`../_utils.cjs`),c=require(`../_type-guards.cjs`),l=require(`../../../utils/solana.cjs`);let u=require(`viem`),d=require(`@solana/kit`);function f(t){return async(n,i)=>{if(r.isEvmNamespace(n.sourceChain.chainId))return await p(n,i,t);if(r.isSolanaNamespace(n.sourceChain.chainId))return await m(n,i,t);throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Unsupported source chain namespace for estimateNativeFee: ${n.sourceChain.chainId}`)}}async function p(r,l,{apiOptions:d,appId:f}){if(!(0,u.isAddress)(r.fromAddress))throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Invalid fromAddress: ${r.fromAddress}`);let p=n.getEvmClientForChain({chain:r.sourceChain}),m=s.assetToAddressString(r.assetIn,r.sourceChain.chainId);if(!(0,u.isAddress)(m))throw new e.SdkError(e.ErrorReason.INVALID_PARAMS,e.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address. Can not call estimateGas.`});let g=s.isTokenAddressNative(m),_=r.sourceChain.chainId.toLowerCase()!==r.targetChain.chainId.toLowerCase(),v=r.amountIn+s.getAdditiveSourceAssetFeeAmount(r),y=0n;if(!g){let n,{address:i}=await o.markrGetSpenderAddress(d,{chainId:t.caip2ToEip155ChainId(r.sourceChain.chainId),crossChainSwap:_,quoteId:r.id});try{n=await p.readContract({address:m,abi:u.erc20Abi,functionName:`allowance`,args:[r.fromAddress,i]})}catch(t){throw new e.SdkError(`Error during allowance check`,e.ErrorCode.VIEM_ERROR,{cause:t,details:`Failed to read ERC20 allowance for Markr spender.`})}n<v&&(y=await a.estimateGasWithRevert(p,{account:r.fromAddress,to:m,data:(0,u.encodeFunctionData)({abi:u.erc20Abi,functionName:`approve`,args:[i,v]})},u.erc20Abi,`Failed to estimate gas for ERC20 approval transaction.`))}let b=y>0n,x=s.calculateMarkrMinimumAmountOut({amountOut:r.amountOut,assetOut:r.assetOut,slippageBps:r.slippageBps}),S=await o.markrSwap(d,{amountIn:r.amountIn.toString(),appId:f,minAmountOut:x.toString(),tokenIn:m,tokenOut:s.assetToAddressString(r.assetOut,r.targetChain.chainId),uuid:r.id});if(!c.isEvmSwapResponse(S))throw new e.SdkError(e.ErrorReason.CHAIN_NOT_SUPPORTED,e.ErrorCode.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response with chainType ${S.chainType}.`});let C=0n;C=b?r.gasEstimate?r.gasEstimate:r.fees.filter(e=>e.type===`gas`&&e.chainId===r.sourceChain.chainId).reduce((e,t)=>e+t.amount,0n)||700000n:await h({crossChain:_,fromAddress:r.fromAddress,sourceClient:p,swap:S});let w=await i.estimateEvmFeesPerGas(p,r.sourceChain,l?.overrides?.feeRateTier),T=l?.overrides?.maxFeePerGas??w.maxFeePerGas,E=l?.overrides?.maxPriorityFeePerGas??w.maxPriorityFeePerGas,D=(C+y)*T;return{asset:r.sourceChain.networkToken,totalFee:n.applyFeeUnitsBpsMargin(D,l?.feeUnitsMarginBps),totalFeeWithoutMargin:D,meta:{approvalFee:b?y*T:void 0,maxFeePerGas:T,maxPriorityFeePerGas:E}}}async function m(t,r,{apiOptions:i,appId:a}){let u=s.assetToAddressString(t.assetIn,t.sourceChain.chainId);if(!(0,d.isAddress)(u))throw new e.SdkError(e.ErrorReason.INVALID_PARAMS,e.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid Solana address. Can not call estimateGas.`});let f=s.getAdditiveSourceNativeAssetFeeAmount(t),p=t.amountIn+f,m=s.calculateMarkrMinimumAmountOut({amountOut:t.amountOut,assetOut:t.assetOut,slippageBps:t.slippageBps}),h=await o.markrSwap(i,{amountIn:t.amountIn.toString(),appId:a,minAmountOut:m.toString(),tokenIn:u,tokenOut:s.assetToAddressString(t.assetOut,t.targetChain.chainId),userPublicKey:t.fromAddress,uuid:t.id});if(!c.isSolanaSwapResponse(h))throw new e.SdkError(e.ErrorReason.CHAIN_NOT_SUPPORTED,e.ErrorCode.INVALID_PARAMS,{details:`Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.`});let{baseFeeLamports:g,priorityFeeLamports:_,...v}=await l.estimateSolanaFee(n.getSolanaRpcForChain({chain:t.sourceChain}),h.swapTransaction),y=v.feePayerBalanceDiffLamports-p;return{asset:t.sourceChain.networkToken,totalFee:n.applyFeeUnitsBpsMargin(y,r?.feeUnitsMarginBps),totalFeeWithoutMargin:y,meta:{...v,baseFee:g,priorityFee:_}}}async function h({crossChain:e,feeUnitsMarginBps:t,fromAddress:r,sourceClient:i,swap:o}){let c=await s.getMarkrSwapWrapperAbi(e);return n.applyFeeUnitsBpsMargin(await a.estimateGasWithRevert(i,{account:r,to:o.to,data:o.data,value:o.value},c,`Failed to estimate gas for Markr swap transaction.`),t)}exports._estimateGasFromSwapResponse=h,exports.estimateNativeFeeFactory=f;
|
|
2
2
|
//# sourceMappingURL=estimate-native-fee.cjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ErrorCode as e,ErrorReason as t,InvalidParamsError as n,SdkError as r}from"../../../errors.js";import{caip2ToEip155ChainId as i}from"../../../utils/caip.js";import{
|
|
1
|
+
import{ErrorCode as e,ErrorReason as t,InvalidParamsError as n,SdkError as r}from"../../../errors.js";import{caip2ToEip155ChainId as i}from"../../../utils/caip.js";import{applyFeeUnitsBpsMargin as a,getEvmClientForChain as o,getSolanaRpcForChain as s}from"../../_utils.js";import{isEvmNamespace as c,isSolanaNamespace as l}from"../../../_utils/chain.js";import{estimateEvmFeesPerGas as u}from"../../_evm-gas.js";import{estimateGasWithRevert as d}from"../../_evm-errors.js";import{markrGetSpenderAddress as f,markrSwap as p}from"../_api.js";import{assetToAddressString as m,calculateMarkrMinimumAmountOut as h,getAdditiveSourceAssetFeeAmount as g,getAdditiveSourceNativeAssetFeeAmount as _,getMarkrSwapWrapperAbi as v,isTokenAddressNative as y}from"../_utils.js";import{isEvmSwapResponse as b,isSolanaSwapResponse as x}from"../_type-guards.js";import{estimateSolanaFee as S}from"../../../utils/solana.js";import{encodeFunctionData as C,erc20Abi as w,isAddress as T}from"viem";import{isAddress as E}from"@solana/kit";function D(e){return async(r,i)=>{if(c(r.sourceChain.chainId))return await O(r,i,e);if(l(r.sourceChain.chainId))return await k(r,i,e);throw new n(t.INVALID_PARAMS,`Unsupported source chain namespace for estimateNativeFee: ${r.sourceChain.chainId}`)}}async function O(s,c,{apiOptions:l,appId:_}){if(!T(s.fromAddress))throw new n(t.INVALID_PARAMS,`Invalid fromAddress: ${s.fromAddress}`);let v=o({chain:s.sourceChain}),x=m(s.assetIn,s.sourceChain.chainId);if(!T(x))throw new r(t.INVALID_PARAMS,e.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address. Can not call estimateGas.`});let S=y(x),E=s.sourceChain.chainId.toLowerCase()!==s.targetChain.chainId.toLowerCase(),D=s.amountIn+g(s),O=0n;if(!S){let t,{address:n}=await f(l,{chainId:i(s.sourceChain.chainId),crossChainSwap:E,quoteId:s.id});try{t=await v.readContract({address:x,abi:w,functionName:`allowance`,args:[s.fromAddress,n]})}catch(t){throw new r(`Error during allowance check`,e.VIEM_ERROR,{cause:t,details:`Failed to read ERC20 allowance for Markr spender.`})}t<D&&(O=await d(v,{account:s.fromAddress,to:x,data:C({abi:w,functionName:`approve`,args:[n,D]})},w,`Failed to estimate gas for ERC20 approval transaction.`))}let k=O>0n,j=h({amountOut:s.amountOut,assetOut:s.assetOut,slippageBps:s.slippageBps}),M=await p(l,{amountIn:s.amountIn.toString(),appId:_,minAmountOut:j.toString(),tokenIn:x,tokenOut:m(s.assetOut,s.targetChain.chainId),uuid:s.id});if(!b(M))throw new r(t.CHAIN_NOT_SUPPORTED,e.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response with chainType ${M.chainType}.`});let N=0n;N=k?s.gasEstimate?s.gasEstimate:s.fees.filter(e=>e.type===`gas`&&e.chainId===s.sourceChain.chainId).reduce((e,t)=>e+t.amount,0n)||700000n:await A({crossChain:E,fromAddress:s.fromAddress,sourceClient:v,swap:M});let P=await u(v,s.sourceChain,c?.overrides?.feeRateTier),F=c?.overrides?.maxFeePerGas??P.maxFeePerGas,I=c?.overrides?.maxPriorityFeePerGas??P.maxPriorityFeePerGas,L=(N+O)*F;return{asset:s.sourceChain.networkToken,totalFee:a(L,c?.feeUnitsMarginBps),totalFeeWithoutMargin:L,meta:{approvalFee:k?O*F:void 0,maxFeePerGas:F,maxPriorityFeePerGas:I}}}async function k(n,i,{apiOptions:o,appId:c}){let l=m(n.assetIn,n.sourceChain.chainId);if(!E(l))throw new r(t.INVALID_PARAMS,e.INVALID_PARAMS,{details:`assetIn address is not a valid Solana address. Can not call estimateGas.`});let u=_(n),d=n.amountIn+u,f=h({amountOut:n.amountOut,assetOut:n.assetOut,slippageBps:n.slippageBps}),g=await p(o,{amountIn:n.amountIn.toString(),appId:c,minAmountOut:f.toString(),tokenIn:l,tokenOut:m(n.assetOut,n.targetChain.chainId),userPublicKey:n.fromAddress,uuid:n.id});if(!x(g))throw new r(t.CHAIN_NOT_SUPPORTED,e.INVALID_PARAMS,{details:`Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.`});let{baseFeeLamports:v,priorityFeeLamports:y,...b}=await S(s({chain:n.sourceChain}),g.swapTransaction),C=b.feePayerBalanceDiffLamports-d;return{asset:n.sourceChain.networkToken,totalFee:a(C,i?.feeUnitsMarginBps),totalFeeWithoutMargin:C,meta:{...b,baseFee:v,priorityFee:y}}}async function A({crossChain:e,feeUnitsMarginBps:t,fromAddress:n,sourceClient:r,swap:i}){let o=await v(e);return a(await d(r,{account:n,to:i.to,data:i.data,value:i.value},o,`Failed to estimate gas for Markr swap transaction.`),t)}export{A as _estimateGasFromSwapResponse,D as estimateNativeFeeFactory};
|
|
2
2
|
//# sourceMappingURL=estimate-native-fee.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`../../../constants.cjs`),t=require(`../_utils.cjs`);function
|
|
1
|
+
const e=require(`../../../constants.cjs`),t=require(`../../../utils/asset-id.cjs`),n=require(`../_utils.cjs`);function r({getTargetChainAssets:r,supportedChains:i}){return async({sourceChainId:a,targetChainId:o,search:s,limit:c,page:l})=>{let u=l??1;if(!n.isRouteSupported(i,a,o))return{assets:[],meta:{currentPage:u,hasMore:!1}};let d=await r({search:s,limit:c??100,page:u,targetChainId:o});return{assets:d.assets.map(n=>({...n,id:t.getAssetId(o,n),bridgeProviders:[e.ServiceType.MARKR]})),meta:d.meta}}}exports.getBridgeableAssetsFactory=r;
|
|
2
2
|
//# sourceMappingURL=get-bridgeable-assets.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bridgeable-assets.cjs","names":["isRouteSupported","ServiceType"],"sources":["../../../../src/transfer-service/markr/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type {
|
|
1
|
+
{"version":3,"file":"get-bridgeable-assets.cjs","names":["isRouteSupported","getAssetId","ServiceType"],"sources":["../../../../src/transfer-service/markr/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { AssetWithExtras } from '../../../types/asset';\nimport type { AssetSearchQuery } from '../../../types/service';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../types/service';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { getAssetId } from '../../../utils/asset-id';\nimport { isRouteSupported, type SupportedChainsMap } from '../_utils';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nexport function getBridgeableAssetsFactory({\n getTargetChainAssets,\n supportedChains,\n}: {\n getTargetChainAssets: (queryProps: {\n search?: AssetSearchQuery;\n limit: number;\n page: number;\n targetChainId: Caip2ChainId;\n }) => Promise<{\n readonly assets: readonly AssetWithExtras[];\n readonly meta: { readonly currentPage: number; readonly hasMore: boolean; readonly nextPage?: number };\n }>;\n supportedChains: SupportedChainsMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceChainId,\n targetChainId,\n search,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (!isRouteSupported(supportedChains, sourceChainId, targetChainId)) {\n return {\n assets: [],\n meta: {\n currentPage,\n hasMore: false,\n },\n };\n }\n\n const response = await getTargetChainAssets({\n search,\n limit: limit ?? DEFAULT_LIMIT,\n page: currentPage,\n targetChainId,\n });\n\n return {\n assets: response.assets.map((asset) => ({\n ...asset,\n id: getAssetId(targetChainId, asset),\n bridgeProviders: [ServiceType.MARKR] as const,\n })),\n meta: response.meta,\n };\n };\n}\n"],"mappings":"8GAWA,SAAgB,EAA2B,CACzC,uBACA,mBAYyC,CACzC,OAAO,MAAO,CACZ,gBACA,gBACA,SACA,QACA,UACkE,CAClE,IAAM,EAAc,GAAQ,EAE5B,GAAI,CAACA,EAAAA,iBAAiB,EAAiB,EAAe,EAAc,CAClE,MAAO,CACL,OAAQ,EAAE,CACV,KAAM,CACJ,cACA,QAAS,GACV,CACF,CAGH,IAAM,EAAW,MAAM,EAAqB,CAC1C,SACA,MAAO,GAAS,IAChB,KAAM,EACN,gBACD,CAAC,CAEF,MAAO,CACL,OAAQ,EAAS,OAAO,IAAK,IAAW,CACtC,GAAG,EACH,GAAIC,EAAAA,WAAW,EAAe,EAAM,CACpC,gBAAiB,CAACC,EAAAA,YAAY,MAAM,CACrC,EAAE,CACH,KAAM,EAAS,KAChB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ServiceType as e}from"../../../constants.js";import{
|
|
1
|
+
import{ServiceType as e}from"../../../constants.js";import{getAssetId as t}from"../../../utils/asset-id.js";import{isRouteSupported as n}from"../_utils.js";function r({getTargetChainAssets:r,supportedChains:i}){return async({sourceChainId:a,targetChainId:o,search:s,limit:c,page:l})=>{let u=l??1;if(!n(i,a,o))return{assets:[],meta:{currentPage:u,hasMore:!1}};let d=await r({search:s,limit:c??100,page:u,targetChainId:o});return{assets:d.assets.map(n=>({...n,id:t(o,n),bridgeProviders:[e.MARKR]})),meta:d.meta}}}export{r as getBridgeableAssetsFactory};
|
|
2
2
|
//# sourceMappingURL=get-bridgeable-assets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../src/transfer-service/markr/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type {
|
|
1
|
+
{"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../src/transfer-service/markr/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { AssetWithExtras } from '../../../types/asset';\nimport type { AssetSearchQuery } from '../../../types/service';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../types/service';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { getAssetId } from '../../../utils/asset-id';\nimport { isRouteSupported, type SupportedChainsMap } from '../_utils';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nexport function getBridgeableAssetsFactory({\n getTargetChainAssets,\n supportedChains,\n}: {\n getTargetChainAssets: (queryProps: {\n search?: AssetSearchQuery;\n limit: number;\n page: number;\n targetChainId: Caip2ChainId;\n }) => Promise<{\n readonly assets: readonly AssetWithExtras[];\n readonly meta: { readonly currentPage: number; readonly hasMore: boolean; readonly nextPage?: number };\n }>;\n supportedChains: SupportedChainsMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceChainId,\n targetChainId,\n search,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (!isRouteSupported(supportedChains, sourceChainId, targetChainId)) {\n return {\n assets: [],\n meta: {\n currentPage,\n hasMore: false,\n },\n };\n }\n\n const response = await getTargetChainAssets({\n search,\n limit: limit ?? DEFAULT_LIMIT,\n page: currentPage,\n targetChainId,\n });\n\n return {\n assets: response.assets.map((asset) => ({\n ...asset,\n id: getAssetId(targetChainId, asset),\n bridgeProviders: [ServiceType.MARKR] as const,\n })),\n meta: response.meta,\n };\n };\n}\n"],"mappings":"4JAWA,SAAgB,EAA2B,CACzC,uBACA,mBAYyC,CACzC,OAAO,MAAO,CACZ,gBACA,gBACA,SACA,QACA,UACkE,CAClE,IAAM,EAAc,GAAQ,EAE5B,GAAI,CAAC,EAAiB,EAAiB,EAAe,EAAc,CAClE,MAAO,CACL,OAAQ,EAAE,CACV,KAAM,CACJ,cACA,QAAS,GACV,CACF,CAGH,IAAM,EAAW,MAAM,EAAqB,CAC1C,SACA,MAAO,GAAS,IAChB,KAAM,EACN,gBACD,CAAC,CAEF,MAAO,CACL,OAAQ,EAAS,OAAO,IAAK,IAAW,CACtC,GAAG,EACH,GAAI,EAAW,EAAe,EAAM,CACpC,gBAAiB,CAAC,EAAY,MAAM,CACrC,EAAE,CACH,KAAM,EAAS,KAChB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../_utils.cjs`),r=require(`../../../_utils/chain.cjs`),i=require(`../_api.cjs`),a=require(`../../_tracking-utilities.cjs`),o=require(`../constants.cjs`);let s=require(`viem`),c=require(`@solana/kit`);function l({apiOptions:e}){return({transfer:t,updateListener:n})=>t.sourceChain.chainId===t.targetChain.chainId?r.isSolanaNamespace(t.sourceChain.chainId)?u({transfer:t,updateListener:n}):a.trackSameChainEvmTransfer({transfer:t,updateListener:n}):f({transfer:t,updateListener:n},e)}function u({transfer:e,updateListener:t}){let n=new AbortController,r=()=>n.abort();return e.status===`source-pending`?{cancel:r,result:d(e,t,n.signal)}:{cancel:r,result:Promise.resolve(e)}}async function d(e,r,i){let{txHash:a}=e.source;try{(0,c.assertIsSignature)(a)}catch{let n={...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return r(n),n}let s=n.getSolanaRpcForChain({chain:e.sourceChain}),l=Date.now();for(;!i.aborted;){if(Date.now()-l>12e4)return e;try{let{value:c}=await s.getSignatureStatuses([a],{searchTransactionHistory:!0}).send(),l=c[0];if(!l){await n.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:i});continue}if(l.err!==null){let n={...e,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};return r(n),n}if(l.confirmationStatus===`finalized`){let t={...e,completedAtMs:Date.now(),source:{...e.source,confirmationCount:e.source.requiredConfirmationCount},status:`completed`,target:null};return r(t),t}let u=Number(l.confirmations??0),d=Math.min(u,e.source.requiredConfirmationCount-1);d!==e.source.confirmationCount&&(e={...e,source:{...e.source,confirmationCount:d}},r(e)),await n.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:i})}catch{return e}}return e}function f({transfer:e,updateListener:t},n){let r=new AbortController;return{cancel:()=>{r.abort()},result:(async()=>{let i=structuredClone(e);for(;!r.signal.aborted;){let e=await p(i,n,r.signal);if(r.signal.aborted)break;if(i=e,t(e),e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;let a=g(e);await new Promise(e=>{let t=setTimeout(e,a);r.signal.addEventListener(`abort`,()=>clearTimeout(t),{once:!0})})}return i})()}}async function p(e,a,o){if(e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;if(!x(e.source.txHash,e.sourceChain.chainId))return{...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(e.status===`source-pending`){if(r.isEvmNamespace(e.sourceChain.chainId)){let r=e.source.txHash;if(!(0,s.isHash)(r))return{...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};let i=n.getEvmClientForChain({chain:e.sourceChain});try{let a=await n.awaitOrAbort(i.waitForTransactionReceipt({hash:r}),o);if(a.status===`aborted`)return e;let s=a.value;return s.status===`reverted`?{...e,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:(await m(i,e.sourceChain.chainId,e.sourceChain.chainName,s.blockNumber,o)).status===`aborted`?e:C(e)}catch{return e}}if(r.isSolanaNamespace(e.sourceChain.chainId)){let n=e.source.txHash;try{(0,c.assertIsSignature)(n)}catch{return{...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`}}let r=await b(e.sourceChain,n,o);return r.status===`aborted`?e:r.status===`reverted`?{...e,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:r.status===`unknown`?e:C(e)}}try{let n=await i.markrGetCrossChainStatus(a,e.source.txHash,{signal:o}),r=w(e,n);switch(n.status){case`failed`:return{...r,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Transaction execution failed.`,failedAtMs:A(n),status:`failed`};case`pending`:return S(n.sourceChain.finalized)?C(r):r;case`committed`:case`pending_execution`:return T(r,n);case`completed`:return E(r,n);case`refunded`:return D(r,n);default:return k(r,n)}}catch(t){return console.error(`[Fusion SDK] Error fetching cross-chain status from Markr API`,{error:t,now:Date.now()}),e}}async function m(e,t,r,i,a){let o=h(t,r);for(;!a.aborted;){let t=await n.awaitOrAbort(e.getBlock({blockTag:`finalized`}),a);if(t.status===`aborted`)return{status:`aborted`};if(t.value.number>=i)return{status:`ok`};await n.waitForTimeoutOrAbort({timeoutMs:o,signal:a})}return{status:`aborted`}}function h(e,t){return o.CROSS_CHAIN_POLLING_INTERVAL_MS[y(_(e,t))]}function g(e){return e.status===`source-pending`?h(e.sourceChain.chainId,e.sourceChain.chainName):h(e.targetChain.chainId,e.targetChain.chainName)}function _(e,t){let n=o.FINALITY_MS_BY_CHAIN_ID[e];if(n!==void 0)return n;let r=v(t);return o.FINALITY_MS_BY_CHAIN_NAME_ALIAS.find(({aliases:e})=>e.some(e=>r.includes(e)))?.finalityMs}function v(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function y(e){return e===void 0?`medium`:e<=o.FINALITY_TIER_MAX_FINALITY_MS.fast?`fast`:e<=o.FINALITY_TIER_MAX_FINALITY_MS.medium?`medium`:e<=o.FINALITY_TIER_MAX_FINALITY_MS.slow?`slow`:`verySlow`}async function b(e,t,r){let i=n.getSolanaRpcForChain({chain:e}),a=Date.now();for(;!r.aborted;){if(Date.now()-a>12e4)return{status:`unknown`};try{let{value:e}=await i.getSignatureStatuses([t],{searchTransactionHistory:!0}).send(),a=e[0];if(!a){await n.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:r});continue}if(a.err!==null)return{status:`reverted`};if(a.confirmationStatus===`finalized`)return{status:`ok`};await n.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:r})}catch{return{status:`unknown`}}}return{status:`aborted`}}function x(e,t){if(r.isEvmNamespace(t))return(0,s.isHash)(e);if(r.isSolanaNamespace(t))try{return(0,c.assertIsSignature)(e),!0}catch{return!1}return!1}function S(e){return e===!0||typeof e==`string`}function C(e){return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`source-completed`}}function w(e,t){let n={...e.metadata??{}};return t.destinationChain.bridgeHash&&(n.bridgeHash=t.destinationChain.bridgeHash),t.debug&&(n.debug=t.debug),Object.keys(n).length===0?e:{...e,metadata:n}}function T(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`target-pending`,target:{confirmationCount:r?1:0,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now(),txHash:r??void 0}}}function E(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,completedAtMs:A(t),status:`completed`,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},target:r?{txHash:r,confirmationCount:2,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now()}:null}}function D(e,t){let{transactionHash:n}=t.destinationChain,r=t.transferredTokens[0],i=r?O(e.targetChain.chainId,r.token)??null:null,a=`target`in e?e.target:null;return{...e,refund:{amount:r?.amount??0n,asset:i,chainId:e.targetChain.chainId,txHash:n??null,timestampMs:A(t)},source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`refunded`,target:a?{...a,txHash:void 0}:null}}function O(t,n){if(r.isSolanaNamespace(t))return(0,c.isAddress)(n)?{address:n,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.TokenType.SPL}:void 0;if(r.isEvmNamespace(t))return(0,s.isAddress)(n)?{address:n,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.TokenType.ERC20}:void 0}function k(e,t){return t.progress.executed===!0?E(e,t):t.progress.committed===!0?T(e,t):S(t.sourceChain.finalized)?C(e):{...e,source:{...e.source,confirmationCount:0,requiredConfirmationCount:2},status:`source-pending`}}function A(e){return e.destinationChain.finalized?new Date(e.destinationChain.finalized).getTime():e.destinationChain.timestamp?new Date(e.destinationChain.timestamp).getTime():e.sourceChain.finalized?typeof e.sourceChain.finalized==`boolean`&&e.sourceChain.finalized===!0?new Date(e.sourceChain.timestamp).getTime():new Date(e.sourceChain.finalized).getTime():new Date(e.sourceChain.timestamp).getTime()}exports.trackTransferFactory=l;
|
|
2
2
|
//# sourceMappingURL=track-transfer.cjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{TokenType as e}from"../../../constants.js";import{ErrorCode as t}from"../../../errors.js";import{
|
|
1
|
+
import{TokenType as e}from"../../../constants.js";import{ErrorCode as t}from"../../../errors.js";import{awaitOrAbort as n,getEvmClientForChain as r,getSolanaRpcForChain as i,waitForTimeoutOrAbort as a}from"../../_utils.js";import{isEvmNamespace as o,isSolanaNamespace as s}from"../../../_utils/chain.js";import{markrGetCrossChainStatus as c}from"../_api.js";import{trackSameChainEvmTransfer as l}from"../../_tracking-utilities.js";import{CROSS_CHAIN_POLLING_INTERVAL_MS as u,FINALITY_MS_BY_CHAIN_ID as d,FINALITY_MS_BY_CHAIN_NAME_ALIAS as f,FINALITY_TIER_MAX_FINALITY_MS as p,SOLANA_POLLING_INTERVAL_MS as m}from"../constants.js";import{isAddress as h,isHash as g}from"viem";import{assertIsSignature as _,isAddress as v}from"@solana/kit";function y({apiOptions:e}){return({transfer:t,updateListener:n})=>t.sourceChain.chainId===t.targetChain.chainId?s(t.sourceChain.chainId)?b({transfer:t,updateListener:n}):l({transfer:t,updateListener:n}):S({transfer:t,updateListener:n},e)}function b({transfer:e,updateListener:t}){let n=new AbortController,r=()=>n.abort();return e.status===`source-pending`?{cancel:r,result:x(e,t,n.signal)}:{cancel:r,result:Promise.resolve(e)}}async function x(e,n,r){let{txHash:o}=e.source;try{_(o)}catch{let r={...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return n(r),r}let s=i({chain:e.sourceChain}),c=Date.now();for(;!r.aborted;){if(Date.now()-c>12e4)return e;try{let{value:i}=await s.getSignatureStatuses([o],{searchTransactionHistory:!0}).send(),c=i[0];if(!c){await a({timeoutMs:m,signal:r});continue}if(c.err!==null){let r={...e,errorCode:t.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};return n(r),r}if(c.confirmationStatus===`finalized`){let t={...e,completedAtMs:Date.now(),source:{...e.source,confirmationCount:e.source.requiredConfirmationCount},status:`completed`,target:null};return n(t),t}let l=Number(c.confirmations??0),u=Math.min(l,e.source.requiredConfirmationCount-1);u!==e.source.confirmationCount&&(e={...e,source:{...e.source,confirmationCount:u}},n(e)),await a({timeoutMs:m,signal:r})}catch{return e}}return e}function S({transfer:e,updateListener:t},n){let r=new AbortController;return{cancel:()=>{r.abort()},result:(async()=>{let i=structuredClone(e);for(;!r.signal.aborted;){let e=await C(i,n,r.signal);if(r.signal.aborted)break;if(i=e,t(e),e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;let a=E(e);await new Promise(e=>{let t=setTimeout(e,a);r.signal.addEventListener(`abort`,()=>clearTimeout(t),{once:!0})})}return i})()}}async function C(e,i,a){if(e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;if(!j(e.source.txHash,e.sourceChain.chainId))return{...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(e.status===`source-pending`){if(o(e.sourceChain.chainId)){let i=e.source.txHash;if(!g(i))return{...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};let o=r({chain:e.sourceChain});try{let r=await n(o.waitForTransactionReceipt({hash:i}),a);if(r.status===`aborted`)return e;let s=r.value;return s.status===`reverted`?{...e,errorCode:t.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:(await w(o,e.sourceChain.chainId,e.sourceChain.chainName,s.blockNumber,a)).status===`aborted`?e:N(e)}catch{return e}}if(s(e.sourceChain.chainId)){let n=e.source.txHash;try{_(n)}catch{return{...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`}}let r=await A(e.sourceChain,n,a);return r.status===`aborted`?e:r.status===`reverted`?{...e,errorCode:t.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:r.status===`unknown`?e:N(e)}}try{let n=await c(i,e.source.txHash,{signal:a}),r=P(e,n);switch(n.status){case`failed`:return{...r,errorCode:t.TRANSACTION_REVERTED,errorReason:`Transaction execution failed.`,failedAtMs:B(n),status:`failed`};case`pending`:return M(n.sourceChain.finalized)?N(r):r;case`committed`:case`pending_execution`:return F(r,n);case`completed`:return I(r,n);case`refunded`:return L(r,n);default:return z(r,n)}}catch(t){return console.error(`[Fusion SDK] Error fetching cross-chain status from Markr API`,{error:t,now:Date.now()}),e}}async function w(e,t,r,i,o){let s=T(t,r);for(;!o.aborted;){let t=await n(e.getBlock({blockTag:`finalized`}),o);if(t.status===`aborted`)return{status:`aborted`};if(t.value.number>=i)return{status:`ok`};await a({timeoutMs:s,signal:o})}return{status:`aborted`}}function T(e,t){return u[k(D(e,t))]}function E(e){return e.status===`source-pending`?T(e.sourceChain.chainId,e.sourceChain.chainName):T(e.targetChain.chainId,e.targetChain.chainName)}function D(e,t){let n=d[e];if(n!==void 0)return n;let r=O(t);return f.find(({aliases:e})=>e.some(e=>r.includes(e)))?.finalityMs}function O(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function k(e){return e===void 0?`medium`:e<=p.fast?`fast`:e<=p.medium?`medium`:e<=p.slow?`slow`:`verySlow`}async function A(e,t,n){let r=i({chain:e}),o=Date.now();for(;!n.aborted;){if(Date.now()-o>12e4)return{status:`unknown`};try{let{value:e}=await r.getSignatureStatuses([t],{searchTransactionHistory:!0}).send(),i=e[0];if(!i){await a({timeoutMs:m,signal:n});continue}if(i.err!==null)return{status:`reverted`};if(i.confirmationStatus===`finalized`)return{status:`ok`};await a({timeoutMs:m,signal:n})}catch{return{status:`unknown`}}}return{status:`aborted`}}function j(e,t){if(o(t))return g(e);if(s(t))try{return _(e),!0}catch{return!1}return!1}function M(e){return e===!0||typeof e==`string`}function N(e){return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`source-completed`}}function P(e,t){let n={...e.metadata??{}};return t.destinationChain.bridgeHash&&(n.bridgeHash=t.destinationChain.bridgeHash),t.debug&&(n.debug=t.debug),Object.keys(n).length===0?e:{...e,metadata:n}}function F(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`target-pending`,target:{confirmationCount:r?1:0,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now(),txHash:r??void 0}}}function I(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,completedAtMs:B(t),status:`completed`,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},target:r?{txHash:r,confirmationCount:2,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now()}:null}}function L(e,t){let{transactionHash:n}=t.destinationChain,r=t.transferredTokens[0],i=r?R(e.targetChain.chainId,r.token)??null:null,a=`target`in e?e.target:null;return{...e,refund:{amount:r?.amount??0n,asset:i,chainId:e.targetChain.chainId,txHash:n??null,timestampMs:B(t)},source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`refunded`,target:a?{...a,txHash:void 0}:null}}function R(t,n){if(s(t))return v(n)?{address:n,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.SPL}:void 0;if(o(t))return h(n)?{address:n,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.ERC20}:void 0}function z(e,t){return t.progress.executed===!0?I(e,t):t.progress.committed===!0?F(e,t):M(t.sourceChain.finalized)?N(e):{...e,source:{...e.source,confirmationCount:0,requiredConfirmationCount:2},status:`source-pending`}}function B(e){return e.destinationChain.finalized?new Date(e.destinationChain.finalized).getTime():e.destinationChain.timestamp?new Date(e.destinationChain.timestamp).getTime():e.sourceChain.finalized?typeof e.sourceChain.finalized==`boolean`&&e.sourceChain.finalized===!0?new Date(e.sourceChain.timestamp).getTime():new Date(e.sourceChain.finalized).getTime():new Date(e.sourceChain.timestamp).getTime()}export{y as trackTransferFactory};
|
|
2
2
|
//# sourceMappingURL=track-transfer.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../utils/caip.cjs`),r=require(
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../utils/caip.cjs`),r=require(`../../_utils.cjs`),i=require(`../../../_utils/chain.cjs`),a=require(`../../_evm-errors.cjs`),o=require(`../_api.cjs`),s=require(`../../../utils/sol-address.cjs`),c=require(`../_utils.cjs`),l=require(`../_type-guards.cjs`),u=require(`../../../utils/solana.cjs`),d=require(`./estimate-native-fee.cjs`);let f=require(`viem`);function p({apiOptions:n,appId:r,environment:a,evmSigner:o,solanaSigner:s}){return async({quote:c,gasSettings:l,fallbackToDefaultOnBatchFailure:u,onStepChange:d})=>{if(c.serviceType!==e.ServiceType.MARKR)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let f=Math.floor(Date.now()/1e3);if(c.expiresAt<=f)throw new t.SdkError(t.ErrorReason.QUOTE_EXPIRED,t.ErrorCode.INVALID_PARAMS);let p=c.sourceChain.chainId;if(i.isSolanaNamespace(p))return h({apiOptions:n,appId:r,environment:a,solanaSigner:s,quote:c,onStepChange:d});if(i.isEvmNamespace(p))return m({apiOptions:n,appId:r,environment:a,evmSigner:o,quote:c,gasSettings:l,fallbackToDefaultOnBatchFailure:u,onStepChange:d});throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${p}`})}}async function m({apiOptions:i,appId:s,environment:u,evmSigner:p,quote:m,gasSettings:h,fallbackToDefaultOnBatchFailure:_,onStepChange:v}){let y=m.fromAddress;if(!(0,f.isAddress)(y))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let b=c.calculateMarkrMinimumAmountOut({amountOut:m.amountOut,assetOut:m.assetOut,slippageBps:m.slippageBps}),x=r.getEvmClientForChain({chain:m.sourceChain}),S=c.assetToAddressString(m.assetIn,m.sourceChain.chainId),C=c.assetToAddressString(m.assetOut,m.targetChain.chainId);if(!(0,f.isAddress)(S))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let w=S,T=c.isTokenAddressNative(w),E=m.sourceChain.chainId.toLowerCase()!==m.targetChain.chainId.toLowerCase(),D=m.amountIn+c.getAdditiveSourceAssetFeeAmount(m),{address:O}=await o.markrGetSpenderAddress(i,{chainId:n.caip2ToEip155ChainId(m.sourceChain.chainId),crossChainSwap:E,quoteId:m.id});if(!T&&!O)throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${m.sourceChain.chainId}.`});let k=!1,A;if(!T&&O&&await x.readContract({address:w,abi:f.erc20Abi,functionName:`allowance`,args:[y,O]})<D){k=!0;let e=(0,f.encodeFunctionData)({abi:f.erc20Abi,functionName:`approve`,args:[O,D]}),t=r.applyFeeUnitsBpsMargin(await a.estimateGasWithRevert(x,{account:y,to:w,data:e},f.erc20Abi,`Failed to estimate gas for ERC20 approval transaction.`),h?.estimateGasMarginBps);A={chainId:n.caip2ToEip155HexChainId(m.sourceChain.chainId),data:e,from:y,gas:t,to:w,value:0n,...h?.maxFeePerGas===void 0?null:{maxFeePerGas:h.maxFeePerGas,maxPriorityFeePerGas:h.maxPriorityFeePerGas}}}let j=g({approvalRequest:A,requiresApprovalSignature:k,signBatch:p.signBatch,sourceChainId:m.sourceChain.chainId,targetChainId:m.targetChain.chainId}),M=await o.markrSwap(i,{amountIn:m.amountIn.toString(),appId:s,minAmountOut:b.toString(),tokenIn:S,tokenOut:C,uuid:m.id});if(!l.isEvmSwapResponse(M))throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.`});let N=(t,n=Date.now())=>{let r=m.sourceChain.chainId===m.targetChain.chainId;return{amountIn:m.amountIn,amountOut:m.amountOut,environment:u,fees:m.fees,fromAddress:m.fromAddress,id:m.id,partnerFeeBps:m.partnerFeeBps,sourceAsset:m.assetIn,sourceChain:m.sourceChain,status:`source-pending`,targetAsset:m.assetOut,targetChain:m.targetChain,toAddress:m.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:r?1:2,startedAtMs:n,txHash:t}}};if(j&&A){let r={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:m,requiredSignatures:1},i=p.signBatch;if(!i)throw new t.SdkError(`One-click batch signer is not available.`,t.ErrorCode.SIGNING_FAILED);let a={chainId:n.caip2ToEip155HexChainId(m.sourceChain.chainId),data:M.data,from:y,gas:void 0,to:M.to,value:M.value,...h?.maxFeePerGas===void 0?null:{maxFeePerGas:h.maxFeePerGas,maxPriorityFeePerGas:h.maxPriorityFeePerGas}};v?.(r);try{let e=(await i([A,a],async e=>x.sendRawTransaction({serializedTransaction:e}),r)).at(-1);if(!e)throw new t.SdkError(`One-click batch signing returned no transaction hashes.`,t.ErrorCode.SIGNING_FAILED);return N(e)}catch(e){if(!_)throw e}}if(k&&A){let n={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.AllowanceApproval,quote:m,requiredSignatures:2};v?.(n);let i=await p.sign(A,async e=>x.sendRawTransaction({serializedTransaction:e}),n);if((await x.waitForTransactionReceipt({hash:i})).status===`reverted`)return r.makeFailedTransferFromQuote(m,{environment:u,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let P=await d._estimateGasFromSwapResponse({crossChain:E,fromAddress:y,feeUnitsMarginBps:h?.estimateGasMarginBps,sourceClient:x,swap:M}),F={chainId:n.caip2ToEip155HexChainId(m.sourceChain.chainId),data:M.data,from:y,gas:P,to:M.to,value:M.value,...h?.maxFeePerGas===void 0?null:{maxFeePerGas:h.maxFeePerGas,maxPriorityFeePerGas:h.maxPriorityFeePerGas}},I={currentSignature:k?2:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:m,requiredSignatures:k?2:1};v?.(I);let L=Date.now();return N(await p.sign(F,async e=>x.sendRawTransaction({serializedTransaction:e}),I),L)}async function h({apiOptions:n,appId:i,environment:a,solanaSigner:d,quote:f,onStepChange:p}){if(!d)throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!s.isSolAddress(f.fromAddress))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let m=c.calculateMarkrMinimumAmountOut({amountOut:f.amountOut,assetOut:f.assetOut,slippageBps:f.slippageBps}),h=c.assetToAddressString(f.assetIn,f.sourceChain.chainId),g=c.assetToAddressString(f.assetOut,f.targetChain.chainId),_=await o.markrSwap(n,{amountIn:f.amountIn.toString(),appId:i,minAmountOut:m.toString(),tokenIn:h,tokenOut:g,userPublicKey:f.fromAddress,uuid:f.id});if(!l.isSolanaSwapResponse(_))throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.`});console.debug(`[Fusion SDK] Original swap transaction (base64):`,_.swapTransaction);let v=await u.refreshSolanaSwapTransactionBlockhash(_.swapTransaction,r.getSolanaRpcForChain({chain:f.sourceChain}));console.debug(`[Fusion SDK] Refreshed swap transaction with new blockhash (base64):`,v);let y={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:f,requiredSignatures:1};p?.(y);let b=Date.now(),x=await d.signAndSend({account:f.fromAddress,serializedTx:v},y),S=f.sourceChain.chainId.toLowerCase()!==f.targetChain.chainId.toLowerCase();return{amountIn:f.amountIn,amountOut:f.amountOut,environment:a,fees:f.fees,fromAddress:f.fromAddress,id:f.id,partnerFeeBps:f.partnerFeeBps,sourceAsset:f.assetIn,sourceChain:f.sourceChain,status:`source-pending`,targetAsset:f.assetOut,targetChain:f.targetChain,toAddress:f.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:S?2:32,startedAtMs:b,txHash:x}}}function g({approvalRequest:e,requiresApprovalSignature:t,signBatch:n,sourceChainId:r,targetChainId:a}){return i.isEvmNamespace(r)&&i.isEvmNamespace(a)&&r===a&&t&&e!==void 0&&typeof n==`function`}exports.transferAssetFactory=p;
|
|
2
2
|
//# sourceMappingURL=transfer-asset.cjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ServiceType as e,TransferSignatureReason as t}from"../../../constants.js";import{ErrorCode as n,ErrorReason as r,SdkError as i}from"../../../errors.js";import{caip2ToEip155ChainId as a,caip2ToEip155HexChainId as o}from"../../../utils/caip.js";import{
|
|
1
|
+
import{ServiceType as e,TransferSignatureReason as t}from"../../../constants.js";import{ErrorCode as n,ErrorReason as r,SdkError as i}from"../../../errors.js";import{caip2ToEip155ChainId as a,caip2ToEip155HexChainId as o}from"../../../utils/caip.js";import{applyFeeUnitsBpsMargin as s,getEvmClientForChain as c,getSolanaRpcForChain as l,makeFailedTransferFromQuote as u}from"../../_utils.js";import{isEvmNamespace as d,isSolanaNamespace as f}from"../../../_utils/chain.js";import{estimateGasWithRevert as p}from"../../_evm-errors.js";import{markrGetSpenderAddress as m,markrSwap as h}from"../_api.js";import{isSolAddress as g}from"../../../utils/sol-address.js";import{assetToAddressString as _,calculateMarkrMinimumAmountOut as v,getAdditiveSourceAssetFeeAmount as y,isTokenAddressNative as b}from"../_utils.js";import{isEvmSwapResponse as x,isSolanaSwapResponse as S}from"../_type-guards.js";import{refreshSolanaSwapTransactionBlockhash as C}from"../../../utils/solana.js";import{_estimateGasFromSwapResponse as w}from"./estimate-native-fee.js";import{encodeFunctionData as T,erc20Abi as E,isAddress as D}from"viem";function O({apiOptions:t,appId:a,environment:o,evmSigner:s,solanaSigner:c}){return async({quote:l,gasSettings:u,fallbackToDefaultOnBatchFailure:p,onStepChange:m})=>{if(l.serviceType!==e.MARKR)throw new i(r.INCORRECT_PROVIDER_PROVIDED,n.INVALID_PARAMS);let h=Math.floor(Date.now()/1e3);if(l.expiresAt<=h)throw new i(r.QUOTE_EXPIRED,n.INVALID_PARAMS);let g=l.sourceChain.chainId;if(f(g))return A({apiOptions:t,appId:a,environment:o,solanaSigner:c,quote:l,onStepChange:m});if(d(g))return k({apiOptions:t,appId:a,environment:o,evmSigner:s,quote:l,gasSettings:u,fallbackToDefaultOnBatchFailure:p,onStepChange:m});throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${g}`})}}async function k({apiOptions:l,appId:d,environment:f,evmSigner:g,quote:S,gasSettings:C,fallbackToDefaultOnBatchFailure:O,onStepChange:k}){let A=S.fromAddress;if(!D(A))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let M=v({amountOut:S.amountOut,assetOut:S.assetOut,slippageBps:S.slippageBps}),N=c({chain:S.sourceChain}),P=_(S.assetIn,S.sourceChain.chainId),F=_(S.assetOut,S.targetChain.chainId);if(!D(P))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let I=P,L=b(I),R=S.sourceChain.chainId.toLowerCase()!==S.targetChain.chainId.toLowerCase(),z=S.amountIn+y(S),{address:B}=await m(l,{chainId:a(S.sourceChain.chainId),crossChainSwap:R,quoteId:S.id});if(!L&&!B)throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${S.sourceChain.chainId}.`});let V=!1,H;if(!L&&B&&await N.readContract({address:I,abi:E,functionName:`allowance`,args:[A,B]})<z){V=!0;let e=T({abi:E,functionName:`approve`,args:[B,z]}),t=s(await p(N,{account:A,to:I,data:e},E,`Failed to estimate gas for ERC20 approval transaction.`),C?.estimateGasMarginBps);H={chainId:o(S.sourceChain.chainId),data:e,from:A,gas:t,to:I,value:0n,...C?.maxFeePerGas===void 0?null:{maxFeePerGas:C.maxFeePerGas,maxPriorityFeePerGas:C.maxPriorityFeePerGas}}}let U=j({approvalRequest:H,requiresApprovalSignature:V,signBatch:g.signBatch,sourceChainId:S.sourceChain.chainId,targetChainId:S.targetChain.chainId}),W=await h(l,{amountIn:S.amountIn.toString(),appId:d,minAmountOut:M.toString(),tokenIn:P,tokenOut:F,uuid:S.id});if(!x(W))throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.`});let G=(t,n=Date.now())=>{let r=S.sourceChain.chainId===S.targetChain.chainId;return{amountIn:S.amountIn,amountOut:S.amountOut,environment:f,fees:S.fees,fromAddress:S.fromAddress,id:S.id,partnerFeeBps:S.partnerFeeBps,sourceAsset:S.assetIn,sourceChain:S.sourceChain,status:`source-pending`,targetAsset:S.assetOut,targetChain:S.targetChain,toAddress:S.toAddress,type:e.MARKR,source:{confirmationCount:0,requiredConfirmationCount:r?1:2,startedAtMs:n,txHash:t}}};if(U&&H){let e={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:S,requiredSignatures:1},r=g.signBatch;if(!r)throw new i(`One-click batch signer is not available.`,n.SIGNING_FAILED);let a={chainId:o(S.sourceChain.chainId),data:W.data,from:A,gas:void 0,to:W.to,value:W.value,...C?.maxFeePerGas===void 0?null:{maxFeePerGas:C.maxFeePerGas,maxPriorityFeePerGas:C.maxPriorityFeePerGas}};k?.(e);try{let t=(await r([H,a],async e=>N.sendRawTransaction({serializedTransaction:e}),e)).at(-1);if(!t)throw new i(`One-click batch signing returned no transaction hashes.`,n.SIGNING_FAILED);return G(t)}catch(e){if(!O)throw e}}if(V&&H){let e={currentSignature:1,currentSignatureReason:t.AllowanceApproval,quote:S,requiredSignatures:2};k?.(e);let r=await g.sign(H,async e=>N.sendRawTransaction({serializedTransaction:e}),e);if((await N.waitForTransactionReceipt({hash:r})).status===`reverted`)return u(S,{environment:f,errorCode:n.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let K=await w({crossChain:R,fromAddress:A,feeUnitsMarginBps:C?.estimateGasMarginBps,sourceClient:N,swap:W}),q={chainId:o(S.sourceChain.chainId),data:W.data,from:A,gas:K,to:W.to,value:W.value,...C?.maxFeePerGas===void 0?null:{maxFeePerGas:C.maxFeePerGas,maxPriorityFeePerGas:C.maxPriorityFeePerGas}},J={currentSignature:V?2:1,currentSignatureReason:t.TokensTransfer,quote:S,requiredSignatures:V?2:1};k?.(J);let Y=Date.now();return G(await g.sign(q,async e=>N.sendRawTransaction({serializedTransaction:e}),J),Y)}async function A({apiOptions:a,appId:o,environment:s,solanaSigner:c,quote:u,onStepChange:d}){if(!c)throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!g(u.fromAddress))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let f=v({amountOut:u.amountOut,assetOut:u.assetOut,slippageBps:u.slippageBps}),p=_(u.assetIn,u.sourceChain.chainId),m=_(u.assetOut,u.targetChain.chainId),y=await h(a,{amountIn:u.amountIn.toString(),appId:o,minAmountOut:f.toString(),tokenIn:p,tokenOut:m,userPublicKey:u.fromAddress,uuid:u.id});if(!S(y))throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.`});console.debug(`[Fusion SDK] Original swap transaction (base64):`,y.swapTransaction);let b=await C(y.swapTransaction,l({chain:u.sourceChain}));console.debug(`[Fusion SDK] Refreshed swap transaction with new blockhash (base64):`,b);let x={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:u,requiredSignatures:1};d?.(x);let w=Date.now(),T=await c.signAndSend({account:u.fromAddress,serializedTx:b},x),E=u.sourceChain.chainId.toLowerCase()!==u.targetChain.chainId.toLowerCase();return{amountIn:u.amountIn,amountOut:u.amountOut,environment:s,fees:u.fees,fromAddress:u.fromAddress,id:u.id,partnerFeeBps:u.partnerFeeBps,sourceAsset:u.assetIn,sourceChain:u.sourceChain,status:`source-pending`,targetAsset:u.assetOut,targetChain:u.targetChain,toAddress:u.toAddress,type:e.MARKR,source:{confirmationCount:0,requiredConfirmationCount:E?2:32,startedAtMs:w,txHash:T}}}function j({approvalRequest:e,requiresApprovalSignature:t,signBatch:n,sourceChainId:r,targetChainId:i}){return d(r)&&d(i)&&r===i&&t&&e!==void 0&&typeof n==`function`}export{O as transferAssetFactory};
|
|
2
2
|
//# sourceMappingURL=transfer-asset.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markr-service.cjs","names":["getPartnerFeeBps","getSupportedChains","getSupportedTokens","analyzeSupportFactory","estimateNativeFeeFactory","getAssetsFactory","getBridgeableAssetsFactory","getMinimumTransferAmountFactory","streamQuotesFactory","trackTransferFactory","transferAssetFactory","ServiceType"],"sources":["../../../src/transfer-service/markr/markr-service.ts"],"sourcesContent":["import { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport type {
|
|
1
|
+
{"version":3,"file":"markr-service.cjs","names":["getPartnerFeeBps","getSupportedChains","getSupportedTokens","analyzeSupportFactory","estimateNativeFeeFactory","getAssetsFactory","getBridgeableAssetsFactory","getMinimumTransferAmountFactory","streamQuotesFactory","trackTransferFactory","transferAssetFactory","ServiceType"],"sources":["../../../src/transfer-service/markr/markr-service.ts"],"sourcesContent":["import { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport type { AssetWithExtras } from '../../types/asset';\nimport type { AssetSearchQuery } from '../../types/service';\nimport type { EvmSigner, SolanaSigner } from '../../types/signer';\nimport type { MutableGetSupportedChainsResult, TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { getAssetsFactory } from './_handlers/get-assets';\nimport { getBridgeableAssetsFactory } from './_handlers/get-bridgeable-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { getPartnerFeeBps, getSupportedChains, getSupportedTokens } from './_utils';\nimport { DEFAULT_MARKR_API_URL } from './constants';\nimport type { ApiOptions } from './_api';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface MarkrServiceOptions {\n apiBaseUrl?: string;\n apiToken?: string;\n appId: string;\n disableCrossChainSwaps?: boolean;\n environment: Environment;\n evmSigner: EvmSigner;\n fetch?: Fetch;\n getTargetChainAssets: (queryProps: {\n search?: AssetSearchQuery;\n limit: number;\n page: number;\n targetChainId: Caip2ChainId;\n }) => Promise<{\n readonly assets: readonly AssetWithExtras[];\n readonly meta: { readonly currentPage: number; readonly hasMore: boolean; readonly nextPage?: number };\n }>;\n solanaSigner?: SolanaSigner;\n}\n\nexport async function createMarkrService({\n apiBaseUrl: apiBaseUrlString,\n apiToken,\n appId,\n disableCrossChainSwaps,\n environment,\n evmSigner,\n fetch: customFetch,\n getTargetChainAssets,\n solanaSigner,\n}: MarkrServiceOptions): Promise<TransferService> {\n const apiBaseUrl = new URL(apiBaseUrlString ?? DEFAULT_MARKR_API_URL);\n\n const apiOptions: ApiOptions = {\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n };\n\n // Parallelize fetching.\n const [partnerFeeBps, supportedChains] = await Promise.all([\n getPartnerFeeBps(apiOptions),\n getSupportedChains(apiOptions, disableCrossChainSwaps),\n ]);\n\n const supportedTokens = await getSupportedTokens(apiOptions, supportedChains);\n\n const hasSolanaSigner = Boolean(solanaSigner);\n const analyzeSupport = analyzeSupportFactory({ hasSolanaSigner, supportedChains });\n\n return {\n analyzeSupport,\n estimateNativeFee: estimateNativeFeeFactory({ apiOptions, appId }),\n getAssets: getAssetsFactory({ supportedChains, supportedTokens }),\n getBridgeableAssets: getBridgeableAssetsFactory({ getTargetChainAssets, supportedChains }),\n getMinimumTransferAmount: getMinimumTransferAmountFactory({\n analyzeSupport,\n partnerFeeBps,\n }),\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n\n for (const [sourceChainId, { crossChainTargetChainIds, swapEnabled }] of supportedChains.entries()) {\n if (!swapEnabled && crossChainTargetChainIds.size === 0) {\n // If neither swap nor cross-chain swap is enabled, skip this chain as a source.\n continue;\n }\n\n const supportedTargetChainIds = new Set<Caip2ChainId>();\n\n // Add self as supported target if same-chain swap is enabled.\n if (swapEnabled) {\n supportedTargetChainIds.add(sourceChainId);\n }\n\n for (const chainId of crossChainTargetChainIds) {\n if (chainId !== sourceChainId && supportedChains.has(chainId)) {\n supportedTargetChainIds.add(chainId);\n }\n }\n\n if (supportedTargetChainIds.size > 0) {\n supportedChainsMap.set(sourceChainId, supportedTargetChainIds);\n }\n }\n\n return supportedChainsMap;\n },\n streamQuotes: streamQuotesFactory({ apiOptions, appId, partnerFeeBps }),\n trackTransfer: trackTransferFactory({ apiOptions }),\n transferAsset: transferAssetFactory({\n apiOptions,\n appId,\n environment,\n evmSigner,\n solanaSigner,\n }),\n type: ServiceType.MARKR,\n } satisfies TransferService;\n}\n"],"mappings":"udAwCA,eAAsB,EAAmB,CACvC,WAAY,EACZ,WACA,QACA,yBACA,cACA,YACA,MAAO,EACP,uBACA,gBACgD,CAGhD,IAAM,EAAyB,CAC7B,WAHiB,IAAI,IAAI,GAAA,oDAA0C,CAInE,WACA,MAAO,EACR,CAGK,CAAC,EAAe,GAAmB,MAAM,QAAQ,IAAI,CACzDA,EAAAA,iBAAiB,EAAW,CAC5BC,EAAAA,mBAAmB,EAAY,EAAuB,CACvD,CAAC,CAEI,EAAkB,MAAMC,EAAAA,mBAAmB,EAAY,EAAgB,CAGvE,EAAiBC,EAAAA,sBAAsB,CAAE,gBADvB,EAAQ,EACgC,kBAAiB,CAAC,CAElF,MAAO,CACL,iBACA,kBAAmBC,EAAAA,yBAAyB,CAAE,aAAY,QAAO,CAAC,CAClE,UAAWC,EAAAA,iBAAiB,CAAE,kBAAiB,kBAAiB,CAAC,CACjE,oBAAqBC,EAAAA,2BAA2B,CAAE,uBAAsB,kBAAiB,CAAC,CAC1F,yBAA0BC,EAAAA,gCAAgC,CACxD,iBACA,gBACD,CAAC,CACF,mBAAoB,SAAY,CAC9B,IAAM,EAAsD,IAAI,IAEhE,IAAK,GAAM,CAAC,EAAe,CAAE,2BAA0B,kBAAkB,EAAgB,SAAS,CAAE,CAClG,GAAI,CAAC,GAAe,EAAyB,OAAS,EAEpD,SAGF,IAAM,EAA0B,IAAI,IAGhC,GACF,EAAwB,IAAI,EAAc,CAG5C,IAAK,IAAM,KAAW,EAChB,IAAY,GAAiB,EAAgB,IAAI,EAAQ,EAC3D,EAAwB,IAAI,EAAQ,CAIpC,EAAwB,KAAO,GACjC,EAAmB,IAAI,EAAe,EAAwB,CAIlE,OAAO,GAET,aAAcC,EAAAA,oBAAoB,CAAE,aAAY,QAAO,gBAAe,CAAC,CACvE,cAAeC,EAAAA,qBAAqB,CAAE,aAAY,CAAC,CACnD,cAAeC,EAAAA,qBAAqB,CAClC,aACA,QACA,cACA,YACA,eACD,CAAC,CACF,KAAMC,EAAAA,YAAY,MACnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markr-service.js","names":[],"sources":["../../../src/transfer-service/markr/markr-service.ts"],"sourcesContent":["import { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport type {
|
|
1
|
+
{"version":3,"file":"markr-service.js","names":[],"sources":["../../../src/transfer-service/markr/markr-service.ts"],"sourcesContent":["import { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport type { AssetWithExtras } from '../../types/asset';\nimport type { AssetSearchQuery } from '../../types/service';\nimport type { EvmSigner, SolanaSigner } from '../../types/signer';\nimport type { MutableGetSupportedChainsResult, TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { getAssetsFactory } from './_handlers/get-assets';\nimport { getBridgeableAssetsFactory } from './_handlers/get-bridgeable-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { getPartnerFeeBps, getSupportedChains, getSupportedTokens } from './_utils';\nimport { DEFAULT_MARKR_API_URL } from './constants';\nimport type { ApiOptions } from './_api';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface MarkrServiceOptions {\n apiBaseUrl?: string;\n apiToken?: string;\n appId: string;\n disableCrossChainSwaps?: boolean;\n environment: Environment;\n evmSigner: EvmSigner;\n fetch?: Fetch;\n getTargetChainAssets: (queryProps: {\n search?: AssetSearchQuery;\n limit: number;\n page: number;\n targetChainId: Caip2ChainId;\n }) => Promise<{\n readonly assets: readonly AssetWithExtras[];\n readonly meta: { readonly currentPage: number; readonly hasMore: boolean; readonly nextPage?: number };\n }>;\n solanaSigner?: SolanaSigner;\n}\n\nexport async function createMarkrService({\n apiBaseUrl: apiBaseUrlString,\n apiToken,\n appId,\n disableCrossChainSwaps,\n environment,\n evmSigner,\n fetch: customFetch,\n getTargetChainAssets,\n solanaSigner,\n}: MarkrServiceOptions): Promise<TransferService> {\n const apiBaseUrl = new URL(apiBaseUrlString ?? DEFAULT_MARKR_API_URL);\n\n const apiOptions: ApiOptions = {\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n };\n\n // Parallelize fetching.\n const [partnerFeeBps, supportedChains] = await Promise.all([\n getPartnerFeeBps(apiOptions),\n getSupportedChains(apiOptions, disableCrossChainSwaps),\n ]);\n\n const supportedTokens = await getSupportedTokens(apiOptions, supportedChains);\n\n const hasSolanaSigner = Boolean(solanaSigner);\n const analyzeSupport = analyzeSupportFactory({ hasSolanaSigner, supportedChains });\n\n return {\n analyzeSupport,\n estimateNativeFee: estimateNativeFeeFactory({ apiOptions, appId }),\n getAssets: getAssetsFactory({ supportedChains, supportedTokens }),\n getBridgeableAssets: getBridgeableAssetsFactory({ getTargetChainAssets, supportedChains }),\n getMinimumTransferAmount: getMinimumTransferAmountFactory({\n analyzeSupport,\n partnerFeeBps,\n }),\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n\n for (const [sourceChainId, { crossChainTargetChainIds, swapEnabled }] of supportedChains.entries()) {\n if (!swapEnabled && crossChainTargetChainIds.size === 0) {\n // If neither swap nor cross-chain swap is enabled, skip this chain as a source.\n continue;\n }\n\n const supportedTargetChainIds = new Set<Caip2ChainId>();\n\n // Add self as supported target if same-chain swap is enabled.\n if (swapEnabled) {\n supportedTargetChainIds.add(sourceChainId);\n }\n\n for (const chainId of crossChainTargetChainIds) {\n if (chainId !== sourceChainId && supportedChains.has(chainId)) {\n supportedTargetChainIds.add(chainId);\n }\n }\n\n if (supportedTargetChainIds.size > 0) {\n supportedChainsMap.set(sourceChainId, supportedTargetChainIds);\n }\n }\n\n return supportedChainsMap;\n },\n streamQuotes: streamQuotesFactory({ apiOptions, appId, partnerFeeBps }),\n trackTransfer: trackTransferFactory({ apiOptions }),\n transferAsset: transferAssetFactory({\n apiOptions,\n appId,\n environment,\n evmSigner,\n solanaSigner,\n }),\n type: ServiceType.MARKR,\n } satisfies TransferService;\n}\n"],"mappings":"qvBAwCA,eAAsB,EAAmB,CACvC,WAAY,EACZ,WACA,QACA,yBACA,cACA,YACA,MAAO,EACP,uBACA,gBACgD,CAGhD,IAAM,EAAyB,CAC7B,WAHiB,IAAI,IAAI,GAAA,oDAA0C,CAInE,WACA,MAAO,EACR,CAGK,CAAC,EAAe,GAAmB,MAAM,QAAQ,IAAI,CACzD,EAAiB,EAAW,CAC5B,EAAmB,EAAY,EAAuB,CACvD,CAAC,CAEI,EAAkB,MAAM,EAAmB,EAAY,EAAgB,CAGvE,EAAiB,EAAsB,CAAE,gBADvB,EAAQ,EACgC,kBAAiB,CAAC,CAElF,MAAO,CACL,iBACA,kBAAmB,EAAyB,CAAE,aAAY,QAAO,CAAC,CAClE,UAAW,EAAiB,CAAE,kBAAiB,kBAAiB,CAAC,CACjE,oBAAqB,EAA2B,CAAE,uBAAsB,kBAAiB,CAAC,CAC1F,yBAA0B,EAAgC,CACxD,iBACA,gBACD,CAAC,CACF,mBAAoB,SAAY,CAC9B,IAAM,EAAsD,IAAI,IAEhE,IAAK,GAAM,CAAC,EAAe,CAAE,2BAA0B,kBAAkB,EAAgB,SAAS,CAAE,CAClG,GAAI,CAAC,GAAe,EAAyB,OAAS,EAEpD,SAGF,IAAM,EAA0B,IAAI,IAGhC,GACF,EAAwB,IAAI,EAAc,CAG5C,IAAK,IAAM,KAAW,EAChB,IAAY,GAAiB,EAAgB,IAAI,EAAQ,EAC3D,EAAwB,IAAI,EAAQ,CAIpC,EAAwB,KAAO,GACjC,EAAmB,IAAI,EAAe,EAAwB,CAIlE,OAAO,GAET,aAAc,EAAoB,CAAE,aAAY,QAAO,gBAAe,CAAC,CACvE,cAAe,EAAqB,CAAE,aAAY,CAAC,CACnD,cAAe,EAAqB,CAClC,aACA,QACA,cACA,YACA,eACD,CAAC,CACF,KAAM,EAAY,MACnB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`../../../constants.cjs`);function
|
|
1
|
+
const e=require(`../../../constants.cjs`),t=require(`../../../utils/asset-id.cjs`),n=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function r({chainConfigs:r}){return async({sourceAsset:i,sourceChainId:a,targetChainId:o,limit:s,page:c})=>{let l=s??100,u=c??1;if(a!==o)return n({assets:[],limit:l,page:u});let d=r.get(a);return d?i.type===e.TokenType.NATIVE?n({assets:[{...d.wrappedAsset,id:t.getAssetId(o,d.wrappedAsset),bridgeProviders:[e.ServiceType.WRAP_UNWRAP]}],limit:l,page:u}):i.type===e.TokenType.ERC20&&i.address.toLowerCase()===d.wrappedAsset.address.toLowerCase()?n({assets:[{...d.nativeAsset,id:t.getAssetId(o,d.nativeAsset),bridgeProviders:[e.ServiceType.WRAP_UNWRAP]}],limit:l,page:u}):n({assets:[],limit:l,page:u}):n({assets:[],limit:l,page:u})}}exports.getBridgeableAssetsFactory=r;
|
|
2
2
|
//# sourceMappingURL=get-bridgeable-assets.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bridgeable-assets.cjs","names":["TokenType","ServiceType"],"sources":["../../../../src/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../constants';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../types/service';\nimport type {
|
|
1
|
+
{"version":3,"file":"get-bridgeable-assets.cjs","names":["TokenType","getAssetId","ServiceType"],"sources":["../../../../src/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../constants';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../types/service';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { getAssetId } from '../../../utils/asset-id';\nimport type { WrapChainConfig } from '../constants';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: GetBridgeableAssetsResult['assets'];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n chainConfigs,\n}: {\n chainConfigs: ReadonlyMap<Caip2ChainId, WrapChainConfig>;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (sourceChainId !== targetChainId) {\n return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n }\n const config = chainConfigs.get(sourceChainId);\n if (!config) {\n return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n }\n if (sourceAsset.type === TokenType.NATIVE) {\n return paginateAssets({\n assets: [\n {\n ...config.wrappedAsset,\n id: getAssetId(targetChainId, config.wrappedAsset),\n bridgeProviders: [ServiceType.WRAP_UNWRAP],\n },\n ],\n limit: pageLimit,\n page: currentPage,\n });\n }\n if (\n sourceAsset.type === TokenType.ERC20 &&\n sourceAsset.address.toLowerCase() === config.wrappedAsset.address.toLowerCase()\n ) {\n return paginateAssets({\n assets: [\n {\n ...config.nativeAsset,\n id: getAssetId(targetChainId, config.nativeAsset),\n bridgeProviders: [ServiceType.WRAP_UNWRAP],\n },\n ],\n limit: pageLimit,\n page: currentPage,\n });\n }\n return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n };\n}\n"],"mappings":"mFASM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,gBAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAE5B,GAAI,IAAkB,EACpB,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAE5E,IAAM,EAAS,EAAa,IAAI,EAAc,CAiC9C,OAhCK,EAGD,EAAY,OAASA,EAAAA,UAAU,OAC1B,EAAe,CACpB,OAAQ,CACN,CACE,GAAG,EAAO,aACV,GAAIC,EAAAA,WAAW,EAAe,EAAO,aAAa,CAClD,gBAAiB,CAACC,EAAAA,YAAY,YAAY,CAC3C,CACF,CACD,MAAO,EACP,KAAM,EACP,CAAC,CAGF,EAAY,OAASF,EAAAA,UAAU,OAC/B,EAAY,QAAQ,aAAa,GAAK,EAAO,aAAa,QAAQ,aAAa,CAExE,EAAe,CACpB,OAAQ,CACN,CACE,GAAG,EAAO,YACV,GAAIC,EAAAA,WAAW,EAAe,EAAO,YAAY,CACjD,gBAAiB,CAACC,EAAAA,YAAY,YAAY,CAC3C,CACF,CACD,MAAO,EACP,KAAM,EACP,CAAC,CAEG,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CA/BjE,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ServiceType as e,TokenType as t}from"../../../constants.js";
|
|
1
|
+
import{ServiceType as e,TokenType as t}from"../../../constants.js";import{getAssetId as n}from"../../../utils/asset-id.js";const r=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function i({chainConfigs:i}){return async({sourceAsset:a,sourceChainId:o,targetChainId:s,limit:c,page:l})=>{let u=c??100,d=l??1;if(o!==s)return r({assets:[],limit:u,page:d});let f=i.get(o);return f?a.type===t.NATIVE?r({assets:[{...f.wrappedAsset,id:n(s,f.wrappedAsset),bridgeProviders:[e.WRAP_UNWRAP]}],limit:u,page:d}):a.type===t.ERC20&&a.address.toLowerCase()===f.wrappedAsset.address.toLowerCase()?r({assets:[{...f.nativeAsset,id:n(s,f.nativeAsset),bridgeProviders:[e.WRAP_UNWRAP]}],limit:u,page:d}):r({assets:[],limit:u,page:d}):r({assets:[],limit:u,page:d})}}export{i as getBridgeableAssetsFactory};
|
|
2
2
|
//# sourceMappingURL=get-bridgeable-assets.js.map
|