@aztec/ethereum 5.0.0 → 5.0.1
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/deploy_aztec_l1_contracts.d.ts +1 -1
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
- package/dest/deploy_aztec_l1_contracts.js +11 -4
- package/dest/foundry_binary.d.ts +13 -0
- package/dest/foundry_binary.d.ts.map +1 -0
- package/dest/foundry_binary.js +52 -0
- package/dest/test/start_anvil.d.ts +1 -1
- package/dest/test/start_anvil.d.ts.map +1 -1
- package/dest/test/start_anvil.js +41 -5
- package/package.json +5 -5
- package/src/deploy_aztec_l1_contracts.ts +16 -4
- package/src/foundry_binary.ts +57 -0
- package/src/test/start_anvil.ts +38 -6
|
@@ -253,4 +253,4 @@ export declare function getDeployRollupForUpgradeEnvVars(args: Omit<DeployAztecL
|
|
|
253
253
|
export declare const deployRollupForUpgrade: (privateKey: `0x${string}`, rpcUrl: string, chainId: number, registryAddress: EthAddress, args: Omit<DeployAztecL1ContractsArgs, "activationThreshold" | "ejectionThreshold" | "governanceProposerQuorum" | "governanceProposerRoundSize" | "zkPassportArgs">) => Promise<{
|
|
254
254
|
rollup: RollupContract;
|
|
255
255
|
}>;
|
|
256
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95X2F6dGVjX2wxX2NvbnRyYWN0cy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RlcGxveV9henRlY19sMV9jb250cmFjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBd0IsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJM0QsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJcEQsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQU0zQyxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLaEMsT0FBTyxFQUFFLEtBQUssaUJBQWlCLEVBQTRCLE1BQU0sYUFBYSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sS0FBSyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBb0YzRCxNQUFNLFdBQVcsV0FBVztJQUMxQixFQUFFLEVBQUUsTUFBTSxDQUFDO0lBQ1gsRUFBRSxFQUFFLE1BQU0sQ0FBQztJQUNYLEVBQUUsRUFBRSxNQUFNLENBQUM7SUFDWCxFQUFFLEVBQUUsTUFBTSxDQUFDO0NBQ1o7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFdBQVcsYUFBYTtJQUM1QixRQUFRLEVBQUUsTUFBTSxDQUFDO0lBQ2pCLFVBQVUsRUFBRSxNQUFNLENBQUM7SUFDbkIscUNBQXFDO0lBQ3JDLFVBQVUsRUFBRSxNQUFNLENBQUM7SUFDbkIsa0VBQWtFO0lBQ2xFLGFBQWEsRUFBRSxXQUFXLENBQUM7Q0FDNUI7QUFFRDs7OztHQUlHO0FBQ0gsd0JBQWdCLGtCQUFrQixJQUFJ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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy_aztec_l1_contracts.d.ts","sourceRoot":"","sources":["../src/deploy_aztec_l1_contracts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAwB,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAI3D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AAIpD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAM3C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAKhC,OAAO,EAAE,KAAK,iBAAiB,EAA4B,MAAM,aAAa,CAAC;AAE/E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"deploy_aztec_l1_contracts.d.ts","sourceRoot":"","sources":["../src/deploy_aztec_l1_contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ import { createExtendedL1Client } from './client.js';
|
|
|
17
17
|
import { assertValidSlotDurations } from './config.js';
|
|
18
18
|
import { deployMulticall3 } from './contracts/multicall.js';
|
|
19
19
|
import { RollupContract } from './contracts/rollup.js';
|
|
20
|
+
import { resolveFoundryBinary } from './foundry_binary.js';
|
|
20
21
|
const logger = createLogger('ethereum:deploy_aztec_l1_contracts');
|
|
21
22
|
const JSON_DEPLOY_RESULT_PREFIX = 'JSON DEPLOY RESULT:';
|
|
22
23
|
/**
|
|
@@ -82,11 +83,11 @@ const JSON_DEPLOY_RESULT_PREFIX = 'JSON DEPLOY RESULT:';
|
|
|
82
83
|
}
|
|
83
84
|
// Covers an edge where where we may have a cached BlobLib that is not meant for production.
|
|
84
85
|
// Despite the profile apparently sometimes cached code remains (so says Lasse after his ignition-monorepo arc).
|
|
85
|
-
async function maybeForgeForceProductionBuild(l1ContractsPath, script, chainId) {
|
|
86
|
+
async function maybeForgeForceProductionBuild(forgeBin, l1ContractsPath, script, chainId) {
|
|
86
87
|
if (chainId === mainnet.id) {
|
|
87
88
|
logger.info(`Recompiling ${script} with production profile for mainnet deployment`);
|
|
88
89
|
logger.info('This may take a minute but ensures production BlobLib is used.');
|
|
89
|
-
await runProcess(
|
|
90
|
+
await runProcess(forgeBin, [
|
|
90
91
|
'build',
|
|
91
92
|
script,
|
|
92
93
|
'--force'
|
|
@@ -237,8 +238,9 @@ function cleanupDeployDir() {
|
|
|
237
238
|
}
|
|
238
239
|
// Use foundry-artifacts from l1-artifacts package
|
|
239
240
|
const l1ContractsPath = prepareL1ContractsForDeployment();
|
|
241
|
+
const forgeBin = resolveFoundryBinary('forge');
|
|
240
242
|
const FORGE_SCRIPT = 'script/deploy/DeployAztecL1Contracts.s.sol';
|
|
241
|
-
await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId);
|
|
243
|
+
await maybeForgeForceProductionBuild(forgeBin, l1ContractsPath, FORGE_SCRIPT, chainId);
|
|
242
244
|
// Verify contracts on Etherscan when on mainnet/sepolia and ETHERSCAN_API_KEY is available.
|
|
243
245
|
const isVerifiableChain = chainId === mainnet.id || chainId === sepolia.id;
|
|
244
246
|
const shouldVerify = isVerifiableChain && !!process.env.ETHERSCAN_API_KEY;
|
|
@@ -259,6 +261,8 @@ function cleanupDeployDir() {
|
|
|
259
261
|
] : []
|
|
260
262
|
];
|
|
261
263
|
const forgeEnv = {
|
|
264
|
+
// Resolved forge binary picked up by forge_broadcast.js, so it works without forge on PATH.
|
|
265
|
+
FORGE_BIN: forgeBin,
|
|
262
266
|
// Env vars required by l1-contracts/script/deploy/DeploymentConfiguration.sol.
|
|
263
267
|
NETWORK: getActiveNetworkName(),
|
|
264
268
|
FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
|
|
@@ -376,8 +380,9 @@ export function getDeployRollupForUpgradeEnvVars(args) {
|
|
|
376
380
|
*/ export const deployRollupForUpgrade = async (privateKey, rpcUrl, chainId, registryAddress, args)=>{
|
|
377
381
|
// Use foundry-artifacts from l1-artifacts package
|
|
378
382
|
const l1ContractsPath = prepareL1ContractsForDeployment();
|
|
383
|
+
const forgeBin = resolveFoundryBinary('forge');
|
|
379
384
|
const FORGE_SCRIPT = 'script/deploy/DeployRollupForUpgrade.s.sol';
|
|
380
|
-
await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId);
|
|
385
|
+
await maybeForgeForceProductionBuild(forgeBin, l1ContractsPath, FORGE_SCRIPT, chainId);
|
|
381
386
|
const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js');
|
|
382
387
|
const forgeArgs = [
|
|
383
388
|
FORGE_SCRIPT,
|
|
@@ -389,6 +394,8 @@ export function getDeployRollupForUpgradeEnvVars(args) {
|
|
|
389
394
|
rpcUrl
|
|
390
395
|
];
|
|
391
396
|
const forgeEnv = {
|
|
397
|
+
// Resolved forge binary picked up by forge_broadcast.js, so it works without forge on PATH.
|
|
398
|
+
FORGE_BIN: forgeBin,
|
|
392
399
|
FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
|
|
393
400
|
// Env vars required by l1-contracts/script/deploy/RollupConfiguration.sol.
|
|
394
401
|
REGISTRY_ADDRESS: registryAddress.toString(),
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locate a Foundry binary (`anvil`, `forge`, ...) without relying on the caller's PATH. Order:
|
|
3
|
+
* 1. `$<NAME>_BIN` (e.g. `$ANVIL_BIN`, `$FORGE_BIN`) — explicit override, e.g. for CI with a pinned
|
|
4
|
+
* version. Throws if set but not pointing at an executable, instead of silently falling back.
|
|
5
|
+
* 2. `~/.aztec/current/internal-bin/<name>` — where aztec-up installs it.
|
|
6
|
+
* 3. `~/.aztec/current/bin/aztec-<name>` — the publicly-exposed symlink.
|
|
7
|
+
* 4. `~/.foundry/bin/<name>` — standalone foundryup install.
|
|
8
|
+
* 5. `command -v <name>` — anything else on PATH.
|
|
9
|
+
*
|
|
10
|
+
* Throws with a directive message if none work.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveFoundryBinary(name: string): string;
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm91bmRyeV9iaW5hcnkuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mb3VuZHJ5X2JpbmFyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFjQTs7Ozs7Ozs7OztHQVVHO0FBQ0gsd0JBQWdCLG9CQUFvQixDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsTUFBTSxDQStCekQifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foundry_binary.d.ts","sourceRoot":"","sources":["../src/foundry_binary.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA+BzD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { spawnSync } from 'child_process';
|
|
2
|
+
import { accessSync, constants } from 'fs';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
function isExecutable(path) {
|
|
6
|
+
try {
|
|
7
|
+
accessSync(path, constants.X_OK);
|
|
8
|
+
return true;
|
|
9
|
+
} catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Locate a Foundry binary (`anvil`, `forge`, ...) without relying on the caller's PATH. Order:
|
|
15
|
+
* 1. `$<NAME>_BIN` (e.g. `$ANVIL_BIN`, `$FORGE_BIN`) — explicit override, e.g. for CI with a pinned
|
|
16
|
+
* version. Throws if set but not pointing at an executable, instead of silently falling back.
|
|
17
|
+
* 2. `~/.aztec/current/internal-bin/<name>` — where aztec-up installs it.
|
|
18
|
+
* 3. `~/.aztec/current/bin/aztec-<name>` — the publicly-exposed symlink.
|
|
19
|
+
* 4. `~/.foundry/bin/<name>` — standalone foundryup install.
|
|
20
|
+
* 5. `command -v <name>` — anything else on PATH.
|
|
21
|
+
*
|
|
22
|
+
* Throws with a directive message if none work.
|
|
23
|
+
*/ export function resolveFoundryBinary(name) {
|
|
24
|
+
const envVar = `${name.toUpperCase()}_BIN`;
|
|
25
|
+
const envBin = process.env[envVar];
|
|
26
|
+
if (envBin) {
|
|
27
|
+
if (!isExecutable(envBin)) {
|
|
28
|
+
throw new Error(`$${envVar} is set to ${envBin}, which does not exist or is not executable.`);
|
|
29
|
+
}
|
|
30
|
+
return envBin;
|
|
31
|
+
}
|
|
32
|
+
const candidates = [
|
|
33
|
+
join(homedir(), '.aztec', 'current', 'internal-bin', name),
|
|
34
|
+
join(homedir(), '.aztec', 'current', 'bin', `aztec-${name}`),
|
|
35
|
+
join(homedir(), '.foundry', 'bin', name)
|
|
36
|
+
];
|
|
37
|
+
for (const path of candidates){
|
|
38
|
+
if (isExecutable(path)) {
|
|
39
|
+
return path;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const which = spawnSync('sh', [
|
|
43
|
+
'-c',
|
|
44
|
+
`command -v ${name}`
|
|
45
|
+
], {
|
|
46
|
+
encoding: 'utf8'
|
|
47
|
+
});
|
|
48
|
+
if (which.status === 0 && which.stdout.trim()) {
|
|
49
|
+
return which.stdout.trim();
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`${name} binary not found. Tried $${envVar}, ~/.aztec/current/internal-bin/${name}, ` + `~/.aztec/current/bin/aztec-${name}, ~/.foundry/bin/${name}, and $PATH. ` + `Install via \`aztec-up\` or set ${envVar} to a working binary.`);
|
|
52
|
+
}
|
|
@@ -37,4 +37,4 @@ export declare function startAnvil(opts?: {
|
|
|
37
37
|
rpcUrl: string;
|
|
38
38
|
stop: () => Promise<void>;
|
|
39
39
|
}>;
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRfYW52aWwuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3N0YXJ0X2FudmlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFNaEUsOEVBQThFO0FBQzlFLE1BQU0sV0FBVyxLQUFLO0lBQ3BCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLE1BQU0sQ0FBQztJQUN0QyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3ZCO0FBMEJEOztHQUVHO0FBQ0gsd0JBQXNCLFVBQVUsQ0FDOUIsSUFBSSxHQUFFO0lBQ0osSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2QsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUNkLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQzdCLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNsQixPQUFPLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDakIscURBQXFEO0lBQ3JELFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNsQjs7Ozs7T0FLRztJQUNILGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUN4Qjs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLEVBQUUsZ0JBQWdCLENBQUM7Q0FDNUIsR0FDTCxPQUFPLENBQUM7SUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0lBQUMsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQUMsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0NBQUUsQ0FBQyxDQW9JOUYifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start_anvil.d.ts","sourceRoot":"","sources":["../../src/test/start_anvil.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMhE,8EAA8E;AAC9E,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC;IACtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"start_anvil.d.ts","sourceRoot":"","sources":["../../src/test/start_anvil.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMhE,8EAA8E;AAC9E,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC;IACtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AA0BD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,IAAI,GAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,gBAAgB,CAAC;CAC5B,GACL,OAAO,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAoI9F"}
|
package/dest/test/start_anvil.js
CHANGED
|
@@ -1,16 +1,41 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
3
|
-
import { fileURLToPath } from '@aztec/foundation/url';
|
|
4
3
|
import { spawn } from 'child_process';
|
|
5
|
-
import {
|
|
4
|
+
import { resolveFoundryBinary } from '../foundry_binary.js';
|
|
5
|
+
// Watchdog wrapper: instead of spawning anvil directly, we spawn a small bash supervisor that runs
|
|
6
|
+
// anvil as a background child and polls its own parent (this node process). If the parent dies for
|
|
7
|
+
// ANY reason — including SIGKILL / crash / OOM, where node's own exit handlers never run — the poll
|
|
8
|
+
// loop ends and the EXIT trap reaps anvil. The script is inlined (rather than shipped as a `.sh`) so
|
|
9
|
+
// it works from the published npm tarball too, and the resolved anvil binary is passed via
|
|
10
|
+
// `$ANVIL_BIN` so it works without `anvil` on PATH.
|
|
11
|
+
//
|
|
12
|
+
// `$@` is the anvil argv; `bash -c <script> bash <...args>` puts the args in `$@` and `$0` = 'bash'.
|
|
13
|
+
//
|
|
14
|
+
// The EXIT trap reaps anvil; INT/TERM just `exit` (which fires the EXIT trap) so a signal terminates
|
|
15
|
+
// the supervisor promptly instead of being swallowed — a trapped TERM does NOT terminate the shell,
|
|
16
|
+
// so trapping the kill directly on TERM would leave the poll loop running and the caller's teardown
|
|
17
|
+
// hanging until its SIGKILL escalation. `sleep & wait` makes the poll interruptible, so INT/TERM are
|
|
18
|
+
// handled immediately rather than after the current `sleep` returns.
|
|
19
|
+
const ANVIL_WATCHDOG = `
|
|
20
|
+
set -u
|
|
21
|
+
parent=$PPID
|
|
22
|
+
"$ANVIL_BIN" "$@" &
|
|
23
|
+
anvil_pid=$!
|
|
24
|
+
trap 'kill "$anvil_pid" 2>/dev/null' EXIT
|
|
25
|
+
trap 'exit 0' INT TERM
|
|
26
|
+
while kill -0 "$parent" 2>/dev/null; do sleep 1 & wait $!; done
|
|
27
|
+
`;
|
|
6
28
|
/**
|
|
7
29
|
* Ensures there's a running Anvil instance and returns the RPC URL.
|
|
8
30
|
*/ export async function startAnvil(opts = {}) {
|
|
9
|
-
const anvilBinary =
|
|
31
|
+
const anvilBinary = resolveFoundryBinary('anvil');
|
|
10
32
|
const logger = opts.log ? createLogger('ethereum:anvil') : undefined;
|
|
11
33
|
const methodCalls = opts.captureMethodCalls ? [] : undefined;
|
|
12
34
|
let detectedPort;
|
|
13
35
|
const anvil = await retry(async ()=>{
|
|
36
|
+
// `--port 0` lets anvil bind an OS-assigned ephemeral port; the actual port is read back from
|
|
37
|
+
// its "Listening on host:port" stdout below, so independent suites can spawn their own anvil
|
|
38
|
+
// in parallel without fighting over a fixed port.
|
|
14
39
|
const port = opts.port ?? (process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT) : 8545);
|
|
15
40
|
const args = [
|
|
16
41
|
'--host',
|
|
@@ -31,7 +56,14 @@ import { dirname, resolve } from 'path';
|
|
|
31
56
|
args.push('--hardfork', opts.hardfork);
|
|
32
57
|
}
|
|
33
58
|
args.push('--slots-in-an-epoch', String(opts.slotsInAnEpoch ?? 1));
|
|
34
|
-
|
|
59
|
+
// Spawn the watchdog (see ANVIL_WATCHDOG). It launches anvil with these args and reaps it if we
|
|
60
|
+
// die; `$0` is 'bash' and `$@` is the anvil argv.
|
|
61
|
+
const child = spawn('bash', [
|
|
62
|
+
'-c',
|
|
63
|
+
ANVIL_WATCHDOG,
|
|
64
|
+
'bash',
|
|
65
|
+
...args
|
|
66
|
+
], {
|
|
35
67
|
stdio: [
|
|
36
68
|
'ignore',
|
|
37
69
|
'pipe',
|
|
@@ -39,6 +71,7 @@ import { dirname, resolve } from 'path';
|
|
|
39
71
|
],
|
|
40
72
|
env: {
|
|
41
73
|
...process.env,
|
|
74
|
+
ANVIL_BIN: anvilBinary,
|
|
42
75
|
RAYON_NUM_THREADS: '1'
|
|
43
76
|
}
|
|
44
77
|
});
|
|
@@ -139,7 +172,10 @@ import { dirname, resolve } from 'path';
|
|
|
139
172
|
}
|
|
140
173
|
}
|
|
141
174
|
}
|
|
142
|
-
/**
|
|
175
|
+
/**
|
|
176
|
+
* Send SIGTERM to the watchdog, wait up to 5 s, then SIGKILL. The watchdog's trap forwards the
|
|
177
|
+
* signal to anvil, so terminating it tears down anvil too. All timers are always cleared.
|
|
178
|
+
*/ function killChild(child) {
|
|
143
179
|
return new Promise((resolve)=>{
|
|
144
180
|
if (child.exitCode !== null || child.killed) {
|
|
145
181
|
child.stdout?.destroy();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/ethereum",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./account": "./dest/account.js",
|
|
@@ -50,10 +50,10 @@
|
|
|
50
50
|
"../package.common.json"
|
|
51
51
|
],
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@aztec/blob-lib": "5.0.
|
|
54
|
-
"@aztec/constants": "5.0.
|
|
55
|
-
"@aztec/foundation": "5.0.
|
|
56
|
-
"@aztec/l1-artifacts": "5.0.
|
|
53
|
+
"@aztec/blob-lib": "5.0.1",
|
|
54
|
+
"@aztec/constants": "5.0.1",
|
|
55
|
+
"@aztec/foundation": "5.0.1",
|
|
56
|
+
"@aztec/l1-artifacts": "5.0.1",
|
|
57
57
|
"dotenv": "^16.0.3",
|
|
58
58
|
"lodash.chunk": "^4.2.0",
|
|
59
59
|
"lodash.pickby": "^4.5.0",
|
|
@@ -22,6 +22,7 @@ import { createExtendedL1Client } from './client.js';
|
|
|
22
22
|
import { type L1ContractsConfig, assertValidSlotDurations } from './config.js';
|
|
23
23
|
import { deployMulticall3 } from './contracts/multicall.js';
|
|
24
24
|
import { RollupContract } from './contracts/rollup.js';
|
|
25
|
+
import { resolveFoundryBinary } from './foundry_binary.js';
|
|
25
26
|
import type { L1ContractAddresses } from './l1_contract_addresses.js';
|
|
26
27
|
import type { ExtendedViemWalletClient } from './types.js';
|
|
27
28
|
|
|
@@ -93,11 +94,16 @@ function runProcess<T>(
|
|
|
93
94
|
|
|
94
95
|
// Covers an edge where where we may have a cached BlobLib that is not meant for production.
|
|
95
96
|
// Despite the profile apparently sometimes cached code remains (so says Lasse after his ignition-monorepo arc).
|
|
96
|
-
async function maybeForgeForceProductionBuild(
|
|
97
|
+
async function maybeForgeForceProductionBuild(
|
|
98
|
+
forgeBin: string,
|
|
99
|
+
l1ContractsPath: string,
|
|
100
|
+
script: string,
|
|
101
|
+
chainId: number,
|
|
102
|
+
) {
|
|
97
103
|
if (chainId === mainnet.id) {
|
|
98
104
|
logger.info(`Recompiling ${script} with production profile for mainnet deployment`);
|
|
99
105
|
logger.info('This may take a minute but ensures production BlobLib is used.');
|
|
100
|
-
await runProcess(
|
|
106
|
+
await runProcess(forgeBin, ['build', script, '--force'], { FOUNDRY_PROFILE: 'production' }, l1ContractsPath);
|
|
101
107
|
}
|
|
102
108
|
}
|
|
103
109
|
|
|
@@ -320,8 +326,9 @@ export async function deployAztecL1Contracts(
|
|
|
320
326
|
// Use foundry-artifacts from l1-artifacts package
|
|
321
327
|
const l1ContractsPath = prepareL1ContractsForDeployment();
|
|
322
328
|
|
|
329
|
+
const forgeBin = resolveFoundryBinary('forge');
|
|
323
330
|
const FORGE_SCRIPT = 'script/deploy/DeployAztecL1Contracts.s.sol';
|
|
324
|
-
await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId);
|
|
331
|
+
await maybeForgeForceProductionBuild(forgeBin, l1ContractsPath, FORGE_SCRIPT, chainId);
|
|
325
332
|
|
|
326
333
|
// Verify contracts on Etherscan when on mainnet/sepolia and ETHERSCAN_API_KEY is available.
|
|
327
334
|
const isVerifiableChain = chainId === mainnet.id || chainId === sepolia.id;
|
|
@@ -346,6 +353,8 @@ export async function deployAztecL1Contracts(
|
|
|
346
353
|
...(shouldVerify ? ['--verify'] : []),
|
|
347
354
|
];
|
|
348
355
|
const forgeEnv = {
|
|
356
|
+
// Resolved forge binary picked up by forge_broadcast.js, so it works without forge on PATH.
|
|
357
|
+
FORGE_BIN: forgeBin,
|
|
349
358
|
// Env vars required by l1-contracts/script/deploy/DeploymentConfiguration.sol.
|
|
350
359
|
NETWORK: getActiveNetworkName(),
|
|
351
360
|
FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
|
|
@@ -613,12 +622,15 @@ export const deployRollupForUpgrade = async (
|
|
|
613
622
|
// Use foundry-artifacts from l1-artifacts package
|
|
614
623
|
const l1ContractsPath = prepareL1ContractsForDeployment();
|
|
615
624
|
|
|
625
|
+
const forgeBin = resolveFoundryBinary('forge');
|
|
616
626
|
const FORGE_SCRIPT = 'script/deploy/DeployRollupForUpgrade.s.sol';
|
|
617
|
-
await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId);
|
|
627
|
+
await maybeForgeForceProductionBuild(forgeBin, l1ContractsPath, FORGE_SCRIPT, chainId);
|
|
618
628
|
|
|
619
629
|
const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js');
|
|
620
630
|
const forgeArgs = [FORGE_SCRIPT, '--sig', 'run()', '--private-key', privateKey, '--rpc-url', rpcUrl];
|
|
621
631
|
const forgeEnv = {
|
|
632
|
+
// Resolved forge binary picked up by forge_broadcast.js, so it works without forge on PATH.
|
|
633
|
+
FORGE_BIN: forgeBin,
|
|
622
634
|
FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
|
|
623
635
|
// Env vars required by l1-contracts/script/deploy/RollupConfiguration.sol.
|
|
624
636
|
REGISTRY_ADDRESS: registryAddress.toString(),
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { spawnSync } from 'child_process';
|
|
2
|
+
import { accessSync, constants } from 'fs';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
|
|
6
|
+
function isExecutable(path: string): boolean {
|
|
7
|
+
try {
|
|
8
|
+
accessSync(path, constants.X_OK);
|
|
9
|
+
return true;
|
|
10
|
+
} catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Locate a Foundry binary (`anvil`, `forge`, ...) without relying on the caller's PATH. Order:
|
|
17
|
+
* 1. `$<NAME>_BIN` (e.g. `$ANVIL_BIN`, `$FORGE_BIN`) — explicit override, e.g. for CI with a pinned
|
|
18
|
+
* version. Throws if set but not pointing at an executable, instead of silently falling back.
|
|
19
|
+
* 2. `~/.aztec/current/internal-bin/<name>` — where aztec-up installs it.
|
|
20
|
+
* 3. `~/.aztec/current/bin/aztec-<name>` — the publicly-exposed symlink.
|
|
21
|
+
* 4. `~/.foundry/bin/<name>` — standalone foundryup install.
|
|
22
|
+
* 5. `command -v <name>` — anything else on PATH.
|
|
23
|
+
*
|
|
24
|
+
* Throws with a directive message if none work.
|
|
25
|
+
*/
|
|
26
|
+
export function resolveFoundryBinary(name: string): string {
|
|
27
|
+
const envVar = `${name.toUpperCase()}_BIN`;
|
|
28
|
+
const envBin = process.env[envVar];
|
|
29
|
+
if (envBin) {
|
|
30
|
+
if (!isExecutable(envBin)) {
|
|
31
|
+
throw new Error(`$${envVar} is set to ${envBin}, which does not exist or is not executable.`);
|
|
32
|
+
}
|
|
33
|
+
return envBin;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const candidates = [
|
|
37
|
+
join(homedir(), '.aztec', 'current', 'internal-bin', name),
|
|
38
|
+
join(homedir(), '.aztec', 'current', 'bin', `aztec-${name}`),
|
|
39
|
+
join(homedir(), '.foundry', 'bin', name),
|
|
40
|
+
];
|
|
41
|
+
for (const path of candidates) {
|
|
42
|
+
if (isExecutable(path)) {
|
|
43
|
+
return path;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const which = spawnSync('sh', ['-c', `command -v ${name}`], { encoding: 'utf8' });
|
|
48
|
+
if (which.status === 0 && which.stdout.trim()) {
|
|
49
|
+
return which.stdout.trim();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
throw new Error(
|
|
53
|
+
`${name} binary not found. Tried $${envVar}, ~/.aztec/current/internal-bin/${name}, ` +
|
|
54
|
+
`~/.aztec/current/bin/aztec-${name}, ~/.foundry/bin/${name}, and $PATH. ` +
|
|
55
|
+
`Install via \`aztec-up\` or set ${envVar} to a working binary.`,
|
|
56
|
+
);
|
|
57
|
+
}
|
package/src/test/start_anvil.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
3
3
|
import type { TestDateProvider } from '@aztec/foundation/timer';
|
|
4
|
-
import { fileURLToPath } from '@aztec/foundation/url';
|
|
5
4
|
|
|
6
5
|
import { type ChildProcess, spawn } from 'child_process';
|
|
7
|
-
|
|
6
|
+
|
|
7
|
+
import { resolveFoundryBinary } from '../foundry_binary.js';
|
|
8
8
|
|
|
9
9
|
/** Minimal interface matching the @viem/anvil Anvil shape used by callers. */
|
|
10
10
|
export interface Anvil {
|
|
@@ -14,6 +14,30 @@ export interface Anvil {
|
|
|
14
14
|
stop(): Promise<void>;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
// Watchdog wrapper: instead of spawning anvil directly, we spawn a small bash supervisor that runs
|
|
18
|
+
// anvil as a background child and polls its own parent (this node process). If the parent dies for
|
|
19
|
+
// ANY reason — including SIGKILL / crash / OOM, where node's own exit handlers never run — the poll
|
|
20
|
+
// loop ends and the EXIT trap reaps anvil. The script is inlined (rather than shipped as a `.sh`) so
|
|
21
|
+
// it works from the published npm tarball too, and the resolved anvil binary is passed via
|
|
22
|
+
// `$ANVIL_BIN` so it works without `anvil` on PATH.
|
|
23
|
+
//
|
|
24
|
+
// `$@` is the anvil argv; `bash -c <script> bash <...args>` puts the args in `$@` and `$0` = 'bash'.
|
|
25
|
+
//
|
|
26
|
+
// The EXIT trap reaps anvil; INT/TERM just `exit` (which fires the EXIT trap) so a signal terminates
|
|
27
|
+
// the supervisor promptly instead of being swallowed — a trapped TERM does NOT terminate the shell,
|
|
28
|
+
// so trapping the kill directly on TERM would leave the poll loop running and the caller's teardown
|
|
29
|
+
// hanging until its SIGKILL escalation. `sleep & wait` makes the poll interruptible, so INT/TERM are
|
|
30
|
+
// handled immediately rather than after the current `sleep` returns.
|
|
31
|
+
const ANVIL_WATCHDOG = `
|
|
32
|
+
set -u
|
|
33
|
+
parent=$PPID
|
|
34
|
+
"$ANVIL_BIN" "$@" &
|
|
35
|
+
anvil_pid=$!
|
|
36
|
+
trap 'kill "$anvil_pid" 2>/dev/null' EXIT
|
|
37
|
+
trap 'exit 0' INT TERM
|
|
38
|
+
while kill -0 "$parent" 2>/dev/null; do sleep 1 & wait $!; done
|
|
39
|
+
`;
|
|
40
|
+
|
|
17
41
|
/**
|
|
18
42
|
* Ensures there's a running Anvil instance and returns the RPC URL.
|
|
19
43
|
*/
|
|
@@ -42,7 +66,7 @@ export async function startAnvil(
|
|
|
42
66
|
dateProvider?: TestDateProvider;
|
|
43
67
|
} = {},
|
|
44
68
|
): Promise<{ anvil: Anvil; methodCalls?: string[]; rpcUrl: string; stop: () => Promise<void> }> {
|
|
45
|
-
const anvilBinary =
|
|
69
|
+
const anvilBinary = resolveFoundryBinary('anvil');
|
|
46
70
|
const logger = opts.log ? createLogger('ethereum:anvil') : undefined;
|
|
47
71
|
const methodCalls = opts.captureMethodCalls ? ([] as string[]) : undefined;
|
|
48
72
|
|
|
@@ -50,6 +74,9 @@ export async function startAnvil(
|
|
|
50
74
|
|
|
51
75
|
const anvil = await retry(
|
|
52
76
|
async () => {
|
|
77
|
+
// `--port 0` lets anvil bind an OS-assigned ephemeral port; the actual port is read back from
|
|
78
|
+
// its "Listening on host:port" stdout below, so independent suites can spawn their own anvil
|
|
79
|
+
// in parallel without fighting over a fixed port.
|
|
53
80
|
const port = opts.port ?? (process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT) : 8545);
|
|
54
81
|
const args: string[] = [
|
|
55
82
|
'--host',
|
|
@@ -71,9 +98,11 @@ export async function startAnvil(
|
|
|
71
98
|
}
|
|
72
99
|
args.push('--slots-in-an-epoch', String(opts.slotsInAnEpoch ?? 1));
|
|
73
100
|
|
|
74
|
-
|
|
101
|
+
// Spawn the watchdog (see ANVIL_WATCHDOG). It launches anvil with these args and reaps it if we
|
|
102
|
+
// die; `$0` is 'bash' and `$@` is the anvil argv.
|
|
103
|
+
const child = spawn('bash', ['-c', ANVIL_WATCHDOG, 'bash', ...args], {
|
|
75
104
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
76
|
-
env: { ...process.env, RAYON_NUM_THREADS: '1' },
|
|
105
|
+
env: { ...process.env, ANVIL_BIN: anvilBinary, RAYON_NUM_THREADS: '1' },
|
|
77
106
|
});
|
|
78
107
|
|
|
79
108
|
// Wait for "Listening on" or an early exit.
|
|
@@ -183,7 +212,10 @@ function syncDateProviderFromAnvilOutput(text: string, dateProvider: TestDatePro
|
|
|
183
212
|
}
|
|
184
213
|
}
|
|
185
214
|
|
|
186
|
-
/**
|
|
215
|
+
/**
|
|
216
|
+
* Send SIGTERM to the watchdog, wait up to 5 s, then SIGKILL. The watchdog's trap forwards the
|
|
217
|
+
* signal to anvil, so terminating it tears down anvil too. All timers are always cleared.
|
|
218
|
+
*/
|
|
187
219
|
function killChild(child: ChildProcess): Promise<void> {
|
|
188
220
|
return new Promise<void>(resolve => {
|
|
189
221
|
if (child.exitCode !== null || child.killed) {
|