@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.
- package/dist/starknet/base/modules/StarknetTransactions.js +3 -3
- package/dist/starknet/events/StarknetChainEventsBrowser.d.ts +2 -1
- package/dist/starknet/events/StarknetChainEventsBrowser.js +18 -23
- package/package.json +1 -1
- package/src/starknet/base/modules/StarknetTransactions.ts +2 -2
- package/src/starknet/events/StarknetChainEventsBrowser.ts +22 -28
|
@@ -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)(
|
|
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.
|
|
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 =
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
@@ -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(
|
|
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.
|
|
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 =
|
|
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
|
-
|
|
203
|
-
|
|
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(
|
|
209
|
-
if(latestProcessedEventIndex
|
|
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(
|
|
212
|
-
await this.processEvents(
|
|
213
|
-
lastTxHash =
|
|
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
|