@atomiqlabs/chain-starknet 7.0.3 → 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.
- package/dist/starknet/events/StarknetChainEvents.js +17 -18
- package/dist/starknet/events/StarknetChainEventsBrowser.d.ts +10 -9
- package/dist/starknet/events/StarknetChainEventsBrowser.js +43 -22
- package/package.json +1 -1
- package/src/starknet/events/StarknetChainEvents.ts +21 -21
- package/src/starknet/events/StarknetChainEventsBrowser.ts +45 -26
|
@@ -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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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(
|
|
45
|
-
return fs.writeFile(this.directory + BLOCKHEIGHT_FILENAME,
|
|
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
|
|
49
|
-
await this.setupPoll(
|
|
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(
|
|
66
|
+
protected checkEventsEcrowManager(currentBlock: {
|
|
63
67
|
timestamp: number;
|
|
64
68
|
block_number: number;
|
|
65
|
-
}): Promise<string>;
|
|
66
|
-
protected checkEventsSpvVaults(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
264
|
+
const lastProcessed = events[events.length - 1];
|
|
265
|
+
lastTxHash = lastProcessed.txHash;
|
|
266
|
+
if (lastProcessed.blockNumber > lastBlockNumber)
|
|
267
|
+
lastBlockNumber = lastProcessed.blockNumber;
|
|
249
268
|
}
|
|
250
|
-
|
|
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(
|
|
253
|
-
|
|
275
|
+
async checkEvents(lastState) {
|
|
276
|
+
lastState ?? (lastState = []);
|
|
254
277
|
const currentBlock = await this.provider.getBlockWithTxHashes(starknet_1.BlockTag.LATEST);
|
|
255
|
-
const
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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(
|
|
290
|
+
async setupPoll(lastState, saveLatestProcessedBlockNumber) {
|
|
269
291
|
this.stopped = false;
|
|
270
292
|
let func;
|
|
271
293
|
func = async () => {
|
|
272
|
-
await this.checkEvents(
|
|
273
|
-
|
|
274
|
-
lastTxHashes = txHashes;
|
|
294
|
+
await this.checkEvents(lastState).then(newState => {
|
|
295
|
+
lastState = newState;
|
|
275
296
|
if (saveLatestProcessedBlockNumber != null)
|
|
276
|
-
return saveLatestProcessedBlockNumber(
|
|
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,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<
|
|
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)
|
|
35
|
-
blockNumber
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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(
|
|
56
|
-
return fs.writeFile(this.directory+BLOCKHEIGHT_FILENAME,
|
|
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
|
|
61
|
+
const lastEventsState = await this.getLastEventData();
|
|
61
62
|
await this.setupPoll(
|
|
62
|
-
|
|
63
|
-
|
|
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(
|
|
310
|
-
const currentBlockNumber: 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
|
-
|
|
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
|
-
|
|
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(
|
|
334
|
-
const currentBlockNumber: 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
|
-
|
|
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
|
-
|
|
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(
|
|
358
|
-
|
|
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
|
-
|
|
364
|
-
|
|
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
|
-
|
|
368
|
-
|
|
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
|
-
|
|
379
|
-
|
|
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(
|
|
386
|
-
|
|
387
|
-
|
|
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
|
});
|