@atomiqlabs/chain-evm 1.0.0-dev.93 → 1.0.0-dev.95
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/LICENSE +201 -201
- package/dist/chains/botanix/BotanixChainType.d.ts +13 -13
- package/dist/chains/botanix/BotanixChainType.js +2 -2
- package/dist/chains/botanix/BotanixInitializer.d.ts +30 -30
- package/dist/chains/botanix/BotanixInitializer.js +125 -125
- package/dist/chains/citrea/CitreaBtcRelay.d.ts +21 -21
- package/dist/chains/citrea/CitreaBtcRelay.js +43 -43
- package/dist/chains/citrea/CitreaChainType.d.ts +13 -13
- package/dist/chains/citrea/CitreaChainType.js +2 -2
- package/dist/chains/citrea/CitreaFees.d.ts +29 -29
- package/dist/chains/citrea/CitreaFees.js +67 -67
- package/dist/chains/citrea/CitreaInitializer.d.ts +30 -30
- package/dist/chains/citrea/CitreaInitializer.js +132 -132
- package/dist/chains/citrea/CitreaSpvVaultContract.d.ts +15 -15
- package/dist/chains/citrea/CitreaSpvVaultContract.js +74 -74
- package/dist/chains/citrea/CitreaSwapContract.d.ts +22 -22
- package/dist/chains/citrea/CitreaSwapContract.js +96 -96
- package/dist/chains/citrea/CitreaTokens.d.ts +9 -9
- package/dist/chains/citrea/CitreaTokens.js +20 -20
- package/dist/evm/btcrelay/BtcRelayAbi.d.ts +198 -198
- package/dist/evm/btcrelay/BtcRelayAbi.js +261 -261
- package/dist/evm/btcrelay/BtcRelayTypechain.d.ts +172 -172
- package/dist/evm/btcrelay/BtcRelayTypechain.js +2 -2
- package/dist/evm/btcrelay/EVMBtcRelay.d.ts +197 -197
- package/dist/evm/btcrelay/EVMBtcRelay.js +435 -435
- package/dist/evm/btcrelay/headers/EVMBtcHeader.d.ts +33 -33
- package/dist/evm/btcrelay/headers/EVMBtcHeader.js +84 -84
- package/dist/evm/btcrelay/headers/EVMBtcStoredHeader.d.ts +56 -56
- package/dist/evm/btcrelay/headers/EVMBtcStoredHeader.js +123 -123
- package/dist/evm/chain/EVMChainInterface.d.ts +54 -54
- package/dist/evm/chain/EVMChainInterface.js +89 -89
- package/dist/evm/chain/EVMModule.d.ts +9 -9
- package/dist/evm/chain/EVMModule.js +13 -13
- package/dist/evm/chain/modules/ERC20Abi.d.ts +168 -168
- package/dist/evm/chain/modules/ERC20Abi.js +225 -225
- package/dist/evm/chain/modules/EVMAddresses.d.ts +10 -10
- package/dist/evm/chain/modules/EVMAddresses.js +30 -30
- package/dist/evm/chain/modules/EVMBlocks.d.ts +20 -20
- package/dist/evm/chain/modules/EVMBlocks.js +64 -64
- package/dist/evm/chain/modules/EVMEvents.d.ts +46 -46
- package/dist/evm/chain/modules/EVMEvents.js +151 -151
- package/dist/evm/chain/modules/EVMFees.d.ts +36 -36
- package/dist/evm/chain/modules/EVMFees.js +74 -74
- package/dist/evm/chain/modules/EVMSignatures.d.ts +29 -29
- package/dist/evm/chain/modules/EVMSignatures.js +68 -68
- package/dist/evm/chain/modules/EVMTokens.d.ts +70 -70
- package/dist/evm/chain/modules/EVMTokens.js +142 -142
- package/dist/evm/chain/modules/EVMTransactions.d.ts +94 -94
- package/dist/evm/chain/modules/EVMTransactions.js +307 -288
- package/dist/evm/contract/EVMContractBase.d.ts +22 -22
- package/dist/evm/contract/EVMContractBase.js +34 -34
- package/dist/evm/contract/EVMContractModule.d.ts +8 -8
- package/dist/evm/contract/EVMContractModule.js +11 -11
- package/dist/evm/contract/modules/EVMContractEvents.d.ts +42 -42
- package/dist/evm/contract/modules/EVMContractEvents.js +75 -75
- package/dist/evm/events/EVMChainEvents.d.ts +22 -22
- package/dist/evm/events/EVMChainEvents.js +69 -69
- package/dist/evm/events/EVMChainEventsBrowser.d.ts +102 -102
- package/dist/evm/events/EVMChainEventsBrowser.js +412 -412
- package/dist/evm/providers/JsonRpcProviderWithRetries.d.ts +16 -16
- package/dist/evm/providers/JsonRpcProviderWithRetries.js +27 -27
- package/dist/evm/providers/ReconnectingWebSocketProvider.d.ts +22 -22
- package/dist/evm/providers/ReconnectingWebSocketProvider.js +91 -91
- package/dist/evm/providers/SocketProvider.d.ts +111 -111
- package/dist/evm/providers/SocketProvider.js +336 -336
- package/dist/evm/providers/WebSocketProviderWithRetries.d.ts +17 -17
- package/dist/evm/providers/WebSocketProviderWithRetries.js +23 -23
- package/dist/evm/spv_swap/EVMSpvVaultContract.d.ts +107 -107
- package/dist/evm/spv_swap/EVMSpvVaultContract.js +578 -578
- package/dist/evm/spv_swap/EVMSpvVaultData.d.ts +40 -40
- package/dist/evm/spv_swap/EVMSpvVaultData.js +184 -184
- package/dist/evm/spv_swap/EVMSpvWithdrawalData.d.ts +19 -19
- package/dist/evm/spv_swap/EVMSpvWithdrawalData.js +55 -55
- package/dist/evm/spv_swap/SpvVaultContractAbi.d.ts +91 -91
- package/dist/evm/spv_swap/SpvVaultContractAbi.js +849 -849
- package/dist/evm/spv_swap/SpvVaultContractTypechain.d.ts +450 -450
- package/dist/evm/spv_swap/SpvVaultContractTypechain.js +2 -2
- package/dist/evm/swaps/EVMSwapContract.d.ts +199 -199
- package/dist/evm/swaps/EVMSwapContract.js +394 -394
- package/dist/evm/swaps/EVMSwapData.d.ts +66 -66
- package/dist/evm/swaps/EVMSwapData.js +260 -260
- package/dist/evm/swaps/EVMSwapModule.d.ts +9 -9
- package/dist/evm/swaps/EVMSwapModule.js +11 -11
- package/dist/evm/swaps/EscrowManagerAbi.d.ts +120 -120
- package/dist/evm/swaps/EscrowManagerAbi.js +985 -985
- package/dist/evm/swaps/EscrowManagerTypechain.d.ts +475 -475
- package/dist/evm/swaps/EscrowManagerTypechain.js +2 -2
- package/dist/evm/swaps/handlers/IHandler.d.ts +13 -13
- package/dist/evm/swaps/handlers/IHandler.js +2 -2
- package/dist/evm/swaps/handlers/claim/ClaimHandlers.d.ts +10 -10
- package/dist/evm/swaps/handlers/claim/ClaimHandlers.js +13 -13
- package/dist/evm/swaps/handlers/claim/HashlockClaimHandler.d.ts +20 -20
- package/dist/evm/swaps/handlers/claim/HashlockClaimHandler.js +39 -39
- package/dist/evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +24 -24
- package/dist/evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +59 -59
- package/dist/evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +25 -25
- package/dist/evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +51 -51
- package/dist/evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +21 -21
- package/dist/evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +28 -28
- package/dist/evm/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +48 -48
- package/dist/evm/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +63 -63
- package/dist/evm/swaps/handlers/refund/TimelockRefundHandler.d.ts +17 -17
- package/dist/evm/swaps/handlers/refund/TimelockRefundHandler.js +28 -28
- package/dist/evm/swaps/modules/EVMLpVault.d.ts +69 -69
- package/dist/evm/swaps/modules/EVMLpVault.js +134 -134
- package/dist/evm/swaps/modules/EVMSwapClaim.d.ts +54 -54
- package/dist/evm/swaps/modules/EVMSwapClaim.js +137 -137
- package/dist/evm/swaps/modules/EVMSwapInit.d.ts +88 -88
- package/dist/evm/swaps/modules/EVMSwapInit.js +274 -274
- package/dist/evm/swaps/modules/EVMSwapRefund.d.ts +62 -62
- package/dist/evm/swaps/modules/EVMSwapRefund.js +167 -167
- package/dist/evm/typechain/common.d.ts +50 -50
- package/dist/evm/typechain/common.js +2 -2
- package/dist/evm/wallet/EVMBrowserSigner.d.ts +5 -5
- package/dist/evm/wallet/EVMBrowserSigner.js +11 -11
- package/dist/evm/wallet/EVMPersistentSigner.d.ts +29 -29
- package/dist/evm/wallet/EVMPersistentSigner.js +230 -230
- package/dist/evm/wallet/EVMSigner.d.ts +11 -11
- package/dist/evm/wallet/EVMSigner.js +24 -24
- package/dist/index.d.ts +44 -44
- package/dist/index.js +60 -60
- package/dist/utils/Utils.d.ts +19 -19
- package/dist/utils/Utils.js +98 -98
- package/package.json +39 -39
- package/src/chains/botanix/BotanixChainType.ts +28 -28
- package/src/chains/botanix/BotanixInitializer.ts +175 -175
- package/src/chains/citrea/CitreaBtcRelay.ts +57 -57
- package/src/chains/citrea/CitreaChainType.ts +28 -28
- package/src/chains/citrea/CitreaFees.ts +77 -77
- package/src/chains/citrea/CitreaInitializer.ts +182 -182
- package/src/chains/citrea/CitreaSpvVaultContract.ts +75 -75
- package/src/chains/citrea/CitreaSwapContract.ts +102 -102
- package/src/chains/citrea/CitreaTokens.ts +21 -21
- package/src/evm/btcrelay/BtcRelayAbi.ts +258 -258
- package/src/evm/btcrelay/BtcRelayTypechain.ts +371 -371
- package/src/evm/btcrelay/EVMBtcRelay.ts +537 -537
- package/src/evm/btcrelay/headers/EVMBtcHeader.ts +109 -109
- package/src/evm/btcrelay/headers/EVMBtcStoredHeader.ts +152 -152
- package/src/evm/chain/EVMChainInterface.ts +158 -158
- package/src/evm/chain/EVMModule.ts +21 -21
- package/src/evm/chain/modules/ERC20Abi.ts +222 -222
- package/src/evm/chain/modules/EVMAddresses.ts +28 -28
- package/src/evm/chain/modules/EVMBlocks.ts +75 -75
- package/src/evm/chain/modules/EVMEvents.ts +182 -182
- package/src/evm/chain/modules/EVMFees.ts +104 -104
- package/src/evm/chain/modules/EVMSignatures.ts +76 -76
- package/src/evm/chain/modules/EVMTokens.ts +155 -155
- package/src/evm/chain/modules/EVMTransactions.ts +346 -327
- package/src/evm/contract/EVMContractBase.ts +63 -63
- package/src/evm/contract/EVMContractModule.ts +16 -16
- package/src/evm/contract/modules/EVMContractEvents.ts +102 -102
- package/src/evm/events/EVMChainEvents.ts +82 -82
- package/src/evm/events/EVMChainEventsBrowser.ts +533 -533
- package/src/evm/providers/JsonRpcProviderWithRetries.ts +33 -33
- package/src/evm/providers/ReconnectingWebSocketProvider.ts +106 -106
- package/src/evm/providers/SocketProvider.ts +371 -371
- package/src/evm/providers/WebSocketProviderWithRetries.ts +34 -34
- package/src/evm/spv_swap/EVMSpvVaultContract.ts +723 -723
- package/src/evm/spv_swap/EVMSpvVaultData.ts +228 -228
- package/src/evm/spv_swap/EVMSpvWithdrawalData.ts +70 -70
- package/src/evm/spv_swap/SpvVaultContractAbi.ts +846 -846
- package/src/evm/spv_swap/SpvVaultContractTypechain.ts +685 -685
- package/src/evm/swaps/EVMSwapContract.ts +621 -621
- package/src/evm/swaps/EVMSwapData.ts +378 -378
- package/src/evm/swaps/EVMSwapModule.ts +16 -16
- package/src/evm/swaps/EscrowManagerAbi.ts +982 -982
- package/src/evm/swaps/EscrowManagerTypechain.ts +723 -723
- package/src/evm/swaps/handlers/IHandler.ts +17 -17
- package/src/evm/swaps/handlers/claim/ClaimHandlers.ts +20 -20
- package/src/evm/swaps/handlers/claim/HashlockClaimHandler.ts +46 -46
- package/src/evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.ts +82 -82
- package/src/evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.ts +76 -76
- package/src/evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.ts +46 -46
- package/src/evm/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +115 -115
- package/src/evm/swaps/handlers/refund/TimelockRefundHandler.ts +37 -37
- package/src/evm/swaps/modules/EVMLpVault.ts +154 -154
- package/src/evm/swaps/modules/EVMSwapClaim.ts +172 -172
- package/src/evm/swaps/modules/EVMSwapInit.ts +328 -328
- package/src/evm/swaps/modules/EVMSwapRefund.ts +229 -229
- package/src/evm/typechain/common.ts +131 -131
- package/src/evm/wallet/EVMBrowserSigner.ts +11 -11
- package/src/evm/wallet/EVMPersistentSigner.ts +307 -307
- package/src/evm/wallet/EVMSigner.ts +31 -31
- package/src/index.ts +53 -53
- package/src/utils/Utils.ts +111 -111
|
@@ -1,182 +1,182 @@
|
|
|
1
|
-
import {EVMModule} from "../EVMModule";
|
|
2
|
-
import {Log} from "ethers";
|
|
3
|
-
|
|
4
|
-
export class EVMEvents extends EVMModule<any> {
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Wrapper for provider.getLogs(), automatically retries with smaller ranges if limits are reached
|
|
8
|
-
*
|
|
9
|
-
* @param contract
|
|
10
|
-
* @param topics
|
|
11
|
-
* @param startBlock
|
|
12
|
-
* @param endBlock
|
|
13
|
-
* @private
|
|
14
|
-
*/
|
|
15
|
-
private async getLogs(
|
|
16
|
-
contract: string, topics: (string[] | string | null)[], startBlock: number, endBlock: number
|
|
17
|
-
): Promise<Log[]> {
|
|
18
|
-
try {
|
|
19
|
-
return await this.root.provider.getLogs({
|
|
20
|
-
address: contract,
|
|
21
|
-
fromBlock: startBlock,
|
|
22
|
-
toBlock: endBlock,
|
|
23
|
-
topics
|
|
24
|
-
});
|
|
25
|
-
} catch (e) {
|
|
26
|
-
if(
|
|
27
|
-
e.error?.code===-32008 || //Response is too big
|
|
28
|
-
e.error?.code===-32005 //Limit exceeded
|
|
29
|
-
) {
|
|
30
|
-
if(startBlock===endBlock) throw e;
|
|
31
|
-
const difference = (endBlock - startBlock)/2;
|
|
32
|
-
const midpoint = startBlock + Math.floor(difference);
|
|
33
|
-
this.logger.warn(`getLogs(): Error getting logs, limits reached, splitting to 2 ranges: ${startBlock}..${midpoint} & ${midpoint+1}..${endBlock}: `, e);
|
|
34
|
-
return [
|
|
35
|
-
...await this.getLogs(contract, topics, startBlock, midpoint),
|
|
36
|
-
...await this.getLogs(contract, topics, midpoint+1, endBlock),
|
|
37
|
-
]
|
|
38
|
-
}
|
|
39
|
-
throw e;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Returns the all the events occuring in a block range as identified by the contract and keys
|
|
45
|
-
*
|
|
46
|
-
* @param contract
|
|
47
|
-
* @param topics
|
|
48
|
-
* @param startBlock
|
|
49
|
-
* @param endBlock
|
|
50
|
-
* @param abortSignal
|
|
51
|
-
*/
|
|
52
|
-
public async getBlockEvents(
|
|
53
|
-
contract: string, topics: (string[] | string | null)[], startBlock: number, endBlock: number = startBlock, abortSignal?: AbortSignal
|
|
54
|
-
): Promise<Log[]> {
|
|
55
|
-
let events: Log[] = [];
|
|
56
|
-
|
|
57
|
-
if(startBlock===endBlock) {
|
|
58
|
-
events = await this.root.provider.getLogs({
|
|
59
|
-
address: contract,
|
|
60
|
-
fromBlock: startBlock,
|
|
61
|
-
toBlock: endBlock==null ? this.root.config.safeBlockTag : endBlock,
|
|
62
|
-
topics
|
|
63
|
-
});
|
|
64
|
-
} else if(endBlock==null) {
|
|
65
|
-
const safeBlock = await this.root.provider.getBlock(this.root.config.safeBlockTag);
|
|
66
|
-
if(safeBlock.number - startBlock > this.root.config.maxLogsBlockRange) {
|
|
67
|
-
for(let i = startBlock + this.root.config.maxLogsBlockRange; i < safeBlock.number; i += this.root.config.maxLogsBlockRange) {
|
|
68
|
-
events.push(...await this.getLogs(contract, topics, i - this.root.config.maxLogsBlockRange, i));
|
|
69
|
-
startBlock = i;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
events.push(...await this.getLogs(contract, topics, startBlock, safeBlock.number));
|
|
73
|
-
} else {
|
|
74
|
-
//Both numeric
|
|
75
|
-
if(endBlock - startBlock > this.root.config.maxLogsBlockRange) {
|
|
76
|
-
for(let i = startBlock + this.root.config.maxLogsBlockRange; i < endBlock; i += this.root.config.maxLogsBlockRange) {
|
|
77
|
-
events.push(...await this.getLogs(contract, topics, i - this.root.config.maxLogsBlockRange, i));
|
|
78
|
-
startBlock = i;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
events.push(...await this.getLogs(contract, topics, startBlock, endBlock));
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return events.filter(val => !val.removed);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Runs a search backwards in time, processing events from a specific contract and keys
|
|
89
|
-
*
|
|
90
|
-
* @param contract
|
|
91
|
-
* @param topics
|
|
92
|
-
* @param processor called for every batch of returned signatures, should return a value if the correct signature
|
|
93
|
-
* was found, or null if the search should continue
|
|
94
|
-
* @param abortSignal
|
|
95
|
-
* @param genesisHeight Height when the contract was deployed
|
|
96
|
-
*/
|
|
97
|
-
public async findInEvents<T>(
|
|
98
|
-
contract: string, topics: (string[] | string | null)[],
|
|
99
|
-
processor: (signatures: Log[]) => Promise<T>,
|
|
100
|
-
abortSignal?: AbortSignal,
|
|
101
|
-
genesisHeight?: number
|
|
102
|
-
): Promise<T> {
|
|
103
|
-
const {number: latestBlockNumber} = await this.provider.getBlock(this.root.config.safeBlockTag);
|
|
104
|
-
|
|
105
|
-
let promises: Promise<Log[]>[] = [];
|
|
106
|
-
for(let blockNumber = latestBlockNumber; blockNumber >= (genesisHeight ?? 0); blockNumber-=this.root.config.maxLogsBlockRange) {
|
|
107
|
-
promises.push(this.getLogs(
|
|
108
|
-
contract,
|
|
109
|
-
topics,
|
|
110
|
-
Math.max(blockNumber-this.root.config.maxLogsBlockRange, 0),
|
|
111
|
-
blockNumber
|
|
112
|
-
));
|
|
113
|
-
|
|
114
|
-
if(promises.length>=this.root.config.maxParallelLogRequests) {
|
|
115
|
-
const eventsResult = (await Promise.all(promises)).map(
|
|
116
|
-
arr => arr.reverse() //Oldest events first
|
|
117
|
-
).flat();
|
|
118
|
-
promises = [];
|
|
119
|
-
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
120
|
-
|
|
121
|
-
const result: T = await processor(eventsResult);
|
|
122
|
-
if(result!=null) return result;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const eventsResult = (await Promise.all(promises)).map(
|
|
127
|
-
arr => arr.reverse() //Oldest events first
|
|
128
|
-
).flat();
|
|
129
|
-
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
130
|
-
|
|
131
|
-
const result: T = await processor(eventsResult); //Oldest events first
|
|
132
|
-
if(result!=null) return result;
|
|
133
|
-
|
|
134
|
-
return null;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Runs a search forwards in time, processing events from a specific contract and keys
|
|
139
|
-
*
|
|
140
|
-
* @param contract
|
|
141
|
-
* @param topics
|
|
142
|
-
* @param processor called for every batch of returned signatures, should return a value if the correct signature
|
|
143
|
-
* was found, or null if the search should continue
|
|
144
|
-
* @param abortSignal
|
|
145
|
-
* @param startHeight Blockheight at which to start
|
|
146
|
-
*/
|
|
147
|
-
public async findInEventsForward<T>(
|
|
148
|
-
contract: string, topics: (string[] | string | null)[],
|
|
149
|
-
processor: (signatures: Log[]) => Promise<T>,
|
|
150
|
-
abortSignal?: AbortSignal,
|
|
151
|
-
startHeight?: number
|
|
152
|
-
): Promise<T> {
|
|
153
|
-
const {number: latestBlockNumber} = await this.provider.getBlock(this.root.config.safeBlockTag);
|
|
154
|
-
|
|
155
|
-
let promises: Promise<Log[]>[] = [];
|
|
156
|
-
for(let blockNumber = startHeight ?? 0; blockNumber < latestBlockNumber; blockNumber += this.root.config.maxLogsBlockRange) {
|
|
157
|
-
promises.push(this.getLogs(
|
|
158
|
-
contract,
|
|
159
|
-
topics,
|
|
160
|
-
blockNumber,
|
|
161
|
-
Math.min(blockNumber + this.root.config.maxLogsBlockRange, latestBlockNumber)
|
|
162
|
-
));
|
|
163
|
-
if(promises.length>=this.root.config.maxParallelLogRequests) {
|
|
164
|
-
const eventsResult = (await Promise.all(promises)).flat();
|
|
165
|
-
promises = [];
|
|
166
|
-
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
167
|
-
|
|
168
|
-
const result: T = await processor(eventsResult); //Oldest events first
|
|
169
|
-
if(result!=null) return result;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const eventsResult = (await Promise.all(promises)).flat();
|
|
174
|
-
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
175
|
-
|
|
176
|
-
const result: T = await processor(eventsResult); //Oldest events first
|
|
177
|
-
if(result!=null) return result;
|
|
178
|
-
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
}
|
|
1
|
+
import {EVMModule} from "../EVMModule";
|
|
2
|
+
import {Log} from "ethers";
|
|
3
|
+
|
|
4
|
+
export class EVMEvents extends EVMModule<any> {
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Wrapper for provider.getLogs(), automatically retries with smaller ranges if limits are reached
|
|
8
|
+
*
|
|
9
|
+
* @param contract
|
|
10
|
+
* @param topics
|
|
11
|
+
* @param startBlock
|
|
12
|
+
* @param endBlock
|
|
13
|
+
* @private
|
|
14
|
+
*/
|
|
15
|
+
private async getLogs(
|
|
16
|
+
contract: string, topics: (string[] | string | null)[], startBlock: number, endBlock: number
|
|
17
|
+
): Promise<Log[]> {
|
|
18
|
+
try {
|
|
19
|
+
return await this.root.provider.getLogs({
|
|
20
|
+
address: contract,
|
|
21
|
+
fromBlock: startBlock,
|
|
22
|
+
toBlock: endBlock,
|
|
23
|
+
topics
|
|
24
|
+
});
|
|
25
|
+
} catch (e) {
|
|
26
|
+
if(
|
|
27
|
+
e.error?.code===-32008 || //Response is too big
|
|
28
|
+
e.error?.code===-32005 //Limit exceeded
|
|
29
|
+
) {
|
|
30
|
+
if(startBlock===endBlock) throw e;
|
|
31
|
+
const difference = (endBlock - startBlock)/2;
|
|
32
|
+
const midpoint = startBlock + Math.floor(difference);
|
|
33
|
+
this.logger.warn(`getLogs(): Error getting logs, limits reached, splitting to 2 ranges: ${startBlock}..${midpoint} & ${midpoint+1}..${endBlock}: `, e);
|
|
34
|
+
return [
|
|
35
|
+
...await this.getLogs(contract, topics, startBlock, midpoint),
|
|
36
|
+
...await this.getLogs(contract, topics, midpoint+1, endBlock),
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
throw e;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Returns the all the events occuring in a block range as identified by the contract and keys
|
|
45
|
+
*
|
|
46
|
+
* @param contract
|
|
47
|
+
* @param topics
|
|
48
|
+
* @param startBlock
|
|
49
|
+
* @param endBlock
|
|
50
|
+
* @param abortSignal
|
|
51
|
+
*/
|
|
52
|
+
public async getBlockEvents(
|
|
53
|
+
contract: string, topics: (string[] | string | null)[], startBlock: number, endBlock: number = startBlock, abortSignal?: AbortSignal
|
|
54
|
+
): Promise<Log[]> {
|
|
55
|
+
let events: Log[] = [];
|
|
56
|
+
|
|
57
|
+
if(startBlock===endBlock) {
|
|
58
|
+
events = await this.root.provider.getLogs({
|
|
59
|
+
address: contract,
|
|
60
|
+
fromBlock: startBlock,
|
|
61
|
+
toBlock: endBlock==null ? this.root.config.safeBlockTag : endBlock,
|
|
62
|
+
topics
|
|
63
|
+
});
|
|
64
|
+
} else if(endBlock==null) {
|
|
65
|
+
const safeBlock = await this.root.provider.getBlock(this.root.config.safeBlockTag);
|
|
66
|
+
if(safeBlock.number - startBlock > this.root.config.maxLogsBlockRange) {
|
|
67
|
+
for(let i = startBlock + this.root.config.maxLogsBlockRange; i < safeBlock.number; i += this.root.config.maxLogsBlockRange) {
|
|
68
|
+
events.push(...await this.getLogs(contract, topics, i - this.root.config.maxLogsBlockRange, i));
|
|
69
|
+
startBlock = i;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
events.push(...await this.getLogs(contract, topics, startBlock, safeBlock.number));
|
|
73
|
+
} else {
|
|
74
|
+
//Both numeric
|
|
75
|
+
if(endBlock - startBlock > this.root.config.maxLogsBlockRange) {
|
|
76
|
+
for(let i = startBlock + this.root.config.maxLogsBlockRange; i < endBlock; i += this.root.config.maxLogsBlockRange) {
|
|
77
|
+
events.push(...await this.getLogs(contract, topics, i - this.root.config.maxLogsBlockRange, i));
|
|
78
|
+
startBlock = i;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
events.push(...await this.getLogs(contract, topics, startBlock, endBlock));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return events.filter(val => !val.removed);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Runs a search backwards in time, processing events from a specific contract and keys
|
|
89
|
+
*
|
|
90
|
+
* @param contract
|
|
91
|
+
* @param topics
|
|
92
|
+
* @param processor called for every batch of returned signatures, should return a value if the correct signature
|
|
93
|
+
* was found, or null if the search should continue
|
|
94
|
+
* @param abortSignal
|
|
95
|
+
* @param genesisHeight Height when the contract was deployed
|
|
96
|
+
*/
|
|
97
|
+
public async findInEvents<T>(
|
|
98
|
+
contract: string, topics: (string[] | string | null)[],
|
|
99
|
+
processor: (signatures: Log[]) => Promise<T>,
|
|
100
|
+
abortSignal?: AbortSignal,
|
|
101
|
+
genesisHeight?: number
|
|
102
|
+
): Promise<T> {
|
|
103
|
+
const {number: latestBlockNumber} = await this.provider.getBlock(this.root.config.safeBlockTag);
|
|
104
|
+
|
|
105
|
+
let promises: Promise<Log[]>[] = [];
|
|
106
|
+
for(let blockNumber = latestBlockNumber; blockNumber >= (genesisHeight ?? 0); blockNumber-=this.root.config.maxLogsBlockRange) {
|
|
107
|
+
promises.push(this.getLogs(
|
|
108
|
+
contract,
|
|
109
|
+
topics,
|
|
110
|
+
Math.max(blockNumber-this.root.config.maxLogsBlockRange, 0),
|
|
111
|
+
blockNumber
|
|
112
|
+
));
|
|
113
|
+
|
|
114
|
+
if(promises.length>=this.root.config.maxParallelLogRequests) {
|
|
115
|
+
const eventsResult = (await Promise.all(promises)).map(
|
|
116
|
+
arr => arr.reverse() //Oldest events first
|
|
117
|
+
).flat();
|
|
118
|
+
promises = [];
|
|
119
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
120
|
+
|
|
121
|
+
const result: T = await processor(eventsResult);
|
|
122
|
+
if(result!=null) return result;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const eventsResult = (await Promise.all(promises)).map(
|
|
127
|
+
arr => arr.reverse() //Oldest events first
|
|
128
|
+
).flat();
|
|
129
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
130
|
+
|
|
131
|
+
const result: T = await processor(eventsResult); //Oldest events first
|
|
132
|
+
if(result!=null) return result;
|
|
133
|
+
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Runs a search forwards in time, processing events from a specific contract and keys
|
|
139
|
+
*
|
|
140
|
+
* @param contract
|
|
141
|
+
* @param topics
|
|
142
|
+
* @param processor called for every batch of returned signatures, should return a value if the correct signature
|
|
143
|
+
* was found, or null if the search should continue
|
|
144
|
+
* @param abortSignal
|
|
145
|
+
* @param startHeight Blockheight at which to start
|
|
146
|
+
*/
|
|
147
|
+
public async findInEventsForward<T>(
|
|
148
|
+
contract: string, topics: (string[] | string | null)[],
|
|
149
|
+
processor: (signatures: Log[]) => Promise<T>,
|
|
150
|
+
abortSignal?: AbortSignal,
|
|
151
|
+
startHeight?: number
|
|
152
|
+
): Promise<T> {
|
|
153
|
+
const {number: latestBlockNumber} = await this.provider.getBlock(this.root.config.safeBlockTag);
|
|
154
|
+
|
|
155
|
+
let promises: Promise<Log[]>[] = [];
|
|
156
|
+
for(let blockNumber = startHeight ?? 0; blockNumber < latestBlockNumber; blockNumber += this.root.config.maxLogsBlockRange) {
|
|
157
|
+
promises.push(this.getLogs(
|
|
158
|
+
contract,
|
|
159
|
+
topics,
|
|
160
|
+
blockNumber,
|
|
161
|
+
Math.min(blockNumber + this.root.config.maxLogsBlockRange, latestBlockNumber)
|
|
162
|
+
));
|
|
163
|
+
if(promises.length>=this.root.config.maxParallelLogRequests) {
|
|
164
|
+
const eventsResult = (await Promise.all(promises)).flat();
|
|
165
|
+
promises = [];
|
|
166
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
167
|
+
|
|
168
|
+
const result: T = await processor(eventsResult); //Oldest events first
|
|
169
|
+
if(result!=null) return result;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const eventsResult = (await Promise.all(promises)).flat();
|
|
174
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
175
|
+
|
|
176
|
+
const result: T = await processor(eventsResult); //Oldest events first
|
|
177
|
+
if(result!=null) return result;
|
|
178
|
+
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
}
|
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
import { getLogger } from "../../../utils/Utils";
|
|
2
|
-
import {JsonRpcApiProvider, TransactionRequest} from "ethers";
|
|
3
|
-
|
|
4
|
-
export type EVMFeeRate = {
|
|
5
|
-
maxFeePerGas: bigint;
|
|
6
|
-
maxPriorityFee: bigint;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
export class EVMFees {
|
|
10
|
-
protected MAX_FEE_AGE = 5000;
|
|
11
|
-
|
|
12
|
-
protected readonly logger = getLogger("EVMFees: ");
|
|
13
|
-
|
|
14
|
-
protected readonly provider: JsonRpcApiProvider;
|
|
15
|
-
protected readonly maxFeeRatePerGas: bigint;
|
|
16
|
-
protected readonly priorityFee: bigint;
|
|
17
|
-
|
|
18
|
-
protected readonly feeMultiplierPPM: bigint;
|
|
19
|
-
|
|
20
|
-
private blockFeeCache: {
|
|
21
|
-
timestamp: number,
|
|
22
|
-
feeRate: Promise<bigint>
|
|
23
|
-
} = null;
|
|
24
|
-
|
|
25
|
-
constructor(
|
|
26
|
-
provider: JsonRpcApiProvider,
|
|
27
|
-
maxFeeRatePerGas: bigint = 500n * 1_000_000_000n,
|
|
28
|
-
priorityFee: bigint = 1n * 1_000_000_000n,
|
|
29
|
-
feeMultiplier: number = 1.25,
|
|
30
|
-
) {
|
|
31
|
-
this.provider = provider;
|
|
32
|
-
this.maxFeeRatePerGas = maxFeeRatePerGas;
|
|
33
|
-
this.priorityFee = priorityFee;
|
|
34
|
-
this.feeMultiplierPPM = BigInt(Math.floor(feeMultiplier * 1_000_000));
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Gets evm fee rate
|
|
39
|
-
*
|
|
40
|
-
* @private
|
|
41
|
-
* @returns {Promise<bigint>} L1 gas price denominated in Wei
|
|
42
|
-
*/
|
|
43
|
-
private async _getFeeRate(): Promise<bigint> {
|
|
44
|
-
const block = await this.provider.getBlock("latest");
|
|
45
|
-
|
|
46
|
-
const baseFee = block.baseFeePerGas * this.feeMultiplierPPM / 1_000_000n;
|
|
47
|
-
this.logger.debug("_getFeeRate(): Base fee rate: "+baseFee.toString(10));
|
|
48
|
-
|
|
49
|
-
return baseFee;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Gets the gas price with caching, format: <base fee Wei>,<priority fee Wei>
|
|
54
|
-
*
|
|
55
|
-
* @private
|
|
56
|
-
*/
|
|
57
|
-
public async getFeeRate(): Promise<string> {
|
|
58
|
-
if(this.blockFeeCache==null || Date.now() - this.blockFeeCache.timestamp > this.MAX_FEE_AGE) {
|
|
59
|
-
let obj = {
|
|
60
|
-
timestamp: Date.now(),
|
|
61
|
-
feeRate: null
|
|
62
|
-
};
|
|
63
|
-
obj.feeRate = this._getFeeRate().catch(e => {
|
|
64
|
-
if(this.blockFeeCache===obj) this.blockFeeCache=null;
|
|
65
|
-
throw e;
|
|
66
|
-
});
|
|
67
|
-
this.blockFeeCache = obj;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
let baseFee = await this.blockFeeCache.feeRate;
|
|
71
|
-
if(baseFee>this.maxFeeRatePerGas) baseFee = this.maxFeeRatePerGas;
|
|
72
|
-
|
|
73
|
-
const fee = baseFee.toString(10)+","+this.priorityFee.toString(10);
|
|
74
|
-
|
|
75
|
-
this.logger.debug("getFeeRate(): calculated fee: "+fee);
|
|
76
|
-
|
|
77
|
-
return fee;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Calculates the total gas fee paid for a given gas limit at a given fee rate
|
|
82
|
-
*
|
|
83
|
-
* @param gas
|
|
84
|
-
* @param feeRate
|
|
85
|
-
*/
|
|
86
|
-
public static getGasFee(gas: number, feeRate: string): bigint {
|
|
87
|
-
if(feeRate==null) return 0n;
|
|
88
|
-
|
|
89
|
-
const [baseFee, priorityFee] = feeRate.split(",");
|
|
90
|
-
|
|
91
|
-
return BigInt(gas) * (BigInt(baseFee) + BigInt(priorityFee));
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
public static applyFeeRate(tx: TransactionRequest, gas: number, feeRate: string) {
|
|
95
|
-
if(feeRate==null) return null;
|
|
96
|
-
|
|
97
|
-
const [baseFee, priorityFee] = feeRate.split(",");
|
|
98
|
-
|
|
99
|
-
tx.maxFeePerGas = BigInt(baseFee) + BigInt(priorityFee);
|
|
100
|
-
tx.maxPriorityFeePerGas = BigInt(priorityFee);
|
|
101
|
-
if(gas!=null) tx.gasLimit = BigInt(gas);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
}
|
|
1
|
+
import { getLogger } from "../../../utils/Utils";
|
|
2
|
+
import {JsonRpcApiProvider, TransactionRequest} from "ethers";
|
|
3
|
+
|
|
4
|
+
export type EVMFeeRate = {
|
|
5
|
+
maxFeePerGas: bigint;
|
|
6
|
+
maxPriorityFee: bigint;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export class EVMFees {
|
|
10
|
+
protected MAX_FEE_AGE = 5000;
|
|
11
|
+
|
|
12
|
+
protected readonly logger = getLogger("EVMFees: ");
|
|
13
|
+
|
|
14
|
+
protected readonly provider: JsonRpcApiProvider;
|
|
15
|
+
protected readonly maxFeeRatePerGas: bigint;
|
|
16
|
+
protected readonly priorityFee: bigint;
|
|
17
|
+
|
|
18
|
+
protected readonly feeMultiplierPPM: bigint;
|
|
19
|
+
|
|
20
|
+
private blockFeeCache: {
|
|
21
|
+
timestamp: number,
|
|
22
|
+
feeRate: Promise<bigint>
|
|
23
|
+
} = null;
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
provider: JsonRpcApiProvider,
|
|
27
|
+
maxFeeRatePerGas: bigint = 500n * 1_000_000_000n,
|
|
28
|
+
priorityFee: bigint = 1n * 1_000_000_000n,
|
|
29
|
+
feeMultiplier: number = 1.25,
|
|
30
|
+
) {
|
|
31
|
+
this.provider = provider;
|
|
32
|
+
this.maxFeeRatePerGas = maxFeeRatePerGas;
|
|
33
|
+
this.priorityFee = priorityFee;
|
|
34
|
+
this.feeMultiplierPPM = BigInt(Math.floor(feeMultiplier * 1_000_000));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Gets evm fee rate
|
|
39
|
+
*
|
|
40
|
+
* @private
|
|
41
|
+
* @returns {Promise<bigint>} L1 gas price denominated in Wei
|
|
42
|
+
*/
|
|
43
|
+
private async _getFeeRate(): Promise<bigint> {
|
|
44
|
+
const block = await this.provider.getBlock("latest");
|
|
45
|
+
|
|
46
|
+
const baseFee = block.baseFeePerGas * this.feeMultiplierPPM / 1_000_000n;
|
|
47
|
+
this.logger.debug("_getFeeRate(): Base fee rate: "+baseFee.toString(10));
|
|
48
|
+
|
|
49
|
+
return baseFee;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Gets the gas price with caching, format: <base fee Wei>,<priority fee Wei>
|
|
54
|
+
*
|
|
55
|
+
* @private
|
|
56
|
+
*/
|
|
57
|
+
public async getFeeRate(): Promise<string> {
|
|
58
|
+
if(this.blockFeeCache==null || Date.now() - this.blockFeeCache.timestamp > this.MAX_FEE_AGE) {
|
|
59
|
+
let obj = {
|
|
60
|
+
timestamp: Date.now(),
|
|
61
|
+
feeRate: null
|
|
62
|
+
};
|
|
63
|
+
obj.feeRate = this._getFeeRate().catch(e => {
|
|
64
|
+
if(this.blockFeeCache===obj) this.blockFeeCache=null;
|
|
65
|
+
throw e;
|
|
66
|
+
});
|
|
67
|
+
this.blockFeeCache = obj;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
let baseFee = await this.blockFeeCache.feeRate;
|
|
71
|
+
if(baseFee>this.maxFeeRatePerGas) baseFee = this.maxFeeRatePerGas;
|
|
72
|
+
|
|
73
|
+
const fee = baseFee.toString(10)+","+this.priorityFee.toString(10);
|
|
74
|
+
|
|
75
|
+
this.logger.debug("getFeeRate(): calculated fee: "+fee);
|
|
76
|
+
|
|
77
|
+
return fee;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Calculates the total gas fee paid for a given gas limit at a given fee rate
|
|
82
|
+
*
|
|
83
|
+
* @param gas
|
|
84
|
+
* @param feeRate
|
|
85
|
+
*/
|
|
86
|
+
public static getGasFee(gas: number, feeRate: string): bigint {
|
|
87
|
+
if(feeRate==null) return 0n;
|
|
88
|
+
|
|
89
|
+
const [baseFee, priorityFee] = feeRate.split(",");
|
|
90
|
+
|
|
91
|
+
return BigInt(gas) * (BigInt(baseFee) + BigInt(priorityFee));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
public static applyFeeRate(tx: TransactionRequest, gas: number, feeRate: string) {
|
|
95
|
+
if(feeRate==null) return null;
|
|
96
|
+
|
|
97
|
+
const [baseFee, priorityFee] = feeRate.split(",");
|
|
98
|
+
|
|
99
|
+
tx.maxFeePerGas = BigInt(baseFee) + BigInt(priorityFee);
|
|
100
|
+
tx.maxPriorityFeePerGas = BigInt(priorityFee);
|
|
101
|
+
if(gas!=null) tx.gasLimit = BigInt(gas);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
}
|