@aztec/cli 0.0.1-commit.3469e52 → 0.0.1-commit.3895657bc
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/cmds/infrastructure/setup_l2_contract.d.ts +1 -1
- package/dest/cmds/infrastructure/setup_l2_contract.d.ts.map +1 -1
- package/dest/cmds/infrastructure/setup_l2_contract.js +4 -3
- package/dest/cmds/l1/assume_proven_through.d.ts +3 -2
- package/dest/cmds/l1/assume_proven_through.d.ts.map +1 -1
- package/dest/cmds/l1/assume_proven_through.js +3 -5
- package/dest/cmds/l1/compute_genesis_values.d.ts +4 -0
- package/dest/cmds/l1/compute_genesis_values.d.ts.map +1 -0
- package/dest/cmds/l1/compute_genesis_values.js +17 -0
- package/dest/cmds/l1/index.d.ts +1 -1
- package/dest/cmds/l1/index.d.ts.map +1 -1
- package/dest/cmds/l1/index.js +7 -2
- package/dest/cmds/l1/update_l1_validators.js +5 -5
- package/dest/config/cached_fetch.d.ts +19 -10
- package/dest/config/cached_fetch.d.ts.map +1 -1
- package/dest/config/cached_fetch.js +110 -32
- package/dest/config/chain_l2_config.d.ts +1 -1
- package/dest/config/chain_l2_config.d.ts.map +1 -1
- package/dest/config/chain_l2_config.js +3 -1
- package/dest/config/generated/networks.d.ts +45 -25
- package/dest/config/generated/networks.d.ts.map +1 -1
- package/dest/config/generated/networks.js +46 -26
- package/dest/config/network_config.d.ts +1 -1
- package/dest/config/network_config.d.ts.map +1 -1
- package/dest/config/network_config.js +3 -2
- package/dest/utils/inspect.d.ts +1 -1
- package/dest/utils/inspect.d.ts.map +1 -1
- package/dest/utils/inspect.js +4 -1
- package/package.json +30 -30
- package/src/cmds/infrastructure/setup_l2_contract.ts +5 -4
- package/src/cmds/l1/assume_proven_through.ts +4 -7
- package/src/cmds/l1/compute_genesis_values.ts +29 -0
- package/src/cmds/l1/index.ts +23 -4
- package/src/cmds/l1/update_l1_validators.ts +5 -5
- package/src/config/cached_fetch.ts +119 -31
- package/src/config/chain_l2_config.ts +3 -1
- package/src/config/generated/networks.ts +44 -24
- package/src/config/network_config.ts +3 -2
- package/src/utils/inspect.ts +4 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { LogFn } from '@aztec/foundation/log';
|
|
2
2
|
export declare function setupL2Contracts(nodeUrl: string, testAccounts: boolean, json: boolean, log: LogFn): Promise<void>;
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBfbDJfY29udHJhY3QuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbWRzL2luZnJhc3RydWN0dXJlL3NldHVwX2wyX2NvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBS25ELHdCQUFzQixnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxpQkF3QnZHIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup_l2_contract.d.ts","sourceRoot":"","sources":["../../../src/cmds/infrastructure/setup_l2_contract.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup_l2_contract.d.ts","sourceRoot":"","sources":["../../../src/cmds/infrastructure/setup_l2_contract.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAKnD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,iBAwBvG"}
|
|
@@ -2,7 +2,8 @@ import { getInitialTestAccountsData } from '@aztec/accounts/testing';
|
|
|
2
2
|
import { createAztecNodeClient } from '@aztec/aztec.js/node';
|
|
3
3
|
import { jsonStringify } from '@aztec/foundation/json-rpc';
|
|
4
4
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
5
|
-
import {
|
|
5
|
+
import { EmbeddedWallet } from '@aztec/wallets/embedded';
|
|
6
|
+
import { deployFundedSchnorrAccounts } from '@aztec/wallets/testing';
|
|
6
7
|
export async function setupL2Contracts(nodeUrl, testAccounts, json, log) {
|
|
7
8
|
const waitOpts = {
|
|
8
9
|
timeout: 180,
|
|
@@ -11,12 +12,12 @@ export async function setupL2Contracts(nodeUrl, testAccounts, json, log) {
|
|
|
11
12
|
log('setupL2Contracts: Wait options' + jsonStringify(waitOpts));
|
|
12
13
|
log('setupL2Contracts: Creating PXE client...');
|
|
13
14
|
const node = createAztecNodeClient(nodeUrl);
|
|
14
|
-
const wallet = await
|
|
15
|
+
const wallet = await EmbeddedWallet.create(node);
|
|
15
16
|
let deployedAccountManagers = [];
|
|
16
17
|
if (testAccounts) {
|
|
17
18
|
log('setupL2Contracts: Deploying test accounts...');
|
|
18
19
|
const initialAccountsData = await getInitialTestAccountsData();
|
|
19
|
-
deployedAccountManagers = await deployFundedSchnorrAccounts(wallet,
|
|
20
|
+
deployedAccountManagers = await deployFundedSchnorrAccounts(wallet, initialAccountsData, waitOpts);
|
|
20
21
|
}
|
|
21
22
|
if (json) {
|
|
22
23
|
const toPrint = {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import type { LogFn } from '@aztec/foundation/log';
|
|
2
|
-
export declare function assumeProvenThrough(
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
export declare function assumeProvenThrough(checkpointOrLatest: CheckpointNumber | undefined, l1RpcUrls: string[], nodeUrl: string, log: LogFn): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzdW1lX3Byb3Zlbl90aHJvdWdoLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY21kcy9sMS9hc3N1bWVfcHJvdmVuX3Rocm91Z2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHbkQsd0JBQXNCLG1CQUFtQixDQUN2QyxrQkFBa0IsRUFBRSxnQkFBZ0IsR0FBRyxTQUFTLEVBQ2hELFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFDbkIsT0FBTyxFQUFFLE1BQU0sRUFDZixHQUFHLEVBQUUsS0FBSyxpQkFTWCJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assume_proven_through.d.ts","sourceRoot":"","sources":["../../../src/cmds/l1/assume_proven_through.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"assume_proven_through.d.ts","sourceRoot":"","sources":["../../../src/cmds/l1/assume_proven_through.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnD,wBAAsB,mBAAmB,CACvC,kBAAkB,EAAE,gBAAgB,GAAG,SAAS,EAChD,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,KAAK,iBASX"}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import { createAztecNodeClient } from '@aztec/aztec.js/node';
|
|
2
2
|
import { RollupCheatCodes } from '@aztec/ethereum/test';
|
|
3
|
-
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
4
3
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
5
|
-
export async function assumeProvenThrough(
|
|
4
|
+
export async function assumeProvenThrough(checkpointOrLatest, l1RpcUrls, nodeUrl, log) {
|
|
6
5
|
const aztecNode = createAztecNodeClient(nodeUrl);
|
|
7
6
|
const rollupAddress = await aztecNode.getNodeInfo().then((i)=>i.l1ContractAddresses.rollupAddress);
|
|
8
|
-
const blockNumber = blockNumberOrLatest ? BlockNumber(blockNumberOrLatest) : await aztecNode.getBlockNumber();
|
|
9
7
|
const rollupCheatCodes = RollupCheatCodes.create(l1RpcUrls, {
|
|
10
8
|
rollupAddress
|
|
11
9
|
}, new DateProvider());
|
|
12
|
-
await rollupCheatCodes.markAsProven(
|
|
13
|
-
log(`Assumed proven through
|
|
10
|
+
await rollupCheatCodes.markAsProven(checkpointOrLatest);
|
|
11
|
+
log(`Assumed proven through checkpoint ${checkpointOrLatest ?? 'latest'}`);
|
|
14
12
|
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { LogFn } from '@aztec/foundation/log';
|
|
2
|
+
/** Computes and prints genesis values needed for L1 contract deployment. */
|
|
3
|
+
export declare function computeGenesisValuesCmd(testAccounts: boolean, sponsoredFPC: boolean, log: LogFn): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZV9nZW5lc2lzX3ZhbHVlcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NtZHMvbDEvY29tcHV0ZV9nZW5lc2lzX3ZhbHVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQU1uRCw0RUFBNEU7QUFDNUUsd0JBQXNCLHVCQUF1QixDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxpQkFvQnJHIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute_genesis_values.d.ts","sourceRoot":"","sources":["../../../src/cmds/l1/compute_genesis_values.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAMnD,4EAA4E;AAC5E,wBAAsB,uBAAuB,CAAC,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,iBAoBrG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getInitialTestAccountsData } from '@aztec/accounts/testing';
|
|
2
|
+
import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
3
|
+
import { getGenesisValues } from '@aztec/world-state/testing';
|
|
4
|
+
import { getSponsoredFPCAddress } from '../../utils/setup_contracts.js';
|
|
5
|
+
/** Computes and prints genesis values needed for L1 contract deployment. */ export async function computeGenesisValuesCmd(testAccounts, sponsoredFPC, log) {
|
|
6
|
+
const initialAccounts = testAccounts ? await getInitialTestAccountsData() : [];
|
|
7
|
+
const sponsoredFPCAddresses = sponsoredFPC ? await getSponsoredFPCAddress() : [];
|
|
8
|
+
const initialFundedAccounts = initialAccounts.map((a)=>a.address).concat(sponsoredFPCAddresses);
|
|
9
|
+
const { genesisArchiveRoot } = await getGenesisValues(initialFundedAccounts);
|
|
10
|
+
const { getVKTreeRoot } = await import('@aztec/noir-protocol-circuits-types/vk-tree');
|
|
11
|
+
const vkTreeRoot = getVKTreeRoot();
|
|
12
|
+
log(JSON.stringify({
|
|
13
|
+
vkTreeRoot: vkTreeRoot.toString(),
|
|
14
|
+
protocolContractsHash: protocolContractsHash.toString(),
|
|
15
|
+
genesisArchiveRoot: genesisArchiveRoot.toString()
|
|
16
|
+
}, null, 2));
|
|
17
|
+
}
|
package/dest/cmds/l1/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { LogFn, Logger } from '@aztec/foundation/log';
|
|
2
2
|
import { type Command } from 'commander';
|
|
3
3
|
export declare function injectCommands(program: Command, log: LogFn, debugLogger: Logger): Command;
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbWRzL2wxL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQVUsTUFBTSxXQUFXLENBQUM7QUF3QmpELHdCQUFnQixjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBK2YvRSJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cmds/l1/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cmds/l1/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,WAAW,CAAC;AAwBjD,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,WA+f/E"}
|
package/dest/cmds/l1/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
3
|
import { Option } from 'commander';
|
|
3
4
|
import { ETHEREUM_HOSTS, MNEMONIC, PRIVATE_KEY, l1ChainIdOption, nodeOption, parseAztecAddress, parseBigint, parseEthereumAddress } from '../../utils/commands.js';
|
|
@@ -16,6 +17,10 @@ export function injectCommands(program, log, debugLogger) {
|
|
|
16
17
|
const initialValidators = options.validators?.split(',').map((validator)=>EthAddress.fromString(validator)) || [];
|
|
17
18
|
await deployNewRollup(options.registryAddress, options.l1RpcUrls, options.l1ChainId, options.privateKey, options.mnemonic, options.mnemonicIndex, options.testAccounts, options.sponsoredFpc, options.json, initialValidators, options.realVerifier, log);
|
|
18
19
|
});
|
|
20
|
+
program.command('compute-genesis-values').description('Computes genesis values (VK tree root, protocol contracts hash, genesis archive root).').addOption(new Option('--test-accounts <boolean>', 'Include initial test accounts in genesis state').env('TEST_ACCOUNTS').argParser((arg)=>arg === 'true')).addOption(new Option('--sponsored-fpc <boolean>', 'Include sponsored FPC contract in genesis state').env('SPONSORED_FPC').argParser((arg)=>arg === 'true')).action(async (options)=>{
|
|
21
|
+
const { computeGenesisValuesCmd } = await import('./compute_genesis_values.js');
|
|
22
|
+
await computeGenesisValuesCmd(options.testAccounts, options.sponsoredFpc, log);
|
|
23
|
+
});
|
|
19
24
|
program.command('deposit-governance-tokens').description('Deposits governance tokens to the governance contract.').requiredOption('-r, --registry-address <string>', 'The address of the registry contract', parseEthereumAddress).requiredOption('--recipient <string>', 'The recipient of the tokens', parseEthereumAddress).requiredOption('-a, --amount <string>', 'The amount of tokens to deposit', parseBigint).option('--mint', 'Mint the tokens on L1', false).addOption(l1RpcUrlsOption).addOption(l1ChainIdOption).option('-p, --private-key <string>', 'The private key to use to deposit', PRIVATE_KEY).option('-m, --mnemonic <string>', 'The mnemonic to use to deposit', 'test test test test test test test test test test test junk').option('-i, --mnemonic-index <number>', 'The index of the mnemonic to use to deposit', (arg)=>parseInt(arg), 0).action(async (options)=>{
|
|
20
25
|
const { depositGovernanceTokens } = await import('./governance_utils.js');
|
|
21
26
|
await depositGovernanceTokens({
|
|
@@ -188,9 +193,9 @@ export function injectCommands(program, log, debugLogger) {
|
|
|
188
193
|
});
|
|
189
194
|
program.command('set-proven-through', {
|
|
190
195
|
hidden: true
|
|
191
|
-
}).description('Instructs the L1 rollup contract to assume all blocks until the given
|
|
196
|
+
}).description('Instructs the L1 rollup contract to assume all blocks until the given checkpoint are automatically proven.').argument('[checkpoint]', 'The target checkpoint, defaults to the latest pending checkpoint.', parseBigint).addOption(l1RpcUrlsOption).addOption(nodeOption).action(async (checkpoint, options)=>{
|
|
192
197
|
const { assumeProvenThrough } = await import('./assume_proven_through.js');
|
|
193
|
-
await assumeProvenThrough(
|
|
198
|
+
await assumeProvenThrough(CheckpointNumber.fromBigInt(checkpoint), options.l1RpcUrls, options.nodeUrl, log);
|
|
194
199
|
});
|
|
195
200
|
program.command('advance-epoch').description('Use L1 cheat codes to warp time until the next epoch.').addOption(l1RpcUrlsOption).addOption(nodeOption).action(async (options)=>{
|
|
196
201
|
const { advanceEpoch } = await import('./advance_epoch.js');
|
|
@@ -2,7 +2,7 @@ import { createEthereumChain, isAnvilTestChain } from '@aztec/ethereum/chain';
|
|
|
2
2
|
import { createExtendedL1Client, getPublicClient } from '@aztec/ethereum/client';
|
|
3
3
|
import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
|
|
4
4
|
import { GSEContract, RollupContract } from '@aztec/ethereum/contracts';
|
|
5
|
-
import {
|
|
5
|
+
import { createL1TxUtils } from '@aztec/ethereum/l1-tx-utils';
|
|
6
6
|
import { EthCheatCodes } from '@aztec/ethereum/test';
|
|
7
7
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
8
8
|
import { RollupAbi, StakingAssetHandlerAbi, TestERC20Abi } from '@aztec/l1-artifacts';
|
|
@@ -38,7 +38,7 @@ export async function addL1Validator({ rpcUrls, chainId, privateKey, mnemonic, a
|
|
|
38
38
|
const gseAddress = await rollup.read.getGSE();
|
|
39
39
|
const gse = new GSEContract(l1Client, gseAddress);
|
|
40
40
|
const registrationTuple = await gse.makeRegistrationTuple(blsSecretKey);
|
|
41
|
-
const l1TxUtils =
|
|
41
|
+
const l1TxUtils = createL1TxUtils(l1Client, {
|
|
42
42
|
logger: debugLogger
|
|
43
43
|
});
|
|
44
44
|
const proofParamsObj = ZkPassportProofParams.fromBuffer(proofParams);
|
|
@@ -130,7 +130,7 @@ export async function addL1ValidatorViaRollup({ rpcUrls, chainId, privateKey, mn
|
|
|
130
130
|
const gseAddress = await rollup.read.getGSE();
|
|
131
131
|
const gse = new GSEContract(l1Client, gseAddress);
|
|
132
132
|
const registrationTuple = await gse.makeRegistrationTuple(blsSecretKey);
|
|
133
|
-
const l1TxUtils =
|
|
133
|
+
const l1TxUtils = createL1TxUtils(l1Client, {
|
|
134
134
|
logger: debugLogger
|
|
135
135
|
});
|
|
136
136
|
const { receipt } = await l1TxUtils.sendAndMonitorTransaction({
|
|
@@ -172,7 +172,7 @@ export async function removeL1Validator({ rpcUrls, chainId, privateKey, mnemonic
|
|
|
172
172
|
const account = getAccount(privateKey, mnemonic);
|
|
173
173
|
const chain = createEthereumChain(rpcUrls, chainId);
|
|
174
174
|
const l1Client = createExtendedL1Client(rpcUrls, account, chain.chainInfo);
|
|
175
|
-
const l1TxUtils =
|
|
175
|
+
const l1TxUtils = createL1TxUtils(l1Client, {
|
|
176
176
|
logger: debugLogger
|
|
177
177
|
});
|
|
178
178
|
dualLog(`Removing validator ${validatorAddress.toString()} from rollup ${rollupAddress.toString()}`);
|
|
@@ -194,7 +194,7 @@ export async function pruneRollup({ rpcUrls, chainId, privateKey, mnemonic, roll
|
|
|
194
194
|
const account = getAccount(privateKey, mnemonic);
|
|
195
195
|
const chain = createEthereumChain(rpcUrls, chainId);
|
|
196
196
|
const l1Client = createExtendedL1Client(rpcUrls, account, chain.chainInfo);
|
|
197
|
-
const l1TxUtils =
|
|
197
|
+
const l1TxUtils = createL1TxUtils(l1Client, {
|
|
198
198
|
logger: debugLogger
|
|
199
199
|
});
|
|
200
200
|
dualLog(`Trying prune`);
|
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
export interface CachedFetchOptions {
|
|
2
|
-
/**
|
|
3
|
-
cacheDurationMs: number;
|
|
4
|
-
/** The cache file */
|
|
2
|
+
/** The cache file path for storing data. If not provided, no caching is performed. */
|
|
5
3
|
cacheFile?: string;
|
|
4
|
+
/** Fallback max-age in milliseconds when server sends no Cache-Control header. Defaults to 5 minutes. */
|
|
5
|
+
defaultMaxAgeMs?: number;
|
|
6
6
|
}
|
|
7
|
+
/** Extracts max-age value in milliseconds from a Response's Cache-Control header. Returns undefined if not present. */
|
|
8
|
+
export declare function parseMaxAge(response: {
|
|
9
|
+
headers: {
|
|
10
|
+
get(name: string): string | null;
|
|
11
|
+
};
|
|
12
|
+
}): number | undefined;
|
|
7
13
|
/**
|
|
8
|
-
* Fetches data from a URL with file-based caching
|
|
9
|
-
*
|
|
14
|
+
* Fetches data from a URL with file-based HTTP conditional caching.
|
|
15
|
+
*
|
|
16
|
+
* Data is stored as raw JSON in the cache file (same format as the server returns).
|
|
17
|
+
* Caching metadata (ETag, expiry) is stored in a separate sidecar `.meta` file.
|
|
18
|
+
* This keeps the data file human-readable and backward-compatible with older code.
|
|
10
19
|
*
|
|
11
20
|
* @param url - The URL to fetch from
|
|
12
|
-
* @param
|
|
13
|
-
* @param
|
|
14
|
-
* @param
|
|
15
|
-
* @returns The fetched and parsed JSON data, or undefined if fetch fails
|
|
21
|
+
* @param options - Caching options
|
|
22
|
+
* @param fetch - Fetch implementation (defaults to globalThis.fetch)
|
|
23
|
+
* @param log - Logger instance
|
|
24
|
+
* @returns The fetched and parsed JSON data, or undefined if fetch fails
|
|
16
25
|
*/
|
|
17
26
|
export declare function cachedFetch<T = any>(url: string, options: CachedFetchOptions, fetch?: typeof globalThis.fetch, log?: import("@aztec/aztec.js/log").Logger): Promise<T | undefined>;
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVkX2ZldGNoLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2NhY2hlZF9mZXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxNQUFNLFdBQVcsa0JBQWtCO0lBQ2pDLHNGQUFzRjtJQUN0RixTQUFTLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDbkIseUdBQXlHO0lBQ3pHLGVBQWUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUMxQjtBQVVELHVIQUF1SDtBQUN2SCx3QkFBZ0IsV0FBVyxDQUFDLFFBQVEsRUFBRTtJQUFFLE9BQU8sRUFBRTtRQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUE7S0FBRSxDQUFBO0NBQUUsR0FBRyxNQUFNLEdBQUcsU0FBUyxDQVUzRztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILHdCQUFzQixXQUFXLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFDdkMsR0FBRyxFQUFFLE1BQU0sRUFDWCxPQUFPLEVBQUUsa0JBQWtCLEVBQzNCLEtBQUssMEJBQW1CLEVBQ3hCLEdBQUcsdUNBQStCLEdBQ2pDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBb0V4QiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cached_fetch.d.ts","sourceRoot":"","sources":["../../src/config/cached_fetch.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,
|
|
1
|
+
{"version":3,"file":"cached_fetch.d.ts","sourceRoot":"","sources":["../../src/config/cached_fetch.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yGAAyG;IACzG,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAUD,uHAAuH;AACvH,wBAAgB,WAAW,CAAC,QAAQ,EAAE;IAAE,OAAO,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAU3G;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,GAAG,EACvC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,kBAAkB,EAC3B,KAAK,0BAAmB,EACxB,GAAG,uCAA+B,GACjC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAoExB"}
|
|
@@ -1,50 +1,105 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/aztec.js/log';
|
|
2
|
-
import { mkdir, readFile,
|
|
2
|
+
import { mkdir, readFile, writeFile } from 'fs/promises';
|
|
3
3
|
import { dirname } from 'path';
|
|
4
|
+
const DEFAULT_MAX_AGE_MS = 5 * 60 * 1000; // 5 minutes
|
|
5
|
+
/** Extracts max-age value in milliseconds from a Response's Cache-Control header. Returns undefined if not present. */ export function parseMaxAge(response) {
|
|
6
|
+
const cacheControl = response.headers.get('cache-control');
|
|
7
|
+
if (!cacheControl) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
const match = cacheControl.match(/max-age=(\d+)/);
|
|
11
|
+
if (!match) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
return parseInt(match[1], 10) * 1000;
|
|
15
|
+
}
|
|
4
16
|
/**
|
|
5
|
-
* Fetches data from a URL with file-based caching
|
|
6
|
-
*
|
|
17
|
+
* Fetches data from a URL with file-based HTTP conditional caching.
|
|
18
|
+
*
|
|
19
|
+
* Data is stored as raw JSON in the cache file (same format as the server returns).
|
|
20
|
+
* Caching metadata (ETag, expiry) is stored in a separate sidecar `.meta` file.
|
|
21
|
+
* This keeps the data file human-readable and backward-compatible with older code.
|
|
7
22
|
*
|
|
8
23
|
* @param url - The URL to fetch from
|
|
9
|
-
* @param
|
|
10
|
-
* @param
|
|
11
|
-
* @param
|
|
12
|
-
* @returns The fetched and parsed JSON data, or undefined if fetch fails
|
|
24
|
+
* @param options - Caching options
|
|
25
|
+
* @param fetch - Fetch implementation (defaults to globalThis.fetch)
|
|
26
|
+
* @param log - Logger instance
|
|
27
|
+
* @returns The fetched and parsed JSON data, or undefined if fetch fails
|
|
13
28
|
*/ export async function cachedFetch(url, options, fetch = globalThis.fetch, log = createLogger('cached_fetch')) {
|
|
14
|
-
const {
|
|
15
|
-
//
|
|
29
|
+
const { cacheFile, defaultMaxAgeMs = DEFAULT_MAX_AGE_MS } = options;
|
|
30
|
+
// If no cacheFile, just fetch normally without caching
|
|
31
|
+
if (!cacheFile) {
|
|
32
|
+
return fetchAndParse(url, fetch, log);
|
|
33
|
+
}
|
|
34
|
+
const metaFile = cacheFile + '.meta';
|
|
35
|
+
// Try to read metadata
|
|
36
|
+
let meta;
|
|
16
37
|
try {
|
|
17
|
-
|
|
18
|
-
const info = await stat(cacheFile);
|
|
19
|
-
if (info.mtimeMs + cacheDurationMs > Date.now()) {
|
|
20
|
-
const cachedData = JSON.parse(await readFile(cacheFile, 'utf-8'));
|
|
21
|
-
return cachedData;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
38
|
+
meta = JSON.parse(await readFile(metaFile, 'utf-8'));
|
|
24
39
|
} catch {
|
|
25
|
-
log.trace('
|
|
40
|
+
log.trace('No usable cache metadata found');
|
|
26
41
|
}
|
|
42
|
+
// Try to read cached data
|
|
43
|
+
let cachedData;
|
|
27
44
|
try {
|
|
28
|
-
|
|
45
|
+
cachedData = JSON.parse(await readFile(cacheFile, 'utf-8'));
|
|
46
|
+
} catch {
|
|
47
|
+
log.trace('No usable cached data found');
|
|
48
|
+
}
|
|
49
|
+
// If metadata and data exist and cache is fresh, return directly
|
|
50
|
+
if (meta && cachedData !== undefined && meta.expiresAt > Date.now()) {
|
|
51
|
+
return cachedData;
|
|
52
|
+
}
|
|
53
|
+
// Cache is stale or missing — make a (possibly conditional) request
|
|
54
|
+
try {
|
|
55
|
+
const headers = {};
|
|
56
|
+
if (meta?.etag && cachedData !== undefined) {
|
|
57
|
+
headers['If-None-Match'] = meta.etag;
|
|
58
|
+
}
|
|
59
|
+
const response = await fetch(url, {
|
|
60
|
+
headers
|
|
61
|
+
});
|
|
62
|
+
if (response.status === 304 && cachedData !== undefined) {
|
|
63
|
+
// Not modified — recompute expiry from new response headers and return cached data
|
|
64
|
+
const maxAgeMs = parseMaxAge(response) ?? defaultMaxAgeMs;
|
|
65
|
+
await writeMetaFile(metaFile, {
|
|
66
|
+
etag: meta?.etag,
|
|
67
|
+
expiresAt: Date.now() + maxAgeMs
|
|
68
|
+
}, log);
|
|
69
|
+
return cachedData;
|
|
70
|
+
}
|
|
29
71
|
if (!response.ok) {
|
|
30
72
|
log.warn(`Failed to fetch from ${url}: ${response.status} ${response.statusText}`);
|
|
31
|
-
return
|
|
73
|
+
return cachedData;
|
|
32
74
|
}
|
|
75
|
+
// 200 — parse new data and cache it
|
|
33
76
|
const data = await response.json();
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
err
|
|
45
|
-
});
|
|
46
|
-
}
|
|
77
|
+
const maxAgeMs = parseMaxAge(response) ?? defaultMaxAgeMs;
|
|
78
|
+
const etag = response.headers.get('etag') ?? undefined;
|
|
79
|
+
await ensureDir(cacheFile, log);
|
|
80
|
+
await Promise.all([
|
|
81
|
+
writeFile(cacheFile, JSON.stringify(data), 'utf-8'),
|
|
82
|
+
writeFile(metaFile, JSON.stringify({
|
|
83
|
+
etag,
|
|
84
|
+
expiresAt: Date.now() + maxAgeMs
|
|
85
|
+
}), 'utf-8')
|
|
86
|
+
]);
|
|
47
87
|
return data;
|
|
88
|
+
} catch (err) {
|
|
89
|
+
log.warn(`Failed to fetch from ${url}`, {
|
|
90
|
+
err
|
|
91
|
+
});
|
|
92
|
+
return cachedData;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function fetchAndParse(url, fetch, log) {
|
|
96
|
+
try {
|
|
97
|
+
const response = await fetch(url);
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
log.warn(`Failed to fetch from ${url}: ${response.status} ${response.statusText}`);
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
return await response.json();
|
|
48
103
|
} catch (err) {
|
|
49
104
|
log.warn(`Failed to fetch from ${url}`, {
|
|
50
105
|
err
|
|
@@ -52,3 +107,26 @@ import { dirname } from 'path';
|
|
|
52
107
|
return undefined;
|
|
53
108
|
}
|
|
54
109
|
}
|
|
110
|
+
async function ensureDir(filePath, log) {
|
|
111
|
+
try {
|
|
112
|
+
await mkdir(dirname(filePath), {
|
|
113
|
+
recursive: true
|
|
114
|
+
});
|
|
115
|
+
} catch (err) {
|
|
116
|
+
log.warn('Failed to create cache directory for: ' + filePath, {
|
|
117
|
+
err
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function writeMetaFile(metaFile, meta, log) {
|
|
122
|
+
try {
|
|
123
|
+
await mkdir(dirname(metaFile), {
|
|
124
|
+
recursive: true
|
|
125
|
+
});
|
|
126
|
+
await writeFile(metaFile, JSON.stringify(meta), 'utf-8');
|
|
127
|
+
} catch (err) {
|
|
128
|
+
log.warn('Failed to write cache metadata: ' + metaFile, {
|
|
129
|
+
err
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -11,4 +11,4 @@ import type { NetworkNames } from '@aztec/foundation/config';
|
|
|
11
11
|
* @param networkName - The network name
|
|
12
12
|
*/
|
|
13
13
|
export declare function enrichEnvironmentWithChainName(networkName: NetworkNames): void;
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5fbDJfY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2NoYWluX2wyX2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQTBCN0Q7Ozs7Ozs7Ozs7R0FVRztBQUNILHdCQUFnQiw4QkFBOEIsQ0FBQyxXQUFXLEVBQUUsWUFBWSxRQXFCdkUifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain_l2_config.d.ts","sourceRoot":"","sources":["../../src/config/chain_l2_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA0B7D;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"chain_l2_config.d.ts","sourceRoot":"","sources":["../../src/config/chain_l2_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA0B7D;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,YAAY,QAqBvE"}
|
|
@@ -34,7 +34,9 @@ function getDefaultDataDir(networkName) {
|
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
36
|
// Apply generated network config from defaults.yml
|
|
37
|
-
|
|
37
|
+
// For devnet iterations (v4-devnet-1, etc.), use the base devnet config
|
|
38
|
+
const configKey = /^v\d+-devnet-\d+$/.test(networkName) ? 'devnet' : networkName;
|
|
39
|
+
const generatedConfig = NetworkConfigs[configKey];
|
|
38
40
|
if (generatedConfig) {
|
|
39
41
|
enrichEnvironmentWithNetworkConfig(generatedConfig);
|
|
40
42
|
}
|