@atomiqlabs/chain-evm 1.0.0-dev.35 → 1.0.0-dev.37
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/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 +127 -127
- 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 +195 -195
- package/dist/evm/btcrelay/EVMBtcRelay.js +423 -423
- 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 +51 -51
- 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 +36 -36
- package/dist/evm/chain/modules/EVMEvents.js +122 -122
- package/dist/evm/chain/modules/EVMFees.d.ts +36 -36
- package/dist/evm/chain/modules/EVMFees.js +73 -73
- 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 -51
- package/dist/evm/chain/modules/EVMTokens.js +142 -113
- package/dist/evm/chain/modules/EVMTransactions.d.ts +89 -89
- package/dist/evm/chain/modules/EVMTransactions.js +230 -216
- 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 +67 -67
- package/dist/evm/events/EVMChainEventsBrowser.d.ts +86 -86
- package/dist/evm/events/EVMChainEventsBrowser.js +294 -294
- package/dist/evm/spv_swap/EVMSpvVaultContract.d.ts +78 -78
- package/dist/evm/spv_swap/EVMSpvVaultContract.js +478 -480
- package/dist/evm/spv_swap/EVMSpvVaultData.d.ts +39 -39
- package/dist/evm/spv_swap/EVMSpvVaultData.js +180 -180
- 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 +193 -193
- package/dist/evm/swaps/EVMSwapContract.js +374 -374
- 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 -131
- 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 -275
- 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/EVMSigner.d.ts +10 -9
- package/dist/evm/wallet/EVMSigner.js +17 -16
- package/dist/index.d.ts +38 -38
- package/dist/index.js +54 -54
- package/dist/utils/Utils.d.ts +15 -15
- package/dist/utils/Utils.js +71 -71
- package/package.json +37 -37
- 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 +178 -178
- 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 +522 -522
- package/src/evm/btcrelay/headers/EVMBtcHeader.ts +109 -109
- package/src/evm/btcrelay/headers/EVMBtcStoredHeader.ts +152 -152
- package/src/evm/chain/EVMChainInterface.ts +155 -155
- 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 +139 -139
- 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 -126
- package/src/evm/chain/modules/EVMTransactions.ts +257 -246
- 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 +81 -81
- package/src/evm/events/EVMChainEventsBrowser.ts +390 -390
- package/src/evm/spv_swap/EVMSpvVaultContract.ts +608 -603
- package/src/evm/spv_swap/EVMSpvVaultData.ts +224 -224
- 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 +592 -592
- 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 -152
- package/src/evm/swaps/modules/EVMSwapClaim.ts +172 -172
- package/src/evm/swaps/modules/EVMSwapInit.ts +328 -325
- package/src/evm/swaps/modules/EVMSwapRefund.ts +229 -229
- package/src/evm/typechain/common.ts +131 -131
- package/src/evm/wallet/EVMSigner.ts +25 -23
- package/src/index.ts +45 -45
- package/src/utils/Utils.ts +81 -81
|
@@ -1,139 +1,139 @@
|
|
|
1
|
-
import {EVMModule} from "../EVMModule";
|
|
2
|
-
import {Log} from "ethers";
|
|
3
|
-
|
|
4
|
-
export class EVMEvents extends EVMModule<any> {
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Returns the all the events occuring in a block range as identified by the contract and keys
|
|
8
|
-
*
|
|
9
|
-
* @param contract
|
|
10
|
-
* @param topics
|
|
11
|
-
* @param startBlock
|
|
12
|
-
* @param endBlock
|
|
13
|
-
* @param abortSignal
|
|
14
|
-
*/
|
|
15
|
-
public async getBlockEvents(
|
|
16
|
-
contract: string, topics: (string[] | string | null)[], startBlock?: number, endBlock: number = startBlock, abortSignal?: AbortSignal
|
|
17
|
-
): Promise<Log[]> {
|
|
18
|
-
let events: Log[] = [];
|
|
19
|
-
|
|
20
|
-
if(startBlock===endBlock) {
|
|
21
|
-
events = await this.root.provider.getLogs({
|
|
22
|
-
address: contract,
|
|
23
|
-
fromBlock: startBlock==null ? this.root.config.safeBlockTag : startBlock,
|
|
24
|
-
toBlock: endBlock==null ? this.root.config.safeBlockTag : endBlock,
|
|
25
|
-
topics
|
|
26
|
-
});
|
|
27
|
-
} else if(endBlock==null) {
|
|
28
|
-
const safeBlock = await this.root.provider.getBlock(this.root.config.safeBlockTag);
|
|
29
|
-
if(safeBlock.number - startBlock > this.root.config.maxLogsBlockRange) {
|
|
30
|
-
for(let i = startBlock + this.root.config.maxLogsBlockRange; i < safeBlock.number; i += this.root.config.maxLogsBlockRange) {
|
|
31
|
-
events.push(...await this.root.provider.getLogs({
|
|
32
|
-
address: contract,
|
|
33
|
-
fromBlock: i - this.root.config.maxLogsBlockRange,
|
|
34
|
-
toBlock: i,
|
|
35
|
-
topics
|
|
36
|
-
}));
|
|
37
|
-
startBlock = i;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
events.push(...await this.root.provider.getLogs({
|
|
41
|
-
address: contract,
|
|
42
|
-
fromBlock: startBlock==null ? this.root.config.safeBlockTag : startBlock,
|
|
43
|
-
toBlock: endBlock==null ? this.root.config.safeBlockTag : endBlock,
|
|
44
|
-
topics
|
|
45
|
-
}));
|
|
46
|
-
} else {
|
|
47
|
-
//Both numeric
|
|
48
|
-
if(endBlock - startBlock > this.root.config.maxLogsBlockRange) {
|
|
49
|
-
for(let i = startBlock + this.root.config.maxLogsBlockRange; i < endBlock; i += this.root.config.maxLogsBlockRange) {
|
|
50
|
-
events.push(...await this.root.provider.getLogs({
|
|
51
|
-
address: contract,
|
|
52
|
-
fromBlock: i - this.root.config.maxLogsBlockRange,
|
|
53
|
-
toBlock: i,
|
|
54
|
-
topics
|
|
55
|
-
}));
|
|
56
|
-
startBlock = i;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
events.push(...await this.root.provider.getLogs({
|
|
60
|
-
address: contract,
|
|
61
|
-
fromBlock: startBlock,
|
|
62
|
-
toBlock: endBlock,
|
|
63
|
-
topics
|
|
64
|
-
}));
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return events.filter(val => !val.removed);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Runs a search backwards in time, processing events from a specific contract and keys
|
|
72
|
-
*
|
|
73
|
-
* @param contract
|
|
74
|
-
* @param topics
|
|
75
|
-
* @param processor called for every batch of returned signatures, should return a value if the correct signature
|
|
76
|
-
* was found, or null if the search should continue
|
|
77
|
-
* @param abortSignal
|
|
78
|
-
* @param genesisHeight Height when the contract was deployed
|
|
79
|
-
*/
|
|
80
|
-
public async findInEvents<T>(
|
|
81
|
-
contract: string, topics: (string[] | string | null)[],
|
|
82
|
-
processor: (signatures: Log[]) => Promise<T>,
|
|
83
|
-
abortSignal?: AbortSignal,
|
|
84
|
-
genesisHeight?: number
|
|
85
|
-
): Promise<T> {
|
|
86
|
-
const {number: latestBlockNumber} = await this.provider.getBlock(this.root.config.safeBlockTag);
|
|
87
|
-
|
|
88
|
-
for(let blockNumber = latestBlockNumber; blockNumber >= (genesisHeight ?? 0); blockNumber-=this.root.config.maxLogsBlockRange) {
|
|
89
|
-
const eventsResult = await this.provider.getLogs({
|
|
90
|
-
address: contract,
|
|
91
|
-
topics,
|
|
92
|
-
fromBlock: Math.max(blockNumber-this.root.config.maxLogsBlockRange, 0),
|
|
93
|
-
toBlock: blockNumber===latestBlockNumber ? this.root.config.safeBlockTag : blockNumber
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
97
|
-
|
|
98
|
-
const result: T = await processor(eventsResult.reverse()); //Newest events first
|
|
99
|
-
if(result!=null) return result;
|
|
100
|
-
}
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Runs a search forwards in time, processing events from a specific contract and keys
|
|
106
|
-
*
|
|
107
|
-
* @param contract
|
|
108
|
-
* @param topics
|
|
109
|
-
* @param processor called for every batch of returned signatures, should return a value if the correct signature
|
|
110
|
-
* was found, or null if the search should continue
|
|
111
|
-
* @param abortSignal
|
|
112
|
-
* @param startHeight Blockheight at which to start
|
|
113
|
-
*/
|
|
114
|
-
public async findInEventsForward<T>(
|
|
115
|
-
contract: string, topics: (string[] | string | null)[],
|
|
116
|
-
processor: (signatures: Log[]) => Promise<T>,
|
|
117
|
-
abortSignal?: AbortSignal,
|
|
118
|
-
startHeight?: number
|
|
119
|
-
): Promise<T> {
|
|
120
|
-
const {number: latestBlockNumber} = await this.provider.getBlock(this.root.config.safeBlockTag);
|
|
121
|
-
|
|
122
|
-
for(let blockNumber = startHeight ?? 0; blockNumber < latestBlockNumber; blockNumber += this.root.config.maxLogsBlockRange) {
|
|
123
|
-
const eventsResult = await this.provider.getLogs({
|
|
124
|
-
address: contract,
|
|
125
|
-
topics,
|
|
126
|
-
fromBlock: blockNumber,
|
|
127
|
-
toBlock: (blockNumber + this.root.config.maxLogsBlockRange) > latestBlockNumber ? this.root.config.safeBlockTag : blockNumber + this.root.config.maxLogsBlockRange
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
131
|
-
|
|
132
|
-
const result: T = await processor(eventsResult); //Oldest events first
|
|
133
|
-
if(result!=null) return result;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
}
|
|
1
|
+
import {EVMModule} from "../EVMModule";
|
|
2
|
+
import {Log} from "ethers";
|
|
3
|
+
|
|
4
|
+
export class EVMEvents extends EVMModule<any> {
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Returns the all the events occuring in a block range as identified by the contract and keys
|
|
8
|
+
*
|
|
9
|
+
* @param contract
|
|
10
|
+
* @param topics
|
|
11
|
+
* @param startBlock
|
|
12
|
+
* @param endBlock
|
|
13
|
+
* @param abortSignal
|
|
14
|
+
*/
|
|
15
|
+
public async getBlockEvents(
|
|
16
|
+
contract: string, topics: (string[] | string | null)[], startBlock?: number, endBlock: number = startBlock, abortSignal?: AbortSignal
|
|
17
|
+
): Promise<Log[]> {
|
|
18
|
+
let events: Log[] = [];
|
|
19
|
+
|
|
20
|
+
if(startBlock===endBlock) {
|
|
21
|
+
events = await this.root.provider.getLogs({
|
|
22
|
+
address: contract,
|
|
23
|
+
fromBlock: startBlock==null ? this.root.config.safeBlockTag : startBlock,
|
|
24
|
+
toBlock: endBlock==null ? this.root.config.safeBlockTag : endBlock,
|
|
25
|
+
topics
|
|
26
|
+
});
|
|
27
|
+
} else if(endBlock==null) {
|
|
28
|
+
const safeBlock = await this.root.provider.getBlock(this.root.config.safeBlockTag);
|
|
29
|
+
if(safeBlock.number - startBlock > this.root.config.maxLogsBlockRange) {
|
|
30
|
+
for(let i = startBlock + this.root.config.maxLogsBlockRange; i < safeBlock.number; i += this.root.config.maxLogsBlockRange) {
|
|
31
|
+
events.push(...await this.root.provider.getLogs({
|
|
32
|
+
address: contract,
|
|
33
|
+
fromBlock: i - this.root.config.maxLogsBlockRange,
|
|
34
|
+
toBlock: i,
|
|
35
|
+
topics
|
|
36
|
+
}));
|
|
37
|
+
startBlock = i;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
events.push(...await this.root.provider.getLogs({
|
|
41
|
+
address: contract,
|
|
42
|
+
fromBlock: startBlock==null ? this.root.config.safeBlockTag : startBlock,
|
|
43
|
+
toBlock: endBlock==null ? this.root.config.safeBlockTag : endBlock,
|
|
44
|
+
topics
|
|
45
|
+
}));
|
|
46
|
+
} else {
|
|
47
|
+
//Both numeric
|
|
48
|
+
if(endBlock - startBlock > this.root.config.maxLogsBlockRange) {
|
|
49
|
+
for(let i = startBlock + this.root.config.maxLogsBlockRange; i < endBlock; i += this.root.config.maxLogsBlockRange) {
|
|
50
|
+
events.push(...await this.root.provider.getLogs({
|
|
51
|
+
address: contract,
|
|
52
|
+
fromBlock: i - this.root.config.maxLogsBlockRange,
|
|
53
|
+
toBlock: i,
|
|
54
|
+
topics
|
|
55
|
+
}));
|
|
56
|
+
startBlock = i;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
events.push(...await this.root.provider.getLogs({
|
|
60
|
+
address: contract,
|
|
61
|
+
fromBlock: startBlock,
|
|
62
|
+
toBlock: endBlock,
|
|
63
|
+
topics
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return events.filter(val => !val.removed);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Runs a search backwards in time, processing events from a specific contract and keys
|
|
72
|
+
*
|
|
73
|
+
* @param contract
|
|
74
|
+
* @param topics
|
|
75
|
+
* @param processor called for every batch of returned signatures, should return a value if the correct signature
|
|
76
|
+
* was found, or null if the search should continue
|
|
77
|
+
* @param abortSignal
|
|
78
|
+
* @param genesisHeight Height when the contract was deployed
|
|
79
|
+
*/
|
|
80
|
+
public async findInEvents<T>(
|
|
81
|
+
contract: string, topics: (string[] | string | null)[],
|
|
82
|
+
processor: (signatures: Log[]) => Promise<T>,
|
|
83
|
+
abortSignal?: AbortSignal,
|
|
84
|
+
genesisHeight?: number
|
|
85
|
+
): Promise<T> {
|
|
86
|
+
const {number: latestBlockNumber} = await this.provider.getBlock(this.root.config.safeBlockTag);
|
|
87
|
+
|
|
88
|
+
for(let blockNumber = latestBlockNumber; blockNumber >= (genesisHeight ?? 0); blockNumber-=this.root.config.maxLogsBlockRange) {
|
|
89
|
+
const eventsResult = await this.provider.getLogs({
|
|
90
|
+
address: contract,
|
|
91
|
+
topics,
|
|
92
|
+
fromBlock: Math.max(blockNumber-this.root.config.maxLogsBlockRange, 0),
|
|
93
|
+
toBlock: blockNumber===latestBlockNumber ? this.root.config.safeBlockTag : blockNumber
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
97
|
+
|
|
98
|
+
const result: T = await processor(eventsResult.reverse()); //Newest events first
|
|
99
|
+
if(result!=null) return result;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Runs a search forwards in time, processing events from a specific contract and keys
|
|
106
|
+
*
|
|
107
|
+
* @param contract
|
|
108
|
+
* @param topics
|
|
109
|
+
* @param processor called for every batch of returned signatures, should return a value if the correct signature
|
|
110
|
+
* was found, or null if the search should continue
|
|
111
|
+
* @param abortSignal
|
|
112
|
+
* @param startHeight Blockheight at which to start
|
|
113
|
+
*/
|
|
114
|
+
public async findInEventsForward<T>(
|
|
115
|
+
contract: string, topics: (string[] | string | null)[],
|
|
116
|
+
processor: (signatures: Log[]) => Promise<T>,
|
|
117
|
+
abortSignal?: AbortSignal,
|
|
118
|
+
startHeight?: number
|
|
119
|
+
): Promise<T> {
|
|
120
|
+
const {number: latestBlockNumber} = await this.provider.getBlock(this.root.config.safeBlockTag);
|
|
121
|
+
|
|
122
|
+
for(let blockNumber = startHeight ?? 0; blockNumber < latestBlockNumber; blockNumber += this.root.config.maxLogsBlockRange) {
|
|
123
|
+
const eventsResult = await this.provider.getLogs({
|
|
124
|
+
address: contract,
|
|
125
|
+
topics,
|
|
126
|
+
fromBlock: blockNumber,
|
|
127
|
+
toBlock: (blockNumber + this.root.config.maxLogsBlockRange) > latestBlockNumber ? this.root.config.safeBlockTag : blockNumber + this.root.config.maxLogsBlockRange
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
131
|
+
|
|
132
|
+
const result: T = await processor(eventsResult); //Oldest events first
|
|
133
|
+
if(result!=null) return result;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
}
|
|
@@ -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: <gas price in Wei>;<transaction version: v1/v3>
|
|
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
|
-
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: <gas price in Wei>;<transaction version: v1/v3>
|
|
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
|
+
tx.gasLimit = BigInt(gas);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
}
|
|
@@ -1,76 +1,76 @@
|
|
|
1
|
-
import {EVMSigner} from "../../wallet/EVMSigner";
|
|
2
|
-
import {EVMModule} from "../EVMModule";
|
|
3
|
-
import {EVMChainInterface} from "../EVMChainInterface";
|
|
4
|
-
import {sha256, verifyTypedData, TypedDataField} from "ethers";
|
|
5
|
-
|
|
6
|
-
const DataHash = [
|
|
7
|
-
{ name: "dataHash", type: "bytes32" }
|
|
8
|
-
];
|
|
9
|
-
|
|
10
|
-
export class EVMSignatures extends EVMModule<any> {
|
|
11
|
-
|
|
12
|
-
private readonly domainName: string;
|
|
13
|
-
|
|
14
|
-
constructor(root: EVMChainInterface<any>, domainName: string = "atomiq.exchange") {
|
|
15
|
-
super(root);
|
|
16
|
-
this.domainName = domainName;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
public async signTypedMessage(contract: string, signer: EVMSigner, type: TypedDataField[], typeName: string, message: object): Promise<string> {
|
|
20
|
-
return signer.account.signTypedData({
|
|
21
|
-
name: this.domainName,
|
|
22
|
-
version: "1",
|
|
23
|
-
chainId: BigInt(this.root.evmChainId),
|
|
24
|
-
verifyingContract: contract
|
|
25
|
-
}, {[typeName]: type}, message);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
public async isValidSignature(contract: string, signature: string, address: string, type: TypedDataField[], typeName: string, message: object): Promise<boolean> {
|
|
29
|
-
return Promise.resolve(address === verifyTypedData({
|
|
30
|
-
name: this.domainName,
|
|
31
|
-
version: "1",
|
|
32
|
-
chainId: BigInt(this.root.evmChainId),
|
|
33
|
-
verifyingContract: contract
|
|
34
|
-
}, {[typeName]: type}, message, signature));
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
///////////////////
|
|
38
|
-
//// Data signatures
|
|
39
|
-
/**
|
|
40
|
-
* Produces a signature over the sha256 of a specified data Buffer, only works with providers which
|
|
41
|
-
* expose their private key (i.e. backend based, not browser wallet based)
|
|
42
|
-
*
|
|
43
|
-
* @param signer
|
|
44
|
-
* @param data data to sign
|
|
45
|
-
*/
|
|
46
|
-
public getDataSignature(signer: EVMSigner, data: Buffer): Promise<string> {
|
|
47
|
-
return signer.account.signTypedData({
|
|
48
|
-
name: this.domainName,
|
|
49
|
-
version: "1",
|
|
50
|
-
chainId: BigInt(this.root.evmChainId),
|
|
51
|
-
verifyingContract: "0x0000000000000000000000000000000000000000"
|
|
52
|
-
}, {DataHash}, {
|
|
53
|
-
dataHash: sha256(data)
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Checks whether a signature is a valid signature produced by the account over a data message (computes
|
|
59
|
-
* sha256 hash of the message)
|
|
60
|
-
*
|
|
61
|
-
* @param data signed data
|
|
62
|
-
* @param signature data signature
|
|
63
|
-
* @param address public key of the signer
|
|
64
|
-
*/
|
|
65
|
-
public isValidDataSignature(data: Buffer, signature: string, address: string): Promise<boolean> {
|
|
66
|
-
return Promise.resolve(address === verifyTypedData({
|
|
67
|
-
name: this.domainName,
|
|
68
|
-
version: "1",
|
|
69
|
-
chainId: BigInt(this.root.evmChainId),
|
|
70
|
-
verifyingContract: "0x0000000000000000000000000000000000000000"
|
|
71
|
-
}, {DataHash}, {
|
|
72
|
-
dataHash: sha256(data)
|
|
73
|
-
}, signature));
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
}
|
|
1
|
+
import {EVMSigner} from "../../wallet/EVMSigner";
|
|
2
|
+
import {EVMModule} from "../EVMModule";
|
|
3
|
+
import {EVMChainInterface} from "../EVMChainInterface";
|
|
4
|
+
import {sha256, verifyTypedData, TypedDataField} from "ethers";
|
|
5
|
+
|
|
6
|
+
const DataHash = [
|
|
7
|
+
{ name: "dataHash", type: "bytes32" }
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
export class EVMSignatures extends EVMModule<any> {
|
|
11
|
+
|
|
12
|
+
private readonly domainName: string;
|
|
13
|
+
|
|
14
|
+
constructor(root: EVMChainInterface<any>, domainName: string = "atomiq.exchange") {
|
|
15
|
+
super(root);
|
|
16
|
+
this.domainName = domainName;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public async signTypedMessage(contract: string, signer: EVMSigner, type: TypedDataField[], typeName: string, message: object): Promise<string> {
|
|
20
|
+
return signer.account.signTypedData({
|
|
21
|
+
name: this.domainName,
|
|
22
|
+
version: "1",
|
|
23
|
+
chainId: BigInt(this.root.evmChainId),
|
|
24
|
+
verifyingContract: contract
|
|
25
|
+
}, {[typeName]: type}, message);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public async isValidSignature(contract: string, signature: string, address: string, type: TypedDataField[], typeName: string, message: object): Promise<boolean> {
|
|
29
|
+
return Promise.resolve(address === verifyTypedData({
|
|
30
|
+
name: this.domainName,
|
|
31
|
+
version: "1",
|
|
32
|
+
chainId: BigInt(this.root.evmChainId),
|
|
33
|
+
verifyingContract: contract
|
|
34
|
+
}, {[typeName]: type}, message, signature));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
///////////////////
|
|
38
|
+
//// Data signatures
|
|
39
|
+
/**
|
|
40
|
+
* Produces a signature over the sha256 of a specified data Buffer, only works with providers which
|
|
41
|
+
* expose their private key (i.e. backend based, not browser wallet based)
|
|
42
|
+
*
|
|
43
|
+
* @param signer
|
|
44
|
+
* @param data data to sign
|
|
45
|
+
*/
|
|
46
|
+
public getDataSignature(signer: EVMSigner, data: Buffer): Promise<string> {
|
|
47
|
+
return signer.account.signTypedData({
|
|
48
|
+
name: this.domainName,
|
|
49
|
+
version: "1",
|
|
50
|
+
chainId: BigInt(this.root.evmChainId),
|
|
51
|
+
verifyingContract: "0x0000000000000000000000000000000000000000"
|
|
52
|
+
}, {DataHash}, {
|
|
53
|
+
dataHash: sha256(data)
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Checks whether a signature is a valid signature produced by the account over a data message (computes
|
|
59
|
+
* sha256 hash of the message)
|
|
60
|
+
*
|
|
61
|
+
* @param data signed data
|
|
62
|
+
* @param signature data signature
|
|
63
|
+
* @param address public key of the signer
|
|
64
|
+
*/
|
|
65
|
+
public isValidDataSignature(data: Buffer, signature: string, address: string): Promise<boolean> {
|
|
66
|
+
return Promise.resolve(address === verifyTypedData({
|
|
67
|
+
name: this.domainName,
|
|
68
|
+
version: "1",
|
|
69
|
+
chainId: BigInt(this.root.evmChainId),
|
|
70
|
+
verifyingContract: "0x0000000000000000000000000000000000000000"
|
|
71
|
+
}, {DataHash}, {
|
|
72
|
+
dataHash: sha256(data)
|
|
73
|
+
}, signature));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
}
|