@aztec/cli 0.0.1-commit.f2ce05ee → 0.0.1-commit.f5a9928
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/aztec_node/block_number.js +1 -1
- package/dest/cmds/aztec_node/get_logs.d.ts +30 -4
- package/dest/cmds/aztec_node/get_logs.d.ts.map +1 -1
- package/dest/cmds/aztec_node/get_logs.js +39 -29
- package/dest/cmds/aztec_node/get_node_info.d.ts +1 -1
- package/dest/cmds/aztec_node/get_node_info.d.ts.map +1 -1
- package/dest/cmds/aztec_node/get_node_info.js +0 -2
- package/dest/cmds/aztec_node/index.d.ts +1 -1
- package/dest/cmds/aztec_node/index.d.ts.map +1 -1
- package/dest/cmds/aztec_node/index.js +13 -3
- 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 +12 -7
- package/dest/cmds/l1/deploy_l1_contracts_cmd.d.ts +1 -1
- package/dest/cmds/l1/deploy_l1_contracts_cmd.d.ts.map +1 -1
- package/dest/cmds/l1/deploy_l1_contracts_cmd.js +0 -1
- package/dest/cmds/l1/deploy_new_rollup.d.ts +1 -1
- package/dest/cmds/l1/deploy_new_rollup.d.ts.map +1 -1
- package/dest/cmds/l1/deploy_new_rollup.js +2 -4
- package/dest/cmds/l1/update_l1_validators.d.ts +1 -1
- package/dest/cmds/l1/update_l1_validators.d.ts.map +1 -1
- package/dest/cmds/l1/update_l1_validators.js +5 -6
- package/dest/cmds/validator_keys/eth_json_v3_worker.d.ts +2 -0
- package/dest/cmds/validator_keys/eth_json_v3_worker.d.ts.map +1 -0
- package/dest/cmds/validator_keys/eth_json_v3_worker.js +27 -0
- package/dest/cmds/validator_keys/index.d.ts +1 -1
- package/dest/cmds/validator_keys/index.d.ts.map +1 -1
- package/dest/cmds/validator_keys/index.js +7 -6
- package/dest/cmds/validator_keys/new.d.ts +7 -1
- package/dest/cmds/validator_keys/new.d.ts.map +1 -1
- package/dest/cmds/validator_keys/new.js +98 -12
- package/dest/cmds/validator_keys/set_funding_account.d.ts +14 -0
- package/dest/cmds/validator_keys/set_funding_account.d.ts.map +1 -0
- package/dest/cmds/validator_keys/set_funding_account.js +37 -0
- package/dest/cmds/validator_keys/shared.d.ts +15 -2
- package/dest/cmds/validator_keys/shared.d.ts.map +1 -1
- package/dest/cmds/validator_keys/shared.js +100 -23
- package/dest/cmds/validator_keys/utils.d.ts +12 -2
- package/dest/cmds/validator_keys/utils.d.ts.map +1 -1
- package/dest/cmds/validator_keys/utils.js +34 -0
- 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 +7 -2
- package/dest/config/chain_l2_config.d.ts.map +1 -1
- package/dest/config/chain_l2_config.js +17 -2
- package/dest/config/generated/networks.d.ts +81 -60
- package/dest/config/generated/networks.d.ts.map +1 -1
- package/dest/config/generated/networks.js +82 -61
- 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 +6 -2
- package/dest/utils/aztec.d.ts +1 -2
- package/dest/utils/aztec.d.ts.map +1 -1
- package/dest/utils/aztec.js +4 -5
- package/dest/utils/commands.d.ts +20 -11
- package/dest/utils/commands.d.ts.map +1 -1
- package/dest/utils/commands.js +29 -18
- package/dest/utils/inspect.d.ts +1 -1
- package/dest/utils/inspect.d.ts.map +1 -1
- package/dest/utils/inspect.js +11 -11
- package/package.json +30 -30
- package/src/cmds/aztec_node/block_number.ts +1 -1
- package/src/cmds/aztec_node/get_logs.ts +70 -38
- package/src/cmds/aztec_node/get_node_info.ts +0 -2
- package/src/cmds/aztec_node/index.ts +13 -8
- package/src/cmds/infrastructure/setup_l2_contract.ts +12 -7
- package/src/cmds/l1/deploy_l1_contracts_cmd.ts +0 -1
- package/src/cmds/l1/deploy_new_rollup.ts +1 -3
- package/src/cmds/l1/update_l1_validators.ts +5 -6
- package/src/cmds/validator_keys/eth_json_v3_worker.ts +30 -0
- package/src/cmds/validator_keys/index.ts +48 -8
- package/src/cmds/validator_keys/new.ts +129 -9
- package/src/cmds/validator_keys/set_funding_account.ts +55 -0
- package/src/cmds/validator_keys/shared.ts +123 -35
- package/src/cmds/validator_keys/utils.ts +44 -1
- package/src/config/cached_fetch.ts +119 -31
- package/src/config/chain_l2_config.ts +17 -2
- package/src/config/generated/networks.ts +80 -59
- package/src/config/network_config.ts +6 -2
- package/src/utils/aztec.ts +14 -20
- package/src/utils/commands.ts +36 -22
- package/src/utils/inspect.ts +7 -8
|
@@ -1,24 +1,48 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/aztec.js/log';
|
|
2
2
|
|
|
3
|
-
import { mkdir, readFile,
|
|
3
|
+
import { mkdir, readFile, writeFile } from 'fs/promises';
|
|
4
4
|
import { dirname } from 'path';
|
|
5
5
|
|
|
6
6
|
export interface CachedFetchOptions {
|
|
7
|
-
/**
|
|
8
|
-
cacheDurationMs: number;
|
|
9
|
-
/** The cache file */
|
|
7
|
+
/** The cache file path for storing data. If not provided, no caching is performed. */
|
|
10
8
|
cacheFile?: string;
|
|
9
|
+
/** Fallback max-age in milliseconds when server sends no Cache-Control header. Defaults to 5 minutes. */
|
|
10
|
+
defaultMaxAgeMs?: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Cache metadata stored in a sidecar .meta file alongside the data file. */
|
|
14
|
+
interface CacheMeta {
|
|
15
|
+
etag?: string;
|
|
16
|
+
expiresAt: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const DEFAULT_MAX_AGE_MS = 5 * 60 * 1000; // 5 minutes
|
|
20
|
+
|
|
21
|
+
/** Extracts max-age value in milliseconds from a Response's Cache-Control header. Returns undefined if not present. */
|
|
22
|
+
export function parseMaxAge(response: { headers: { get(name: string): string | null } }): number | undefined {
|
|
23
|
+
const cacheControl = response.headers.get('cache-control');
|
|
24
|
+
if (!cacheControl) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const match = cacheControl.match(/max-age=(\d+)/);
|
|
28
|
+
if (!match) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
return parseInt(match[1], 10) * 1000;
|
|
11
32
|
}
|
|
12
33
|
|
|
13
34
|
/**
|
|
14
|
-
* Fetches data from a URL with file-based caching
|
|
15
|
-
*
|
|
35
|
+
* Fetches data from a URL with file-based HTTP conditional caching.
|
|
36
|
+
*
|
|
37
|
+
* Data is stored as raw JSON in the cache file (same format as the server returns).
|
|
38
|
+
* Caching metadata (ETag, expiry) is stored in a separate sidecar `.meta` file.
|
|
39
|
+
* This keeps the data file human-readable and backward-compatible with older code.
|
|
16
40
|
*
|
|
17
41
|
* @param url - The URL to fetch from
|
|
18
|
-
* @param
|
|
19
|
-
* @param
|
|
20
|
-
* @param
|
|
21
|
-
* @returns The fetched and parsed JSON data, or undefined if fetch fails
|
|
42
|
+
* @param options - Caching options
|
|
43
|
+
* @param fetch - Fetch implementation (defaults to globalThis.fetch)
|
|
44
|
+
* @param log - Logger instance
|
|
45
|
+
* @returns The fetched and parsed JSON data, or undefined if fetch fails
|
|
22
46
|
*/
|
|
23
47
|
export async function cachedFetch<T = any>(
|
|
24
48
|
url: string,
|
|
@@ -26,42 +50,106 @@ export async function cachedFetch<T = any>(
|
|
|
26
50
|
fetch = globalThis.fetch,
|
|
27
51
|
log = createLogger('cached_fetch'),
|
|
28
52
|
): Promise<T | undefined> {
|
|
29
|
-
const {
|
|
53
|
+
const { cacheFile, defaultMaxAgeMs = DEFAULT_MAX_AGE_MS } = options;
|
|
54
|
+
|
|
55
|
+
// If no cacheFile, just fetch normally without caching
|
|
56
|
+
if (!cacheFile) {
|
|
57
|
+
return fetchAndParse<T>(url, fetch, log);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const metaFile = cacheFile + '.meta';
|
|
30
61
|
|
|
31
|
-
// Try to read
|
|
62
|
+
// Try to read metadata
|
|
63
|
+
let meta: CacheMeta | undefined;
|
|
32
64
|
try {
|
|
33
|
-
|
|
34
|
-
const info = await stat(cacheFile);
|
|
35
|
-
if (info.mtimeMs + cacheDurationMs > Date.now()) {
|
|
36
|
-
const cachedData = JSON.parse(await readFile(cacheFile, 'utf-8'));
|
|
37
|
-
return cachedData;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
65
|
+
meta = JSON.parse(await readFile(metaFile, 'utf-8'));
|
|
40
66
|
} catch {
|
|
41
|
-
log.trace('
|
|
67
|
+
log.trace('No usable cache metadata found');
|
|
42
68
|
}
|
|
43
69
|
|
|
70
|
+
// Try to read cached data
|
|
71
|
+
let cachedData: T | undefined;
|
|
44
72
|
try {
|
|
45
|
-
|
|
73
|
+
cachedData = JSON.parse(await readFile(cacheFile, 'utf-8'));
|
|
74
|
+
} catch {
|
|
75
|
+
log.trace('No usable cached data found');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// If metadata and data exist and cache is fresh, return directly
|
|
79
|
+
if (meta && cachedData !== undefined && meta.expiresAt > Date.now()) {
|
|
80
|
+
return cachedData;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Cache is stale or missing — make a (possibly conditional) request
|
|
84
|
+
try {
|
|
85
|
+
const headers: Record<string, string> = {};
|
|
86
|
+
if (meta?.etag && cachedData !== undefined) {
|
|
87
|
+
headers['If-None-Match'] = meta.etag;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const response = await fetch(url, { headers });
|
|
91
|
+
|
|
92
|
+
if (response.status === 304 && cachedData !== undefined) {
|
|
93
|
+
// Not modified — recompute expiry from new response headers and return cached data
|
|
94
|
+
const maxAgeMs = parseMaxAge(response) ?? defaultMaxAgeMs;
|
|
95
|
+
await writeMetaFile(metaFile, { etag: meta?.etag, expiresAt: Date.now() + maxAgeMs }, log);
|
|
96
|
+
return cachedData;
|
|
97
|
+
}
|
|
98
|
+
|
|
46
99
|
if (!response.ok) {
|
|
47
100
|
log.warn(`Failed to fetch from ${url}: ${response.status} ${response.statusText}`);
|
|
48
|
-
return
|
|
101
|
+
return cachedData;
|
|
49
102
|
}
|
|
50
103
|
|
|
51
|
-
|
|
104
|
+
// 200 — parse new data and cache it
|
|
105
|
+
const data = (await response.json()) as T;
|
|
106
|
+
const maxAgeMs = parseMaxAge(response) ?? defaultMaxAgeMs;
|
|
107
|
+
const etag = response.headers.get('etag') ?? undefined;
|
|
52
108
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
} catch (err) {
|
|
59
|
-
log.warn('Failed to cache data on disk: ' + cacheFile, { cacheFile, err });
|
|
60
|
-
}
|
|
109
|
+
await ensureDir(cacheFile, log);
|
|
110
|
+
await Promise.all([
|
|
111
|
+
writeFile(cacheFile, JSON.stringify(data), 'utf-8'),
|
|
112
|
+
writeFile(metaFile, JSON.stringify({ etag, expiresAt: Date.now() + maxAgeMs }), 'utf-8'),
|
|
113
|
+
]);
|
|
61
114
|
|
|
62
115
|
return data;
|
|
116
|
+
} catch (err) {
|
|
117
|
+
log.warn(`Failed to fetch from ${url}`, { err });
|
|
118
|
+
return cachedData;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async function fetchAndParse<T>(
|
|
123
|
+
url: string,
|
|
124
|
+
fetch: typeof globalThis.fetch,
|
|
125
|
+
log: ReturnType<typeof createLogger>,
|
|
126
|
+
): Promise<T | undefined> {
|
|
127
|
+
try {
|
|
128
|
+
const response = await fetch(url);
|
|
129
|
+
if (!response.ok) {
|
|
130
|
+
log.warn(`Failed to fetch from ${url}: ${response.status} ${response.statusText}`);
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
return (await response.json()) as T;
|
|
63
134
|
} catch (err) {
|
|
64
135
|
log.warn(`Failed to fetch from ${url}`, { err });
|
|
65
136
|
return undefined;
|
|
66
137
|
}
|
|
67
138
|
}
|
|
139
|
+
|
|
140
|
+
async function ensureDir(filePath: string, log: ReturnType<typeof createLogger>) {
|
|
141
|
+
try {
|
|
142
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
143
|
+
} catch (err) {
|
|
144
|
+
log.warn('Failed to create cache directory for: ' + filePath, { err });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function writeMetaFile(metaFile: string, meta: CacheMeta, log: ReturnType<typeof createLogger>) {
|
|
149
|
+
try {
|
|
150
|
+
await mkdir(dirname(metaFile), { recursive: true });
|
|
151
|
+
await writeFile(metaFile, JSON.stringify(meta), 'utf-8');
|
|
152
|
+
} catch (err) {
|
|
153
|
+
log.warn('Failed to write cache metadata: ' + metaFile, { err });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { NetworkNames } from '@aztec/foundation/config';
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { type ConsensusEnvVar, checkConsensusEnvOverrides } from '@aztec/stdlib/config';
|
|
2
4
|
|
|
3
5
|
import path from 'path';
|
|
4
6
|
|
|
@@ -12,6 +14,12 @@ const NetworkConfigs: Partial<Record<NetworkNames, NetworkConfigEnv>> = {
|
|
|
12
14
|
mainnet: mainnetConfig,
|
|
13
15
|
};
|
|
14
16
|
|
|
17
|
+
/** Every generated network config must define every consensus-critical env var. */
|
|
18
|
+
export type ConsensusComplete = Record<ConsensusEnvVar, string | number | boolean>;
|
|
19
|
+
({ devnetConfig, testnetConfig, mainnetConfig }) satisfies Record<string, ConsensusComplete>;
|
|
20
|
+
|
|
21
|
+
const log = createLogger('cli:chain_l2_config');
|
|
22
|
+
|
|
15
23
|
function enrichEnvironmentWithNetworkConfig(config: NetworkConfigEnv): void {
|
|
16
24
|
for (const [key, value] of Object.entries(config)) {
|
|
17
25
|
if (process.env[key] === undefined && value !== undefined) {
|
|
@@ -31,7 +39,9 @@ function getDefaultDataDir(networkName: NetworkNames): string {
|
|
|
31
39
|
* and DefaultSlasherConfig (which match the 'defaults' section of defaults.yml).
|
|
32
40
|
*
|
|
33
41
|
* For deployed networks: applies network configuration from generated defaults.yml,
|
|
34
|
-
* merging base defaults with network-specific overrides.
|
|
42
|
+
* merging base defaults with network-specific overrides. Before merging, enforces that operators have not
|
|
43
|
+
* overridden any consensus-critical env var with a value diverging from the network config (throwing unless
|
|
44
|
+
* ALLOW_OVERRIDING_NETWORK_CONFIG is set), so all nodes of a network agree on consensus-critical values.
|
|
35
45
|
*
|
|
36
46
|
* @param networkName - The network name
|
|
37
47
|
*/
|
|
@@ -45,8 +55,13 @@ export function enrichEnvironmentWithChainName(networkName: NetworkNames) {
|
|
|
45
55
|
}
|
|
46
56
|
|
|
47
57
|
// Apply generated network config from defaults.yml
|
|
48
|
-
|
|
58
|
+
// For devnet iterations (v4-devnet-1, etc.), use the base devnet config
|
|
59
|
+
const configKey = /^v\d+-devnet-\d+$/.test(networkName) ? 'devnet' : networkName;
|
|
60
|
+
const generatedConfig = NetworkConfigs[configKey];
|
|
49
61
|
if (generatedConfig) {
|
|
62
|
+
// The check is pure; this layer owns env mutation, so apply its canonical writes before enriching.
|
|
63
|
+
const canonical = checkConsensusEnvOverrides(generatedConfig, process.env, msg => log.warn(msg));
|
|
64
|
+
Object.assign(process.env, canonical);
|
|
50
65
|
enrichEnvironmentWithNetworkConfig(generatedConfig);
|
|
51
66
|
}
|
|
52
67
|
|
|
@@ -3,18 +3,16 @@
|
|
|
3
3
|
|
|
4
4
|
export const devnetConfig = {
|
|
5
5
|
ETHEREUM_SLOT_DURATION: 12,
|
|
6
|
-
AZTEC_SLOT_DURATION: 36,
|
|
7
|
-
AZTEC_TARGET_COMMITTEE_SIZE: 48,
|
|
8
6
|
AZTEC_ACTIVATION_THRESHOLD: 100000000000000000000,
|
|
9
7
|
AZTEC_EJECTION_THRESHOLD: 50000000000000000000,
|
|
10
8
|
AZTEC_LOCAL_EJECTION_THRESHOLD: 98000000000000000000,
|
|
11
9
|
AZTEC_EXIT_DELAY_SECONDS: 172800,
|
|
12
|
-
AZTEC_INBOX_LAG:
|
|
10
|
+
AZTEC_INBOX_LAG: 2,
|
|
13
11
|
AZTEC_PROOF_SUBMISSION_EPOCHS: 1,
|
|
14
12
|
AZTEC_MANA_TARGET: 100000000,
|
|
15
13
|
AZTEC_PROVING_COST_PER_MANA: 100,
|
|
16
14
|
AZTEC_INITIAL_ETH_PER_FEE_ASSET: 10000000,
|
|
17
|
-
|
|
15
|
+
AZTEC_SLASHER_ENABLED: true,
|
|
18
16
|
AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS: 4,
|
|
19
17
|
AZTEC_SLASHING_LIFETIME_IN_ROUNDS: 5,
|
|
20
18
|
AZTEC_SLASHING_OFFSET_IN_ROUNDS: 2,
|
|
@@ -24,15 +22,16 @@ export const devnetConfig = {
|
|
|
24
22
|
AZTEC_SLASH_AMOUNT_MEDIUM: 20000000000000000000,
|
|
25
23
|
AZTEC_SLASH_AMOUNT_LARGE: 50000000000000000000,
|
|
26
24
|
AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE: 300,
|
|
27
|
-
SLASH_MIN_PENALTY_PERCENTAGE: 0.5,
|
|
28
|
-
SLASH_MAX_PENALTY_PERCENTAGE: 2,
|
|
29
25
|
SLASH_OFFENSE_EXPIRATION_ROUNDS: 4,
|
|
30
|
-
SLASH_MAX_PAYLOAD_SIZE:
|
|
26
|
+
SLASH_MAX_PAYLOAD_SIZE: 80,
|
|
31
27
|
SLASH_EXECUTE_ROUNDS_LOOK_BACK: 4,
|
|
28
|
+
SLASH_DATA_WITHHOLDING_TOLERANCE_SLOTS: 3,
|
|
32
29
|
P2P_ENABLED: true,
|
|
33
30
|
BOOTSTRAP_NODES: '',
|
|
34
|
-
SEQ_MIN_TX_PER_BLOCK:
|
|
31
|
+
SEQ_MIN_TX_PER_BLOCK: 1,
|
|
35
32
|
SEQ_BUILD_CHECKPOINT_IF_EMPTY: true,
|
|
33
|
+
SEQ_BLOCK_DURATION_MS: 6000,
|
|
34
|
+
CHECKPOINT_PROPOSAL_SYNC_GRACE_SECONDS: 12,
|
|
36
35
|
DATA_STORE_MAP_SIZE_KB: 134217728,
|
|
37
36
|
ARCHIVER_STORE_MAP_SIZE_KB: 1073741824,
|
|
38
37
|
NOTE_HASH_TREE_MAP_SIZE_KB: 1073741824,
|
|
@@ -40,15 +39,21 @@ export const devnetConfig = {
|
|
|
40
39
|
PUBLIC_DATA_TREE_MAP_SIZE_KB: 1073741824,
|
|
41
40
|
PUBLIC_OTEL_INCLUDE_METRICS: 'aztec.validator,aztec.tx_collector,aztec.mempool,aztec.p2p.gossip.agg_,aztec.ivc_verifier.agg_',
|
|
42
41
|
SENTINEL_ENABLED: true,
|
|
42
|
+
OFFENSE_COLLECTION_ENABLED: true,
|
|
43
|
+
AZTEC_SLOT_DURATION: 36,
|
|
43
44
|
AZTEC_EPOCH_DURATION: 8,
|
|
44
45
|
AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: 1,
|
|
45
46
|
AZTEC_LAG_IN_EPOCHS_FOR_RANDAO: 1,
|
|
47
|
+
AZTEC_TARGET_COMMITTEE_SIZE: 1,
|
|
48
|
+
MAX_BLOCKS_PER_CHECKPOINT: 4,
|
|
46
49
|
AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS: 1,
|
|
50
|
+
AZTEC_SLASHING_QUORUM: 17,
|
|
51
|
+
AZTEC_GOVERNANCE_PROPOSER_QUORUM: 151,
|
|
47
52
|
L1_CHAIN_ID: 11155111,
|
|
48
53
|
TEST_ACCOUNTS: true,
|
|
49
54
|
SPONSORED_FPC: true,
|
|
50
55
|
TRANSACTIONS_DISABLED: false,
|
|
51
|
-
SEQ_MAX_TX_PER_BLOCK:
|
|
56
|
+
SEQ_MAX_TX_PER_BLOCK: 18,
|
|
52
57
|
PROVER_REAL_PROOFS: false,
|
|
53
58
|
PXE_PROVER_ENABLED: false,
|
|
54
59
|
SYNC_SNAPSHOTS_URLS: '',
|
|
@@ -56,22 +61,23 @@ export const devnetConfig = {
|
|
|
56
61
|
BLOB_ALLOW_EMPTY_SOURCES: false,
|
|
57
62
|
P2P_MAX_PENDING_TX_COUNT: 1000,
|
|
58
63
|
P2P_TX_POOL_DELETE_TXS_AFTER_REORG: false,
|
|
59
|
-
AUTO_UPDATE: 'none',
|
|
60
|
-
AUTO_UPDATE_URL: '',
|
|
61
64
|
PUBLIC_OTEL_OPT_OUT: true,
|
|
62
65
|
PUBLIC_OTEL_EXPORTER_OTLP_METRICS_ENDPOINT: '',
|
|
63
66
|
PUBLIC_OTEL_COLLECT_FROM: '',
|
|
64
|
-
SLASH_PRUNE_PENALTY: 10000000000000000000,
|
|
65
67
|
SLASH_DATA_WITHHOLDING_PENALTY: 10000000000000000000,
|
|
66
68
|
SLASH_INACTIVITY_TARGET_PERCENTAGE: 0.9,
|
|
67
69
|
SLASH_INACTIVITY_CONSECUTIVE_EPOCH_THRESHOLD: 1,
|
|
68
70
|
SLASH_INACTIVITY_PENALTY: 10000000000000000000,
|
|
69
71
|
SLASH_PROPOSE_INVALID_ATTESTATIONS_PENALTY: 10000000000000000000,
|
|
70
72
|
SLASH_DUPLICATE_PROPOSAL_PENALTY: 10000000000000000000,
|
|
71
|
-
|
|
73
|
+
SLASH_DUPLICATE_ATTESTATION_PENALTY: 10000000000000000000,
|
|
74
|
+
SLASH_PROPOSE_DESCENDANT_OF_CHECKPOINT_WITH_INVALID_ATTESTATIONS_PENALTY: 10000000000000000000,
|
|
75
|
+
SLASH_ATTEST_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 10000000000000000000,
|
|
72
76
|
SLASH_UNKNOWN_PENALTY: 10000000000000000000,
|
|
73
77
|
SLASH_INVALID_BLOCK_PENALTY: 10000000000000000000,
|
|
78
|
+
SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 0,
|
|
74
79
|
SLASH_GRACE_PERIOD_L2_SLOTS: 0,
|
|
80
|
+
ENABLE_AUTO_SHUTDOWN: false,
|
|
75
81
|
} as const;
|
|
76
82
|
|
|
77
83
|
export const testnetConfig = {
|
|
@@ -81,27 +87,25 @@ export const testnetConfig = {
|
|
|
81
87
|
AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: 2,
|
|
82
88
|
AZTEC_LAG_IN_EPOCHS_FOR_RANDAO: 2,
|
|
83
89
|
AZTEC_EXIT_DELAY_SECONDS: 172800,
|
|
84
|
-
AZTEC_INBOX_LAG:
|
|
90
|
+
AZTEC_INBOX_LAG: 2,
|
|
85
91
|
AZTEC_PROOF_SUBMISSION_EPOCHS: 1,
|
|
86
|
-
AZTEC_PROVING_COST_PER_MANA: 100,
|
|
87
92
|
AZTEC_INITIAL_ETH_PER_FEE_ASSET: 10000000,
|
|
88
|
-
|
|
93
|
+
AZTEC_SLASHER_ENABLED: true,
|
|
89
94
|
AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS: 4,
|
|
90
95
|
AZTEC_SLASHING_LIFETIME_IN_ROUNDS: 5,
|
|
91
96
|
AZTEC_SLASHING_OFFSET_IN_ROUNDS: 2,
|
|
92
97
|
AZTEC_SLASHING_DISABLE_DURATION: 432000,
|
|
93
|
-
AZTEC_SLASH_AMOUNT_SMALL: 10000000000000000000,
|
|
94
|
-
AZTEC_SLASH_AMOUNT_MEDIUM: 20000000000000000000,
|
|
95
|
-
AZTEC_SLASH_AMOUNT_LARGE: 50000000000000000000,
|
|
96
|
-
SLASH_MIN_PENALTY_PERCENTAGE: 0.5,
|
|
97
|
-
SLASH_MAX_PENALTY_PERCENTAGE: 2,
|
|
98
98
|
SLASH_OFFENSE_EXPIRATION_ROUNDS: 4,
|
|
99
|
-
SLASH_MAX_PAYLOAD_SIZE:
|
|
99
|
+
SLASH_MAX_PAYLOAD_SIZE: 80,
|
|
100
100
|
SLASH_EXECUTE_ROUNDS_LOOK_BACK: 4,
|
|
101
|
+
SLASH_DATA_WITHHOLDING_TOLERANCE_SLOTS: 3,
|
|
101
102
|
P2P_ENABLED: true,
|
|
102
103
|
BOOTSTRAP_NODES: '',
|
|
103
|
-
SEQ_MIN_TX_PER_BLOCK:
|
|
104
|
+
SEQ_MIN_TX_PER_BLOCK: 1,
|
|
104
105
|
SEQ_BUILD_CHECKPOINT_IF_EMPTY: true,
|
|
106
|
+
SEQ_BLOCK_DURATION_MS: 6000,
|
|
107
|
+
MAX_BLOCKS_PER_CHECKPOINT: 10,
|
|
108
|
+
CHECKPOINT_PROPOSAL_SYNC_GRACE_SECONDS: 12,
|
|
105
109
|
DATA_STORE_MAP_SIZE_KB: 134217728,
|
|
106
110
|
ARCHIVER_STORE_MAP_SIZE_KB: 1073741824,
|
|
107
111
|
NOTE_HASH_TREE_MAP_SIZE_KB: 1073741824,
|
|
@@ -109,6 +113,7 @@ export const testnetConfig = {
|
|
|
109
113
|
PUBLIC_DATA_TREE_MAP_SIZE_KB: 1073741824,
|
|
110
114
|
PUBLIC_OTEL_INCLUDE_METRICS: 'aztec.validator,aztec.tx_collector,aztec.mempool,aztec.p2p.gossip.agg_,aztec.ivc_verifier.agg_',
|
|
111
115
|
SENTINEL_ENABLED: true,
|
|
116
|
+
OFFENSE_COLLECTION_ENABLED: true,
|
|
112
117
|
AZTEC_SLOT_DURATION: 72,
|
|
113
118
|
AZTEC_ACTIVATION_THRESHOLD: 2E+23,
|
|
114
119
|
AZTEC_EJECTION_THRESHOLD: 1E+23,
|
|
@@ -118,47 +123,58 @@ export const testnetConfig = {
|
|
|
118
123
|
AZTEC_SLASHING_QUORUM: 33,
|
|
119
124
|
AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE: 100,
|
|
120
125
|
AZTEC_GOVERNANCE_PROPOSER_QUORUM: 60,
|
|
121
|
-
AZTEC_MANA_TARGET:
|
|
126
|
+
AZTEC_MANA_TARGET: 75000000,
|
|
127
|
+
AZTEC_PROVING_COST_PER_MANA: 12500000,
|
|
128
|
+
AZTEC_SLASH_AMOUNT_SMALL: 1E+23,
|
|
129
|
+
AZTEC_SLASH_AMOUNT_MEDIUM: 2.5E+23,
|
|
130
|
+
AZTEC_SLASH_AMOUNT_LARGE: 2.5E+23,
|
|
122
131
|
L1_CHAIN_ID: 11155111,
|
|
123
132
|
TEST_ACCOUNTS: false,
|
|
124
|
-
SPONSORED_FPC:
|
|
133
|
+
SPONSORED_FPC: false,
|
|
125
134
|
TRANSACTIONS_DISABLED: false,
|
|
126
|
-
|
|
135
|
+
SEQ_MAX_TX_PER_CHECKPOINT: 72,
|
|
127
136
|
PROVER_REAL_PROOFS: true,
|
|
137
|
+
P2P_MAX_PENDING_TX_COUNT: 1000,
|
|
128
138
|
P2P_TX_POOL_DELETE_TXS_AFTER_REORG: true,
|
|
129
|
-
|
|
130
|
-
SLASH_DATA_WITHHOLDING_PENALTY: 10000000000000000000,
|
|
139
|
+
SLASH_DATA_WITHHOLDING_PENALTY: 0,
|
|
131
140
|
SLASH_INACTIVITY_TARGET_PERCENTAGE: 0.9,
|
|
132
141
|
SLASH_INACTIVITY_CONSECUTIVE_EPOCH_THRESHOLD: 1,
|
|
133
|
-
SLASH_INACTIVITY_PENALTY:
|
|
134
|
-
SLASH_PROPOSE_INVALID_ATTESTATIONS_PENALTY:
|
|
135
|
-
SLASH_DUPLICATE_PROPOSAL_PENALTY:
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
142
|
+
SLASH_INACTIVITY_PENALTY: 1E+23,
|
|
143
|
+
SLASH_PROPOSE_INVALID_ATTESTATIONS_PENALTY: 1E+23,
|
|
144
|
+
SLASH_DUPLICATE_PROPOSAL_PENALTY: 2.5E+23,
|
|
145
|
+
SLASH_DUPLICATE_ATTESTATION_PENALTY: 2.5E+23,
|
|
146
|
+
SLASH_PROPOSE_DESCENDANT_OF_CHECKPOINT_WITH_INVALID_ATTESTATIONS_PENALTY: 0,
|
|
147
|
+
SLASH_ATTEST_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 0,
|
|
148
|
+
SLASH_UNKNOWN_PENALTY: 1E+23,
|
|
149
|
+
SLASH_INVALID_BLOCK_PENALTY: 1E+23,
|
|
150
|
+
SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 1E+23,
|
|
139
151
|
SLASH_GRACE_PERIOD_L2_SLOTS: 64,
|
|
152
|
+
ENABLE_AUTO_SHUTDOWN: false,
|
|
140
153
|
} as const;
|
|
141
154
|
|
|
142
155
|
export const mainnetConfig = {
|
|
143
156
|
ETHEREUM_SLOT_DURATION: 12,
|
|
144
157
|
AZTEC_EPOCH_DURATION: 32,
|
|
158
|
+
AZTEC_TARGET_COMMITTEE_SIZE: 48,
|
|
145
159
|
AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: 2,
|
|
146
160
|
AZTEC_LAG_IN_EPOCHS_FOR_RANDAO: 2,
|
|
147
|
-
AZTEC_INBOX_LAG:
|
|
161
|
+
AZTEC_INBOX_LAG: 2,
|
|
148
162
|
AZTEC_PROOF_SUBMISSION_EPOCHS: 1,
|
|
149
163
|
AZTEC_INITIAL_ETH_PER_FEE_ASSET: 10000000,
|
|
150
|
-
|
|
164
|
+
AZTEC_SLASHER_ENABLED: true,
|
|
151
165
|
AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS: 4,
|
|
152
166
|
AZTEC_SLASHING_OFFSET_IN_ROUNDS: 2,
|
|
153
|
-
SLASH_MIN_PENALTY_PERCENTAGE: 0.5,
|
|
154
|
-
SLASH_MAX_PENALTY_PERCENTAGE: 2,
|
|
155
167
|
SLASH_OFFENSE_EXPIRATION_ROUNDS: 4,
|
|
156
|
-
SLASH_MAX_PAYLOAD_SIZE:
|
|
168
|
+
SLASH_MAX_PAYLOAD_SIZE: 80,
|
|
157
169
|
SLASH_EXECUTE_ROUNDS_LOOK_BACK: 4,
|
|
170
|
+
SLASH_DATA_WITHHOLDING_TOLERANCE_SLOTS: 3,
|
|
158
171
|
P2P_ENABLED: true,
|
|
159
172
|
BOOTSTRAP_NODES: '',
|
|
160
|
-
SEQ_MIN_TX_PER_BLOCK:
|
|
173
|
+
SEQ_MIN_TX_PER_BLOCK: 1,
|
|
161
174
|
SEQ_BUILD_CHECKPOINT_IF_EMPTY: true,
|
|
175
|
+
SEQ_BLOCK_DURATION_MS: 6000,
|
|
176
|
+
MAX_BLOCKS_PER_CHECKPOINT: 10,
|
|
177
|
+
CHECKPOINT_PROPOSAL_SYNC_GRACE_SECONDS: 12,
|
|
162
178
|
DATA_STORE_MAP_SIZE_KB: 134217728,
|
|
163
179
|
ARCHIVER_STORE_MAP_SIZE_KB: 1073741824,
|
|
164
180
|
NOTE_HASH_TREE_MAP_SIZE_KB: 1073741824,
|
|
@@ -166,48 +182,53 @@ export const mainnetConfig = {
|
|
|
166
182
|
PUBLIC_DATA_TREE_MAP_SIZE_KB: 1073741824,
|
|
167
183
|
PUBLIC_OTEL_INCLUDE_METRICS: 'aztec.validator,aztec.tx_collector,aztec.mempool,aztec.p2p.gossip.agg_,aztec.ivc_verifier.agg_',
|
|
168
184
|
SENTINEL_ENABLED: true,
|
|
185
|
+
OFFENSE_COLLECTION_ENABLED: true,
|
|
169
186
|
AZTEC_SLOT_DURATION: 72,
|
|
170
|
-
AZTEC_TARGET_COMMITTEE_SIZE: 24,
|
|
171
187
|
AZTEC_ACTIVATION_THRESHOLD: 2E+23,
|
|
172
188
|
AZTEC_EJECTION_THRESHOLD: 1E+23,
|
|
173
|
-
AZTEC_LOCAL_EJECTION_THRESHOLD: 1.
|
|
189
|
+
AZTEC_LOCAL_EJECTION_THRESHOLD: 1.9E+23,
|
|
174
190
|
AZTEC_SLASH_AMOUNT_SMALL: 2E+21,
|
|
175
|
-
AZTEC_SLASH_AMOUNT_MEDIUM:
|
|
176
|
-
AZTEC_SLASH_AMOUNT_LARGE:
|
|
191
|
+
AZTEC_SLASH_AMOUNT_MEDIUM: 5E+21,
|
|
192
|
+
AZTEC_SLASH_AMOUNT_LARGE: 5E+21,
|
|
177
193
|
AZTEC_SLASHING_LIFETIME_IN_ROUNDS: 34,
|
|
178
194
|
AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS: 28,
|
|
179
195
|
AZTEC_SLASHING_VETOER: '0xBbB4aF368d02827945748b28CD4b2D42e4A37480',
|
|
180
196
|
AZTEC_SLASHING_QUORUM: 65,
|
|
181
197
|
AZTEC_GOVERNANCE_PROPOSER_QUORUM: 600,
|
|
182
198
|
AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE: 1000,
|
|
183
|
-
AZTEC_MANA_TARGET:
|
|
184
|
-
AZTEC_PROVING_COST_PER_MANA:
|
|
199
|
+
AZTEC_MANA_TARGET: 75000000,
|
|
200
|
+
AZTEC_PROVING_COST_PER_MANA: 12500000,
|
|
185
201
|
AZTEC_EXIT_DELAY_SECONDS: 345600,
|
|
186
202
|
AZTEC_SLASHING_DISABLE_DURATION: 259200,
|
|
203
|
+
AZTEC_ENTRY_QUEUE_BOOTSTRAP_VALIDATOR_SET_SIZE: 500,
|
|
204
|
+
AZTEC_ENTRY_QUEUE_BOOTSTRAP_FLUSH_SIZE: 500,
|
|
205
|
+
AZTEC_ENTRY_QUEUE_FLUSH_SIZE_MIN: 1,
|
|
206
|
+
AZTEC_ENTRY_QUEUE_FLUSH_SIZE_QUOTIENT: 400,
|
|
207
|
+
AZTEC_ENTRY_QUEUE_MAX_FLUSH_SIZE: 4,
|
|
187
208
|
L1_CHAIN_ID: 1,
|
|
188
209
|
TEST_ACCOUNTS: false,
|
|
189
210
|
SPONSORED_FPC: false,
|
|
190
|
-
TRANSACTIONS_DISABLED:
|
|
191
|
-
|
|
211
|
+
TRANSACTIONS_DISABLED: false,
|
|
212
|
+
SEQ_MAX_TX_PER_CHECKPOINT: 72,
|
|
192
213
|
PROVER_REAL_PROOFS: true,
|
|
193
|
-
SYNC_SNAPSHOTS_URLS: 'https://aztec-labs-snapshots.com/mainnet/',
|
|
194
214
|
BLOB_ALLOW_EMPTY_SOURCES: true,
|
|
195
|
-
P2P_MAX_PENDING_TX_COUNT:
|
|
215
|
+
P2P_MAX_PENDING_TX_COUNT: 1000,
|
|
196
216
|
P2P_TX_POOL_DELETE_TXS_AFTER_REORG: true,
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
PUBLIC_OTEL_COLLECT_FROM: 'sequencer',
|
|
201
|
-
SLASH_PRUNE_PENALTY: 0,
|
|
217
|
+
PUBLIC_OTEL_EXPORTER_OTLP_METRICS_ENDPOINT: '',
|
|
218
|
+
PUBLIC_OTEL_COLLECT_FROM: '',
|
|
219
|
+
ENABLE_AUTO_SHUTDOWN: false,
|
|
202
220
|
SLASH_DATA_WITHHOLDING_PENALTY: 0,
|
|
203
|
-
SLASH_INACTIVITY_TARGET_PERCENTAGE: 0.
|
|
221
|
+
SLASH_INACTIVITY_TARGET_PERCENTAGE: 0.7,
|
|
204
222
|
SLASH_INACTIVITY_CONSECUTIVE_EPOCH_THRESHOLD: 2,
|
|
205
223
|
SLASH_INACTIVITY_PENALTY: 2E+21,
|
|
206
224
|
SLASH_PROPOSE_INVALID_ATTESTATIONS_PENALTY: 2E+21,
|
|
207
|
-
SLASH_DUPLICATE_PROPOSAL_PENALTY:
|
|
208
|
-
|
|
225
|
+
SLASH_DUPLICATE_PROPOSAL_PENALTY: 5E+21,
|
|
226
|
+
SLASH_DUPLICATE_ATTESTATION_PENALTY: 5E+21,
|
|
227
|
+
SLASH_PROPOSE_DESCENDANT_OF_CHECKPOINT_WITH_INVALID_ATTESTATIONS_PENALTY: 0,
|
|
228
|
+
SLASH_ATTEST_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 0,
|
|
209
229
|
SLASH_UNKNOWN_PENALTY: 2E+21,
|
|
210
230
|
SLASH_INVALID_BLOCK_PENALTY: 2E+21,
|
|
211
|
-
|
|
231
|
+
SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 2E+21,
|
|
232
|
+
SLASH_GRACE_PERIOD_L2_SLOTS: 8400,
|
|
212
233
|
} as const;
|
|
213
234
|
|
|
@@ -9,7 +9,6 @@ import { enrichEthAddressVar, enrichVar } from './enrich_env.js';
|
|
|
9
9
|
const DEFAULT_CONFIG_URL =
|
|
10
10
|
'https://raw.githubusercontent.com/AztecProtocol/networks/refs/heads/main/network_config.json';
|
|
11
11
|
const FALLBACK_CONFIG_URL = 'https://metadata.aztec.network/network_config.json';
|
|
12
|
-
const NETWORK_CONFIG_CACHE_DURATION_MS = 60 * 60 * 1000; // 1 hour
|
|
13
12
|
|
|
14
13
|
/**
|
|
15
14
|
* Fetches remote network configuration from GitHub with caching support.
|
|
@@ -87,7 +86,6 @@ async function fetchNetworkConfigFromUrl(
|
|
|
87
86
|
|
|
88
87
|
if (url.protocol === 'http:' || url.protocol === 'https:') {
|
|
89
88
|
rawConfig = await cachedFetch(url.href, {
|
|
90
|
-
cacheDurationMs: NETWORK_CONFIG_CACHE_DURATION_MS,
|
|
91
89
|
cacheFile: cacheDir ? join(cacheDir, networkName, 'network_config.json') : undefined,
|
|
92
90
|
});
|
|
93
91
|
} else if (url.protocol === 'file:') {
|
|
@@ -141,7 +139,13 @@ export async function enrichEnvironmentWithNetworkConfig(networkName: NetworkNam
|
|
|
141
139
|
if (networkConfig.blobFileStoreUrls?.length) {
|
|
142
140
|
enrichVar('BLOB_FILE_STORE_URLS', networkConfig.blobFileStoreUrls.join(','));
|
|
143
141
|
}
|
|
142
|
+
if (networkConfig.txCollectionFileStoreUrls?.length) {
|
|
143
|
+
enrichVar('TX_COLLECTION_FILE_STORE_URLS', networkConfig.txCollectionFileStoreUrls.join(','));
|
|
144
|
+
}
|
|
144
145
|
if (networkConfig.blockDurationMs !== undefined) {
|
|
145
146
|
enrichVar('SEQ_BLOCK_DURATION_MS', String(networkConfig.blockDurationMs));
|
|
146
147
|
}
|
|
148
|
+
if (networkConfig.txPublicSetupAllowListExtend) {
|
|
149
|
+
enrichVar('TX_PUBLIC_SETUP_ALLOWLIST', networkConfig.txPublicSetupAllowListExtend);
|
|
150
|
+
}
|
|
147
151
|
}
|
package/src/utils/aztec.ts
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
type FunctionAbi,
|
|
4
4
|
FunctionType,
|
|
5
5
|
getAllFunctionAbis,
|
|
6
|
-
|
|
6
|
+
loadContractArtifactWithValidation,
|
|
7
7
|
} from '@aztec/aztec.js/abi';
|
|
8
8
|
import { EthAddress } from '@aztec/aztec.js/addresses';
|
|
9
9
|
import type { L1ContractsConfig } from '@aztec/ethereum/config';
|
|
@@ -49,7 +49,7 @@ export async function deployNewRollupContracts(
|
|
|
49
49
|
feeJuicePortalInitialBalance: bigint,
|
|
50
50
|
config: L1ContractsConfig,
|
|
51
51
|
realVerifier: boolean,
|
|
52
|
-
): Promise<{ rollup: RollupContract
|
|
52
|
+
): Promise<{ rollup: RollupContract }> {
|
|
53
53
|
const { deployRollupForUpgrade } = await import('@aztec/ethereum/deploy-aztec-l1-contracts');
|
|
54
54
|
const { mnemonicToAccount, privateKeyToAccount } = await import('viem/accounts');
|
|
55
55
|
const { getVKTreeRoot } = await import('@aztec/noir-protocol-circuits-types/vk-tree');
|
|
@@ -80,23 +80,17 @@ export async function deployNewRollupContracts(
|
|
|
80
80
|
logger.info('Initializing new rollup with old attesters', { initialValidators });
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
const { rollup
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
realVerifier,
|
|
95
|
-
...config,
|
|
96
|
-
},
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
return { rollup, slashFactoryAddress: EthAddress.fromString(slashFactoryAddress!) };
|
|
83
|
+
const { rollup } = await deployRollupForUpgrade(privateKey as Hex, rpcUrls[0], chainId, registryAddress, {
|
|
84
|
+
vkTreeRoot: getVKTreeRoot(),
|
|
85
|
+
protocolContractsHash,
|
|
86
|
+
genesisArchiveRoot,
|
|
87
|
+
initialValidators,
|
|
88
|
+
feeJuicePortalInitialBalance,
|
|
89
|
+
realVerifier,
|
|
90
|
+
...config,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
return { rollup };
|
|
100
94
|
}
|
|
101
95
|
|
|
102
96
|
/**
|
|
@@ -138,7 +132,7 @@ export async function getContractArtifact(fileDir: string, log: LogFn) {
|
|
|
138
132
|
}
|
|
139
133
|
|
|
140
134
|
try {
|
|
141
|
-
return
|
|
135
|
+
return loadContractArtifactWithValidation(JSON.parse(contents));
|
|
142
136
|
} catch (err) {
|
|
143
137
|
log('Invalid file used. Please try again.');
|
|
144
138
|
throw err;
|