@atomiqlabs/chain-evm 1.0.0-dev.62 → 1.0.0-dev.64

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 (187) hide show
  1. package/LICENSE +201 -201
  2. package/dist/chains/botanix/BotanixChainType.d.ts +13 -13
  3. package/dist/chains/botanix/BotanixChainType.js +2 -2
  4. package/dist/chains/botanix/BotanixInitializer.d.ts +30 -30
  5. package/dist/chains/botanix/BotanixInitializer.js +122 -122
  6. package/dist/chains/citrea/CitreaBtcRelay.d.ts +21 -21
  7. package/dist/chains/citrea/CitreaBtcRelay.js +43 -43
  8. package/dist/chains/citrea/CitreaChainType.d.ts +13 -13
  9. package/dist/chains/citrea/CitreaChainType.js +2 -2
  10. package/dist/chains/citrea/CitreaFees.d.ts +29 -29
  11. package/dist/chains/citrea/CitreaFees.js +67 -67
  12. package/dist/chains/citrea/CitreaInitializer.d.ts +30 -30
  13. package/dist/chains/citrea/CitreaInitializer.js +129 -129
  14. package/dist/chains/citrea/CitreaSpvVaultContract.d.ts +15 -15
  15. package/dist/chains/citrea/CitreaSpvVaultContract.js +74 -74
  16. package/dist/chains/citrea/CitreaSwapContract.d.ts +22 -22
  17. package/dist/chains/citrea/CitreaSwapContract.js +96 -96
  18. package/dist/chains/citrea/CitreaTokens.d.ts +9 -9
  19. package/dist/chains/citrea/CitreaTokens.js +20 -20
  20. package/dist/evm/btcrelay/BtcRelayAbi.d.ts +198 -198
  21. package/dist/evm/btcrelay/BtcRelayAbi.js +261 -261
  22. package/dist/evm/btcrelay/BtcRelayTypechain.d.ts +172 -172
  23. package/dist/evm/btcrelay/BtcRelayTypechain.js +2 -2
  24. package/dist/evm/btcrelay/EVMBtcRelay.d.ts +195 -195
  25. package/dist/evm/btcrelay/EVMBtcRelay.js +423 -423
  26. package/dist/evm/btcrelay/headers/EVMBtcHeader.d.ts +33 -33
  27. package/dist/evm/btcrelay/headers/EVMBtcHeader.js +84 -84
  28. package/dist/evm/btcrelay/headers/EVMBtcStoredHeader.d.ts +56 -56
  29. package/dist/evm/btcrelay/headers/EVMBtcStoredHeader.js +123 -123
  30. package/dist/evm/chain/EVMChainInterface.d.ts +51 -51
  31. package/dist/evm/chain/EVMChainInterface.js +89 -89
  32. package/dist/evm/chain/EVMModule.d.ts +9 -9
  33. package/dist/evm/chain/EVMModule.js +13 -13
  34. package/dist/evm/chain/modules/ERC20Abi.d.ts +168 -168
  35. package/dist/evm/chain/modules/ERC20Abi.js +225 -225
  36. package/dist/evm/chain/modules/EVMAddresses.d.ts +10 -10
  37. package/dist/evm/chain/modules/EVMAddresses.js +30 -30
  38. package/dist/evm/chain/modules/EVMBlocks.d.ts +20 -20
  39. package/dist/evm/chain/modules/EVMBlocks.js +64 -64
  40. package/dist/evm/chain/modules/EVMEvents.d.ts +36 -36
  41. package/dist/evm/chain/modules/EVMEvents.js +122 -122
  42. package/dist/evm/chain/modules/EVMFees.d.ts +36 -36
  43. package/dist/evm/chain/modules/EVMFees.js +73 -73
  44. package/dist/evm/chain/modules/EVMSignatures.d.ts +29 -29
  45. package/dist/evm/chain/modules/EVMSignatures.js +68 -68
  46. package/dist/evm/chain/modules/EVMTokens.d.ts +70 -70
  47. package/dist/evm/chain/modules/EVMTokens.js +142 -142
  48. package/dist/evm/chain/modules/EVMTransactions.d.ts +89 -89
  49. package/dist/evm/chain/modules/EVMTransactions.js +235 -235
  50. package/dist/evm/contract/EVMContractBase.d.ts +22 -22
  51. package/dist/evm/contract/EVMContractBase.js +34 -34
  52. package/dist/evm/contract/EVMContractModule.d.ts +8 -8
  53. package/dist/evm/contract/EVMContractModule.js +11 -11
  54. package/dist/evm/contract/modules/EVMContractEvents.d.ts +42 -42
  55. package/dist/evm/contract/modules/EVMContractEvents.js +75 -75
  56. package/dist/evm/events/EVMChainEvents.d.ts +22 -22
  57. package/dist/evm/events/EVMChainEvents.js +69 -69
  58. package/dist/evm/events/EVMChainEventsBrowser.d.ts +102 -102
  59. package/dist/evm/events/EVMChainEventsBrowser.js +402 -400
  60. package/dist/evm/providers/JsonRpcProviderWithRetries.d.ts +15 -15
  61. package/dist/evm/providers/JsonRpcProviderWithRetries.js +19 -19
  62. package/dist/evm/providers/ReconnectingWebSocketProvider.d.ts +22 -20
  63. package/dist/evm/providers/ReconnectingWebSocketProvider.js +87 -77
  64. package/dist/evm/providers/SocketProvider.d.ts +111 -111
  65. package/dist/evm/providers/SocketProvider.js +334 -334
  66. package/dist/evm/providers/WebSocketProviderWithRetries.d.ts +17 -17
  67. package/dist/evm/providers/WebSocketProviderWithRetries.js +19 -19
  68. package/dist/evm/spv_swap/EVMSpvVaultContract.d.ts +78 -78
  69. package/dist/evm/spv_swap/EVMSpvVaultContract.js +478 -478
  70. package/dist/evm/spv_swap/EVMSpvVaultData.d.ts +39 -39
  71. package/dist/evm/spv_swap/EVMSpvVaultData.js +180 -180
  72. package/dist/evm/spv_swap/EVMSpvWithdrawalData.d.ts +19 -19
  73. package/dist/evm/spv_swap/EVMSpvWithdrawalData.js +55 -55
  74. package/dist/evm/spv_swap/SpvVaultContractAbi.d.ts +91 -91
  75. package/dist/evm/spv_swap/SpvVaultContractAbi.js +849 -849
  76. package/dist/evm/spv_swap/SpvVaultContractTypechain.d.ts +450 -450
  77. package/dist/evm/spv_swap/SpvVaultContractTypechain.js +2 -2
  78. package/dist/evm/swaps/EVMSwapContract.d.ts +193 -193
  79. package/dist/evm/swaps/EVMSwapContract.js +378 -378
  80. package/dist/evm/swaps/EVMSwapData.d.ts +66 -66
  81. package/dist/evm/swaps/EVMSwapData.js +260 -260
  82. package/dist/evm/swaps/EVMSwapModule.d.ts +9 -9
  83. package/dist/evm/swaps/EVMSwapModule.js +11 -11
  84. package/dist/evm/swaps/EscrowManagerAbi.d.ts +120 -120
  85. package/dist/evm/swaps/EscrowManagerAbi.js +985 -985
  86. package/dist/evm/swaps/EscrowManagerTypechain.d.ts +475 -475
  87. package/dist/evm/swaps/EscrowManagerTypechain.js +2 -2
  88. package/dist/evm/swaps/handlers/IHandler.d.ts +13 -13
  89. package/dist/evm/swaps/handlers/IHandler.js +2 -2
  90. package/dist/evm/swaps/handlers/claim/ClaimHandlers.d.ts +10 -10
  91. package/dist/evm/swaps/handlers/claim/ClaimHandlers.js +13 -13
  92. package/dist/evm/swaps/handlers/claim/HashlockClaimHandler.d.ts +20 -20
  93. package/dist/evm/swaps/handlers/claim/HashlockClaimHandler.js +39 -39
  94. package/dist/evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +24 -24
  95. package/dist/evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +59 -59
  96. package/dist/evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +25 -25
  97. package/dist/evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +51 -51
  98. package/dist/evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +21 -21
  99. package/dist/evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +28 -28
  100. package/dist/evm/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +48 -48
  101. package/dist/evm/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +63 -63
  102. package/dist/evm/swaps/handlers/refund/TimelockRefundHandler.d.ts +17 -17
  103. package/dist/evm/swaps/handlers/refund/TimelockRefundHandler.js +28 -28
  104. package/dist/evm/swaps/modules/EVMLpVault.d.ts +69 -69
  105. package/dist/evm/swaps/modules/EVMLpVault.js +134 -134
  106. package/dist/evm/swaps/modules/EVMSwapClaim.d.ts +54 -54
  107. package/dist/evm/swaps/modules/EVMSwapClaim.js +137 -137
  108. package/dist/evm/swaps/modules/EVMSwapInit.d.ts +88 -88
  109. package/dist/evm/swaps/modules/EVMSwapInit.js +274 -274
  110. package/dist/evm/swaps/modules/EVMSwapRefund.d.ts +62 -62
  111. package/dist/evm/swaps/modules/EVMSwapRefund.js +167 -167
  112. package/dist/evm/typechain/common.d.ts +50 -50
  113. package/dist/evm/typechain/common.js +2 -2
  114. package/dist/evm/wallet/EVMSigner.d.ts +10 -10
  115. package/dist/evm/wallet/EVMSigner.js +17 -17
  116. package/dist/index.d.ts +43 -43
  117. package/dist/index.js +59 -59
  118. package/dist/utils/Utils.d.ts +15 -15
  119. package/dist/utils/Utils.js +71 -71
  120. package/package.json +37 -37
  121. package/src/chains/botanix/BotanixChainType.ts +28 -28
  122. package/src/chains/botanix/BotanixInitializer.ts +171 -171
  123. package/src/chains/citrea/CitreaBtcRelay.ts +57 -57
  124. package/src/chains/citrea/CitreaChainType.ts +28 -28
  125. package/src/chains/citrea/CitreaFees.ts +77 -77
  126. package/src/chains/citrea/CitreaInitializer.ts +178 -178
  127. package/src/chains/citrea/CitreaSpvVaultContract.ts +75 -75
  128. package/src/chains/citrea/CitreaSwapContract.ts +102 -102
  129. package/src/chains/citrea/CitreaTokens.ts +21 -21
  130. package/src/evm/btcrelay/BtcRelayAbi.ts +258 -258
  131. package/src/evm/btcrelay/BtcRelayTypechain.ts +371 -371
  132. package/src/evm/btcrelay/EVMBtcRelay.ts +522 -522
  133. package/src/evm/btcrelay/headers/EVMBtcHeader.ts +109 -109
  134. package/src/evm/btcrelay/headers/EVMBtcStoredHeader.ts +152 -152
  135. package/src/evm/chain/EVMChainInterface.ts +155 -155
  136. package/src/evm/chain/EVMModule.ts +21 -21
  137. package/src/evm/chain/modules/ERC20Abi.ts +222 -222
  138. package/src/evm/chain/modules/EVMAddresses.ts +28 -28
  139. package/src/evm/chain/modules/EVMBlocks.ts +75 -75
  140. package/src/evm/chain/modules/EVMEvents.ts +139 -139
  141. package/src/evm/chain/modules/EVMFees.ts +104 -104
  142. package/src/evm/chain/modules/EVMSignatures.ts +76 -76
  143. package/src/evm/chain/modules/EVMTokens.ts +155 -155
  144. package/src/evm/chain/modules/EVMTransactions.ts +263 -263
  145. package/src/evm/contract/EVMContractBase.ts +63 -63
  146. package/src/evm/contract/EVMContractModule.ts +16 -16
  147. package/src/evm/contract/modules/EVMContractEvents.ts +102 -102
  148. package/src/evm/events/EVMChainEvents.ts +82 -82
  149. package/src/evm/events/EVMChainEventsBrowser.ts +524 -523
  150. package/src/evm/providers/JsonRpcProviderWithRetries.ts +26 -26
  151. package/src/evm/providers/ReconnectingWebSocketProvider.ts +101 -93
  152. package/src/evm/providers/SocketProvider.ts +368 -368
  153. package/src/evm/providers/WebSocketProviderWithRetries.ts +28 -28
  154. package/src/evm/spv_swap/EVMSpvVaultContract.ts +608 -608
  155. package/src/evm/spv_swap/EVMSpvVaultData.ts +224 -224
  156. package/src/evm/spv_swap/EVMSpvWithdrawalData.ts +70 -70
  157. package/src/evm/spv_swap/SpvVaultContractAbi.ts +846 -846
  158. package/src/evm/spv_swap/SpvVaultContractTypechain.ts +685 -685
  159. package/src/evm/swaps/EVMSwapContract.ts +600 -600
  160. package/src/evm/swaps/EVMSwapData.ts +378 -378
  161. package/src/evm/swaps/EVMSwapModule.ts +16 -16
  162. package/src/evm/swaps/EscrowManagerAbi.ts +982 -982
  163. package/src/evm/swaps/EscrowManagerTypechain.ts +723 -723
  164. package/src/evm/swaps/handlers/IHandler.ts +17 -17
  165. package/src/evm/swaps/handlers/claim/ClaimHandlers.ts +20 -20
  166. package/src/evm/swaps/handlers/claim/HashlockClaimHandler.ts +46 -46
  167. package/src/evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.ts +82 -82
  168. package/src/evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.ts +76 -76
  169. package/src/evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.ts +46 -46
  170. package/src/evm/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +115 -115
  171. package/src/evm/swaps/handlers/refund/TimelockRefundHandler.ts +37 -37
  172. package/src/evm/swaps/modules/EVMLpVault.ts +154 -154
  173. package/src/evm/swaps/modules/EVMSwapClaim.ts +172 -172
  174. package/src/evm/swaps/modules/EVMSwapInit.ts +328 -328
  175. package/src/evm/swaps/modules/EVMSwapRefund.ts +229 -229
  176. package/src/evm/typechain/common.ts +131 -131
  177. package/src/evm/wallet/EVMSigner.ts +25 -25
  178. package/src/index.ts +52 -52
  179. package/src/utils/Utils.ts +81 -81
  180. package/dist/evm/JsonRpcProviderWithRetries.d.ts +0 -15
  181. package/dist/evm/JsonRpcProviderWithRetries.js +0 -19
  182. package/dist/evm/ReconnectingWebSocketProvider.d.ts +0 -20
  183. package/dist/evm/ReconnectingWebSocketProvider.js +0 -77
  184. package/dist/evm/SocketProvider.d.ts +0 -111
  185. package/dist/evm/SocketProvider.js +0 -334
  186. package/dist/evm/WebSocketProviderWithRetries.d.ts +0 -17
  187. package/dist/evm/WebSocketProviderWithRetries.js +0 -19
@@ -1,235 +1,235 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EVMTransactions = void 0;
4
- const EVMModule_1 = require("../EVMModule");
5
- const ethers_1 = require("ethers");
6
- const Utils_1 = require("../../../utils/Utils");
7
- const MAX_UNCONFIRMED_TXNS = 10;
8
- class EVMTransactions extends EVMModule_1.EVMModule {
9
- constructor() {
10
- super(...arguments);
11
- this.latestConfirmedNonces = {};
12
- }
13
- /**
14
- * Waits for transaction confirmation using WS subscription and occasional HTTP polling, also re-sends
15
- * the transaction at regular interval
16
- *
17
- * @param tx EVM transaction to wait for confirmation for
18
- * @param abortSignal signal to abort waiting for tx confirmation
19
- * @private
20
- */
21
- async confirmTransaction(tx, abortSignal) {
22
- let state = "pending";
23
- while (state === "pending" || state === "not_found") {
24
- await (0, Utils_1.timeoutPromise)(3000, abortSignal);
25
- state = await this.getTxIdStatus(tx.hash);
26
- //Don't re-send transactions
27
- // if(state==="not_found") await this.sendSignedTransaction(tx).catch(e => {
28
- // if(e.baseError?.code === 59) return; //Transaction already in the mempool
29
- // this.logger.error("confirmTransaction(): Error on transaction re-send: ", e);
30
- // });
31
- }
32
- const nextAccountNonce = tx.nonce + 1;
33
- const currentNonce = this.latestConfirmedNonces[tx.from];
34
- if (currentNonce == null || nextAccountNonce > currentNonce) {
35
- this.latestConfirmedNonces[tx.from] = nextAccountNonce;
36
- }
37
- if (state === "reverted")
38
- throw new Error("Transaction reverted!");
39
- }
40
- /**
41
- * Prepares starknet transactions, checks if the account is deployed, assigns nonces if needed & calls beforeTxSigned callback
42
- *
43
- * @param signer
44
- * @param txs
45
- * @private
46
- */
47
- async prepareTransactions(signer, txs) {
48
- let nonce = (await signer.getNonce()) ?? await this.root.provider.getTransactionCount(signer.getAddress(), "pending");
49
- const latestConfirmedNonce = this.latestConfirmedNonces[signer.getAddress()];
50
- if (latestConfirmedNonce != null && latestConfirmedNonce > nonce) {
51
- this.logger.debug("prepareTransactions(): Using nonce from local cache!");
52
- nonce = latestConfirmedNonce;
53
- }
54
- for (let i = 0; i < txs.length; i++) {
55
- const tx = txs[i];
56
- tx.chainId = this.root.evmChainId;
57
- tx.from = signer.getAddress();
58
- if (tx.nonce != null)
59
- nonce = tx.nonce; //Take the nonce from last tx
60
- if (nonce == null)
61
- nonce = await this.root.provider.getTransactionCount(signer.getAddress(), "pending"); //Fetch the nonce
62
- if (tx.nonce == null)
63
- tx.nonce = nonce;
64
- this.logger.debug("sendAndConfirm(): transaction prepared (" + (i + 1) + "/" + txs.length + "), nonce: " + tx.nonce);
65
- nonce++;
66
- if (this.cbkBeforeTxSigned != null)
67
- await this.cbkBeforeTxSigned(tx);
68
- }
69
- }
70
- /**
71
- * Sends out a signed transaction to the RPC
72
- *
73
- * @param tx EVM tx to send
74
- * @param onBeforePublish a callback called before every transaction is published
75
- * @private
76
- */
77
- async sendSignedTransaction(tx, onBeforePublish) {
78
- if (onBeforePublish != null)
79
- await onBeforePublish(tx.hash, await this.serializeTx(tx));
80
- this.logger.debug("sendSignedTransaction(): sending transaction: ", tx.hash);
81
- const serializedTx = tx.serialized;
82
- let result;
83
- if (this.cbkSendTransaction != null)
84
- result = await this.cbkSendTransaction(serializedTx);
85
- if (result == null) {
86
- const broadcastResult = await this.provider.broadcastTransaction(tx.serialized);
87
- result = broadcastResult.hash;
88
- }
89
- this.logger.info("sendSignedTransaction(): tx sent, txHash: " + result);
90
- return result;
91
- }
92
- /**
93
- * Prepares, signs, sends (in parallel or sequentially) & optionally waits for confirmation
94
- * of a batch of EVM transactions
95
- *
96
- * @param signer
97
- * @param txs transactions to send
98
- * @param waitForConfirmation whether to wait for transaction confirmations (this also makes sure the transactions
99
- * are re-sent at regular intervals)
100
- * @param abortSignal abort signal to abort waiting for transaction confirmations
101
- * @param parallel whether the send all the transaction at once in parallel or sequentially (such that transactions
102
- * are executed in order)
103
- * @param onBeforePublish a callback called before every transaction is published, NOTE: callback is not called when using browser-based wallet!
104
- */
105
- async sendAndConfirm(signer, txs, waitForConfirmation, abortSignal, parallel, onBeforePublish) {
106
- await this.prepareTransactions(signer, txs);
107
- const signedTxs = [];
108
- //Don't separate the signing process from the sending when using browser-based wallet
109
- if (!signer.isBrowserWallet)
110
- for (let i = 0; i < txs.length; i++) {
111
- const tx = txs[i];
112
- const signedTx = ethers_1.Transaction.from(await signer.account.signTransaction(tx));
113
- signedTxs.push(signedTx);
114
- this.logger.debug("sendAndConfirm(): transaction signed (" + (i + 1) + "/" + txs.length + "): " + signedTx);
115
- }
116
- this.logger.debug("sendAndConfirm(): sending transactions, count: " + txs.length +
117
- " waitForConfirmation: " + waitForConfirmation + " parallel: " + parallel);
118
- const txIds = [];
119
- if (parallel) {
120
- let promises = [];
121
- for (let i = 0; i < txs.length; i++) {
122
- let tx;
123
- if (signer.isBrowserWallet) {
124
- tx = await signer.account.sendTransaction(txs[i]);
125
- }
126
- else {
127
- const signedTx = signedTxs[i];
128
- await this.sendSignedTransaction(signedTx, onBeforePublish);
129
- tx = signedTx;
130
- }
131
- if (waitForConfirmation)
132
- promises.push(this.confirmTransaction(tx, abortSignal));
133
- txIds.push(tx.hash);
134
- this.logger.debug("sendAndConfirm(): transaction sent (" + (i + 1) + "/" + signedTxs.length + "): " + tx.hash);
135
- if (promises.length >= MAX_UNCONFIRMED_TXNS) {
136
- await Promise.all(promises);
137
- promises = [];
138
- }
139
- }
140
- if (promises.length > 0)
141
- await Promise.all(promises);
142
- }
143
- else {
144
- for (let i = 0; i < txs.length; i++) {
145
- let tx;
146
- if (signer.isBrowserWallet) {
147
- tx = await signer.account.sendTransaction(txs[i]);
148
- }
149
- else {
150
- const signedTx = signedTxs[i];
151
- await this.sendSignedTransaction(signedTx, onBeforePublish);
152
- tx = signedTx;
153
- }
154
- const confirmPromise = this.confirmTransaction(tx, abortSignal);
155
- this.logger.debug("sendAndConfirm(): transaction sent (" + (i + 1) + "/" + txs.length + "): " + tx.hash);
156
- //Don't await the last promise when !waitForConfirmation
157
- if (i < txs.length - 1 || waitForConfirmation)
158
- await confirmPromise;
159
- txIds.push(tx.hash);
160
- }
161
- }
162
- this.logger.info("sendAndConfirm(): sent transactions, count: " + txs.length +
163
- " waitForConfirmation: " + waitForConfirmation + " parallel: " + parallel);
164
- return txIds;
165
- }
166
- /**
167
- * Serializes the signed EVM transaction
168
- *
169
- * @param tx
170
- */
171
- serializeTx(tx) {
172
- return Promise.resolve(tx.serialized);
173
- }
174
- /**
175
- * Deserializes signed EVM transaction
176
- *
177
- * @param txData
178
- */
179
- deserializeTx(txData) {
180
- return Promise.resolve(ethers_1.Transaction.from(txData));
181
- }
182
- /**
183
- * Gets the status of the raw starknet transaction
184
- *
185
- * @param tx
186
- */
187
- async getTxStatus(tx) {
188
- const parsedTx = await this.deserializeTx(tx);
189
- return await this.getTxIdStatus(parsedTx.hash);
190
- }
191
- /**
192
- * Gets the status of the starknet transaction with a specific txId
193
- *
194
- * @param txId
195
- */
196
- async getTxIdStatus(txId) {
197
- const txResponse = await this.provider.getTransaction(txId);
198
- if (txResponse == null)
199
- return "not_found";
200
- if (txResponse.blockHash == null)
201
- return "pending";
202
- const [safeBlockNumber, txReceipt] = await Promise.all([
203
- this.root.config.safeBlockTag === "latest" ? Promise.resolve(null) : this.provider.getBlock(this.root.config.safeBlockTag).then(res => res.number),
204
- this.provider.getTransactionReceipt(txId)
205
- ]);
206
- if (txReceipt == null || (safeBlockNumber != null && txReceipt.blockNumber > safeBlockNumber))
207
- return "pending";
208
- if (txReceipt.status === 0)
209
- return "reverted";
210
- return "success";
211
- }
212
- onBeforeTxSigned(callback) {
213
- this.cbkBeforeTxSigned = callback;
214
- }
215
- offBeforeTxSigned(callback) {
216
- this.cbkBeforeTxSigned = null;
217
- return true;
218
- }
219
- onSendTransaction(callback) {
220
- this.cbkSendTransaction = callback;
221
- }
222
- offSendTransaction(callback) {
223
- this.cbkSendTransaction = null;
224
- return true;
225
- }
226
- traceTransaction(txId) {
227
- return this.provider.send("debug_traceTransaction", [
228
- txId,
229
- {
230
- tracer: "callTracer"
231
- }
232
- ]);
233
- }
234
- }
235
- exports.EVMTransactions = EVMTransactions;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EVMTransactions = void 0;
4
+ const EVMModule_1 = require("../EVMModule");
5
+ const ethers_1 = require("ethers");
6
+ const Utils_1 = require("../../../utils/Utils");
7
+ const MAX_UNCONFIRMED_TXNS = 10;
8
+ class EVMTransactions extends EVMModule_1.EVMModule {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.latestConfirmedNonces = {};
12
+ }
13
+ /**
14
+ * Waits for transaction confirmation using WS subscription and occasional HTTP polling, also re-sends
15
+ * the transaction at regular interval
16
+ *
17
+ * @param tx EVM transaction to wait for confirmation for
18
+ * @param abortSignal signal to abort waiting for tx confirmation
19
+ * @private
20
+ */
21
+ async confirmTransaction(tx, abortSignal) {
22
+ let state = "pending";
23
+ while (state === "pending" || state === "not_found") {
24
+ await (0, Utils_1.timeoutPromise)(3000, abortSignal);
25
+ state = await this.getTxIdStatus(tx.hash);
26
+ //Don't re-send transactions
27
+ // if(state==="not_found") await this.sendSignedTransaction(tx).catch(e => {
28
+ // if(e.baseError?.code === 59) return; //Transaction already in the mempool
29
+ // this.logger.error("confirmTransaction(): Error on transaction re-send: ", e);
30
+ // });
31
+ }
32
+ const nextAccountNonce = tx.nonce + 1;
33
+ const currentNonce = this.latestConfirmedNonces[tx.from];
34
+ if (currentNonce == null || nextAccountNonce > currentNonce) {
35
+ this.latestConfirmedNonces[tx.from] = nextAccountNonce;
36
+ }
37
+ if (state === "reverted")
38
+ throw new Error("Transaction reverted!");
39
+ }
40
+ /**
41
+ * Prepares starknet transactions, checks if the account is deployed, assigns nonces if needed & calls beforeTxSigned callback
42
+ *
43
+ * @param signer
44
+ * @param txs
45
+ * @private
46
+ */
47
+ async prepareTransactions(signer, txs) {
48
+ let nonce = (await signer.getNonce()) ?? await this.root.provider.getTransactionCount(signer.getAddress(), "pending");
49
+ const latestConfirmedNonce = this.latestConfirmedNonces[signer.getAddress()];
50
+ if (latestConfirmedNonce != null && latestConfirmedNonce > nonce) {
51
+ this.logger.debug("prepareTransactions(): Using nonce from local cache!");
52
+ nonce = latestConfirmedNonce;
53
+ }
54
+ for (let i = 0; i < txs.length; i++) {
55
+ const tx = txs[i];
56
+ tx.chainId = this.root.evmChainId;
57
+ tx.from = signer.getAddress();
58
+ if (tx.nonce != null)
59
+ nonce = tx.nonce; //Take the nonce from last tx
60
+ if (nonce == null)
61
+ nonce = await this.root.provider.getTransactionCount(signer.getAddress(), "pending"); //Fetch the nonce
62
+ if (tx.nonce == null)
63
+ tx.nonce = nonce;
64
+ this.logger.debug("sendAndConfirm(): transaction prepared (" + (i + 1) + "/" + txs.length + "), nonce: " + tx.nonce);
65
+ nonce++;
66
+ if (this.cbkBeforeTxSigned != null)
67
+ await this.cbkBeforeTxSigned(tx);
68
+ }
69
+ }
70
+ /**
71
+ * Sends out a signed transaction to the RPC
72
+ *
73
+ * @param tx EVM tx to send
74
+ * @param onBeforePublish a callback called before every transaction is published
75
+ * @private
76
+ */
77
+ async sendSignedTransaction(tx, onBeforePublish) {
78
+ if (onBeforePublish != null)
79
+ await onBeforePublish(tx.hash, await this.serializeTx(tx));
80
+ this.logger.debug("sendSignedTransaction(): sending transaction: ", tx.hash);
81
+ const serializedTx = tx.serialized;
82
+ let result;
83
+ if (this.cbkSendTransaction != null)
84
+ result = await this.cbkSendTransaction(serializedTx);
85
+ if (result == null) {
86
+ const broadcastResult = await this.provider.broadcastTransaction(tx.serialized);
87
+ result = broadcastResult.hash;
88
+ }
89
+ this.logger.info("sendSignedTransaction(): tx sent, txHash: " + result);
90
+ return result;
91
+ }
92
+ /**
93
+ * Prepares, signs, sends (in parallel or sequentially) & optionally waits for confirmation
94
+ * of a batch of EVM transactions
95
+ *
96
+ * @param signer
97
+ * @param txs transactions to send
98
+ * @param waitForConfirmation whether to wait for transaction confirmations (this also makes sure the transactions
99
+ * are re-sent at regular intervals)
100
+ * @param abortSignal abort signal to abort waiting for transaction confirmations
101
+ * @param parallel whether the send all the transaction at once in parallel or sequentially (such that transactions
102
+ * are executed in order)
103
+ * @param onBeforePublish a callback called before every transaction is published, NOTE: callback is not called when using browser-based wallet!
104
+ */
105
+ async sendAndConfirm(signer, txs, waitForConfirmation, abortSignal, parallel, onBeforePublish) {
106
+ await this.prepareTransactions(signer, txs);
107
+ const signedTxs = [];
108
+ //Don't separate the signing process from the sending when using browser-based wallet
109
+ if (!signer.isBrowserWallet)
110
+ for (let i = 0; i < txs.length; i++) {
111
+ const tx = txs[i];
112
+ const signedTx = ethers_1.Transaction.from(await signer.account.signTransaction(tx));
113
+ signedTxs.push(signedTx);
114
+ this.logger.debug("sendAndConfirm(): transaction signed (" + (i + 1) + "/" + txs.length + "): " + signedTx);
115
+ }
116
+ this.logger.debug("sendAndConfirm(): sending transactions, count: " + txs.length +
117
+ " waitForConfirmation: " + waitForConfirmation + " parallel: " + parallel);
118
+ const txIds = [];
119
+ if (parallel) {
120
+ let promises = [];
121
+ for (let i = 0; i < txs.length; i++) {
122
+ let tx;
123
+ if (signer.isBrowserWallet) {
124
+ tx = await signer.account.sendTransaction(txs[i]);
125
+ }
126
+ else {
127
+ const signedTx = signedTxs[i];
128
+ await this.sendSignedTransaction(signedTx, onBeforePublish);
129
+ tx = signedTx;
130
+ }
131
+ if (waitForConfirmation)
132
+ promises.push(this.confirmTransaction(tx, abortSignal));
133
+ txIds.push(tx.hash);
134
+ this.logger.debug("sendAndConfirm(): transaction sent (" + (i + 1) + "/" + signedTxs.length + "): " + tx.hash);
135
+ if (promises.length >= MAX_UNCONFIRMED_TXNS) {
136
+ await Promise.all(promises);
137
+ promises = [];
138
+ }
139
+ }
140
+ if (promises.length > 0)
141
+ await Promise.all(promises);
142
+ }
143
+ else {
144
+ for (let i = 0; i < txs.length; i++) {
145
+ let tx;
146
+ if (signer.isBrowserWallet) {
147
+ tx = await signer.account.sendTransaction(txs[i]);
148
+ }
149
+ else {
150
+ const signedTx = signedTxs[i];
151
+ await this.sendSignedTransaction(signedTx, onBeforePublish);
152
+ tx = signedTx;
153
+ }
154
+ const confirmPromise = this.confirmTransaction(tx, abortSignal);
155
+ this.logger.debug("sendAndConfirm(): transaction sent (" + (i + 1) + "/" + txs.length + "): " + tx.hash);
156
+ //Don't await the last promise when !waitForConfirmation
157
+ if (i < txs.length - 1 || waitForConfirmation)
158
+ await confirmPromise;
159
+ txIds.push(tx.hash);
160
+ }
161
+ }
162
+ this.logger.info("sendAndConfirm(): sent transactions, count: " + txs.length +
163
+ " waitForConfirmation: " + waitForConfirmation + " parallel: " + parallel);
164
+ return txIds;
165
+ }
166
+ /**
167
+ * Serializes the signed EVM transaction
168
+ *
169
+ * @param tx
170
+ */
171
+ serializeTx(tx) {
172
+ return Promise.resolve(tx.serialized);
173
+ }
174
+ /**
175
+ * Deserializes signed EVM transaction
176
+ *
177
+ * @param txData
178
+ */
179
+ deserializeTx(txData) {
180
+ return Promise.resolve(ethers_1.Transaction.from(txData));
181
+ }
182
+ /**
183
+ * Gets the status of the raw starknet transaction
184
+ *
185
+ * @param tx
186
+ */
187
+ async getTxStatus(tx) {
188
+ const parsedTx = await this.deserializeTx(tx);
189
+ return await this.getTxIdStatus(parsedTx.hash);
190
+ }
191
+ /**
192
+ * Gets the status of the starknet transaction with a specific txId
193
+ *
194
+ * @param txId
195
+ */
196
+ async getTxIdStatus(txId) {
197
+ const txResponse = await this.provider.getTransaction(txId);
198
+ if (txResponse == null)
199
+ return "not_found";
200
+ if (txResponse.blockHash == null)
201
+ return "pending";
202
+ const [safeBlockNumber, txReceipt] = await Promise.all([
203
+ this.root.config.safeBlockTag === "latest" ? Promise.resolve(null) : this.provider.getBlock(this.root.config.safeBlockTag).then(res => res.number),
204
+ this.provider.getTransactionReceipt(txId)
205
+ ]);
206
+ if (txReceipt == null || (safeBlockNumber != null && txReceipt.blockNumber > safeBlockNumber))
207
+ return "pending";
208
+ if (txReceipt.status === 0)
209
+ return "reverted";
210
+ return "success";
211
+ }
212
+ onBeforeTxSigned(callback) {
213
+ this.cbkBeforeTxSigned = callback;
214
+ }
215
+ offBeforeTxSigned(callback) {
216
+ this.cbkBeforeTxSigned = null;
217
+ return true;
218
+ }
219
+ onSendTransaction(callback) {
220
+ this.cbkSendTransaction = callback;
221
+ }
222
+ offSendTransaction(callback) {
223
+ this.cbkSendTransaction = null;
224
+ return true;
225
+ }
226
+ traceTransaction(txId) {
227
+ return this.provider.send("debug_traceTransaction", [
228
+ txId,
229
+ {
230
+ tracer: "callTracer"
231
+ }
232
+ ]);
233
+ }
234
+ }
235
+ exports.EVMTransactions = EVMTransactions;
@@ -1,22 +1,22 @@
1
- import { BaseContract, Log, TransactionDescription } from "ethers";
2
- import { EVMChainInterface } from "../chain/EVMChainInterface";
3
- import { EVMContractEvents } from "./modules/EVMContractEvents";
4
- import { TypedContractMethod, TypedEventLog } from "../typechain/common";
5
- type __TypechainOutputObject<T> = T extends TypedContractMethod<infer V> ? V : never;
6
- export interface TypedFunctionCall<TCMethod extends TypedContractMethod> extends Omit<TransactionDescription, "args"> {
7
- args: __TypechainOutputObject<TCMethod>;
8
- }
9
- /**
10
- * Base class providing program specific utilities
11
- */
12
- export declare class EVMContractBase<T extends BaseContract> {
13
- contract: T;
14
- readonly Events: EVMContractEvents<T>;
15
- readonly Chain: EVMChainInterface<any>;
16
- readonly contractAddress: string;
17
- readonly contractDeploymentHeight: number;
18
- constructor(chainInterface: EVMChainInterface<any>, contractAddress: string, contractAbi: any, contractDeploymentHeight?: number);
19
- toTypedEvent<TEventName extends keyof T["filters"] = keyof T["filters"]>(log: Log): TypedEventLog<T["filters"][TEventName]>;
20
- parseCalldata<TMethod extends TypedContractMethod>(calldata: string): TypedFunctionCall<TMethod>;
21
- }
22
- export {};
1
+ import { BaseContract, Log, TransactionDescription } from "ethers";
2
+ import { EVMChainInterface } from "../chain/EVMChainInterface";
3
+ import { EVMContractEvents } from "./modules/EVMContractEvents";
4
+ import { TypedContractMethod, TypedEventLog } from "../typechain/common";
5
+ type __TypechainOutputObject<T> = T extends TypedContractMethod<infer V> ? V : never;
6
+ export interface TypedFunctionCall<TCMethod extends TypedContractMethod> extends Omit<TransactionDescription, "args"> {
7
+ args: __TypechainOutputObject<TCMethod>;
8
+ }
9
+ /**
10
+ * Base class providing program specific utilities
11
+ */
12
+ export declare class EVMContractBase<T extends BaseContract> {
13
+ contract: T;
14
+ readonly Events: EVMContractEvents<T>;
15
+ readonly Chain: EVMChainInterface<any>;
16
+ readonly contractAddress: string;
17
+ readonly contractDeploymentHeight: number;
18
+ constructor(chainInterface: EVMChainInterface<any>, contractAddress: string, contractAbi: any, contractDeploymentHeight?: number);
19
+ toTypedEvent<TEventName extends keyof T["filters"] = keyof T["filters"]>(log: Log): TypedEventLog<T["filters"][TEventName]>;
20
+ parseCalldata<TMethod extends TypedContractMethod>(calldata: string): TypedFunctionCall<TMethod>;
21
+ }
22
+ export {};
@@ -1,34 +1,34 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EVMContractBase = void 0;
4
- const ethers_1 = require("ethers");
5
- const EVMContractEvents_1 = require("./modules/EVMContractEvents");
6
- /**
7
- * Base class providing program specific utilities
8
- */
9
- class EVMContractBase {
10
- constructor(chainInterface, contractAddress, contractAbi, contractDeploymentHeight) {
11
- this.Chain = chainInterface;
12
- this.contract = new ethers_1.Contract(contractAddress, contractAbi, chainInterface.provider);
13
- this.Events = new EVMContractEvents_1.EVMContractEvents(chainInterface, this);
14
- this.contractAddress = contractAddress;
15
- this.contractDeploymentHeight = contractDeploymentHeight;
16
- }
17
- toTypedEvent(log) {
18
- let foundFragment;
19
- try {
20
- foundFragment = this.contract.interface.getEvent(log.topics[0]);
21
- }
22
- catch (error) { }
23
- if (!foundFragment)
24
- return null;
25
- try {
26
- return new ethers_1.EventLog(log, this.contract.interface, foundFragment);
27
- }
28
- catch (error) { }
29
- }
30
- parseCalldata(calldata) {
31
- return this.contract.interface.parseTransaction({ data: calldata });
32
- }
33
- }
34
- exports.EVMContractBase = EVMContractBase;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EVMContractBase = void 0;
4
+ const ethers_1 = require("ethers");
5
+ const EVMContractEvents_1 = require("./modules/EVMContractEvents");
6
+ /**
7
+ * Base class providing program specific utilities
8
+ */
9
+ class EVMContractBase {
10
+ constructor(chainInterface, contractAddress, contractAbi, contractDeploymentHeight) {
11
+ this.Chain = chainInterface;
12
+ this.contract = new ethers_1.Contract(contractAddress, contractAbi, chainInterface.provider);
13
+ this.Events = new EVMContractEvents_1.EVMContractEvents(chainInterface, this);
14
+ this.contractAddress = contractAddress;
15
+ this.contractDeploymentHeight = contractDeploymentHeight;
16
+ }
17
+ toTypedEvent(log) {
18
+ let foundFragment;
19
+ try {
20
+ foundFragment = this.contract.interface.getEvent(log.topics[0]);
21
+ }
22
+ catch (error) { }
23
+ if (!foundFragment)
24
+ return null;
25
+ try {
26
+ return new ethers_1.EventLog(log, this.contract.interface, foundFragment);
27
+ }
28
+ catch (error) { }
29
+ }
30
+ parseCalldata(calldata) {
31
+ return this.contract.interface.parseTransaction({ data: calldata });
32
+ }
33
+ }
34
+ exports.EVMContractBase = EVMContractBase;
@@ -1,8 +1,8 @@
1
- import { BaseContract } from "ethers";
2
- import { EVMModule } from "../chain/EVMModule";
3
- import { EVMChainInterface } from "../chain/EVMChainInterface";
4
- import { EVMContractBase } from "./EVMContractBase";
5
- export declare class EVMContractModule<T extends BaseContract> extends EVMModule<any> {
6
- readonly contract: EVMContractBase<T>;
7
- constructor(chainInterface: EVMChainInterface<any>, contract: EVMContractBase<T>);
8
- }
1
+ import { BaseContract } from "ethers";
2
+ import { EVMModule } from "../chain/EVMModule";
3
+ import { EVMChainInterface } from "../chain/EVMChainInterface";
4
+ import { EVMContractBase } from "./EVMContractBase";
5
+ export declare class EVMContractModule<T extends BaseContract> extends EVMModule<any> {
6
+ readonly contract: EVMContractBase<T>;
7
+ constructor(chainInterface: EVMChainInterface<any>, contract: EVMContractBase<T>);
8
+ }
@@ -1,11 +1,11 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EVMContractModule = void 0;
4
- const EVMModule_1 = require("../chain/EVMModule");
5
- class EVMContractModule extends EVMModule_1.EVMModule {
6
- constructor(chainInterface, contract) {
7
- super(chainInterface);
8
- this.contract = contract;
9
- }
10
- }
11
- exports.EVMContractModule = EVMContractModule;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EVMContractModule = void 0;
4
+ const EVMModule_1 = require("../chain/EVMModule");
5
+ class EVMContractModule extends EVMModule_1.EVMModule {
6
+ constructor(chainInterface, contract) {
7
+ super(chainInterface);
8
+ this.contract = contract;
9
+ }
10
+ }
11
+ exports.EVMContractModule = EVMContractModule;