@atomiqlabs/chain-starknet 1.0.7 → 1.0.9

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.
@@ -15,12 +15,12 @@ class StarknetTransactions extends StarknetModule_1.StarknetModule {
15
15
  async confirmTransaction(tx, abortSignal) {
16
16
  let state = "pending";
17
17
  while (state === "pending" || state === "not_found") {
18
- await (0, Utils_1.timeoutPromise)(3, abortSignal);
18
+ await (0, Utils_1.timeoutPromise)(3000, abortSignal);
19
19
  state = await this.getTxIdStatus(tx.txId);
20
20
  if (state === "not_found" && tx.signed != null)
21
21
  await this.sendSignedTransaction(tx, undefined, undefined, false).catch(e => {
22
- if (e.message != null && e.message.includes("59: A transaction with the same hash already exists in the mempool"))
23
- return;
22
+ if (e.baseError?.code === 59)
23
+ return; //Transaction already in the mempool
24
24
  console.error("Error on transaction re-send: ", e);
25
25
  });
26
26
  }
@@ -53,9 +53,10 @@ export declare class StarknetChainEventsBrowser implements ChainEvents<StarknetS
53
53
  * @param events
54
54
  * @param currentBlockNumber
55
55
  * @param currentBlockTimestamp
56
+ * @param pendingEventTime
56
57
  * @protected
57
58
  */
58
- protected processEvents(events: StarknetAbiEvent<EscrowManagerAbiType, "escrow_manager::events::Initialize" | "escrow_manager::events::Refund" | "escrow_manager::events::Claim">[], currentBlockNumber: number, currentBlockTimestamp: number): Promise<void>;
59
+ protected processEvents(events: StarknetAbiEvent<EscrowManagerAbiType, "escrow_manager::events::Initialize" | "escrow_manager::events::Refund" | "escrow_manager::events::Claim">[], currentBlockNumber: number, currentBlockTimestamp: number, pendingEventTime: number): Promise<void>;
59
60
  protected checkEvents(lastBlockNumber: number, lastTxHash: string): Promise<{
60
61
  txHash: string;
61
62
  blockNumber: number;
@@ -96,11 +96,14 @@ class StarknetChainEventsBrowser {
96
96
  * @param events
97
97
  * @param currentBlockNumber
98
98
  * @param currentBlockTimestamp
99
+ * @param pendingEventTime
99
100
  * @protected
100
101
  */
101
- async processEvents(events, currentBlockNumber, currentBlockTimestamp) {
102
+ async processEvents(events, currentBlockNumber, currentBlockTimestamp, pendingEventTime) {
102
103
  const blockTimestampsCache = {};
103
104
  const getBlockTimestamp = async (blockNumber) => {
105
+ if (blockNumber === currentBlockNumber)
106
+ return currentBlockTimestamp;
104
107
  const blockNumberString = blockNumber.toString();
105
108
  blockTimestampsCache[blockNumberString] ?? (blockTimestampsCache[blockNumberString] = (await this.provider.getBlockWithTxHashes(blockNumber)).timestamp);
106
109
  return blockTimestampsCache[blockNumberString];
@@ -119,7 +122,7 @@ class StarknetChainEventsBrowser {
119
122
  parsedEvent = this.parseInitializeEvent(event);
120
123
  break;
121
124
  }
122
- const timestamp = (event.blockNumber == null || event.blockNumber === currentBlockNumber) ? currentBlockTimestamp : await getBlockTimestamp(event.blockNumber);
125
+ const timestamp = event.blockNumber == null ? pendingEventTime : await getBlockTimestamp(event.blockNumber);
123
126
  parsedEvent.meta = {
124
127
  blockTime: timestamp,
125
128
  txId: event.txHash,
@@ -132,31 +135,23 @@ class StarknetChainEventsBrowser {
132
135
  }
133
136
  }
134
137
  async checkEvents(lastBlockNumber, lastTxHash) {
135
- //Get pending events
136
- let pendingEvents = await this.starknetSwapContract.Events.getContractBlockEvents(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], []);
137
- if (lastTxHash != null) {
138
- const latestProcessedEventIndex = (0, Utils_1.findLastIndex)(pendingEvents, val => val.txHash === lastTxHash);
139
- if (latestProcessedEventIndex !== -1)
140
- pendingEvents.splice(0, latestProcessedEventIndex + 1);
141
- }
142
- if (pendingEvents.length > 0) {
143
- await this.processEvents(pendingEvents, null, Math.floor(Date.now() / 1000));
144
- lastTxHash = pendingEvents[pendingEvents.length - 1].txHash;
145
- }
146
138
  const currentBlock = await this.provider.getBlockWithTxHashes("latest");
147
139
  const currentBlockNumber = currentBlock.block_number;
148
- if (lastBlockNumber != null && currentBlockNumber > lastBlockNumber) {
149
- const events = await this.starknetSwapContract.Events.getContractBlockEvents(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], [], lastBlockNumber + 1, currentBlockNumber);
150
- if (lastTxHash != null) {
151
- const latestProcessedEventIndex = (0, Utils_1.findLastIndex)(events, val => val.txHash === lastTxHash);
152
- if (latestProcessedEventIndex !== -1)
153
- events.splice(0, latestProcessedEventIndex + 1);
154
- }
155
- if (events.length > 0) {
156
- await this.processEvents(events, currentBlockNumber, currentBlock.timestamp);
157
- lastTxHash = events[events.length - 1].txHash;
140
+ lastBlockNumber ?? (lastBlockNumber = currentBlockNumber);
141
+ const logStartHeight = currentBlockNumber > lastBlockNumber ? lastBlockNumber + 1 : lastBlockNumber;
142
+ this.logger.debug("checkEvents(): Requesting logs: " + logStartHeight + "...pending");
143
+ const events = await this.starknetSwapContract.Events.getContractBlockEvents(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], [], logStartHeight, null);
144
+ if (lastTxHash != null) {
145
+ const latestProcessedEventIndex = (0, Utils_1.findLastIndex)(events, val => val.txHash === lastTxHash);
146
+ if (latestProcessedEventIndex !== -1) {
147
+ events.splice(0, latestProcessedEventIndex + 1);
148
+ this.logger.debug("checkEvents(): Splicing processed events, resulting size: " + events.length);
158
149
  }
159
150
  }
151
+ if (events.length > 0) {
152
+ await this.processEvents(events, currentBlockNumber, currentBlock.timestamp, Math.floor(Date.now() / 1000));
153
+ lastTxHash = events[events.length - 1].txHash;
154
+ }
160
155
  return {
161
156
  txHash: lastTxHash,
162
157
  blockNumber: currentBlockNumber
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atomiqlabs/chain-starknet",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "Starknet specific base implementation",
5
5
  "main": "./dist/index.js",
6
6
  "types:": "./dist/index.d.ts",
@@ -36,10 +36,10 @@ export class StarknetTransactions extends StarknetModule {
36
36
  private async confirmTransaction(tx: StarknetTx, abortSignal?: AbortSignal) {
37
37
  let state = "pending";
38
38
  while(state==="pending" || state==="not_found") {
39
- await timeoutPromise(3, abortSignal);
39
+ await timeoutPromise(3000, abortSignal);
40
40
  state = await this.getTxIdStatus(tx.txId);
41
41
  if(state==="not_found" && tx.signed!=null) await this.sendSignedTransaction(tx, undefined, undefined, false).catch(e => {
42
- if(e.message!=null && e.message.includes("59: A transaction with the same hash already exists in the mempool")) return;
42
+ if(e.baseError?.code === 59) return; //Transaction already in the mempool
43
43
  console.error("Error on transaction re-send: ", e);
44
44
  });
45
45
  }
@@ -152,6 +152,7 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
152
152
  * @param events
153
153
  * @param currentBlockNumber
154
154
  * @param currentBlockTimestamp
155
+ * @param pendingEventTime
155
156
  * @protected
156
157
  */
157
158
  protected async processEvents(
@@ -160,10 +161,12 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
160
161
  "escrow_manager::events::Initialize" | "escrow_manager::events::Refund" | "escrow_manager::events::Claim"
161
162
  >[],
162
163
  currentBlockNumber: number,
163
- currentBlockTimestamp: number
164
+ currentBlockTimestamp: number,
165
+ pendingEventTime: number
164
166
  ) {
165
167
  const blockTimestampsCache: {[blockNumber: string]: number} = {};
166
168
  const getBlockTimestamp: (blockNumber: number) => Promise<number> = async (blockNumber: number)=> {
169
+ if(blockNumber===currentBlockNumber) return currentBlockTimestamp;
167
170
  const blockNumberString = blockNumber.toString();
168
171
  blockTimestampsCache[blockNumberString] ??= (await this.provider.getBlockWithTxHashes(blockNumber)).timestamp;
169
172
  return blockTimestampsCache[blockNumberString];
@@ -184,7 +187,7 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
184
187
  parsedEvent = this.parseInitializeEvent(event as any);
185
188
  break;
186
189
  }
187
- const timestamp = (event.blockNumber==null || event.blockNumber===currentBlockNumber) ? currentBlockTimestamp : await getBlockTimestamp(event.blockNumber);
190
+ const timestamp = event.blockNumber==null ? pendingEventTime : await getBlockTimestamp(event.blockNumber);
188
191
  parsedEvent.meta = {
189
192
  blockTime: timestamp,
190
193
  txId: event.txHash,
@@ -199,38 +202,29 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
199
202
  }
200
203
 
201
204
  protected async checkEvents(lastBlockNumber: number, lastTxHash: string): Promise<{txHash: string, blockNumber: number}> {
202
- //Get pending events
203
- let pendingEvents = await this.starknetSwapContract.Events.getContractBlockEvents(
205
+ const currentBlock = await this.provider.getBlockWithTxHashes("latest");
206
+ const currentBlockNumber: number = (currentBlock as any).block_number;
207
+ lastBlockNumber ??= currentBlockNumber;
208
+ const logStartHeight = currentBlockNumber>lastBlockNumber ? lastBlockNumber+1 : lastBlockNumber;
209
+ this.logger.debug("checkEvents(): Requesting logs: "+logStartHeight+"...pending");
210
+ const events = await this.starknetSwapContract.Events.getContractBlockEvents(
204
211
  ["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"],
205
- []
212
+ [],
213
+ logStartHeight,
214
+ null
206
215
  );
207
216
  if(lastTxHash!=null) {
208
- const latestProcessedEventIndex = findLastIndex(pendingEvents, val => val.txHash===lastTxHash);
209
- if(latestProcessedEventIndex!==-1) pendingEvents.splice(0, latestProcessedEventIndex+1);
217
+ const latestProcessedEventIndex = findLastIndex(events, val => val.txHash === lastTxHash);
218
+ if (latestProcessedEventIndex !== -1) {
219
+ events.splice(0, latestProcessedEventIndex + 1);
220
+ this.logger.debug("checkEvents(): Splicing processed events, resulting size: "+events.length);
221
+ }
210
222
  }
211
- if(pendingEvents.length>0) {
212
- await this.processEvents(pendingEvents, null, Math.floor(Date.now()/1000));
213
- lastTxHash = pendingEvents[pendingEvents.length-1].txHash;
223
+ if(events.length>0) {
224
+ await this.processEvents(events, currentBlockNumber, currentBlock.timestamp, Math.floor(Date.now()/1000));
225
+ lastTxHash = events[events.length - 1].txHash;
214
226
  }
215
227
 
216
- const currentBlock = await this.provider.getBlockWithTxHashes("latest");
217
- const currentBlockNumber: number = (currentBlock as any).block_number;
218
- if(lastBlockNumber!=null && currentBlockNumber>lastBlockNumber) {
219
- const events = await this.starknetSwapContract.Events.getContractBlockEvents(
220
- ["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"],
221
- [],
222
- lastBlockNumber+1,
223
- currentBlockNumber
224
- );
225
- if(lastTxHash!=null) {
226
- const latestProcessedEventIndex = findLastIndex(events, val => val.txHash === lastTxHash);
227
- if (latestProcessedEventIndex !== -1) events.splice(0, latestProcessedEventIndex + 1);
228
- }
229
- if(events.length>0) {
230
- await this.processEvents(events, currentBlockNumber, currentBlock.timestamp);
231
- lastTxHash = events[events.length - 1].txHash;
232
- }
233
- }
234
228
  return {
235
229
  txHash: lastTxHash,
236
230
  blockNumber: currentBlockNumber