@aztec/ethereum 0.0.1-commit.85d7d01 → 0.0.1-commit.8655d4a
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 +5254 -25
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +350 -67
- 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 +1 -1
- package/dest/generated/l1-contracts-defaults.js +1 -1
- 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 +11 -1
- package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/l1_tx_utils.js +60 -30
- 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 +391 -73
- 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 +1 -1
- 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 -22
- 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);
|
|
@@ -16,6 +16,10 @@ export declare class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
16
16
|
protected store?: IL1TxStore | undefined;
|
|
17
17
|
protected metrics?: IL1TxMetrics | undefined;
|
|
18
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;
|
|
19
23
|
/** Tx delayer for testing. Only set when enableDelayer config is true. */
|
|
20
24
|
delayer?: Delayer;
|
|
21
25
|
/** KZG instance for blob operations. */
|
|
@@ -26,6 +30,11 @@ export declare class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
26
30
|
protected updateState(l1TxState: L1TxState, newState: TxUtilsState.MINED, l1Timestamp: number): Promise<void>;
|
|
27
31
|
protected updateState(l1TxState: L1TxState, newState: TxUtilsState, l1Timestamp?: undefined): Promise<void>;
|
|
28
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;
|
|
29
38
|
getSenderAddress(): EthAddress;
|
|
30
39
|
getSenderBalance(): Promise<bigint>;
|
|
31
40
|
/**
|
|
@@ -35,6 +44,7 @@ export declare class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
35
44
|
loadStateAndResumeMonitoring(): Promise<void>;
|
|
36
45
|
private signTransaction;
|
|
37
46
|
protected prepareSignedTransaction(txData: PrepareTransactionRequestRequest): Promise<`0x${string}`>;
|
|
47
|
+
private checkInterruptedOrTimedOut;
|
|
38
48
|
/**
|
|
39
49
|
* Sends a transaction with gas estimation and pricing
|
|
40
50
|
* @param request - The transaction request (to, data, value)
|
|
@@ -100,4 +110,4 @@ export declare class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
100
110
|
ethereumSlotDuration: bigint | number;
|
|
101
111
|
}, bindings: LoggerBindings): Delayer;
|
|
102
112
|
}
|
|
103
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdHhfdXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sMV90eF91dGlscy9sMV90eF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUk3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBSXZGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUl2RCxPQUFPLEVBQ0wsS0FBSyxHQUFHLEVBQ1IsS0FBSyxjQUFjLEVBQ25CLEtBQUssR0FBRyxFQUNSLEtBQUssZ0NBQWdDLEVBQ3JDLEtBQUssYUFBYSxFQUNsQixLQUFLLGtCQUFrQixFQUl4QixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5QyxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBRTVFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsT0FBTyxFQUF3QyxNQUFNLGlCQUFpQixDQUFDO0FBQ2hGLE9BQU8sRUFFTCxLQUFLLFlBQVksRUFDakIsS0FBSyxVQUFVLEVBQ2YsS0FBSyxXQUFXLEVBQ2hCLEtBQUssU0FBUyxFQUNkLEtBQUssZUFBZSxFQUVwQixZQUFZLEVBRWIsTUFBTSxZQUFZLENBQUM7QUFJcEIscUJBQWEsU0FBVSxTQUFRLGlCQUFpQjtJQVk1QixNQUFNLEVBQUUsVUFBVTtJQUMzQixPQUFPLEVBQUUsVUFBVTtJQUMxQixTQUFTLENBQUMsTUFBTSxFQUFFLGVBQWU7SUFLakMsU0FBUyxDQUFDLEtBQUssQ0FBQztJQUNoQixTQUFTLENBQUMsT0FBTyxDQUFDO0lBbkJwQixTQUFTLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFNO0lBQ2hDLHVIQUF1SDtJQUN2SCxPQUFPLENBQUMsYUFBYSxDQUFxQjtJQUMxQyx1RkFBdUY7SUFDdkYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQW9CO0lBQzlDLDBFQUEwRTtJQUNuRSxPQUFPLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDekIsd0NBQXdDO0lBQ3hDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxlQUFlLENBQUM7SUFFaEMsWUFDa0IsTUFBTSxFQUFFLFVBQVUsRUFDM0IsT0FBTyxFQUFFLFVBQVUsRUFDaEIsTUFBTSxFQUFFLGVBQWUsRUFDakMsTUFBTSxHQUFFLE1BQTJDLEVBQ25ELFlBQVksR0FBRSxZQUFpQyxFQUMvQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQ2pDLGdCQUFnQixHQUFFLE9BQWUsRUFDdkIsS0FBSyxDQUFDLHdCQUFZLEVBQ2xCLE9BQU8sQ0FBQywwQkFBYyxFQUNoQyxHQUFHLENBQUMsRUFBRSxlQUFlLEVBQ3JCLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFrQmxCO0lBRUQsSUFBVyxLQUFLLGlCQUVmO0lBRUQsSUFBVyxzQkFBc0IsdUJBR2hDO0lBRUQsVUFBZ0IsV0FBVyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEgsVUFBZ0IsV0FBVyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBMkIzRyxZQUFZLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsUUFNdEQ7SUFFRDs7O09BR0c7SUFDSSxVQUFVLElBQUksSUFBSSxDQUV4QjtJQUVNLGdCQUFnQixlQUV0QjtJQUVNLGdCQUFnQixJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FJekM7SUFFRDs7O09BR0c7SUFDVSw0QkFBNEIsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBd0R6RDtZQUVhLGVBQWU7SUFLN0IsVUFBZ0Isd0JBQXdCLENBQUMsTUFBTSxFQUFFLGdDQUFnQywwQkFHaEY7WUFFYSwwQkFBMEI7SUFheEM7Ozs7O09BS0c7SUFDVSxlQUFlLENBQzFCLE9BQU8sRUFBRSxXQUFXLEVBQ3BCLGtCQUFrQixDQUFDLEVBQUUsVUFBVSxFQUMvQixVQUFVLENBQUMsRUFBRSxZQUFZLEVBQ3pCLFdBQVcsR0FBRSxZQUFnQyxHQUM1QyxPQUFPLENBQUM7UUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDO1FBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQTtLQUFFLENBQUMsQ0E2RjVDO1lBRWEsZUFBZTtJQTZCN0I7Ozs7OztPQU1HO0lBQ0gsT0FBTyxDQUFDLFlBQVk7SUF5Q3BCOztPQUVHO0lBQ0gsVUFBZ0Isa0JBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0E4S2hGO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxVQUFVO0lBOEJsQixtREFBbUQ7SUFDdEMscUJBQXFCLENBQUMsY0FBYyxTQUFLLGlCQVFyRDtJQUVEOzs7OztPQUtHO0lBQ1UseUJBQXlCLENBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQ3BCLFNBQVMsQ0FBQyxFQUFFLFVBQVUsRUFDdEIsVUFBVSxDQUFDLEVBQUUsWUFBWSxHQUN4QixPQUFPLENBQUM7UUFBRSxPQUFPLEVBQUUsa0JBQWtCLENBQUM7UUFBQyxLQUFLLEVBQUUsU0FBUyxDQUFBO0tBQUUsQ0FBQyxDQUk1RDtJQUVxQixRQUFRLENBQzVCLE9BQU8sRUFBRSxXQUFXLEdBQUc7UUFBRSxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUM7UUFBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUE7S0FBRSxFQUNuRCxlQUFlLEdBQUUsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQU0sRUFDcEQsY0FBYyxHQUFFLGFBQWtCLEVBQ2xDLEdBQUcsR0FBRSxHQUFlLEVBQ3BCLFVBQVUsQ0FBQyxFQUFFLGVBQWUsR0FBRztRQUFFLG1CQUFtQixDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQUMsbUJBQW1CLENBQUMsRUFBRSxPQUFPLENBQUE7S0FBRSxHQUM3RixPQUFPLENBQUM7UUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO1FBQUMsTUFBTSxFQUFFLEtBQUssTUFBTSxFQUFFLENBQUE7S0FBRSxDQUFDLENBb0JyRDtJQUVEOzs7O09BSUc7SUFDSCxVQUFnQixxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0EwRXJFO1lBR2EsY0FBYztJQUs1Qix1REFBdUQ7SUFDdkQsU0FBUyxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixFQUFFLE1BQU0sR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBTTlFO0lBRUQsc0NBQXNDO0lBQ3RDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO1FBQUUsb0JBQW9CLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQTtLQUFFLEVBQUUsUUFBUSxFQUFFLGNBQWMsR0FBRyxPQUFPLENBRTFHO0NBQ0YifQ==
|
|
@@ -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,6 +2,7 @@ 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';
|
|
@@ -22,10 +23,12 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
22
23
|
store;
|
|
23
24
|
metrics;
|
|
24
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;
|
|
25
28
|
/** Tx delayer for testing. Only set when enableDelayer config is true. */ delayer;
|
|
26
29
|
/** KZG instance for blob operations. */ kzg;
|
|
27
30
|
constructor(client, address, signer, logger = createLogger('ethereum:publisher'), dateProvider = new DateProvider(), config, debugMaxGasLimit = false, store, metrics, kzg, delayer){
|
|
28
|
-
super(client, logger, dateProvider, config, debugMaxGasLimit), this.client = client, this.address = address, this.signer = signer, this.store = store, this.metrics = metrics, this.txs = [];
|
|
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);
|
|
29
32
|
this.kzg = kzg;
|
|
30
33
|
// Set up delayer: use provided one or create new
|
|
31
34
|
if (config?.enableDelayer && config?.ethereumSlotDuration) {
|
|
@@ -59,6 +62,11 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
59
62
|
this.metrics?.recordMinedTx(l1TxState, new Date(l1Timestamp));
|
|
60
63
|
} else if (newState === TxUtilsState.NOT_MINED) {
|
|
61
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
|
+
}
|
|
62
70
|
}
|
|
63
71
|
// Update state in the store
|
|
64
72
|
await this.store?.saveState(sender, l1TxState).catch((err)=>this.logger.error('Failed to persist L1 tx state', err));
|
|
@@ -67,6 +75,12 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
67
75
|
this.config = merge(this.config, newConfig);
|
|
68
76
|
this.logger.info('Updated L1TxUtils config', pickBy(newConfig, (_, key)=>key in l1TxUtilsConfigMappings));
|
|
69
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
|
+
}
|
|
70
84
|
getSenderAddress() {
|
|
71
85
|
return this.address;
|
|
72
86
|
}
|
|
@@ -133,18 +147,29 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
133
147
|
const txRequest = await this.client.prepareTransactionRequest(txData);
|
|
134
148
|
return await this.signTransaction(txRequest);
|
|
135
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
|
+
}
|
|
136
160
|
/**
|
|
137
161
|
* Sends a transaction with gas estimation and pricing
|
|
138
162
|
* @param request - The transaction request (to, data, value)
|
|
139
163
|
* @param gasConfig - Optional gas configuration
|
|
140
164
|
* @returns The transaction hash and parameters used
|
|
141
165
|
*/ async sendTransaction(request, gasConfigOverrides, blobInputs, stateChange = TxUtilsState.SENT) {
|
|
142
|
-
if (this.interrupted) {
|
|
143
|
-
throw new InterruptError(`Transaction sending is interrupted`);
|
|
144
|
-
}
|
|
145
166
|
try {
|
|
146
167
|
const gasConfig = merge(this.config, gasConfigOverrides);
|
|
147
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);
|
|
148
173
|
let gasLimit;
|
|
149
174
|
if (this.debugMaxGasLimit) {
|
|
150
175
|
gasLimit = MAX_L1_TX_LIMIT;
|
|
@@ -158,36 +183,41 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
158
183
|
...request
|
|
159
184
|
});
|
|
160
185
|
const gasPrice = await this.getGasPrice(gasConfig, !!blobInputs);
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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();
|
|
167
216
|
}
|
|
168
|
-
const nonce = await this.client.getTransactionCount({
|
|
169
|
-
address: account,
|
|
170
|
-
blockTag: 'pending'
|
|
171
|
-
});
|
|
172
|
-
const baseState = {
|
|
173
|
-
request,
|
|
174
|
-
gasLimit,
|
|
175
|
-
blobInputs,
|
|
176
|
-
gasPrice,
|
|
177
|
-
nonce
|
|
178
|
-
};
|
|
179
|
-
const txData = this.makeTxData(baseState, {
|
|
180
|
-
isCancelTx: false
|
|
181
|
-
});
|
|
182
|
-
// Send the new tx
|
|
183
|
-
const signedRequest = await this.prepareSignedTransaction(txData);
|
|
184
|
-
const txHash = await this.client.sendRawTransaction({
|
|
185
|
-
serializedTransaction: signedRequest
|
|
186
|
-
});
|
|
187
217
|
// Create the new state for monitoring
|
|
188
218
|
const l1TxState = {
|
|
189
219
|
...baseState,
|
|
190
|
-
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,
|
|
191
221
|
txHashes: [
|
|
192
222
|
txHash
|
|
193
223
|
],
|
|
@@ -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":"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"}
|
|
@@ -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
|
});
|
|
@@ -12,8 +12,10 @@ export declare class Delayer {
|
|
|
12
12
|
ethereumSlotDuration: bigint;
|
|
13
13
|
nextWait: {
|
|
14
14
|
l1Timestamp: bigint;
|
|
15
|
+
timeoutSeconds?: number;
|
|
15
16
|
} | {
|
|
16
17
|
l1BlockNumber: bigint;
|
|
18
|
+
timeoutSeconds?: number;
|
|
17
19
|
} | {
|
|
18
20
|
indefinitely: true;
|
|
19
21
|
} | undefined;
|
|
@@ -29,9 +31,9 @@ export declare class Delayer {
|
|
|
29
31
|
/** Returns the raw hex for all cancelled txs. */
|
|
30
32
|
getCancelledTxs(): Hex[];
|
|
31
33
|
/** Delays the next tx to be sent so it lands on the given L1 block number. */
|
|
32
|
-
pauseNextTxUntilBlock(l1BlockNumber: number | bigint): void;
|
|
34
|
+
pauseNextTxUntilBlock(l1BlockNumber: number | bigint, timeoutSeconds?: number): void;
|
|
33
35
|
/** Delays the next tx to be sent so it lands on the given timestamp. */
|
|
34
|
-
pauseNextTxUntilTimestamp(l1Timestamp: number | bigint): void;
|
|
36
|
+
pauseNextTxUntilTimestamp(l1Timestamp: number | bigint, timeoutSeconds?: number): void;
|
|
35
37
|
/** Delays the next tx to be sent indefinitely. */
|
|
36
38
|
cancelNextTx(): void;
|
|
37
39
|
/**
|
|
@@ -53,4 +55,4 @@ export declare function createDelayer(dateProvider: DateProvider, opts: {
|
|
|
53
55
|
* The delayer intercepts sendRawTransaction calls and delays them based on the delayer's state.
|
|
54
56
|
*/
|
|
55
57
|
export declare function wrapClientWithDelayer<T extends ViemClient>(client: T, delayer: Delayer): T;
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfZGVsYXllci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2wxX3R4X3V0aWxzL3R4X2RlbGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzVELE9BQU8sRUFDTCxLQUFLLE1BQU0sRUFDWCxLQUFLLEdBQUcsRUFVVCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sS0FBSyxFQUE0QixVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJeEUsd0JBQWdCLGNBQWMsQ0FBQyxDQUFDLFNBQVMsTUFBTSxFQUM3QyxNQUFNLEVBQUUsQ0FBQyxFQUNULFdBQVcsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUM1QixNQUFNLENBQUMsRUFBRSxNQUFNLEVBQ2YsT0FBTyxDQUFDLEVBQUUsTUFBTSxvQkFpQmpCO0FBRUQsd0JBQWdCLG9CQUFvQixDQUFDLENBQUMsU0FBUyxNQUFNLEVBQ25ELE1BQU0sRUFBRSxDQUFDLEVBQ1QsU0FBUyxFQUFFLE1BQU0sR0FBRyxNQUFNLEVBQzFCLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFDZixPQUFPLENBQUMsRUFBRSxNQUFNLG9CQXdCakI7QUFFRCxzR0FBc0c7QUFDdEcscUJBQWEsT0FBTztJQWNULFlBQVksRUFBRSxZQUFZO0lBYm5DLE9BQU8sQ0FBQyxNQUFNLENBQVM7SUFFaEIsd0JBQXdCLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBYTtJQUN6RCxvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFDN0IsUUFBUSxFQUNYO1FBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQztRQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEdBQ2hEO1FBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQztRQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEdBQ2xEO1FBQUUsWUFBWSxFQUFFLElBQUksQ0FBQTtLQUFFLEdBQ3RCLFNBQVMsQ0FBYTtJQUNuQixZQUFZLEVBQUUsR0FBRyxFQUFFLENBQU07SUFDekIsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFNO0lBRWhDLFlBQ1MsWUFBWSxFQUFFLFlBQVksRUFDakMsSUFBSSxFQUFFO1FBQUUsb0JBQW9CLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQTtLQUFFLEVBQy9DLFFBQVEsRUFBRSxjQUFjLEVBSXpCO0lBRUQsd0RBQXdEO0lBQ3hELFNBQVMsSUFBSSxNQUFNLENBRWxCO0lBRUQsc0RBQXNEO0lBQ3RELGVBQWUsb0JBRWQ7SUFFRCxpREFBaUQ7SUFDakQsZUFBZSxJQUFJLEdBQUcsRUFBRSxDQUV2QjtJQUVELDhFQUE4RTtJQUM5RSxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxjQUFjLENBQUMsRUFBRSxNQUFNLFFBRTVFO0lBRUQsd0VBQXdFO0lBQ3hFLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLGNBQWMsQ0FBQyxFQUFFLE1BQU0sUUFFOUU7SUFFRCxrREFBa0Q7SUFDbEQsWUFBWSxTQUVYO0lBRUQ7Ozs7T0FJRztJQUNILDJCQUEyQixDQUFDLE9BQU8sRUFBRSxNQUFNLEdBQUcsU0FBUyxRQUV0RDtDQUNGO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQWdCLGFBQWEsQ0FDM0IsWUFBWSxFQUFFLFlBQVksRUFDMUIsSUFBSSxFQUFFO0lBQUUsb0JBQW9CLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQTtDQUFFLEVBQy9DLFFBQVEsRUFBRSxjQUFjLEdBQ3ZCLE9BQU8sQ0FFVDtBQWFEOzs7R0FHRztBQUNILHdCQUFnQixxQkFBcUIsQ0FBQyxDQUFDLFNBQVMsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sR0FBRyxDQUFDLENBdUgxRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx_delayer.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/tx_delayer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAEvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EACL,KAAK,MAAM,EACX,KAAK,GAAG,EAUT,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAA4B,UAAU,EAAE,MAAM,aAAa,CAAC;AAIxE,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAC7C,MAAM,EAAE,CAAC,EACT,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,oBAiBjB;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EACnD,MAAM,EAAE,CAAC,EACT,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,oBAwBjB;AAED,sGAAsG;AACtG,qBAAa,OAAO;
|
|
1
|
+
{"version":3,"file":"tx_delayer.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/tx_delayer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAEvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EACL,KAAK,MAAM,EACX,KAAK,GAAG,EAUT,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAA4B,UAAU,EAAE,MAAM,aAAa,CAAC;AAIxE,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAC7C,MAAM,EAAE,CAAC,EACT,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,oBAiBjB;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EACnD,MAAM,EAAE,CAAC,EACT,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,oBAwBjB;AAED,sGAAsG;AACtG,qBAAa,OAAO;IAcT,YAAY,EAAE,YAAY;IAbnC,OAAO,CAAC,MAAM,CAAS;IAEhB,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAa;IACzD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EACX;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAChD;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAClD;QAAE,YAAY,EAAE,IAAI,CAAA;KAAE,GACtB,SAAS,CAAa;IACnB,YAAY,EAAE,GAAG,EAAE,CAAM;IACzB,YAAY,EAAE,GAAG,EAAE,CAAM;IAEhC,YACS,YAAY,EAAE,YAAY,EACjC,IAAI,EAAE;QAAE,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,EAC/C,QAAQ,EAAE,cAAc,EAIzB;IAED,wDAAwD;IACxD,SAAS,IAAI,MAAM,CAElB;IAED,sDAAsD;IACtD,eAAe,oBAEd;IAED,iDAAiD;IACjD,eAAe,IAAI,GAAG,EAAE,CAEvB;IAED,8EAA8E;IAC9E,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,QAE5E;IAED,wEAAwE;IACxE,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,QAE9E;IAED,kDAAkD;IAClD,YAAY,SAEX;IAED;;;;OAIG;IACH,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,QAEtD;CACF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE;IAAE,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAC/C,QAAQ,EAAE,cAAc,GACvB,OAAO,CAET;AAaD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,CAuH1F"}
|
|
@@ -60,14 +60,16 @@ export function waitUntilL1Timestamp(client, timestamp, logger, timeout) {
|
|
|
60
60
|
/** Returns the raw hex for all cancelled txs. */ getCancelledTxs() {
|
|
61
61
|
return this.cancelledTxs;
|
|
62
62
|
}
|
|
63
|
-
/** Delays the next tx to be sent so it lands on the given L1 block number. */ pauseNextTxUntilBlock(l1BlockNumber) {
|
|
63
|
+
/** Delays the next tx to be sent so it lands on the given L1 block number. */ pauseNextTxUntilBlock(l1BlockNumber, timeoutSeconds) {
|
|
64
64
|
this.nextWait = {
|
|
65
|
-
l1BlockNumber: BigInt(l1BlockNumber)
|
|
65
|
+
l1BlockNumber: BigInt(l1BlockNumber),
|
|
66
|
+
timeoutSeconds
|
|
66
67
|
};
|
|
67
68
|
}
|
|
68
|
-
/** Delays the next tx to be sent so it lands on the given timestamp. */ pauseNextTxUntilTimestamp(l1Timestamp) {
|
|
69
|
+
/** Delays the next tx to be sent so it lands on the given timestamp. */ pauseNextTxUntilTimestamp(l1Timestamp, timeoutSeconds) {
|
|
69
70
|
this.nextWait = {
|
|
70
|
-
l1Timestamp: BigInt(l1Timestamp)
|
|
71
|
+
l1Timestamp: BigInt(l1Timestamp),
|
|
72
|
+
timeoutSeconds
|
|
71
73
|
};
|
|
72
74
|
}
|
|
73
75
|
/** Delays the next tx to be sent indefinitely. */ cancelNextTx() {
|
|
@@ -131,7 +133,7 @@ export function waitUntilL1Timestamp(client, timestamp, logger, timeout) {
|
|
|
131
133
|
return Promise.resolve(txHash);
|
|
132
134
|
}
|
|
133
135
|
// Or wait until the desired block number or timestamp
|
|
134
|
-
wait = 'l1BlockNumber' in waitUntil ? waitUntilBlock(publicClient, waitUntil.l1BlockNumber - 1n, logger) : 'l1Timestamp' in waitUntil ? waitUntilL1Timestamp(publicClient, waitUntil.l1Timestamp - delayer.ethereumSlotDuration, logger) : undefined;
|
|
136
|
+
wait = 'l1BlockNumber' in waitUntil ? waitUntilBlock(publicClient, waitUntil.l1BlockNumber - 1n, logger, waitUntil.timeoutSeconds) : 'l1Timestamp' in waitUntil ? waitUntilL1Timestamp(publicClient, waitUntil.l1Timestamp - delayer.ethereumSlotDuration, logger, waitUntil.timeoutSeconds) : undefined;
|
|
135
137
|
logger.info(`Delaying tx ${txHash} until ${inspect(waitUntil)}`, {
|
|
136
138
|
sender,
|
|
137
139
|
argsLen: args.length,
|