@atomiqlabs/chain-starknet 4.0.0-dev.12 → 4.0.0-dev.13

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 (146) hide show
  1. package/LICENSE +201 -201
  2. package/dist/index.d.ts +38 -38
  3. package/dist/index.js +54 -54
  4. package/dist/starknet/StarknetChainType.d.ts +13 -13
  5. package/dist/starknet/StarknetChainType.js +2 -2
  6. package/dist/starknet/StarknetInitializer.d.ts +27 -27
  7. package/dist/starknet/StarknetInitializer.js +69 -69
  8. package/dist/starknet/btcrelay/BtcRelayAbi.d.ts +250 -250
  9. package/dist/starknet/btcrelay/BtcRelayAbi.js +341 -341
  10. package/dist/starknet/btcrelay/StarknetBtcRelay.d.ts +186 -186
  11. package/dist/starknet/btcrelay/StarknetBtcRelay.js +379 -379
  12. package/dist/starknet/btcrelay/headers/StarknetBtcHeader.d.ts +31 -31
  13. package/dist/starknet/btcrelay/headers/StarknetBtcHeader.js +74 -74
  14. package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.d.ts +51 -51
  15. package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.js +113 -113
  16. package/dist/starknet/chain/StarknetAction.d.ts +19 -19
  17. package/dist/starknet/chain/StarknetAction.js +73 -73
  18. package/dist/starknet/chain/StarknetChainInterface.d.ts +52 -52
  19. package/dist/starknet/chain/StarknetChainInterface.js +91 -91
  20. package/dist/starknet/chain/StarknetModule.d.ts +14 -14
  21. package/dist/starknet/chain/StarknetModule.js +13 -13
  22. package/dist/starknet/chain/modules/ERC20Abi.d.ts +755 -755
  23. package/dist/starknet/chain/modules/ERC20Abi.js +1032 -1032
  24. package/dist/starknet/chain/modules/StarknetAccounts.d.ts +6 -6
  25. package/dist/starknet/chain/modules/StarknetAccounts.js +24 -24
  26. package/dist/starknet/chain/modules/StarknetAddresses.d.ts +9 -9
  27. package/dist/starknet/chain/modules/StarknetAddresses.js +26 -26
  28. package/dist/starknet/chain/modules/StarknetBlocks.d.ts +20 -20
  29. package/dist/starknet/chain/modules/StarknetBlocks.js +64 -64
  30. package/dist/starknet/chain/modules/StarknetEvents.d.ts +44 -44
  31. package/dist/starknet/chain/modules/StarknetEvents.js +88 -88
  32. package/dist/starknet/chain/modules/StarknetFees.d.ts +77 -77
  33. package/dist/starknet/chain/modules/StarknetFees.js +114 -114
  34. package/dist/starknet/chain/modules/StarknetSignatures.d.ts +29 -29
  35. package/dist/starknet/chain/modules/StarknetSignatures.js +72 -72
  36. package/dist/starknet/chain/modules/StarknetTokens.d.ts +69 -69
  37. package/dist/starknet/chain/modules/StarknetTokens.js +102 -98
  38. package/dist/starknet/chain/modules/StarknetTransactions.d.ts +93 -93
  39. package/dist/starknet/chain/modules/StarknetTransactions.js +261 -260
  40. package/dist/starknet/contract/StarknetContractBase.d.ts +13 -13
  41. package/dist/starknet/contract/StarknetContractBase.js +20 -16
  42. package/dist/starknet/contract/StarknetContractModule.d.ts +8 -8
  43. package/dist/starknet/contract/StarknetContractModule.js +11 -11
  44. package/dist/starknet/contract/modules/StarknetContractEvents.d.ts +51 -51
  45. package/dist/starknet/contract/modules/StarknetContractEvents.js +97 -97
  46. package/dist/starknet/events/StarknetChainEvents.d.ts +21 -21
  47. package/dist/starknet/events/StarknetChainEvents.js +52 -52
  48. package/dist/starknet/events/StarknetChainEventsBrowser.d.ts +89 -90
  49. package/dist/starknet/events/StarknetChainEventsBrowser.js +296 -294
  50. package/dist/starknet/provider/RpcProviderWithRetries.d.ts +21 -21
  51. package/dist/starknet/provider/RpcProviderWithRetries.js +32 -32
  52. package/dist/starknet/spv_swap/SpvVaultContractAbi.d.ts +488 -488
  53. package/dist/starknet/spv_swap/SpvVaultContractAbi.js +656 -656
  54. package/dist/starknet/spv_swap/StarknetSpvVaultContract.d.ts +66 -66
  55. package/dist/starknet/spv_swap/StarknetSpvVaultContract.js +382 -382
  56. package/dist/starknet/spv_swap/StarknetSpvVaultData.d.ts +49 -49
  57. package/dist/starknet/spv_swap/StarknetSpvVaultData.js +145 -145
  58. package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.d.ts +25 -25
  59. package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.js +72 -72
  60. package/dist/starknet/swaps/EscrowManagerAbi.d.ts +431 -431
  61. package/dist/starknet/swaps/EscrowManagerAbi.js +583 -583
  62. package/dist/starknet/swaps/StarknetSwapContract.d.ts +191 -191
  63. package/dist/starknet/swaps/StarknetSwapContract.js +424 -424
  64. package/dist/starknet/swaps/StarknetSwapData.d.ts +74 -74
  65. package/dist/starknet/swaps/StarknetSwapData.js +325 -325
  66. package/dist/starknet/swaps/StarknetSwapModule.d.ts +10 -10
  67. package/dist/starknet/swaps/StarknetSwapModule.js +11 -11
  68. package/dist/starknet/swaps/handlers/IHandler.d.ts +13 -13
  69. package/dist/starknet/swaps/handlers/IHandler.js +2 -2
  70. package/dist/starknet/swaps/handlers/claim/ClaimHandlers.d.ts +13 -13
  71. package/dist/starknet/swaps/handlers/claim/ClaimHandlers.js +13 -13
  72. package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.d.ts +21 -21
  73. package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.js +44 -44
  74. package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +24 -24
  75. package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +48 -48
  76. package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +25 -25
  77. package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +40 -40
  78. package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +20 -20
  79. package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +30 -30
  80. package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +45 -45
  81. package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +52 -52
  82. package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.d.ts +17 -17
  83. package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.js +27 -27
  84. package/dist/starknet/swaps/modules/StarknetLpVault.d.ts +69 -69
  85. package/dist/starknet/swaps/modules/StarknetLpVault.js +122 -122
  86. package/dist/starknet/swaps/modules/StarknetSwapClaim.d.ts +53 -53
  87. package/dist/starknet/swaps/modules/StarknetSwapClaim.js +100 -100
  88. package/dist/starknet/swaps/modules/StarknetSwapInit.d.ts +94 -87
  89. package/dist/starknet/swaps/modules/StarknetSwapInit.js +235 -225
  90. package/dist/starknet/swaps/modules/StarknetSwapRefund.d.ts +62 -62
  91. package/dist/starknet/swaps/modules/StarknetSwapRefund.js +128 -128
  92. package/dist/starknet/wallet/StarknetKeypairWallet.d.ts +7 -7
  93. package/dist/starknet/wallet/StarknetKeypairWallet.js +35 -30
  94. package/dist/starknet/wallet/StarknetSigner.d.ts +12 -12
  95. package/dist/starknet/wallet/StarknetSigner.js +47 -46
  96. package/dist/utils/Utils.d.ts +37 -37
  97. package/dist/utils/Utils.js +260 -261
  98. package/package.json +43 -37
  99. package/src/index.ts +47 -47
  100. package/src/starknet/StarknetChainType.ts +28 -28
  101. package/src/starknet/StarknetInitializer.ts +108 -108
  102. package/src/starknet/btcrelay/BtcRelayAbi.ts +338 -338
  103. package/src/starknet/btcrelay/StarknetBtcRelay.ts +494 -494
  104. package/src/starknet/btcrelay/headers/StarknetBtcHeader.ts +100 -100
  105. package/src/starknet/btcrelay/headers/StarknetBtcStoredHeader.ts +141 -141
  106. package/src/starknet/chain/StarknetAction.ts +85 -85
  107. package/src/starknet/chain/StarknetChainInterface.ts +149 -149
  108. package/src/starknet/chain/StarknetModule.ts +19 -19
  109. package/src/starknet/chain/modules/ERC20Abi.ts +1029 -1029
  110. package/src/starknet/chain/modules/StarknetAccounts.ts +25 -25
  111. package/src/starknet/chain/modules/StarknetAddresses.ts +22 -22
  112. package/src/starknet/chain/modules/StarknetBlocks.ts +75 -74
  113. package/src/starknet/chain/modules/StarknetEvents.ts +104 -104
  114. package/src/starknet/chain/modules/StarknetFees.ts +154 -154
  115. package/src/starknet/chain/modules/StarknetSignatures.ts +91 -91
  116. package/src/starknet/chain/modules/StarknetTokens.ts +120 -116
  117. package/src/starknet/chain/modules/StarknetTransactions.ts +285 -283
  118. package/src/starknet/contract/StarknetContractBase.ts +30 -26
  119. package/src/starknet/contract/StarknetContractModule.ts +16 -16
  120. package/src/starknet/contract/modules/StarknetContractEvents.ts +134 -134
  121. package/src/starknet/events/StarknetChainEvents.ts +67 -67
  122. package/src/starknet/events/StarknetChainEventsBrowser.ts +411 -411
  123. package/src/starknet/provider/RpcProviderWithRetries.ts +43 -43
  124. package/src/starknet/spv_swap/SpvVaultContractAbi.ts +656 -656
  125. package/src/starknet/spv_swap/StarknetSpvVaultContract.ts +483 -483
  126. package/src/starknet/spv_swap/StarknetSpvVaultData.ts +195 -195
  127. package/src/starknet/spv_swap/StarknetSpvWithdrawalData.ts +79 -79
  128. package/src/starknet/swaps/EscrowManagerAbi.ts +582 -582
  129. package/src/starknet/swaps/StarknetSwapContract.ts +647 -647
  130. package/src/starknet/swaps/StarknetSwapData.ts +455 -455
  131. package/src/starknet/swaps/StarknetSwapModule.ts +17 -17
  132. package/src/starknet/swaps/handlers/IHandler.ts +20 -20
  133. package/src/starknet/swaps/handlers/claim/ClaimHandlers.ts +23 -23
  134. package/src/starknet/swaps/handlers/claim/HashlockClaimHandler.ts +53 -53
  135. package/src/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.ts +73 -73
  136. package/src/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.ts +67 -67
  137. package/src/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.ts +50 -50
  138. package/src/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +102 -102
  139. package/src/starknet/swaps/handlers/refund/TimelockRefundHandler.ts +38 -38
  140. package/src/starknet/swaps/modules/StarknetLpVault.ts +147 -147
  141. package/src/starknet/swaps/modules/StarknetSwapClaim.ts +141 -141
  142. package/src/starknet/swaps/modules/StarknetSwapInit.ts +300 -287
  143. package/src/starknet/swaps/modules/StarknetSwapRefund.ts +196 -196
  144. package/src/starknet/wallet/StarknetKeypairWallet.ts +44 -39
  145. package/src/starknet/wallet/StarknetSigner.ts +55 -55
  146. package/src/utils/Utils.ts +251 -252
@@ -1,455 +1,455 @@
1
- import {SwapData, ChainSwapType} from "@atomiqlabs/base";
2
- import {TimelockRefundHandler} from "./handlers/refund/TimelockRefundHandler";
3
- import {BigNumberish, cairo, CairoOption, CairoOptionVariant, hash} from "starknet";
4
- import {toBigInt, toHex} from "../../utils/Utils";
5
- import {
6
- StringToPrimitiveType
7
- } from "abi-wan-kanabi/dist/kanabi";
8
- import {EscrowManagerAbi} from "./EscrowManagerAbi";
9
- import {IClaimHandler} from "./handlers/claim/ClaimHandlers";
10
-
11
- const FLAG_PAY_OUT: bigint = 0x01n;
12
- const FLAG_PAY_IN: bigint = 0x02n;
13
- const FLAG_REPUTATION: bigint = 0x04n;
14
-
15
- export type StarknetSwapDataType = StringToPrimitiveType<typeof EscrowManagerAbi, "escrow_manager::structs::escrow::EscrowData">;
16
-
17
- export type StarknetSuccessAction = {
18
- executionHash: string,
19
- executionExpiry: bigint,
20
- executionFee: bigint
21
- }
22
-
23
- function successActionEquals(a: StarknetSuccessAction, b: StarknetSuccessAction): boolean {
24
- if(a!=null && b!=null) {
25
- return a.executionHash.toLowerCase()===b.executionHash.toLowerCase() &&
26
- a.executionExpiry === b.executionExpiry &&
27
- a.executionFee === b.executionFee;
28
- }
29
- return a === b;
30
- }
31
-
32
- export class StarknetSwapData extends SwapData {
33
-
34
- static toFlags(value: number | bigint | string): {payOut: boolean, payIn: boolean, reputation: boolean, sequence: bigint} {
35
- const val = toBigInt(value);
36
- return {
37
- sequence: val >> 64n,
38
- payOut: (val & FLAG_PAY_OUT) === FLAG_PAY_OUT,
39
- payIn: (val & FLAG_PAY_IN) === FLAG_PAY_IN,
40
- reputation: (val & FLAG_REPUTATION) === FLAG_REPUTATION
41
- }
42
- }
43
-
44
- private getFlags(): bigint {
45
- return (this.sequence << 64n) +
46
- (this.payOut ? FLAG_PAY_OUT : 0n) +
47
- (this.payIn ? FLAG_PAY_IN : 0n) +
48
- (this.reputation ? FLAG_REPUTATION : 0n);
49
- }
50
-
51
- offerer: string;
52
- claimer: string;
53
- token: string;
54
-
55
- refundHandler: string;
56
- claimHandler: string;
57
-
58
- //Flags
59
- payOut: boolean;
60
- payIn: boolean;
61
- reputation: boolean;
62
- sequence: bigint;
63
-
64
- claimData: string;
65
- refundData: string;
66
-
67
- amount: bigint;
68
-
69
- feeToken: string;
70
- securityDeposit: bigint;
71
- claimerBounty: bigint;
72
-
73
- extraData: string;
74
-
75
- successAction?: StarknetSuccessAction;
76
-
77
- kind: ChainSwapType;
78
-
79
- constructor(
80
- offerer: string,
81
- claimer: string,
82
- token: string,
83
- refundHandler: string,
84
- claimHandler: string,
85
- payOut: boolean,
86
- payIn: boolean,
87
- reputation: boolean,
88
- sequence: bigint,
89
- claimData: string,
90
- refundData: string,
91
- amount: bigint,
92
- feeToken: string,
93
- securityDeposit: bigint,
94
- claimerBounty: bigint,
95
- kind: ChainSwapType,
96
- extraData: string,
97
- successAction?: StarknetSuccessAction
98
- );
99
-
100
- constructor(data: any);
101
-
102
- constructor(
103
- offererOrData: string | any,
104
- claimer?: string,
105
- token?: string,
106
- refundHandler?: string,
107
- claimHandler?: string,
108
- payOut?: boolean,
109
- payIn?: boolean,
110
- reputation?: boolean,
111
- sequence?: bigint,
112
- claimData?: string,
113
- refundData?: string,
114
- amount?: bigint,
115
- feeToken?: string,
116
- securityDeposit?: bigint,
117
- claimerBounty?: bigint,
118
- kind?: ChainSwapType,
119
- extraData?: string,
120
- successAction?: StarknetSuccessAction
121
- ) {
122
- super();
123
- if(claimer!=null || token!=null || refundHandler!=null || claimHandler!=null ||
124
- payOut!=null || payIn!=null || reputation!=null || sequence!=null || claimData!=null || refundData!=null ||
125
- amount!=null || feeToken!=null || securityDeposit!=null || claimerBounty!=null) {
126
- this.offerer = offererOrData;
127
- this.claimer = claimer;
128
- this.token = token;
129
- this.refundHandler = refundHandler;
130
- this.claimHandler = claimHandler;
131
- this.payOut = payOut;
132
- this.payIn = payIn;
133
- this.reputation = reputation;
134
- this.sequence = sequence;
135
- this.claimData = claimData;
136
- this.refundData = refundData;
137
- this.amount = amount;
138
- this.feeToken = feeToken;
139
- this.securityDeposit = securityDeposit;
140
- this.claimerBounty = claimerBounty;
141
- this.kind = kind;
142
- this.extraData = extraData;
143
- this.successAction = successAction;
144
- } else {
145
- this.offerer = offererOrData.offerer;
146
- this.claimer = offererOrData.claimer;
147
- this.token = offererOrData.token;
148
- this.refundHandler = offererOrData.refundHandler;
149
- this.claimHandler = offererOrData.claimHandler;
150
- this.payOut = offererOrData.payOut;
151
- this.payIn = offererOrData.payIn;
152
- this.reputation = offererOrData.reputation;
153
- this.sequence = offererOrData.sequence==null ? null : BigInt(offererOrData.sequence);
154
- this.claimData = offererOrData.claimData;
155
- this.refundData = offererOrData.refundData;
156
- this.amount = offererOrData.amount==null ? null : BigInt(offererOrData.amount);
157
- this.feeToken = offererOrData.feeToken;
158
- this.securityDeposit = offererOrData.securityDeposit==null ? null : BigInt(offererOrData.securityDeposit);
159
- this.claimerBounty = offererOrData.claimerBounty==null ? null : BigInt(offererOrData.claimerBounty);
160
- this.kind = offererOrData.kind;
161
- this.extraData = offererOrData.extraData;
162
- this.successAction = offererOrData.successAction==null ? null : {
163
- executionHash: offererOrData.successAction.executionHash,
164
- executionExpiry: BigInt(offererOrData.successAction.executionExpiry),
165
- executionFee: BigInt(offererOrData.successAction.executionFee),
166
- }
167
- }
168
- }
169
-
170
- getOfferer(): string {
171
- return this.offerer;
172
- }
173
-
174
- setOfferer(newOfferer: string) {
175
- this.offerer = newOfferer;
176
- this.payIn = true;
177
- }
178
-
179
- getClaimer(): string {
180
- return this.claimer;
181
- }
182
-
183
- setClaimer(newClaimer: string) {
184
- this.claimer = newClaimer;
185
- this.payIn = false;
186
- this.payOut = true;
187
- this.reputation = false;
188
- }
189
-
190
- serialize(): any {
191
- return {
192
- type: "strk",
193
- offerer: this.offerer,
194
- claimer: this.claimer,
195
- token: this.token,
196
- refundHandler: this.refundHandler,
197
- claimHandler: this.claimHandler,
198
- payOut: this.payOut,
199
- payIn: this.payIn,
200
- reputation: this.reputation,
201
- sequence: this.sequence==null ? null : this.sequence.toString(10),
202
- claimData: this.claimData,
203
- refundData: this.refundData,
204
- amount: this.amount==null ? null : this.amount.toString(10),
205
- feeToken: this.feeToken,
206
- securityDeposit: this.securityDeposit==null ? null : this.securityDeposit.toString(10),
207
- claimerBounty: this.claimerBounty==null ? null : this.claimerBounty.toString(10),
208
- kind: this.kind,
209
- extraData: this.extraData,
210
- successAction: this.successAction==null ? null : {
211
- executionHash: this.successAction.executionHash,
212
- executionExpiry: this.successAction.executionExpiry.toString(10),
213
- executionFee: this.successAction.executionFee.toString(10)
214
- }
215
- }
216
- }
217
-
218
- getAmount(): bigint {
219
- return this.amount;
220
- }
221
-
222
- getToken(): string {
223
- return this.token;
224
- }
225
-
226
- isToken(token: string): boolean {
227
- return this.token.toLowerCase()===token.toLowerCase();
228
- }
229
-
230
- getType(): ChainSwapType {
231
- return this.kind;
232
- }
233
-
234
- getExpiry(): bigint {
235
- return TimelockRefundHandler.getExpiry(this);
236
- }
237
-
238
- isPayIn(): boolean {
239
- return this.payIn;
240
- }
241
-
242
- isPayOut(): boolean {
243
- return this.payOut;
244
- }
245
-
246
- getEscrowHash(): string {
247
- const amountValue = cairo.uint256("0x"+this.amount.toString(16));
248
- const securityDepositValue = cairo.uint256("0x"+this.securityDeposit.toString(16));
249
- const claimerBountyValue = cairo.uint256("0x"+this.claimerBounty.toString(16));
250
- const elements = [
251
- this.offerer,
252
- this.claimer,
253
- this.token,
254
- this.refundHandler,
255
- this.claimHandler,
256
- this.getFlags(),
257
- this.claimData,
258
- this.refundData,
259
- amountValue.low,
260
- amountValue.high,
261
- this.feeToken,
262
- securityDepositValue.low,
263
- securityDepositValue.high,
264
- claimerBountyValue.low,
265
- claimerBountyValue.high
266
- ];
267
- if(this.successAction!=null) {
268
- elements.push(this.successAction.executionHash);
269
- elements.push(this.successAction.executionExpiry);
270
- const feeValue = cairo.uint256("0x"+this.successAction.executionFee.toString(16));
271
- elements.push(feeValue.low, feeValue.high);
272
- }
273
-
274
- let escrowHash = hash.computePoseidonHashOnElements(elements);
275
- if(escrowHash.startsWith("0x")) escrowHash = escrowHash.slice(2);
276
- return escrowHash.padStart(64, "0");
277
- }
278
-
279
- getClaimHash(): string {
280
- let hash = this.claimData;
281
- if(hash.startsWith("0x")) hash = hash.slice(2);
282
- return hash.padStart(64, "0");
283
- }
284
-
285
- getSequence(): bigint {
286
- return this.sequence;
287
- }
288
-
289
- getConfirmationsHint(): number {
290
- if(this.extraData==null) return null;
291
- if(this.extraData.length!=84) return null;
292
- return parseInt(this.extraData.slice(80), 16);
293
- }
294
-
295
- getNonceHint(): bigint {
296
- if(this.extraData==null) return null;
297
- if(this.extraData.length!=84) return null;
298
- return BigInt("0x"+this.extraData.slice(64, 80));
299
- }
300
-
301
- getTxoHashHint(): string {
302
- if(this.extraData==null) return null;
303
- if(this.extraData.length!=84) return null;
304
- return this.extraData.slice(0, 64);
305
- }
306
-
307
- getExtraData(): string {
308
- return this.extraData;
309
- }
310
-
311
- setExtraData(extraData: string): void {
312
- this.extraData = extraData;
313
- }
314
-
315
- getSecurityDeposit() {
316
- return this.securityDeposit;
317
- }
318
-
319
- getClaimerBounty() {
320
- return this.claimerBounty;
321
- }
322
-
323
- getTotalDeposit() {
324
- return this.claimerBounty < this.securityDeposit ? this.securityDeposit : this.claimerBounty;
325
- }
326
-
327
- getDepositToken() {
328
- return this.feeToken;
329
- }
330
-
331
- isDepositToken(token: string): boolean {
332
- if(!token.startsWith("0x")) token = "0x"+token;
333
- return toHex(this.feeToken)===toHex(token);
334
- }
335
-
336
- isClaimer(address: string) {
337
- if(!address.startsWith("0x")) address = "0x"+address;
338
- return toHex(this.claimer)===toHex(address);
339
- }
340
-
341
- isOfferer(address: string) {
342
- if(!address.startsWith("0x")) address = "0x"+address;
343
- return toHex(this.offerer)===toHex(address);
344
- }
345
-
346
- isRefundHandler(address: string): boolean {
347
- if(!address.startsWith("0x")) address = "0x"+address;
348
- return toHex(this.refundHandler)===toHex(address);
349
- }
350
-
351
- isClaimHandler(address: string): boolean {
352
- if(!address.startsWith("0x")) address = "0x"+address;
353
- return toHex(this.claimHandler)===toHex(address);
354
- }
355
-
356
- isClaimData(data: string): boolean {
357
- if(!data.startsWith("0x")) data = "0x"+data;
358
- return toHex(this.claimData)===toHex(data);
359
- }
360
-
361
- equals(other: StarknetSwapData): boolean {
362
- return other.offerer.toLowerCase()===this.offerer.toLowerCase() &&
363
- other.claimer.toLowerCase()===this.claimer.toLowerCase() &&
364
- other.token.toLowerCase()===this.token.toLowerCase() &&
365
- other.refundHandler.toLowerCase()===this.refundHandler.toLowerCase() &&
366
- other.claimHandler.toLowerCase()===this.claimHandler.toLowerCase() &&
367
- other.payIn===this.payIn &&
368
- other.payOut===this.payOut &&
369
- other.reputation===this.reputation &&
370
- this.sequence === other.sequence &&
371
- other.claimData.toLowerCase()===this.claimData.toLowerCase() &&
372
- other.refundData.toLowerCase()===this.refundData.toLowerCase() &&
373
- other.amount === this.amount &&
374
- other.securityDeposit === this.securityDeposit &&
375
- other.claimerBounty === this.claimerBounty &&
376
- successActionEquals(other.successAction, this.successAction)
377
- }
378
-
379
- toEscrowStruct(): StarknetSwapDataType {
380
- return {
381
- offerer: this.offerer,
382
- claimer: this.claimer,
383
- token: this.token,
384
- refund_handler: this.refundHandler,
385
- claim_handler: this.claimHandler,
386
- flags: this.getFlags(),
387
- claim_data: this.claimData,
388
- refund_data: this.refundData,
389
- amount: cairo.uint256(toBigInt(this.amount)),
390
- fee_token: this.feeToken,
391
- security_deposit: cairo.uint256(toBigInt(this.securityDeposit)),
392
- claimer_bounty: cairo.uint256(toBigInt(this.claimerBounty)),
393
- success_action: new CairoOption(
394
- this.successAction==null ? CairoOptionVariant.None : CairoOptionVariant.Some,
395
- this.successAction==null ? undefined : {
396
- hash: this.successAction.executionHash,
397
- expiry: this.successAction.executionExpiry,
398
- fee: cairo.uint256(this.successAction.executionFee)
399
- }
400
- ) as StarknetSwapDataType["success_action"]
401
- }
402
- }
403
-
404
- static fromSerializedFeltArray(span: BigNumberish[], claimHandlerImpl: IClaimHandler<any, any>) {
405
- const offerer = toHex(span.shift());
406
- const claimer = toHex(span.shift());
407
- const token = toHex(span.shift());
408
- const refundHandler = toHex(span.shift());
409
- const claimHandler = toHex(span.shift());
410
- const {payOut, payIn, reputation, sequence} = StarknetSwapData.toFlags(span.shift());
411
- const claimData = toHex(span.shift());
412
- const refundData = toHex(span.shift());
413
- const amount = toBigInt({low: span.shift(), high: span.shift()});
414
- const feeToken = toHex(span.shift());
415
- const securityDeposit = toBigInt({low: span.shift(), high: span.shift()});
416
- const claimerBounty = toBigInt({low: span.shift(), high: span.shift()});
417
- const hasSuccessAction = toBigInt(span.shift()) === 0n;
418
- let successAction: StarknetSuccessAction = null;
419
- if(hasSuccessAction) {
420
- successAction = {
421
- executionHash: toHex(span.shift()),
422
- executionExpiry: toBigInt(span.shift()),
423
- executionFee: toBigInt({low: span.shift(), high: span.shift()})
424
- }
425
- }
426
-
427
- return new StarknetSwapData(
428
- offerer,
429
- claimer,
430
- token,
431
- refundHandler,
432
- claimHandler,
433
- payOut,
434
- payIn,
435
- reputation,
436
- sequence,
437
- claimData,
438
- refundData,
439
- amount,
440
- feeToken,
441
- securityDeposit,
442
- claimerBounty,
443
- claimHandlerImpl.getType(),
444
- null,
445
- successAction
446
- );
447
- }
448
-
449
- hasSuccessAction(): boolean {
450
- return this.successAction != null;
451
- }
452
-
453
- }
454
-
455
- SwapData.deserializers["strk"] = StarknetSwapData;
1
+ import {SwapData, ChainSwapType} from "@atomiqlabs/base";
2
+ import {TimelockRefundHandler} from "./handlers/refund/TimelockRefundHandler";
3
+ import {BigNumberish, cairo, CairoOption, CairoOptionVariant, hash} from "starknet";
4
+ import {toBigInt, toHex} from "../../utils/Utils";
5
+ import {
6
+ StringToPrimitiveType
7
+ } from "abi-wan-kanabi/dist/kanabi";
8
+ import {EscrowManagerAbi} from "./EscrowManagerAbi";
9
+ import {IClaimHandler} from "./handlers/claim/ClaimHandlers";
10
+
11
+ const FLAG_PAY_OUT: bigint = 0x01n;
12
+ const FLAG_PAY_IN: bigint = 0x02n;
13
+ const FLAG_REPUTATION: bigint = 0x04n;
14
+
15
+ export type StarknetSwapDataType = StringToPrimitiveType<typeof EscrowManagerAbi, "escrow_manager::structs::escrow::EscrowData">;
16
+
17
+ export type StarknetSuccessAction = {
18
+ executionHash: string,
19
+ executionExpiry: bigint,
20
+ executionFee: bigint
21
+ }
22
+
23
+ function successActionEquals(a: StarknetSuccessAction, b: StarknetSuccessAction): boolean {
24
+ if(a!=null && b!=null) {
25
+ return a.executionHash.toLowerCase()===b.executionHash.toLowerCase() &&
26
+ a.executionExpiry === b.executionExpiry &&
27
+ a.executionFee === b.executionFee;
28
+ }
29
+ return a === b;
30
+ }
31
+
32
+ export class StarknetSwapData extends SwapData {
33
+
34
+ static toFlags(value: number | bigint | string): {payOut: boolean, payIn: boolean, reputation: boolean, sequence: bigint} {
35
+ const val = toBigInt(value);
36
+ return {
37
+ sequence: val >> 64n,
38
+ payOut: (val & FLAG_PAY_OUT) === FLAG_PAY_OUT,
39
+ payIn: (val & FLAG_PAY_IN) === FLAG_PAY_IN,
40
+ reputation: (val & FLAG_REPUTATION) === FLAG_REPUTATION
41
+ }
42
+ }
43
+
44
+ private getFlags(): bigint {
45
+ return (this.sequence << 64n) +
46
+ (this.payOut ? FLAG_PAY_OUT : 0n) +
47
+ (this.payIn ? FLAG_PAY_IN : 0n) +
48
+ (this.reputation ? FLAG_REPUTATION : 0n);
49
+ }
50
+
51
+ offerer: string;
52
+ claimer: string;
53
+ token: string;
54
+
55
+ refundHandler: string;
56
+ claimHandler: string;
57
+
58
+ //Flags
59
+ payOut: boolean;
60
+ payIn: boolean;
61
+ reputation: boolean;
62
+ sequence: bigint;
63
+
64
+ claimData: string;
65
+ refundData: string;
66
+
67
+ amount: bigint;
68
+
69
+ feeToken: string;
70
+ securityDeposit: bigint;
71
+ claimerBounty: bigint;
72
+
73
+ extraData: string;
74
+
75
+ successAction?: StarknetSuccessAction;
76
+
77
+ kind: ChainSwapType;
78
+
79
+ constructor(
80
+ offerer: string,
81
+ claimer: string,
82
+ token: string,
83
+ refundHandler: string,
84
+ claimHandler: string,
85
+ payOut: boolean,
86
+ payIn: boolean,
87
+ reputation: boolean,
88
+ sequence: bigint,
89
+ claimData: string,
90
+ refundData: string,
91
+ amount: bigint,
92
+ feeToken: string,
93
+ securityDeposit: bigint,
94
+ claimerBounty: bigint,
95
+ kind: ChainSwapType,
96
+ extraData: string,
97
+ successAction?: StarknetSuccessAction
98
+ );
99
+
100
+ constructor(data: any);
101
+
102
+ constructor(
103
+ offererOrData: string | any,
104
+ claimer?: string,
105
+ token?: string,
106
+ refundHandler?: string,
107
+ claimHandler?: string,
108
+ payOut?: boolean,
109
+ payIn?: boolean,
110
+ reputation?: boolean,
111
+ sequence?: bigint,
112
+ claimData?: string,
113
+ refundData?: string,
114
+ amount?: bigint,
115
+ feeToken?: string,
116
+ securityDeposit?: bigint,
117
+ claimerBounty?: bigint,
118
+ kind?: ChainSwapType,
119
+ extraData?: string,
120
+ successAction?: StarknetSuccessAction
121
+ ) {
122
+ super();
123
+ if(claimer!=null || token!=null || refundHandler!=null || claimHandler!=null ||
124
+ payOut!=null || payIn!=null || reputation!=null || sequence!=null || claimData!=null || refundData!=null ||
125
+ amount!=null || feeToken!=null || securityDeposit!=null || claimerBounty!=null) {
126
+ this.offerer = offererOrData;
127
+ this.claimer = claimer;
128
+ this.token = token;
129
+ this.refundHandler = refundHandler;
130
+ this.claimHandler = claimHandler;
131
+ this.payOut = payOut;
132
+ this.payIn = payIn;
133
+ this.reputation = reputation;
134
+ this.sequence = sequence;
135
+ this.claimData = claimData;
136
+ this.refundData = refundData;
137
+ this.amount = amount;
138
+ this.feeToken = feeToken;
139
+ this.securityDeposit = securityDeposit;
140
+ this.claimerBounty = claimerBounty;
141
+ this.kind = kind;
142
+ this.extraData = extraData;
143
+ this.successAction = successAction;
144
+ } else {
145
+ this.offerer = offererOrData.offerer;
146
+ this.claimer = offererOrData.claimer;
147
+ this.token = offererOrData.token;
148
+ this.refundHandler = offererOrData.refundHandler;
149
+ this.claimHandler = offererOrData.claimHandler;
150
+ this.payOut = offererOrData.payOut;
151
+ this.payIn = offererOrData.payIn;
152
+ this.reputation = offererOrData.reputation;
153
+ this.sequence = offererOrData.sequence==null ? null : BigInt(offererOrData.sequence);
154
+ this.claimData = offererOrData.claimData;
155
+ this.refundData = offererOrData.refundData;
156
+ this.amount = offererOrData.amount==null ? null : BigInt(offererOrData.amount);
157
+ this.feeToken = offererOrData.feeToken;
158
+ this.securityDeposit = offererOrData.securityDeposit==null ? null : BigInt(offererOrData.securityDeposit);
159
+ this.claimerBounty = offererOrData.claimerBounty==null ? null : BigInt(offererOrData.claimerBounty);
160
+ this.kind = offererOrData.kind;
161
+ this.extraData = offererOrData.extraData;
162
+ this.successAction = offererOrData.successAction==null ? null : {
163
+ executionHash: offererOrData.successAction.executionHash,
164
+ executionExpiry: BigInt(offererOrData.successAction.executionExpiry),
165
+ executionFee: BigInt(offererOrData.successAction.executionFee),
166
+ }
167
+ }
168
+ }
169
+
170
+ getOfferer(): string {
171
+ return this.offerer;
172
+ }
173
+
174
+ setOfferer(newOfferer: string) {
175
+ this.offerer = newOfferer;
176
+ this.payIn = true;
177
+ }
178
+
179
+ getClaimer(): string {
180
+ return this.claimer;
181
+ }
182
+
183
+ setClaimer(newClaimer: string) {
184
+ this.claimer = newClaimer;
185
+ this.payIn = false;
186
+ this.payOut = true;
187
+ this.reputation = false;
188
+ }
189
+
190
+ serialize(): any {
191
+ return {
192
+ type: "strk",
193
+ offerer: this.offerer,
194
+ claimer: this.claimer,
195
+ token: this.token,
196
+ refundHandler: this.refundHandler,
197
+ claimHandler: this.claimHandler,
198
+ payOut: this.payOut,
199
+ payIn: this.payIn,
200
+ reputation: this.reputation,
201
+ sequence: this.sequence==null ? null : this.sequence.toString(10),
202
+ claimData: this.claimData,
203
+ refundData: this.refundData,
204
+ amount: this.amount==null ? null : this.amount.toString(10),
205
+ feeToken: this.feeToken,
206
+ securityDeposit: this.securityDeposit==null ? null : this.securityDeposit.toString(10),
207
+ claimerBounty: this.claimerBounty==null ? null : this.claimerBounty.toString(10),
208
+ kind: this.kind,
209
+ extraData: this.extraData,
210
+ successAction: this.successAction==null ? null : {
211
+ executionHash: this.successAction.executionHash,
212
+ executionExpiry: this.successAction.executionExpiry.toString(10),
213
+ executionFee: this.successAction.executionFee.toString(10)
214
+ }
215
+ }
216
+ }
217
+
218
+ getAmount(): bigint {
219
+ return this.amount;
220
+ }
221
+
222
+ getToken(): string {
223
+ return this.token;
224
+ }
225
+
226
+ isToken(token: string): boolean {
227
+ return this.token.toLowerCase()===token.toLowerCase();
228
+ }
229
+
230
+ getType(): ChainSwapType {
231
+ return this.kind;
232
+ }
233
+
234
+ getExpiry(): bigint {
235
+ return TimelockRefundHandler.getExpiry(this);
236
+ }
237
+
238
+ isPayIn(): boolean {
239
+ return this.payIn;
240
+ }
241
+
242
+ isPayOut(): boolean {
243
+ return this.payOut;
244
+ }
245
+
246
+ getEscrowHash(): string {
247
+ const amountValue = cairo.uint256("0x"+this.amount.toString(16));
248
+ const securityDepositValue = cairo.uint256("0x"+this.securityDeposit.toString(16));
249
+ const claimerBountyValue = cairo.uint256("0x"+this.claimerBounty.toString(16));
250
+ const elements = [
251
+ this.offerer,
252
+ this.claimer,
253
+ this.token,
254
+ this.refundHandler,
255
+ this.claimHandler,
256
+ this.getFlags(),
257
+ this.claimData,
258
+ this.refundData,
259
+ amountValue.low,
260
+ amountValue.high,
261
+ this.feeToken,
262
+ securityDepositValue.low,
263
+ securityDepositValue.high,
264
+ claimerBountyValue.low,
265
+ claimerBountyValue.high
266
+ ];
267
+ if(this.successAction!=null) {
268
+ elements.push(this.successAction.executionHash);
269
+ elements.push(this.successAction.executionExpiry);
270
+ const feeValue = cairo.uint256("0x"+this.successAction.executionFee.toString(16));
271
+ elements.push(feeValue.low, feeValue.high);
272
+ }
273
+
274
+ let escrowHash = hash.computePoseidonHashOnElements(elements);
275
+ if(escrowHash.startsWith("0x")) escrowHash = escrowHash.slice(2);
276
+ return escrowHash.padStart(64, "0");
277
+ }
278
+
279
+ getClaimHash(): string {
280
+ let hash = this.claimData;
281
+ if(hash.startsWith("0x")) hash = hash.slice(2);
282
+ return hash.padStart(64, "0");
283
+ }
284
+
285
+ getSequence(): bigint {
286
+ return this.sequence;
287
+ }
288
+
289
+ getConfirmationsHint(): number {
290
+ if(this.extraData==null) return null;
291
+ if(this.extraData.length!=84) return null;
292
+ return parseInt(this.extraData.slice(80), 16);
293
+ }
294
+
295
+ getNonceHint(): bigint {
296
+ if(this.extraData==null) return null;
297
+ if(this.extraData.length!=84) return null;
298
+ return BigInt("0x"+this.extraData.slice(64, 80));
299
+ }
300
+
301
+ getTxoHashHint(): string {
302
+ if(this.extraData==null) return null;
303
+ if(this.extraData.length!=84) return null;
304
+ return this.extraData.slice(0, 64);
305
+ }
306
+
307
+ getExtraData(): string {
308
+ return this.extraData;
309
+ }
310
+
311
+ setExtraData(extraData: string): void {
312
+ this.extraData = extraData;
313
+ }
314
+
315
+ getSecurityDeposit() {
316
+ return this.securityDeposit;
317
+ }
318
+
319
+ getClaimerBounty() {
320
+ return this.claimerBounty;
321
+ }
322
+
323
+ getTotalDeposit() {
324
+ return this.claimerBounty < this.securityDeposit ? this.securityDeposit : this.claimerBounty;
325
+ }
326
+
327
+ getDepositToken() {
328
+ return this.feeToken;
329
+ }
330
+
331
+ isDepositToken(token: string): boolean {
332
+ if(!token.startsWith("0x")) token = "0x"+token;
333
+ return toHex(this.feeToken)===toHex(token);
334
+ }
335
+
336
+ isClaimer(address: string) {
337
+ if(!address.startsWith("0x")) address = "0x"+address;
338
+ return toHex(this.claimer)===toHex(address);
339
+ }
340
+
341
+ isOfferer(address: string) {
342
+ if(!address.startsWith("0x")) address = "0x"+address;
343
+ return toHex(this.offerer)===toHex(address);
344
+ }
345
+
346
+ isRefundHandler(address: string): boolean {
347
+ if(!address.startsWith("0x")) address = "0x"+address;
348
+ return toHex(this.refundHandler)===toHex(address);
349
+ }
350
+
351
+ isClaimHandler(address: string): boolean {
352
+ if(!address.startsWith("0x")) address = "0x"+address;
353
+ return toHex(this.claimHandler)===toHex(address);
354
+ }
355
+
356
+ isClaimData(data: string): boolean {
357
+ if(!data.startsWith("0x")) data = "0x"+data;
358
+ return toHex(this.claimData)===toHex(data);
359
+ }
360
+
361
+ equals(other: StarknetSwapData): boolean {
362
+ return other.offerer.toLowerCase()===this.offerer.toLowerCase() &&
363
+ other.claimer.toLowerCase()===this.claimer.toLowerCase() &&
364
+ other.token.toLowerCase()===this.token.toLowerCase() &&
365
+ other.refundHandler.toLowerCase()===this.refundHandler.toLowerCase() &&
366
+ other.claimHandler.toLowerCase()===this.claimHandler.toLowerCase() &&
367
+ other.payIn===this.payIn &&
368
+ other.payOut===this.payOut &&
369
+ other.reputation===this.reputation &&
370
+ this.sequence === other.sequence &&
371
+ other.claimData.toLowerCase()===this.claimData.toLowerCase() &&
372
+ other.refundData.toLowerCase()===this.refundData.toLowerCase() &&
373
+ other.amount === this.amount &&
374
+ other.securityDeposit === this.securityDeposit &&
375
+ other.claimerBounty === this.claimerBounty &&
376
+ successActionEquals(other.successAction, this.successAction)
377
+ }
378
+
379
+ toEscrowStruct(): StarknetSwapDataType {
380
+ return {
381
+ offerer: this.offerer,
382
+ claimer: this.claimer,
383
+ token: this.token,
384
+ refund_handler: this.refundHandler,
385
+ claim_handler: this.claimHandler,
386
+ flags: this.getFlags(),
387
+ claim_data: this.claimData,
388
+ refund_data: this.refundData,
389
+ amount: cairo.uint256(toBigInt(this.amount)),
390
+ fee_token: this.feeToken,
391
+ security_deposit: cairo.uint256(toBigInt(this.securityDeposit)),
392
+ claimer_bounty: cairo.uint256(toBigInt(this.claimerBounty)),
393
+ success_action: new CairoOption(
394
+ this.successAction==null ? CairoOptionVariant.None : CairoOptionVariant.Some,
395
+ this.successAction==null ? undefined : {
396
+ hash: this.successAction.executionHash,
397
+ expiry: this.successAction.executionExpiry,
398
+ fee: cairo.uint256(this.successAction.executionFee)
399
+ }
400
+ ) as StarknetSwapDataType["success_action"]
401
+ }
402
+ }
403
+
404
+ static fromSerializedFeltArray(span: BigNumberish[], claimHandlerImpl: IClaimHandler<any, any>) {
405
+ const offerer = toHex(span.shift());
406
+ const claimer = toHex(span.shift());
407
+ const token = toHex(span.shift());
408
+ const refundHandler = toHex(span.shift());
409
+ const claimHandler = toHex(span.shift());
410
+ const {payOut, payIn, reputation, sequence} = StarknetSwapData.toFlags(span.shift());
411
+ const claimData = toHex(span.shift());
412
+ const refundData = toHex(span.shift());
413
+ const amount = toBigInt({low: span.shift(), high: span.shift()});
414
+ const feeToken = toHex(span.shift());
415
+ const securityDeposit = toBigInt({low: span.shift(), high: span.shift()});
416
+ const claimerBounty = toBigInt({low: span.shift(), high: span.shift()});
417
+ const hasSuccessAction = toBigInt(span.shift()) === 0n;
418
+ let successAction: StarknetSuccessAction = null;
419
+ if(hasSuccessAction) {
420
+ successAction = {
421
+ executionHash: toHex(span.shift()),
422
+ executionExpiry: toBigInt(span.shift()),
423
+ executionFee: toBigInt({low: span.shift(), high: span.shift()})
424
+ }
425
+ }
426
+
427
+ return new StarknetSwapData(
428
+ offerer,
429
+ claimer,
430
+ token,
431
+ refundHandler,
432
+ claimHandler,
433
+ payOut,
434
+ payIn,
435
+ reputation,
436
+ sequence,
437
+ claimData,
438
+ refundData,
439
+ amount,
440
+ feeToken,
441
+ securityDeposit,
442
+ claimerBounty,
443
+ claimHandlerImpl.getType(),
444
+ null,
445
+ successAction
446
+ );
447
+ }
448
+
449
+ hasSuccessAction(): boolean {
450
+ return this.successAction != null;
451
+ }
452
+
453
+ }
454
+
455
+ SwapData.deserializers["strk"] = StarknetSwapData;