@atomiqlabs/chain-starknet 4.0.0-dev.3 → 4.0.0-dev.30

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 (154) hide show
  1. package/LICENSE +201 -201
  2. package/dist/index.d.ts +39 -38
  3. package/dist/index.js +55 -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 +28 -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 +54 -52
  19. package/dist/starknet/chain/StarknetChainInterface.js +97 -91
  20. package/dist/starknet/chain/StarknetModule.d.ts +9 -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 +82 -77
  33. package/dist/starknet/chain/modules/StarknetFees.js +121 -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 +111 -93
  39. package/dist/starknet/chain/modules/StarknetTransactions.js +381 -255
  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 +84 -90
  49. package/dist/starknet/events/StarknetChainEventsBrowser.js +307 -292
  50. package/dist/starknet/provider/RpcProviderWithRetries.d.ts +41 -21
  51. package/dist/starknet/provider/RpcProviderWithRetries.js +70 -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 +89 -66
  55. package/dist/starknet/spv_swap/StarknetSpvVaultContract.js +477 -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 -434
  61. package/dist/starknet/swaps/EscrowManagerAbi.js +583 -587
  62. package/dist/starknet/swaps/StarknetSwapContract.d.ts +197 -190
  63. package/dist/starknet/swaps/StarknetSwapContract.js +440 -409
  64. package/dist/starknet/swaps/StarknetSwapData.d.ts +74 -67
  65. package/dist/starknet/swaps/StarknetSwapData.js +325 -290
  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 -86
  89. package/dist/starknet/swaps/modules/StarknetSwapInit.js +235 -224
  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/StarknetBrowserSigner.d.ts +5 -0
  93. package/dist/starknet/wallet/StarknetBrowserSigner.js +11 -0
  94. package/dist/starknet/wallet/StarknetKeypairWallet.d.ts +7 -7
  95. package/dist/starknet/wallet/StarknetKeypairWallet.js +35 -30
  96. package/dist/starknet/wallet/StarknetPersistentSigner.d.ts +33 -0
  97. package/dist/starknet/wallet/StarknetPersistentSigner.js +244 -0
  98. package/dist/starknet/wallet/StarknetSigner.d.ts +18 -12
  99. package/dist/starknet/wallet/StarknetSigner.js +69 -46
  100. package/dist/starknet/wallet/accounts/StarknetKeypairWallet.d.ts +7 -0
  101. package/dist/starknet/wallet/accounts/StarknetKeypairWallet.js +35 -0
  102. package/dist/utils/Utils.d.ts +39 -37
  103. package/dist/utils/Utils.js +264 -261
  104. package/package.json +45 -37
  105. package/src/index.ts +48 -47
  106. package/src/starknet/StarknetChainType.ts +28 -28
  107. package/src/starknet/StarknetInitializer.ts +110 -108
  108. package/src/starknet/btcrelay/BtcRelayAbi.ts +338 -338
  109. package/src/starknet/btcrelay/StarknetBtcRelay.ts +494 -494
  110. package/src/starknet/btcrelay/headers/StarknetBtcHeader.ts +100 -100
  111. package/src/starknet/btcrelay/headers/StarknetBtcStoredHeader.ts +141 -141
  112. package/src/starknet/chain/StarknetAction.ts +85 -85
  113. package/src/starknet/chain/StarknetChainInterface.ts +165 -149
  114. package/src/starknet/chain/StarknetModule.ts +19 -19
  115. package/src/starknet/chain/modules/ERC20Abi.ts +1029 -1029
  116. package/src/starknet/chain/modules/StarknetAccounts.ts +25 -25
  117. package/src/starknet/chain/modules/StarknetAddresses.ts +22 -22
  118. package/src/starknet/chain/modules/StarknetBlocks.ts +75 -74
  119. package/src/starknet/chain/modules/StarknetEvents.ts +104 -104
  120. package/src/starknet/chain/modules/StarknetFees.ts +162 -154
  121. package/src/starknet/chain/modules/StarknetSignatures.ts +91 -91
  122. package/src/starknet/chain/modules/StarknetTokens.ts +120 -116
  123. package/src/starknet/chain/modules/StarknetTransactions.ts +424 -277
  124. package/src/starknet/contract/StarknetContractBase.ts +30 -26
  125. package/src/starknet/contract/StarknetContractModule.ts +16 -16
  126. package/src/starknet/contract/modules/StarknetContractEvents.ts +134 -134
  127. package/src/starknet/events/StarknetChainEvents.ts +67 -67
  128. package/src/starknet/events/StarknetChainEventsBrowser.ts +420 -410
  129. package/src/starknet/provider/RpcProviderWithRetries.ts +83 -43
  130. package/src/starknet/spv_swap/SpvVaultContractAbi.ts +656 -656
  131. package/src/starknet/spv_swap/StarknetSpvVaultContract.ts +591 -483
  132. package/src/starknet/spv_swap/StarknetSpvVaultData.ts +195 -195
  133. package/src/starknet/spv_swap/StarknetSpvWithdrawalData.ts +79 -79
  134. package/src/starknet/swaps/EscrowManagerAbi.ts +582 -586
  135. package/src/starknet/swaps/StarknetSwapContract.ts +668 -628
  136. package/src/starknet/swaps/StarknetSwapData.ts +455 -403
  137. package/src/starknet/swaps/StarknetSwapModule.ts +17 -17
  138. package/src/starknet/swaps/handlers/IHandler.ts +20 -20
  139. package/src/starknet/swaps/handlers/claim/ClaimHandlers.ts +23 -23
  140. package/src/starknet/swaps/handlers/claim/HashlockClaimHandler.ts +53 -53
  141. package/src/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.ts +73 -73
  142. package/src/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.ts +67 -67
  143. package/src/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.ts +50 -50
  144. package/src/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +102 -102
  145. package/src/starknet/swaps/handlers/refund/TimelockRefundHandler.ts +38 -38
  146. package/src/starknet/swaps/modules/StarknetLpVault.ts +147 -147
  147. package/src/starknet/swaps/modules/StarknetSwapClaim.ts +141 -141
  148. package/src/starknet/swaps/modules/StarknetSwapInit.ts +300 -286
  149. package/src/starknet/swaps/modules/StarknetSwapRefund.ts +196 -196
  150. package/src/starknet/wallet/StarknetBrowserSigner.ts +12 -0
  151. package/src/starknet/wallet/StarknetPersistentSigner.ts +311 -0
  152. package/src/starknet/wallet/StarknetSigner.ts +84 -55
  153. package/src/starknet/wallet/{StarknetKeypairWallet.ts → accounts/StarknetKeypairWallet.ts} +44 -39
  154. package/src/utils/Utils.ts +262 -252
@@ -1,224 +1,235 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StarknetSwapInit = void 0;
4
- const base_1 = require("@atomiqlabs/base");
5
- const Utils_1 = require("../../../utils/Utils");
6
- const buffer_1 = require("buffer");
7
- const StarknetAction_1 = require("../../chain/StarknetAction");
8
- const StarknetSwapModule_1 = require("../StarknetSwapModule");
9
- const starknet_1 = require("starknet");
10
- const StarknetFees_1 = require("../../chain/modules/StarknetFees");
11
- const Initialize = [
12
- { name: 'Swap hash', type: 'felt' },
13
- { name: 'Offerer', type: 'ContractAddress' },
14
- { name: 'Claimer', type: 'ContractAddress' },
15
- { name: 'Token amount', type: 'TokenAmount' },
16
- { name: 'Pay in', type: 'bool' },
17
- { name: 'Pay out', type: 'bool' },
18
- { name: 'Tracking reputation', type: 'bool' },
19
- { name: 'Claim handler', type: 'ContractAddress' },
20
- { name: 'Claim data', type: 'felt' },
21
- { name: 'Refund handler', type: 'ContractAddress' },
22
- { name: 'Refund data', type: 'felt' },
23
- { name: 'Security deposit', type: 'TokenAmount' },
24
- { name: 'Claimer bounty', type: 'TokenAmount' },
25
- { name: 'Claim action hash', type: 'felt' },
26
- { name: 'Deadline', type: 'timestamp' }
27
- ];
28
- class StarknetSwapInit extends StarknetSwapModule_1.StarknetSwapModule {
29
- /**
30
- * bare Init action based on the data passed in swapData
31
- *
32
- * @param swapData
33
- * @param timeout
34
- * @param signature
35
- * @private
36
- */
37
- Init(swapData, timeout, signature) {
38
- return new StarknetAction_1.StarknetAction(swapData.payIn ? swapData.offerer : swapData.claimer, this.root, this.swapContract.populateTransaction.initialize(swapData.toEscrowStruct(), signature, timeout, swapData.extraData == null || swapData.extraData === "" ? [] : (0, Utils_1.bufferToBytes31Span)(buffer_1.Buffer.from(swapData.extraData, "hex")).map(Utils_1.toHex)), swapData.payIn ? StarknetSwapInit.GasCosts.INIT_PAY_IN : StarknetSwapInit.GasCosts.INIT);
39
- }
40
- /**
41
- * Returns auth prefix to be used with a specific swap, payIn=true & payIn=false use different prefixes (these
42
- * actually have no meaning for the smart contract/solana program in the Solana case)
43
- *
44
- * @param swapData
45
- * @private
46
- */
47
- getAuthPrefix(swapData) {
48
- return swapData.isPayIn() ? "claim_initialize" : "initialize";
49
- }
50
- async preFetchForInitSignatureVerification() {
51
- return {
52
- pendingBlockTime: await this.root.Blocks.getBlockTime("pending")
53
- };
54
- }
55
- /**
56
- * Signs swap initialization authorization, using data from preFetchedBlockData if provided & still valid (subject
57
- * to SIGNATURE_PREFETCH_DATA_VALIDITY)
58
- *
59
- * @param signer
60
- * @param swapData
61
- * @param authorizationTimeout
62
- * @public
63
- */
64
- async signSwapInitialization(signer, swapData, authorizationTimeout) {
65
- const authTimeout = Math.floor(Date.now() / 1000) + authorizationTimeout;
66
- const signature = await this.root.Signatures.signTypedMessage(signer, Initialize, "Initialize", {
67
- "Swap hash": "0x" + swapData.getEscrowHash(),
68
- "Offerer": swapData.offerer,
69
- "Claimer": swapData.claimer,
70
- "Token amount": {
71
- token_address: swapData.token,
72
- amount: starknet_1.cairo.uint256(swapData.amount)
73
- },
74
- "Pay in": swapData.isPayIn(),
75
- "Pay out": swapData.isPayOut(),
76
- "Tracking reputation": swapData.reputation,
77
- "Refund handler": swapData.refundHandler,
78
- "Claim handler": swapData.claimHandler,
79
- "Claim data": "0x" + swapData.getClaimHash(),
80
- "Refund data": swapData.refundData.startsWith("0x") ? swapData.refundData : "0x" + swapData.refundData,
81
- "Security deposit": {
82
- token_address: swapData.feeToken,
83
- amount: starknet_1.cairo.uint256(swapData.securityDeposit)
84
- },
85
- "Claimer bounty": {
86
- token_address: swapData.feeToken,
87
- amount: starknet_1.cairo.uint256(swapData.claimerBounty)
88
- },
89
- "Claim action hash": 0n,
90
- "Deadline": (0, Utils_1.toHex)(authTimeout)
91
- });
92
- return {
93
- prefix: this.getAuthPrefix(swapData),
94
- timeout: authTimeout.toString(10),
95
- signature
96
- };
97
- }
98
- /**
99
- * Checks whether the provided signature data is valid, using preFetchedData if provided and still valid
100
- *
101
- * @param sender
102
- * @param swapData
103
- * @param timeout
104
- * @param prefix
105
- * @param signature
106
- * @param preFetchData
107
- * @public
108
- */
109
- async isSignatureValid(sender, swapData, timeout, prefix, signature, preFetchData) {
110
- if (!swapData.isOfferer(sender) && !swapData.isClaimer(sender))
111
- throw new base_1.SignatureVerificationError("TX sender not offerer nor claimer");
112
- const signer = swapData.isOfferer(sender) ? swapData.claimer : swapData.offerer;
113
- if (!swapData.isPayIn() && await this.contract.isExpired(sender.toString(), swapData)) {
114
- throw new base_1.SignatureVerificationError("Swap will expire too soon!");
115
- }
116
- if (prefix !== this.getAuthPrefix(swapData))
117
- throw new base_1.SignatureVerificationError("Invalid prefix");
118
- const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
119
- const timeoutBN = BigInt(timeout);
120
- const isExpired = (timeoutBN - currentTimestamp) < BigInt(this.contract.authGracePeriod);
121
- if (isExpired)
122
- throw new base_1.SignatureVerificationError("Authorization expired!");
123
- if (await this.isSignatureExpired(timeout, preFetchData))
124
- throw new base_1.SignatureVerificationError("Authorization expired!");
125
- const valid = await this.root.Signatures.isValidSignature(signature, signer, Initialize, "Initialize", {
126
- "Swap hash": "0x" + swapData.getEscrowHash(),
127
- "Offerer": swapData.offerer,
128
- "Claimer": swapData.claimer,
129
- "Token amount": {
130
- token_address: swapData.token,
131
- amount: starknet_1.cairo.uint256(swapData.amount)
132
- },
133
- "Pay in": swapData.isPayIn(),
134
- "Pay out": swapData.isPayOut(),
135
- "Tracking reputation": swapData.reputation,
136
- "Refund handler": swapData.refundHandler,
137
- "Claim handler": swapData.claimHandler,
138
- "Claim data": "0x" + swapData.getClaimHash(),
139
- "Refund data": swapData.refundData.startsWith("0x") ? swapData.refundData : "0x" + swapData.refundData,
140
- "Security deposit": {
141
- token_address: swapData.feeToken,
142
- amount: starknet_1.cairo.uint256(swapData.securityDeposit)
143
- },
144
- "Claimer bounty": {
145
- token_address: swapData.feeToken,
146
- amount: starknet_1.cairo.uint256(swapData.claimerBounty)
147
- },
148
- "Claim action hash": 0n,
149
- "Deadline": (0, Utils_1.toHex)(timeoutBN)
150
- });
151
- if (!valid)
152
- throw new base_1.SignatureVerificationError("Invalid signature!");
153
- return null;
154
- }
155
- /**
156
- * Gets expiry of the provided signature data, this is a minimum of slot expiry & swap signature expiry
157
- *
158
- * @param timeout
159
- * @public
160
- */
161
- async getSignatureExpiry(timeout) {
162
- const now = Date.now();
163
- const timeoutExpiryTime = (parseInt(timeout) - this.contract.authGracePeriod) * 1000;
164
- if (timeoutExpiryTime < now)
165
- return 0;
166
- return timeoutExpiryTime;
167
- }
168
- /**
169
- * Checks whether signature is expired for good, compares the timestamp to the current "pending" block timestamp
170
- *
171
- * @param timeout
172
- * @param preFetchData
173
- * @public
174
- */
175
- async isSignatureExpired(timeout, preFetchData) {
176
- if (preFetchData == null || preFetchData.pendingBlockTime == null) {
177
- preFetchData = await this.preFetchForInitSignatureVerification();
178
- }
179
- return preFetchData.pendingBlockTime > parseInt(timeout);
180
- }
181
- /**
182
- * Creates init transaction with a valid signature from an LP
183
- *
184
- * @param sender
185
- * @param swapData swap to initialize
186
- * @param timeout init signature timeout
187
- * @param prefix init signature prefix
188
- * @param signature init signature
189
- * @param skipChecks whether to skip signature validity checks
190
- * @param feeRate fee rate to use for the transaction
191
- */
192
- async txsInit(sender, swapData, timeout, prefix, signature, skipChecks, feeRate) {
193
- if (!skipChecks) {
194
- const [_, payStatus] = await Promise.all([
195
- swapData.isOfferer(sender) && !swapData.reputation ? Promise.resolve() : (0, Utils_1.tryWithRetries)(() => this.isSignatureValid(sender, swapData, timeout, prefix, signature), this.retryPolicy, (e) => e instanceof base_1.SignatureVerificationError),
196
- (0, Utils_1.tryWithRetries)(() => this.contract.getCommitStatus(sender, swapData), this.retryPolicy)
197
- ]);
198
- if (payStatus.type !== base_1.SwapCommitStateType.NOT_COMMITED)
199
- throw new base_1.SwapDataVerificationError("Invoice already being paid for or paid");
200
- }
201
- feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
202
- const initAction = this.Init(swapData, BigInt(timeout), JSON.parse(signature));
203
- if (swapData.payIn && swapData.isOfferer(sender))
204
- initAction.addAction(this.root.Tokens.Approve(sender, this.swapContract.address, swapData.token, swapData.amount), 0); //Add erc20 approve
205
- if (swapData.getTotalDeposit() !== 0n)
206
- initAction.addAction(this.root.Tokens.Approve(sender, this.swapContract.address, swapData.feeToken, swapData.getTotalDeposit()), 0); //Add deposit erc20 approve
207
- this.logger.debug("txsInitPayIn(): create swap init TX, swap: " + swapData.getClaimHash() +
208
- " feerate: " + feeRate);
209
- return [await initAction.tx(feeRate)];
210
- }
211
- /**
212
- * Get the estimated solana fee of the init transaction, this includes the required deposit for creating swap PDA
213
- * and also deposit for ATAs
214
- */
215
- async getInitFee(swapData, feeRate) {
216
- feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
217
- return StarknetFees_1.StarknetFees.getGasFee(swapData.payIn ? StarknetSwapInit.GasCosts.INIT_PAY_IN : StarknetSwapInit.GasCosts.INIT, feeRate);
218
- }
219
- }
220
- exports.StarknetSwapInit = StarknetSwapInit;
221
- StarknetSwapInit.GasCosts = {
222
- INIT: { l1DataGas: 750, l2Gas: 8000000, l1Gas: 0 },
223
- INIT_PAY_IN: { l1DataGas: 500, l2Gas: 4800000, l1Gas: 0 },
224
- };
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StarknetSwapInit = void 0;
4
+ const base_1 = require("@atomiqlabs/base");
5
+ const Utils_1 = require("../../../utils/Utils");
6
+ const buffer_1 = require("buffer");
7
+ const StarknetAction_1 = require("../../chain/StarknetAction");
8
+ const StarknetSwapModule_1 = require("../StarknetSwapModule");
9
+ const starknet_1 = require("starknet");
10
+ const StarknetFees_1 = require("../../chain/modules/StarknetFees");
11
+ const Initialize = [
12
+ { name: 'Swap hash', type: 'felt' },
13
+ { name: 'Offerer', type: 'ContractAddress' },
14
+ { name: 'Claimer', type: 'ContractAddress' },
15
+ { name: 'Token amount', type: 'TokenAmount' },
16
+ { name: 'Pay in', type: 'bool' },
17
+ { name: 'Pay out', type: 'bool' },
18
+ { name: 'Tracking reputation', type: 'bool' },
19
+ { name: 'Claim handler', type: 'ContractAddress' },
20
+ { name: 'Claim data', type: 'felt' },
21
+ { name: 'Refund handler', type: 'ContractAddress' },
22
+ { name: 'Refund data', type: 'felt' },
23
+ { name: 'Security deposit', type: 'TokenAmount' },
24
+ { name: 'Claimer bounty', type: 'TokenAmount' },
25
+ { name: 'Claim action hash', type: 'felt' },
26
+ { name: 'Deadline', type: 'timestamp' }
27
+ ];
28
+ class StarknetSwapInit extends StarknetSwapModule_1.StarknetSwapModule {
29
+ /**
30
+ * bare Init action based on the data passed in swapData
31
+ *
32
+ * @param signer
33
+ * @param swapData
34
+ * @param timeout
35
+ * @param signature
36
+ * @private
37
+ */
38
+ Init(signer, swapData, timeout, signature) {
39
+ return new StarknetAction_1.StarknetAction(signer, this.root, this.swapContract.populateTransaction.initialize(swapData.toEscrowStruct(), signature ?? [], timeout, swapData.extraData == null || swapData.extraData === "" ? [] : (0, Utils_1.bufferToBytes31Span)(buffer_1.Buffer.from(swapData.extraData, "hex")).map(Utils_1.toHex)), swapData.payIn ? StarknetSwapInit.GasCosts.INIT_PAY_IN : StarknetSwapInit.GasCosts.INIT);
40
+ }
41
+ /**
42
+ * Returns auth prefix to be used with a specific swap, payIn=true & payIn=false use different prefixes (these
43
+ * actually have no meaning for the smart contract/solana program in the Solana case)
44
+ *
45
+ * @param swapData
46
+ * @private
47
+ */
48
+ getAuthPrefix(swapData) {
49
+ return swapData.isPayIn() ? "claim_initialize" : "initialize";
50
+ }
51
+ async preFetchForInitSignatureVerification() {
52
+ return {
53
+ pendingBlockTime: await this.root.Blocks.getBlockTime(starknet_1.BlockTag.PRE_CONFIRMED)
54
+ };
55
+ }
56
+ /**
57
+ * Signs swap initialization authorization, using data from preFetchedBlockData if provided & still valid (subject
58
+ * to SIGNATURE_PREFETCH_DATA_VALIDITY)
59
+ *
60
+ * @param signer
61
+ * @param swapData
62
+ * @param authorizationTimeout
63
+ * @public
64
+ */
65
+ async signSwapInitialization(signer, swapData, authorizationTimeout) {
66
+ const authTimeout = Math.floor(Date.now() / 1000) + authorizationTimeout;
67
+ const signature = await this.root.Signatures.signTypedMessage(signer, Initialize, "Initialize", {
68
+ "Swap hash": "0x" + swapData.getEscrowHash(),
69
+ "Offerer": swapData.offerer,
70
+ "Claimer": swapData.claimer,
71
+ "Token amount": {
72
+ token_address: swapData.token,
73
+ amount: starknet_1.cairo.uint256(swapData.amount)
74
+ },
75
+ "Pay in": swapData.isPayIn(),
76
+ "Pay out": swapData.isPayOut(),
77
+ "Tracking reputation": swapData.reputation,
78
+ "Refund handler": swapData.refundHandler,
79
+ "Claim handler": swapData.claimHandler,
80
+ "Claim data": "0x" + swapData.getClaimHash(),
81
+ "Refund data": swapData.refundData.startsWith("0x") ? swapData.refundData : "0x" + swapData.refundData,
82
+ "Security deposit": {
83
+ token_address: swapData.feeToken,
84
+ amount: starknet_1.cairo.uint256(swapData.securityDeposit)
85
+ },
86
+ "Claimer bounty": {
87
+ token_address: swapData.feeToken,
88
+ amount: starknet_1.cairo.uint256(swapData.claimerBounty)
89
+ },
90
+ "Claim action hash": 0n,
91
+ "Deadline": (0, Utils_1.toHex)(authTimeout)
92
+ });
93
+ return {
94
+ prefix: this.getAuthPrefix(swapData),
95
+ timeout: authTimeout.toString(10),
96
+ signature
97
+ };
98
+ }
99
+ /**
100
+ * Checks whether the provided signature data is valid, using preFetchedData if provided and still valid
101
+ *
102
+ * @param sender
103
+ * @param swapData
104
+ * @param timeout
105
+ * @param prefix
106
+ * @param signature
107
+ * @param preFetchData
108
+ * @public
109
+ */
110
+ async isSignatureValid(sender, swapData, timeout, prefix, signature, preFetchData) {
111
+ if (!swapData.isOfferer(sender) && !swapData.isClaimer(sender))
112
+ throw new base_1.SignatureVerificationError("TX sender not offerer nor claimer");
113
+ const signer = swapData.isOfferer(sender) ? swapData.claimer : swapData.offerer;
114
+ if (!swapData.isPayIn() && await this.contract.isExpired(sender.toString(), swapData)) {
115
+ throw new base_1.SignatureVerificationError("Swap will expire too soon!");
116
+ }
117
+ if (prefix !== this.getAuthPrefix(swapData))
118
+ throw new base_1.SignatureVerificationError("Invalid prefix");
119
+ const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
120
+ const timeoutBN = BigInt(timeout);
121
+ const isExpired = (timeoutBN - currentTimestamp) < BigInt(this.contract.authGracePeriod);
122
+ if (isExpired)
123
+ throw new base_1.SignatureVerificationError("Authorization expired!");
124
+ if (await this.isSignatureSoftExpired(timeout, preFetchData))
125
+ throw new base_1.SignatureVerificationError("Authorization expired!");
126
+ const valid = await this.root.Signatures.isValidSignature(signature, signer, Initialize, "Initialize", {
127
+ "Swap hash": "0x" + swapData.getEscrowHash(),
128
+ "Offerer": swapData.offerer,
129
+ "Claimer": swapData.claimer,
130
+ "Token amount": {
131
+ token_address: swapData.token,
132
+ amount: starknet_1.cairo.uint256(swapData.amount)
133
+ },
134
+ "Pay in": swapData.isPayIn(),
135
+ "Pay out": swapData.isPayOut(),
136
+ "Tracking reputation": swapData.reputation,
137
+ "Refund handler": swapData.refundHandler,
138
+ "Claim handler": swapData.claimHandler,
139
+ "Claim data": "0x" + swapData.getClaimHash(),
140
+ "Refund data": swapData.refundData.startsWith("0x") ? swapData.refundData : "0x" + swapData.refundData,
141
+ "Security deposit": {
142
+ token_address: swapData.feeToken,
143
+ amount: starknet_1.cairo.uint256(swapData.securityDeposit)
144
+ },
145
+ "Claimer bounty": {
146
+ token_address: swapData.feeToken,
147
+ amount: starknet_1.cairo.uint256(swapData.claimerBounty)
148
+ },
149
+ "Claim action hash": 0n,
150
+ "Deadline": (0, Utils_1.toHex)(timeoutBN)
151
+ });
152
+ if (!valid)
153
+ throw new base_1.SignatureVerificationError("Invalid signature!");
154
+ return null;
155
+ }
156
+ /**
157
+ * Gets expiry of the provided signature data, this is a minimum of slot expiry & swap signature expiry
158
+ *
159
+ * @param timeout
160
+ * @public
161
+ */
162
+ async getSignatureExpiry(timeout) {
163
+ const now = Date.now();
164
+ const timeoutExpiryTime = (parseInt(timeout) - this.contract.authGracePeriod) * 1000;
165
+ if (timeoutExpiryTime < now)
166
+ return 0;
167
+ return timeoutExpiryTime;
168
+ }
169
+ /**
170
+ * Checks whether signature is soft expired, compares the timestamp to the current "pre-confirmed" block timestamp
171
+ *
172
+ * @param timeout
173
+ * @param preFetchData
174
+ * @public
175
+ */
176
+ async isSignatureSoftExpired(timeout, preFetchData) {
177
+ if (preFetchData == null || preFetchData.pendingBlockTime == null) {
178
+ preFetchData = await this.preFetchForInitSignatureVerification();
179
+ }
180
+ return preFetchData.pendingBlockTime > parseInt(timeout);
181
+ }
182
+ /**
183
+ * Checks whether signature is expired for good, compares the timestamp to the current "latest" block timestamp
184
+ *
185
+ * @param timeout
186
+ * @public
187
+ */
188
+ async isSignatureExpired(timeout) {
189
+ const blockTime = await this.root.Blocks.getBlockTime(starknet_1.BlockTag.LATEST);
190
+ return blockTime > parseInt(timeout);
191
+ }
192
+ /**
193
+ * Creates init transaction with a valid signature from an LP
194
+ *
195
+ * @param sender
196
+ * @param swapData swap to initialize
197
+ * @param timeout init signature timeout
198
+ * @param prefix init signature prefix
199
+ * @param signature init signature
200
+ * @param skipChecks whether to skip signature validity checks
201
+ * @param feeRate fee rate to use for the transaction
202
+ */
203
+ async txsInit(sender, swapData, timeout, prefix, signature, skipChecks, feeRate) {
204
+ if (!skipChecks) {
205
+ const [_, payStatus] = await Promise.all([
206
+ swapData.isOfferer(sender) && !swapData.reputation ? Promise.resolve() : (0, Utils_1.tryWithRetries)(() => this.isSignatureValid(sender, swapData, timeout, prefix, signature), this.retryPolicy, (e) => e instanceof base_1.SignatureVerificationError),
207
+ (0, Utils_1.tryWithRetries)(() => this.contract.getCommitStatus(sender, swapData), this.retryPolicy)
208
+ ]);
209
+ if (payStatus.type !== base_1.SwapCommitStateType.NOT_COMMITED)
210
+ throw new base_1.SwapDataVerificationError("Invoice already being paid for or paid");
211
+ }
212
+ feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
213
+ const initAction = this.Init(sender, swapData, BigInt(timeout), JSON.parse(signature));
214
+ if (swapData.payIn && swapData.isOfferer(sender))
215
+ initAction.addAction(this.root.Tokens.Approve(sender, this.swapContract.address, swapData.token, swapData.amount), 0); //Add erc20 approve
216
+ if (swapData.getTotalDeposit() !== 0n)
217
+ initAction.addAction(this.root.Tokens.Approve(sender, this.swapContract.address, swapData.feeToken, swapData.getTotalDeposit()), 0); //Add deposit erc20 approve
218
+ this.logger.debug("txsInitPayIn(): create swap init TX, swap: " + swapData.getClaimHash() +
219
+ " feerate: " + feeRate);
220
+ return [await initAction.tx(feeRate)];
221
+ }
222
+ /**
223
+ * Get the estimated solana fee of the init transaction, this includes the required deposit for creating swap PDA
224
+ * and also deposit for ATAs
225
+ */
226
+ async getInitFee(swapData, feeRate) {
227
+ feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
228
+ return StarknetFees_1.StarknetFees.getGasFee(swapData.payIn ? StarknetSwapInit.GasCosts.INIT_PAY_IN : StarknetSwapInit.GasCosts.INIT, feeRate);
229
+ }
230
+ }
231
+ exports.StarknetSwapInit = StarknetSwapInit;
232
+ StarknetSwapInit.GasCosts = {
233
+ INIT: { l1DataGas: 750, l2Gas: 8000000, l1Gas: 0 },
234
+ INIT_PAY_IN: { l1DataGas: 500, l2Gas: 4800000, l1Gas: 0 },
235
+ };
@@ -1,62 +1,62 @@
1
- import { StarknetSwapModule } from "../StarknetSwapModule";
2
- import { StarknetSwapData } from "../StarknetSwapData";
3
- import { StarknetTx } from "../../chain/modules/StarknetTransactions";
4
- import { StarknetSigner } from "../../wallet/StarknetSigner";
5
- export declare class StarknetSwapRefund extends StarknetSwapModule {
6
- private static readonly GasCosts;
7
- /**
8
- * Action for generic Refund instruction
9
- *
10
- * @param signer
11
- * @param swapData
12
- * @param witness
13
- * @param handlerGas
14
- * @constructor
15
- * @private
16
- */
17
- private Refund;
18
- /**
19
- * Action for cooperative refunding with signature
20
- *
21
- * @param sender
22
- * @param swapData
23
- * @param timeout
24
- * @param signature
25
- * @constructor
26
- * @private
27
- */
28
- private RefundWithSignature;
29
- signSwapRefund(signer: StarknetSigner, swapData: StarknetSwapData, authorizationTimeout: number): Promise<{
30
- prefix: string;
31
- timeout: string;
32
- signature: string;
33
- }>;
34
- isSignatureValid(swapData: StarknetSwapData, timeout: string, prefix: string, signature: string): Promise<null>;
35
- /**
36
- * Creates transactions required for refunding timed out swap
37
- *
38
- * @param signer
39
- * @param swapData swap data to refund
40
- * @param check whether to check if swap is already expired and refundable
41
- * @param feeRate fee rate to be used for the transactions
42
- * @param witnessData
43
- */
44
- txsRefund<T>(signer: string, swapData: StarknetSwapData, check?: boolean, feeRate?: string, witnessData?: T): Promise<StarknetTx[]>;
45
- /**
46
- * Creates transactions required for refunding the swap with authorization signature, also unwraps WSOL to SOL
47
- *
48
- * @param signer
49
- * @param swapData swap data to refund
50
- * @param timeout signature timeout
51
- * @param prefix signature prefix of the counterparty
52
- * @param signature signature of the counterparty
53
- * @param check whether to check if swap is committed before attempting refund
54
- * @param feeRate fee rate to be used for the transactions
55
- */
56
- txsRefundWithAuthorization(signer: string, swapData: StarknetSwapData, timeout: string, prefix: string, signature: string, check?: boolean, feeRate?: string): Promise<StarknetTx[]>;
57
- /**
58
- * Get the estimated solana transaction fee of the refund transaction, in the worst case scenario in case where the
59
- * ATA needs to be initialized again (i.e. adding the ATA rent exempt lamports to the fee)
60
- */
61
- getRefundFee(swapData: StarknetSwapData, feeRate?: string): Promise<bigint>;
62
- }
1
+ import { StarknetSwapModule } from "../StarknetSwapModule";
2
+ import { StarknetSwapData } from "../StarknetSwapData";
3
+ import { StarknetTx } from "../../chain/modules/StarknetTransactions";
4
+ import { StarknetSigner } from "../../wallet/StarknetSigner";
5
+ export declare class StarknetSwapRefund extends StarknetSwapModule {
6
+ private static readonly GasCosts;
7
+ /**
8
+ * Action for generic Refund instruction
9
+ *
10
+ * @param signer
11
+ * @param swapData
12
+ * @param witness
13
+ * @param handlerGas
14
+ * @constructor
15
+ * @private
16
+ */
17
+ private Refund;
18
+ /**
19
+ * Action for cooperative refunding with signature
20
+ *
21
+ * @param sender
22
+ * @param swapData
23
+ * @param timeout
24
+ * @param signature
25
+ * @constructor
26
+ * @private
27
+ */
28
+ private RefundWithSignature;
29
+ signSwapRefund(signer: StarknetSigner, swapData: StarknetSwapData, authorizationTimeout: number): Promise<{
30
+ prefix: string;
31
+ timeout: string;
32
+ signature: string;
33
+ }>;
34
+ isSignatureValid(swapData: StarknetSwapData, timeout: string, prefix: string, signature: string): Promise<null>;
35
+ /**
36
+ * Creates transactions required for refunding timed out swap
37
+ *
38
+ * @param signer
39
+ * @param swapData swap data to refund
40
+ * @param check whether to check if swap is already expired and refundable
41
+ * @param feeRate fee rate to be used for the transactions
42
+ * @param witnessData
43
+ */
44
+ txsRefund<T>(signer: string, swapData: StarknetSwapData, check?: boolean, feeRate?: string, witnessData?: T): Promise<StarknetTx[]>;
45
+ /**
46
+ * Creates transactions required for refunding the swap with authorization signature, also unwraps WSOL to SOL
47
+ *
48
+ * @param signer
49
+ * @param swapData swap data to refund
50
+ * @param timeout signature timeout
51
+ * @param prefix signature prefix of the counterparty
52
+ * @param signature signature of the counterparty
53
+ * @param check whether to check if swap is committed before attempting refund
54
+ * @param feeRate fee rate to be used for the transactions
55
+ */
56
+ txsRefundWithAuthorization(signer: string, swapData: StarknetSwapData, timeout: string, prefix: string, signature: string, check?: boolean, feeRate?: string): Promise<StarknetTx[]>;
57
+ /**
58
+ * Get the estimated solana transaction fee of the refund transaction, in the worst case scenario in case where the
59
+ * ATA needs to be initialized again (i.e. adding the ATA rent exempt lamports to the fee)
60
+ */
61
+ getRefundFee(swapData: StarknetSwapData, feeRate?: string): Promise<bigint>;
62
+ }