@hypermid/sdk 1.2.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.
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Execution lifecycle management — high-level helpers that manage the
3
+ * full swap flow: quote → execute → poll status until completion.
4
+ *
5
+ * Similar to LI.FI SDK's execution tracking and Near Intents SDK's
6
+ * status polling, but unified across both providers.
7
+ */
8
+ import type { HyperMid } from "./client.js";
9
+ import type { ExecuteParams, ExecuteResponse, LiFiExecuteResponse, NIExecuteResponse, DepositStatusResponse, StatusResponse, QuoteResponse } from "./types.js";
10
+ export type ExecutionStatus = "QUOTE" | "EXECUTING" | "WAITING_DEPOSIT" | "DEPOSIT_SUBMITTED" | "PROCESSING" | "SUCCESS" | "FAILED" | "REFUNDED";
11
+ export interface ExecutionUpdate {
12
+ /** Current execution status */
13
+ status: ExecutionStatus;
14
+ /** The provider handling this swap */
15
+ provider: "lifi" | "near-intents" | "superswap";
16
+ /** The execute response (available after EXECUTING) */
17
+ executeResponse?: ExecuteResponse;
18
+ /** The deposit status (Near Intents only, available during polling) */
19
+ depositStatus?: DepositStatusResponse;
20
+ /** LI.FI status response (available during polling) */
21
+ lifiStatus?: StatusResponse;
22
+ /** Error message if FAILED */
23
+ error?: string;
24
+ }
25
+ export interface ExecutionHooks {
26
+ /** Called on every status change */
27
+ onStatusChange?: (update: ExecutionUpdate) => void;
28
+ /** Called when execute response is received (provider-specific) */
29
+ onExecute?: (response: ExecuteResponse) => void;
30
+ /**
31
+ * Called when LI.FI transactionRequest is ready — you MUST sign and broadcast it.
32
+ * Return the transaction hash after broadcasting.
33
+ *
34
+ * If not provided, the execution will stop after returning the transactionRequest
35
+ * and you'll need to handle signing yourself.
36
+ */
37
+ onTransactionRequest?: (response: LiFiExecuteResponse) => Promise<string>;
38
+ /**
39
+ * Called when Near Intents deposit address is ready and depositMode is "wallet".
40
+ * You MUST send tokens to the deposit address and return the tx hash.
41
+ *
42
+ * If not provided for wallet-mode deposits, the execution will stop after
43
+ * returning the deposit address.
44
+ */
45
+ onDepositRequired?: (response: NIExecuteResponse) => Promise<string>;
46
+ /** Called on each poll iteration with the latest status */
47
+ onPoll?: (status: DepositStatusResponse | StatusResponse) => void;
48
+ }
49
+ export interface ExecutionConfig {
50
+ /** Polling interval in ms (default: 5000) */
51
+ pollIntervalMs?: number;
52
+ /** Maximum time to wait for completion in ms (default: 600000 = 10 min) */
53
+ maxWaitMs?: number;
54
+ /** Maximum number of poll attempts (default: unlimited) */
55
+ maxPolls?: number;
56
+ }
57
+ /**
58
+ * Poll Near Intents deposit/swap status until a terminal state is reached.
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * const finalStatus = await waitForDepositCompletion(hm, {
63
+ * depositAddress: "0x...",
64
+ * }, {
65
+ * onPoll: (status) => console.log("Status:", status.status),
66
+ * });
67
+ * ```
68
+ */
69
+ export declare function waitForDepositCompletion(client: HyperMid, params: {
70
+ depositAddress: string;
71
+ depositMemo?: string;
72
+ }, options?: ExecutionConfig & {
73
+ onPoll?: (status: DepositStatusResponse) => void;
74
+ }): Promise<DepositStatusResponse>;
75
+ /**
76
+ * Poll LI.FI swap status until a terminal state is reached.
77
+ *
78
+ * @example
79
+ * ```ts
80
+ * const finalStatus = await waitForLiFiCompletion(hm, {
81
+ * txHash: "0x...",
82
+ * fromChain: 1,
83
+ * toChain: 42161,
84
+ * });
85
+ * ```
86
+ */
87
+ export declare function waitForLiFiCompletion(client: HyperMid, params: {
88
+ txHash: string;
89
+ fromChain?: string | number;
90
+ toChain?: string | number;
91
+ bridge?: string;
92
+ }, options?: ExecutionConfig & {
93
+ onPoll?: (status: StatusResponse) => void;
94
+ }): Promise<StatusResponse>;
95
+ /**
96
+ * Execute a full swap lifecycle: quote → execute → sign → poll → complete.
97
+ *
98
+ * This is the highest-level SDK method, managing the entire flow. You provide
99
+ * hooks for wallet signing (LI.FI) or token transfer (Near Intents), and the
100
+ * SDK handles everything else.
101
+ *
102
+ * @example Full automated LI.FI swap
103
+ * ```ts
104
+ * import { HyperMid, executeSwap } from "@hypermid/sdk";
105
+ * import { sendTransaction } from "your-wallet-lib";
106
+ *
107
+ * const hm = new HyperMid({ apiKey: "..." });
108
+ *
109
+ * const result = await executeSwap(hm, {
110
+ * fromChain: 1,
111
+ * fromToken: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
112
+ * fromAmount: "100000000",
113
+ * toChain: 42161,
114
+ * toToken: "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8",
115
+ * fromAddress: "0x...",
116
+ * toAddress: "0x...",
117
+ * }, {
118
+ * onTransactionRequest: async (response) => {
119
+ * const txHash = await sendTransaction(response.transactionRequest);
120
+ * return txHash;
121
+ * },
122
+ * onStatusChange: (update) => {
123
+ * console.log(`Status: ${update.status}`);
124
+ * },
125
+ * });
126
+ * ```
127
+ *
128
+ * @example Full automated Near Intents swap (wallet connected)
129
+ * ```ts
130
+ * const result = await executeSwap(hm, {
131
+ * fromChain: ChainId.TRON,
132
+ * fromToken: "...",
133
+ * fromAmount: "10000000",
134
+ * toChain: ChainId.TON,
135
+ * toToken: "...",
136
+ * fromAddress: "T...",
137
+ * toAddress: "EQ...",
138
+ * }, {
139
+ * onDepositRequired: async (response) => {
140
+ * const txHash = await tronWeb.transfer(response.depositAddress, amount);
141
+ * return txHash;
142
+ * },
143
+ * onStatusChange: (update) => {
144
+ * console.log(`Status: ${update.status}`);
145
+ * },
146
+ * });
147
+ * ```
148
+ *
149
+ * @example Manual deposit flow (no wallet signing — just poll)
150
+ * ```ts
151
+ * const result = await executeSwap(hm, {
152
+ * fromChain: ChainId.NEAR,
153
+ * ...params,
154
+ * depositMode: "manual",
155
+ * }, {
156
+ * onStatusChange: (update) => {
157
+ * if (update.status === "WAITING_DEPOSIT" && update.executeResponse) {
158
+ * // Show QR code with depositAddress to user
159
+ * showQRCode(update.executeResponse.depositAddress);
160
+ * }
161
+ * },
162
+ * });
163
+ * // Polling runs until terminal status
164
+ * ```
165
+ */
166
+ export declare function executeSwap(client: HyperMid, params: ExecuteParams, hooks?: ExecutionHooks, config?: ExecutionConfig): Promise<ExecutionUpdate>;
167
+ /**
168
+ * Get a quote and display it before executing. Returns quote data so the
169
+ * partner can show pricing to the user before proceeding.
170
+ *
171
+ * @example
172
+ * ```ts
173
+ * const { quote, execute } = await quoteAndPrepare(hm, {
174
+ * fromChain: 1, fromToken: "0x...", fromAmount: "100000000",
175
+ * toChain: 42161, toToken: "0x...", fromAddress: "0x...", toAddress: "0x...",
176
+ * });
177
+ *
178
+ * // Show quote to user
179
+ * console.log("You'll receive:", quote.quote.estimate?.toAmount);
180
+ *
181
+ * // User confirms → execute
182
+ * const result = await execute({
183
+ * onTransactionRequest: async (resp) => {
184
+ * return await wallet.sendTransaction(resp.transactionRequest);
185
+ * },
186
+ * });
187
+ * ```
188
+ */
189
+ export declare function quoteAndPrepare(client: HyperMid, params: ExecuteParams): Promise<{
190
+ quote: QuoteResponse;
191
+ execute: (hooks?: ExecutionHooks, config?: ExecutionConfig) => Promise<ExecutionUpdate>;
192
+ }>;
193
+ //# sourceMappingURL=execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Execution lifecycle management — high-level helpers that manage the
3
+ * full swap flow: quote → execute → poll status until completion.
4
+ *
5
+ * Similar to LI.FI SDK's execution tracking and Near Intents SDK's
6
+ * status polling, but unified across both providers.
7
+ */
8
+ import { isLiFiRoute, isNearIntentsRoute, isNIStatusTerminal, isLiFiStatusTerminal } from "./helpers.js";
9
+ // ─── Polling helpers ─────────────────────────────────────────────────────
10
+ /**
11
+ * Poll Near Intents deposit/swap status until a terminal state is reached.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const finalStatus = await waitForDepositCompletion(hm, {
16
+ * depositAddress: "0x...",
17
+ * }, {
18
+ * onPoll: (status) => console.log("Status:", status.status),
19
+ * });
20
+ * ```
21
+ */
22
+ export async function waitForDepositCompletion(client, params, options) {
23
+ const interval = options?.pollIntervalMs ?? 5_000;
24
+ const maxWait = options?.maxWaitMs ?? 600_000;
25
+ const maxPolls = options?.maxPolls ?? Infinity;
26
+ const startTime = Date.now();
27
+ let polls = 0;
28
+ while (true) {
29
+ const status = await client.getDepositStatus(params);
30
+ polls++;
31
+ options?.onPoll?.(status);
32
+ if (isNIStatusTerminal(status.status)) {
33
+ return status;
34
+ }
35
+ if (Date.now() - startTime >= maxWait) {
36
+ throw new Error(`Deposit status polling timed out after ${maxWait}ms (last status: ${status.status})`);
37
+ }
38
+ if (polls >= maxPolls) {
39
+ throw new Error(`Deposit status polling exceeded ${maxPolls} attempts (last status: ${status.status})`);
40
+ }
41
+ await sleep(interval);
42
+ }
43
+ }
44
+ /**
45
+ * Poll LI.FI swap status until a terminal state is reached.
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * const finalStatus = await waitForLiFiCompletion(hm, {
50
+ * txHash: "0x...",
51
+ * fromChain: 1,
52
+ * toChain: 42161,
53
+ * });
54
+ * ```
55
+ */
56
+ export async function waitForLiFiCompletion(client, params, options) {
57
+ const interval = options?.pollIntervalMs ?? 5_000;
58
+ const maxWait = options?.maxWaitMs ?? 600_000;
59
+ const maxPolls = options?.maxPolls ?? Infinity;
60
+ const startTime = Date.now();
61
+ let polls = 0;
62
+ while (true) {
63
+ const status = await client.getStatus({
64
+ txHash: params.txHash,
65
+ fromChain: params.fromChain,
66
+ toChain: params.toChain,
67
+ bridge: params.bridge,
68
+ });
69
+ polls++;
70
+ options?.onPoll?.(status);
71
+ if (status.status && isLiFiStatusTerminal(status.status)) {
72
+ return status;
73
+ }
74
+ if (Date.now() - startTime >= maxWait) {
75
+ throw new Error(`LI.FI status polling timed out after ${maxWait}ms (last status: ${status.status})`);
76
+ }
77
+ if (polls >= maxPolls) {
78
+ throw new Error(`LI.FI status polling exceeded ${maxPolls} attempts (last status: ${status.status})`);
79
+ }
80
+ await sleep(interval);
81
+ }
82
+ }
83
+ // ─── Full execution lifecycle ────────────────────────────────────────────
84
+ /**
85
+ * Execute a full swap lifecycle: quote → execute → sign → poll → complete.
86
+ *
87
+ * This is the highest-level SDK method, managing the entire flow. You provide
88
+ * hooks for wallet signing (LI.FI) or token transfer (Near Intents), and the
89
+ * SDK handles everything else.
90
+ *
91
+ * @example Full automated LI.FI swap
92
+ * ```ts
93
+ * import { HyperMid, executeSwap } from "@hypermid/sdk";
94
+ * import { sendTransaction } from "your-wallet-lib";
95
+ *
96
+ * const hm = new HyperMid({ apiKey: "..." });
97
+ *
98
+ * const result = await executeSwap(hm, {
99
+ * fromChain: 1,
100
+ * fromToken: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
101
+ * fromAmount: "100000000",
102
+ * toChain: 42161,
103
+ * toToken: "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8",
104
+ * fromAddress: "0x...",
105
+ * toAddress: "0x...",
106
+ * }, {
107
+ * onTransactionRequest: async (response) => {
108
+ * const txHash = await sendTransaction(response.transactionRequest);
109
+ * return txHash;
110
+ * },
111
+ * onStatusChange: (update) => {
112
+ * console.log(`Status: ${update.status}`);
113
+ * },
114
+ * });
115
+ * ```
116
+ *
117
+ * @example Full automated Near Intents swap (wallet connected)
118
+ * ```ts
119
+ * const result = await executeSwap(hm, {
120
+ * fromChain: ChainId.TRON,
121
+ * fromToken: "...",
122
+ * fromAmount: "10000000",
123
+ * toChain: ChainId.TON,
124
+ * toToken: "...",
125
+ * fromAddress: "T...",
126
+ * toAddress: "EQ...",
127
+ * }, {
128
+ * onDepositRequired: async (response) => {
129
+ * const txHash = await tronWeb.transfer(response.depositAddress, amount);
130
+ * return txHash;
131
+ * },
132
+ * onStatusChange: (update) => {
133
+ * console.log(`Status: ${update.status}`);
134
+ * },
135
+ * });
136
+ * ```
137
+ *
138
+ * @example Manual deposit flow (no wallet signing — just poll)
139
+ * ```ts
140
+ * const result = await executeSwap(hm, {
141
+ * fromChain: ChainId.NEAR,
142
+ * ...params,
143
+ * depositMode: "manual",
144
+ * }, {
145
+ * onStatusChange: (update) => {
146
+ * if (update.status === "WAITING_DEPOSIT" && update.executeResponse) {
147
+ * // Show QR code with depositAddress to user
148
+ * showQRCode(update.executeResponse.depositAddress);
149
+ * }
150
+ * },
151
+ * });
152
+ * // Polling runs until terminal status
153
+ * ```
154
+ */
155
+ export async function executeSwap(client, params, hooks, config) {
156
+ const emit = (update) => {
157
+ hooks?.onStatusChange?.(update);
158
+ return update;
159
+ };
160
+ // Step 1: Execute
161
+ emit({ status: "EXECUTING", provider: "lifi" }); // provider TBD until response
162
+ const executeResponse = await client.execute(params);
163
+ const provider = executeResponse.provider;
164
+ hooks?.onExecute?.(executeResponse);
165
+ // Step 2: Provider-specific handling
166
+ if (isLiFiRoute(executeResponse)) {
167
+ // LI.FI: need wallet to sign transactionRequest
168
+ if (!hooks?.onTransactionRequest) {
169
+ // No signing hook — return the transactionRequest for manual handling
170
+ return emit({
171
+ status: "EXECUTING",
172
+ provider: "lifi",
173
+ executeResponse,
174
+ });
175
+ }
176
+ const txHash = await hooks.onTransactionRequest(executeResponse);
177
+ emit({
178
+ status: "PROCESSING",
179
+ provider: "lifi",
180
+ executeResponse,
181
+ });
182
+ // Poll LI.FI status
183
+ const finalStatus = await waitForLiFiCompletion(client, {
184
+ txHash,
185
+ fromChain: params.fromChain,
186
+ toChain: params.toChain,
187
+ }, {
188
+ ...config,
189
+ onPoll: (status) => {
190
+ hooks?.onPoll?.(status);
191
+ emit({
192
+ status: "PROCESSING",
193
+ provider: "lifi",
194
+ executeResponse,
195
+ lifiStatus: status,
196
+ });
197
+ },
198
+ });
199
+ const finalLiFiStatus = finalStatus.status === "DONE" ? "SUCCESS" : "FAILED";
200
+ return emit({
201
+ status: finalLiFiStatus,
202
+ provider: "lifi",
203
+ executeResponse,
204
+ lifiStatus: finalStatus,
205
+ });
206
+ }
207
+ // Near Intents route
208
+ if (isNearIntentsRoute(executeResponse)) {
209
+ const isManual = executeResponse.depositMode === "manual";
210
+ if (isManual) {
211
+ // Manual deposit: show address to user, then poll
212
+ emit({
213
+ status: "WAITING_DEPOSIT",
214
+ provider: "near-intents",
215
+ executeResponse,
216
+ });
217
+ // Poll — 1Click auto-detects manual deposits
218
+ const finalStatus = await waitForDepositCompletion(client, {
219
+ depositAddress: executeResponse.depositAddress,
220
+ depositMemo: executeResponse.depositMemo,
221
+ }, {
222
+ ...config,
223
+ onPoll: (status) => {
224
+ hooks?.onPoll?.(status);
225
+ emit({
226
+ status: isNIStatusTerminal(status.status)
227
+ ? mapNIStatus(status.status)
228
+ : "PROCESSING",
229
+ provider: "near-intents",
230
+ executeResponse,
231
+ depositStatus: status,
232
+ });
233
+ },
234
+ });
235
+ return emit({
236
+ status: mapNIStatus(finalStatus.status),
237
+ provider: "near-intents",
238
+ executeResponse,
239
+ depositStatus: finalStatus,
240
+ });
241
+ }
242
+ // Wallet deposit
243
+ if (!hooks?.onDepositRequired) {
244
+ // No deposit hook — return deposit address for manual handling
245
+ return emit({
246
+ status: "WAITING_DEPOSIT",
247
+ provider: "near-intents",
248
+ executeResponse,
249
+ });
250
+ }
251
+ const txHash = await hooks.onDepositRequired(executeResponse);
252
+ emit({
253
+ status: "DEPOSIT_SUBMITTED",
254
+ provider: "near-intents",
255
+ executeResponse,
256
+ });
257
+ // Submit deposit tx hash for faster detection
258
+ await client.submitDeposit({
259
+ txHash,
260
+ depositAddress: executeResponse.depositAddress,
261
+ });
262
+ // Poll deposit status
263
+ const finalStatus = await waitForDepositCompletion(client, {
264
+ depositAddress: executeResponse.depositAddress,
265
+ depositMemo: executeResponse.depositMemo,
266
+ }, {
267
+ ...config,
268
+ onPoll: (status) => {
269
+ hooks?.onPoll?.(status);
270
+ emit({
271
+ status: isNIStatusTerminal(status.status)
272
+ ? mapNIStatus(status.status)
273
+ : "PROCESSING",
274
+ provider: "near-intents",
275
+ executeResponse,
276
+ depositStatus: status,
277
+ });
278
+ },
279
+ });
280
+ return emit({
281
+ status: mapNIStatus(finalStatus.status),
282
+ provider: "near-intents",
283
+ executeResponse,
284
+ depositStatus: finalStatus,
285
+ });
286
+ }
287
+ // Should never reach here
288
+ return emit({
289
+ status: "FAILED",
290
+ provider: executeResponse.provider,
291
+ executeResponse: executeResponse,
292
+ error: "Unknown provider in execute response",
293
+ });
294
+ }
295
+ // ─── Convenience: Quote + Execute in one call ────────────────────────────
296
+ /**
297
+ * Get a quote and display it before executing. Returns quote data so the
298
+ * partner can show pricing to the user before proceeding.
299
+ *
300
+ * @example
301
+ * ```ts
302
+ * const { quote, execute } = await quoteAndPrepare(hm, {
303
+ * fromChain: 1, fromToken: "0x...", fromAmount: "100000000",
304
+ * toChain: 42161, toToken: "0x...", fromAddress: "0x...", toAddress: "0x...",
305
+ * });
306
+ *
307
+ * // Show quote to user
308
+ * console.log("You'll receive:", quote.quote.estimate?.toAmount);
309
+ *
310
+ * // User confirms → execute
311
+ * const result = await execute({
312
+ * onTransactionRequest: async (resp) => {
313
+ * return await wallet.sendTransaction(resp.transactionRequest);
314
+ * },
315
+ * });
316
+ * ```
317
+ */
318
+ export async function quoteAndPrepare(client, params) {
319
+ const quoteParams = {
320
+ fromChain: params.fromChain,
321
+ fromToken: params.fromToken,
322
+ fromAmount: params.fromAmount,
323
+ toChain: params.toChain,
324
+ toToken: params.toToken,
325
+ fromAddress: params.fromAddress,
326
+ toAddress: params.toAddress,
327
+ slippage: params.slippage,
328
+ order: params.order,
329
+ };
330
+ const quote = await client.getQuote(quoteParams);
331
+ return {
332
+ quote,
333
+ execute: (hooks, config) => executeSwap(client, params, hooks, config),
334
+ };
335
+ }
336
+ // ─── Internal helpers ────────────────────────────────────────────────────
337
+ function mapNIStatus(status) {
338
+ switch (status) {
339
+ case "SUCCESS": return "SUCCESS";
340
+ case "REFUNDED": return "REFUNDED";
341
+ case "FAILED": return "FAILED";
342
+ default: return "PROCESSING";
343
+ }
344
+ }
345
+ function sleep(ms) {
346
+ return new Promise((resolve) => setTimeout(resolve, ms));
347
+ }
348
+ //# sourceMappingURL=execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.js","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Type guards and utility helpers for working with HyperMid API responses.
3
+ */
4
+ import type { ExecuteResponse, LiFiExecuteResponse, NIExecuteResponse, SuperSwapExecuteResponse, DepositStatusResponse } from "./types.js";
5
+ /**
6
+ * Check if an execute response is a LI.FI route (has transactionRequest).
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const result = await hm.execute(params);
11
+ * if (isLiFiRoute(result)) {
12
+ * const tx = result.transactionRequest;
13
+ * // Sign and send with your wallet provider
14
+ * }
15
+ * ```
16
+ */
17
+ export declare function isLiFiRoute(response: ExecuteResponse): response is LiFiExecuteResponse;
18
+ /**
19
+ * Check if an execute response is a SuperSwap route (PulseChain via Hyperlane).
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const result = await hm.execute(params);
24
+ * if (isSuperSwapRoute(result)) {
25
+ * const tx = result.transactionRequest;
26
+ * // Sign and send, then call registerInboundReceiver()
27
+ * }
28
+ * ```
29
+ */
30
+ export declare function isSuperSwapRoute(response: ExecuteResponse): response is SuperSwapExecuteResponse;
31
+ /**
32
+ * Check if an execute response is a Near Intents route (has depositAddress).
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * const result = await hm.execute(params);
37
+ * if (isNearIntentsRoute(result)) {
38
+ * console.log("Send tokens to:", result.depositAddress);
39
+ * }
40
+ * ```
41
+ */
42
+ export declare function isNearIntentsRoute(response: ExecuteResponse): response is NIExecuteResponse;
43
+ /**
44
+ * Check if a Near Intents deposit requires manual user action (QR code / copy address).
45
+ */
46
+ export declare function isManualDeposit(response: ExecuteResponse): boolean;
47
+ /**
48
+ * Check if a Near Intents deposit can be done programmatically via wallet.
49
+ */
50
+ export declare function isWalletDeposit(response: ExecuteResponse): boolean;
51
+ /**
52
+ * Check if a Near Intents deposit status is terminal (no more polling needed).
53
+ */
54
+ export declare function isNIStatusTerminal(status: string): boolean;
55
+ /**
56
+ * Check if a LI.FI status is terminal.
57
+ */
58
+ export declare function isLiFiStatusTerminal(status: string): boolean;
59
+ /**
60
+ * Check if a Near Intents swap completed successfully.
61
+ */
62
+ export declare function isDepositSuccess(response: DepositStatusResponse): boolean;
63
+ /**
64
+ * Check if a Near Intents swap was refunded.
65
+ */
66
+ export declare function isDepositRefunded(response: DepositStatusResponse): boolean;
67
+ /**
68
+ * Check if a Near Intents swap failed.
69
+ */
70
+ export declare function isDepositFailed(response: DepositStatusResponse): boolean;
71
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,IAAI,mBAAmB,CAEtF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,IAAI,wBAAwB,CAEhG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,IAAI,iBAAiB,CAE3F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAElE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAKlE;AAUD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAEzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAE1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAExE"}