@aztec/ethereum 0.69.0 → 0.69.1-devnet

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/utils.js CHANGED
@@ -1,4 +1,4 @@
1
- import { decodeEventLog, } from 'viem';
1
+ import { BaseError, ContractFunctionRevertedError, decodeEventLog, } from 'viem';
2
2
  export function extractEvent(logs, address, abi, eventName, filter, logger) {
3
3
  const event = tryExtractEvent(logs, address, abi, eventName, filter, logger);
4
4
  if (!event) {
@@ -24,4 +24,97 @@ function tryExtractEvent(logs, address, abi, eventName, filter, logger) {
24
24
  }
25
25
  }
26
26
  }
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQU1MLGNBQWMsR0FDZixNQUFNLE1BQU0sQ0FBQztBQVNkLE1BQU0sVUFBVSxZQUFZLENBSzFCLElBQVcsRUFDWCxPQUFZLEVBQ1osR0FBUyxFQUNULFNBQXFCLEVBQ3JCLE1BQXFDLEVBQ3JDLE1BQWU7SUFFZixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3RSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxTQUFTLGlCQUFpQixPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FLdEIsSUFBVyxFQUNYLE9BQVksRUFDWixHQUFTLEVBQ1QsU0FBcUIsRUFDckIsTUFBcUMsRUFDckMsTUFBZTtJQUVmLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQztnQkFDSCxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLFlBQVksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3pDLE1BQU0sYUFBYSxHQUFHLFlBQTBCLENBQUM7b0JBQ2pELElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7d0JBQ3JDLE9BQU8sYUFBYSxDQUFDO29CQUN2QixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLDJDQUEyQyxPQUFPLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIn0=
27
+ export function prettyLogViemErrorMsg(err) {
28
+ if (err instanceof BaseError) {
29
+ const revertError = err.walk(err => err instanceof ContractFunctionRevertedError);
30
+ if (revertError instanceof ContractFunctionRevertedError) {
31
+ const errorName = revertError.data?.errorName ?? '';
32
+ const args = revertError.metaMessages && revertError.metaMessages?.length > 1 ? revertError.metaMessages[1].trimStart() : '';
33
+ return `${errorName}${args}`;
34
+ }
35
+ }
36
+ return err?.message ?? err;
37
+ }
38
+ export function formatViemError(error) {
39
+ const truncateHex = (hex, length = 100) => {
40
+ if (!hex || typeof hex !== 'string') {
41
+ return hex;
42
+ }
43
+ if (!hex.startsWith('0x')) {
44
+ return hex;
45
+ }
46
+ if (hex.length <= length * 2) {
47
+ return hex;
48
+ }
49
+ return `${hex.slice(0, length)}...${hex.slice(-length)}`;
50
+ };
51
+ const formatRequestBody = (body) => {
52
+ try {
53
+ const parsed = JSON.parse(body);
54
+ // Recursively process all parameters that might contain hex strings
55
+ const processParams = (obj) => {
56
+ if (Array.isArray(obj)) {
57
+ return obj.map(item => processParams(item));
58
+ }
59
+ if (typeof obj === 'object' && obj !== null) {
60
+ const result = {};
61
+ for (const [key, value] of Object.entries(obj)) {
62
+ result[key] = processParams(value);
63
+ }
64
+ return result;
65
+ }
66
+ if (typeof obj === 'string') {
67
+ if (obj.startsWith('0x')) {
68
+ return truncateHex(obj);
69
+ }
70
+ }
71
+ return obj;
72
+ };
73
+ // Process the entire request body
74
+ const processed = processParams(parsed);
75
+ return JSON.stringify(processed, null, 2);
76
+ }
77
+ catch {
78
+ return body;
79
+ }
80
+ };
81
+ const truncateHexStringsInText = (text) => {
82
+ const hexRegex = /\b0x[a-fA-F0-9]{10,}/g;
83
+ return text.replace(hexRegex, hex => truncateHex(hex));
84
+ };
85
+ const extractAndFormatRequestBody = (message) => {
86
+ // First handle Request body JSON
87
+ const requestBodyRegex = /Request body: ({[\s\S]*?})\n/g;
88
+ let result = message.replace(requestBodyRegex, (match, body) => {
89
+ return `Request body: ${formatRequestBody(body)}\n`;
90
+ });
91
+ // Then handle Arguments section
92
+ const argsRegex = /((?:Request |Estimate Gas )?Arguments:[\s\S]*?(?=\n\n|$))/g;
93
+ result = result.replace(argsRegex, section => {
94
+ const lines = section.split('\n');
95
+ const processedLines = lines.map(line => {
96
+ // Check if line contains a colon followed by content
97
+ const colonIndex = line.indexOf(':');
98
+ if (colonIndex !== -1) {
99
+ const [prefix, content] = [line.slice(0, colonIndex + 1), line.slice(colonIndex + 1).trim()];
100
+ // If content contains a hex string, truncate it
101
+ if (content.includes('0x')) {
102
+ const hexMatches = content.match(/0x[a-fA-F0-9]+/g) || [];
103
+ let processedContent = content;
104
+ hexMatches.forEach(hex => {
105
+ processedContent = processedContent.replace(hex, truncateHex(hex));
106
+ });
107
+ return `${prefix} ${processedContent}`;
108
+ }
109
+ }
110
+ return line;
111
+ });
112
+ return processedLines.join('\n');
113
+ });
114
+ // Finally, catch any remaining hex strings in the message
115
+ result = truncateHexStringsInText(result);
116
+ return result;
117
+ };
118
+ return JSON.stringify({ error: extractAndFormatRequestBody(error?.message || String(error)) }, null, 2).replace(/\\n/g, '\n');
119
+ }
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUVMLFNBQVMsRUFFVCw2QkFBNkIsRUFJN0IsY0FBYyxHQUNmLE1BQU0sTUFBTSxDQUFDO0FBU2QsTUFBTSxVQUFVLFlBQVksQ0FLMUIsSUFBVyxFQUNYLE9BQVksRUFDWixHQUFTLEVBQ1QsU0FBcUIsRUFDckIsTUFBcUMsRUFDckMsTUFBZTtJQUVmLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLFNBQVMsaUJBQWlCLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUt0QixJQUFXLEVBQ1gsT0FBWSxFQUNaLEdBQVMsRUFDVCxTQUFxQixFQUNyQixNQUFxQyxFQUNyQyxNQUFlO0lBRWYsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDeEQsSUFBSSxDQUFDO2dCQUNILE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ3JELElBQUksWUFBWSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDekMsTUFBTSxhQUFhLEdBQUcsWUFBMEIsQ0FBQztvQkFDakQsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQzt3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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/ethereum",
3
- "version": "0.69.0",
3
+ "version": "0.69.1-devnet",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -29,11 +29,10 @@
29
29
  "../package.common.json"
30
30
  ],
31
31
  "dependencies": {
32
- "@aztec/foundation": "0.69.0",
33
- "@aztec/l1-artifacts": "0.69.0",
32
+ "@aztec/foundation": "0.69.1-devnet",
33
+ "@aztec/l1-artifacts": "0.69.1-devnet",
34
34
  "@viem/anvil": "^0.0.10",
35
35
  "dotenv": "^16.0.3",
36
- "get-port": "^7.1.0",
37
36
  "tslib": "^2.4.0",
38
37
  "viem": "^2.7.15",
39
38
  "zod": "^3.23.8"
package/src/config.ts CHANGED
@@ -1,4 +1,9 @@
1
- import { type ConfigMappingsType, getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
1
+ import {
2
+ type ConfigMappingsType,
3
+ bigintConfigHelper,
4
+ getConfigFromMappings,
5
+ numberConfigHelper,
6
+ } from '@aztec/foundation/config';
2
7
 
3
8
  export type L1ContractsConfig = {
4
9
  /** How many seconds an L1 slot lasts. */
@@ -11,6 +16,16 @@ export type L1ContractsConfig = {
11
16
  aztecTargetCommitteeSize: number;
12
17
  /** The number of L2 slots that we can wait for a proof of an epoch to be produced. */
13
18
  aztecEpochProofClaimWindowInL2Slots: number;
19
+ /** The minimum stake for a validator. */
20
+ minimumStake: bigint;
21
+ /** The slashing quorum */
22
+ slashingQuorum: number;
23
+ /** The slashing round size */
24
+ slashingRoundSize: number;
25
+ /** Governance proposing quorum */
26
+ governanceProposerQuorum: number;
27
+ /** Governance proposing round size */
28
+ governanceProposerRoundSize: number;
14
29
  };
15
30
 
16
31
  export const DefaultL1ContractsConfig = {
@@ -19,6 +34,11 @@ export const DefaultL1ContractsConfig = {
19
34
  aztecEpochDuration: 16,
20
35
  aztecTargetCommitteeSize: 48,
21
36
  aztecEpochProofClaimWindowInL2Slots: 13,
37
+ minimumStake: BigInt(100e18),
38
+ slashingQuorum: 6,
39
+ slashingRoundSize: 10,
40
+ governanceProposerQuorum: 6,
41
+ governanceProposerRoundSize: 10,
22
42
  } satisfies L1ContractsConfig;
23
43
 
24
44
  export const l1ContractsConfigMappings: ConfigMappingsType<L1ContractsConfig> = {
@@ -47,6 +67,31 @@ export const l1ContractsConfigMappings: ConfigMappingsType<L1ContractsConfig> =
47
67
  description: 'The number of L2 slots that we can wait for a proof of an epoch to be produced.',
48
68
  ...numberConfigHelper(DefaultL1ContractsConfig.aztecEpochProofClaimWindowInL2Slots),
49
69
  },
70
+ minimumStake: {
71
+ env: 'AZTEC_MINIMUM_STAKE',
72
+ description: 'The minimum stake for a validator.',
73
+ ...bigintConfigHelper(DefaultL1ContractsConfig.minimumStake),
74
+ },
75
+ slashingQuorum: {
76
+ env: 'AZTEC_SLASHING_QUORUM',
77
+ description: 'The slashing quorum',
78
+ ...numberConfigHelper(DefaultL1ContractsConfig.slashingQuorum),
79
+ },
80
+ slashingRoundSize: {
81
+ env: 'AZTEC_SLASHING_ROUND_SIZE',
82
+ description: 'The slashing round size',
83
+ ...numberConfigHelper(DefaultL1ContractsConfig.slashingRoundSize),
84
+ },
85
+ governanceProposerQuorum: {
86
+ env: 'AZTEC_GOVERNANCE_PROPOSER_QUORUM',
87
+ description: 'The governance proposing quorum',
88
+ ...numberConfigHelper(DefaultL1ContractsConfig.governanceProposerQuorum),
89
+ },
90
+ governanceProposerRoundSize: {
91
+ env: 'AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE',
92
+ description: 'The governance proposing round size',
93
+ ...numberConfigHelper(DefaultL1ContractsConfig.governanceProposerRoundSize),
94
+ },
50
95
  };
51
96
 
52
97
  export function getL1ContractsConfigEnvVars(): L1ContractsConfig {
package/src/constants.ts CHANGED
@@ -2,4 +2,3 @@ import { type Hex } from 'viem';
2
2
 
3
3
  export const NULL_KEY: Hex = `0x${'0000000000000000000000000000000000000000000000000000000000000000'}`;
4
4
  export const AZTEC_TEST_CHAIN_ID = 677692;
5
- export const MINIMUM_STAKE = BigInt(100e18);
@@ -26,6 +26,8 @@ import {
26
26
  RollupAbi,
27
27
  RollupBytecode,
28
28
  RollupLinkReferences,
29
+ SlashFactoryAbi,
30
+ SlashFactoryBytecode,
29
31
  TestERC20Abi,
30
32
  TestERC20Bytecode,
31
33
  } from '@aztec/l1-artifacts';
@@ -53,7 +55,6 @@ import { type HDAccount, type PrivateKeyAccount, mnemonicToAccount, privateKeyTo
53
55
  import { foundry } from 'viem/chains';
54
56
 
55
57
  import { type L1ContractsConfig } from './config.js';
56
- import { MINIMUM_STAKE } from './constants.js';
57
58
  import { isAnvilTestChain } from './ethereum_chain.js';
58
59
  import { type L1ContractAddresses } from './l1_contract_addresses.js';
59
60
  import { L1TxUtils } from './l1_tx_utils.js';
@@ -156,6 +157,10 @@ export interface L1ContractArtifactsForDeployment {
156
157
  * Governance contract artifacts.
157
158
  */
158
159
  governance: ContractArtifacts;
160
+ /**
161
+ * SlashFactory contract artifacts.
162
+ */
163
+ slashFactory: ContractArtifacts;
159
164
  }
160
165
 
161
166
  export const l1Artifacts: L1ContractArtifactsForDeployment = {
@@ -216,6 +221,10 @@ export const l1Artifacts: L1ContractArtifactsForDeployment = {
216
221
  contractAbi: GovernanceAbi,
217
222
  contractBytecode: GovernanceBytecode,
218
223
  },
224
+ slashFactory: {
225
+ contractAbi: SlashFactoryAbi,
226
+ contractBytecode: SlashFactoryBytecode,
227
+ },
219
228
  };
220
229
 
221
230
  export interface DeployL1ContractsArgs extends L1ContractsConfig {
@@ -331,14 +340,10 @@ export const deployL1Contracts = async (
331
340
  ]);
332
341
  logger.verbose(`Deployed Staking Asset at ${stakingAssetAddress}`);
333
342
 
334
- // @todo #8084
335
- // @note These numbers are just chosen to make testing simple.
336
- const quorumSize = 6n;
337
- const roundSize = 10n;
338
343
  const governanceProposerAddress = await govDeployer.deploy(l1Artifacts.governanceProposer, [
339
344
  registryAddress.toString(),
340
- quorumSize,
341
- roundSize,
345
+ args.governanceProposerQuorum,
346
+ args.governanceProposerRoundSize,
342
347
  ]);
343
348
  logger.verbose(`Deployed GovernanceProposer at ${governanceProposerAddress}`);
344
349
 
@@ -382,7 +387,9 @@ export const deployL1Contracts = async (
382
387
  aztecEpochDuration: args.aztecEpochDuration,
383
388
  targetCommitteeSize: args.aztecTargetCommitteeSize,
384
389
  aztecEpochProofClaimWindowInL2Slots: args.aztecEpochProofClaimWindowInL2Slots,
385
- minimumStake: MINIMUM_STAKE,
390
+ minimumStake: args.minimumStake,
391
+ slashingQuorum: args.slashingQuorum,
392
+ slashingRoundSize: args.slashingRoundSize,
386
393
  };
387
394
  const rollupArgs = [
388
395
  feeJuicePortalAddress.toString(),
@@ -396,6 +403,9 @@ export const deployL1Contracts = async (
396
403
  const rollupAddress = await deployer.deploy(l1Artifacts.rollup, rollupArgs);
397
404
  logger.verbose(`Deployed Rollup at ${rollupAddress}`, rollupConfigArgs);
398
405
 
406
+ const slashFactoryAddress = await deployer.deploy(l1Artifacts.slashFactory, [rollupAddress.toString()]);
407
+ logger.verbose(`Deployed SlashFactory at ${slashFactoryAddress}`);
408
+
399
409
  await deployer.waitForDeployments();
400
410
  logger.verbose(`All core contracts have been deployed`);
401
411
 
@@ -434,7 +444,7 @@ export const deployL1Contracts = async (
434
444
 
435
445
  if (args.initialValidators && args.initialValidators.length > 0) {
436
446
  // Mint tokens, approve them, use cheat code to initialise validator set without setting up the epoch.
437
- const stakeNeeded = MINIMUM_STAKE * BigInt(args.initialValidators.length);
447
+ const stakeNeeded = args.minimumStake * BigInt(args.initialValidators.length);
438
448
  await Promise.all(
439
449
  [
440
450
  await stakingAsset.write.mint([walletClient.account.address, stakeNeeded], {} as any),
@@ -447,7 +457,7 @@ export const deployL1Contracts = async (
447
457
  attester: v.toString(),
448
458
  proposer: v.toString(),
449
459
  withdrawer: v.toString(),
450
- amount: MINIMUM_STAKE,
460
+ amount: args.minimumStake,
451
461
  })),
452
462
  ]);
453
463
  txHashes.push(initiateValidatorSetTxHash);
@@ -560,6 +570,7 @@ export const deployL1Contracts = async (
560
570
  rewardDistributorAddress,
561
571
  governanceProposerAddress,
562
572
  governanceAddress,
573
+ slashFactoryAddress,
563
574
  };
564
575
 
565
576
  logger.info(`Aztec L1 contracts initialized`, l1Contracts);
@@ -751,7 +762,7 @@ export async function deployL1Contract(
751
762
  } else {
752
763
  // Regular deployment path
753
764
  const deployData = encodeDeployData({ abi, bytecode, args });
754
- const receipt = await l1TxUtils.sendAndMonitorTransaction({
765
+ const { receipt } = await l1TxUtils.sendAndMonitorTransaction({
755
766
  to: null,
756
767
  data: deployData,
757
768
  });
@@ -21,6 +21,7 @@ export const L1ContractsNames = [
21
21
  'governanceProposerAddress',
22
22
  'governanceAddress',
23
23
  'stakingAssetAddress',
24
+ 'slashFactoryAddress',
24
25
  ] as const;
25
26
 
26
27
  /** Provides the directory of current L1 contract addresses */
@@ -40,6 +41,7 @@ export const L1ContractAddressesSchema = z.object({
40
41
  rewardDistributorAddress: schemas.EthAddress,
41
42
  governanceProposerAddress: schemas.EthAddress,
42
43
  governanceAddress: schemas.EthAddress,
44
+ slashFactoryAddress: schemas.EthAddress,
43
45
  }) satisfies ZodFor<L1ContractAddresses>;
44
46
 
45
47
  const parseEnv = (val: string) => EthAddress.fromString(val);
@@ -100,4 +102,9 @@ export const l1ContractAddressesMapping: ConfigMappingsType<L1ContractAddresses>
100
102
  description: 'The deployed L1 governance contract address',
101
103
  parseEnv,
102
104
  },
105
+ slashFactoryAddress: {
106
+ env: 'SLASH_FACTORY_CONTRACT_ADDRESS',
107
+ description: 'The deployed L1 slashFactory contract address',
108
+ parseEnv,
109
+ },
103
110
  };