@aztec/ethereum 4.0.0-nightly.20250907 → 4.0.0-nightly.20260108
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/dest/account.d.ts +1 -1
- package/dest/chain.d.ts +1 -1
- package/dest/client.d.ts +2 -2
- package/dest/client.d.ts.map +1 -1
- package/dest/client.js +6 -2
- package/dest/config.d.ts +18 -46
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +40 -285
- package/dest/constants.d.ts +1 -1
- package/dest/contracts/empire_base.d.ts +8 -6
- package/dest/contracts/empire_base.d.ts.map +1 -1
- package/dest/contracts/empire_base.js +1 -1
- package/dest/contracts/empire_slashing_proposer.d.ts +8 -6
- package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/empire_slashing_proposer.js +18 -3
- package/dest/contracts/errors.d.ts +1 -1
- package/dest/contracts/errors.d.ts.map +1 -1
- package/dest/contracts/fee_asset_handler.d.ts +4 -4
- package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
- package/dest/contracts/fee_juice.d.ts +1 -1
- package/dest/contracts/fee_juice.d.ts.map +1 -1
- package/dest/contracts/governance.d.ts +16 -16
- package/dest/contracts/governance.d.ts.map +1 -1
- package/dest/contracts/governance.js +7 -3
- package/dest/contracts/governance_proposer.d.ts +7 -6
- package/dest/contracts/governance_proposer.d.ts.map +1 -1
- package/dest/contracts/governance_proposer.js +400 -12
- package/dest/contracts/gse.d.ts +1 -1
- package/dest/contracts/gse.d.ts.map +1 -1
- package/dest/contracts/inbox.d.ts +7 -3
- package/dest/contracts/inbox.d.ts.map +1 -1
- package/dest/contracts/inbox.js +4 -0
- package/dest/contracts/index.d.ts +1 -1
- package/dest/contracts/multicall.d.ts +5 -7
- package/dest/contracts/multicall.d.ts.map +1 -1
- package/dest/contracts/multicall.js +6 -4
- package/dest/contracts/registry.d.ts +1 -1
- package/dest/contracts/registry.d.ts.map +1 -1
- package/dest/contracts/rollup.d.ts +169 -118
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +714 -243
- package/dest/contracts/slasher_contract.d.ts +11 -1
- package/dest/contracts/slasher_contract.d.ts.map +1 -1
- package/dest/contracts/slasher_contract.js +18 -0
- package/dest/contracts/tally_slashing_proposer.d.ts +15 -7
- package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/tally_slashing_proposer.js +15 -5
- package/dest/contracts/utils.d.ts +1 -1
- package/dest/deploy_aztec_l1_contracts.d.ts +247 -0
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
- package/dest/deploy_aztec_l1_contracts.js +336 -0
- package/dest/deploy_l1_contract.d.ts +68 -0
- package/dest/deploy_l1_contract.d.ts.map +1 -0
- package/dest/deploy_l1_contract.js +312 -0
- package/dest/eth-signer/eth-signer.d.ts +1 -1
- package/dest/eth-signer/index.d.ts +1 -1
- package/dest/forwarder_proxy.d.ts +32 -0
- package/dest/forwarder_proxy.d.ts.map +1 -0
- package/dest/forwarder_proxy.js +93 -0
- package/dest/l1_artifacts.d.ts +17733 -6280
- package/dest/l1_artifacts.d.ts.map +1 -1
- package/dest/l1_artifacts.js +10 -5
- package/dest/l1_contract_addresses.d.ts +8 -4
- package/dest/l1_contract_addresses.d.ts.map +1 -1
- package/dest/l1_contract_addresses.js +5 -4
- package/dest/l1_reader.d.ts +4 -2
- package/dest/l1_reader.d.ts.map +1 -1
- package/dest/l1_reader.js +7 -1
- package/dest/l1_tx_utils/config.d.ts +59 -0
- package/dest/l1_tx_utils/config.d.ts.map +1 -0
- package/dest/l1_tx_utils/config.js +96 -0
- package/dest/l1_tx_utils/constants.d.ts +12 -0
- package/dest/l1_tx_utils/constants.d.ts.map +1 -0
- package/dest/l1_tx_utils/constants.js +39 -0
- package/dest/l1_tx_utils/factory.d.ts +24 -0
- package/dest/l1_tx_utils/factory.d.ts.map +1 -0
- package/dest/l1_tx_utils/factory.js +12 -0
- package/dest/l1_tx_utils/fee-strategies/index.d.ts +10 -0
- package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -0
- package/dest/l1_tx_utils/fee-strategies/index.js +12 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +8 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +129 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +23 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +191 -0
- package/dest/l1_tx_utils/fee-strategies/types.d.ts +51 -0
- package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -0
- package/dest/l1_tx_utils/fee-strategies/types.js +3 -0
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +41 -0
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +48 -0
- package/dest/l1_tx_utils/index-blobs.d.ts +3 -0
- package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -0
- package/dest/l1_tx_utils/index-blobs.js +2 -0
- package/dest/l1_tx_utils/index.d.ts +12 -0
- package/dest/l1_tx_utils/index.d.ts.map +1 -0
- package/dest/l1_tx_utils/index.js +12 -0
- package/dest/l1_tx_utils/interfaces.d.ts +76 -0
- package/dest/l1_tx_utils/interfaces.d.ts.map +1 -0
- package/dest/l1_tx_utils/interfaces.js +4 -0
- package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +233 -0
- package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -0
- package/dest/l1_tx_utils/l1_fee_analyzer.js +506 -0
- package/dest/l1_tx_utils/l1_tx_utils.d.ts +94 -0
- package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/l1_tx_utils.js +623 -0
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +26 -0
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +1 -0
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +26 -0
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +83 -0
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/readonly_l1_tx_utils.js +323 -0
- package/dest/l1_tx_utils/signer.d.ts +4 -0
- package/dest/l1_tx_utils/signer.d.ts.map +1 -0
- package/dest/l1_tx_utils/signer.js +16 -0
- package/dest/l1_tx_utils/types.d.ts +67 -0
- package/dest/l1_tx_utils/types.d.ts.map +1 -0
- package/dest/l1_tx_utils/types.js +26 -0
- package/dest/l1_tx_utils/utils.d.ts +4 -0
- package/dest/l1_tx_utils/utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/utils.js +14 -0
- package/dest/l1_types.d.ts +1 -1
- package/dest/publisher_manager.d.ts +8 -3
- package/dest/publisher_manager.d.ts.map +1 -1
- package/dest/publisher_manager.js +36 -8
- package/dest/queries.d.ts +1 -1
- package/dest/queries.d.ts.map +1 -1
- package/dest/queries.js +20 -14
- package/dest/test/chain_monitor.d.ts +29 -22
- package/dest/test/chain_monitor.d.ts.map +1 -1
- package/dest/test/chain_monitor.js +81 -38
- package/dest/test/delayed_tx_utils.d.ts +3 -3
- package/dest/test/delayed_tx_utils.d.ts.map +1 -1
- package/dest/test/delayed_tx_utils.js +2 -2
- package/dest/test/eth_cheat_codes.d.ts +36 -14
- package/dest/test/eth_cheat_codes.d.ts.map +1 -1
- package/dest/test/eth_cheat_codes.js +126 -31
- package/dest/test/eth_cheat_codes_with_state.d.ts +1 -1
- package/dest/test/eth_cheat_codes_with_state.d.ts.map +1 -1
- package/dest/test/index.d.ts +1 -1
- package/dest/test/rollup_cheat_codes.d.ts +23 -20
- package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
- package/dest/test/rollup_cheat_codes.js +82 -43
- package/dest/test/start_anvil.d.ts +4 -1
- package/dest/test/start_anvil.d.ts.map +1 -1
- package/dest/test/start_anvil.js +2 -1
- package/dest/test/tx_delayer.d.ts +1 -1
- package/dest/test/tx_delayer.d.ts.map +1 -1
- package/dest/test/tx_delayer.js +4 -3
- package/dest/test/upgrade_utils.d.ts +1 -1
- package/dest/test/upgrade_utils.d.ts.map +1 -1
- package/dest/test/upgrade_utils.js +3 -2
- package/dest/types.d.ts +57 -2
- package/dest/types.d.ts.map +1 -1
- package/dest/utils.d.ts +15 -3
- package/dest/utils.d.ts.map +1 -1
- package/dest/utils.js +28 -161
- package/dest/zkPassportVerifierAddress.d.ts +1 -1
- package/dest/zkPassportVerifierAddress.js +1 -1
- package/package.json +33 -14
- package/src/client.ts +3 -3
- package/src/config.ts +49 -358
- package/src/contracts/empire_base.ts +7 -6
- package/src/contracts/empire_slashing_proposer.ts +23 -8
- package/src/contracts/fee_asset_handler.ts +1 -1
- package/src/contracts/governance.ts +3 -3
- package/src/contracts/governance_proposer.ts +19 -9
- package/src/contracts/inbox.ts +7 -2
- package/src/contracts/multicall.ts +12 -10
- package/src/contracts/rollup.ts +374 -236
- package/src/contracts/slasher_contract.ts +22 -0
- package/src/contracts/tally_slashing_proposer.ts +21 -9
- package/src/deploy_aztec_l1_contracts.ts +557 -0
- package/src/deploy_l1_contract.ts +362 -0
- package/src/forwarder_proxy.ts +108 -0
- package/src/l1_artifacts.ts +14 -6
- package/src/l1_contract_addresses.ts +24 -20
- package/src/l1_reader.ts +10 -2
- package/src/l1_tx_utils/README.md +177 -0
- package/src/l1_tx_utils/config.ts +161 -0
- package/src/l1_tx_utils/constants.ts +29 -0
- package/src/l1_tx_utils/factory.ts +64 -0
- package/src/l1_tx_utils/fee-strategies/index.ts +22 -0
- package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +163 -0
- package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +245 -0
- package/src/l1_tx_utils/fee-strategies/types.ts +56 -0
- package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +119 -0
- package/src/l1_tx_utils/index-blobs.ts +2 -0
- package/src/l1_tx_utils/index.ts +14 -0
- package/src/l1_tx_utils/interfaces.ts +86 -0
- package/src/l1_tx_utils/l1_fee_analyzer.ts +803 -0
- package/src/l1_tx_utils/l1_tx_utils.ts +738 -0
- package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +77 -0
- package/src/l1_tx_utils/readonly_l1_tx_utils.ts +419 -0
- package/src/l1_tx_utils/signer.ts +28 -0
- package/src/l1_tx_utils/types.ts +85 -0
- package/src/l1_tx_utils/utils.ts +16 -0
- package/src/publisher_manager.ts +51 -9
- package/src/queries.ts +24 -10
- package/src/test/chain_monitor.ts +102 -44
- package/src/test/delayed_tx_utils.ts +2 -2
- package/src/test/eth_cheat_codes.ts +150 -31
- package/src/test/rollup_cheat_codes.ts +95 -53
- package/src/test/start_anvil.ts +4 -0
- package/src/test/tx_delayer.ts +5 -3
- package/src/test/upgrade_utils.ts +3 -2
- package/src/types.ts +62 -0
- package/src/utils.ts +41 -184
- package/src/zkPassportVerifierAddress.ts +1 -1
- package/dest/deploy_l1_contracts.d.ts +0 -211
- package/dest/deploy_l1_contracts.d.ts.map +0 -1
- package/dest/deploy_l1_contracts.js +0 -1267
- package/dest/index.d.ts +0 -18
- package/dest/index.d.ts.map +0 -1
- package/dest/index.js +0 -17
- package/dest/l1_tx_utils.d.ts +0 -250
- package/dest/l1_tx_utils.d.ts.map +0 -1
- package/dest/l1_tx_utils.js +0 -826
- package/dest/l1_tx_utils_with_blobs.d.ts +0 -19
- package/dest/l1_tx_utils_with_blobs.d.ts.map +0 -1
- package/dest/l1_tx_utils_with_blobs.js +0 -85
- package/src/deploy_l1_contracts.ts +0 -1596
- package/src/index.ts +0 -17
- package/src/l1_tx_utils.ts +0 -1105
- package/src/l1_tx_utils_with_blobs.ts +0 -144
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Blob } from '@aztec/blob-lib';
|
|
2
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
+
import { L1TxUtils } from './l1_tx_utils.js';
|
|
4
|
+
import { createViemSigner } from './signer.js';
|
|
5
|
+
/** Extends L1TxUtils with the capability to cancel blobs. This needs to be a separate class so we don't require a dependency on blob-lib unnecessarily. */ export class L1TxUtilsWithBlobs extends L1TxUtils {
|
|
6
|
+
/** Makes empty blob inputs for the cancellation tx. */ makeEmptyBlobInputs(maxFeePerBlobGas) {
|
|
7
|
+
const blobData = new Uint8Array(131072).fill(0);
|
|
8
|
+
const kzg = Blob.getViemKzgInstance();
|
|
9
|
+
return {
|
|
10
|
+
blobs: [
|
|
11
|
+
blobData
|
|
12
|
+
],
|
|
13
|
+
kzg,
|
|
14
|
+
maxFeePerBlobGas
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function createL1TxUtilsWithBlobsFromViemWallet(client, deps = {}, config = {}, debugMaxGasLimit = false) {
|
|
19
|
+
return new L1TxUtilsWithBlobs(client, EthAddress.fromString(client.account.address), createViemSigner(client), deps.logger, deps.dateProvider, config, debugMaxGasLimit, deps.store, deps.metrics);
|
|
20
|
+
}
|
|
21
|
+
export function createL1TxUtilsWithBlobsFromEthSigner(client, signer, deps = {}, config = {}, debugMaxGasLimit = false) {
|
|
22
|
+
const callback = async (transaction, _signingAddress)=>{
|
|
23
|
+
return (await signer.signTransaction(transaction)).toViemTransactionSignature();
|
|
24
|
+
};
|
|
25
|
+
return new L1TxUtilsWithBlobs(client, signer.address, callback, deps.logger, deps.dateProvider, config, debugMaxGasLimit, deps.store, deps.metrics);
|
|
26
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
3
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
4
|
+
import { type Abi, type Account, type BlockOverrides, type GetCodeReturnType, type Hex, type StateOverride } from 'viem';
|
|
5
|
+
import type { ViemClient } from '../types.js';
|
|
6
|
+
import { type L1TxUtilsConfig } from './config.js';
|
|
7
|
+
import type { GasPrice, L1BlobInputs, L1TxRequest, TransactionStats } from './types.js';
|
|
8
|
+
export declare class ReadOnlyL1TxUtils {
|
|
9
|
+
client: ViemClient;
|
|
10
|
+
protected logger: Logger;
|
|
11
|
+
readonly dateProvider: DateProvider;
|
|
12
|
+
protected debugMaxGasLimit: boolean;
|
|
13
|
+
config: Required<L1TxUtilsConfig>;
|
|
14
|
+
protected interrupted: boolean;
|
|
15
|
+
constructor(client: ViemClient, logger: Logger | undefined, dateProvider: DateProvider, config?: Partial<L1TxUtilsConfig>, debugMaxGasLimit?: boolean);
|
|
16
|
+
interrupt(): void;
|
|
17
|
+
restart(): void;
|
|
18
|
+
getBlock(): Promise<{
|
|
19
|
+
baseFeePerGas: bigint | null;
|
|
20
|
+
blobGasUsed: bigint;
|
|
21
|
+
difficulty: bigint;
|
|
22
|
+
excessBlobGas: bigint;
|
|
23
|
+
extraData: `0x${string}`;
|
|
24
|
+
gasLimit: bigint;
|
|
25
|
+
gasUsed: bigint;
|
|
26
|
+
hash: `0x${string}`;
|
|
27
|
+
logsBloom: `0x${string}`;
|
|
28
|
+
miner: `0x${string}`;
|
|
29
|
+
mixHash: `0x${string}`;
|
|
30
|
+
nonce: `0x${string}`;
|
|
31
|
+
number: bigint;
|
|
32
|
+
parentBeaconBlockRoot?: `0x${string}` | undefined;
|
|
33
|
+
parentHash: `0x${string}`;
|
|
34
|
+
receiptsRoot: `0x${string}`;
|
|
35
|
+
sealFields: `0x${string}`[];
|
|
36
|
+
sha3Uncles: `0x${string}`;
|
|
37
|
+
size: bigint;
|
|
38
|
+
stateRoot: `0x${string}`;
|
|
39
|
+
timestamp: bigint;
|
|
40
|
+
totalDifficulty: bigint | null;
|
|
41
|
+
transactionsRoot: `0x${string}`;
|
|
42
|
+
uncles: `0x${string}`[];
|
|
43
|
+
withdrawals?: import("viem").Withdrawal[] | undefined;
|
|
44
|
+
withdrawalsRoot?: `0x${string}` | undefined;
|
|
45
|
+
transactions: `0x${string}`[];
|
|
46
|
+
}>;
|
|
47
|
+
getBlockNumber(): Promise<bigint>;
|
|
48
|
+
getCode(address: EthAddress): Promise<GetCodeReturnType>;
|
|
49
|
+
/**
|
|
50
|
+
* Gets the current gas price with bounds checking
|
|
51
|
+
*/
|
|
52
|
+
getGasPrice(gasConfigOverrides?: L1TxUtilsConfig, isBlobTx?: boolean, attempt?: number, previousGasPrice?: typeof attempt extends 0 ? never : GasPrice): Promise<GasPrice>;
|
|
53
|
+
/**
|
|
54
|
+
* Estimates gas and adds buffer
|
|
55
|
+
*/
|
|
56
|
+
estimateGas(account: Account | Hex, request: L1TxRequest, _gasConfig?: L1TxUtilsConfig, _blobInputs?: L1BlobInputs): Promise<bigint>;
|
|
57
|
+
getTransactionStats(txHash: string): Promise<TransactionStats | undefined>;
|
|
58
|
+
tryGetErrorFromRevertedTx(data: Hex, args: {
|
|
59
|
+
args: readonly any[];
|
|
60
|
+
functionName: string;
|
|
61
|
+
abi: Abi;
|
|
62
|
+
address: Hex;
|
|
63
|
+
}, blobInputs: (L1BlobInputs & {
|
|
64
|
+
maxFeePerBlobGas: bigint;
|
|
65
|
+
}) | undefined, stateOverride?: StateOverride): Promise<string | undefined>;
|
|
66
|
+
simulate(request: L1TxRequest & {
|
|
67
|
+
gas?: bigint;
|
|
68
|
+
from?: Hex;
|
|
69
|
+
}, blockOverrides?: BlockOverrides<bigint, number>, stateOverrides?: StateOverride, abi?: Abi, _gasConfig?: L1TxUtilsConfig & {
|
|
70
|
+
fallbackGasEstimate?: bigint;
|
|
71
|
+
}): Promise<{
|
|
72
|
+
gasUsed: bigint;
|
|
73
|
+
result: `0x${string}`;
|
|
74
|
+
}>;
|
|
75
|
+
protected _simulate(call: any, blockOverrides: BlockOverrides<bigint, number> | undefined, stateOverrides: StateOverride | undefined, gasConfig: L1TxUtilsConfig & {
|
|
76
|
+
fallbackGasEstimate?: bigint;
|
|
77
|
+
}, abi: Abi): Promise<{
|
|
78
|
+
gasUsed: bigint;
|
|
79
|
+
result: `0x${string}`;
|
|
80
|
+
}>;
|
|
81
|
+
bumpGasLimit(gasLimit: bigint, _gasConfig?: L1TxUtilsConfig): bigint;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG9ubHlfbDFfdHhfdXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sMV90eF91dGlscy9yZWFkb25seV9sMV90eF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFFbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXZELE9BQU8sRUFDTCxLQUFLLEdBQUcsRUFDUixLQUFLLE9BQU8sRUFFWixLQUFLLGNBQWMsRUFFbkIsS0FBSyxpQkFBaUIsRUFDdEIsS0FBSyxHQUFHLEVBR1IsS0FBSyxhQUFhLEVBS25CLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBbUQsTUFBTSxhQUFhLENBQUM7QUFTcEcsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFNeEYscUJBQWEsaUJBQWlCO0lBS25CLE1BQU0sRUFBRSxVQUFVO0lBQ3pCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTTthQUNSLFlBQVksRUFBRSxZQUFZO0lBRTFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPO0lBUjlCLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDekMsU0FBUyxDQUFDLFdBQVcsVUFBUztJQUU5QixZQUNTLE1BQU0sRUFBRSxVQUFVLEVBQ2YsTUFBTSxvQkFBcUQsRUFDckQsWUFBWSxFQUFFLFlBQVksRUFDMUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUN2QixnQkFBZ0IsR0FBRSxPQUFlLEVBRzVDO0lBRU0sU0FBUyxTQUVmO0lBRU0sT0FBTyxTQUViO0lBRU0sUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQUVkO0lBRU0sY0FBYyxvQkFFcEI7SUFFTSxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FFOUQ7SUFFRDs7T0FFRztJQUNVLFdBQVcsQ0FDdEIsa0JBQWtCLENBQUMsRUFBRSxlQUFlLEVBQ3BDLFFBQVEsR0FBRSxPQUFlLEVBQ3pCLE9BQU8sR0FBRSxNQUFVLEVBQ25CLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxPQUFPLFNBQVMsQ0FBQyxHQUFHLEtBQUssR0FBRyxRQUFRLEdBQzdELE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FtSm5CO0lBRUQ7O09BRUc7SUFDVSxXQUFXLENBQ3RCLE9BQU8sRUFBRSxPQUFPLEdBQUcsR0FBRyxFQUN0QixPQUFPLEVBQUUsV0FBVyxFQUNwQixVQUFVLENBQUMsRUFBRSxlQUFlLEVBQzVCLFdBQVcsQ0FBQyxFQUFFLFlBQVksR0FDekIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQThCakI7SUFFSyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsQ0FZL0U7SUFFWSx5QkFBeUIsQ0FDcEMsSUFBSSxFQUFFLEdBQUcsRUFDVCxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNyQixZQUFZLEVBQUUsTUFBTSxDQUFDO1FBQ3JCLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDVCxPQUFPLEVBQUUsR0FBRyxDQUFDO0tBQ2QsRUFDRCxVQUFVLEVBQUUsQ0FBQyxZQUFZLEdBQUc7UUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDLEdBQUcsU0FBUyxFQUNyRSxhQUFhLEdBQUUsYUFBa0IsK0JBZ0RsQztJQUVZLFFBQVEsQ0FDbkIsT0FBTyxFQUFFLFdBQVcsR0FBRztRQUFFLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQTtLQUFFLEVBQ25ELGNBQWMsR0FBRSxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBTSxFQUNuRCxjQUFjLEdBQUUsYUFBa0IsRUFDbEMsR0FBRyxHQUFFLEdBQWUsRUFDcEIsVUFBVSxDQUFDLEVBQUUsZUFBZSxHQUFHO1FBQUUsbUJBQW1CLENBQUMsRUFBRSxNQUFNLENBQUE7S0FBRSxHQUM5RCxPQUFPLENBQUM7UUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO1FBQUMsTUFBTSxFQUFFLEtBQUssTUFBTSxFQUFFLENBQUE7S0FBRSxDQUFDLENBVXJEO0lBRUQsVUFBZ0IsU0FBUyxDQUN2QixJQUFJLEVBQUUsR0FBRyxFQUNULGNBQWMsNENBQXFDLEVBQ25ELGNBQWMsMkJBQW9CLEVBQ2xDLFNBQVMsRUFBRSxlQUFlLEdBQUc7UUFBRSxtQkFBbUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEVBQzdELEdBQUcsRUFBRSxHQUFHOzs7T0FvQ1Q7SUFFTSxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxlQUFlLEdBQUcsTUFBTSxDQVcxRTtDQUNGIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readonly_l1_tx_utils.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/readonly_l1_tx_utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAIvD,OAAO,EACL,KAAK,GAAG,EACR,KAAK,OAAO,EAEZ,KAAK,cAAc,EAEnB,KAAK,iBAAiB,EACtB,KAAK,GAAG,EAGR,KAAK,aAAa,EAKnB,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,KAAK,eAAe,EAAmD,MAAM,aAAa,CAAC;AASpG,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMxF,qBAAa,iBAAiB;IAKnB,MAAM,EAAE,UAAU;IACzB,SAAS,CAAC,MAAM,EAAE,MAAM;aACR,YAAY,EAAE,YAAY;IAE1C,SAAS,CAAC,gBAAgB,EAAE,OAAO;IAR9B,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACzC,SAAS,CAAC,WAAW,UAAS;IAE9B,YACS,MAAM,EAAE,UAAU,EACf,MAAM,oBAAqD,EACrD,YAAY,EAAE,YAAY,EAC1C,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvB,gBAAgB,GAAE,OAAe,EAG5C;IAEM,SAAS,SAEf;IAEM,OAAO,SAEb;IAEM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAEd;IAEM,cAAc,oBAEpB;IAEM,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAE9D;IAED;;OAEG;IACU,WAAW,CACtB,kBAAkB,CAAC,EAAE,eAAe,EACpC,QAAQ,GAAE,OAAe,EACzB,OAAO,GAAE,MAAU,EACnB,gBAAgB,CAAC,EAAE,OAAO,OAAO,SAAS,CAAC,GAAG,KAAK,GAAG,QAAQ,GAC7D,OAAO,CAAC,QAAQ,CAAC,CAmJnB;IAED;;OAEG;IACU,WAAW,CACtB,OAAO,EAAE,OAAO,GAAG,GAAG,EACtB,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,eAAe,EAC5B,WAAW,CAAC,EAAE,YAAY,GACzB,OAAO,CAAC,MAAM,CAAC,CA8BjB;IAEK,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAY/E;IAEY,yBAAyB,CACpC,IAAI,EAAE,GAAG,EACT,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,GAAG,EAAE,GAAG,CAAC;QACT,OAAO,EAAE,GAAG,CAAC;KACd,EACD,UAAU,EAAE,CAAC,YAAY,GAAG;QAAE,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,EACrE,aAAa,GAAE,aAAkB,+BAgDlC;IAEY,QAAQ,CACnB,OAAO,EAAE,WAAW,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,CAAA;KAAE,EACnD,cAAc,GAAE,cAAc,CAAC,MAAM,EAAE,MAAM,CAAM,EACnD,cAAc,GAAE,aAAkB,EAClC,GAAG,GAAE,GAAe,EACpB,UAAU,CAAC,EAAE,eAAe,GAAG;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9D,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;KAAE,CAAC,CAUrD;IAED,UAAgB,SAAS,CACvB,IAAI,EAAE,GAAG,EACT,cAAc,4CAAqC,EACnD,cAAc,2BAAoB,EAClC,SAAS,EAAE,eAAe,GAAG;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,EAC7D,GAAG,EAAE,GAAG;;;OAoCT;IAEM,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,MAAM,CAW1E;CACF"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { getKeys, merge, pick, times } from '@aztec/foundation/collection';
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
4
|
+
import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi';
|
|
5
|
+
import pickBy from 'lodash.pickby';
|
|
6
|
+
import { MethodNotFoundRpcError, MethodNotSupportedRpcError, decodeErrorResult, formatGwei, getContractError, hexToBytes } from 'viem';
|
|
7
|
+
import { defaultL1TxUtilsConfig, l1TxUtilsConfigMappings } from './config.js';
|
|
8
|
+
import { BLOCK_TIME_MS, LARGE_GAS_LIMIT, MIN_BLOB_REPLACEMENT_BUMP_PERCENTAGE, MIN_REPLACEMENT_BUMP_PERCENTAGE, WEI_CONST } from './constants.js';
|
|
9
|
+
import { P75AllTxsPriorityFeeStrategy } from './fee-strategies/index.js';
|
|
10
|
+
import { getCalldataGasUsage, tryGetCustomErrorNameContractFunction } from './utils.js';
|
|
11
|
+
// Change this to the current strategy we want to use
|
|
12
|
+
const CurrentStrategy = P75AllTxsPriorityFeeStrategy;
|
|
13
|
+
export class ReadOnlyL1TxUtils {
|
|
14
|
+
client;
|
|
15
|
+
logger;
|
|
16
|
+
dateProvider;
|
|
17
|
+
debugMaxGasLimit;
|
|
18
|
+
config;
|
|
19
|
+
interrupted;
|
|
20
|
+
constructor(client, logger = createLogger('ethereum:readonly-l1-utils'), dateProvider, config, debugMaxGasLimit = false){
|
|
21
|
+
this.client = client;
|
|
22
|
+
this.logger = logger;
|
|
23
|
+
this.dateProvider = dateProvider;
|
|
24
|
+
this.debugMaxGasLimit = debugMaxGasLimit;
|
|
25
|
+
this.interrupted = false;
|
|
26
|
+
this.config = merge(defaultL1TxUtilsConfig, pick(config || {}, ...getKeys(l1TxUtilsConfigMappings)));
|
|
27
|
+
}
|
|
28
|
+
interrupt() {
|
|
29
|
+
this.interrupted = true;
|
|
30
|
+
}
|
|
31
|
+
restart() {
|
|
32
|
+
this.interrupted = false;
|
|
33
|
+
}
|
|
34
|
+
getBlock() {
|
|
35
|
+
return this.client.getBlock();
|
|
36
|
+
}
|
|
37
|
+
getBlockNumber() {
|
|
38
|
+
return this.client.getBlockNumber();
|
|
39
|
+
}
|
|
40
|
+
getCode(address) {
|
|
41
|
+
return this.client.getCode({
|
|
42
|
+
address: address.toString()
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Gets the current gas price with bounds checking
|
|
47
|
+
*/ async getGasPrice(gasConfigOverrides, isBlobTx = false, attempt = 0, previousGasPrice) {
|
|
48
|
+
const gasConfig = merge(this.config, gasConfigOverrides);
|
|
49
|
+
// Execute strategy - it handles all RPC calls internally and returns everything we need
|
|
50
|
+
const strategyResult = await retry(()=>CurrentStrategy.execute(this.client, {
|
|
51
|
+
gasConfig,
|
|
52
|
+
isBlobTx,
|
|
53
|
+
logger: this.logger
|
|
54
|
+
}), 'Executing priority fee strategy', makeBackoff(times(2, ()=>0)), this.logger, true);
|
|
55
|
+
const { latestBlock, blobBaseFee, priorityFee: strategyPriorityFee } = strategyResult;
|
|
56
|
+
// Extract base fee from latest block
|
|
57
|
+
const baseFee = latestBlock.baseFeePerGas ?? 0n;
|
|
58
|
+
// Handle blob base fee
|
|
59
|
+
if (isBlobTx && blobBaseFee === undefined) {
|
|
60
|
+
this.logger?.warn('Failed to get L1 blob base fee', attempt);
|
|
61
|
+
}
|
|
62
|
+
let priorityFee = strategyPriorityFee;
|
|
63
|
+
// Apply minimum priority fee floor if configured
|
|
64
|
+
if (gasConfig.minimumPriorityFeePerGas) {
|
|
65
|
+
const minimumPriorityFee = BigInt(Math.trunc(gasConfig.minimumPriorityFeePerGas * Number(WEI_CONST)));
|
|
66
|
+
if (priorityFee < minimumPriorityFee) {
|
|
67
|
+
this.logger?.debug('Applying minimum priority fee floor', {
|
|
68
|
+
calculatedPriorityFee: formatGwei(priorityFee),
|
|
69
|
+
minimumPriorityFeePerGas: gasConfig.minimumPriorityFeePerGas,
|
|
70
|
+
appliedFee: formatGwei(minimumPriorityFee)
|
|
71
|
+
});
|
|
72
|
+
priorityFee = minimumPriorityFee;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
let maxFeePerGas = baseFee;
|
|
76
|
+
let maxFeePerBlobGas = blobBaseFee ?? 0n;
|
|
77
|
+
// Bump base fee so it's valid for next blocks if it stalls
|
|
78
|
+
const numBlocks = Math.ceil(gasConfig.stallTimeMs / BLOCK_TIME_MS);
|
|
79
|
+
for(let i = 0; i < numBlocks; i++){
|
|
80
|
+
// each block can go up 12.5% from previous baseFee
|
|
81
|
+
maxFeePerGas = maxFeePerGas * (1_000n + 125n) / 1_000n;
|
|
82
|
+
// same for blob gas fee
|
|
83
|
+
maxFeePerBlobGas = maxFeePerBlobGas * (1_000n + 125n) / 1_000n;
|
|
84
|
+
}
|
|
85
|
+
if (attempt > 0) {
|
|
86
|
+
const configBump = gasConfig.priorityFeeRetryBumpPercentage ?? defaultL1TxUtilsConfig.priorityFeeRetryBumpPercentage;
|
|
87
|
+
// if this is a blob tx, we have to use the blob bump percentage
|
|
88
|
+
const minBumpPercentage = isBlobTx ? MIN_BLOB_REPLACEMENT_BUMP_PERCENTAGE : MIN_REPLACEMENT_BUMP_PERCENTAGE;
|
|
89
|
+
const bumpPercentage = configBump > minBumpPercentage ? configBump : minBumpPercentage;
|
|
90
|
+
// Calculate minimum required fees based on previous attempt
|
|
91
|
+
// multiply by 100 & divide by 100 to maintain some precision
|
|
92
|
+
const minPriorityFee = previousGasPrice.maxPriorityFeePerGas * (100_00n + BigInt(bumpPercentage * 1_00)) / 100_00n;
|
|
93
|
+
const minMaxFee = previousGasPrice.maxFeePerGas * (100_00n + BigInt(bumpPercentage * 1_00)) / 100_00n;
|
|
94
|
+
// Apply bump percentage to competitive fee
|
|
95
|
+
const competitivePriorityFee = priorityFee * (100_00n + BigInt(configBump * 1_00)) / 100_00n;
|
|
96
|
+
this.logger?.debug(`Speed-up attempt ${attempt}: using competitive fee strategy`, {
|
|
97
|
+
networkEstimate: formatGwei(priorityFee),
|
|
98
|
+
competitiveFee: formatGwei(competitivePriorityFee),
|
|
99
|
+
minRequired: formatGwei(minPriorityFee),
|
|
100
|
+
bumpPercentage: configBump
|
|
101
|
+
});
|
|
102
|
+
// Use maximum between competitive fee and minimum required bump
|
|
103
|
+
const finalPriorityFee = competitivePriorityFee > minPriorityFee ? competitivePriorityFee : minPriorityFee;
|
|
104
|
+
const feeSource = finalPriorityFee === competitivePriorityFee ? 'competitive' : 'minimum-bump';
|
|
105
|
+
priorityFee = finalPriorityFee;
|
|
106
|
+
// Add the final priority fee to maxFeePerGas
|
|
107
|
+
maxFeePerGas += finalPriorityFee;
|
|
108
|
+
maxFeePerGas = maxFeePerGas > minMaxFee ? maxFeePerGas : minMaxFee;
|
|
109
|
+
this.logger?.debug(`Speed-up fee decision: using ${feeSource} fee`, {
|
|
110
|
+
finalPriorityFee: formatGwei(finalPriorityFee)
|
|
111
|
+
});
|
|
112
|
+
} else {
|
|
113
|
+
// First attempt: apply configured bump percentage to competitive fee
|
|
114
|
+
// multiply by 100 & divide by 100 to maintain some precision
|
|
115
|
+
priorityFee = priorityFee * (100_00n + BigInt((gasConfig.priorityFeeBumpPercentage || 0) * 1_00)) / 100_00n;
|
|
116
|
+
this.logger?.debug('Initial transaction: using competitive fee from market analysis', {
|
|
117
|
+
networkEstimate: formatGwei(priorityFee)
|
|
118
|
+
});
|
|
119
|
+
maxFeePerGas += priorityFee;
|
|
120
|
+
}
|
|
121
|
+
// maxGwei and maxBlobGwei are hard limits
|
|
122
|
+
const effectiveMaxGwei = BigInt(Math.trunc(gasConfig.maxGwei * Number(WEI_CONST)));
|
|
123
|
+
const effectiveMaxBlobGwei = BigInt(Math.trunc(gasConfig.maxBlobGwei * Number(WEI_CONST)));
|
|
124
|
+
// Ensure we don't exceed maxGwei
|
|
125
|
+
if (effectiveMaxGwei > 0n) {
|
|
126
|
+
maxFeePerGas = maxFeePerGas > effectiveMaxGwei ? effectiveMaxGwei : maxFeePerGas;
|
|
127
|
+
}
|
|
128
|
+
// Ensure we don't exceed maxBlobGwei
|
|
129
|
+
if (maxFeePerBlobGas && effectiveMaxBlobGwei > 0n) {
|
|
130
|
+
maxFeePerBlobGas = maxFeePerBlobGas > effectiveMaxBlobGwei ? effectiveMaxBlobGwei : maxFeePerBlobGas;
|
|
131
|
+
}
|
|
132
|
+
// Ensure priority fee doesn't exceed max fee
|
|
133
|
+
const maxPriorityFeePerGas = priorityFee > maxFeePerGas ? maxFeePerGas : priorityFee;
|
|
134
|
+
if (attempt > 0 && previousGasPrice?.maxFeePerBlobGas) {
|
|
135
|
+
const bumpPercentage = gasConfig.priorityFeeRetryBumpPercentage > MIN_BLOB_REPLACEMENT_BUMP_PERCENTAGE ? gasConfig.priorityFeeRetryBumpPercentage : MIN_BLOB_REPLACEMENT_BUMP_PERCENTAGE;
|
|
136
|
+
// calculate min blob fee based on previous attempt
|
|
137
|
+
const minBlobFee = previousGasPrice.maxFeePerBlobGas * (100_00n + BigInt(bumpPercentage * 1_00)) / 100_00n;
|
|
138
|
+
// use max between current network values and min required values
|
|
139
|
+
maxFeePerBlobGas = maxFeePerBlobGas > minBlobFee ? maxFeePerBlobGas : minBlobFee;
|
|
140
|
+
}
|
|
141
|
+
this.logger?.trace(`Computed L1 gas price max fee ${formatGwei(maxFeePerGas)} and max priority fee ${formatGwei(maxPriorityFeePerGas)}`, {
|
|
142
|
+
attempt,
|
|
143
|
+
baseFee: formatGwei(baseFee),
|
|
144
|
+
maxFeePerGas: formatGwei(maxFeePerGas),
|
|
145
|
+
maxPriorityFeePerGas: formatGwei(maxPriorityFeePerGas),
|
|
146
|
+
blobBaseFee: formatGwei(blobBaseFee ?? 0n),
|
|
147
|
+
maxFeePerBlobGas: formatGwei(maxFeePerBlobGas)
|
|
148
|
+
});
|
|
149
|
+
return {
|
|
150
|
+
maxFeePerGas,
|
|
151
|
+
maxPriorityFeePerGas,
|
|
152
|
+
...maxFeePerBlobGas && {
|
|
153
|
+
maxFeePerBlobGas: maxFeePerBlobGas
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Estimates gas and adds buffer
|
|
159
|
+
*/ async estimateGas(account, request, _gasConfig, _blobInputs) {
|
|
160
|
+
const gasConfig = {
|
|
161
|
+
...this.config,
|
|
162
|
+
..._gasConfig
|
|
163
|
+
};
|
|
164
|
+
let initialEstimate = 0n;
|
|
165
|
+
if (_blobInputs) {
|
|
166
|
+
// @note requests with blobs also require maxFeePerBlobGas to be set
|
|
167
|
+
const gasPrice = await this.getGasPrice(gasConfig, true, 0);
|
|
168
|
+
initialEstimate = await this.client.estimateGas({
|
|
169
|
+
account,
|
|
170
|
+
...request,
|
|
171
|
+
..._blobInputs,
|
|
172
|
+
maxFeePerBlobGas: gasPrice.maxFeePerBlobGas,
|
|
173
|
+
gas: LARGE_GAS_LIMIT,
|
|
174
|
+
blockTag: 'latest'
|
|
175
|
+
});
|
|
176
|
+
this.logger?.trace(`Estimated gas for blob tx: ${initialEstimate}`);
|
|
177
|
+
} else {
|
|
178
|
+
initialEstimate = await this.client.estimateGas({
|
|
179
|
+
account,
|
|
180
|
+
...request,
|
|
181
|
+
gas: LARGE_GAS_LIMIT,
|
|
182
|
+
blockTag: 'latest'
|
|
183
|
+
});
|
|
184
|
+
this.logger?.trace(`Estimated gas for non-blob tx: ${initialEstimate}`);
|
|
185
|
+
}
|
|
186
|
+
// Add buffer based on either fixed amount or percentage
|
|
187
|
+
const withBuffer = this.bumpGasLimit(initialEstimate, gasConfig);
|
|
188
|
+
return withBuffer;
|
|
189
|
+
}
|
|
190
|
+
async getTransactionStats(txHash) {
|
|
191
|
+
const tx = await this.client.getTransaction({
|
|
192
|
+
hash: txHash
|
|
193
|
+
});
|
|
194
|
+
if (!tx) {
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
const calldata = hexToBytes(tx.input);
|
|
198
|
+
return {
|
|
199
|
+
sender: tx.from.toString(),
|
|
200
|
+
transactionHash: tx.hash,
|
|
201
|
+
calldataSize: calldata.length,
|
|
202
|
+
calldataGas: getCalldataGasUsage(calldata)
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
async tryGetErrorFromRevertedTx(data, args, blobInputs, stateOverride = []) {
|
|
206
|
+
try {
|
|
207
|
+
await this.client.simulateContract({
|
|
208
|
+
...args,
|
|
209
|
+
account: this.client.account,
|
|
210
|
+
stateOverride
|
|
211
|
+
});
|
|
212
|
+
this.logger?.trace('Simulated blob tx', {
|
|
213
|
+
blobInputs
|
|
214
|
+
});
|
|
215
|
+
// If the above passes, we have a blob error. We cannot simulate blob txs, and failed txs no longer throw errors.
|
|
216
|
+
// Strangely, the only way to throw the revert reason as an error and provide blobs is prepareTransactionRequest.
|
|
217
|
+
// See: https://github.com/wevm/viem/issues/2075
|
|
218
|
+
// This throws a EstimateGasExecutionError with the custom error information:
|
|
219
|
+
const request = blobInputs ? {
|
|
220
|
+
account: this.client.account,
|
|
221
|
+
to: args.address,
|
|
222
|
+
data,
|
|
223
|
+
blobs: blobInputs.blobs,
|
|
224
|
+
kzg: blobInputs.kzg,
|
|
225
|
+
maxFeePerBlobGas: blobInputs.maxFeePerBlobGas
|
|
226
|
+
} : {
|
|
227
|
+
account: this.client.account,
|
|
228
|
+
to: args.address,
|
|
229
|
+
data
|
|
230
|
+
};
|
|
231
|
+
this.logger?.trace('Preparing tx', {
|
|
232
|
+
request
|
|
233
|
+
});
|
|
234
|
+
await this.client.prepareTransactionRequest(request);
|
|
235
|
+
this.logger?.trace('Prepared tx');
|
|
236
|
+
return undefined;
|
|
237
|
+
} catch (simulationErr) {
|
|
238
|
+
// If we don't have a ContractFunctionExecutionError, we have a blob related error => use getContractError to get the error msg.
|
|
239
|
+
const contractErr = simulationErr.name === 'ContractFunctionExecutionError' ? simulationErr : getContractError(simulationErr, {
|
|
240
|
+
args: [],
|
|
241
|
+
abi: args.abi,
|
|
242
|
+
functionName: args.functionName,
|
|
243
|
+
address: args.address
|
|
244
|
+
});
|
|
245
|
+
if (contractErr.name === 'ContractFunctionExecutionError') {
|
|
246
|
+
const execErr = contractErr;
|
|
247
|
+
return tryGetCustomErrorNameContractFunction(execErr);
|
|
248
|
+
}
|
|
249
|
+
this.logger?.error(`Error getting error from simulation`, simulationErr);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
async simulate(request, blockOverrides = {}, stateOverrides = [], abi = RollupAbi, _gasConfig) {
|
|
253
|
+
const gasConfig = {
|
|
254
|
+
...this.config,
|
|
255
|
+
..._gasConfig
|
|
256
|
+
};
|
|
257
|
+
const call = {
|
|
258
|
+
to: request.to,
|
|
259
|
+
data: request.data,
|
|
260
|
+
...request.from && {
|
|
261
|
+
from: request.from
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
return await this._simulate(call, blockOverrides, stateOverrides, gasConfig, abi);
|
|
265
|
+
}
|
|
266
|
+
async _simulate(call, blockOverrides = {}, stateOverrides = [], gasConfig, abi) {
|
|
267
|
+
try {
|
|
268
|
+
const result = await this.client.simulateBlocks({
|
|
269
|
+
validation: false,
|
|
270
|
+
blocks: [
|
|
271
|
+
{
|
|
272
|
+
blockOverrides,
|
|
273
|
+
stateOverrides,
|
|
274
|
+
calls: [
|
|
275
|
+
call
|
|
276
|
+
]
|
|
277
|
+
}
|
|
278
|
+
]
|
|
279
|
+
});
|
|
280
|
+
if (result[0].calls[0].status === 'failure') {
|
|
281
|
+
this.logger?.error('L1 transaction simulation failed', result[0].calls[0].error);
|
|
282
|
+
const decodedError = decodeErrorResult({
|
|
283
|
+
abi,
|
|
284
|
+
data: result[0].calls[0].data
|
|
285
|
+
});
|
|
286
|
+
throw new Error(`L1 transaction simulation failed with error ${decodedError.errorName}(${decodedError.args?.join(',')})`);
|
|
287
|
+
}
|
|
288
|
+
this.logger?.debug(`L1 transaction simulation succeeded`, {
|
|
289
|
+
...result[0].calls[0]
|
|
290
|
+
});
|
|
291
|
+
return {
|
|
292
|
+
gasUsed: result[0].gasUsed,
|
|
293
|
+
result: result[0].calls[0].data
|
|
294
|
+
};
|
|
295
|
+
} catch (err) {
|
|
296
|
+
if (err instanceof MethodNotFoundRpcError || err instanceof MethodNotSupportedRpcError) {
|
|
297
|
+
if (gasConfig.fallbackGasEstimate) {
|
|
298
|
+
this.logger?.warn(`Node does not support eth_simulateV1 API. Using fallback gas estimate: ${gasConfig.fallbackGasEstimate}`);
|
|
299
|
+
return {
|
|
300
|
+
gasUsed: gasConfig.fallbackGasEstimate,
|
|
301
|
+
result: '0x'
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
this.logger?.error('Node does not support eth_simulateV1 API');
|
|
305
|
+
}
|
|
306
|
+
throw err;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
bumpGasLimit(gasLimit, _gasConfig) {
|
|
310
|
+
const gasConfig = {
|
|
311
|
+
...this.config,
|
|
312
|
+
..._gasConfig
|
|
313
|
+
};
|
|
314
|
+
const bumpedGasLimit = gasLimit + gasLimit * BigInt((gasConfig?.gasLimitBufferPercentage || 0) * 1_00) / 100_00n;
|
|
315
|
+
const cleanGasConfig = pickBy(gasConfig, (_, key)=>key in l1TxUtilsConfigMappings);
|
|
316
|
+
this.logger?.trace(`Bumping gas limit from ${gasLimit} to ${bumpedGasLimit}`, {
|
|
317
|
+
gasLimit,
|
|
318
|
+
gasConfig: cleanGasConfig,
|
|
319
|
+
bumpedGasLimit
|
|
320
|
+
});
|
|
321
|
+
return bumpedGasLimit;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type WalletClient } from 'viem';
|
|
2
|
+
import type { SigningCallback } from './types.js';
|
|
3
|
+
export declare function createViemSigner(client: WalletClient): SigningCallback;
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbDFfdHhfdXRpbHMvc2lnbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBZ0MsS0FBSyxZQUFZLEVBQW9CLE1BQU0sTUFBTSxDQUFDO0FBRXpGLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVsRCx3QkFBZ0IsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFlBQVksbUJBb0JwRCJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/signer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgC,KAAK,YAAY,EAAoB,MAAM,MAAM,CAAC;AAEzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,mBAoBpD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { parseTransaction } from 'viem';
|
|
2
|
+
export function createViemSigner(client) {
|
|
3
|
+
const signer = async (tx, _address)=>{
|
|
4
|
+
const signedTx = await client.signTransaction(tx);
|
|
5
|
+
const parsed = parseTransaction(signedTx);
|
|
6
|
+
if (!parsed.r || !parsed.s || parsed.yParity !== 0 && parsed.yParity !== 1) {
|
|
7
|
+
throw new Error('Failed to extract signature from viem signed transaction');
|
|
8
|
+
}
|
|
9
|
+
return {
|
|
10
|
+
r: parsed.r,
|
|
11
|
+
s: parsed.s,
|
|
12
|
+
yParity: parsed.yParity
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
return signer;
|
|
16
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { BlobKzgInstance } from '@aztec/blob-lib/types';
|
|
2
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
+
import type { ViemTransactionSignature } from '@aztec/foundation/eth-signature';
|
|
4
|
+
import type { Abi, Address, Hex, TransactionReceipt, TransactionSerializable } from 'viem';
|
|
5
|
+
import type { L1TxUtilsConfig } from './config.js';
|
|
6
|
+
export interface L1TxRequest {
|
|
7
|
+
to: Address | null;
|
|
8
|
+
data?: Hex;
|
|
9
|
+
value?: bigint;
|
|
10
|
+
abi?: Abi;
|
|
11
|
+
}
|
|
12
|
+
export type L1TxConfig = Partial<L1TxUtilsConfig> & {
|
|
13
|
+
gasLimit?: bigint;
|
|
14
|
+
txTimeoutAt?: Date;
|
|
15
|
+
};
|
|
16
|
+
export interface L1BlobInputs {
|
|
17
|
+
blobs: Uint8Array[];
|
|
18
|
+
kzg: BlobKzgInstance;
|
|
19
|
+
maxFeePerBlobGas?: bigint;
|
|
20
|
+
}
|
|
21
|
+
export interface GasPrice {
|
|
22
|
+
maxFeePerGas: bigint;
|
|
23
|
+
maxPriorityFeePerGas: bigint;
|
|
24
|
+
maxFeePerBlobGas?: bigint;
|
|
25
|
+
}
|
|
26
|
+
export type TransactionStats = {
|
|
27
|
+
/** Address of the sender. */
|
|
28
|
+
sender: string;
|
|
29
|
+
/** Hash of the transaction. */
|
|
30
|
+
transactionHash: string;
|
|
31
|
+
/** Size in bytes of the tx calldata */
|
|
32
|
+
calldataSize: number;
|
|
33
|
+
/** Gas required to pay for the calldata inclusion (depends on size and number of zeros) */
|
|
34
|
+
calldataGas: number;
|
|
35
|
+
};
|
|
36
|
+
export declare enum TxUtilsState {
|
|
37
|
+
IDLE = 0,
|
|
38
|
+
SENT = 1,
|
|
39
|
+
SPEED_UP = 2,
|
|
40
|
+
CANCELLED = 3,
|
|
41
|
+
NOT_MINED = 4,
|
|
42
|
+
MINED = 5
|
|
43
|
+
}
|
|
44
|
+
export declare const TerminalTxUtilsState: TxUtilsState[];
|
|
45
|
+
export type L1TxState = {
|
|
46
|
+
id: number;
|
|
47
|
+
txHashes: Hex[];
|
|
48
|
+
cancelTxHashes: Hex[];
|
|
49
|
+
gasLimit: bigint;
|
|
50
|
+
gasPrice: GasPrice;
|
|
51
|
+
txConfigOverrides: L1TxConfig;
|
|
52
|
+
request: L1TxRequest;
|
|
53
|
+
status: TxUtilsState;
|
|
54
|
+
nonce: number;
|
|
55
|
+
sentAtL1Ts: Date;
|
|
56
|
+
lastSentAtL1Ts: Date;
|
|
57
|
+
receipt?: TransactionReceipt;
|
|
58
|
+
blobInputs: L1BlobInputs | undefined;
|
|
59
|
+
};
|
|
60
|
+
export type SigningCallback = (transaction: TransactionSerializable, signingAddress: EthAddress) => Promise<ViemTransactionSignature>;
|
|
61
|
+
export declare class UnknownMinedTxError extends Error {
|
|
62
|
+
constructor(nonce: number, account: string);
|
|
63
|
+
}
|
|
64
|
+
export declare class DroppedTransactionError extends Error {
|
|
65
|
+
constructor(nonce: number, account: string);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sMV90eF91dGlscy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVoRixPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzRixPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbkQsTUFBTSxXQUFXLFdBQVc7SUFDMUIsRUFBRSxFQUFFLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDbkIsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDO0lBQ1gsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2YsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDO0NBQ1g7QUFFRCxNQUFNLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRztJQUFFLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQTtDQUFFLENBQUM7QUFFOUYsTUFBTSxXQUFXLFlBQVk7SUFDM0IsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLEdBQUcsRUFBRSxlQUFlLENBQUM7SUFDckIsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDM0I7QUFFRCxNQUFNLFdBQVcsUUFBUTtJQUN2QixZQUFZLEVBQUUsTUFBTSxDQUFDO0lBQ3JCLG9CQUFvQixFQUFFLE1BQU0sQ0FBQztJQUM3QixnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUMzQjtBQUVELE1BQU0sTUFBTSxnQkFBZ0IsR0FBRztJQUM3Qiw2QkFBNkI7SUFDN0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNmLCtCQUErQjtJQUMvQixlQUFlLEVBQUUsTUFBTSxDQUFDO0lBQ3hCLHVDQUF1QztJQUN2QyxZQUFZLEVBQUUsTUFBTSxDQUFDO0lBQ3JCLDRGQUE0RjtJQUM1RixXQUFXLEVBQUUsTUFBTSxDQUFDO0NBQ3JCLENBQUM7QUFFRixvQkFBWSxZQUFZO0lBQ3RCLElBQUksSUFBQTtJQUNKLElBQUksSUFBQTtJQUNKLFFBQVEsSUFBQTtJQUNSLFNBQVMsSUFBQTtJQUNULFNBQVMsSUFBQTtJQUNULEtBQUssSUFBQTtDQUNOO0FBRUQsZUFBTyxNQUFNLG9CQUFvQixnQkFBa0UsQ0FBQztBQUVwRyxNQUFNLE1BQU0sU0FBUyxHQUFHO0lBQ3RCLEVBQUUsRUFBRSxNQUFNLENBQUM7SUFDWCxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDaEIsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLFFBQVEsRUFBRSxNQUFNLENBQUM7SUFDakIsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNuQixpQkFBaUIsRUFBRSxVQUFVLENBQUM7SUFDOUIsT0FBTyxFQUFFLFdBQVcsQ0FBQztJQUNyQixNQUFNLEVBQUUsWUFBWSxDQUFDO0lBQ3JCLEtBQUssRUFBRSxNQUFNLENBQUM7SUFDZCxVQUFVLEVBQUUsSUFBSSxDQUFDO0lBQ2pCLGNBQWMsRUFBRSxJQUFJLENBQUM7SUFDckIsT0FBTyxDQUFDLEVBQUUsa0JBQWtCLENBQUM7SUFDN0IsVUFBVSxFQUFFLFlBQVksR0FBRyxTQUFTLENBQUM7Q0FDdEMsQ0FBQztBQUVGLE1BQU0sTUFBTSxlQUFlLEdBQUcsQ0FDNUIsV0FBVyxFQUFFLHVCQUF1QixFQUNwQyxjQUFjLEVBQUUsVUFBVSxLQUN2QixPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUV2QyxxQkFBYSxtQkFBb0IsU0FBUSxLQUFLO0lBQzVDLFlBQVksS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUd6QztDQUNGO0FBRUQscUJBQWEsdUJBQXdCLFNBQVEsS0FBSztJQUNoRCxZQUFZLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFHekM7Q0FDRiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,MAAM,CAAC;AAE3F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAE9F,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,GAAG,EAAE,eAAe,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,oBAAY,YAAY;IACtB,IAAI,IAAA;IACJ,IAAI,IAAA;IACJ,QAAQ,IAAA;IACR,SAAS,IAAA;IACT,SAAS,IAAA;IACT,KAAK,IAAA;CACN;AAED,eAAO,MAAM,oBAAoB,gBAAkE,CAAC;AAEpG,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,cAAc,EAAE,GAAG,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iBAAiB,EAAE,UAAU,CAAC;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,IAAI,CAAC;IACjB,cAAc,EAAE,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,UAAU,EAAE,YAAY,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAC5B,WAAW,EAAE,uBAAuB,EACpC,cAAc,EAAE,UAAU,KACvB,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAEvC,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAGzC;CACF;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,YAAY,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAGzC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export var TxUtilsState = /*#__PURE__*/ function(TxUtilsState) {
|
|
2
|
+
TxUtilsState[TxUtilsState["IDLE"] = 0] = "IDLE";
|
|
3
|
+
TxUtilsState[TxUtilsState["SENT"] = 1] = "SENT";
|
|
4
|
+
TxUtilsState[TxUtilsState["SPEED_UP"] = 2] = "SPEED_UP";
|
|
5
|
+
TxUtilsState[TxUtilsState["CANCELLED"] = 3] = "CANCELLED";
|
|
6
|
+
TxUtilsState[TxUtilsState["NOT_MINED"] = 4] = "NOT_MINED";
|
|
7
|
+
TxUtilsState[TxUtilsState["MINED"] = 5] = "MINED";
|
|
8
|
+
return TxUtilsState;
|
|
9
|
+
}({});
|
|
10
|
+
export const TerminalTxUtilsState = [
|
|
11
|
+
0,
|
|
12
|
+
5,
|
|
13
|
+
4
|
|
14
|
+
];
|
|
15
|
+
export class UnknownMinedTxError extends Error {
|
|
16
|
+
constructor(nonce, account){
|
|
17
|
+
super(`Nonce ${nonce} from account ${account} is MINED but not by one of our expected transactions`);
|
|
18
|
+
this.name = 'UnknownMinedTxError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class DroppedTransactionError extends Error {
|
|
22
|
+
constructor(nonce, account){
|
|
23
|
+
super(`Transaction with nonce ${nonce} from account ${account} was dropped from the mempool`);
|
|
24
|
+
this.name = 'DroppedTransactionError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ContractFunctionExecutionError } from 'viem';
|
|
2
|
+
export declare function tryGetCustomErrorNameContractFunction(err: ContractFunctionExecutionError): string;
|
|
3
|
+
export declare function getCalldataGasUsage(data: Uint8Array): number;
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sMV90eF91dGlscy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssRUFBRSw4QkFBOEIsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzRCx3QkFBZ0IscUNBQXFDLENBQUMsR0FBRyxFQUFFLDhCQUE4QixVQUV4RjtBQU9ELHdCQUFnQixtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxVQUVuRCJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,MAAM,CAAC;AAE3D,wBAAgB,qCAAqC,CAAC,GAAG,EAAE,8BAA8B,UAExF;AAOD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,UAEnD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { compactArray } from '@aztec/foundation/collection';
|
|
2
|
+
export function tryGetCustomErrorNameContractFunction(err) {
|
|
3
|
+
return compactArray([
|
|
4
|
+
err.shortMessage,
|
|
5
|
+
...(err.metaMessages ?? []).slice(0, 2).map((s)=>s.trim())
|
|
6
|
+
]).join(' ');
|
|
7
|
+
}
|
|
8
|
+
/*
|
|
9
|
+
* Returns cost of calldata usage in Ethereum.
|
|
10
|
+
* @param data - Calldata.
|
|
11
|
+
* @returns 4 for each zero byte, 16 for each nonzero.
|
|
12
|
+
*/ export function getCalldataGasUsage(data) {
|
|
13
|
+
return data.filter((byte)=>byte === 0).length * 4 + data.filter((byte)=>byte !== 0).length * 16;
|
|
14
|
+
}
|
package/dest/l1_types.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ export type L1BlockId = {
|
|
|
3
3
|
l1BlockNumber: bigint;
|
|
4
4
|
l1BlockHash: Buffer32;
|
|
5
5
|
};
|
|
6
|
-
//# sourceMappingURL=
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9sMV90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxNQUFNLE1BQU0sU0FBUyxHQUFHO0lBQ3RCLGFBQWEsRUFBRSxNQUFNLENBQUM7SUFDdEIsV0FBVyxFQUFFLFFBQVEsQ0FBQztDQUN2QixDQUFDIn0=
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
import { L1TxUtils } from './l1_tx_utils.js';
|
|
1
|
+
import { L1TxUtils } from './l1_tx_utils/index.js';
|
|
2
2
|
export type PublisherFilter<UtilsType extends L1TxUtils> = (utils: UtilsType) => boolean;
|
|
3
3
|
export declare class PublisherManager<UtilsType extends L1TxUtils = L1TxUtils> {
|
|
4
4
|
private publishers;
|
|
5
5
|
private log;
|
|
6
|
-
|
|
6
|
+
private config;
|
|
7
|
+
constructor(publishers: UtilsType[], config: {
|
|
8
|
+
publisherAllowInvalidStates?: boolean;
|
|
9
|
+
});
|
|
10
|
+
/** Loads the state of all publishers and resumes monitoring any pending txs */
|
|
11
|
+
loadState(): Promise<void>;
|
|
7
12
|
getAvailablePublisher(filter?: PublisherFilter<UtilsType>): Promise<UtilsType>;
|
|
8
13
|
interrupt(): void;
|
|
9
14
|
}
|
|
10
|
-
//# sourceMappingURL=
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaGVyX21hbmFnZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wdWJsaXNoZXJfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsU0FBUyxFQUFnQixNQUFNLHdCQUF3QixDQUFDO0FBd0JqRSxNQUFNLE1BQU0sZUFBZSxDQUFDLFNBQVMsU0FBUyxTQUFTLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxLQUFLLE9BQU8sQ0FBQztBQUV6RixxQkFBYSxnQkFBZ0IsQ0FBQyxTQUFTLFNBQVMsU0FBUyxHQUFHLFNBQVM7SUFLakUsT0FBTyxDQUFDLFVBQVU7SUFKcEIsT0FBTyxDQUFDLEdBQUcsQ0FBcUM7SUFDaEQsT0FBTyxDQUFDLE1BQU0sQ0FBNEM7SUFFMUQsWUFDVSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQy9CLE1BQU0sRUFBRTtRQUFFLDJCQUEyQixDQUFDLEVBQUUsT0FBTyxDQUFBO0tBQUUsRUFLbEQ7SUFFRCwrRUFBK0U7SUFDbEUsU0FBUyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFdEM7SUFRWSxxQkFBcUIsQ0FBQyxNQUFNLEdBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBYyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0ErQ3RHO0lBRU0sU0FBUyxTQUVmO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher_manager.d.ts","sourceRoot":"","sources":["../src/publisher_manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"publisher_manager.d.ts","sourceRoot":"","sources":["../src/publisher_manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAgB,MAAM,wBAAwB,CAAC;AAwBjE,MAAM,MAAM,eAAe,CAAC,SAAS,SAAS,SAAS,IAAI,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC;AAEzF,qBAAa,gBAAgB,CAAC,SAAS,SAAS,SAAS,GAAG,SAAS;IAKjE,OAAO,CAAC,UAAU;IAJpB,OAAO,CAAC,GAAG,CAAqC;IAChD,OAAO,CAAC,MAAM,CAA4C;IAE1D,YACU,UAAU,EAAE,SAAS,EAAE,EAC/B,MAAM,EAAE;QAAE,2BAA2B,CAAC,EAAE,OAAO,CAAA;KAAE,EAKlD;IAED,+EAA+E;IAClE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtC;IAQY,qBAAqB,CAAC,MAAM,GAAE,eAAe,CAAC,SAAS,CAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CA+CtG;IAEM,SAAS,SAEf;CACF"}
|