@aztec/ethereum 0.0.1-commit.7b97ef96e → 0.0.1-commit.7cbc774
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/client.d.ts +16 -2
- package/dest/client.d.ts.map +1 -1
- package/dest/client.js +27 -7
- package/dest/config.d.ts +8 -6
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +11 -9
- package/dest/contracts/chain_state_override.d.ts +78 -0
- package/dest/contracts/chain_state_override.d.ts.map +1 -0
- package/dest/contracts/chain_state_override.js +137 -0
- package/dest/contracts/empire_base.d.ts +1 -3
- package/dest/contracts/empire_base.d.ts.map +1 -1
- package/dest/contracts/fee_asset_price_oracle.d.ts +6 -2
- package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -1
- package/dest/contracts/fee_asset_price_oracle.js +11 -6
- package/dest/contracts/governance.d.ts +108 -33
- package/dest/contracts/governance.d.ts.map +1 -1
- package/dest/contracts/governance.js +193 -12
- package/dest/contracts/governance_proposer.d.ts +33 -3
- package/dest/contracts/governance_proposer.d.ts.map +1 -1
- package/dest/contracts/governance_proposer.js +51 -9
- package/dest/contracts/inbox.d.ts +3 -3
- package/dest/contracts/inbox.d.ts.map +1 -1
- package/dest/contracts/inbox.js +12 -7
- package/dest/contracts/index.d.ts +3 -3
- package/dest/contracts/index.d.ts.map +1 -1
- package/dest/contracts/index.js +2 -2
- package/dest/contracts/multicall.d.ts +127 -12
- package/dest/contracts/multicall.d.ts.map +1 -1
- package/dest/contracts/multicall.js +201 -94
- package/dest/contracts/outbox.d.ts +21 -4
- package/dest/contracts/outbox.d.ts.map +1 -1
- package/dest/contracts/outbox.js +29 -6
- package/dest/contracts/registry.d.ts +3 -1
- package/dest/contracts/registry.d.ts.map +1 -1
- package/dest/contracts/registry.js +30 -1
- package/dest/contracts/rollup.d.ts +5258 -29
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +362 -69
- package/dest/contracts/{tally_slashing_proposer.d.ts → slashing_proposer.d.ts} +3 -4
- package/dest/contracts/slashing_proposer.d.ts.map +1 -0
- package/dest/contracts/{tally_slashing_proposer.js → slashing_proposer.js} +13 -15
- package/dest/deploy_aztec_l1_contracts.d.ts +3 -6
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
- package/dest/deploy_aztec_l1_contracts.js +2 -4
- package/dest/generated/l1-contracts-defaults.d.ts +2 -2
- package/dest/generated/l1-contracts-defaults.js +2 -2
- package/dest/l1_artifacts.d.ts +13409 -15883
- package/dest/l1_artifacts.d.ts.map +1 -1
- package/dest/l1_artifacts.js +9 -24
- package/dest/l1_contract_addresses.d.ts +61 -65
- package/dest/l1_contract_addresses.d.ts.map +1 -1
- package/dest/l1_contract_addresses.js +101 -82
- package/dest/l1_reader.d.ts +5 -5
- package/dest/l1_reader.d.ts.map +1 -1
- package/dest/l1_reader.js +9 -7
- package/dest/l1_tx_utils/l1_tx_utils.d.ts +12 -3
- package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/l1_tx_utils.js +61 -60
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +1 -1
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/readonly_l1_tx_utils.js +8 -4
- package/dest/l1_tx_utils/tx_delayer.d.ts +5 -3
- package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -1
- package/dest/l1_tx_utils/tx_delayer.js +7 -5
- package/dest/publisher_manager.d.ts +21 -7
- package/dest/publisher_manager.d.ts.map +1 -1
- package/dest/publisher_manager.js +81 -7
- package/dest/queries.d.ts +13 -2
- package/dest/queries.d.ts.map +1 -1
- package/dest/queries.js +62 -3
- package/dest/test/chain_monitor.d.ts +23 -3
- package/dest/test/chain_monitor.d.ts.map +1 -1
- package/dest/test/chain_monitor.js +38 -2
- package/dest/test/eth_cheat_codes.d.ts +12 -4
- package/dest/test/eth_cheat_codes.d.ts.map +1 -1
- package/dest/test/eth_cheat_codes.js +17 -4
- package/dest/test/rollup_cheat_codes.d.ts +31 -3
- package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
- package/dest/test/rollup_cheat_codes.js +59 -7
- package/dest/test/start_anvil.d.ts +23 -3
- package/dest/test/start_anvil.d.ts.map +1 -1
- package/dest/test/start_anvil.js +143 -29
- package/dest/utils.d.ts +8 -1
- package/dest/utils.d.ts.map +1 -1
- package/dest/utils.js +35 -12
- package/package.json +6 -8
- package/src/client.ts +28 -2
- package/src/config.ts +21 -13
- package/src/contracts/chain_state_override.ts +200 -0
- package/src/contracts/empire_base.ts +0 -2
- package/src/contracts/fee_asset_price_oracle.ts +10 -5
- package/src/contracts/governance.ts +266 -9
- package/src/contracts/governance_proposer.ts +52 -5
- package/src/contracts/inbox.ts +13 -5
- package/src/contracts/index.ts +2 -2
- package/src/contracts/multicall.ts +243 -105
- package/src/contracts/outbox.ts +38 -8
- package/src/contracts/registry.ts +31 -1
- package/src/contracts/rollup.ts +411 -79
- package/src/contracts/{tally_slashing_proposer.ts → slashing_proposer.ts} +14 -16
- package/src/deploy_aztec_l1_contracts.ts +1 -5
- package/src/generated/l1-contracts-defaults.ts +2 -2
- package/src/l1_artifacts.ts +12 -35
- package/src/l1_contract_addresses.ts +120 -94
- package/src/l1_reader.ts +17 -10
- package/src/l1_tx_utils/l1_tx_utils.ts +58 -42
- package/src/l1_tx_utils/readonly_l1_tx_utils.ts +8 -4
- package/src/l1_tx_utils/tx_delayer.ts +16 -7
- package/src/publisher_manager.ts +105 -10
- package/src/queries.ts +70 -4
- package/src/test/chain_monitor.ts +65 -3
- package/src/test/eth_cheat_codes.ts +16 -4
- package/src/test/rollup_cheat_codes.ts +64 -6
- package/src/test/start_anvil.ts +177 -29
- package/src/utils.ts +35 -14
- package/dest/contracts/empire_slashing_proposer.d.ts +0 -69
- package/dest/contracts/empire_slashing_proposer.d.ts.map +0 -1
- package/dest/contracts/empire_slashing_proposer.js +0 -216
- package/dest/contracts/tally_slashing_proposer.d.ts.map +0 -1
- package/src/contracts/empire_slashing_proposer.ts +0 -265
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
-
import { schemas
|
|
2
|
+
import { schemas } from '@aztec/foundation/schemas';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Required L1 contract address keys.
|
|
6
6
|
* NOTE: When changing this list, make sure to update CLI & CI scripts accordingly.
|
|
7
7
|
* For reference: https://github.com/AztecProtocol/aztec-packages/pull/5553
|
|
8
|
-
*/
|
|
8
|
+
*/ const REQUIRED_L1_CONTRACT_ADDRESS_KEYS = [
|
|
9
9
|
'rollupAddress',
|
|
10
10
|
'registryAddress',
|
|
11
11
|
'inboxAddress',
|
|
@@ -18,84 +18,103 @@ import { z } from 'zod';
|
|
|
18
18
|
'governanceAddress',
|
|
19
19
|
'stakingAssetAddress'
|
|
20
20
|
];
|
|
21
|
-
export const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
slashFactoryAddress: schemas.EthAddress.optional(),
|
|
34
|
-
feeAssetHandlerAddress: schemas.EthAddress.optional(),
|
|
35
|
-
stakingAssetHandlerAddress: schemas.EthAddress.optional(),
|
|
36
|
-
zkPassportVerifierAddress: schemas.EthAddress.optional(),
|
|
37
|
-
gseAddress: schemas.EthAddress.optional(),
|
|
38
|
-
dateGatedRelayerAddress: schemas.EthAddress.optional()
|
|
39
|
-
}));
|
|
21
|
+
/** Optional L1 contract address keys — present only in some deployments. */ export const OPTIONAL_L1_CONTRACT_ADDRESS_KEYS = [
|
|
22
|
+
'feeAssetHandlerAddress',
|
|
23
|
+
'stakingAssetHandlerAddress',
|
|
24
|
+
'zkPassportVerifierAddress',
|
|
25
|
+
'gseAddress',
|
|
26
|
+
'dateGatedRelayerAddress'
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Names of required L1 contract addresses.
|
|
30
|
+
* NOTE: When changing the set of contracts, update CLI & CI scripts accordingly.
|
|
31
|
+
* For reference: https://github.com/AztecProtocol/aztec-packages/pull/5553
|
|
32
|
+
*/ export const L1ContractsNames = REQUIRED_L1_CONTRACT_ADDRESS_KEYS;
|
|
40
33
|
const parseEnv = (val)=>EthAddress.fromString(val);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
},
|
|
69
|
-
feeJuiceAddress: {
|
|
70
|
-
description: 'The deployed L1 Fee Juice contract address.',
|
|
71
|
-
parseEnv
|
|
72
|
-
},
|
|
73
|
-
stakingAssetAddress: {
|
|
74
|
-
description: 'The deployed L1 staking asset contract address.',
|
|
75
|
-
parseEnv
|
|
76
|
-
},
|
|
77
|
-
feeJuicePortalAddress: {
|
|
78
|
-
description: 'The deployed L1 Fee Juice portal contract address.',
|
|
79
|
-
parseEnv
|
|
80
|
-
},
|
|
81
|
-
coinIssuerAddress: {
|
|
82
|
-
description: 'The deployed L1 coinIssuer contract address',
|
|
83
|
-
parseEnv
|
|
84
|
-
},
|
|
85
|
-
rewardDistributorAddress: {
|
|
86
|
-
description: 'The deployed L1 rewardDistributor contract address',
|
|
87
|
-
parseEnv
|
|
88
|
-
},
|
|
89
|
-
governanceProposerAddress: {
|
|
90
|
-
description: 'The deployed L1 governanceProposer contract address',
|
|
91
|
-
parseEnv
|
|
92
|
-
},
|
|
93
|
-
governanceAddress: {
|
|
94
|
-
description: 'The deployed L1 governance contract address',
|
|
95
|
-
parseEnv
|
|
96
|
-
},
|
|
97
|
-
stakingAssetHandlerAddress: {
|
|
98
|
-
description: 'The deployed L1 stakingAssetHandler contract address',
|
|
99
|
-
parseEnv
|
|
100
|
-
}
|
|
34
|
+
const addrEnv = (description, env)=>({
|
|
35
|
+
description,
|
|
36
|
+
parseEnv,
|
|
37
|
+
...env && {
|
|
38
|
+
env
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Config mapping for all L1 contract addresses.
|
|
43
|
+
* This is the single source of truth for which contract addresses exist and how to parse them.
|
|
44
|
+
*/ export const l1ContractAddressesMapping = {
|
|
45
|
+
rollupAddress: addrEnv('The deployed L1 rollup contract address.'),
|
|
46
|
+
registryAddress: addrEnv('The deployed L1 registry contract address.', 'REGISTRY_CONTRACT_ADDRESS'),
|
|
47
|
+
inboxAddress: addrEnv('The deployed L1 inbox contract address.'),
|
|
48
|
+
outboxAddress: addrEnv('The deployed L1 outbox contract address.'),
|
|
49
|
+
feeJuiceAddress: addrEnv('The deployed L1 Fee Juice contract address.'),
|
|
50
|
+
feeJuicePortalAddress: addrEnv('The deployed L1 Fee Juice portal contract address.'),
|
|
51
|
+
coinIssuerAddress: addrEnv('The deployed L1 coinIssuer contract address'),
|
|
52
|
+
rewardDistributorAddress: addrEnv('The deployed L1 rewardDistributor contract address'),
|
|
53
|
+
governanceProposerAddress: addrEnv('The deployed L1 governanceProposer contract address'),
|
|
54
|
+
governanceAddress: addrEnv('The deployed L1 governance contract address'),
|
|
55
|
+
stakingAssetAddress: addrEnv('The deployed L1 staking asset contract address.'),
|
|
56
|
+
feeAssetHandlerAddress: addrEnv('The deployed L1 feeAssetHandler contract address', 'FEE_ASSET_HANDLER_CONTRACT_ADDRESS'),
|
|
57
|
+
stakingAssetHandlerAddress: addrEnv('The deployed L1 stakingAssetHandler contract address'),
|
|
58
|
+
zkPassportVerifierAddress: addrEnv('The deployed L1 ZK passport verifier contract address'),
|
|
59
|
+
gseAddress: addrEnv('The deployed L1 GSE contract address'),
|
|
60
|
+
dateGatedRelayerAddress: addrEnv('The deployed L1 date-gated relayer contract address')
|
|
101
61
|
};
|
|
62
|
+
export const L1ContractAddressesSchema = z.object({
|
|
63
|
+
...Object.fromEntries(REQUIRED_L1_CONTRACT_ADDRESS_KEYS.map((k)=>[
|
|
64
|
+
k,
|
|
65
|
+
schemas.EthAddress
|
|
66
|
+
])),
|
|
67
|
+
...Object.fromEntries(OPTIONAL_L1_CONTRACT_ADDRESS_KEYS.map((k)=>[
|
|
68
|
+
k,
|
|
69
|
+
schemas.EthAddress.optional()
|
|
70
|
+
]))
|
|
71
|
+
});
|
|
72
|
+
/**
|
|
73
|
+
* Selects entries from {@link l1ContractAddressesMapping} so composed configs can reuse the same
|
|
74
|
+
* env vars, descriptions, and parsers without duplicating definitions.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* const mappings = {
|
|
79
|
+
* ...pickL1ContractAddressMappings('rollupAddress'),
|
|
80
|
+
* nodeId: { ... },
|
|
81
|
+
* };
|
|
82
|
+
* ```
|
|
83
|
+
*/ export function pickL1ContractAddressMappings(...keys) {
|
|
84
|
+
return Object.fromEntries(keys.map((key)=>[
|
|
85
|
+
key,
|
|
86
|
+
l1ContractAddressesMapping[key]
|
|
87
|
+
]));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Like {@link pickL1ContractAddressMappings}, but returns a fragment of {@link L1ContractAddressesSchema}'s shape for
|
|
91
|
+
* spreading into `z.object({ ...pickL1ContractAddressesSchemaShape('rollupAddress'), localField: z... })`.
|
|
92
|
+
*/ export function pickL1ContractAddressesSchema(...keys) {
|
|
93
|
+
return Object.fromEntries(keys.map((key)=>[
|
|
94
|
+
key,
|
|
95
|
+
L1ContractAddressesSchema.shape[key]
|
|
96
|
+
]));
|
|
97
|
+
}
|
|
98
|
+
/** Builds an {@link L1ContractAddresses} object from config that stores those fields at the top level. */ export function pickL1ContractAddresses(config) {
|
|
99
|
+
const result = {};
|
|
100
|
+
for (const key of REQUIRED_L1_CONTRACT_ADDRESS_KEYS){
|
|
101
|
+
result[key] = config[key];
|
|
102
|
+
}
|
|
103
|
+
for (const key of OPTIONAL_L1_CONTRACT_ADDRESS_KEYS){
|
|
104
|
+
const v = config[key];
|
|
105
|
+
if (v !== undefined) {
|
|
106
|
+
result[key] = v;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
export function randomL1ContractAddresses(includeOptional = false) {
|
|
112
|
+
const keys = includeOptional ? [
|
|
113
|
+
...L1ContractsNames,
|
|
114
|
+
...OPTIONAL_L1_CONTRACT_ADDRESS_KEYS
|
|
115
|
+
] : L1ContractsNames;
|
|
116
|
+
return Object.fromEntries(keys.map((name)=>[
|
|
117
|
+
name,
|
|
118
|
+
EthAddress.random()
|
|
119
|
+
]));
|
|
120
|
+
}
|
package/dest/l1_reader.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
2
2
|
import { type L1ContractAddresses } from './l1_contract_addresses.js';
|
|
3
3
|
/** Configuration of the L1GlobalReader. */
|
|
4
|
-
export
|
|
4
|
+
export type L1ReaderConfig = {
|
|
5
5
|
/** List of URLs of Ethereum RPC nodes that services will connect to (comma separated). */
|
|
6
6
|
l1RpcUrls: string[];
|
|
7
7
|
/** The RPC Url of the ethereum debug host for trace and debug methods. */
|
|
8
8
|
l1DebugRpcUrls: string[];
|
|
9
9
|
/** The chain ID of the ethereum host. */
|
|
10
10
|
l1ChainId: number;
|
|
11
|
-
/** The deployed l1 contract addresses */
|
|
12
|
-
l1Contracts: L1ContractAddresses;
|
|
13
11
|
/** The polling interval viem uses in ms */
|
|
14
12
|
viemPollingIntervalMS: number;
|
|
15
|
-
|
|
13
|
+
/** Timeout for HTTP requests to the L1 RPC node in ms. */
|
|
14
|
+
l1HttpTimeoutMS?: number;
|
|
15
|
+
} & L1ContractAddresses;
|
|
16
16
|
export declare const l1ReaderConfigMappings: ConfigMappingsType<L1ReaderConfig>;
|
|
17
17
|
export declare function getL1ReaderConfigFromEnv(): L1ReaderConfig;
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfcmVhZGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbDFfcmVhZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxLQUFLLGtCQUFrQixFQUl4QixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFBRSxLQUFLLG1CQUFtQixFQUE4QixNQUFNLDRCQUE0QixDQUFDO0FBRWxHLDJDQUEyQztBQUMzQyxNQUFNLE1BQU0sY0FBYyxHQUFHO0lBQzNCLDBGQUEwRjtJQUMxRixTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDcEIsMEVBQTBFO0lBQzFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUN6Qix5Q0FBeUM7SUFDekMsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQiwyQ0FBMkM7SUFDM0MscUJBQXFCLEVBQUUsTUFBTSxDQUFDO0lBQzlCLDBEQUEwRDtJQUMxRCxlQUFlLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDMUIsR0FBRyxtQkFBbUIsQ0FBQztBQUV4QixlQUFPLE1BQU0sc0JBQXNCLEVBQUUsa0JBQWtCLENBQUMsY0FBYyxDQTZCckUsQ0FBQztBQUVGLHdCQUFnQix3QkFBd0IsSUFBSSxjQUFjLENBRXpEIn0=
|
package/dest/l1_reader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l1_reader.d.ts","sourceRoot":"","sources":["../src/l1_reader.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"l1_reader.d.ts","sourceRoot":"","sources":["../src/l1_reader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,KAAK,mBAAmB,EAA8B,MAAM,4BAA4B,CAAC;AAElG,2CAA2C;AAC3C,MAAM,MAAM,cAAc,GAAG;IAC3B,0FAA0F;IAC1F,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,0EAA0E;IAC1E,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,0DAA0D;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,mBAAmB,CAAC;AAExB,eAAO,MAAM,sBAAsB,EAAE,kBAAkB,CAAC,cAAc,CA6BrE,CAAC;AAEF,wBAAgB,wBAAwB,IAAI,cAAc,CAEzD"}
|
package/dest/l1_reader.js
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
|
-
import { getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
|
|
1
|
+
import { getConfigFromMappings, numberConfigHelper, optionalNumberConfigHelper } from '@aztec/foundation/config';
|
|
2
2
|
import { l1ContractAddressesMapping } from './l1_contract_addresses.js';
|
|
3
3
|
export const l1ReaderConfigMappings = {
|
|
4
|
-
l1Contracts: {
|
|
5
|
-
description: 'The deployed L1 contract addresses',
|
|
6
|
-
nested: l1ContractAddressesMapping
|
|
7
|
-
},
|
|
8
4
|
l1ChainId: {
|
|
9
5
|
env: 'L1_CHAIN_ID',
|
|
10
|
-
|
|
6
|
+
...optionalNumberConfigHelper(),
|
|
11
7
|
description: 'The chain ID of the ethereum host.'
|
|
12
8
|
},
|
|
13
9
|
l1RpcUrls: {
|
|
@@ -26,7 +22,13 @@ export const l1ReaderConfigMappings = {
|
|
|
26
22
|
env: 'L1_READER_VIEM_POLLING_INTERVAL_MS',
|
|
27
23
|
description: 'The polling interval viem uses in ms',
|
|
28
24
|
...numberConfigHelper(1_000)
|
|
29
|
-
}
|
|
25
|
+
},
|
|
26
|
+
l1HttpTimeoutMS: {
|
|
27
|
+
env: 'ETHEREUM_HTTP_TIMEOUT_MS',
|
|
28
|
+
description: 'Timeout for HTTP requests to the L1 RPC node in ms.',
|
|
29
|
+
...optionalNumberConfigHelper()
|
|
30
|
+
},
|
|
31
|
+
...l1ContractAddressesMapping
|
|
30
32
|
};
|
|
31
33
|
export function getL1ReaderConfigFromEnv() {
|
|
32
34
|
return getConfigFromMappings(l1ReaderConfigMappings);
|
|
@@ -2,7 +2,7 @@ import type { BlobKzgInstance } from '@aztec/blob-lib/types';
|
|
|
2
2
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
3
|
import { type Logger, type LoggerBindings } from '@aztec/foundation/log';
|
|
4
4
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
5
|
-
import { type Abi, type BlockOverrides, type Hex, type
|
|
5
|
+
import { type Abi, type BlockOverrides, type Hex, type PrepareTransactionRequestRequest, type StateOverride, type TransactionReceipt } from 'viem';
|
|
6
6
|
import type { ViemClient } from '../types.js';
|
|
7
7
|
import { type L1TxUtilsConfig } from './config.js';
|
|
8
8
|
import type { IL1TxMetrics, IL1TxStore } from './interfaces.js';
|
|
@@ -15,8 +15,11 @@ export declare class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
15
15
|
protected signer: SigningCallback;
|
|
16
16
|
protected store?: IL1TxStore | undefined;
|
|
17
17
|
protected metrics?: IL1TxMetrics | undefined;
|
|
18
|
-
protected nonceManager: NonceManager;
|
|
19
18
|
protected txs: L1TxState[];
|
|
19
|
+
/** Last nonce successfully sent to the chain. Used as a lower bound when a fallback RPC node returns a stale count. */
|
|
20
|
+
private lastSentNonce;
|
|
21
|
+
/** Mutex to prevent concurrent sendTransaction calls from racing on the same nonce. */
|
|
22
|
+
private readonly sendMutex;
|
|
20
23
|
/** Tx delayer for testing. Only set when enableDelayer config is true. */
|
|
21
24
|
delayer?: Delayer;
|
|
22
25
|
/** KZG instance for blob operations. */
|
|
@@ -27,6 +30,11 @@ export declare class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
27
30
|
protected updateState(l1TxState: L1TxState, newState: TxUtilsState.MINED, l1Timestamp: number): Promise<void>;
|
|
28
31
|
protected updateState(l1TxState: L1TxState, newState: TxUtilsState, l1Timestamp?: undefined): Promise<void>;
|
|
29
32
|
updateConfig(newConfig: Partial<L1TxUtilsConfig>): void;
|
|
33
|
+
/**
|
|
34
|
+
* Clears the cached `lastSentNonce` so the next `sendTransaction` call fetches the real
|
|
35
|
+
* nonce from the chain. Call this after an L1 reorg to prevent stale nonce references.
|
|
36
|
+
*/
|
|
37
|
+
resetNonce(): void;
|
|
30
38
|
getSenderAddress(): EthAddress;
|
|
31
39
|
getSenderBalance(): Promise<bigint>;
|
|
32
40
|
/**
|
|
@@ -36,6 +44,7 @@ export declare class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
36
44
|
loadStateAndResumeMonitoring(): Promise<void>;
|
|
37
45
|
private signTransaction;
|
|
38
46
|
protected prepareSignedTransaction(txData: PrepareTransactionRequestRequest): Promise<`0x${string}`>;
|
|
47
|
+
private checkInterruptedOrTimedOut;
|
|
39
48
|
/**
|
|
40
49
|
* Sends a transaction with gas estimation and pricing
|
|
41
50
|
* @param request - The transaction request (to, data, value)
|
|
@@ -101,4 +110,4 @@ export declare class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
101
110
|
ethereumSlotDuration: bigint | number;
|
|
102
111
|
}, bindings: LoggerBindings): Delayer;
|
|
103
112
|
}
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdHhfdXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sMV90eF91dGlscy9sMV90eF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUk3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBSXZGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUl2RCxPQUFPLEVBQ0wsS0FBSyxHQUFHLEVBQ1IsS0FBSyxjQUFjLEVBQ25CLEtBQUssR0FBRyxFQUNSLEtBQUssZ0NBQWdDLEVBQ3JDLEtBQUssYUFBYSxFQUNsQixLQUFLLGtCQUFrQixFQUl4QixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5QyxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBRTVFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsT0FBTyxFQUF3QyxNQUFNLGlCQUFpQixDQUFDO0FBQ2hGLE9BQU8sRUFFTCxLQUFLLFlBQVksRUFDakIsS0FBSyxVQUFVLEVBQ2YsS0FBSyxXQUFXLEVBQ2hCLEtBQUssU0FBUyxFQUNkLEtBQUssZUFBZSxFQUVwQixZQUFZLEVBRWIsTUFBTSxZQUFZLENBQUM7QUFJcEIscUJBQWEsU0FBVSxTQUFRLGlCQUFpQjtJQVk1QixNQUFNLEVBQUUsVUFBVTtJQUMzQixPQUFPLEVBQUUsVUFBVTtJQUMxQixTQUFTLENBQUMs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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l1_tx_utils.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/l1_tx_utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7D,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"l1_tx_utils.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/l1_tx_utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,13 @@ import { maxBigint } from '@aztec/foundation/bigint';
|
|
|
2
2
|
import { merge, pick } from '@aztec/foundation/collection';
|
|
3
3
|
import { InterruptError, TimeoutError } from '@aztec/foundation/error';
|
|
4
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
|
+
import { Semaphore } from '@aztec/foundation/queue';
|
|
5
6
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
6
7
|
import { sleep } from '@aztec/foundation/sleep';
|
|
7
8
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
8
9
|
import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi';
|
|
9
10
|
import pickBy from 'lodash.pickby';
|
|
10
|
-
import {
|
|
11
|
-
import { jsonRpc } from 'viem/nonce';
|
|
11
|
+
import { formatGwei, serializeTransaction } from 'viem';
|
|
12
12
|
import { formatViemError } from '../utils.js';
|
|
13
13
|
import { l1TxUtilsConfigMappings } from './config.js';
|
|
14
14
|
import { MAX_L1_TX_LIMIT } from './constants.js';
|
|
@@ -22,15 +22,13 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
22
22
|
signer;
|
|
23
23
|
store;
|
|
24
24
|
metrics;
|
|
25
|
-
nonceManager;
|
|
26
25
|
txs;
|
|
26
|
+
/** Last nonce successfully sent to the chain. Used as a lower bound when a fallback RPC node returns a stale count. */ lastSentNonce;
|
|
27
|
+
/** Mutex to prevent concurrent sendTransaction calls from racing on the same nonce. */ sendMutex;
|
|
27
28
|
/** Tx delayer for testing. Only set when enableDelayer config is true. */ delayer;
|
|
28
29
|
/** KZG instance for blob operations. */ kzg;
|
|
29
30
|
constructor(client, address, signer, logger = createLogger('ethereum:publisher'), dateProvider = new DateProvider(), config, debugMaxGasLimit = false, store, metrics, kzg, delayer){
|
|
30
|
-
super(client, logger, dateProvider, config, debugMaxGasLimit), this.client = client, this.address = address, this.signer = signer, this.store = store, this.metrics = metrics, this.txs = [];
|
|
31
|
-
this.nonceManager = createNonceManager({
|
|
32
|
-
source: jsonRpc()
|
|
33
|
-
});
|
|
31
|
+
super(client, logger, dateProvider, config, debugMaxGasLimit), this.client = client, this.address = address, this.signer = signer, this.store = store, this.metrics = metrics, this.txs = [], this.sendMutex = new Semaphore(1);
|
|
34
32
|
this.kzg = kzg;
|
|
35
33
|
// Set up delayer: use provided one or create new
|
|
36
34
|
if (config?.enableDelayer && config?.ethereumSlotDuration) {
|
|
@@ -64,6 +62,11 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
64
62
|
this.metrics?.recordMinedTx(l1TxState, new Date(l1Timestamp));
|
|
65
63
|
} else if (newState === TxUtilsState.NOT_MINED) {
|
|
66
64
|
this.metrics?.recordDroppedTx(l1TxState);
|
|
65
|
+
// The tx was dropped: the chain nonce reverted to l1TxState.nonce, so our lower bound is
|
|
66
|
+
// no longer valid. Clear it so the next send fetches the real nonce from the chain.
|
|
67
|
+
if (this.lastSentNonce === l1TxState.nonce) {
|
|
68
|
+
this.lastSentNonce = undefined;
|
|
69
|
+
}
|
|
67
70
|
}
|
|
68
71
|
// Update state in the store
|
|
69
72
|
await this.store?.saveState(sender, l1TxState).catch((err)=>this.logger.error('Failed to persist L1 tx state', err));
|
|
@@ -72,6 +75,12 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
72
75
|
this.config = merge(this.config, newConfig);
|
|
73
76
|
this.logger.info('Updated L1TxUtils config', pickBy(newConfig, (_, key)=>key in l1TxUtilsConfigMappings));
|
|
74
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Clears the cached `lastSentNonce` so the next `sendTransaction` call fetches the real
|
|
80
|
+
* nonce from the chain. Call this after an L1 reorg to prevent stale nonce references.
|
|
81
|
+
*/ resetNonce() {
|
|
82
|
+
this.lastSentNonce = undefined;
|
|
83
|
+
}
|
|
75
84
|
getSenderAddress() {
|
|
76
85
|
return this.address;
|
|
77
86
|
}
|
|
@@ -138,18 +147,29 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
138
147
|
const txRequest = await this.client.prepareTransactionRequest(txData);
|
|
139
148
|
return await this.signTransaction(txRequest);
|
|
140
149
|
}
|
|
150
|
+
async checkInterruptedOrTimedOut(gasConfig) {
|
|
151
|
+
if (this.interrupted) {
|
|
152
|
+
throw new InterruptError(`Transaction sending is interrupted`);
|
|
153
|
+
}
|
|
154
|
+
const now = new Date(await this.getL1Timestamp());
|
|
155
|
+
if (gasConfig.txTimeoutAt && now > gasConfig.txTimeoutAt) {
|
|
156
|
+
throw new TimeoutError(`Transaction timed out before sending (now ${now.toISOString()} > timeoutAt ${gasConfig.txTimeoutAt.toISOString()})`);
|
|
157
|
+
}
|
|
158
|
+
return now;
|
|
159
|
+
}
|
|
141
160
|
/**
|
|
142
161
|
* Sends a transaction with gas estimation and pricing
|
|
143
162
|
* @param request - The transaction request (to, data, value)
|
|
144
163
|
* @param gasConfig - Optional gas configuration
|
|
145
164
|
* @returns The transaction hash and parameters used
|
|
146
165
|
*/ async sendTransaction(request, gasConfigOverrides, blobInputs, stateChange = TxUtilsState.SENT) {
|
|
147
|
-
if (this.interrupted) {
|
|
148
|
-
throw new InterruptError(`Transaction sending is interrupted`);
|
|
149
|
-
}
|
|
150
166
|
try {
|
|
151
167
|
const gasConfig = merge(this.config, gasConfigOverrides);
|
|
152
168
|
const account = this.getSenderAddress().toString();
|
|
169
|
+
// Fail fast before doing any work (gas estimation, balance check) if we've been interrupted
|
|
170
|
+
// or if the caller's deadline has already passed. The same check is repeated after gas
|
|
171
|
+
// estimation in case it took long enough to push us past the deadline.
|
|
172
|
+
await this.checkInterruptedOrTimedOut(gasConfig);
|
|
153
173
|
let gasLimit;
|
|
154
174
|
if (this.debugMaxGasLimit) {
|
|
155
175
|
gasLimit = MAX_L1_TX_LIMIT;
|
|
@@ -163,40 +183,41 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
163
183
|
...request
|
|
164
184
|
});
|
|
165
185
|
const gasPrice = await this.getGasPrice(gasConfig, !!blobInputs);
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
186
|
+
const now = await this.checkInterruptedOrTimedOut(gasConfig);
|
|
187
|
+
let txHash;
|
|
188
|
+
let nonce;
|
|
189
|
+
let baseState;
|
|
190
|
+
await this.sendMutex.acquire();
|
|
191
|
+
try {
|
|
192
|
+
const chainNonce = await this.client.getTransactionCount({
|
|
193
|
+
address: account,
|
|
194
|
+
blockTag: 'pending'
|
|
195
|
+
});
|
|
196
|
+
// If a fallback RPC node returns a stale count (lower than what we last sent), use our
|
|
197
|
+
// local lower bound to avoid sending a duplicate of an already-pending transaction.
|
|
198
|
+
nonce = this.lastSentNonce !== undefined && chainNonce <= this.lastSentNonce ? this.lastSentNonce + 1 : chainNonce;
|
|
199
|
+
baseState = {
|
|
200
|
+
request,
|
|
201
|
+
gasLimit,
|
|
202
|
+
blobInputs,
|
|
203
|
+
gasPrice,
|
|
204
|
+
nonce
|
|
205
|
+
};
|
|
206
|
+
const txData = this.makeTxData(baseState, {
|
|
207
|
+
isCancelTx: false
|
|
208
|
+
});
|
|
209
|
+
const signedRequest = await this.prepareSignedTransaction(txData);
|
|
210
|
+
txHash = await this.client.sendRawTransaction({
|
|
211
|
+
serializedTransaction: signedRequest
|
|
212
|
+
});
|
|
213
|
+
this.lastSentNonce = nonce;
|
|
214
|
+
} finally{
|
|
215
|
+
this.sendMutex.release();
|
|
175
216
|
}
|
|
176
|
-
const nonce = await this.nonceManager.consume({
|
|
177
|
-
client: this.client,
|
|
178
|
-
address: account,
|
|
179
|
-
chainId: this.client.chain.id
|
|
180
|
-
});
|
|
181
|
-
const baseState = {
|
|
182
|
-
request,
|
|
183
|
-
gasLimit,
|
|
184
|
-
blobInputs,
|
|
185
|
-
gasPrice,
|
|
186
|
-
nonce
|
|
187
|
-
};
|
|
188
|
-
const txData = this.makeTxData(baseState, {
|
|
189
|
-
isCancelTx: false
|
|
190
|
-
});
|
|
191
|
-
// Send the new tx
|
|
192
|
-
const signedRequest = await this.prepareSignedTransaction(txData);
|
|
193
|
-
const txHash = await this.client.sendRawTransaction({
|
|
194
|
-
serializedTransaction: signedRequest
|
|
195
|
-
});
|
|
196
217
|
// Create the new state for monitoring
|
|
197
218
|
const l1TxState = {
|
|
198
219
|
...baseState,
|
|
199
|
-
id: await this.store?.consumeNextStateId(account) ?? Math.max(...this.txs.map((tx)=>tx.id),
|
|
220
|
+
id: await this.store?.consumeNextStateId(account) ?? Math.max(...this.txs.map((tx)=>tx.id), -1) + 1,
|
|
200
221
|
txHashes: [
|
|
201
222
|
txHash
|
|
202
223
|
],
|
|
@@ -367,10 +388,6 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
367
388
|
timePassed
|
|
368
389
|
});
|
|
369
390
|
await this.updateState(state, TxUtilsState.NOT_MINED);
|
|
370
|
-
this.nonceManager.reset({
|
|
371
|
-
address: account,
|
|
372
|
-
chainId: this.client.chain.id
|
|
373
|
-
});
|
|
374
391
|
throw new DroppedTransactionError(nonce, account);
|
|
375
392
|
}
|
|
376
393
|
// Break if the tx has timed out (ie expired)
|
|
@@ -442,15 +459,7 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
442
459
|
}
|
|
443
460
|
// Oh no, the transaction has timed out!
|
|
444
461
|
if (isCancelTx || !gasConfig.cancelTxOnTimeout) {
|
|
445
|
-
// If this was already a cancellation tx, or we are configured to not cancel txs, we just mark it as NOT_MINED
|
|
446
|
-
// and reset the nonce manager, so the next tx that comes along can reuse the nonce if/when this tx gets dropped.
|
|
447
|
-
// This is the nastiest scenario for us, since the new tx could acquire the next nonce, but then this tx is dropped,
|
|
448
|
-
// and the new tx would never get mined. Eventually, the new tx would also drop.
|
|
449
462
|
await this.updateState(state, TxUtilsState.NOT_MINED);
|
|
450
|
-
this.nonceManager.reset({
|
|
451
|
-
address: account,
|
|
452
|
-
chainId: this.client.chain.id
|
|
453
|
-
});
|
|
454
463
|
} else {
|
|
455
464
|
// Otherwise we fire the cancellation without awaiting to avoid blocking the caller,
|
|
456
465
|
// and monitor it in the background so we can speed it up as needed.
|
|
@@ -566,10 +575,6 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
566
575
|
account
|
|
567
576
|
});
|
|
568
577
|
await this.updateState(state, TxUtilsState.NOT_MINED);
|
|
569
|
-
this.nonceManager.reset({
|
|
570
|
-
address: account,
|
|
571
|
-
chainId: this.client.chain.id
|
|
572
|
-
});
|
|
573
578
|
return;
|
|
574
579
|
}
|
|
575
580
|
// Check if the original tx is still pending
|
|
@@ -584,10 +589,6 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
584
589
|
currentNonce
|
|
585
590
|
});
|
|
586
591
|
await this.updateState(state, TxUtilsState.NOT_MINED);
|
|
587
|
-
this.nonceManager.reset({
|
|
588
|
-
address: account,
|
|
589
|
-
chainId: this.client.chain.id
|
|
590
|
-
});
|
|
591
592
|
return;
|
|
592
593
|
}
|
|
593
594
|
// Get gas price with higher priority fee for cancellation
|
|
@@ -80,4 +80,4 @@ export declare class ReadOnlyL1TxUtils {
|
|
|
80
80
|
}>;
|
|
81
81
|
bumpGasLimit(gasLimit: bigint, _gasConfig?: L1TxUtilsConfig): bigint;
|
|
82
82
|
}
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG9ubHlfbDFfdHhfdXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sMV90eF91dGlscy9yZWFkb25seV9sMV90eF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFFbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXZELE9BQU8sRUFDTCxLQUFLLEdBQUcsRUFDUixLQUFLLE9BQU8sRUFFWixLQUFLLGNBQWMsRUFFbkIsS0FBSyxpQkFBaUIsRUFDdEIsS0FBSyxHQUFHLEVBR1IsS0FBSyxhQUFhLEVBS25CLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBbUQsTUFBTSxhQUFhLENBQUM7QUFTcEcsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFNeEYscUJBQWEsaUJBQWlCO0lBS25CLE1BQU0sRUFBRSxVQUFVO0lBQ3pCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTTthQUNSLFlBQVksRUFBRSxZQUFZO0lBRTFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPO0lBUjlCLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDekMsU0FBUyxDQUFDLFdBQVcsVUFBUztJQUU5QixZQUNTLE1BQU0sRUFBRSxVQUFVLEVBQ2YsTUFBTSxvQkFBcUQsRUFDckQsWUFBWSxFQUFFLFlBQVksRUFDMUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUN2QixnQkFBZ0IsR0FBRSxPQUFlLEVBRzVDO0lBRU0sU0FBUyxTQUVmO0lBRU0sT0FBTyxTQUViO0lBRU0sUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQUVkO0lBRU0sY0FBYyxvQkFFcEI7SUFFTSxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FFOUQ7SUFFRDs7T0FFRztJQUNVLFdBQVcsQ0FDdEIsa0JBQWtCLENBQUMsRUFBRSxlQUFlLEVBQ3BDLFFBQVEsR0FBRSxPQUFlLEVBQ3pCLE9BQU8sR0FBRSxNQUFVLEVBQ25CLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxPQUFPLFNBQVMsQ0FBQyxHQUFHLEtBQUssR0FBRyxRQUFRLEdBQzdELE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FvSm5CO0lBRUQ7O09BRUc7SUFDVSxXQUFXLENBQ3RCLE9BQU8sRUFBRSxPQUFPLEdBQUcsR0FBRyxFQUN0QixPQUFPLEVBQUUsV0FBVyxFQUNwQixVQUFVLENBQUMsRUFBRSxlQUFlLEVBQzVCLFdBQVcsQ0FBQyxFQUFFLFlBQVksR0FDekIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQWlDakI7SUFFSyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsQ0FZL0U7SUFFWSx5QkFBeUIsQ0FDcEMsSUFBSSxFQUFFLEdBQUcsRUFDVCxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNyQixZQUFZLEVBQUUsTUFBTSxDQUFDO1FBQ3JCLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDVCxPQUFPLEVBQUUsR0FBRyxDQUFDO0tBQ2QsRUFDRCxVQUFVLEVBQUUsQ0FBQyxZQUFZLEdBQUc7UUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDLEdBQUcsU0FBUyxFQUNyRSxhQUFhLEdBQUUsYUFBa0IsK0JBZ0RsQztJQUVZLFFBQVEsQ0FDbkIsT0FBTyxFQUFFLFdBQVcsR0FBRztRQUFFLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQTtLQUFFLEVBQ25ELGNBQWMsR0FBRSxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBTSxFQUNuRCxjQUFjLEdBQUUsYUFBa0IsRUFDbEMsR0FBRyxHQUFFLEdBQWUsRUFDcEIsVUFBVSxDQUFDLEVBQUUsZUFBZSxHQUFHO1FBQUUsbUJBQW1CLENBQUMsRUFBRSxNQUFNLENBQUE7S0FBRSxHQUM5RCxPQUFPLENBQUM7UUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO1FBQUMsTUFBTSxFQUFFLEtBQUssTUFBTSxFQUFFLENBQUE7S0FBRSxDQUFDLENBVXJEO0lBRUQsVUFBZ0IsU0FBUyxDQUN2QixJQUFJLEVBQUUsR0FBRyxFQUNULGNBQWMsNENBQXFDLEVBQ25ELGNBQWMsMkJBQW9CLEVBQ2xDLFNBQVMsRUFBRSxlQUFlLEdBQUc7UUFBRSxtQkFBbUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEVBQzdELEdBQUcsRUFBRSxHQUFHOzs7T0FvQ1Q7SUFFTSxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxlQUFlLEdBQUcsTUFBTSxDQVcxRTtDQUNGIn0=
|
|
@@ -1 +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,
|
|
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,CAoJnB;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,CAiCjB;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"}
|
|
@@ -78,9 +78,10 @@ export class ReadOnlyL1TxUtils {
|
|
|
78
78
|
const numBlocks = Math.ceil(gasConfig.stallTimeMs / BLOCK_TIME_MS);
|
|
79
79
|
for(let i = 0; i < numBlocks; i++){
|
|
80
80
|
// each block can go up 12.5% from previous baseFee
|
|
81
|
-
|
|
81
|
+
// ceil, (a+b-1)/b, to avoid truncation at small values (e.g. 1 wei blob base fee)
|
|
82
|
+
maxFeePerGas = (maxFeePerGas * (1_000n + 125n) + 999n) / 1_000n;
|
|
82
83
|
// same for blob gas fee
|
|
83
|
-
maxFeePerBlobGas = maxFeePerBlobGas * (1_000n + 125n) / 1_000n;
|
|
84
|
+
maxFeePerBlobGas = (maxFeePerBlobGas * (1_000n + 125n) + 999n) / 1_000n;
|
|
84
85
|
}
|
|
85
86
|
if (attempt > 0) {
|
|
86
87
|
const configBump = gasConfig.priorityFeeRetryBumpPercentage ?? defaultL1TxUtilsConfig.priorityFeeRetryBumpPercentage;
|
|
@@ -163,13 +164,16 @@ export class ReadOnlyL1TxUtils {
|
|
|
163
164
|
};
|
|
164
165
|
let initialEstimate = 0n;
|
|
165
166
|
if (_blobInputs) {
|
|
166
|
-
// @note requests with blobs also require maxFeePerBlobGas to be set
|
|
167
|
+
// @note requests with blobs also require maxFeePerBlobGas to be set.
|
|
168
|
+
// Use 2x buffer for maxFeePerBlobGas to avoid stale fees and to pass EIP-4844 validation (even if it is a gas estimation call).
|
|
169
|
+
// 1. maxFeePerBlobGas >= blobBaseFee
|
|
170
|
+
// 2. account balance >= gas * maxFeePerGas + maxFeePerBlobGas * blobCount + value
|
|
167
171
|
const gasPrice = await this.getGasPrice(gasConfig, true, 0);
|
|
168
172
|
initialEstimate = await this.client.estimateGas({
|
|
169
173
|
account,
|
|
170
174
|
...request,
|
|
171
175
|
..._blobInputs,
|
|
172
|
-
maxFeePerBlobGas: gasPrice.maxFeePerBlobGas,
|
|
176
|
+
maxFeePerBlobGas: gasPrice.maxFeePerBlobGas * 2n,
|
|
173
177
|
gas: MAX_L1_TX_LIMIT,
|
|
174
178
|
blockTag: 'latest'
|
|
175
179
|
});
|