@atomiqlabs/chain-starknet 2.0.0 → 2.0.1

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 +19 -19
  7. package/dist/starknet/StarknetInitializer.js +64 -64
  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 +27 -27
  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 +19 -19
  29. package/dist/starknet/chain/modules/StarknetBlocks.js +49 -49
  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 +55 -55
  33. package/dist/starknet/chain/modules/StarknetFees.js +100 -100
  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 +67 -67
  37. package/dist/starknet/chain/modules/StarknetTokens.js +98 -98
  38. package/dist/starknet/chain/modules/StarknetTransactions.d.ts +93 -93
  39. package/dist/starknet/chain/modules/StarknetTransactions.js +255 -255
  40. package/dist/starknet/contract/StarknetContractBase.d.ts +13 -13
  41. package/dist/starknet/contract/StarknetContractBase.js +16 -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 +91 -91
  49. package/dist/starknet/events/StarknetChainEventsBrowser.js +294 -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 +65 -65
  55. package/dist/starknet/spv_swap/StarknetSpvVaultContract.js +376 -376
  56. package/dist/starknet/spv_swap/StarknetSpvVaultData.d.ts +49 -49
  57. package/dist/starknet/spv_swap/StarknetSpvVaultData.js +144 -144
  58. package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.d.ts +24 -24
  59. package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.js +61 -61
  60. package/dist/starknet/swaps/EscrowManagerAbi.d.ts +405 -405
  61. package/dist/starknet/swaps/EscrowManagerAbi.js +547 -547
  62. package/dist/starknet/swaps/StarknetSwapContract.d.ts +196 -196
  63. package/dist/starknet/swaps/StarknetSwapContract.js +395 -395
  64. package/dist/starknet/swaps/StarknetSwapData.d.ts +67 -67
  65. package/dist/starknet/swaps/StarknetSwapData.js +281 -281
  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 +84 -84
  89. package/dist/starknet/swaps/modules/StarknetSwapInit.js +164 -164
  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 +30 -30
  94. package/dist/starknet/wallet/StarknetSigner.d.ts +12 -12
  95. package/dist/starknet/wallet/StarknetSigner.js +46 -46
  96. package/dist/utils/Utils.d.ts +37 -37
  97. package/dist/utils/Utils.js +257 -257
  98. package/package.json +37 -37
  99. package/src/index.ts +47 -47
  100. package/src/starknet/StarknetChainType.ts +28 -28
  101. package/src/starknet/StarknetInitializer.ts +95 -95
  102. package/src/starknet/btcrelay/BtcRelayAbi.ts +338 -338
  103. package/src/starknet/btcrelay/StarknetBtcRelay.ts +491 -491
  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 +90 -90
  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 +58 -58
  113. package/src/starknet/chain/modules/StarknetEvents.ts +104 -104
  114. package/src/starknet/chain/modules/StarknetFees.ts +132 -132
  115. package/src/starknet/chain/modules/StarknetSignatures.ts +90 -90
  116. package/src/starknet/chain/modules/StarknetTokens.ts +116 -116
  117. package/src/starknet/chain/modules/StarknetTransactions.ts +277 -278
  118. package/src/starknet/contract/StarknetContractBase.ts +26 -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 +412 -412
  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 +477 -477
  126. package/src/starknet/spv_swap/StarknetSpvVaultData.ts +194 -194
  127. package/src/starknet/spv_swap/StarknetSpvWithdrawalData.ts +68 -68
  128. package/src/starknet/swaps/EscrowManagerAbi.ts +546 -546
  129. package/src/starknet/swaps/StarknetSwapContract.ts +605 -605
  130. package/src/starknet/swaps/StarknetSwapData.ts +394 -394
  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 +225 -225
  143. package/src/starknet/swaps/modules/StarknetSwapRefund.ts +197 -197
  144. package/src/starknet/wallet/StarknetKeypairWallet.ts +39 -39
  145. package/src/starknet/wallet/StarknetSigner.ts +55 -55
  146. package/src/utils/Utils.ts +248 -248
@@ -1,226 +1,226 @@
1
- import {SignatureVerificationError, SwapCommitStatus, SwapDataVerificationError} from "@atomiqlabs/base";
2
- import {bufferToBytes31Span, toBigInt, toHex, tryWithRetries} from "../../../utils/Utils";
3
- import {Buffer} from "buffer";
4
- import {StarknetSwapData} from "../StarknetSwapData";
5
- import {StarknetAction} from "../../chain/StarknetAction";
6
- import {StarknetSwapModule} from "../StarknetSwapModule";
7
- import {BigNumberish} from "starknet";
8
- import {StarknetSigner} from "../../wallet/StarknetSigner";
9
- import {StarknetFees} from "../../chain/modules/StarknetFees";
10
- import {StarknetTx} from "../../chain/modules/StarknetTransactions";
11
-
12
- export type StarknetPreFetchVerification = {
13
- pendingBlockTime?: number
14
- };
15
-
16
- const Initialize = [
17
- { name: 'Swap hash', type: 'felt' },
18
- { name: 'Timeout', type: 'timestamp' }
19
- ];
20
-
21
- export class StarknetSwapInit extends StarknetSwapModule {
22
-
23
- private static readonly GasCosts = {
24
- INIT: {l1: 500, l2: 0},
25
- INIT_PAY_IN: {l1: 1000, l2: 0},
26
- };
27
-
28
- /**
29
- * bare Init action based on the data passed in swapData
30
- *
31
- * @param swapData
32
- * @param timeout
33
- * @param signature
34
- * @private
35
- */
36
- private Init(swapData: StarknetSwapData, timeout: bigint, signature: BigNumberish[]): StarknetAction {
37
- return new StarknetAction(
38
- swapData.payIn ? swapData.offerer : swapData.claimer,
39
- this.root,
40
- this.swapContract.populateTransaction.initialize(
41
- swapData.toEscrowStruct(),
42
- signature,
43
- timeout,
44
- swapData.extraData==null || swapData.extraData==="" ? [] : bufferToBytes31Span(Buffer.from(swapData.extraData, "hex")).map(toHex)
45
- ),
46
- swapData.payIn ? StarknetSwapInit.GasCosts.INIT_PAY_IN : StarknetSwapInit.GasCosts.INIT
47
- )
48
- }
49
-
50
- /**
51
- * Returns auth prefix to be used with a specific swap, payIn=true & payIn=false use different prefixes (these
52
- * actually have no meaning for the smart contract/solana program in the Solana case)
53
- *
54
- * @param swapData
55
- * @private
56
- */
57
- private getAuthPrefix(swapData: StarknetSwapData): string {
58
- return swapData.isPayIn() ? "claim_initialize" : "initialize";
59
- }
60
-
61
- public async preFetchForInitSignatureVerification(): Promise<StarknetPreFetchVerification> {
62
- return {
63
- pendingBlockTime: await this.root.Blocks.getBlockTime("pending")
64
- };
65
- }
66
-
67
- /**
68
- * Signs swap initialization authorization, using data from preFetchedBlockData if provided & still valid (subject
69
- * to SIGNATURE_PREFETCH_DATA_VALIDITY)
70
- *
71
- * @param signer
72
- * @param swapData
73
- * @param authorizationTimeout
74
- * @public
75
- */
76
- public async signSwapInitialization(
77
- signer: StarknetSigner,
78
- swapData: StarknetSwapData,
79
- authorizationTimeout: number
80
- ): Promise<{prefix: string, timeout: string, signature: string}> {
81
- const authTimeout = Math.floor(Date.now()/1000)+authorizationTimeout;
82
-
83
- const signature = await this.root.Signatures.signTypedMessage(signer, Initialize, "Initialize", {
84
- "Swap hash": "0x"+swapData.getEscrowHash(),
85
- "Timeout": toHex(authTimeout)
86
- });
87
-
88
- return {
89
- prefix: this.getAuthPrefix(swapData),
90
- timeout: authTimeout.toString(10),
91
- signature
92
- };
93
- }
94
-
95
- /**
96
- * Checks whether the provided signature data is valid, using preFetchedData if provided and still valid
97
- *
98
- * @param swapData
99
- * @param timeout
100
- * @param prefix
101
- * @param signature
102
- * @param preFetchData
103
- * @public
104
- */
105
- public async isSignatureValid(
106
- swapData: StarknetSwapData,
107
- timeout: string,
108
- prefix: string,
109
- signature: string,
110
- preFetchData?: StarknetPreFetchVerification
111
- ): Promise<null> {
112
- const sender = swapData.isPayIn() ? swapData.offerer : swapData.claimer;
113
- const signer = swapData.isPayIn() ? swapData.claimer : swapData.offerer;
114
-
115
- if(!swapData.isPayIn() && await this.contract.isExpired(sender.toString(), swapData)) {
116
- throw new SignatureVerificationError("Swap will expire too soon!");
117
- }
118
-
119
- if(prefix!==this.getAuthPrefix(swapData)) throw new SignatureVerificationError("Invalid prefix");
120
-
121
- const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
122
- const timeoutBN = BigInt(timeout);
123
- const isExpired = (timeoutBN - currentTimestamp) < BigInt(this.contract.authGracePeriod);
124
- if (isExpired) throw new SignatureVerificationError("Authorization expired!");
125
- if(await this.isSignatureExpired(timeout, preFetchData)) throw new SignatureVerificationError("Authorization expired!");
126
-
127
- const valid = await this.root.Signatures.isValidSignature(signature, signer, Initialize, "Initialize", {
128
- "Swap hash": "0x"+swapData.getEscrowHash(),
129
- "Timeout": toHex(timeoutBN)
130
- });
131
-
132
- if(!valid) throw new SignatureVerificationError("Invalid signature!");
133
-
134
- return null;
135
- }
136
-
137
- /**
138
- * Gets expiry of the provided signature data, this is a minimum of slot expiry & swap signature expiry
139
- *
140
- * @param timeout
141
- * @public
142
- */
143
- public async getSignatureExpiry(
144
- timeout: string
145
- ): Promise<number> {
146
- const now = Date.now();
147
- const timeoutExpiryTime = (parseInt(timeout)-this.contract.authGracePeriod)*1000;
148
-
149
- if(timeoutExpiryTime<now) return 0;
150
-
151
- return timeoutExpiryTime;
152
- }
153
-
154
- /**
155
- * Checks whether signature is expired for good, compares the timestamp to the current "pending" block timestamp
156
- *
157
- * @param timeout
158
- * @param preFetchData
159
- * @public
160
- */
161
- public async isSignatureExpired(
162
- timeout: string,
163
- preFetchData?: StarknetPreFetchVerification
164
- ): Promise<boolean> {
165
- if(preFetchData==null || preFetchData.pendingBlockTime==null) {
166
- preFetchData = await this.preFetchForInitSignatureVerification();
167
- }
168
- return preFetchData.pendingBlockTime > parseInt(timeout);
169
- }
170
-
171
- /**
172
- * Creates init transaction with a valid signature from an LP
173
- *
174
- * @param swapData swap to initialize
175
- * @param timeout init signature timeout
176
- * @param prefix init signature prefix
177
- * @param signature init signature
178
- * @param skipChecks whether to skip signature validity checks
179
- * @param feeRate fee rate to use for the transaction
180
- */
181
- public async txsInit(
182
- swapData: StarknetSwapData,
183
- timeout: string,
184
- prefix: string,
185
- signature: string,
186
- skipChecks?: boolean,
187
- feeRate?: string
188
- ): Promise<StarknetTx[]> {
189
- const sender = swapData.isPayIn() ? swapData.offerer : swapData.claimer;
190
-
191
- if(!skipChecks) {
192
- const [_, payStatus] = await Promise.all([
193
- tryWithRetries(
194
- () => this.isSignatureValid(swapData, timeout, prefix, signature),
195
- this.retryPolicy, (e) => e instanceof SignatureVerificationError
196
- ),
197
- tryWithRetries(() => this.contract.getCommitStatus(sender, swapData), this.retryPolicy)
198
- ]);
199
- if(payStatus!==SwapCommitStatus.NOT_COMMITED) throw new SwapDataVerificationError("Invoice already being paid for or paid");
200
- }
201
-
202
- feeRate ??= await this.root.Fees.getFeeRate();
203
-
204
- const initAction = this.Init(swapData, BigInt(timeout), JSON.parse(signature));
205
- if(swapData.payIn) initAction.addAction(
206
- this.root.Tokens.Approve(sender, this.swapContract.address, swapData.token, swapData.amount), 0
207
- ); //Add erc20 approve
208
- if(swapData.getTotalDeposit() !== 0n) initAction.addAction(
209
- this.root.Tokens.Approve(sender, this.swapContract.address, swapData.feeToken, swapData.getTotalDeposit()), 0
210
- ); //Add deposit erc20 approve
211
-
212
- this.logger.debug("txsInitPayIn(): create swap init TX, swap: "+swapData.getClaimHash()+
213
- " feerate: "+feeRate);
214
-
215
- return [await initAction.tx(feeRate)];
216
- }
217
-
218
- /**
219
- * Get the estimated solana fee of the init transaction, this includes the required deposit for creating swap PDA
220
- * and also deposit for ATAs
221
- */
222
- async getInitFee(swapData?: StarknetSwapData, feeRate?: string): Promise<bigint> {
223
- feeRate ??= await this.root.Fees.getFeeRate();
224
- return StarknetFees.getGasFee(swapData.payIn ? StarknetSwapInit.GasCosts.INIT_PAY_IN.l1 : StarknetSwapInit.GasCosts.INIT.l1, feeRate);
225
- }
1
+ import {SignatureVerificationError, SwapCommitStatus, SwapDataVerificationError} from "@atomiqlabs/base";
2
+ import {bufferToBytes31Span, toBigInt, toHex, tryWithRetries} from "../../../utils/Utils";
3
+ import {Buffer} from "buffer";
4
+ import {StarknetSwapData} from "../StarknetSwapData";
5
+ import {StarknetAction} from "../../chain/StarknetAction";
6
+ import {StarknetSwapModule} from "../StarknetSwapModule";
7
+ import {BigNumberish} from "starknet";
8
+ import {StarknetSigner} from "../../wallet/StarknetSigner";
9
+ import {StarknetFees} from "../../chain/modules/StarknetFees";
10
+ import {StarknetTx} from "../../chain/modules/StarknetTransactions";
11
+
12
+ export type StarknetPreFetchVerification = {
13
+ pendingBlockTime?: number
14
+ };
15
+
16
+ const Initialize = [
17
+ { name: 'Swap hash', type: 'felt' },
18
+ { name: 'Timeout', type: 'timestamp' }
19
+ ];
20
+
21
+ export class StarknetSwapInit extends StarknetSwapModule {
22
+
23
+ private static readonly GasCosts = {
24
+ INIT: {l1: 500, l2: 0},
25
+ INIT_PAY_IN: {l1: 1000, l2: 0},
26
+ };
27
+
28
+ /**
29
+ * bare Init action based on the data passed in swapData
30
+ *
31
+ * @param swapData
32
+ * @param timeout
33
+ * @param signature
34
+ * @private
35
+ */
36
+ private Init(swapData: StarknetSwapData, timeout: bigint, signature: BigNumberish[]): StarknetAction {
37
+ return new StarknetAction(
38
+ swapData.payIn ? swapData.offerer : swapData.claimer,
39
+ this.root,
40
+ this.swapContract.populateTransaction.initialize(
41
+ swapData.toEscrowStruct(),
42
+ signature,
43
+ timeout,
44
+ swapData.extraData==null || swapData.extraData==="" ? [] : bufferToBytes31Span(Buffer.from(swapData.extraData, "hex")).map(toHex)
45
+ ),
46
+ swapData.payIn ? StarknetSwapInit.GasCosts.INIT_PAY_IN : StarknetSwapInit.GasCosts.INIT
47
+ )
48
+ }
49
+
50
+ /**
51
+ * Returns auth prefix to be used with a specific swap, payIn=true & payIn=false use different prefixes (these
52
+ * actually have no meaning for the smart contract/solana program in the Solana case)
53
+ *
54
+ * @param swapData
55
+ * @private
56
+ */
57
+ private getAuthPrefix(swapData: StarknetSwapData): string {
58
+ return swapData.isPayIn() ? "claim_initialize" : "initialize";
59
+ }
60
+
61
+ public async preFetchForInitSignatureVerification(): Promise<StarknetPreFetchVerification> {
62
+ return {
63
+ pendingBlockTime: await this.root.Blocks.getBlockTime("pending")
64
+ };
65
+ }
66
+
67
+ /**
68
+ * Signs swap initialization authorization, using data from preFetchedBlockData if provided & still valid (subject
69
+ * to SIGNATURE_PREFETCH_DATA_VALIDITY)
70
+ *
71
+ * @param signer
72
+ * @param swapData
73
+ * @param authorizationTimeout
74
+ * @public
75
+ */
76
+ public async signSwapInitialization(
77
+ signer: StarknetSigner,
78
+ swapData: StarknetSwapData,
79
+ authorizationTimeout: number
80
+ ): Promise<{prefix: string, timeout: string, signature: string}> {
81
+ const authTimeout = Math.floor(Date.now()/1000)+authorizationTimeout;
82
+
83
+ const signature = await this.root.Signatures.signTypedMessage(signer, Initialize, "Initialize", {
84
+ "Swap hash": "0x"+swapData.getEscrowHash(),
85
+ "Timeout": toHex(authTimeout)
86
+ });
87
+
88
+ return {
89
+ prefix: this.getAuthPrefix(swapData),
90
+ timeout: authTimeout.toString(10),
91
+ signature
92
+ };
93
+ }
94
+
95
+ /**
96
+ * Checks whether the provided signature data is valid, using preFetchedData if provided and still valid
97
+ *
98
+ * @param swapData
99
+ * @param timeout
100
+ * @param prefix
101
+ * @param signature
102
+ * @param preFetchData
103
+ * @public
104
+ */
105
+ public async isSignatureValid(
106
+ swapData: StarknetSwapData,
107
+ timeout: string,
108
+ prefix: string,
109
+ signature: string,
110
+ preFetchData?: StarknetPreFetchVerification
111
+ ): Promise<null> {
112
+ const sender = swapData.isPayIn() ? swapData.offerer : swapData.claimer;
113
+ const signer = swapData.isPayIn() ? swapData.claimer : swapData.offerer;
114
+
115
+ if(!swapData.isPayIn() && await this.contract.isExpired(sender.toString(), swapData)) {
116
+ throw new SignatureVerificationError("Swap will expire too soon!");
117
+ }
118
+
119
+ if(prefix!==this.getAuthPrefix(swapData)) throw new SignatureVerificationError("Invalid prefix");
120
+
121
+ const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
122
+ const timeoutBN = BigInt(timeout);
123
+ const isExpired = (timeoutBN - currentTimestamp) < BigInt(this.contract.authGracePeriod);
124
+ if (isExpired) throw new SignatureVerificationError("Authorization expired!");
125
+ if(await this.isSignatureExpired(timeout, preFetchData)) throw new SignatureVerificationError("Authorization expired!");
126
+
127
+ const valid = await this.root.Signatures.isValidSignature(signature, signer, Initialize, "Initialize", {
128
+ "Swap hash": "0x"+swapData.getEscrowHash(),
129
+ "Timeout": toHex(timeoutBN)
130
+ });
131
+
132
+ if(!valid) throw new SignatureVerificationError("Invalid signature!");
133
+
134
+ return null;
135
+ }
136
+
137
+ /**
138
+ * Gets expiry of the provided signature data, this is a minimum of slot expiry & swap signature expiry
139
+ *
140
+ * @param timeout
141
+ * @public
142
+ */
143
+ public async getSignatureExpiry(
144
+ timeout: string
145
+ ): Promise<number> {
146
+ const now = Date.now();
147
+ const timeoutExpiryTime = (parseInt(timeout)-this.contract.authGracePeriod)*1000;
148
+
149
+ if(timeoutExpiryTime<now) return 0;
150
+
151
+ return timeoutExpiryTime;
152
+ }
153
+
154
+ /**
155
+ * Checks whether signature is expired for good, compares the timestamp to the current "pending" block timestamp
156
+ *
157
+ * @param timeout
158
+ * @param preFetchData
159
+ * @public
160
+ */
161
+ public async isSignatureExpired(
162
+ timeout: string,
163
+ preFetchData?: StarknetPreFetchVerification
164
+ ): Promise<boolean> {
165
+ if(preFetchData==null || preFetchData.pendingBlockTime==null) {
166
+ preFetchData = await this.preFetchForInitSignatureVerification();
167
+ }
168
+ return preFetchData.pendingBlockTime > parseInt(timeout);
169
+ }
170
+
171
+ /**
172
+ * Creates init transaction with a valid signature from an LP
173
+ *
174
+ * @param swapData swap to initialize
175
+ * @param timeout init signature timeout
176
+ * @param prefix init signature prefix
177
+ * @param signature init signature
178
+ * @param skipChecks whether to skip signature validity checks
179
+ * @param feeRate fee rate to use for the transaction
180
+ */
181
+ public async txsInit(
182
+ swapData: StarknetSwapData,
183
+ timeout: string,
184
+ prefix: string,
185
+ signature: string,
186
+ skipChecks?: boolean,
187
+ feeRate?: string
188
+ ): Promise<StarknetTx[]> {
189
+ const sender = swapData.isPayIn() ? swapData.offerer : swapData.claimer;
190
+
191
+ if(!skipChecks) {
192
+ const [_, payStatus] = await Promise.all([
193
+ tryWithRetries(
194
+ () => this.isSignatureValid(swapData, timeout, prefix, signature),
195
+ this.retryPolicy, (e) => e instanceof SignatureVerificationError
196
+ ),
197
+ tryWithRetries(() => this.contract.getCommitStatus(sender, swapData), this.retryPolicy)
198
+ ]);
199
+ if(payStatus!==SwapCommitStatus.NOT_COMMITED) throw new SwapDataVerificationError("Invoice already being paid for or paid");
200
+ }
201
+
202
+ feeRate ??= await this.root.Fees.getFeeRate();
203
+
204
+ const initAction = this.Init(swapData, BigInt(timeout), JSON.parse(signature));
205
+ if(swapData.payIn) initAction.addAction(
206
+ this.root.Tokens.Approve(sender, this.swapContract.address, swapData.token, swapData.amount), 0
207
+ ); //Add erc20 approve
208
+ if(swapData.getTotalDeposit() !== 0n) initAction.addAction(
209
+ this.root.Tokens.Approve(sender, this.swapContract.address, swapData.feeToken, swapData.getTotalDeposit()), 0
210
+ ); //Add deposit erc20 approve
211
+
212
+ this.logger.debug("txsInitPayIn(): create swap init TX, swap: "+swapData.getClaimHash()+
213
+ " feerate: "+feeRate);
214
+
215
+ return [await initAction.tx(feeRate)];
216
+ }
217
+
218
+ /**
219
+ * Get the estimated solana fee of the init transaction, this includes the required deposit for creating swap PDA
220
+ * and also deposit for ATAs
221
+ */
222
+ async getInitFee(swapData?: StarknetSwapData, feeRate?: string): Promise<bigint> {
223
+ feeRate ??= await this.root.Fees.getFeeRate();
224
+ return StarknetFees.getGasFee(swapData.payIn ? StarknetSwapInit.GasCosts.INIT_PAY_IN.l1 : StarknetSwapInit.GasCosts.INIT.l1, feeRate);
225
+ }
226
226
  }