@atomiqlabs/chain-starknet 2.0.0-beta.8 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 -102
  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 -135
  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 +278 -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,198 +1,198 @@
1
- import {SignatureVerificationError, SwapDataVerificationError} from "@atomiqlabs/base";
2
- import {toHex, tryWithRetries} from "../../../utils/Utils";
3
- import {StarknetSwapModule} from "../StarknetSwapModule";
4
- import {StarknetSwapData} from "../StarknetSwapData";
5
- import {StarknetAction, StarknetGas, sumStarknetGas} from "../../chain/StarknetAction";
6
- import {StarknetSwapContract} from "../StarknetSwapContract";
7
- import {IHandler} from "../handlers/IHandler";
8
- import {BigNumberish} from "starknet";
9
- import {StarknetTx} from "../../chain/modules/StarknetTransactions";
10
- import {StarknetSigner} from "../../wallet/StarknetSigner";
11
- import {StarknetFees} from "../../chain/modules/StarknetFees";
12
-
13
- const Refund = [
14
- { name: 'Swap hash', type: 'felt' },
15
- { name: 'Timeout', type: 'timestamp' }
16
- ];
17
-
18
- export class StarknetSwapRefund extends StarknetSwapModule {
19
-
20
- private static readonly GasCosts = {
21
- REFUND: {l1: 750, l2: 0},
22
- REFUND_PAY_OUT: {l1: 1250, l2: 0}
23
- };
24
-
25
- /**
26
- * Action for generic Refund instruction
27
- *
28
- * @param signer
29
- * @param swapData
30
- * @param witness
31
- * @param handlerGas
32
- * @constructor
33
- * @private
34
- */
35
- private Refund(
36
- signer: string,
37
- swapData: StarknetSwapData,
38
- witness: BigNumberish[],
39
- handlerGas?: StarknetGas
40
- ): StarknetAction {
41
- return new StarknetAction(signer, this.root,
42
- this.swapContract.populateTransaction.refund(swapData.toEscrowStruct(), witness),
43
- sumStarknetGas(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND, handlerGas)
44
- );
45
- }
46
-
47
- /**
48
- * Action for cooperative refunding with signature
49
- *
50
- * @param sender
51
- * @param swapData
52
- * @param timeout
53
- * @param signature
54
- * @constructor
55
- * @private
56
- */
57
- private RefundWithSignature(
58
- sender: string,
59
- swapData: StarknetSwapData,
60
- timeout: string,
61
- signature: BigNumberish[]
62
- ): StarknetAction {
63
- return new StarknetAction(sender, this.root,
64
- this.swapContract.populateTransaction.cooperative_refund(swapData.toEscrowStruct(), signature, BigInt(timeout)),
65
- swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND
66
- );
67
- }
68
-
69
- public async signSwapRefund(
70
- signer: StarknetSigner,
71
- swapData: StarknetSwapData,
72
- authorizationTimeout: number
73
- ): Promise<{ prefix: string; timeout: string; signature: string }> {
74
- const authPrefix = "refund";
75
- const authTimeout = Math.floor(Date.now()/1000)+authorizationTimeout;
76
-
77
- const signature = await this.root.Signatures.signTypedMessage(signer, Refund, "Refund", {
78
- "Swap hash": "0x"+swapData.getEscrowHash(),
79
- "Timeout": toHex(authTimeout)
80
- });
81
-
82
- return {
83
- prefix: authPrefix,
84
- timeout: authTimeout.toString(10),
85
- signature: signature
86
- };
87
- }
88
-
89
- public async isSignatureValid(
90
- swapData: StarknetSwapData,
91
- timeout: string,
92
- prefix: string,
93
- signature: string
94
- ): Promise<null> {
95
- if(prefix!=="refund") throw new SignatureVerificationError("Invalid prefix");
96
-
97
- const expiryTimestamp = BigInt(timeout);
98
- const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
99
-
100
- const isExpired = (expiryTimestamp - currentTimestamp) < BigInt(this.contract.authGracePeriod);
101
- if(isExpired) throw new SignatureVerificationError("Authorization expired!");
102
-
103
- const valid = await this.root.Signatures.isValidSignature(signature, swapData.claimer, Refund, "Refund", {
104
- "Swap hash": "0x"+swapData.getEscrowHash(),
105
- "Timeout": toHex(expiryTimestamp)
106
- });
107
-
108
- if(!valid) {
109
- throw new SignatureVerificationError("Invalid signature!");
110
- }
111
-
112
- return null;
113
- }
114
-
115
- /**
116
- * Creates transactions required for refunding timed out swap
117
- *
118
- * @param signer
119
- * @param swapData swap data to refund
120
- * @param check whether to check if swap is already expired and refundable
121
- * @param feeRate fee rate to be used for the transactions
122
- * @param witnessData
123
- */
124
- public async txsRefund<T>(
125
- signer: string,
126
- swapData: StarknetSwapData,
127
- check?: boolean,
128
- feeRate?: string,
129
- witnessData?: T
130
- ): Promise<StarknetTx[]> {
131
- const refundHandler: IHandler<any, T> = this.contract.refundHandlersByAddress[swapData.refundHandler.toLowerCase()];
132
- if(refundHandler==null) throw new Error("Invalid refund handler");
133
-
134
- if(check && !await tryWithRetries(() => this.contract.isRequestRefundable(swapData.offerer.toString(), swapData), this.retryPolicy)) {
135
- throw new SwapDataVerificationError("Not refundable yet!");
136
- }
137
-
138
- feeRate ??= await this.root.Fees.getFeeRate();
139
-
140
- const {initialTxns, witness} = await refundHandler.getWitness(signer, swapData, witnessData, feeRate);
141
-
142
- const action = this.Refund(signer, swapData, witness, refundHandler.getGas(swapData));
143
- await action.addToTxs(initialTxns, feeRate);
144
-
145
- this.logger.debug("txsRefund(): creating refund transaction, swap: "+swapData.getClaimHash());
146
-
147
- return initialTxns;
148
- }
149
-
150
- /**
151
- * Creates transactions required for refunding the swap with authorization signature, also unwraps WSOL to SOL
152
- *
153
- * @param signer
154
- * @param swapData swap data to refund
155
- * @param timeout signature timeout
156
- * @param prefix signature prefix of the counterparty
157
- * @param signature signature of the counterparty
158
- * @param check whether to check if swap is committed before attempting refund
159
- * @param feeRate fee rate to be used for the transactions
160
- */
161
- public async txsRefundWithAuthorization(
162
- signer: string,
163
- swapData: StarknetSwapData,
164
- timeout: string,
165
- prefix: string,
166
- signature: string,
167
- check?: boolean,
168
- feeRate?: string
169
- ): Promise<StarknetTx[]> {
170
- if(check && !await tryWithRetries(() => this.contract.isCommited(swapData), this.retryPolicy)) {
171
- throw new SwapDataVerificationError("Not correctly committed");
172
- }
173
- await tryWithRetries(
174
- () => this.isSignatureValid(swapData, timeout, prefix, signature),
175
- this.retryPolicy,
176
- (e) => e instanceof SignatureVerificationError
177
- );
178
-
179
- const action = this.RefundWithSignature(signer, swapData, timeout, JSON.parse(signature));
180
-
181
- feeRate ??= await this.root.Fees.getFeeRate();
182
-
183
- this.logger.debug("txsRefundWithAuthorization(): creating refund transaction, swap: "+swapData.getClaimHash()+
184
- " auth expiry: "+timeout+" signature: "+signature);
185
-
186
- return [await action.tx(feeRate)];
187
- }
188
-
189
- /**
190
- * Get the estimated solana transaction fee of the refund transaction, in the worst case scenario in case where the
191
- * ATA needs to be initialized again (i.e. adding the ATA rent exempt lamports to the fee)
192
- */
193
- async getRefundFee(swapData: StarknetSwapData, feeRate?: string): Promise<bigint> {
194
- feeRate ??= await this.root.Fees.getFeeRate();
195
- return StarknetFees.getGasFee(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT.l1 : StarknetSwapRefund.GasCosts.REFUND.l1, feeRate);
196
- }
197
-
1
+ import {SignatureVerificationError, SwapDataVerificationError} from "@atomiqlabs/base";
2
+ import {toHex, tryWithRetries} from "../../../utils/Utils";
3
+ import {StarknetSwapModule} from "../StarknetSwapModule";
4
+ import {StarknetSwapData} from "../StarknetSwapData";
5
+ import {StarknetAction, StarknetGas, sumStarknetGas} from "../../chain/StarknetAction";
6
+ import {StarknetSwapContract} from "../StarknetSwapContract";
7
+ import {IHandler} from "../handlers/IHandler";
8
+ import {BigNumberish} from "starknet";
9
+ import {StarknetTx} from "../../chain/modules/StarknetTransactions";
10
+ import {StarknetSigner} from "../../wallet/StarknetSigner";
11
+ import {StarknetFees} from "../../chain/modules/StarknetFees";
12
+
13
+ const Refund = [
14
+ { name: 'Swap hash', type: 'felt' },
15
+ { name: 'Timeout', type: 'timestamp' }
16
+ ];
17
+
18
+ export class StarknetSwapRefund extends StarknetSwapModule {
19
+
20
+ private static readonly GasCosts = {
21
+ REFUND: {l1: 750, l2: 0},
22
+ REFUND_PAY_OUT: {l1: 1250, l2: 0}
23
+ };
24
+
25
+ /**
26
+ * Action for generic Refund instruction
27
+ *
28
+ * @param signer
29
+ * @param swapData
30
+ * @param witness
31
+ * @param handlerGas
32
+ * @constructor
33
+ * @private
34
+ */
35
+ private Refund(
36
+ signer: string,
37
+ swapData: StarknetSwapData,
38
+ witness: BigNumberish[],
39
+ handlerGas?: StarknetGas
40
+ ): StarknetAction {
41
+ return new StarknetAction(signer, this.root,
42
+ this.swapContract.populateTransaction.refund(swapData.toEscrowStruct(), witness),
43
+ sumStarknetGas(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND, handlerGas)
44
+ );
45
+ }
46
+
47
+ /**
48
+ * Action for cooperative refunding with signature
49
+ *
50
+ * @param sender
51
+ * @param swapData
52
+ * @param timeout
53
+ * @param signature
54
+ * @constructor
55
+ * @private
56
+ */
57
+ private RefundWithSignature(
58
+ sender: string,
59
+ swapData: StarknetSwapData,
60
+ timeout: string,
61
+ signature: BigNumberish[]
62
+ ): StarknetAction {
63
+ return new StarknetAction(sender, this.root,
64
+ this.swapContract.populateTransaction.cooperative_refund(swapData.toEscrowStruct(), signature, BigInt(timeout)),
65
+ swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND
66
+ );
67
+ }
68
+
69
+ public async signSwapRefund(
70
+ signer: StarknetSigner,
71
+ swapData: StarknetSwapData,
72
+ authorizationTimeout: number
73
+ ): Promise<{ prefix: string; timeout: string; signature: string }> {
74
+ const authPrefix = "refund";
75
+ const authTimeout = Math.floor(Date.now()/1000)+authorizationTimeout;
76
+
77
+ const signature = await this.root.Signatures.signTypedMessage(signer, Refund, "Refund", {
78
+ "Swap hash": "0x"+swapData.getEscrowHash(),
79
+ "Timeout": toHex(authTimeout)
80
+ });
81
+
82
+ return {
83
+ prefix: authPrefix,
84
+ timeout: authTimeout.toString(10),
85
+ signature: signature
86
+ };
87
+ }
88
+
89
+ public async isSignatureValid(
90
+ swapData: StarknetSwapData,
91
+ timeout: string,
92
+ prefix: string,
93
+ signature: string
94
+ ): Promise<null> {
95
+ if(prefix!=="refund") throw new SignatureVerificationError("Invalid prefix");
96
+
97
+ const expiryTimestamp = BigInt(timeout);
98
+ const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
99
+
100
+ const isExpired = (expiryTimestamp - currentTimestamp) < BigInt(this.contract.authGracePeriod);
101
+ if(isExpired) throw new SignatureVerificationError("Authorization expired!");
102
+
103
+ const valid = await this.root.Signatures.isValidSignature(signature, swapData.claimer, Refund, "Refund", {
104
+ "Swap hash": "0x"+swapData.getEscrowHash(),
105
+ "Timeout": toHex(expiryTimestamp)
106
+ });
107
+
108
+ if(!valid) {
109
+ throw new SignatureVerificationError("Invalid signature!");
110
+ }
111
+
112
+ return null;
113
+ }
114
+
115
+ /**
116
+ * Creates transactions required for refunding timed out swap
117
+ *
118
+ * @param signer
119
+ * @param swapData swap data to refund
120
+ * @param check whether to check if swap is already expired and refundable
121
+ * @param feeRate fee rate to be used for the transactions
122
+ * @param witnessData
123
+ */
124
+ public async txsRefund<T>(
125
+ signer: string,
126
+ swapData: StarknetSwapData,
127
+ check?: boolean,
128
+ feeRate?: string,
129
+ witnessData?: T
130
+ ): Promise<StarknetTx[]> {
131
+ const refundHandler: IHandler<any, T> = this.contract.refundHandlersByAddress[swapData.refundHandler.toLowerCase()];
132
+ if(refundHandler==null) throw new Error("Invalid refund handler");
133
+
134
+ if(check && !await tryWithRetries(() => this.contract.isRequestRefundable(swapData.offerer.toString(), swapData), this.retryPolicy)) {
135
+ throw new SwapDataVerificationError("Not refundable yet!");
136
+ }
137
+
138
+ feeRate ??= await this.root.Fees.getFeeRate();
139
+
140
+ const {initialTxns, witness} = await refundHandler.getWitness(signer, swapData, witnessData, feeRate);
141
+
142
+ const action = this.Refund(signer, swapData, witness, refundHandler.getGas(swapData));
143
+ await action.addToTxs(initialTxns, feeRate);
144
+
145
+ this.logger.debug("txsRefund(): creating refund transaction, swap: "+swapData.getClaimHash());
146
+
147
+ return initialTxns;
148
+ }
149
+
150
+ /**
151
+ * Creates transactions required for refunding the swap with authorization signature, also unwraps WSOL to SOL
152
+ *
153
+ * @param signer
154
+ * @param swapData swap data to refund
155
+ * @param timeout signature timeout
156
+ * @param prefix signature prefix of the counterparty
157
+ * @param signature signature of the counterparty
158
+ * @param check whether to check if swap is committed before attempting refund
159
+ * @param feeRate fee rate to be used for the transactions
160
+ */
161
+ public async txsRefundWithAuthorization(
162
+ signer: string,
163
+ swapData: StarknetSwapData,
164
+ timeout: string,
165
+ prefix: string,
166
+ signature: string,
167
+ check?: boolean,
168
+ feeRate?: string
169
+ ): Promise<StarknetTx[]> {
170
+ if(check && !await tryWithRetries(() => this.contract.isCommited(swapData), this.retryPolicy)) {
171
+ throw new SwapDataVerificationError("Not correctly committed");
172
+ }
173
+ await tryWithRetries(
174
+ () => this.isSignatureValid(swapData, timeout, prefix, signature),
175
+ this.retryPolicy,
176
+ (e) => e instanceof SignatureVerificationError
177
+ );
178
+
179
+ const action = this.RefundWithSignature(signer, swapData, timeout, JSON.parse(signature));
180
+
181
+ feeRate ??= await this.root.Fees.getFeeRate();
182
+
183
+ this.logger.debug("txsRefundWithAuthorization(): creating refund transaction, swap: "+swapData.getClaimHash()+
184
+ " auth expiry: "+timeout+" signature: "+signature);
185
+
186
+ return [await action.tx(feeRate)];
187
+ }
188
+
189
+ /**
190
+ * Get the estimated solana transaction fee of the refund transaction, in the worst case scenario in case where the
191
+ * ATA needs to be initialized again (i.e. adding the ATA rent exempt lamports to the fee)
192
+ */
193
+ async getRefundFee(swapData: StarknetSwapData, feeRate?: string): Promise<bigint> {
194
+ feeRate ??= await this.root.Fees.getFeeRate();
195
+ return StarknetFees.getGasFee(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT.l1 : StarknetSwapRefund.GasCosts.REFUND.l1, feeRate);
196
+ }
197
+
198
198
  }
@@ -1,39 +1,39 @@
1
- import {Account, CallData, DeployAccountContractPayload, ec, hash, Provider} from "starknet";
2
- import {toHex} from "../../utils/Utils";
3
- import {Buffer} from "buffer";
4
-
5
- const OZaccountClassHash = '0x00261c293c8084cd79086214176b33e5911677cec55104fddc8d25b0b736dcad';
6
-
7
- //Openzeppelin Account wallet
8
- export class StarknetKeypairWallet extends Account {
9
-
10
- public readonly publicKey: string;
11
-
12
- constructor(provider: Provider, privateKey: string) {
13
- const publicKey = ec.starkCurve.getStarkKey(toHex(privateKey));
14
- // Calculate future address of the account
15
- const OZaccountConstructorCallData = CallData.compile({ publicKey });
16
- const OZcontractAddress = hash.calculateContractAddressFromHash(
17
- publicKey,
18
- OZaccountClassHash,
19
- OZaccountConstructorCallData,
20
- 0
21
- );
22
- super(provider, OZcontractAddress, privateKey, "1");
23
- this.publicKey = publicKey;
24
- }
25
-
26
- public getDeploymentData(): DeployAccountContractPayload {
27
- return {
28
- classHash: OZaccountClassHash,
29
- constructorCalldata: CallData.compile({ publicKey: this.publicKey }),
30
- addressSalt: this.publicKey,
31
- contractAddress: this.address
32
- }
33
- }
34
-
35
- public static generateRandomPrivateKey(): string {
36
- return "0x"+Buffer.from(ec.starkCurve.utils.randomPrivateKey()).toString("hex");
37
- }
38
-
39
- }
1
+ import {Account, CallData, DeployAccountContractPayload, ec, hash, Provider} from "starknet";
2
+ import {toHex} from "../../utils/Utils";
3
+ import {Buffer} from "buffer";
4
+
5
+ const OZaccountClassHash = '0x00261c293c8084cd79086214176b33e5911677cec55104fddc8d25b0b736dcad';
6
+
7
+ //Openzeppelin Account wallet
8
+ export class StarknetKeypairWallet extends Account {
9
+
10
+ public readonly publicKey: string;
11
+
12
+ constructor(provider: Provider, privateKey: string) {
13
+ const publicKey = ec.starkCurve.getStarkKey(toHex(privateKey));
14
+ // Calculate future address of the account
15
+ const OZaccountConstructorCallData = CallData.compile({ publicKey });
16
+ const OZcontractAddress = hash.calculateContractAddressFromHash(
17
+ publicKey,
18
+ OZaccountClassHash,
19
+ OZaccountConstructorCallData,
20
+ 0
21
+ );
22
+ super(provider, OZcontractAddress, privateKey, "1");
23
+ this.publicKey = publicKey;
24
+ }
25
+
26
+ public getDeploymentData(): DeployAccountContractPayload {
27
+ return {
28
+ classHash: OZaccountClassHash,
29
+ constructorCalldata: CallData.compile({ publicKey: this.publicKey }),
30
+ addressSalt: this.publicKey,
31
+ contractAddress: this.address
32
+ }
33
+ }
34
+
35
+ public static generateRandomPrivateKey(): string {
36
+ return "0x"+Buffer.from(ec.starkCurve.utils.randomPrivateKey()).toString("hex");
37
+ }
38
+
39
+ }
@@ -1,55 +1,55 @@
1
- import {AbstractSigner} from "@atomiqlabs/base";
2
- import {Account, DeployAccountContractPayload} from "starknet";
3
- import {toHex} from "../../utils/Utils";
4
-
5
- export class StarknetSigner implements AbstractSigner {
6
-
7
- account: Account;
8
-
9
- isDeployed: boolean = null;
10
-
11
- constructor(account: Account) {
12
- this.account = account;
13
- }
14
-
15
- getPublicKey(): Promise<string> {
16
- return this.account.signer.getPubKey();
17
- }
18
-
19
- getAddress(): string {
20
- return toHex(this.account.address);
21
- }
22
-
23
- isWalletAccount() {
24
- return (this.account as any).walletProvider!=null;
25
- }
26
-
27
- //TODO: Introduce proper nonce management!
28
- async getNonce(): Promise<bigint> {
29
- try {
30
- return BigInt(await this.account.getNonceForAddress(this.getAddress(), "pending"));
31
- } catch (e) {
32
- if(e.message!=null && e.message.includes("20: Contract not found")) {
33
- return BigInt(0);
34
- }
35
- throw e;
36
- }
37
- }
38
-
39
- async checkAndGetDeployPayload(nonce?: bigint): Promise<DeployAccountContractPayload | null> {
40
- if(this.isDeployed) return null;
41
-
42
- const _account: Account & {getDeploymentData?: () => DeployAccountContractPayload} = this.account;
43
- if(_account.getDeploymentData!=null) {
44
- //Check if deployed
45
- nonce ??= BigInt(await this.getNonce());
46
- this.isDeployed = nonce!=BigInt(0);
47
- if(!this.isDeployed ) {
48
- return _account.getDeploymentData();
49
- }
50
- }
51
-
52
- return null;
53
- }
54
-
55
- }
1
+ import {AbstractSigner} from "@atomiqlabs/base";
2
+ import {Account, DeployAccountContractPayload} from "starknet";
3
+ import {toHex} from "../../utils/Utils";
4
+
5
+ export class StarknetSigner implements AbstractSigner {
6
+
7
+ account: Account;
8
+
9
+ isDeployed: boolean = null;
10
+
11
+ constructor(account: Account) {
12
+ this.account = account;
13
+ }
14
+
15
+ getPublicKey(): Promise<string> {
16
+ return this.account.signer.getPubKey();
17
+ }
18
+
19
+ getAddress(): string {
20
+ return toHex(this.account.address);
21
+ }
22
+
23
+ isWalletAccount() {
24
+ return (this.account as any).walletProvider!=null;
25
+ }
26
+
27
+ //TODO: Introduce proper nonce management!
28
+ async getNonce(): Promise<bigint> {
29
+ try {
30
+ return BigInt(await this.account.getNonceForAddress(this.getAddress(), "pending"));
31
+ } catch (e) {
32
+ if(e.message!=null && e.message.includes("20: Contract not found")) {
33
+ return BigInt(0);
34
+ }
35
+ throw e;
36
+ }
37
+ }
38
+
39
+ async checkAndGetDeployPayload(nonce?: bigint): Promise<DeployAccountContractPayload | null> {
40
+ if(this.isDeployed) return null;
41
+
42
+ const _account: Account & {getDeploymentData?: () => DeployAccountContractPayload} = this.account;
43
+ if(_account.getDeploymentData!=null) {
44
+ //Check if deployed
45
+ nonce ??= BigInt(await this.getNonce());
46
+ this.isDeployed = nonce!=BigInt(0);
47
+ if(!this.isDeployed ) {
48
+ return _account.getDeploymentData();
49
+ }
50
+ }
51
+
52
+ return null;
53
+ }
54
+
55
+ }