@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.
Files changed (119) hide show
  1. package/dist/index.d.ts +18 -18
  2. package/dist/index.js +42 -42
  3. package/dist/starknet/StarknetChainType.d.ts +19 -19
  4. package/dist/starknet/StarknetChainType.js +2 -2
  5. package/dist/starknet/StarknetInitializer.d.ts +66 -63
  6. package/dist/starknet/StarknetInitializer.js +101 -101
  7. package/dist/starknet/btcrelay/BtcRelayAbi.d.ts +250 -250
  8. package/dist/starknet/btcrelay/BtcRelayAbi.js +341 -341
  9. package/dist/starknet/btcrelay/StarknetBtcRelay.d.ts +196 -196
  10. package/dist/starknet/btcrelay/StarknetBtcRelay.js +419 -411
  11. package/dist/starknet/btcrelay/headers/StarknetBtcHeader.d.ts +70 -70
  12. package/dist/starknet/btcrelay/headers/StarknetBtcHeader.js +115 -115
  13. package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.d.ts +91 -91
  14. package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.js +155 -155
  15. package/dist/starknet/chain/StarknetAction.d.ts +19 -19
  16. package/dist/starknet/chain/StarknetAction.js +74 -74
  17. package/dist/starknet/chain/StarknetChainInterface.d.ts +142 -143
  18. package/dist/starknet/chain/StarknetChainInterface.js +198 -199
  19. package/dist/starknet/chain/StarknetModule.d.ts +8 -8
  20. package/dist/starknet/chain/StarknetModule.js +12 -12
  21. package/dist/starknet/chain/modules/ERC20Abi.d.ts +755 -755
  22. package/dist/starknet/chain/modules/ERC20Abi.js +1032 -1032
  23. package/dist/starknet/chain/modules/StarknetAccounts.d.ts +6 -6
  24. package/dist/starknet/chain/modules/StarknetAccounts.js +26 -26
  25. package/dist/starknet/chain/modules/StarknetAddresses.d.ts +10 -10
  26. package/dist/starknet/chain/modules/StarknetAddresses.js +27 -27
  27. package/dist/starknet/chain/modules/StarknetBlocks.d.ts +27 -27
  28. package/dist/starknet/chain/modules/StarknetBlocks.js +82 -82
  29. package/dist/starknet/chain/modules/StarknetEvents.d.ts +47 -47
  30. package/dist/starknet/chain/modules/StarknetEvents.js +90 -90
  31. package/dist/starknet/chain/modules/StarknetFees.d.ts +118 -104
  32. package/dist/starknet/chain/modules/StarknetFees.js +150 -146
  33. package/dist/starknet/chain/modules/StarknetSignatures.d.ts +29 -29
  34. package/dist/starknet/chain/modules/StarknetSignatures.js +72 -72
  35. package/dist/starknet/chain/modules/StarknetTokens.d.ts +66 -66
  36. package/dist/starknet/chain/modules/StarknetTokens.js +99 -99
  37. package/dist/starknet/chain/modules/StarknetTransactions.d.ts +122 -115
  38. package/dist/starknet/chain/modules/StarknetTransactions.js +633 -612
  39. package/dist/starknet/contract/StarknetContractBase.d.ts +14 -13
  40. package/dist/starknet/contract/StarknetContractBase.js +21 -20
  41. package/dist/starknet/contract/StarknetContractModule.d.ts +8 -8
  42. package/dist/starknet/contract/StarknetContractModule.js +11 -11
  43. package/dist/starknet/contract/modules/StarknetContractEvents.d.ts +56 -57
  44. package/dist/starknet/contract/modules/StarknetContractEvents.js +111 -111
  45. package/dist/starknet/events/StarknetChainEvents.d.ts +21 -21
  46. package/dist/starknet/events/StarknetChainEvents.js +61 -61
  47. package/dist/starknet/events/StarknetChainEventsBrowser.d.ts +178 -190
  48. package/dist/starknet/events/StarknetChainEventsBrowser.js +523 -582
  49. package/dist/starknet/provider/RpcProviderWithRetries.d.ts +49 -53
  50. package/dist/starknet/provider/RpcProviderWithRetries.js +94 -94
  51. package/dist/starknet/provider/WebSocketChannelWithRetries.d.ts +21 -21
  52. package/dist/starknet/provider/WebSocketChannelWithRetries.js +46 -46
  53. package/dist/starknet/spv_swap/SpvVaultContractAbi.d.ts +488 -488
  54. package/dist/starknet/spv_swap/SpvVaultContractAbi.js +656 -656
  55. package/dist/starknet/spv_swap/StarknetSpvVaultContract.d.ts +225 -219
  56. package/dist/starknet/spv_swap/StarknetSpvVaultContract.js +663 -621
  57. package/dist/starknet/spv_swap/StarknetSpvVaultData.d.ts +108 -108
  58. package/dist/starknet/spv_swap/StarknetSpvVaultData.js +190 -190
  59. package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.d.ts +56 -56
  60. package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.js +103 -103
  61. package/dist/starknet/swaps/EscrowManagerAbi.d.ts +431 -431
  62. package/dist/starknet/swaps/EscrowManagerAbi.js +583 -583
  63. package/dist/starknet/swaps/StarknetSwapContract.d.ts +309 -278
  64. package/dist/starknet/swaps/StarknetSwapContract.js +755 -579
  65. package/dist/starknet/swaps/StarknetSwapData.d.ts +234 -234
  66. package/dist/starknet/swaps/StarknetSwapData.js +474 -474
  67. package/dist/starknet/swaps/StarknetSwapModule.d.ts +10 -10
  68. package/dist/starknet/swaps/StarknetSwapModule.js +12 -12
  69. package/dist/starknet/swaps/handlers/IHandler.d.ts +13 -13
  70. package/dist/starknet/swaps/handlers/IHandler.js +2 -2
  71. package/dist/starknet/swaps/handlers/claim/ClaimHandlers.d.ts +13 -13
  72. package/dist/starknet/swaps/handlers/claim/ClaimHandlers.js +13 -13
  73. package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.d.ts +21 -21
  74. package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.js +44 -44
  75. package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +24 -24
  76. package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +48 -48
  77. package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +25 -25
  78. package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +40 -40
  79. package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +20 -20
  80. package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +30 -30
  81. package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +42 -45
  82. package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +50 -54
  83. package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.d.ts +17 -17
  84. package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.js +27 -27
  85. package/dist/starknet/swaps/modules/StarknetLpVault.d.ts +67 -67
  86. package/dist/starknet/swaps/modules/StarknetLpVault.js +122 -122
  87. package/dist/starknet/swaps/modules/StarknetSwapClaim.d.ts +52 -52
  88. package/dist/starknet/swaps/modules/StarknetSwapClaim.js +99 -99
  89. package/dist/starknet/swaps/modules/StarknetSwapInit.d.ts +94 -94
  90. package/dist/starknet/swaps/modules/StarknetSwapInit.js +239 -239
  91. package/dist/starknet/swaps/modules/StarknetSwapRefund.d.ts +60 -60
  92. package/dist/starknet/swaps/modules/StarknetSwapRefund.js +126 -126
  93. package/dist/starknet/wallet/StarknetBrowserSigner.d.ts +11 -11
  94. package/dist/starknet/wallet/StarknetBrowserSigner.js +17 -17
  95. package/dist/starknet/wallet/StarknetPersistentSigner.d.ts +76 -76
  96. package/dist/starknet/wallet/StarknetPersistentSigner.js +291 -291
  97. package/dist/starknet/wallet/StarknetSigner.d.ts +72 -72
  98. package/dist/starknet/wallet/StarknetSigner.js +114 -114
  99. package/dist/starknet/wallet/accounts/StarknetKeypairWallet.d.ts +18 -18
  100. package/dist/starknet/wallet/accounts/StarknetKeypairWallet.js +45 -45
  101. package/dist/utils/Utils.d.ts +77 -77
  102. package/dist/utils/Utils.js +304 -303
  103. package/package.json +2 -2
  104. package/src/starknet/StarknetInitializer.ts +6 -3
  105. package/src/starknet/btcrelay/StarknetBtcRelay.ts +19 -6
  106. package/src/starknet/btcrelay/headers/StarknetBtcHeader.ts +7 -7
  107. package/src/starknet/btcrelay/headers/StarknetBtcStoredHeader.ts +6 -6
  108. package/src/starknet/chain/StarknetAction.ts +1 -0
  109. package/src/starknet/chain/StarknetChainInterface.ts +0 -2
  110. package/src/starknet/chain/modules/StarknetFees.ts +15 -2
  111. package/src/starknet/chain/modules/StarknetTransactions.ts +24 -0
  112. package/src/starknet/contract/StarknetContractBase.ts +7 -4
  113. package/src/starknet/contract/StarknetContractModule.ts +1 -1
  114. package/src/starknet/contract/modules/StarknetContractEvents.ts +7 -7
  115. package/src/starknet/events/StarknetChainEventsBrowser.ts +2 -64
  116. package/src/starknet/provider/RpcProviderWithRetries.ts +1 -1
  117. package/src/starknet/spv_swap/StarknetSpvVaultContract.ts +84 -18
  118. package/src/starknet/swaps/StarknetSwapContract.ts +242 -6
  119. 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 defaultClaimAddresses = {
26
- [starknet_1.constants.StarknetChainId.SN_SEPOLIA]: {
27
- [base_1.ChainSwapType.HTLC]: "0x04a57ea54d4637c352aad1bbee046868926a11702216a0aaf7eeec1568be2d7b",
28
- [base_1.ChainSwapType.CHAIN_TXID]: "0x04c7cde88359e14b6f6f779f8b9d8310cee37e91a6f143f855ae29fab33c396e",
29
- [base_1.ChainSwapType.CHAIN]: "0x051bef6f5fd12e2832a7d38653bdfc8eb84ba7eb7a4aada5b87ef38a9999cf17",
30
- [base_1.ChainSwapType.CHAIN_NONCED]: "0x050e50eacd16da414f2c3a7c3570fd5e248974c6fe757d41acbf72d2836fa0a1"
31
- },
32
- [starknet_1.constants.StarknetChainId.SN_MAIN]: {
33
- [base_1.ChainSwapType.HTLC]: "0x07b74b50a883ebee262b6db0e3c0c697670c6f30e3d610e75faf33a89c46aa2a",
34
- [base_1.ChainSwapType.CHAIN_TXID]: "0x016c2db2b03f39cf4fd7f871035000f66b62307d9983056e33a38315da8a44dc",
35
- [base_1.ChainSwapType.CHAIN]: "0x02c45a81c4a48d0645a0a199e620061e8a55dcc9c2b5946d050eaeeddba64e9a",
36
- [base_1.ChainSwapType.CHAIN_NONCED]: "0x0019b5480dd7ed8ded10a09437b0a7a30b8997b4ef139deb24ff8c86f995d84f"
37
- }
38
- };
39
- const defaultRefundAddresses = {
40
- [starknet_1.constants.StarknetChainId.SN_SEPOLIA]: {
41
- timelock: "0x034b8f28b3ca979036cb2849cfa3af7f67207459224b6ca5ce2474aa398ec3e7"
42
- },
43
- [starknet_1.constants.StarknetChainId.SN_MAIN]: {
44
- timelock: "0x06a59659990c2aefbf7239f6d911617b3ae60b79cb3364f3bd242a6ca8f4f4f7"
45
- }
46
- };
47
- /**
48
- * Starknet swap contract (escrow manager) contract representation handling PrTLC (on-chain) and HTLC (lightning)
49
- * based swaps
50
- *
51
- * @category Swaps
52
- */
53
- class StarknetSwapContract extends StarknetContractBase_1.StarknetContractBase {
54
- /**
55
- * Constructs the swap contract (escrow manager)
56
- *
57
- * @param chainInterface Underlying chain interface to use
58
- * @param btcRelay Btc relay light client contract
59
- * @param contractAddress Optional underlying contract address (default is used otherwise)
60
- * @param _handlerAddresses Optional handler addresses (defaults are used otherwise)
61
- */
62
- constructor(chainInterface, btcRelay, contractAddress = swapContractAddreses[chainInterface.starknetChainId], _handlerAddresses) {
63
- super(chainInterface, contractAddress, EscrowManagerAbi_1.EscrowManagerAbi);
64
- /**
65
- * @inheritDoc
66
- */
67
- this.supportsInitWithoutClaimer = true;
68
- ////////////////////////
69
- //// Constants
70
- this.chainId = "STARKNET";
71
- ////////////////////////
72
- //// Timeouts
73
- /**
74
- * @inheritDoc
75
- */
76
- this.claimWithSecretTimeout = 180;
77
- /**
78
- * @inheritDoc
79
- */
80
- this.claimWithTxDataTimeout = 180;
81
- /**
82
- * @inheritDoc
83
- */
84
- this.refundTimeout = 180;
85
- this.claimGracePeriod = 10 * 60;
86
- this.refundGracePeriod = 10 * 60;
87
- /**
88
- * @private
89
- */
90
- this.authGracePeriod = 30;
91
- ////////////////////////
92
- //// Handlers
93
- this.claimHandlersByAddress = {};
94
- this.claimHandlersBySwapType = {};
95
- this.refundHandlersByAddress = {};
96
- this.Init = new StarknetSwapInit_1.StarknetSwapInit(chainInterface, this);
97
- this.Refund = new StarknetSwapRefund_1.StarknetSwapRefund(chainInterface, this);
98
- this.Claim = new StarknetSwapClaim_1.StarknetSwapClaim(chainInterface, this);
99
- this.LpVault = new StarknetLpVault_1.StarknetLpVault(chainInterface, this);
100
- this.btcRelay = btcRelay;
101
- const handlerAddresses = {
102
- refund: { ...defaultRefundAddresses[chainInterface.starknetChainId], ..._handlerAddresses?.refund },
103
- claim: { ...defaultClaimAddresses[chainInterface.starknetChainId], ..._handlerAddresses?.claim }
104
- };
105
- ClaimHandlers_1.claimHandlersList.forEach(handlerCtor => {
106
- const handler = new handlerCtor(handlerAddresses.claim[handlerCtor.type]);
107
- this.claimHandlersByAddress[(0, Utils_1.toHex)(handler.address)] = handler;
108
- this.claimHandlersBySwapType[handlerCtor.type] = handler;
109
- });
110
- this.timelockRefundHandler = new TimelockRefundHandler_1.TimelockRefundHandler(handlerAddresses.refund.timelock);
111
- this.refundHandlersByAddress[this.timelockRefundHandler.address] = this.timelockRefundHandler;
112
- }
113
- /**
114
- * @inheritDoc
115
- */
116
- async start() {
117
- }
118
- ////////////////////////////////////////////
119
- //// Signatures
120
- /**
121
- * @inheritDoc
122
- */
123
- preFetchForInitSignatureVerification() {
124
- return this.Init.preFetchForInitSignatureVerification();
125
- }
126
- /**
127
- * @inheritDoc
128
- */
129
- getInitSignature(signer, swapData, authorizationTimeout, preFetchedBlockData, feeRate) {
130
- return this.Init.signSwapInitialization(signer, swapData, authorizationTimeout);
131
- }
132
- /**
133
- * @inheritDoc
134
- */
135
- isValidInitAuthorization(sender, swapData, sig, feeRate, preFetchedData) {
136
- return this.Init.isSignatureValid(sender, swapData, sig.timeout, sig.prefix, sig.signature, preFetchedData);
137
- }
138
- /**
139
- * @inheritDoc
140
- */
141
- getInitAuthorizationExpiry(swapData, sig, preFetchedData) {
142
- return this.Init.getSignatureExpiry(sig.timeout);
143
- }
144
- /**
145
- * @inheritDoc
146
- */
147
- isInitAuthorizationExpired(swapData, sig) {
148
- return this.Init.isSignatureExpired(sig.timeout);
149
- }
150
- /**
151
- * @inheritDoc
152
- */
153
- getRefundSignature(signer, swapData, authorizationTimeout) {
154
- return this.Refund.signSwapRefund(signer, swapData, authorizationTimeout);
155
- }
156
- /**
157
- * @inheritDoc
158
- */
159
- isValidRefundAuthorization(swapData, sig) {
160
- return this.Refund.isSignatureValid(swapData, sig.timeout, sig.prefix, sig.signature);
161
- }
162
- /**
163
- * @inheritDoc
164
- */
165
- getDataSignature(signer, data) {
166
- return this.Chain.Signatures.getDataSignature(signer, data);
167
- }
168
- /**
169
- * @inheritDoc
170
- */
171
- isValidDataSignature(data, signature, publicKey) {
172
- return this.Chain.Signatures.isValidDataSignature(data, signature, publicKey);
173
- }
174
- ////////////////////////////////////////////
175
- //// Swap data utils
176
- /**
177
- * @inheritDoc
178
- */
179
- async isClaimable(signer, data) {
180
- if (!data.isClaimer(signer))
181
- return false;
182
- if (await this.isExpired(signer, data))
183
- return false;
184
- return await this.isCommited(data);
185
- }
186
- /**
187
- * @inheritDoc
188
- */
189
- async isCommited(swapData) {
190
- const data = await this.contract.get_hash_state("0x" + swapData.getEscrowHash());
191
- return Number(data.state) === ESCROW_STATE_COMMITTED;
192
- }
193
- /**
194
- * @inheritDoc
195
- */
196
- isExpired(signer, data) {
197
- let currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
198
- if (data.isClaimer(signer))
199
- currentTimestamp = currentTimestamp + BigInt(this.claimGracePeriod);
200
- if (data.isOfferer(signer))
201
- currentTimestamp = currentTimestamp - BigInt(this.refundGracePeriod);
202
- return Promise.resolve(data.getExpiry() < currentTimestamp);
203
- }
204
- /**
205
- * @inheritDoc
206
- */
207
- async isRequestRefundable(signer, data) {
208
- //Swap can only be refunded by the offerer
209
- if (!data.isOfferer(signer))
210
- return false;
211
- if (!(await this.isExpired(signer, data)))
212
- return false;
213
- return await this.isCommited(data);
214
- }
215
- /**
216
- * @inheritDoc
217
- */
218
- getHashForTxId(txId, confirmations) {
219
- const chainTxIdHandler = this.claimHandlersBySwapType[base_1.ChainSwapType.CHAIN_TXID];
220
- if (chainTxIdHandler == null)
221
- throw new Error("Claim handler for CHAIN_TXID not found!");
222
- return (0, Utils_1.bigNumberishToBuffer)(chainTxIdHandler.getCommitment({
223
- txId,
224
- confirmations,
225
- btcRelay: this.btcRelay
226
- }), 32);
227
- }
228
- /**
229
- * @inheritDoc
230
- */
231
- getHashForOnchain(outputScript, amount, confirmations, nonce) {
232
- let result;
233
- if (nonce == null || nonce === 0n) {
234
- const chainHandler = this.claimHandlersBySwapType[base_1.ChainSwapType.CHAIN];
235
- if (chainHandler == null)
236
- throw new Error("Claim handler for CHAIN not found!");
237
- result = chainHandler.getCommitment({
238
- output: outputScript,
239
- amount,
240
- confirmations,
241
- btcRelay: this.btcRelay
242
- });
243
- }
244
- else {
245
- const chainNoncedHandler = this.claimHandlersBySwapType[base_1.ChainSwapType.CHAIN_NONCED];
246
- if (chainNoncedHandler == null)
247
- throw new Error("Claim handler for CHAIN_NONCED not found!");
248
- result = chainNoncedHandler.getCommitment({
249
- output: outputScript,
250
- amount,
251
- nonce,
252
- confirmations,
253
- btcRelay: this.btcRelay
254
- });
255
- }
256
- return (0, Utils_1.bigNumberishToBuffer)(result, 32);
257
- }
258
- /**
259
- * @inheritDoc
260
- */
261
- getHashForHtlc(paymentHash) {
262
- const htlcHandler = this.claimHandlersBySwapType[base_1.ChainSwapType.HTLC];
263
- if (htlcHandler == null)
264
- throw new Error("Claim handler for HTLC not found!");
265
- return (0, Utils_1.bigNumberishToBuffer)(htlcHandler.getCommitment(paymentHash), 32);
266
- }
267
- /**
268
- * @inheritDoc
269
- */
270
- getExtraData(outputScript, amount, confirmations, nonce) {
271
- if (nonce == null)
272
- nonce = 0n;
273
- const txoHash = buffer_1.Buffer.from((0, sha2_1.sha256)(buffer_1.Buffer.concat([
274
- base_1.BigIntBufferUtils.toBuffer(amount, "le", 8),
275
- outputScript
276
- ])));
277
- return buffer_1.Buffer.concat([
278
- txoHash,
279
- base_1.BigIntBufferUtils.toBuffer(nonce, "be", 8),
280
- base_1.BigIntBufferUtils.toBuffer(BigInt(confirmations), "be", 2)
281
- ]);
282
- }
283
- ////////////////////////////////////////////
284
- //// Swap data getters
285
- /**
286
- * @inheritDoc
287
- */
288
- async getCommitStatus(signer, data) {
289
- const escrowHash = data.getEscrowHash();
290
- const stateData = await this.contract.get_hash_state("0x" + escrowHash);
291
- const state = Number(stateData.state);
292
- const blockHeight = Number(stateData.finish_blockheight);
293
- switch (state) {
294
- case ESCROW_STATE_COMMITTED:
295
- if (data.isOfferer(signer) && await this.isExpired(signer, data))
296
- return { type: base_1.SwapCommitStateType.REFUNDABLE };
297
- return { type: base_1.SwapCommitStateType.COMMITED };
298
- case ESCROW_STATE_CLAIMED:
299
- return {
300
- type: base_1.SwapCommitStateType.PAID,
301
- getTxBlock: async () => {
302
- return {
303
- blockTime: await this.Chain.Blocks.getBlockTime(blockHeight),
304
- blockHeight: blockHeight
305
- };
306
- },
307
- getClaimTxId: async () => {
308
- const events = await this.Events.getContractBlockEvents(["escrow_manager::events::Claim"], [null, null, null, "0x" + escrowHash], blockHeight, blockHeight);
309
- if (events.length === 0)
310
- throw new Error("Claim event not found!");
311
- return events[0].txHash;
312
- },
313
- getClaimResult: async () => {
314
- const events = await this.Events.getContractBlockEvents(["escrow_manager::events::Claim"], [null, null, null, "0x" + escrowHash], blockHeight, blockHeight);
315
- if (events.length === 0)
316
- throw new Error("Claim event not found!");
317
- const event = events[0];
318
- const claimHandlerHex = (0, Utils_1.toHex)(event.params.claim_handler);
319
- const claimHandler = this.claimHandlersByAddress[claimHandlerHex];
320
- if (claimHandler == null) {
321
- throw new Error("getClaimResult(" + escrowHash + "): Unknown claim handler with claim: " + claimHandlerHex);
322
- }
323
- return claimHandler.parseWitnessResult(event.params.witness_result);
324
- }
325
- };
326
- case ESCROW_STATE_REFUNDED:
327
- return {
328
- type: await this.isExpired(signer, data) ? base_1.SwapCommitStateType.EXPIRED : base_1.SwapCommitStateType.NOT_COMMITED,
329
- getTxBlock: async () => {
330
- return {
331
- blockTime: await this.Chain.Blocks.getBlockTime(blockHeight),
332
- blockHeight: blockHeight
333
- };
334
- },
335
- getRefundTxId: async () => {
336
- const events = await this.Events.getContractBlockEvents(["escrow_manager::events::Refund"], [null, null, null, "0x" + escrowHash], blockHeight, blockHeight);
337
- if (events.length === 0)
338
- throw new Error("Refund event not found!");
339
- return events[0].txHash;
340
- }
341
- };
342
- default:
343
- return {
344
- type: await this.isExpired(signer, data) ? base_1.SwapCommitStateType.EXPIRED : base_1.SwapCommitStateType.NOT_COMMITED
345
- };
346
- }
347
- }
348
- /**
349
- * @inheritDoc
350
- */
351
- async getCommitStatuses(request) {
352
- const result = {};
353
- let promises = [];
354
- //TODO: We can upgrade this to use multicall
355
- for (let { signer, swapData } of request) {
356
- promises.push(this.getCommitStatus(signer, swapData).then(val => {
357
- result[swapData.getEscrowHash()] = val;
358
- }));
359
- if (promises.length >= this.Chain.config.maxParallelCalls) {
360
- await Promise.all(promises);
361
- promises = [];
362
- }
363
- }
364
- await Promise.all(promises);
365
- return result;
366
- }
367
- ////////////////////////////////////////////
368
- //// Swap data initializer
369
- /**
370
- * @inheritDoc
371
- */
372
- createSwapData(type, offerer, claimer, token, amount, claimData, sequence, expiry, payIn, payOut, securityDeposit, claimerBounty, depositToken = this.Chain.Tokens.getNativeCurrencyAddress()) {
373
- const claimHandler = this.claimHandlersBySwapType[type];
374
- if (claimHandler == null)
375
- throw new Error("Invalid claim handler for type: " + base_1.ChainSwapType[type]);
376
- return Promise.resolve(new StarknetSwapData_1.StarknetSwapData({
377
- offerer,
378
- claimer,
379
- token,
380
- refundHandler: this.timelockRefundHandler.address,
381
- claimHandler: claimHandler.address,
382
- payOut,
383
- payIn,
384
- reputation: payIn, //For now track reputation for all payIn swaps
385
- sequence,
386
- claimData: "0x" + claimData,
387
- refundData: (0, Utils_1.toHex)(expiry),
388
- amount,
389
- feeToken: depositToken,
390
- securityDeposit,
391
- claimerBounty,
392
- kind: type
393
- }));
394
- }
395
- ////////////////////////////////////////////
396
- //// Utils
397
- /**
398
- *
399
- * @param address
400
- * @param token
401
- * @private
402
- */
403
- getIntermediaryBalance(address, token) {
404
- return this.LpVault.getIntermediaryBalance(address, token);
405
- }
406
- /**
407
- * @inheritDoc
408
- */
409
- async getBalance(signer, tokenAddress, inContract) {
410
- if (inContract)
411
- return await this.getIntermediaryBalance(signer, tokenAddress);
412
- //TODO: For native token we should discount the cost of deploying an account if it is not deployed yet
413
- return await this.Chain.getBalance(signer, tokenAddress);
414
- }
415
- /**
416
- * @inheritDoc
417
- */
418
- getIntermediaryReputation(address, token) {
419
- return this.LpVault.getIntermediaryReputation(address, token);
420
- }
421
- ////////////////////////////////////////////
422
- //// Transaction initializers
423
- /**
424
- * @inheritDoc
425
- */
426
- async txsClaimWithSecret(signer, swapData, secret, checkExpiry, initAta, feeRate, skipAtaCheck) {
427
- return this.Claim.txsClaimWithSecret(typeof (signer) === "string" ? signer : signer.getAddress(), swapData, secret, checkExpiry, feeRate);
428
- }
429
- /**
430
- * @inheritDoc
431
- */
432
- async txsClaimWithTxData(signer, swapData, tx, requiredConfirmations, vout, commitedHeader, synchronizer, initAta, feeRate) {
433
- return this.Claim.txsClaimWithTxData(typeof (signer) === "string" ? signer : signer.getAddress(), swapData, tx, requiredConfirmations, vout, commitedHeader, synchronizer, feeRate);
434
- }
435
- /**
436
- * @inheritDoc
437
- */
438
- txsRefund(signer, swapData, check, initAta, feeRate) {
439
- return this.Refund.txsRefund(signer, swapData, check, feeRate);
440
- }
441
- /**
442
- * @inheritDoc
443
- */
444
- txsRefundWithAuthorization(signer, swapData, sig, check, initAta, feeRate) {
445
- return this.Refund.txsRefundWithAuthorization(signer, swapData, sig.timeout, sig.prefix, sig.signature, check, feeRate);
446
- }
447
- /**
448
- * @inheritDoc
449
- */
450
- txsInit(sender, swapData, sig, skipChecks, feeRate) {
451
- return this.Init.txsInit(sender, swapData, sig.timeout, sig.prefix, sig.signature, skipChecks, feeRate);
452
- }
453
- /**
454
- * @inheritDoc
455
- */
456
- txsWithdraw(signer, token, amount, feeRate) {
457
- return this.LpVault.txsWithdraw(signer, token, amount, feeRate);
458
- }
459
- /**
460
- * @inheritDoc
461
- */
462
- txsDeposit(signer, token, amount, feeRate) {
463
- return this.LpVault.txsDeposit(signer, token, amount, feeRate);
464
- }
465
- ////////////////////////////////////////////
466
- //// Executors
467
- /**
468
- * @inheritDoc
469
- */
470
- async claimWithSecret(signer, swapData, secret, checkExpiry, initAta, txOptions) {
471
- const result = await this.Claim.txsClaimWithSecret(signer.getAddress(), swapData, secret, checkExpiry, txOptions?.feeRate);
472
- const [signature] = await this.Chain.sendAndConfirm(signer, result, txOptions?.waitForConfirmation, txOptions?.abortSignal);
473
- return signature;
474
- }
475
- /**
476
- * @inheritDoc
477
- */
478
- async claimWithTxData(signer, swapData, tx, requiredConfirmations, vout, commitedHeader, synchronizer, initAta, txOptions) {
479
- const txs = await this.Claim.txsClaimWithTxData(signer.getAddress(), swapData, tx, requiredConfirmations, vout, commitedHeader, synchronizer, txOptions?.feeRate);
480
- if (txs === null)
481
- throw new Error("Btc relay not synchronized to required blockheight!");
482
- //TODO: This doesn't return proper tx signature
483
- const [signature] = await this.Chain.sendAndConfirm(signer, txs, txOptions?.waitForConfirmation, txOptions?.abortSignal);
484
- return signature;
485
- }
486
- /**
487
- * @inheritDoc
488
- */
489
- async refund(signer, swapData, check, initAta, txOptions) {
490
- let result = await this.txsRefund(signer.getAddress(), swapData, check, initAta, txOptions?.feeRate);
491
- const [signature] = await this.Chain.sendAndConfirm(signer, result, txOptions?.waitForConfirmation, txOptions?.abortSignal);
492
- return signature;
493
- }
494
- /**
495
- * @inheritDoc
496
- */
497
- async refundWithAuthorization(signer, swapData, signature, check, initAta, txOptions) {
498
- let result = await this.txsRefundWithAuthorization(signer.getAddress(), swapData, signature, check, initAta, txOptions?.feeRate);
499
- const [txSignature] = await this.Chain.sendAndConfirm(signer, result, txOptions?.waitForConfirmation, txOptions?.abortSignal);
500
- return txSignature;
501
- }
502
- /**
503
- * @inheritDoc
504
- */
505
- async init(signer, swapData, signature, skipChecks, txOptions) {
506
- if (swapData.isPayIn()) {
507
- if (!swapData.isOfferer(signer.getAddress()))
508
- throw new Error("Invalid signer provided!");
509
- }
510
- else {
511
- if (!swapData.isClaimer(signer.getAddress()))
512
- throw new Error("Invalid signer provided!");
513
- }
514
- let result = await this.txsInit(signer.getAddress(), swapData, signature, skipChecks, txOptions?.feeRate);
515
- const [txSignature] = await this.Chain.sendAndConfirm(signer, result, txOptions?.waitForConfirmation, txOptions?.abortSignal);
516
- return txSignature;
517
- }
518
- /**
519
- * @inheritDoc
520
- */
521
- async withdraw(signer, token, amount, txOptions) {
522
- const txs = await this.LpVault.txsWithdraw(signer.getAddress(), token, amount, txOptions?.feeRate);
523
- const [txId] = await this.Chain.sendAndConfirm(signer, txs, txOptions?.waitForConfirmation, txOptions?.abortSignal, false);
524
- return txId;
525
- }
526
- /**
527
- * @inheritDoc
528
- */
529
- async deposit(signer, token, amount, txOptions) {
530
- const txs = await this.LpVault.txsDeposit(signer.getAddress(), token, amount, txOptions?.feeRate);
531
- const [txId] = await this.Chain.sendAndConfirm(signer, txs, txOptions?.waitForConfirmation, txOptions?.abortSignal, false);
532
- return txId;
533
- }
534
- ////////////////////////////////////////////
535
- //// Fees
536
- /**
537
- * @inheritDoc
538
- */
539
- getInitPayInFeeRate(offerer, claimer, token, paymentHash) {
540
- return this.Chain.Fees.getFeeRate();
541
- }
542
- /**
543
- * @inheritDoc
544
- */
545
- getInitFeeRate(offerer, claimer, token, paymentHash) {
546
- return this.Chain.Fees.getFeeRate();
547
- }
548
- /**
549
- * @inheritDoc
550
- */
551
- getRefundFeeRate(swapData) {
552
- return this.Chain.Fees.getFeeRate();
553
- }
554
- /**
555
- * @inheritDoc
556
- */
557
- getClaimFeeRate(signer, swapData) {
558
- return this.Chain.Fees.getFeeRate();
559
- }
560
- /**
561
- * @inheritDoc
562
- */
563
- getClaimFee(signer, swapData, feeRate) {
564
- return this.Claim.getClaimFee(swapData, feeRate);
565
- }
566
- /**
567
- * @inheritDoc
568
- */
569
- getCommitFee(signer, swapData, feeRate) {
570
- return this.Init.getInitFee(swapData, feeRate);
571
- }
572
- /**
573
- * @inheritDoc
574
- */
575
- getRefundFee(signer, swapData, feeRate) {
576
- return this.Refund.getRefundFee(swapData, feeRate);
577
- }
578
- }
579
- exports.StarknetSwapContract = StarknetSwapContract;
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;