@atomiqlabs/chain-starknet 7.0.2 → 7.0.4

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.
@@ -13,7 +13,7 @@ function starknetGasAdd(a, b) {
13
13
  }
14
14
  exports.starknetGasAdd = starknetGasAdd;
15
15
  class StarknetFees {
16
- constructor(provider, maxFeeRate = { l1GasCost: 1000000000000000n, l2GasCost: 1000000000000000n, l1DataGasCost: 1000000000000000n } /*100 * 10000 GWei*/, feeMultiplier = 1.25, da) {
16
+ constructor(provider, maxFeeRate = { l1GasCost: 20000000000000000n, l2GasCost: 4000000000000000n, l1DataGasCost: 10000000000000000n }, feeMultiplier = 1.25, da) {
17
17
  this.logger = (0, Utils_1.getLogger)("StarknetFees: ");
18
18
  this.blockFeeCache = null;
19
19
  this.provider = provider;
@@ -18,22 +18,21 @@ class StarknetChainEvents extends StarknetChainEventsBrowser_1.StarknetChainEven
18
18
  async getLastEventData() {
19
19
  try {
20
20
  const txt = (await fs.readFile(this.directory + BLOCKHEIGHT_FILENAME)).toString();
21
- const arr = txt.split(";");
22
- if (arr.length < 2)
23
- return {
24
- blockNumber: parseInt(arr[0]),
25
- txHashes: null
26
- };
27
- return {
28
- blockNumber: parseInt(arr[0]),
29
- txHashes: arr.slice(1)
30
- };
21
+ const arr = txt.split(",");
22
+ if (arr.length < 2) {
23
+ const blockNumber = parseInt(arr[0].split(";")[0]);
24
+ return [
25
+ { lastBlockNumber: blockNumber, lastTxHash: null },
26
+ { lastBlockNumber: blockNumber, lastTxHash: null }
27
+ ];
28
+ }
29
+ return arr.map(arrValue => {
30
+ const subArray = arrValue.split(";");
31
+ return { lastBlockNumber: parseInt(subArray[0]), lastTxHash: subArray[1] };
32
+ });
31
33
  }
32
34
  catch (e) {
33
- return {
34
- blockNumber: null,
35
- txHashes: null
36
- };
35
+ return [];
37
36
  }
38
37
  }
39
38
  /**
@@ -41,12 +40,12 @@ class StarknetChainEvents extends StarknetChainEventsBrowser_1.StarknetChainEven
41
40
  *
42
41
  * @private
43
42
  */
44
- saveLastEventData(blockNumber, txHashes) {
45
- return fs.writeFile(this.directory + BLOCKHEIGHT_FILENAME, blockNumber.toString() + ";" + txHashes.join(";"));
43
+ saveLastEventData(newState) {
44
+ return fs.writeFile(this.directory + BLOCKHEIGHT_FILENAME, newState.map(value => value.lastTxHash == null ? value.lastBlockNumber.toString(10) : value.lastBlockNumber.toString(10) + ";" + value.lastTxHash).join(","));
46
45
  }
47
46
  async init() {
48
- const { blockNumber, txHashes } = await this.getLastEventData();
49
- await this.setupPoll(blockNumber, txHashes, (blockNumber, txHashes) => this.saveLastEventData(blockNumber, txHashes));
47
+ const lastEventsState = await this.getLastEventData();
48
+ await this.setupPoll(lastEventsState, (newState) => this.saveLastEventData(newState));
50
49
  }
51
50
  }
52
51
  exports.StarknetChainEvents = StarknetChainEvents;
@@ -15,6 +15,10 @@ export type StarknetTraceCall = {
15
15
  entry_point_selector: string;
16
16
  calls: StarknetTraceCall[];
17
17
  };
18
+ export type StarknetEventListenerState = {
19
+ lastBlockNumber: number;
20
+ lastTxHash?: string;
21
+ };
18
22
  /**
19
23
  * Starknet on-chain event handler for front-end systems without access to fs, uses WS or long-polling to subscribe, might lose
20
24
  * out on some events if the network is unreliable, front-end systems should take this into consideration and not
@@ -59,24 +63,21 @@ export declare class StarknetChainEventsBrowser implements ChainEvents<StarknetS
59
63
  * @protected
60
64
  */
61
65
  protected processEvents(events: (StarknetAbiEvent<EscrowManagerAbiType, "escrow_manager::events::Initialize" | "escrow_manager::events::Refund" | "escrow_manager::events::Claim"> | StarknetAbiEvent<SpvVaultContractAbiType, "spv_swap_vault::events::Opened" | "spv_swap_vault::events::Deposited" | "spv_swap_vault::events::Fronted" | "spv_swap_vault::events::Claimed" | "spv_swap_vault::events::Closed">)[], currentBlockNumber: number, currentBlockTimestamp: number): Promise<void>;
62
- protected checkEventsEcrowManager(lastTxHash: string, lastBlockNumber?: number, currentBlock?: {
66
+ protected checkEventsEcrowManager(currentBlock: {
63
67
  timestamp: number;
64
68
  block_number: number;
65
- }): Promise<string>;
66
- protected checkEventsSpvVaults(lastTxHash: string, lastBlockNumber?: number, currentBlock?: {
69
+ }, lastTxHash?: string, lastBlockNumber?: number): Promise<[string, number]>;
70
+ protected checkEventsSpvVaults(currentBlock: {
67
71
  timestamp: number;
68
72
  block_number: number;
69
- }): Promise<string>;
70
- protected checkEvents(lastBlockNumber: number, lastTxHashes: string[]): Promise<{
71
- txHashes: string[];
72
- blockNumber: number;
73
- }>;
73
+ }, lastTxHash?: string, lastBlockNumber?: number): Promise<[string, number]>;
74
+ protected checkEvents(lastState: StarknetEventListenerState[]): Promise<StarknetEventListenerState[]>;
74
75
  /**
75
76
  * Sets up event handlers listening for swap events over websocket
76
77
  *
77
78
  * @protected
78
79
  */
79
- protected setupPoll(lastBlockNumber?: number, lastTxHashes?: string[], saveLatestProcessedBlockNumber?: (blockNumber: number, lastTxHashes: string[]) => Promise<void>): Promise<void>;
80
+ protected setupPoll(lastState?: StarknetEventListenerState[], saveLatestProcessedBlockNumber?: (newState: StarknetEventListenerState[]) => Promise<void>): Promise<void>;
80
81
  init(): Promise<void>;
81
82
  stop(): Promise<void>;
82
83
  registerListener(cbk: EventListener<StarknetSwapData>): void;
@@ -4,6 +4,7 @@ exports.StarknetChainEventsBrowser = void 0;
4
4
  const base_1 = require("@atomiqlabs/base");
5
5
  const Utils_1 = require("../../utils/Utils");
6
6
  const starknet_1 = require("starknet");
7
+ const LOGS_SLIDING_WINDOW = 60;
7
8
  /**
8
9
  * Starknet on-chain event handler for front-end systems without access to fs, uses WS or long-polling to subscribe, might lose
9
10
  * out on some events if the network is unreliable, front-end systems should take this into consideration and not
@@ -213,67 +214,87 @@ class StarknetChainEventsBrowser {
213
214
  await listener(parsedEvents);
214
215
  }
215
216
  }
216
- async checkEventsEcrowManager(lastTxHash, lastBlockNumber, currentBlock) {
217
+ async checkEventsEcrowManager(currentBlock, lastTxHash, lastBlockNumber) {
217
218
  const currentBlockNumber = currentBlock.block_number;
218
219
  lastBlockNumber ?? (lastBlockNumber = currentBlockNumber);
220
+ if (currentBlockNumber < lastBlockNumber) {
221
+ this.logger.warn(`checkEventsEscrowManager(): Sanity check triggered - not processing events, currentBlock: ${currentBlockNumber}, lastBlock: ${lastBlockNumber}`);
222
+ return;
223
+ }
219
224
  // this.logger.debug("checkEvents(EscrowManager): Requesting logs: "+logStartHeight+"...pending");
220
225
  let events = await this.starknetSwapContract.Events.getContractBlockEvents(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], [], lastBlockNumber, null);
221
226
  if (lastTxHash != null) {
222
227
  const latestProcessedEventIndex = (0, Utils_1.findLastIndex)(events, val => val.txHash === lastTxHash);
223
228
  if (latestProcessedEventIndex !== -1) {
224
229
  events.splice(0, latestProcessedEventIndex + 1);
225
- // this.logger.debug("checkEvents(EscrowManager): Splicing processed events, resulting size: "+events.length);
230
+ this.logger.debug("checkEvents(EscrowManager): Splicing processed events, resulting size: " + events.length);
226
231
  }
227
232
  }
228
233
  if (events.length > 0) {
229
234
  await this.processEvents(events, currentBlock?.block_number, currentBlock?.timestamp);
230
- lastTxHash = events[events.length - 1].txHash;
235
+ const lastProcessed = events[events.length - 1];
236
+ lastTxHash = lastProcessed.txHash;
237
+ if (lastProcessed.blockNumber > lastBlockNumber)
238
+ lastBlockNumber = lastProcessed.blockNumber;
239
+ }
240
+ else if (currentBlockNumber - lastBlockNumber > LOGS_SLIDING_WINDOW) {
241
+ lastTxHash = null;
242
+ lastBlockNumber = currentBlockNumber - LOGS_SLIDING_WINDOW;
231
243
  }
232
- return lastTxHash;
244
+ return [lastTxHash, lastBlockNumber];
233
245
  }
234
- async checkEventsSpvVaults(lastTxHash, lastBlockNumber, currentBlock) {
246
+ async checkEventsSpvVaults(currentBlock, lastTxHash, lastBlockNumber) {
235
247
  const currentBlockNumber = currentBlock.block_number;
236
248
  lastBlockNumber ?? (lastBlockNumber = currentBlockNumber);
249
+ if (currentBlockNumber < lastBlockNumber) {
250
+ this.logger.warn(`checkEventsSpvVaults(): Sanity check triggered - not processing events, currentBlock: ${currentBlockNumber}, lastBlock: ${lastBlockNumber}`);
251
+ return;
252
+ }
237
253
  // this.logger.debug("checkEvents(SpvVaults): Requesting logs: "+logStartHeight+"...pending");
238
254
  let events = await this.starknetSpvVaultContract.Events.getContractBlockEvents(["spv_swap_vault::events::Opened", "spv_swap_vault::events::Deposited", "spv_swap_vault::events::Closed", "spv_swap_vault::events::Fronted", "spv_swap_vault::events::Claimed"], [], lastBlockNumber, null);
239
255
  if (lastTxHash != null) {
240
256
  const latestProcessedEventIndex = (0, Utils_1.findLastIndex)(events, val => val.txHash === lastTxHash);
241
257
  if (latestProcessedEventIndex !== -1) {
242
258
  events.splice(0, latestProcessedEventIndex + 1);
243
- // this.logger.debug("checkEvents(SpvVaults): Splicing processed events, resulting size: "+events.length);
259
+ this.logger.debug("checkEvents(SpvVaults): Splicing processed events, resulting size: " + events.length);
244
260
  }
245
261
  }
246
262
  if (events.length > 0) {
247
263
  await this.processEvents(events, currentBlock?.block_number, currentBlock?.timestamp);
248
- lastTxHash = events[events.length - 1].txHash;
264
+ const lastProcessed = events[events.length - 1];
265
+ lastTxHash = lastProcessed.txHash;
266
+ if (lastProcessed.blockNumber > lastBlockNumber)
267
+ lastBlockNumber = lastProcessed.blockNumber;
249
268
  }
250
- return lastTxHash;
269
+ else if (currentBlockNumber - lastBlockNumber > LOGS_SLIDING_WINDOW) {
270
+ lastTxHash = null;
271
+ lastBlockNumber = currentBlockNumber - LOGS_SLIDING_WINDOW;
272
+ }
273
+ return [lastTxHash, lastBlockNumber];
251
274
  }
252
- async checkEvents(lastBlockNumber, lastTxHashes) {
253
- lastTxHashes ?? (lastTxHashes = []);
275
+ async checkEvents(lastState) {
276
+ lastState ?? (lastState = []);
254
277
  const currentBlock = await this.provider.getBlockWithTxHashes(starknet_1.BlockTag.LATEST);
255
- const currentBlockNumber = currentBlock.block_number;
256
- lastTxHashes[0] = await this.checkEventsEcrowManager(lastTxHashes[0], lastBlockNumber, currentBlock);
257
- lastTxHashes[1] = await this.checkEventsSpvVaults(lastTxHashes[1], lastBlockNumber, currentBlock);
258
- return {
259
- txHashes: lastTxHashes,
260
- blockNumber: currentBlockNumber
261
- };
278
+ const [lastEscrowTxHash, lastEscrowHeight] = await this.checkEventsEcrowManager(currentBlock, lastState?.[0]?.lastTxHash, lastState?.[0]?.lastBlockNumber);
279
+ const [lastSpvVaultTxHash, lastSpvVaultHeight] = await this.checkEventsSpvVaults(currentBlock, lastState?.[1]?.lastTxHash, lastState?.[1]?.lastBlockNumber);
280
+ return [
281
+ { lastBlockNumber: lastEscrowHeight, lastTxHash: lastEscrowTxHash },
282
+ { lastBlockNumber: lastSpvVaultHeight, lastTxHash: lastSpvVaultTxHash }
283
+ ];
262
284
  }
263
285
  /**
264
286
  * Sets up event handlers listening for swap events over websocket
265
287
  *
266
288
  * @protected
267
289
  */
268
- async setupPoll(lastBlockNumber, lastTxHashes, saveLatestProcessedBlockNumber) {
290
+ async setupPoll(lastState, saveLatestProcessedBlockNumber) {
269
291
  this.stopped = false;
270
292
  let func;
271
293
  func = async () => {
272
- await this.checkEvents(lastBlockNumber, lastTxHashes).then(({ blockNumber, txHashes }) => {
273
- lastBlockNumber = blockNumber;
274
- lastTxHashes = txHashes;
294
+ await this.checkEvents(lastState).then(newState => {
295
+ lastState = newState;
275
296
  if (saveLatestProcessedBlockNumber != null)
276
- return saveLatestProcessedBlockNumber(blockNumber, lastTxHashes);
297
+ return saveLatestProcessedBlockNumber(newState);
277
298
  }).catch(e => {
278
299
  this.logger.error("setupPoll(): Failed to fetch starknet log: ", e);
279
300
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atomiqlabs/chain-starknet",
3
- "version": "7.0.2",
3
+ "version": "7.0.4",
4
4
  "description": "Starknet specific base implementation",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -41,7 +41,7 @@ export class StarknetFees {
41
41
 
42
42
  constructor(
43
43
  provider: Provider,
44
- maxFeeRate: StarknetFeeRate = {l1GasCost: 1_000_000_000_000_000n, l2GasCost: 1_000_000_000_000_000n, l1DataGasCost: 1_000_000_000_000_000n} /*100 * 10000 GWei*/,
44
+ maxFeeRate: StarknetFeeRate = {l1GasCost: 20_000_000_000_000_000n, l2GasCost: 4_000_000_000_000_000n, l1DataGasCost: 10_000_000_000_000_000n},
45
45
  feeMultiplier: number = 1.25,
46
46
  da?: {fee?: "L1" | "L2", nonce?: "L1" | "L2"}
47
47
  ) {
@@ -1,4 +1,4 @@
1
- import {StarknetChainEventsBrowser} from "./StarknetChainEventsBrowser";
1
+ import {StarknetChainEventsBrowser, StarknetEventListenerState} from "./StarknetChainEventsBrowser";
2
2
  //@ts-ignore
3
3
  import * as fs from "fs/promises";
4
4
  import {StarknetSwapContract} from "../swaps/StarknetSwapContract";
@@ -27,23 +27,24 @@ export class StarknetChainEvents extends StarknetChainEventsBrowser {
27
27
  *
28
28
  * @private
29
29
  */
30
- private async getLastEventData(): Promise<{blockNumber: number, txHashes: string[]}> {
30
+ private async getLastEventData(): Promise<StarknetEventListenerState[]> {
31
31
  try {
32
32
  const txt: string = (await fs.readFile(this.directory+BLOCKHEIGHT_FILENAME)).toString();
33
- const arr = txt.split(";");
34
- if(arr.length<2) return {
35
- blockNumber: parseInt(arr[0]),
36
- txHashes: null
37
- };
38
- return {
39
- blockNumber: parseInt(arr[0]),
40
- txHashes: arr.slice(1)
41
- };
33
+ const arr = txt.split(",");
34
+ if(arr.length<2) {
35
+ const blockNumber = parseInt(arr[0].split(";")[0]);
36
+ return [
37
+ {lastBlockNumber: blockNumber, lastTxHash: null},
38
+ {lastBlockNumber: blockNumber, lastTxHash: null}
39
+ ];
40
+ }
41
+
42
+ return arr.map(arrValue => {
43
+ const subArray = arrValue.split(";");
44
+ return {lastBlockNumber: parseInt(subArray[0]), lastTxHash: subArray[1]};
45
+ })
42
46
  } catch (e) {
43
- return {
44
- blockNumber: null,
45
- txHashes: null
46
- };
47
+ return [];
47
48
  }
48
49
  }
49
50
 
@@ -52,16 +53,15 @@ export class StarknetChainEvents extends StarknetChainEventsBrowser {
52
53
  *
53
54
  * @private
54
55
  */
55
- private saveLastEventData(blockNumber: number, txHashes: string[]): Promise<void> {
56
- return fs.writeFile(this.directory+BLOCKHEIGHT_FILENAME, blockNumber.toString()+";"+txHashes.join(";"));
56
+ private saveLastEventData(newState: StarknetEventListenerState[]): Promise<void> {
57
+ return fs.writeFile(this.directory+BLOCKHEIGHT_FILENAME, newState.map(value => value.lastTxHash==null ? value.lastBlockNumber.toString(10) : value.lastBlockNumber.toString(10)+";"+value.lastTxHash).join(","));
57
58
  }
58
59
 
59
60
  async init(): Promise<void> {
60
- const {blockNumber, txHashes} = await this.getLastEventData();
61
+ const lastEventsState = await this.getLastEventData();
61
62
  await this.setupPoll(
62
- blockNumber,
63
- txHashes,
64
- (blockNumber: number, txHashes: string[]) => this.saveLastEventData(blockNumber, txHashes)
63
+ lastEventsState,
64
+ (newState: StarknetEventListenerState[]) => this.saveLastEventData(newState)
65
65
  );
66
66
  }
67
67
 
@@ -26,6 +26,8 @@ import {StarknetSpvVaultContract} from "../spv_swap/StarknetSpvVaultContract";
26
26
  import {StarknetChainInterface} from "../chain/StarknetChainInterface";
27
27
  import {SpvVaultContractAbiType} from "../spv_swap/SpvVaultContractAbi";
28
28
 
29
+ const LOGS_SLIDING_WINDOW = 60;
30
+
29
31
  export type StarknetTraceCall = {
30
32
  calldata: string[],
31
33
  contract_address: string,
@@ -33,6 +35,8 @@ export type StarknetTraceCall = {
33
35
  calls: StarknetTraceCall[]
34
36
  };
35
37
 
38
+ export type StarknetEventListenerState = {lastBlockNumber: number, lastTxHash?: string};
39
+
36
40
  /**
37
41
  * Starknet on-chain event handler for front-end systems without access to fs, uses WS or long-polling to subscribe, might lose
38
42
  * out on some events if the network is unreliable, front-end systems should take this into consideration and not
@@ -306,9 +310,13 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
306
310
  }
307
311
  }
308
312
 
309
- protected async checkEventsEcrowManager(lastTxHash: string, lastBlockNumber?: number, currentBlock?: {timestamp: number, block_number: number}): Promise<string> {
310
- const currentBlockNumber: number = (currentBlock as any).block_number;
313
+ protected async checkEventsEcrowManager(currentBlock: {timestamp: number, block_number: number}, lastTxHash?: string, lastBlockNumber?: number): Promise<[string, number]> {
314
+ const currentBlockNumber: number = currentBlock.block_number;
311
315
  lastBlockNumber ??= currentBlockNumber;
316
+ if(currentBlockNumber < lastBlockNumber) {
317
+ this.logger.warn(`checkEventsEscrowManager(): Sanity check triggered - not processing events, currentBlock: ${currentBlockNumber}, lastBlock: ${lastBlockNumber}`);
318
+ return;
319
+ }
312
320
  // this.logger.debug("checkEvents(EscrowManager): Requesting logs: "+logStartHeight+"...pending");
313
321
  let events = await this.starknetSwapContract.Events.getContractBlockEvents(
314
322
  ["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"],
@@ -320,19 +328,28 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
320
328
  const latestProcessedEventIndex = findLastIndex(events, val => val.txHash===lastTxHash);
321
329
  if(latestProcessedEventIndex!==-1) {
322
330
  events.splice(0, latestProcessedEventIndex+1);
323
- // this.logger.debug("checkEvents(EscrowManager): Splicing processed events, resulting size: "+events.length);
331
+ this.logger.debug("checkEvents(EscrowManager): Splicing processed events, resulting size: "+events.length);
324
332
  }
325
333
  }
326
334
  if(events.length>0) {
327
335
  await this.processEvents(events, currentBlock?.block_number, currentBlock?.timestamp);
328
- lastTxHash = events[events.length-1].txHash;
336
+ const lastProcessed = events[events.length-1];
337
+ lastTxHash = lastProcessed.txHash;
338
+ if(lastProcessed.blockNumber > lastBlockNumber) lastBlockNumber = lastProcessed.blockNumber;
339
+ } else if(currentBlockNumber - lastBlockNumber > LOGS_SLIDING_WINDOW) {
340
+ lastTxHash = null;
341
+ lastBlockNumber = currentBlockNumber - LOGS_SLIDING_WINDOW;
329
342
  }
330
- return lastTxHash;
343
+ return [lastTxHash, lastBlockNumber];
331
344
  }
332
345
 
333
- protected async checkEventsSpvVaults(lastTxHash: string, lastBlockNumber?: number, currentBlock?: {timestamp: number, block_number: number}): Promise<string> {
334
- const currentBlockNumber: number = (currentBlock as any).block_number;
346
+ protected async checkEventsSpvVaults(currentBlock: {timestamp: number, block_number: number}, lastTxHash?: string, lastBlockNumber?: number): Promise<[string, number]> {
347
+ const currentBlockNumber: number = currentBlock.block_number;
335
348
  lastBlockNumber ??= currentBlockNumber;
349
+ if(currentBlockNumber < lastBlockNumber) {
350
+ this.logger.warn(`checkEventsSpvVaults(): Sanity check triggered - not processing events, currentBlock: ${currentBlockNumber}, lastBlock: ${lastBlockNumber}`);
351
+ return;
352
+ }
336
353
  // this.logger.debug("checkEvents(SpvVaults): Requesting logs: "+logStartHeight+"...pending");
337
354
  let events = await this.starknetSpvVaultContract.Events.getContractBlockEvents(
338
355
  ["spv_swap_vault::events::Opened", "spv_swap_vault::events::Deposited", "spv_swap_vault::events::Closed", "spv_swap_vault::events::Fronted", "spv_swap_vault::events::Claimed"],
@@ -344,29 +361,33 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
344
361
  const latestProcessedEventIndex = findLastIndex(events, val => val.txHash===lastTxHash);
345
362
  if(latestProcessedEventIndex!==-1) {
346
363
  events.splice(0, latestProcessedEventIndex+1);
347
- // this.logger.debug("checkEvents(SpvVaults): Splicing processed events, resulting size: "+events.length);
364
+ this.logger.debug("checkEvents(SpvVaults): Splicing processed events, resulting size: "+events.length);
348
365
  }
349
366
  }
350
367
  if(events.length>0) {
351
368
  await this.processEvents(events, currentBlock?.block_number, currentBlock?.timestamp);
352
- lastTxHash = events[events.length-1].txHash;
369
+ const lastProcessed = events[events.length-1];
370
+ lastTxHash = lastProcessed.txHash;
371
+ if(lastProcessed.blockNumber > lastBlockNumber) lastBlockNumber = lastProcessed.blockNumber;
372
+ } else if(currentBlockNumber - lastBlockNumber > LOGS_SLIDING_WINDOW) {
373
+ lastTxHash = null;
374
+ lastBlockNumber = currentBlockNumber - LOGS_SLIDING_WINDOW;
353
375
  }
354
- return lastTxHash;
376
+ return [lastTxHash, lastBlockNumber];
355
377
  }
356
378
 
357
- protected async checkEvents(lastBlockNumber: number, lastTxHashes: string[]): Promise<{txHashes: string[], blockNumber: number}> {
358
- lastTxHashes ??= [];
379
+ protected async checkEvents(lastState: StarknetEventListenerState[]): Promise<StarknetEventListenerState[]> {
380
+ lastState ??= [];
359
381
 
360
382
  const currentBlock = await this.provider.getBlockWithTxHashes(BlockTag.LATEST);
361
- const currentBlockNumber: number = currentBlock.block_number;
362
383
 
363
- lastTxHashes[0] = await this.checkEventsEcrowManager(lastTxHashes[0], lastBlockNumber, currentBlock as any);
364
- lastTxHashes[1] = await this.checkEventsSpvVaults(lastTxHashes[1], lastBlockNumber, currentBlock as any);
384
+ const [lastEscrowTxHash, lastEscrowHeight] = await this.checkEventsEcrowManager(currentBlock as any, lastState?.[0]?.lastTxHash, lastState?.[0]?.lastBlockNumber);
385
+ const [lastSpvVaultTxHash, lastSpvVaultHeight] = await this.checkEventsSpvVaults(currentBlock as any, lastState?.[1]?.lastTxHash, lastState?.[1]?.lastBlockNumber);
365
386
 
366
- return {
367
- txHashes: lastTxHashes,
368
- blockNumber: currentBlockNumber
369
- };
387
+ return [
388
+ {lastBlockNumber: lastEscrowHeight, lastTxHash: lastEscrowTxHash},
389
+ {lastBlockNumber: lastSpvVaultHeight, lastTxHash: lastSpvVaultTxHash}
390
+ ];
370
391
  }
371
392
 
372
393
  /**
@@ -375,17 +396,15 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
375
396
  * @protected
376
397
  */
377
398
  protected async setupPoll(
378
- lastBlockNumber?: number,
379
- lastTxHashes?: string[],
380
- saveLatestProcessedBlockNumber?: (blockNumber: number, lastTxHashes: string[]) => Promise<void>
399
+ lastState?: StarknetEventListenerState[],
400
+ saveLatestProcessedBlockNumber?: (newState: StarknetEventListenerState[]) => Promise<void>
381
401
  ) {
382
402
  this.stopped = false;
383
403
  let func;
384
404
  func = async () => {
385
- await this.checkEvents(lastBlockNumber, lastTxHashes).then(({blockNumber, txHashes}) => {
386
- lastBlockNumber = blockNumber;
387
- lastTxHashes = txHashes;
388
- if(saveLatestProcessedBlockNumber!=null) return saveLatestProcessedBlockNumber(blockNumber, lastTxHashes);
405
+ await this.checkEvents(lastState).then(newState => {
406
+ lastState = newState;
407
+ if(saveLatestProcessedBlockNumber!=null) return saveLatestProcessedBlockNumber(newState);
389
408
  }).catch(e => {
390
409
  this.logger.error("setupPoll(): Failed to fetch starknet log: ", e);
391
410
  });