@hypermid/sdk 1.2.0 → 2.0.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/README.md +4 -4
- package/dist/cjs/chain-registry.js +519 -0
- package/dist/cjs/chain-registry.js.map +1 -0
- package/dist/cjs/chains.js +102 -0
- package/dist/cjs/chains.js.map +1 -0
- package/dist/cjs/client.js +481 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/errors.js +62 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/execution.js +354 -0
- package/dist/cjs/execution.js.map +1 -0
- package/dist/cjs/helpers.js +109 -0
- package/dist/cjs/helpers.js.map +1 -0
- package/dist/cjs/index.js +51 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/types.js +4 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/webhook-verify.js +112 -0
- package/dist/cjs/webhook-verify.js.map +1 -0
- package/dist/esm/chain-registry.d.ts.map +1 -0
- package/dist/esm/chain-registry.js.map +1 -0
- package/dist/esm/chains.d.ts.map +1 -0
- package/dist/esm/chains.js.map +1 -0
- package/dist/{client.d.ts → esm/client.d.ts} +3 -3
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/{client.js → esm/client.js} +6 -6
- package/dist/esm/client.js.map +1 -0
- package/dist/{errors.d.ts → esm/errors.d.ts} +4 -4
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/{errors.js → esm/errors.js} +7 -7
- package/dist/esm/errors.js.map +1 -0
- package/dist/{execution.d.ts → esm/execution.d.ts} +7 -7
- package/dist/esm/execution.d.ts.map +1 -0
- package/dist/{execution.js → esm/execution.js} +2 -2
- package/dist/esm/execution.js.map +1 -0
- package/dist/{helpers.d.ts → esm/helpers.d.ts} +1 -1
- package/dist/esm/helpers.d.ts.map +1 -0
- package/dist/{helpers.js → esm/helpers.js} +1 -1
- package/dist/esm/helpers.js.map +1 -0
- package/dist/{index.d.ts → esm/index.d.ts} +3 -3
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/{index.js → esm/index.js} +2 -2
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/{types.d.ts → esm/types.d.ts} +1 -1
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/{webhook-verify.d.ts → esm/webhook-verify.d.ts} +1 -1
- package/dist/esm/webhook-verify.d.ts.map +1 -0
- package/dist/{webhook-verify.js → esm/webhook-verify.js} +1 -1
- package/dist/esm/webhook-verify.js.map +1 -0
- package/package.json +13 -10
- package/dist/chain-registry.d.ts.map +0 -1
- package/dist/chain-registry.js.map +0 -1
- package/dist/chains.d.ts.map +0 -1
- package/dist/chains.js.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/execution.d.ts.map +0 -1
- package/dist/execution.js.map +0 -1
- package/dist/helpers.d.ts.map +0 -1
- package/dist/helpers.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/webhook-verify.d.ts.map +0 -1
- package/dist/webhook-verify.js.map +0 -1
- /package/dist/{chain-registry.d.ts → esm/chain-registry.d.ts} +0 -0
- /package/dist/{chain-registry.js → esm/chain-registry.js} +0 -0
- /package/dist/{chains.d.ts → esm/chains.d.ts} +0 -0
- /package/dist/{chains.js → esm/chains.js} +0 -0
- /package/dist/{types.js → esm/types.js} +0 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Execution lifecycle management — high-level helpers that manage the
|
|
4
|
+
* full swap flow: quote → execute → poll status until completion.
|
|
5
|
+
*
|
|
6
|
+
* Similar to LI.FI SDK's execution tracking and Near Intents SDK's
|
|
7
|
+
* status polling, but unified across both providers.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.waitForDepositCompletion = waitForDepositCompletion;
|
|
11
|
+
exports.waitForLiFiCompletion = waitForLiFiCompletion;
|
|
12
|
+
exports.executeSwap = executeSwap;
|
|
13
|
+
exports.quoteAndPrepare = quoteAndPrepare;
|
|
14
|
+
const helpers_js_1 = require("./helpers.js");
|
|
15
|
+
// ─── Polling helpers ─────────────────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* Poll Near Intents deposit/swap status until a terminal state is reached.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const finalStatus = await waitForDepositCompletion(hm, {
|
|
22
|
+
* depositAddress: "0x...",
|
|
23
|
+
* }, {
|
|
24
|
+
* onPoll: (status) => console.log("Status:", status.status),
|
|
25
|
+
* });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
async function waitForDepositCompletion(client, params, options) {
|
|
29
|
+
const interval = options?.pollIntervalMs ?? 5_000;
|
|
30
|
+
const maxWait = options?.maxWaitMs ?? 600_000;
|
|
31
|
+
const maxPolls = options?.maxPolls ?? Infinity;
|
|
32
|
+
const startTime = Date.now();
|
|
33
|
+
let polls = 0;
|
|
34
|
+
while (true) {
|
|
35
|
+
const status = await client.getDepositStatus(params);
|
|
36
|
+
polls++;
|
|
37
|
+
options?.onPoll?.(status);
|
|
38
|
+
if ((0, helpers_js_1.isNIStatusTerminal)(status.status)) {
|
|
39
|
+
return status;
|
|
40
|
+
}
|
|
41
|
+
if (Date.now() - startTime >= maxWait) {
|
|
42
|
+
throw new Error(`Deposit status polling timed out after ${maxWait}ms (last status: ${status.status})`);
|
|
43
|
+
}
|
|
44
|
+
if (polls >= maxPolls) {
|
|
45
|
+
throw new Error(`Deposit status polling exceeded ${maxPolls} attempts (last status: ${status.status})`);
|
|
46
|
+
}
|
|
47
|
+
await sleep(interval);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Poll LI.FI swap status until a terminal state is reached.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* const finalStatus = await waitForLiFiCompletion(hm, {
|
|
56
|
+
* txHash: "0x...",
|
|
57
|
+
* fromChain: 1,
|
|
58
|
+
* toChain: 42161,
|
|
59
|
+
* });
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
async function waitForLiFiCompletion(client, params, options) {
|
|
63
|
+
const interval = options?.pollIntervalMs ?? 5_000;
|
|
64
|
+
const maxWait = options?.maxWaitMs ?? 600_000;
|
|
65
|
+
const maxPolls = options?.maxPolls ?? Infinity;
|
|
66
|
+
const startTime = Date.now();
|
|
67
|
+
let polls = 0;
|
|
68
|
+
while (true) {
|
|
69
|
+
const status = await client.getStatus({
|
|
70
|
+
txHash: params.txHash,
|
|
71
|
+
fromChain: params.fromChain,
|
|
72
|
+
toChain: params.toChain,
|
|
73
|
+
bridge: params.bridge,
|
|
74
|
+
});
|
|
75
|
+
polls++;
|
|
76
|
+
options?.onPoll?.(status);
|
|
77
|
+
if (status.status && (0, helpers_js_1.isLiFiStatusTerminal)(status.status)) {
|
|
78
|
+
return status;
|
|
79
|
+
}
|
|
80
|
+
if (Date.now() - startTime >= maxWait) {
|
|
81
|
+
throw new Error(`LI.FI status polling timed out after ${maxWait}ms (last status: ${status.status})`);
|
|
82
|
+
}
|
|
83
|
+
if (polls >= maxPolls) {
|
|
84
|
+
throw new Error(`LI.FI status polling exceeded ${maxPolls} attempts (last status: ${status.status})`);
|
|
85
|
+
}
|
|
86
|
+
await sleep(interval);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// ─── Full execution lifecycle ────────────────────────────────────────────
|
|
90
|
+
/**
|
|
91
|
+
* Execute a full swap lifecycle: quote → execute → sign → poll → complete.
|
|
92
|
+
*
|
|
93
|
+
* This is the highest-level SDK method, managing the entire flow. You provide
|
|
94
|
+
* hooks for wallet signing (LI.FI) or token transfer (Near Intents), and the
|
|
95
|
+
* SDK handles everything else.
|
|
96
|
+
*
|
|
97
|
+
* @example Full automated LI.FI swap
|
|
98
|
+
* ```ts
|
|
99
|
+
* import { Hypermid, executeSwap } from "@hypermid/sdk";
|
|
100
|
+
* import { sendTransaction } from "your-wallet-lib";
|
|
101
|
+
*
|
|
102
|
+
* const hm = new Hypermid({ apiKey: "..." });
|
|
103
|
+
*
|
|
104
|
+
* const result = await executeSwap(hm, {
|
|
105
|
+
* fromChain: 1,
|
|
106
|
+
* fromToken: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
107
|
+
* fromAmount: "100000000",
|
|
108
|
+
* toChain: 42161,
|
|
109
|
+
* toToken: "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8",
|
|
110
|
+
* fromAddress: "0x...",
|
|
111
|
+
* toAddress: "0x...",
|
|
112
|
+
* }, {
|
|
113
|
+
* onTransactionRequest: async (response) => {
|
|
114
|
+
* const txHash = await sendTransaction(response.transactionRequest);
|
|
115
|
+
* return txHash;
|
|
116
|
+
* },
|
|
117
|
+
* onStatusChange: (update) => {
|
|
118
|
+
* console.log(`Status: ${update.status}`);
|
|
119
|
+
* },
|
|
120
|
+
* });
|
|
121
|
+
* ```
|
|
122
|
+
*
|
|
123
|
+
* @example Full automated Near Intents swap (wallet connected)
|
|
124
|
+
* ```ts
|
|
125
|
+
* const result = await executeSwap(hm, {
|
|
126
|
+
* fromChain: ChainId.TRON,
|
|
127
|
+
* fromToken: "...",
|
|
128
|
+
* fromAmount: "10000000",
|
|
129
|
+
* toChain: ChainId.TON,
|
|
130
|
+
* toToken: "...",
|
|
131
|
+
* fromAddress: "T...",
|
|
132
|
+
* toAddress: "EQ...",
|
|
133
|
+
* }, {
|
|
134
|
+
* onDepositRequired: async (response) => {
|
|
135
|
+
* const txHash = await tronWeb.transfer(response.depositAddress, amount);
|
|
136
|
+
* return txHash;
|
|
137
|
+
* },
|
|
138
|
+
* onStatusChange: (update) => {
|
|
139
|
+
* console.log(`Status: ${update.status}`);
|
|
140
|
+
* },
|
|
141
|
+
* });
|
|
142
|
+
* ```
|
|
143
|
+
*
|
|
144
|
+
* @example Manual deposit flow (no wallet signing — just poll)
|
|
145
|
+
* ```ts
|
|
146
|
+
* const result = await executeSwap(hm, {
|
|
147
|
+
* fromChain: ChainId.NEAR,
|
|
148
|
+
* ...params,
|
|
149
|
+
* depositMode: "manual",
|
|
150
|
+
* }, {
|
|
151
|
+
* onStatusChange: (update) => {
|
|
152
|
+
* if (update.status === "WAITING_DEPOSIT" && update.executeResponse) {
|
|
153
|
+
* // Show QR code with depositAddress to user
|
|
154
|
+
* showQRCode(update.executeResponse.depositAddress);
|
|
155
|
+
* }
|
|
156
|
+
* },
|
|
157
|
+
* });
|
|
158
|
+
* // Polling runs until terminal status
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
async function executeSwap(client, params, hooks, config) {
|
|
162
|
+
const emit = (update) => {
|
|
163
|
+
hooks?.onStatusChange?.(update);
|
|
164
|
+
return update;
|
|
165
|
+
};
|
|
166
|
+
// Step 1: Execute
|
|
167
|
+
emit({ status: "EXECUTING", provider: "lifi" }); // provider TBD until response
|
|
168
|
+
const executeResponse = await client.execute(params);
|
|
169
|
+
const provider = executeResponse.provider;
|
|
170
|
+
hooks?.onExecute?.(executeResponse);
|
|
171
|
+
// Step 2: Provider-specific handling
|
|
172
|
+
if ((0, helpers_js_1.isLiFiRoute)(executeResponse)) {
|
|
173
|
+
// LI.FI: need wallet to sign transactionRequest
|
|
174
|
+
if (!hooks?.onTransactionRequest) {
|
|
175
|
+
// No signing hook — return the transactionRequest for manual handling
|
|
176
|
+
return emit({
|
|
177
|
+
status: "EXECUTING",
|
|
178
|
+
provider: "lifi",
|
|
179
|
+
executeResponse,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
const txHash = await hooks.onTransactionRequest(executeResponse);
|
|
183
|
+
emit({
|
|
184
|
+
status: "PROCESSING",
|
|
185
|
+
provider: "lifi",
|
|
186
|
+
executeResponse,
|
|
187
|
+
});
|
|
188
|
+
// Poll LI.FI status
|
|
189
|
+
const finalStatus = await waitForLiFiCompletion(client, {
|
|
190
|
+
txHash,
|
|
191
|
+
fromChain: params.fromChain,
|
|
192
|
+
toChain: params.toChain,
|
|
193
|
+
}, {
|
|
194
|
+
...config,
|
|
195
|
+
onPoll: (status) => {
|
|
196
|
+
hooks?.onPoll?.(status);
|
|
197
|
+
emit({
|
|
198
|
+
status: "PROCESSING",
|
|
199
|
+
provider: "lifi",
|
|
200
|
+
executeResponse,
|
|
201
|
+
lifiStatus: status,
|
|
202
|
+
});
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
const finalLiFiStatus = finalStatus.status === "DONE" ? "SUCCESS" : "FAILED";
|
|
206
|
+
return emit({
|
|
207
|
+
status: finalLiFiStatus,
|
|
208
|
+
provider: "lifi",
|
|
209
|
+
executeResponse,
|
|
210
|
+
lifiStatus: finalStatus,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
// Near Intents route
|
|
214
|
+
if ((0, helpers_js_1.isNearIntentsRoute)(executeResponse)) {
|
|
215
|
+
const isManual = executeResponse.depositMode === "manual";
|
|
216
|
+
if (isManual) {
|
|
217
|
+
// Manual deposit: show address to user, then poll
|
|
218
|
+
emit({
|
|
219
|
+
status: "WAITING_DEPOSIT",
|
|
220
|
+
provider: "near-intents",
|
|
221
|
+
executeResponse,
|
|
222
|
+
});
|
|
223
|
+
// Poll — 1Click auto-detects manual deposits
|
|
224
|
+
const finalStatus = await waitForDepositCompletion(client, {
|
|
225
|
+
depositAddress: executeResponse.depositAddress,
|
|
226
|
+
depositMemo: executeResponse.depositMemo,
|
|
227
|
+
}, {
|
|
228
|
+
...config,
|
|
229
|
+
onPoll: (status) => {
|
|
230
|
+
hooks?.onPoll?.(status);
|
|
231
|
+
emit({
|
|
232
|
+
status: (0, helpers_js_1.isNIStatusTerminal)(status.status)
|
|
233
|
+
? mapNIStatus(status.status)
|
|
234
|
+
: "PROCESSING",
|
|
235
|
+
provider: "near-intents",
|
|
236
|
+
executeResponse,
|
|
237
|
+
depositStatus: status,
|
|
238
|
+
});
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
return emit({
|
|
242
|
+
status: mapNIStatus(finalStatus.status),
|
|
243
|
+
provider: "near-intents",
|
|
244
|
+
executeResponse,
|
|
245
|
+
depositStatus: finalStatus,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
// Wallet deposit
|
|
249
|
+
if (!hooks?.onDepositRequired) {
|
|
250
|
+
// No deposit hook — return deposit address for manual handling
|
|
251
|
+
return emit({
|
|
252
|
+
status: "WAITING_DEPOSIT",
|
|
253
|
+
provider: "near-intents",
|
|
254
|
+
executeResponse,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
const txHash = await hooks.onDepositRequired(executeResponse);
|
|
258
|
+
emit({
|
|
259
|
+
status: "DEPOSIT_SUBMITTED",
|
|
260
|
+
provider: "near-intents",
|
|
261
|
+
executeResponse,
|
|
262
|
+
});
|
|
263
|
+
// Submit deposit tx hash for faster detection
|
|
264
|
+
await client.submitDeposit({
|
|
265
|
+
txHash,
|
|
266
|
+
depositAddress: executeResponse.depositAddress,
|
|
267
|
+
});
|
|
268
|
+
// Poll deposit status
|
|
269
|
+
const finalStatus = await waitForDepositCompletion(client, {
|
|
270
|
+
depositAddress: executeResponse.depositAddress,
|
|
271
|
+
depositMemo: executeResponse.depositMemo,
|
|
272
|
+
}, {
|
|
273
|
+
...config,
|
|
274
|
+
onPoll: (status) => {
|
|
275
|
+
hooks?.onPoll?.(status);
|
|
276
|
+
emit({
|
|
277
|
+
status: (0, helpers_js_1.isNIStatusTerminal)(status.status)
|
|
278
|
+
? mapNIStatus(status.status)
|
|
279
|
+
: "PROCESSING",
|
|
280
|
+
provider: "near-intents",
|
|
281
|
+
executeResponse,
|
|
282
|
+
depositStatus: status,
|
|
283
|
+
});
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
return emit({
|
|
287
|
+
status: mapNIStatus(finalStatus.status),
|
|
288
|
+
provider: "near-intents",
|
|
289
|
+
executeResponse,
|
|
290
|
+
depositStatus: finalStatus,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
// Should never reach here
|
|
294
|
+
return emit({
|
|
295
|
+
status: "FAILED",
|
|
296
|
+
provider: executeResponse.provider,
|
|
297
|
+
executeResponse: executeResponse,
|
|
298
|
+
error: "Unknown provider in execute response",
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
// ─── Convenience: Quote + Execute in one call ────────────────────────────
|
|
302
|
+
/**
|
|
303
|
+
* Get a quote and display it before executing. Returns quote data so the
|
|
304
|
+
* partner can show pricing to the user before proceeding.
|
|
305
|
+
*
|
|
306
|
+
* @example
|
|
307
|
+
* ```ts
|
|
308
|
+
* const { quote, execute } = await quoteAndPrepare(hm, {
|
|
309
|
+
* fromChain: 1, fromToken: "0x...", fromAmount: "100000000",
|
|
310
|
+
* toChain: 42161, toToken: "0x...", fromAddress: "0x...", toAddress: "0x...",
|
|
311
|
+
* });
|
|
312
|
+
*
|
|
313
|
+
* // Show quote to user
|
|
314
|
+
* console.log("You'll receive:", quote.quote.estimate?.toAmount);
|
|
315
|
+
*
|
|
316
|
+
* // User confirms → execute
|
|
317
|
+
* const result = await execute({
|
|
318
|
+
* onTransactionRequest: async (resp) => {
|
|
319
|
+
* return await wallet.sendTransaction(resp.transactionRequest);
|
|
320
|
+
* },
|
|
321
|
+
* });
|
|
322
|
+
* ```
|
|
323
|
+
*/
|
|
324
|
+
async function quoteAndPrepare(client, params) {
|
|
325
|
+
const quoteParams = {
|
|
326
|
+
fromChain: params.fromChain,
|
|
327
|
+
fromToken: params.fromToken,
|
|
328
|
+
fromAmount: params.fromAmount,
|
|
329
|
+
toChain: params.toChain,
|
|
330
|
+
toToken: params.toToken,
|
|
331
|
+
fromAddress: params.fromAddress,
|
|
332
|
+
toAddress: params.toAddress,
|
|
333
|
+
slippage: params.slippage,
|
|
334
|
+
order: params.order,
|
|
335
|
+
};
|
|
336
|
+
const quote = await client.getQuote(quoteParams);
|
|
337
|
+
return {
|
|
338
|
+
quote,
|
|
339
|
+
execute: (hooks, config) => executeSwap(client, params, hooks, config),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
// ─── Internal helpers ────────────────────────────────────────────────────
|
|
343
|
+
function mapNIStatus(status) {
|
|
344
|
+
switch (status) {
|
|
345
|
+
case "SUCCESS": return "SUCCESS";
|
|
346
|
+
case "REFUNDED": return "REFUNDED";
|
|
347
|
+
case "FAILED": return "FAILED";
|
|
348
|
+
default: return "PROCESSING";
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
function sleep(ms) {
|
|
352
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
353
|
+
}
|
|
354
|
+
//# 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,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Type guards and utility helpers for working with Hypermid API responses.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isLiFiRoute = isLiFiRoute;
|
|
7
|
+
exports.isSuperSwapRoute = isSuperSwapRoute;
|
|
8
|
+
exports.isNearIntentsRoute = isNearIntentsRoute;
|
|
9
|
+
exports.isManualDeposit = isManualDeposit;
|
|
10
|
+
exports.isWalletDeposit = isWalletDeposit;
|
|
11
|
+
exports.isNIStatusTerminal = isNIStatusTerminal;
|
|
12
|
+
exports.isLiFiStatusTerminal = isLiFiStatusTerminal;
|
|
13
|
+
exports.isDepositSuccess = isDepositSuccess;
|
|
14
|
+
exports.isDepositRefunded = isDepositRefunded;
|
|
15
|
+
exports.isDepositFailed = isDepositFailed;
|
|
16
|
+
// ─── Type Guards ─────────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Check if an execute response is a LI.FI route (has transactionRequest).
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const result = await hm.execute(params);
|
|
23
|
+
* if (isLiFiRoute(result)) {
|
|
24
|
+
* const tx = result.transactionRequest;
|
|
25
|
+
* // Sign and send with your wallet provider
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
function isLiFiRoute(response) {
|
|
30
|
+
return response.provider === "lifi";
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if an execute response is a SuperSwap route (PulseChain via Hyperlane).
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* const result = await hm.execute(params);
|
|
38
|
+
* if (isSuperSwapRoute(result)) {
|
|
39
|
+
* const tx = result.transactionRequest;
|
|
40
|
+
* // Sign and send, then call registerInboundReceiver()
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
function isSuperSwapRoute(response) {
|
|
45
|
+
return response.provider === "superswap";
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check if an execute response is a Near Intents route (has depositAddress).
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* const result = await hm.execute(params);
|
|
53
|
+
* if (isNearIntentsRoute(result)) {
|
|
54
|
+
* console.log("Send tokens to:", result.depositAddress);
|
|
55
|
+
* }
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
function isNearIntentsRoute(response) {
|
|
59
|
+
return response.provider === "near-intents";
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if a Near Intents deposit requires manual user action (QR code / copy address).
|
|
63
|
+
*/
|
|
64
|
+
function isManualDeposit(response) {
|
|
65
|
+
return response.provider === "near-intents" && response.depositMode === "manual";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if a Near Intents deposit can be done programmatically via wallet.
|
|
69
|
+
*/
|
|
70
|
+
function isWalletDeposit(response) {
|
|
71
|
+
return (response.provider === "lifi" ||
|
|
72
|
+
(response.provider === "near-intents" && response.depositMode === "wallet"));
|
|
73
|
+
}
|
|
74
|
+
// ─── Status Helpers ──────────────────────────────────────────────────────
|
|
75
|
+
/** Terminal NI deposit statuses — polling should stop here */
|
|
76
|
+
const TERMINAL_NI_STATUSES = new Set(["SUCCESS", "REFUNDED", "FAILED"]);
|
|
77
|
+
/** Terminal LI.FI statuses */
|
|
78
|
+
const TERMINAL_LIFI_STATUSES = new Set(["DONE", "FAILED"]);
|
|
79
|
+
/**
|
|
80
|
+
* Check if a Near Intents deposit status is terminal (no more polling needed).
|
|
81
|
+
*/
|
|
82
|
+
function isNIStatusTerminal(status) {
|
|
83
|
+
return TERMINAL_NI_STATUSES.has(status);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if a LI.FI status is terminal.
|
|
87
|
+
*/
|
|
88
|
+
function isLiFiStatusTerminal(status) {
|
|
89
|
+
return TERMINAL_LIFI_STATUSES.has(status);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if a Near Intents swap completed successfully.
|
|
93
|
+
*/
|
|
94
|
+
function isDepositSuccess(response) {
|
|
95
|
+
return response.status === "SUCCESS";
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check if a Near Intents swap was refunded.
|
|
99
|
+
*/
|
|
100
|
+
function isDepositRefunded(response) {
|
|
101
|
+
return response.status === "REFUNDED";
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check if a Near Intents swap failed.
|
|
105
|
+
*/
|
|
106
|
+
function isDepositFailed(response) {
|
|
107
|
+
return response.status === "FAILED";
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAwBH,kCAEC;AAcD,4CAEC;AAaD,gDAEC;AAKD,0CAEC;AAKD,0CAKC;AAaD,gDAEC;AAKD,oDAEC;AAKD,4CAEC;AAKD,8CAEC;AAKD,0CAEC;AA3GD,4EAA4E;AAE5E;;;;;;;;;;;GAWG;AACH,SAAgB,WAAW,CAAC,QAAyB;IACnD,OAAO,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,gBAAgB,CAAC,QAAyB;IACxD,OAAO,QAAQ,CAAC,QAAQ,KAAK,WAAW,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,kBAAkB,CAAC,QAAyB;IAC1D,OAAO,QAAQ,CAAC,QAAQ,KAAK,cAAc,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,QAAyB;IACvD,OAAO,QAAQ,CAAC,QAAQ,KAAK,cAAc,IAAI,QAAQ,CAAC,WAAW,KAAK,QAAQ,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,QAAyB;IACvD,OAAO,CACL,QAAQ,CAAC,QAAQ,KAAK,MAAM;QAC5B,CAAC,QAAQ,CAAC,QAAQ,KAAK,cAAc,IAAI,QAAQ,CAAC,WAAW,KAAK,QAAQ,CAAC,CAC5E,CAAC;AACJ,CAAC;AAED,4EAA4E;AAE5E,8DAA8D;AAC9D,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAExE,8BAA8B;AAC9B,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE3D;;GAEG;AACH,SAAgB,kBAAkB,CAAC,MAAc;IAC/C,OAAO,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,MAAc;IACjD,OAAO,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,QAA+B;IAC9D,OAAO,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,QAA+B;IAC/D,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,QAA+B;IAC7D,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyWebhookSignature = exports.quoteAndPrepare = exports.waitForLiFiCompletion = exports.waitForDepositCompletion = exports.executeSwap = exports.isDepositFailed = exports.isDepositRefunded = exports.isDepositSuccess = exports.isLiFiStatusTerminal = exports.isNIStatusTerminal = exports.isWalletDeposit = exports.isManualDeposit = exports.isSuperSwapRoute = exports.isNearIntentsRoute = exports.isLiFiRoute = exports.getDryQuotePlaceholder = exports.getChainsByProvider = exports.getAllChains = exports.isNIOnlyChain = exports.toNumericId = exports.toNIBlockchain = exports.toLifiChainId = exports.resolveChain = exports.NI_CHAIN_BASE = exports.CHAIN_REGISTRY = exports.supportsWalletDeposit = exports.isNearIntentsChain = exports.ChainSlug = exports.ChainId = exports.HypermidNetworkError = exports.HypermidTimeoutError = exports.HypermidError = exports.Hypermid = void 0;
|
|
4
|
+
// ─── Core client ─────────────────────────────────────────────────────────
|
|
5
|
+
var client_js_1 = require("./client.js");
|
|
6
|
+
Object.defineProperty(exports, "Hypermid", { enumerable: true, get: function () { return client_js_1.Hypermid; } });
|
|
7
|
+
// ─── Errors ──────────────────────────────────────────────────────────────
|
|
8
|
+
var errors_js_1 = require("./errors.js");
|
|
9
|
+
Object.defineProperty(exports, "HypermidError", { enumerable: true, get: function () { return errors_js_1.HypermidError; } });
|
|
10
|
+
Object.defineProperty(exports, "HypermidTimeoutError", { enumerable: true, get: function () { return errors_js_1.HypermidTimeoutError; } });
|
|
11
|
+
Object.defineProperty(exports, "HypermidNetworkError", { enumerable: true, get: function () { return errors_js_1.HypermidNetworkError; } });
|
|
12
|
+
// ─── Chain constants ─────────────────────────────────────────────────────
|
|
13
|
+
var chains_js_1 = require("./chains.js");
|
|
14
|
+
Object.defineProperty(exports, "ChainId", { enumerable: true, get: function () { return chains_js_1.ChainId; } });
|
|
15
|
+
Object.defineProperty(exports, "ChainSlug", { enumerable: true, get: function () { return chains_js_1.ChainSlug; } });
|
|
16
|
+
Object.defineProperty(exports, "isNearIntentsChain", { enumerable: true, get: function () { return chains_js_1.isNearIntentsChain; } });
|
|
17
|
+
Object.defineProperty(exports, "supportsWalletDeposit", { enumerable: true, get: function () { return chains_js_1.supportsWalletDeposit; } });
|
|
18
|
+
// ─── Chain registry ─────────────────────────────────────────────────
|
|
19
|
+
var chain_registry_js_1 = require("./chain-registry.js");
|
|
20
|
+
Object.defineProperty(exports, "CHAIN_REGISTRY", { enumerable: true, get: function () { return chain_registry_js_1.CHAIN_REGISTRY; } });
|
|
21
|
+
Object.defineProperty(exports, "NI_CHAIN_BASE", { enumerable: true, get: function () { return chain_registry_js_1.NI_CHAIN_BASE; } });
|
|
22
|
+
Object.defineProperty(exports, "resolveChain", { enumerable: true, get: function () { return chain_registry_js_1.resolveChain; } });
|
|
23
|
+
Object.defineProperty(exports, "toLifiChainId", { enumerable: true, get: function () { return chain_registry_js_1.toLifiChainId; } });
|
|
24
|
+
Object.defineProperty(exports, "toNIBlockchain", { enumerable: true, get: function () { return chain_registry_js_1.toNIBlockchain; } });
|
|
25
|
+
Object.defineProperty(exports, "toNumericId", { enumerable: true, get: function () { return chain_registry_js_1.toNumericId; } });
|
|
26
|
+
Object.defineProperty(exports, "isNIOnlyChain", { enumerable: true, get: function () { return chain_registry_js_1.isNIOnlyChain; } });
|
|
27
|
+
Object.defineProperty(exports, "getAllChains", { enumerable: true, get: function () { return chain_registry_js_1.getAllChains; } });
|
|
28
|
+
Object.defineProperty(exports, "getChainsByProvider", { enumerable: true, get: function () { return chain_registry_js_1.getChainsByProvider; } });
|
|
29
|
+
Object.defineProperty(exports, "getDryQuotePlaceholder", { enumerable: true, get: function () { return chain_registry_js_1.getDryQuotePlaceholder; } });
|
|
30
|
+
// ─── Type guards & helpers ───────────────────────────────────────────────
|
|
31
|
+
var helpers_js_1 = require("./helpers.js");
|
|
32
|
+
Object.defineProperty(exports, "isLiFiRoute", { enumerable: true, get: function () { return helpers_js_1.isLiFiRoute; } });
|
|
33
|
+
Object.defineProperty(exports, "isNearIntentsRoute", { enumerable: true, get: function () { return helpers_js_1.isNearIntentsRoute; } });
|
|
34
|
+
Object.defineProperty(exports, "isSuperSwapRoute", { enumerable: true, get: function () { return helpers_js_1.isSuperSwapRoute; } });
|
|
35
|
+
Object.defineProperty(exports, "isManualDeposit", { enumerable: true, get: function () { return helpers_js_1.isManualDeposit; } });
|
|
36
|
+
Object.defineProperty(exports, "isWalletDeposit", { enumerable: true, get: function () { return helpers_js_1.isWalletDeposit; } });
|
|
37
|
+
Object.defineProperty(exports, "isNIStatusTerminal", { enumerable: true, get: function () { return helpers_js_1.isNIStatusTerminal; } });
|
|
38
|
+
Object.defineProperty(exports, "isLiFiStatusTerminal", { enumerable: true, get: function () { return helpers_js_1.isLiFiStatusTerminal; } });
|
|
39
|
+
Object.defineProperty(exports, "isDepositSuccess", { enumerable: true, get: function () { return helpers_js_1.isDepositSuccess; } });
|
|
40
|
+
Object.defineProperty(exports, "isDepositRefunded", { enumerable: true, get: function () { return helpers_js_1.isDepositRefunded; } });
|
|
41
|
+
Object.defineProperty(exports, "isDepositFailed", { enumerable: true, get: function () { return helpers_js_1.isDepositFailed; } });
|
|
42
|
+
// ─── Execution lifecycle ─────────────────────────────────────────────────
|
|
43
|
+
var execution_js_1 = require("./execution.js");
|
|
44
|
+
Object.defineProperty(exports, "executeSwap", { enumerable: true, get: function () { return execution_js_1.executeSwap; } });
|
|
45
|
+
Object.defineProperty(exports, "waitForDepositCompletion", { enumerable: true, get: function () { return execution_js_1.waitForDepositCompletion; } });
|
|
46
|
+
Object.defineProperty(exports, "waitForLiFiCompletion", { enumerable: true, get: function () { return execution_js_1.waitForLiFiCompletion; } });
|
|
47
|
+
Object.defineProperty(exports, "quoteAndPrepare", { enumerable: true, get: function () { return execution_js_1.quoteAndPrepare; } });
|
|
48
|
+
// ─── Webhook verification ────────────────────────────────────────────────
|
|
49
|
+
var webhook_verify_js_1 = require("./webhook-verify.js");
|
|
50
|
+
Object.defineProperty(exports, "verifyWebhookSignature", { enumerable: true, get: function () { return webhook_verify_js_1.verifyWebhookSignature; } });
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,4EAA4E;AAC5E,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AAEjB,4EAA4E;AAC5E,yCAAwF;AAA/E,0GAAA,aAAa,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AAElE,4EAA4E;AAC5E,yCAA4F;AAAnF,oGAAA,OAAO,OAAA;AAAE,sGAAA,SAAS,OAAA;AAAE,+GAAA,kBAAkB,OAAA;AAAE,kHAAA,qBAAqB,OAAA;AAGtE,uEAAuE;AACvE,yDAW6B;AAV3B,mHAAA,cAAc,OAAA;AACd,kHAAA,aAAa,OAAA;AACb,iHAAA,YAAY,OAAA;AACZ,kHAAA,aAAa,OAAA;AACb,mHAAA,cAAc,OAAA;AACd,gHAAA,WAAW,OAAA;AACX,kHAAA,aAAa,OAAA;AACb,iHAAA,YAAY,OAAA;AACZ,wHAAA,mBAAmB,OAAA;AACnB,2HAAA,sBAAsB,OAAA;AAIxB,4EAA4E;AAC5E,2CAWsB;AAVpB,yGAAA,WAAW,OAAA;AACX,gHAAA,kBAAkB,OAAA;AAClB,8GAAA,gBAAgB,OAAA;AAChB,6GAAA,eAAe,OAAA;AACf,6GAAA,eAAe,OAAA;AACf,gHAAA,kBAAkB,OAAA;AAClB,kHAAA,oBAAoB,OAAA;AACpB,8GAAA,gBAAgB,OAAA;AAChB,+GAAA,iBAAiB,OAAA;AACjB,6GAAA,eAAe,OAAA;AAGjB,4EAA4E;AAC5E,+CAKwB;AAJtB,2GAAA,WAAW,OAAA;AACX,wHAAA,wBAAwB,OAAA;AACxB,qHAAA,qBAAqB,OAAA;AACrB,+GAAA,eAAe,OAAA;AASjB,4EAA4E;AAC5E,yDAA6D;AAApD,2HAAA,sBAAsB,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";AAAA,6EAA6E"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Webhook signature verification utility.
|
|
4
|
+
*
|
|
5
|
+
* When Hypermid sends a webhook, it includes:
|
|
6
|
+
* - `X-Hypermid-Signature`: HMAC-SHA256 hex digest of the raw body
|
|
7
|
+
* - `X-Hypermid-Event`: event type (e.g. "swap.completed")
|
|
8
|
+
*
|
|
9
|
+
* Use `verifyWebhookSignature()` to validate incoming webhooks.
|
|
10
|
+
*
|
|
11
|
+
* @example Express / Node.js
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { verifyWebhookSignature } from "@hypermid/sdk";
|
|
14
|
+
*
|
|
15
|
+
* app.post("/webhooks/hypermid", express.raw({ type: "application/json" }), (req, res) => {
|
|
16
|
+
* const signature = req.headers["x-hypermid-signature"] as string;
|
|
17
|
+
* const isValid = verifyWebhookSignature(req.body, signature, WEBHOOK_SECRET);
|
|
18
|
+
*
|
|
19
|
+
* if (!isValid) {
|
|
20
|
+
* return res.status(401).send("Invalid signature");
|
|
21
|
+
* }
|
|
22
|
+
*
|
|
23
|
+
* const event = req.headers["x-hypermid-event"];
|
|
24
|
+
* const payload = JSON.parse(req.body.toString());
|
|
25
|
+
* // Handle event...
|
|
26
|
+
* res.sendStatus(200);
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
31
|
+
if (k2 === undefined) k2 = k;
|
|
32
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
33
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
34
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
35
|
+
}
|
|
36
|
+
Object.defineProperty(o, k2, desc);
|
|
37
|
+
}) : (function(o, m, k, k2) {
|
|
38
|
+
if (k2 === undefined) k2 = k;
|
|
39
|
+
o[k2] = m[k];
|
|
40
|
+
}));
|
|
41
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
42
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
43
|
+
}) : function(o, v) {
|
|
44
|
+
o["default"] = v;
|
|
45
|
+
});
|
|
46
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
47
|
+
var ownKeys = function(o) {
|
|
48
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
49
|
+
var ar = [];
|
|
50
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
51
|
+
return ar;
|
|
52
|
+
};
|
|
53
|
+
return ownKeys(o);
|
|
54
|
+
};
|
|
55
|
+
return function (mod) {
|
|
56
|
+
if (mod && mod.__esModule) return mod;
|
|
57
|
+
var result = {};
|
|
58
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
59
|
+
__setModuleDefault(result, mod);
|
|
60
|
+
return result;
|
|
61
|
+
};
|
|
62
|
+
})();
|
|
63
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
64
|
+
exports.verifyWebhookSignature = verifyWebhookSignature;
|
|
65
|
+
/**
|
|
66
|
+
* Verify a webhook signature using HMAC-SHA256.
|
|
67
|
+
*
|
|
68
|
+
* Works in both Node.js (using `crypto`) and edge runtimes (using `SubtleCrypto`).
|
|
69
|
+
*
|
|
70
|
+
* @param body - The raw request body (string or Buffer/Uint8Array)
|
|
71
|
+
* @param signature - The `X-Hypermid-Signature` header value
|
|
72
|
+
* @param secret - Your webhook signing secret (from webhook creation)
|
|
73
|
+
* @returns `true` if the signature is valid
|
|
74
|
+
*/
|
|
75
|
+
async function verifyWebhookSignature(body, signature, secret) {
|
|
76
|
+
const bodyStr = typeof body === "string" ? body : new TextDecoder().decode(body);
|
|
77
|
+
// Try Node.js crypto first (synchronous, faster)
|
|
78
|
+
try {
|
|
79
|
+
const crypto = await Promise.resolve().then(() => __importStar(require("node:crypto")));
|
|
80
|
+
const expected = crypto
|
|
81
|
+
.createHmac("sha256", secret)
|
|
82
|
+
.update(bodyStr)
|
|
83
|
+
.digest("hex");
|
|
84
|
+
return timingSafeEqual(expected, signature);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Not in Node.js — use SubtleCrypto (edge runtimes, Deno, Bun)
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const encoder = new TextEncoder();
|
|
91
|
+
const key = await globalThis.crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
92
|
+
const sig = await globalThis.crypto.subtle.sign("HMAC", key, encoder.encode(bodyStr));
|
|
93
|
+
const expected = Array.from(new Uint8Array(sig))
|
|
94
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
95
|
+
.join("");
|
|
96
|
+
return timingSafeEqual(expected, signature);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Constant-time string comparison to prevent timing attacks */
|
|
103
|
+
function timingSafeEqual(a, b) {
|
|
104
|
+
if (a.length !== b.length)
|
|
105
|
+
return false;
|
|
106
|
+
let result = 0;
|
|
107
|
+
for (let i = 0; i < a.length; i++) {
|
|
108
|
+
result |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
109
|
+
}
|
|
110
|
+
return result === 0;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=webhook-verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-verify.js","sourceRoot":"","sources":["../../src/webhook-verify.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYH,wDAoCC;AA9CD;;;;;;;;;GASG;AACI,KAAK,UAAU,sBAAsB,CAC1C,IAAyB,EACzB,SAAiB,EACjB,MAAc;IAEd,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEjF,iDAAiD;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,wDAAa,aAAa,GAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM;aACpB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC5B,MAAM,CAAC,OAAO,CAAC;aACf,MAAM,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAClD,KAAK,EACL,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EACtB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,CAAC,CACT,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;aAC7C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IAC3C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,MAAM,KAAK,CAAC,CAAC;AACtB,CAAC"}
|