@atomiqlabs/chain-starknet 8.0.13 → 8.1.10
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/index.d.ts +18 -18
- package/dist/index.js +42 -42
- package/dist/starknet/StarknetChainType.d.ts +19 -19
- package/dist/starknet/StarknetChainType.js +2 -2
- package/dist/starknet/StarknetInitializer.d.ts +66 -63
- package/dist/starknet/StarknetInitializer.js +101 -101
- package/dist/starknet/btcrelay/BtcRelayAbi.d.ts +250 -250
- package/dist/starknet/btcrelay/BtcRelayAbi.js +341 -341
- package/dist/starknet/btcrelay/StarknetBtcRelay.d.ts +196 -196
- package/dist/starknet/btcrelay/StarknetBtcRelay.js +419 -411
- package/dist/starknet/btcrelay/headers/StarknetBtcHeader.d.ts +70 -70
- package/dist/starknet/btcrelay/headers/StarknetBtcHeader.js +115 -115
- package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.d.ts +91 -91
- package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.js +155 -155
- package/dist/starknet/chain/StarknetAction.d.ts +19 -19
- package/dist/starknet/chain/StarknetAction.js +74 -74
- package/dist/starknet/chain/StarknetChainInterface.d.ts +142 -143
- package/dist/starknet/chain/StarknetChainInterface.js +198 -199
- package/dist/starknet/chain/StarknetModule.d.ts +8 -8
- package/dist/starknet/chain/StarknetModule.js +12 -12
- package/dist/starknet/chain/modules/ERC20Abi.d.ts +755 -755
- package/dist/starknet/chain/modules/ERC20Abi.js +1032 -1032
- package/dist/starknet/chain/modules/StarknetAccounts.d.ts +6 -6
- package/dist/starknet/chain/modules/StarknetAccounts.js +26 -26
- package/dist/starknet/chain/modules/StarknetAddresses.d.ts +10 -10
- package/dist/starknet/chain/modules/StarknetAddresses.js +27 -27
- package/dist/starknet/chain/modules/StarknetBlocks.d.ts +27 -27
- package/dist/starknet/chain/modules/StarknetBlocks.js +82 -82
- package/dist/starknet/chain/modules/StarknetEvents.d.ts +47 -47
- package/dist/starknet/chain/modules/StarknetEvents.js +90 -90
- package/dist/starknet/chain/modules/StarknetFees.d.ts +118 -104
- package/dist/starknet/chain/modules/StarknetFees.js +150 -146
- package/dist/starknet/chain/modules/StarknetSignatures.d.ts +29 -29
- package/dist/starknet/chain/modules/StarknetSignatures.js +72 -72
- package/dist/starknet/chain/modules/StarknetTokens.d.ts +66 -66
- package/dist/starknet/chain/modules/StarknetTokens.js +99 -99
- package/dist/starknet/chain/modules/StarknetTransactions.d.ts +122 -115
- package/dist/starknet/chain/modules/StarknetTransactions.js +633 -612
- package/dist/starknet/contract/StarknetContractBase.d.ts +14 -13
- package/dist/starknet/contract/StarknetContractBase.js +21 -20
- package/dist/starknet/contract/StarknetContractModule.d.ts +8 -8
- package/dist/starknet/contract/StarknetContractModule.js +11 -11
- package/dist/starknet/contract/modules/StarknetContractEvents.d.ts +56 -57
- package/dist/starknet/contract/modules/StarknetContractEvents.js +111 -111
- package/dist/starknet/events/StarknetChainEvents.d.ts +21 -21
- package/dist/starknet/events/StarknetChainEvents.js +61 -61
- package/dist/starknet/events/StarknetChainEventsBrowser.d.ts +178 -190
- package/dist/starknet/events/StarknetChainEventsBrowser.js +523 -582
- package/dist/starknet/provider/RpcProviderWithRetries.d.ts +49 -53
- package/dist/starknet/provider/RpcProviderWithRetries.js +94 -94
- package/dist/starknet/provider/WebSocketChannelWithRetries.d.ts +21 -21
- package/dist/starknet/provider/WebSocketChannelWithRetries.js +46 -46
- package/dist/starknet/spv_swap/SpvVaultContractAbi.d.ts +488 -488
- package/dist/starknet/spv_swap/SpvVaultContractAbi.js +656 -656
- package/dist/starknet/spv_swap/StarknetSpvVaultContract.d.ts +225 -219
- package/dist/starknet/spv_swap/StarknetSpvVaultContract.js +663 -621
- package/dist/starknet/spv_swap/StarknetSpvVaultData.d.ts +108 -108
- package/dist/starknet/spv_swap/StarknetSpvVaultData.js +190 -190
- package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.d.ts +56 -56
- package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.js +103 -103
- package/dist/starknet/swaps/EscrowManagerAbi.d.ts +431 -431
- package/dist/starknet/swaps/EscrowManagerAbi.js +583 -583
- package/dist/starknet/swaps/StarknetSwapContract.d.ts +309 -278
- package/dist/starknet/swaps/StarknetSwapContract.js +755 -579
- package/dist/starknet/swaps/StarknetSwapData.d.ts +234 -234
- package/dist/starknet/swaps/StarknetSwapData.js +474 -474
- package/dist/starknet/swaps/StarknetSwapModule.d.ts +10 -10
- package/dist/starknet/swaps/StarknetSwapModule.js +12 -12
- package/dist/starknet/swaps/handlers/IHandler.d.ts +13 -13
- package/dist/starknet/swaps/handlers/IHandler.js +2 -2
- package/dist/starknet/swaps/handlers/claim/ClaimHandlers.d.ts +13 -13
- package/dist/starknet/swaps/handlers/claim/ClaimHandlers.js +13 -13
- package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.d.ts +21 -21
- package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.js +44 -44
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +24 -24
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +48 -48
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +25 -25
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +40 -40
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +20 -20
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +30 -30
- package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +42 -45
- package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +50 -54
- package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.d.ts +17 -17
- package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.js +27 -27
- package/dist/starknet/swaps/modules/StarknetLpVault.d.ts +67 -67
- package/dist/starknet/swaps/modules/StarknetLpVault.js +122 -122
- package/dist/starknet/swaps/modules/StarknetSwapClaim.d.ts +52 -52
- package/dist/starknet/swaps/modules/StarknetSwapClaim.js +99 -99
- package/dist/starknet/swaps/modules/StarknetSwapInit.d.ts +94 -94
- package/dist/starknet/swaps/modules/StarknetSwapInit.js +239 -239
- package/dist/starknet/swaps/modules/StarknetSwapRefund.d.ts +60 -60
- package/dist/starknet/swaps/modules/StarknetSwapRefund.js +126 -126
- package/dist/starknet/wallet/StarknetBrowserSigner.d.ts +11 -11
- package/dist/starknet/wallet/StarknetBrowserSigner.js +17 -17
- package/dist/starknet/wallet/StarknetPersistentSigner.d.ts +76 -76
- package/dist/starknet/wallet/StarknetPersistentSigner.js +291 -291
- package/dist/starknet/wallet/StarknetSigner.d.ts +72 -72
- package/dist/starknet/wallet/StarknetSigner.js +114 -114
- package/dist/starknet/wallet/accounts/StarknetKeypairWallet.d.ts +18 -18
- package/dist/starknet/wallet/accounts/StarknetKeypairWallet.js +45 -45
- package/dist/utils/Utils.d.ts +77 -77
- package/dist/utils/Utils.js +304 -303
- package/package.json +2 -2
- package/src/starknet/StarknetInitializer.ts +6 -3
- package/src/starknet/btcrelay/StarknetBtcRelay.ts +19 -6
- package/src/starknet/btcrelay/headers/StarknetBtcHeader.ts +7 -7
- package/src/starknet/btcrelay/headers/StarknetBtcStoredHeader.ts +6 -6
- package/src/starknet/chain/StarknetAction.ts +1 -0
- package/src/starknet/chain/StarknetChainInterface.ts +0 -2
- package/src/starknet/chain/modules/StarknetFees.ts +15 -2
- package/src/starknet/chain/modules/StarknetTransactions.ts +24 -0
- package/src/starknet/contract/StarknetContractBase.ts +7 -4
- package/src/starknet/contract/StarknetContractModule.ts +1 -1
- package/src/starknet/contract/modules/StarknetContractEvents.ts +7 -7
- package/src/starknet/events/StarknetChainEventsBrowser.ts +2 -64
- package/src/starknet/provider/RpcProviderWithRetries.ts +1 -1
- package/src/starknet/spv_swap/StarknetSpvVaultContract.ts +84 -18
- package/src/starknet/swaps/StarknetSwapContract.ts +242 -6
- package/src/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +0 -4
|
@@ -1,579 +1,755 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.StarknetSwapContract = void 0;
|
|
4
|
-
const base_1 = require("@atomiqlabs/base");
|
|
5
|
-
const buffer_1 = require("buffer");
|
|
6
|
-
const EscrowManagerAbi_1 = require("./EscrowManagerAbi");
|
|
7
|
-
const StarknetContractBase_1 = require("../contract/StarknetContractBase");
|
|
8
|
-
const starknet_1 = require("starknet");
|
|
9
|
-
const StarknetSwapData_1 = require("./StarknetSwapData");
|
|
10
|
-
const Utils_1 = require("../../utils/Utils");
|
|
11
|
-
const TimelockRefundHandler_1 = require("./handlers/refund/TimelockRefundHandler");
|
|
12
|
-
const StarknetLpVault_1 = require("./modules/StarknetLpVault");
|
|
13
|
-
const StarknetSwapInit_1 = require("./modules/StarknetSwapInit");
|
|
14
|
-
const StarknetSwapRefund_1 = require("./modules/StarknetSwapRefund");
|
|
15
|
-
const ClaimHandlers_1 = require("./handlers/claim/ClaimHandlers");
|
|
16
|
-
const StarknetSwapClaim_1 = require("./modules/StarknetSwapClaim");
|
|
17
|
-
const sha2_1 = require("@noble/hashes/sha2");
|
|
18
|
-
const ESCROW_STATE_COMMITTED = 1;
|
|
19
|
-
const ESCROW_STATE_CLAIMED = 2;
|
|
20
|
-
const ESCROW_STATE_REFUNDED = 3;
|
|
21
|
-
const swapContractAddreses = {
|
|
22
|
-
[starknet_1.constants.StarknetChainId.SN_SEPOLIA]: "0x017bf50dd28b6d823a231355bb25813d4396c8e19d2df03026038714a22f0413",
|
|
23
|
-
[starknet_1.constants.StarknetChainId.SN_MAIN]: "0x04f278e1f19e495c3b1dd35ef307c4f7510768ed95481958fbae588bd173f79a"
|
|
24
|
-
};
|
|
25
|
-
const
|
|
26
|
-
[starknet_1.constants.StarknetChainId.SN_SEPOLIA]:
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
[base_1.ChainSwapType.
|
|
34
|
-
[base_1.ChainSwapType.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* @inheritDoc
|
|
83
|
-
*/
|
|
84
|
-
this.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
this.
|
|
94
|
-
this.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
this.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
this.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* @inheritDoc
|
|
188
|
-
*/
|
|
189
|
-
async
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
const
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
* @
|
|
538
|
-
*/
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StarknetSwapContract = void 0;
|
|
4
|
+
const base_1 = require("@atomiqlabs/base");
|
|
5
|
+
const buffer_1 = require("buffer");
|
|
6
|
+
const EscrowManagerAbi_1 = require("./EscrowManagerAbi");
|
|
7
|
+
const StarknetContractBase_1 = require("../contract/StarknetContractBase");
|
|
8
|
+
const starknet_1 = require("starknet");
|
|
9
|
+
const StarknetSwapData_1 = require("./StarknetSwapData");
|
|
10
|
+
const Utils_1 = require("../../utils/Utils");
|
|
11
|
+
const TimelockRefundHandler_1 = require("./handlers/refund/TimelockRefundHandler");
|
|
12
|
+
const StarknetLpVault_1 = require("./modules/StarknetLpVault");
|
|
13
|
+
const StarknetSwapInit_1 = require("./modules/StarknetSwapInit");
|
|
14
|
+
const StarknetSwapRefund_1 = require("./modules/StarknetSwapRefund");
|
|
15
|
+
const ClaimHandlers_1 = require("./handlers/claim/ClaimHandlers");
|
|
16
|
+
const StarknetSwapClaim_1 = require("./modules/StarknetSwapClaim");
|
|
17
|
+
const sha2_1 = require("@noble/hashes/sha2");
|
|
18
|
+
const ESCROW_STATE_COMMITTED = 1;
|
|
19
|
+
const ESCROW_STATE_CLAIMED = 2;
|
|
20
|
+
const ESCROW_STATE_REFUNDED = 3;
|
|
21
|
+
const swapContractAddreses = {
|
|
22
|
+
[starknet_1.constants.StarknetChainId.SN_SEPOLIA]: "0x017bf50dd28b6d823a231355bb25813d4396c8e19d2df03026038714a22f0413",
|
|
23
|
+
[starknet_1.constants.StarknetChainId.SN_MAIN]: "0x04f278e1f19e495c3b1dd35ef307c4f7510768ed95481958fbae588bd173f79a"
|
|
24
|
+
};
|
|
25
|
+
const swapContractDeploymentHeights = {
|
|
26
|
+
[starknet_1.constants.StarknetChainId.SN_SEPOLIA]: 1118142,
|
|
27
|
+
[starknet_1.constants.StarknetChainId.SN_MAIN]: 1617247
|
|
28
|
+
};
|
|
29
|
+
const defaultClaimAddresses = {
|
|
30
|
+
[starknet_1.constants.StarknetChainId.SN_SEPOLIA]: {
|
|
31
|
+
[base_1.ChainSwapType.HTLC]: "0x04a57ea54d4637c352aad1bbee046868926a11702216a0aaf7eeec1568be2d7b",
|
|
32
|
+
[base_1.ChainSwapType.CHAIN_TXID]: "0x04c7cde88359e14b6f6f779f8b9d8310cee37e91a6f143f855ae29fab33c396e",
|
|
33
|
+
[base_1.ChainSwapType.CHAIN]: "0x051bef6f5fd12e2832a7d38653bdfc8eb84ba7eb7a4aada5b87ef38a9999cf17",
|
|
34
|
+
[base_1.ChainSwapType.CHAIN_NONCED]: "0x050e50eacd16da414f2c3a7c3570fd5e248974c6fe757d41acbf72d2836fa0a1"
|
|
35
|
+
},
|
|
36
|
+
[starknet_1.constants.StarknetChainId.SN_MAIN]: {
|
|
37
|
+
[base_1.ChainSwapType.HTLC]: "0x07b74b50a883ebee262b6db0e3c0c697670c6f30e3d610e75faf33a89c46aa2a",
|
|
38
|
+
[base_1.ChainSwapType.CHAIN_TXID]: "0x016c2db2b03f39cf4fd7f871035000f66b62307d9983056e33a38315da8a44dc",
|
|
39
|
+
[base_1.ChainSwapType.CHAIN]: "0x02c45a81c4a48d0645a0a199e620061e8a55dcc9c2b5946d050eaeeddba64e9a",
|
|
40
|
+
[base_1.ChainSwapType.CHAIN_NONCED]: "0x0019b5480dd7ed8ded10a09437b0a7a30b8997b4ef139deb24ff8c86f995d84f"
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const defaultRefundAddresses = {
|
|
44
|
+
[starknet_1.constants.StarknetChainId.SN_SEPOLIA]: {
|
|
45
|
+
timelock: "0x034b8f28b3ca979036cb2849cfa3af7f67207459224b6ca5ce2474aa398ec3e7"
|
|
46
|
+
},
|
|
47
|
+
[starknet_1.constants.StarknetChainId.SN_MAIN]: {
|
|
48
|
+
timelock: "0x06a59659990c2aefbf7239f6d911617b3ae60b79cb3364f3bd242a6ca8f4f4f7"
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Starknet swap contract (escrow manager) contract representation handling PrTLC (on-chain) and HTLC (lightning)
|
|
53
|
+
* based swaps
|
|
54
|
+
*
|
|
55
|
+
* @category Swaps
|
|
56
|
+
*/
|
|
57
|
+
class StarknetSwapContract extends StarknetContractBase_1.StarknetContractBase {
|
|
58
|
+
/**
|
|
59
|
+
* Constructs the swap contract (escrow manager)
|
|
60
|
+
*
|
|
61
|
+
* @param chainInterface Underlying chain interface to use
|
|
62
|
+
* @param btcRelay Btc relay light client contract
|
|
63
|
+
* @param contractAddress Optional underlying contract address (default is used otherwise)
|
|
64
|
+
* @param _handlerAddresses Optional handler addresses (defaults are used otherwise)
|
|
65
|
+
* @param contractDeploymentHeight The height at which this contract was deployed (default is used otherwise)
|
|
66
|
+
*/
|
|
67
|
+
constructor(chainInterface, btcRelay, contractAddress = swapContractAddreses[chainInterface.starknetChainId], _handlerAddresses, contractDeploymentHeight) {
|
|
68
|
+
super(chainInterface, contractAddress, EscrowManagerAbi_1.EscrowManagerAbi, contractDeploymentHeight ??
|
|
69
|
+
(swapContractAddreses[chainInterface.starknetChainId] === contractAddress
|
|
70
|
+
? swapContractDeploymentHeights[chainInterface.starknetChainId]
|
|
71
|
+
: undefined));
|
|
72
|
+
/**
|
|
73
|
+
* @inheritDoc
|
|
74
|
+
*/
|
|
75
|
+
this.supportsInitWithoutClaimer = true;
|
|
76
|
+
////////////////////////
|
|
77
|
+
//// Constants
|
|
78
|
+
this.chainId = "STARKNET";
|
|
79
|
+
////////////////////////
|
|
80
|
+
//// Timeouts
|
|
81
|
+
/**
|
|
82
|
+
* @inheritDoc
|
|
83
|
+
*/
|
|
84
|
+
this.claimWithSecretTimeout = 180;
|
|
85
|
+
/**
|
|
86
|
+
* @inheritDoc
|
|
87
|
+
*/
|
|
88
|
+
this.claimWithTxDataTimeout = 180;
|
|
89
|
+
/**
|
|
90
|
+
* @inheritDoc
|
|
91
|
+
*/
|
|
92
|
+
this.refundTimeout = 180;
|
|
93
|
+
this.claimGracePeriod = 10 * 60;
|
|
94
|
+
this.refundGracePeriod = 10 * 60;
|
|
95
|
+
/**
|
|
96
|
+
* @private
|
|
97
|
+
*/
|
|
98
|
+
this.authGracePeriod = 30;
|
|
99
|
+
////////////////////////
|
|
100
|
+
//// Handlers
|
|
101
|
+
this.claimHandlersByAddress = {};
|
|
102
|
+
this.claimHandlersBySwapType = {};
|
|
103
|
+
this.refundHandlersByAddress = {};
|
|
104
|
+
this.initFunctionName = "initialize";
|
|
105
|
+
this.initEntryPointSelector = BigInt(starknet_1.hash.starknetKeccak(this.initFunctionName));
|
|
106
|
+
this.Init = new StarknetSwapInit_1.StarknetSwapInit(chainInterface, this);
|
|
107
|
+
this.Refund = new StarknetSwapRefund_1.StarknetSwapRefund(chainInterface, this);
|
|
108
|
+
this.Claim = new StarknetSwapClaim_1.StarknetSwapClaim(chainInterface, this);
|
|
109
|
+
this.LpVault = new StarknetLpVault_1.StarknetLpVault(chainInterface, this);
|
|
110
|
+
this.btcRelay = btcRelay;
|
|
111
|
+
const handlerAddresses = {
|
|
112
|
+
refund: { ...defaultRefundAddresses[chainInterface.starknetChainId], ..._handlerAddresses?.refund },
|
|
113
|
+
claim: { ...defaultClaimAddresses[chainInterface.starknetChainId], ..._handlerAddresses?.claim }
|
|
114
|
+
};
|
|
115
|
+
ClaimHandlers_1.claimHandlersList.forEach(handlerCtor => {
|
|
116
|
+
const handler = new handlerCtor(handlerAddresses.claim[handlerCtor.type]);
|
|
117
|
+
this.claimHandlersByAddress[(0, Utils_1.toHex)(handler.address)] = handler;
|
|
118
|
+
this.claimHandlersBySwapType[handlerCtor.type] = handler;
|
|
119
|
+
});
|
|
120
|
+
this.timelockRefundHandler = new TimelockRefundHandler_1.TimelockRefundHandler(handlerAddresses.refund.timelock);
|
|
121
|
+
this.refundHandlersByAddress[this.timelockRefundHandler.address] = this.timelockRefundHandler;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* @inheritDoc
|
|
125
|
+
*/
|
|
126
|
+
async start() {
|
|
127
|
+
}
|
|
128
|
+
////////////////////////////////////////////
|
|
129
|
+
//// Signatures
|
|
130
|
+
/**
|
|
131
|
+
* @inheritDoc
|
|
132
|
+
*/
|
|
133
|
+
preFetchForInitSignatureVerification() {
|
|
134
|
+
return this.Init.preFetchForInitSignatureVerification();
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* @inheritDoc
|
|
138
|
+
*/
|
|
139
|
+
getInitSignature(signer, swapData, authorizationTimeout, preFetchedBlockData, feeRate) {
|
|
140
|
+
return this.Init.signSwapInitialization(signer, swapData, authorizationTimeout);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* @inheritDoc
|
|
144
|
+
*/
|
|
145
|
+
isValidInitAuthorization(sender, swapData, sig, feeRate, preFetchedData) {
|
|
146
|
+
return this.Init.isSignatureValid(sender, swapData, sig.timeout, sig.prefix, sig.signature, preFetchedData);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* @inheritDoc
|
|
150
|
+
*/
|
|
151
|
+
getInitAuthorizationExpiry(swapData, sig, preFetchedData) {
|
|
152
|
+
return this.Init.getSignatureExpiry(sig.timeout);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* @inheritDoc
|
|
156
|
+
*/
|
|
157
|
+
isInitAuthorizationExpired(swapData, sig) {
|
|
158
|
+
return this.Init.isSignatureExpired(sig.timeout);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* @inheritDoc
|
|
162
|
+
*/
|
|
163
|
+
getRefundSignature(signer, swapData, authorizationTimeout) {
|
|
164
|
+
return this.Refund.signSwapRefund(signer, swapData, authorizationTimeout);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* @inheritDoc
|
|
168
|
+
*/
|
|
169
|
+
isValidRefundAuthorization(swapData, sig) {
|
|
170
|
+
return this.Refund.isSignatureValid(swapData, sig.timeout, sig.prefix, sig.signature);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* @inheritDoc
|
|
174
|
+
*/
|
|
175
|
+
getDataSignature(signer, data) {
|
|
176
|
+
return this.Chain.Signatures.getDataSignature(signer, data);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* @inheritDoc
|
|
180
|
+
*/
|
|
181
|
+
isValidDataSignature(data, signature, publicKey) {
|
|
182
|
+
return this.Chain.Signatures.isValidDataSignature(data, signature, publicKey);
|
|
183
|
+
}
|
|
184
|
+
////////////////////////////////////////////
|
|
185
|
+
//// Swap data utils
|
|
186
|
+
/**
|
|
187
|
+
* @inheritDoc
|
|
188
|
+
*/
|
|
189
|
+
async isClaimable(signer, data) {
|
|
190
|
+
if (!data.isClaimer(signer))
|
|
191
|
+
return false;
|
|
192
|
+
if (await this.isExpired(signer, data))
|
|
193
|
+
return false;
|
|
194
|
+
return await this.isCommited(data);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* @inheritDoc
|
|
198
|
+
*/
|
|
199
|
+
async isCommited(swapData) {
|
|
200
|
+
const data = await this.contract.get_hash_state("0x" + swapData.getEscrowHash());
|
|
201
|
+
return Number(data.state) === ESCROW_STATE_COMMITTED;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* @inheritDoc
|
|
205
|
+
*/
|
|
206
|
+
isExpired(signer, data) {
|
|
207
|
+
let currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
|
|
208
|
+
if (data.isClaimer(signer))
|
|
209
|
+
currentTimestamp = currentTimestamp + BigInt(this.claimGracePeriod);
|
|
210
|
+
if (data.isOfferer(signer))
|
|
211
|
+
currentTimestamp = currentTimestamp - BigInt(this.refundGracePeriod);
|
|
212
|
+
return Promise.resolve(data.getExpiry() < currentTimestamp);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* @inheritDoc
|
|
216
|
+
*/
|
|
217
|
+
async isRequestRefundable(signer, data) {
|
|
218
|
+
//Swap can only be refunded by the offerer
|
|
219
|
+
if (!data.isOfferer(signer))
|
|
220
|
+
return false;
|
|
221
|
+
if (!(await this.isExpired(signer, data)))
|
|
222
|
+
return false;
|
|
223
|
+
return await this.isCommited(data);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* @inheritDoc
|
|
227
|
+
*/
|
|
228
|
+
getHashForTxId(txId, confirmations) {
|
|
229
|
+
const chainTxIdHandler = this.claimHandlersBySwapType[base_1.ChainSwapType.CHAIN_TXID];
|
|
230
|
+
if (chainTxIdHandler == null)
|
|
231
|
+
throw new Error("Claim handler for CHAIN_TXID not found!");
|
|
232
|
+
return (0, Utils_1.bigNumberishToBuffer)(chainTxIdHandler.getCommitment({
|
|
233
|
+
txId,
|
|
234
|
+
confirmations,
|
|
235
|
+
btcRelay: this.btcRelay
|
|
236
|
+
}), 32);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* @inheritDoc
|
|
240
|
+
*/
|
|
241
|
+
getHashForOnchain(outputScript, amount, confirmations, nonce) {
|
|
242
|
+
let result;
|
|
243
|
+
if (nonce == null || nonce === 0n) {
|
|
244
|
+
const chainHandler = this.claimHandlersBySwapType[base_1.ChainSwapType.CHAIN];
|
|
245
|
+
if (chainHandler == null)
|
|
246
|
+
throw new Error("Claim handler for CHAIN not found!");
|
|
247
|
+
result = chainHandler.getCommitment({
|
|
248
|
+
output: outputScript,
|
|
249
|
+
amount,
|
|
250
|
+
confirmations,
|
|
251
|
+
btcRelay: this.btcRelay
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
const chainNoncedHandler = this.claimHandlersBySwapType[base_1.ChainSwapType.CHAIN_NONCED];
|
|
256
|
+
if (chainNoncedHandler == null)
|
|
257
|
+
throw new Error("Claim handler for CHAIN_NONCED not found!");
|
|
258
|
+
result = chainNoncedHandler.getCommitment({
|
|
259
|
+
output: outputScript,
|
|
260
|
+
amount,
|
|
261
|
+
nonce,
|
|
262
|
+
confirmations,
|
|
263
|
+
btcRelay: this.btcRelay
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
return (0, Utils_1.bigNumberishToBuffer)(result, 32);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* @inheritDoc
|
|
270
|
+
*/
|
|
271
|
+
getHashForHtlc(paymentHash) {
|
|
272
|
+
const htlcHandler = this.claimHandlersBySwapType[base_1.ChainSwapType.HTLC];
|
|
273
|
+
if (htlcHandler == null)
|
|
274
|
+
throw new Error("Claim handler for HTLC not found!");
|
|
275
|
+
return (0, Utils_1.bigNumberishToBuffer)(htlcHandler.getCommitment(paymentHash), 32);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* @inheritDoc
|
|
279
|
+
*/
|
|
280
|
+
getExtraData(outputScript, amount, confirmations, nonce) {
|
|
281
|
+
if (nonce == null)
|
|
282
|
+
nonce = 0n;
|
|
283
|
+
const txoHash = buffer_1.Buffer.from((0, sha2_1.sha256)(buffer_1.Buffer.concat([
|
|
284
|
+
base_1.BigIntBufferUtils.toBuffer(amount, "le", 8),
|
|
285
|
+
outputScript
|
|
286
|
+
])));
|
|
287
|
+
return buffer_1.Buffer.concat([
|
|
288
|
+
txoHash,
|
|
289
|
+
base_1.BigIntBufferUtils.toBuffer(nonce, "be", 8),
|
|
290
|
+
base_1.BigIntBufferUtils.toBuffer(BigInt(confirmations), "be", 2)
|
|
291
|
+
]);
|
|
292
|
+
}
|
|
293
|
+
////////////////////////////////////////////
|
|
294
|
+
//// Swap data getters
|
|
295
|
+
/**
|
|
296
|
+
* @inheritDoc
|
|
297
|
+
*/
|
|
298
|
+
async getCommitStatus(signer, data) {
|
|
299
|
+
const escrowHash = data.getEscrowHash();
|
|
300
|
+
const stateData = await this.contract.get_hash_state("0x" + escrowHash);
|
|
301
|
+
const state = Number(stateData.state);
|
|
302
|
+
const blockHeight = Number(stateData.finish_blockheight);
|
|
303
|
+
switch (state) {
|
|
304
|
+
case ESCROW_STATE_COMMITTED:
|
|
305
|
+
if (data.isOfferer(signer) && await this.isExpired(signer, data))
|
|
306
|
+
return { type: base_1.SwapCommitStateType.REFUNDABLE };
|
|
307
|
+
return { type: base_1.SwapCommitStateType.COMMITED };
|
|
308
|
+
case ESCROW_STATE_CLAIMED:
|
|
309
|
+
return {
|
|
310
|
+
type: base_1.SwapCommitStateType.PAID,
|
|
311
|
+
getTxBlock: async () => {
|
|
312
|
+
return {
|
|
313
|
+
blockTime: await this.Chain.Blocks.getBlockTime(blockHeight),
|
|
314
|
+
blockHeight: blockHeight
|
|
315
|
+
};
|
|
316
|
+
},
|
|
317
|
+
getClaimTxId: async () => {
|
|
318
|
+
const events = await this.Events.getContractBlockEvents(["escrow_manager::events::Claim"], [null, null, null, "0x" + escrowHash], blockHeight, blockHeight);
|
|
319
|
+
if (events.length === 0)
|
|
320
|
+
throw new Error("Claim event not found!");
|
|
321
|
+
return events[0].txHash;
|
|
322
|
+
},
|
|
323
|
+
getClaimResult: async () => {
|
|
324
|
+
const events = await this.Events.getContractBlockEvents(["escrow_manager::events::Claim"], [null, null, null, "0x" + escrowHash], blockHeight, blockHeight);
|
|
325
|
+
if (events.length === 0)
|
|
326
|
+
throw new Error("Claim event not found!");
|
|
327
|
+
const event = events[0];
|
|
328
|
+
const claimHandlerHex = (0, Utils_1.toHex)(event.params.claim_handler);
|
|
329
|
+
const claimHandler = this.claimHandlersByAddress[claimHandlerHex];
|
|
330
|
+
if (claimHandler == null) {
|
|
331
|
+
throw new Error("getClaimResult(" + escrowHash + "): Unknown claim handler with claim: " + claimHandlerHex);
|
|
332
|
+
}
|
|
333
|
+
return claimHandler.parseWitnessResult(event.params.witness_result);
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
case ESCROW_STATE_REFUNDED:
|
|
337
|
+
return {
|
|
338
|
+
type: await this.isExpired(signer, data) ? base_1.SwapCommitStateType.EXPIRED : base_1.SwapCommitStateType.NOT_COMMITED,
|
|
339
|
+
getTxBlock: async () => {
|
|
340
|
+
return {
|
|
341
|
+
blockTime: await this.Chain.Blocks.getBlockTime(blockHeight),
|
|
342
|
+
blockHeight: blockHeight
|
|
343
|
+
};
|
|
344
|
+
},
|
|
345
|
+
getRefundTxId: async () => {
|
|
346
|
+
const events = await this.Events.getContractBlockEvents(["escrow_manager::events::Refund"], [null, null, null, "0x" + escrowHash], blockHeight, blockHeight);
|
|
347
|
+
if (events.length === 0)
|
|
348
|
+
throw new Error("Refund event not found!");
|
|
349
|
+
return events[0].txHash;
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
default:
|
|
353
|
+
return {
|
|
354
|
+
type: await this.isExpired(signer, data) ? base_1.SwapCommitStateType.EXPIRED : base_1.SwapCommitStateType.NOT_COMMITED
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* @inheritDoc
|
|
360
|
+
*/
|
|
361
|
+
async getCommitStatuses(request) {
|
|
362
|
+
const result = {};
|
|
363
|
+
let promises = [];
|
|
364
|
+
//TODO: We can upgrade this to use multicall
|
|
365
|
+
for (let { signer, swapData } of request) {
|
|
366
|
+
promises.push(this.getCommitStatus(signer, swapData).then(val => {
|
|
367
|
+
result[swapData.getEscrowHash()] = val;
|
|
368
|
+
}));
|
|
369
|
+
if (promises.length >= this.Chain.config.maxParallelCalls) {
|
|
370
|
+
await Promise.all(promises);
|
|
371
|
+
promises = [];
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
await Promise.all(promises);
|
|
375
|
+
return result;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* @inheritDoc
|
|
379
|
+
*/
|
|
380
|
+
async getHistoricalSwaps(signer, startBlockheight) {
|
|
381
|
+
const { height: latestBlockheight } = await this.Chain.getFinalizedBlock();
|
|
382
|
+
const swapsOpened = {};
|
|
383
|
+
const resultingSwaps = {};
|
|
384
|
+
const promises = [];
|
|
385
|
+
const processor = async (_event) => {
|
|
386
|
+
const escrowHash = (0, Utils_1.toHex)(_event.params.escrow_hash).substring(2);
|
|
387
|
+
if (_event.name === "escrow_manager::events::Initialize") {
|
|
388
|
+
const event = _event;
|
|
389
|
+
const claimHandlerHex = (0, Utils_1.toHex)(event.params.claim_handler);
|
|
390
|
+
const claimHandler = this.claimHandlersByAddress[claimHandlerHex];
|
|
391
|
+
if (claimHandler == null) {
|
|
392
|
+
starknet_1.logger.warn(`getHistoricalSwaps(Initialize): Unknown claim handler in tx ${event.txHash} with claim handler: ` + claimHandlerHex);
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
swapsOpened[escrowHash] = {
|
|
396
|
+
data: (async () => {
|
|
397
|
+
const txTrace = await this.Chain.Transactions.traceTransaction(event.txHash, event.blockHash);
|
|
398
|
+
if (txTrace == null) {
|
|
399
|
+
starknet_1.logger.warn(`getHistoricalSwaps(Initialize): Cannot get transaction trace for tx ${event.txHash}`);
|
|
400
|
+
return null;
|
|
401
|
+
}
|
|
402
|
+
const data = this.findInitSwapData(txTrace, event.params.escrow_hash, claimHandler);
|
|
403
|
+
if (data == null) {
|
|
404
|
+
starknet_1.logger.warn(`getHistoricalSwaps(Initialize): Cannot parse swap data from tx ${event.txHash} with escrow hash: ` + escrowHash);
|
|
405
|
+
return null;
|
|
406
|
+
}
|
|
407
|
+
return data;
|
|
408
|
+
})(),
|
|
409
|
+
getInitTxId: () => Promise.resolve(event.txHash),
|
|
410
|
+
getTxBlock: async () => {
|
|
411
|
+
return {
|
|
412
|
+
blockHeight: event.blockNumber,
|
|
413
|
+
blockTime: await this.Chain.Blocks.getBlockTime(event.blockNumber)
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
if (_event.name === "escrow_manager::events::Claim") {
|
|
419
|
+
const event = _event;
|
|
420
|
+
const claimHandlerHex = (0, Utils_1.toHex)(event.params.claim_handler);
|
|
421
|
+
const claimHandler = this.claimHandlersByAddress[claimHandlerHex];
|
|
422
|
+
if (claimHandler == null) {
|
|
423
|
+
starknet_1.logger.warn(`getHistoricalSwaps(Claim): Unknown claim handler in tx ${event.txHash} with claim handler: ` + claimHandlerHex);
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
const foundSwapData = swapsOpened[escrowHash];
|
|
427
|
+
delete swapsOpened[escrowHash];
|
|
428
|
+
promises.push((async () => {
|
|
429
|
+
const data = await foundSwapData?.data;
|
|
430
|
+
resultingSwaps[escrowHash] = {
|
|
431
|
+
init: data == null ? undefined : {
|
|
432
|
+
data,
|
|
433
|
+
getInitTxId: foundSwapData.getInitTxId,
|
|
434
|
+
getTxBlock: foundSwapData.getTxBlock
|
|
435
|
+
},
|
|
436
|
+
state: {
|
|
437
|
+
type: base_1.SwapCommitStateType.PAID,
|
|
438
|
+
getClaimTxId: () => Promise.resolve(event.txHash),
|
|
439
|
+
getClaimResult: () => Promise.resolve(claimHandler.parseWitnessResult(event.params.witness_result)),
|
|
440
|
+
getTxBlock: async () => {
|
|
441
|
+
return {
|
|
442
|
+
blockHeight: event.blockNumber,
|
|
443
|
+
blockTime: await this.Chain.Blocks.getBlockTime(event.blockNumber)
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
};
|
|
448
|
+
})());
|
|
449
|
+
}
|
|
450
|
+
if (_event.name === "escrow_manager::events::Refund") {
|
|
451
|
+
const event = _event;
|
|
452
|
+
const foundSwapData = swapsOpened[escrowHash];
|
|
453
|
+
delete swapsOpened[escrowHash];
|
|
454
|
+
promises.push((async () => {
|
|
455
|
+
const data = await foundSwapData?.data;
|
|
456
|
+
const isExpired = data != null && await this.isExpired(signer, data);
|
|
457
|
+
resultingSwaps[escrowHash] = {
|
|
458
|
+
init: data == null ? undefined : {
|
|
459
|
+
data,
|
|
460
|
+
getInitTxId: foundSwapData.getInitTxId,
|
|
461
|
+
getTxBlock: foundSwapData.getTxBlock
|
|
462
|
+
},
|
|
463
|
+
state: {
|
|
464
|
+
type: isExpired ? base_1.SwapCommitStateType.EXPIRED : base_1.SwapCommitStateType.NOT_COMMITED,
|
|
465
|
+
getRefundTxId: () => Promise.resolve(event.txHash),
|
|
466
|
+
getTxBlock: async () => {
|
|
467
|
+
return {
|
|
468
|
+
blockHeight: event.blockNumber,
|
|
469
|
+
blockTime: await this.Chain.Blocks.getBlockTime(event.blockNumber)
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
};
|
|
474
|
+
})());
|
|
475
|
+
}
|
|
476
|
+
};
|
|
477
|
+
//We have to fetch separately the different directions
|
|
478
|
+
await this.Events.findInContractEventsForward(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], [signer, null], processor, startBlockheight);
|
|
479
|
+
await this.Events.findInContractEventsForward(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], [null, signer], processor, startBlockheight);
|
|
480
|
+
for (let escrowHash in swapsOpened) {
|
|
481
|
+
const foundSwapData = swapsOpened[escrowHash];
|
|
482
|
+
const data = await foundSwapData.data;
|
|
483
|
+
if (data == null)
|
|
484
|
+
continue;
|
|
485
|
+
resultingSwaps[escrowHash] = {
|
|
486
|
+
init: {
|
|
487
|
+
data,
|
|
488
|
+
getInitTxId: foundSwapData.getInitTxId,
|
|
489
|
+
getTxBlock: foundSwapData.getTxBlock
|
|
490
|
+
},
|
|
491
|
+
state: data.isOfferer(signer) && await this.isExpired(signer, data)
|
|
492
|
+
? { type: base_1.SwapCommitStateType.REFUNDABLE }
|
|
493
|
+
: { type: base_1.SwapCommitStateType.COMMITED }
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
await Promise.all(promises);
|
|
497
|
+
starknet_1.logger.debug(`getHistoricalSwaps(): Found ${Object.keys(resultingSwaps).length} settled swaps!`);
|
|
498
|
+
starknet_1.logger.debug(`getHistoricalSwaps(): Found ${Object.keys(swapsOpened).length} unsettled swaps!`);
|
|
499
|
+
return {
|
|
500
|
+
swaps: resultingSwaps,
|
|
501
|
+
latestBlockheight: latestBlockheight ?? startBlockheight
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
////////////////////////////////////////////
|
|
505
|
+
//// Swap data initializer
|
|
506
|
+
/**
|
|
507
|
+
* @inheritDoc
|
|
508
|
+
*/
|
|
509
|
+
createSwapData(type, offerer, claimer, token, amount, claimData, sequence, expiry, payIn, payOut, securityDeposit, claimerBounty, depositToken = this.Chain.Tokens.getNativeCurrencyAddress()) {
|
|
510
|
+
const claimHandler = this.claimHandlersBySwapType[type];
|
|
511
|
+
if (claimHandler == null)
|
|
512
|
+
throw new Error("Invalid claim handler for type: " + base_1.ChainSwapType[type]);
|
|
513
|
+
return Promise.resolve(new StarknetSwapData_1.StarknetSwapData({
|
|
514
|
+
offerer,
|
|
515
|
+
claimer,
|
|
516
|
+
token,
|
|
517
|
+
refundHandler: this.timelockRefundHandler.address,
|
|
518
|
+
claimHandler: claimHandler.address,
|
|
519
|
+
payOut,
|
|
520
|
+
payIn,
|
|
521
|
+
reputation: payIn,
|
|
522
|
+
sequence,
|
|
523
|
+
claimData: "0x" + claimData,
|
|
524
|
+
refundData: (0, Utils_1.toHex)(expiry),
|
|
525
|
+
amount,
|
|
526
|
+
feeToken: depositToken,
|
|
527
|
+
securityDeposit,
|
|
528
|
+
claimerBounty,
|
|
529
|
+
kind: type
|
|
530
|
+
}));
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
*
|
|
534
|
+
* @param call
|
|
535
|
+
* @param escrowHash
|
|
536
|
+
* @param claimHandler
|
|
537
|
+
* @private
|
|
538
|
+
*/
|
|
539
|
+
findInitSwapData(call, escrowHash, claimHandler) {
|
|
540
|
+
if (BigInt(call.contract_address) === BigInt(this.contract.address) &&
|
|
541
|
+
BigInt(call.entry_point_selector) === this.initEntryPointSelector) {
|
|
542
|
+
//Found, check correct escrow hash
|
|
543
|
+
const escrow = StarknetSwapData_1.StarknetSwapData.fromSerializedFeltArray(call.calldata, claimHandler);
|
|
544
|
+
if (call.calldata.length < 1)
|
|
545
|
+
throw new Error("Calldata invalid length");
|
|
546
|
+
const signatureLen = Number((0, Utils_1.toBigInt)(call.calldata.shift()));
|
|
547
|
+
if (call.calldata.length < signatureLen + 2)
|
|
548
|
+
throw new Error("Calldata invalid length");
|
|
549
|
+
const _signature = call.calldata.splice(0, signatureLen);
|
|
550
|
+
const _timeout = (0, Utils_1.toBigInt)(call.calldata.shift());
|
|
551
|
+
const extraDataLen = Number((0, Utils_1.toBigInt)(call.calldata.shift()));
|
|
552
|
+
if (call.calldata.length < extraDataLen)
|
|
553
|
+
throw new Error("Calldata invalid length");
|
|
554
|
+
const extraData = call.calldata.splice(0, extraDataLen);
|
|
555
|
+
if (call.calldata.length !== 0)
|
|
556
|
+
throw new Error("Calldata not read fully!");
|
|
557
|
+
if ("0x" + escrow.getEscrowHash() === (0, Utils_1.toHex)(escrowHash)) {
|
|
558
|
+
if (extraData.length !== 0) {
|
|
559
|
+
escrow.setExtraData((0, Utils_1.bytes31SpanToBuffer)(extraData, 42).toString("hex"));
|
|
560
|
+
}
|
|
561
|
+
return escrow;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
for (let _call of call.calls) {
|
|
565
|
+
const found = this.findInitSwapData(_call, escrowHash, claimHandler);
|
|
566
|
+
if (found != null)
|
|
567
|
+
return found;
|
|
568
|
+
}
|
|
569
|
+
return null;
|
|
570
|
+
}
|
|
571
|
+
////////////////////////////////////////////
|
|
572
|
+
//// Utils
|
|
573
|
+
/**
|
|
574
|
+
*
|
|
575
|
+
* @param address
|
|
576
|
+
* @param token
|
|
577
|
+
* @private
|
|
578
|
+
*/
|
|
579
|
+
getIntermediaryBalance(address, token) {
|
|
580
|
+
return this.LpVault.getIntermediaryBalance(address, token);
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* @inheritDoc
|
|
584
|
+
*/
|
|
585
|
+
async getBalance(signer, tokenAddress, inContract) {
|
|
586
|
+
if (inContract)
|
|
587
|
+
return await this.getIntermediaryBalance(signer, tokenAddress);
|
|
588
|
+
//TODO: For native token we should discount the cost of deploying an account if it is not deployed yet
|
|
589
|
+
return await this.Chain.getBalance(signer, tokenAddress);
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* @inheritDoc
|
|
593
|
+
*/
|
|
594
|
+
getIntermediaryReputation(address, token) {
|
|
595
|
+
return this.LpVault.getIntermediaryReputation(address, token);
|
|
596
|
+
}
|
|
597
|
+
////////////////////////////////////////////
|
|
598
|
+
//// Transaction initializers
|
|
599
|
+
/**
|
|
600
|
+
* @inheritDoc
|
|
601
|
+
*/
|
|
602
|
+
async txsClaimWithSecret(signer, swapData, secret, checkExpiry, initAta, feeRate, skipAtaCheck) {
|
|
603
|
+
return this.Claim.txsClaimWithSecret(typeof (signer) === "string" ? signer : signer.getAddress(), swapData, secret, checkExpiry, feeRate);
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* @inheritDoc
|
|
607
|
+
*/
|
|
608
|
+
async txsClaimWithTxData(signer, swapData, tx, requiredConfirmations, vout, commitedHeader, synchronizer, initAta, feeRate) {
|
|
609
|
+
return this.Claim.txsClaimWithTxData(typeof (signer) === "string" ? signer : signer.getAddress(), swapData, tx, requiredConfirmations, vout, commitedHeader, synchronizer, feeRate);
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* @inheritDoc
|
|
613
|
+
*/
|
|
614
|
+
txsRefund(signer, swapData, check, initAta, feeRate) {
|
|
615
|
+
return this.Refund.txsRefund(signer, swapData, check, feeRate);
|
|
616
|
+
}
|
|
617
|
+
/**
|
|
618
|
+
* @inheritDoc
|
|
619
|
+
*/
|
|
620
|
+
txsRefundWithAuthorization(signer, swapData, sig, check, initAta, feeRate) {
|
|
621
|
+
return this.Refund.txsRefundWithAuthorization(signer, swapData, sig.timeout, sig.prefix, sig.signature, check, feeRate);
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* @inheritDoc
|
|
625
|
+
*/
|
|
626
|
+
txsInit(sender, swapData, sig, skipChecks, feeRate) {
|
|
627
|
+
return this.Init.txsInit(sender, swapData, sig.timeout, sig.prefix, sig.signature, skipChecks, feeRate);
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* @inheritDoc
|
|
631
|
+
*/
|
|
632
|
+
txsWithdraw(signer, token, amount, feeRate) {
|
|
633
|
+
return this.LpVault.txsWithdraw(signer, token, amount, feeRate);
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* @inheritDoc
|
|
637
|
+
*/
|
|
638
|
+
txsDeposit(signer, token, amount, feeRate) {
|
|
639
|
+
return this.LpVault.txsDeposit(signer, token, amount, feeRate);
|
|
640
|
+
}
|
|
641
|
+
////////////////////////////////////////////
|
|
642
|
+
//// Executors
|
|
643
|
+
/**
|
|
644
|
+
* @inheritDoc
|
|
645
|
+
*/
|
|
646
|
+
async claimWithSecret(signer, swapData, secret, checkExpiry, initAta, txOptions) {
|
|
647
|
+
const result = await this.Claim.txsClaimWithSecret(signer.getAddress(), swapData, secret, checkExpiry, txOptions?.feeRate);
|
|
648
|
+
const [signature] = await this.Chain.sendAndConfirm(signer, result, txOptions?.waitForConfirmation, txOptions?.abortSignal);
|
|
649
|
+
return signature;
|
|
650
|
+
}
|
|
651
|
+
/**
|
|
652
|
+
* @inheritDoc
|
|
653
|
+
*/
|
|
654
|
+
async claimWithTxData(signer, swapData, tx, requiredConfirmations, vout, commitedHeader, synchronizer, initAta, txOptions) {
|
|
655
|
+
const txs = await this.Claim.txsClaimWithTxData(signer.getAddress(), swapData, tx, requiredConfirmations, vout, commitedHeader, synchronizer, txOptions?.feeRate);
|
|
656
|
+
if (txs === null)
|
|
657
|
+
throw new Error("Btc relay not synchronized to required blockheight!");
|
|
658
|
+
//TODO: This doesn't return proper tx signature
|
|
659
|
+
const [signature] = await this.Chain.sendAndConfirm(signer, txs, txOptions?.waitForConfirmation, txOptions?.abortSignal);
|
|
660
|
+
return signature;
|
|
661
|
+
}
|
|
662
|
+
/**
|
|
663
|
+
* @inheritDoc
|
|
664
|
+
*/
|
|
665
|
+
async refund(signer, swapData, check, initAta, txOptions) {
|
|
666
|
+
let result = await this.txsRefund(signer.getAddress(), swapData, check, initAta, txOptions?.feeRate);
|
|
667
|
+
const [signature] = await this.Chain.sendAndConfirm(signer, result, txOptions?.waitForConfirmation, txOptions?.abortSignal);
|
|
668
|
+
return signature;
|
|
669
|
+
}
|
|
670
|
+
/**
|
|
671
|
+
* @inheritDoc
|
|
672
|
+
*/
|
|
673
|
+
async refundWithAuthorization(signer, swapData, signature, check, initAta, txOptions) {
|
|
674
|
+
let result = await this.txsRefundWithAuthorization(signer.getAddress(), swapData, signature, check, initAta, txOptions?.feeRate);
|
|
675
|
+
const [txSignature] = await this.Chain.sendAndConfirm(signer, result, txOptions?.waitForConfirmation, txOptions?.abortSignal);
|
|
676
|
+
return txSignature;
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* @inheritDoc
|
|
680
|
+
*/
|
|
681
|
+
async init(signer, swapData, signature, skipChecks, txOptions) {
|
|
682
|
+
if (swapData.isPayIn()) {
|
|
683
|
+
if (!swapData.isOfferer(signer.getAddress()))
|
|
684
|
+
throw new Error("Invalid signer provided!");
|
|
685
|
+
}
|
|
686
|
+
else {
|
|
687
|
+
if (!swapData.isClaimer(signer.getAddress()))
|
|
688
|
+
throw new Error("Invalid signer provided!");
|
|
689
|
+
}
|
|
690
|
+
let result = await this.txsInit(signer.getAddress(), swapData, signature, skipChecks, txOptions?.feeRate);
|
|
691
|
+
const [txSignature] = await this.Chain.sendAndConfirm(signer, result, txOptions?.waitForConfirmation, txOptions?.abortSignal);
|
|
692
|
+
return txSignature;
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* @inheritDoc
|
|
696
|
+
*/
|
|
697
|
+
async withdraw(signer, token, amount, txOptions) {
|
|
698
|
+
const txs = await this.LpVault.txsWithdraw(signer.getAddress(), token, amount, txOptions?.feeRate);
|
|
699
|
+
const [txId] = await this.Chain.sendAndConfirm(signer, txs, txOptions?.waitForConfirmation, txOptions?.abortSignal, false);
|
|
700
|
+
return txId;
|
|
701
|
+
}
|
|
702
|
+
/**
|
|
703
|
+
* @inheritDoc
|
|
704
|
+
*/
|
|
705
|
+
async deposit(signer, token, amount, txOptions) {
|
|
706
|
+
const txs = await this.LpVault.txsDeposit(signer.getAddress(), token, amount, txOptions?.feeRate);
|
|
707
|
+
const [txId] = await this.Chain.sendAndConfirm(signer, txs, txOptions?.waitForConfirmation, txOptions?.abortSignal, false);
|
|
708
|
+
return txId;
|
|
709
|
+
}
|
|
710
|
+
////////////////////////////////////////////
|
|
711
|
+
//// Fees
|
|
712
|
+
/**
|
|
713
|
+
* @inheritDoc
|
|
714
|
+
*/
|
|
715
|
+
getInitPayInFeeRate(offerer, claimer, token, paymentHash) {
|
|
716
|
+
return this.Chain.Fees.getFeeRate();
|
|
717
|
+
}
|
|
718
|
+
/**
|
|
719
|
+
* @inheritDoc
|
|
720
|
+
*/
|
|
721
|
+
getInitFeeRate(offerer, claimer, token, paymentHash) {
|
|
722
|
+
return this.Chain.Fees.getFeeRate();
|
|
723
|
+
}
|
|
724
|
+
/**
|
|
725
|
+
* @inheritDoc
|
|
726
|
+
*/
|
|
727
|
+
getRefundFeeRate(swapData) {
|
|
728
|
+
return this.Chain.Fees.getFeeRate();
|
|
729
|
+
}
|
|
730
|
+
/**
|
|
731
|
+
* @inheritDoc
|
|
732
|
+
*/
|
|
733
|
+
getClaimFeeRate(signer, swapData) {
|
|
734
|
+
return this.Chain.Fees.getFeeRate();
|
|
735
|
+
}
|
|
736
|
+
/**
|
|
737
|
+
* @inheritDoc
|
|
738
|
+
*/
|
|
739
|
+
getClaimFee(signer, swapData, feeRate) {
|
|
740
|
+
return this.Claim.getClaimFee(swapData, feeRate);
|
|
741
|
+
}
|
|
742
|
+
/**
|
|
743
|
+
* @inheritDoc
|
|
744
|
+
*/
|
|
745
|
+
getCommitFee(signer, swapData, feeRate) {
|
|
746
|
+
return this.Init.getInitFee(swapData, feeRate);
|
|
747
|
+
}
|
|
748
|
+
/**
|
|
749
|
+
* @inheritDoc
|
|
750
|
+
*/
|
|
751
|
+
getRefundFee(signer, swapData, feeRate) {
|
|
752
|
+
return this.Refund.getRefundFee(swapData, feeRate);
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
exports.StarknetSwapContract = StarknetSwapContract;
|