@aztec/ethereum 0.59.0 → 0.61.0

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.
@@ -23,6 +23,18 @@ export type DeployL1Contracts = {
23
23
  */
24
24
  l1ContractAddresses: L1ContractAddresses;
25
25
  };
26
+ export interface LinkReferences {
27
+ [fileName: string]: {
28
+ [contractName: string]: ReadonlyArray<{
29
+ start: number;
30
+ length: number;
31
+ }>;
32
+ };
33
+ }
34
+ export interface Libraries {
35
+ linkReferences: LinkReferences;
36
+ libraryCode: Record<string, ContractArtifacts>;
37
+ }
26
38
  /**
27
39
  * Contract artifacts
28
40
  */
@@ -35,6 +47,10 @@ export interface ContractArtifacts {
35
47
  * The contract bytecode
36
48
  */
37
49
  contractBytecode: Hex;
50
+ /**
51
+ * The contract libraries
52
+ */
53
+ libraries?: Libraries;
38
54
  }
39
55
  /**
40
56
  * All L1 Contract Artifacts for deployment
@@ -64,7 +80,24 @@ export interface L1ContractArtifactsForDeployment {
64
80
  * Fee juice portal contract artifacts. Optional for now as gas is not strictly enforced
65
81
  */
66
82
  feeJuicePortal: ContractArtifacts;
83
+ /**
84
+ * Nomismatokopio contract artifacts.
85
+ */
86
+ nomismatokopio: ContractArtifacts;
87
+ /**
88
+ * Sysstia contract artifacts.
89
+ */
90
+ sysstia: ContractArtifacts;
91
+ /**
92
+ * Gerousia contract artifacts.
93
+ */
94
+ gerousia: ContractArtifacts;
95
+ /**
96
+ * Apella contract artifacts.
97
+ */
98
+ apella: ContractArtifacts;
67
99
  }
100
+ export declare const l1Artifacts: L1ContractArtifactsForDeployment;
68
101
  export interface DeployL1ContractsArgs {
69
102
  /**
70
103
  * The address of the L2 Fee Juice contract.
@@ -109,11 +142,10 @@ export declare function createL1Clients(rpcUrl: string, mnemonicOrPrivateKeyOrHd
109
142
  * @param account - Private Key or HD Account that will deploy the contracts.
110
143
  * @param chain - The chain instance to deploy to.
111
144
  * @param logger - A logger object.
112
- * @param contractsToDeploy - The set of L1 artifacts to be deployed
113
145
  * @param args - Arguments for initialization of L1 contracts
114
146
  * @returns A list of ETH addresses of the deployed contracts.
115
147
  */
116
- export declare const deployL1Contracts: (rpcUrl: string, account: HDAccount | PrivateKeyAccount, chain: Chain, logger: DebugLogger, contractsToDeploy: L1ContractArtifactsForDeployment, args: DeployL1ContractsArgs) => Promise<DeployL1Contracts>;
148
+ export declare const deployL1Contracts: (rpcUrl: string, account: HDAccount | PrivateKeyAccount, chain: Chain, logger: DebugLogger, args: DeployL1ContractsArgs) => Promise<DeployL1Contracts>;
117
149
  /**
118
150
  * Compiles a contract source code using the provided solc compiler.
119
151
  * @param fileName - Contract file name (eg UltraHonkVerifier.sol)
@@ -138,7 +170,7 @@ export declare function compileContract(fileName: string, contractName: string,
138
170
  * @param maybeSalt - Optional salt for CREATE2 deployment (does not wait for deployment tx to be mined if set, does not send tx if contract already exists).
139
171
  * @returns The ETH address the contract was deployed to.
140
172
  */
141
- export declare function deployL1Contract(walletClient: WalletClient<HttpTransport, Chain, Account>, publicClient: PublicClient<HttpTransport, Chain>, abi: Narrow<Abi | readonly unknown[]>, bytecode: Hex, args?: readonly unknown[], maybeSalt?: Hex, logger?: DebugLogger): Promise<{
173
+ export declare function deployL1Contract(walletClient: WalletClient<HttpTransport, Chain, Account>, publicClient: PublicClient<HttpTransport, Chain>, abi: Narrow<Abi | readonly unknown[]>, bytecode: Hex, args?: readonly unknown[], maybeSalt?: Hex, libraries?: Libraries, logger?: DebugLogger): Promise<{
142
174
  address: EthAddress;
143
175
  txHash: Hex | undefined;
144
176
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"deploy_l1_contracts.d.ts","sourceRoot":"","sources":["../src/deploy_l1_contracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy_l1_contracts.d.ts","sourceRoot":"","sources":["../src/deploy_l1_contracts.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,60 @@
1
1
  import { EthAddress } from '@aztec/foundation/eth-address';
2
- import { concatHex, createPublicClient, createWalletClient, encodeDeployData, getAddress, getContract, getContractAddress, http, numberToHex, padHex, zeroAddress, } from 'viem';
2
+ import { ApellaAbi, ApellaBytecode, FeeJuicePortalAbi, FeeJuicePortalBytecode, GerousiaAbi, GerousiaBytecode, InboxAbi, InboxBytecode, NomismatokopioAbi, NomismatokopioBytecode, OutboxAbi, OutboxBytecode, RegistryAbi, RegistryBytecode, RollupAbi, RollupBytecode, RollupLinkReferences, SysstiaAbi, SysstiaBytecode, TestERC20Abi, TestERC20Bytecode, TxsDecoderAbi, TxsDecoderBytecode, } from '@aztec/l1-artifacts';
3
+ import { concatHex, createPublicClient, createWalletClient, encodeDeployData, getAddress, getContract, getContractAddress, http, numberToHex, padHex, } from 'viem';
3
4
  import { mnemonicToAccount, privateKeyToAccount } from 'viem/accounts';
4
5
  import { foundry } from 'viem/chains';
5
6
  import { isAnvilTestChain } from './ethereum_chain.js';
7
+ export const l1Artifacts = {
8
+ registry: {
9
+ contractAbi: RegistryAbi,
10
+ contractBytecode: RegistryBytecode,
11
+ },
12
+ inbox: {
13
+ contractAbi: InboxAbi,
14
+ contractBytecode: InboxBytecode,
15
+ },
16
+ outbox: {
17
+ contractAbi: OutboxAbi,
18
+ contractBytecode: OutboxBytecode,
19
+ },
20
+ rollup: {
21
+ contractAbi: RollupAbi,
22
+ contractBytecode: RollupBytecode,
23
+ libraries: {
24
+ linkReferences: RollupLinkReferences,
25
+ libraryCode: {
26
+ TxsDecoder: {
27
+ contractAbi: TxsDecoderAbi,
28
+ contractBytecode: TxsDecoderBytecode,
29
+ },
30
+ },
31
+ },
32
+ },
33
+ feeJuice: {
34
+ contractAbi: TestERC20Abi,
35
+ contractBytecode: TestERC20Bytecode,
36
+ },
37
+ feeJuicePortal: {
38
+ contractAbi: FeeJuicePortalAbi,
39
+ contractBytecode: FeeJuicePortalBytecode,
40
+ },
41
+ sysstia: {
42
+ contractAbi: SysstiaAbi,
43
+ contractBytecode: SysstiaBytecode,
44
+ },
45
+ nomismatokopio: {
46
+ contractAbi: NomismatokopioAbi,
47
+ contractBytecode: NomismatokopioBytecode,
48
+ },
49
+ gerousia: {
50
+ contractAbi: GerousiaAbi,
51
+ contractBytecode: GerousiaBytecode,
52
+ },
53
+ apella: {
54
+ contractAbi: ApellaAbi,
55
+ contractBytecode: ApellaBytecode,
56
+ },
57
+ };
6
58
  /**
7
59
  * Creates a wallet and a public viem client for interacting with L1.
8
60
  * @param rpcUrl - RPC URL to connect to L1.
@@ -33,11 +85,10 @@ export function createL1Clients(rpcUrl, mnemonicOrPrivateKeyOrHdAccount, chain =
33
85
  * @param account - Private Key or HD Account that will deploy the contracts.
34
86
  * @param chain - The chain instance to deploy to.
35
87
  * @param logger - A logger object.
36
- * @param contractsToDeploy - The set of L1 artifacts to be deployed
37
88
  * @param args - Arguments for initialization of L1 contracts
38
89
  * @returns A list of ETH addresses of the deployed contracts.
39
90
  */
40
- export const deployL1Contracts = async (rpcUrl, account, chain, logger, contractsToDeploy, args) => {
91
+ export const deployL1Contracts = async (rpcUrl, account, chain, logger, args) => {
41
92
  // We are assuming that you are running this on a local anvil node which have 1s block times
42
93
  // To align better with actual deployment, we update the block interval to 12s
43
94
  // The code is same as `setBlockInterval` in `cheat_codes.ts`
@@ -51,7 +102,7 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
51
102
  return await (await fetch(rpcUrl, content)).json();
52
103
  };
53
104
  if (isAnvilTestChain(chain.id)) {
54
- const interval = 12;
105
+ const interval = 12; // @todo #8084
55
106
  const res = await rpcCall('anvil_setBlockTimestampInterval', [interval]);
56
107
  if (res.error) {
57
108
  throw new Error(`Error setting block interval: ${res.error.message}`);
@@ -61,20 +112,51 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
61
112
  logger.info(`Deploying contracts from ${account.address.toString()}...`);
62
113
  const walletClient = createWalletClient({ account, chain, transport: http(rpcUrl) });
63
114
  const publicClient = createPublicClient({ chain, transport: http(rpcUrl) });
64
- const deployer = new L1Deployer(walletClient, publicClient, args.salt, logger);
65
- const registryAddress = await deployer.deploy(contractsToDeploy.registry, [account.address.toString()]);
115
+ // Governance stuff
116
+ const govDeployer = new L1Deployer(walletClient, publicClient, args.salt, logger);
117
+ const registryAddress = await govDeployer.deploy(l1Artifacts.registry, [account.address.toString()]);
66
118
  logger.info(`Deployed Registry at ${registryAddress}`);
67
- const feeJuiceAddress = await deployer.deploy(contractsToDeploy.feeJuice);
119
+ const feeJuiceAddress = await govDeployer.deploy(l1Artifacts.feeJuice);
68
120
  logger.info(`Deployed Fee Juice at ${feeJuiceAddress}`);
69
- const feeJuicePortalAddress = await deployer.deploy(contractsToDeploy.feeJuicePortal, [
70
- account.address.toString(),
121
+ // @todo #8084
122
+ // @note These numbers are just chosen to make testing simple.
123
+ const quorumSize = 6n;
124
+ const roundSize = 10n;
125
+ const gerousiaAddress = await govDeployer.deploy(l1Artifacts.gerousia, [
126
+ registryAddress.toString(),
127
+ quorumSize,
128
+ roundSize,
129
+ ]);
130
+ logger.info(`Deployed Gerousia at ${gerousiaAddress}`);
131
+ const apellaAddress = await govDeployer.deploy(l1Artifacts.apella, [
132
+ feeJuiceAddress.toString(),
133
+ gerousiaAddress.toString(),
134
+ ]);
135
+ logger.info(`Deployed Apella at ${apellaAddress}`);
136
+ const nomismatokopioAddress = await govDeployer.deploy(l1Artifacts.nomismatokopio, [
137
+ feeJuiceAddress.toString(),
138
+ 1n * 10n ** 18n, // @todo #8084
139
+ apellaAddress.toString(),
140
+ ]);
141
+ logger.info(`Deployed Nomismatokopio at ${nomismatokopioAddress}`);
142
+ const sysstiaAddress = await govDeployer.deploy(l1Artifacts.sysstia, [
143
+ feeJuiceAddress.toString(),
144
+ registryAddress.toString(),
145
+ apellaAddress.toString(),
146
+ ]);
147
+ logger.info(`Deployed Sysstia at ${sysstiaAddress}`);
148
+ await govDeployer.waitForDeployments();
149
+ logger.info(`All governance contracts deployed`);
150
+ const deployer = new L1Deployer(walletClient, publicClient, args.salt, logger);
151
+ const feeJuicePortalAddress = await deployer.deploy(l1Artifacts.feeJuicePortal, [
71
152
  registryAddress.toString(),
72
153
  feeJuiceAddress.toString(),
73
154
  args.l2FeeJuiceAddress.toString(),
74
155
  ]);
75
156
  logger.info(`Deployed Fee Juice Portal at ${feeJuicePortalAddress}`);
76
- const rollupAddress = await deployer.deploy(contractsToDeploy.rollup, [
157
+ const rollupAddress = await deployer.deploy(l1Artifacts.rollup, [
77
158
  feeJuicePortalAddress.toString(),
159
+ sysstiaAddress.toString(),
78
160
  args.vkTreeRoot.toString(),
79
161
  args.protocolContractTreeRoot.toString(),
80
162
  account.address.toString(),
@@ -82,20 +164,20 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
82
164
  ]);
83
165
  logger.info(`Deployed Rollup at ${rollupAddress}`);
84
166
  await deployer.waitForDeployments();
85
- logger.info(`All contracts deployed`);
167
+ logger.info(`All core contracts deployed`);
86
168
  const feeJuicePortal = getContract({
87
169
  address: feeJuicePortalAddress.toString(),
88
- abi: contractsToDeploy.feeJuicePortal.contractAbi,
170
+ abi: l1Artifacts.feeJuicePortal.contractAbi,
89
171
  client: walletClient,
90
172
  });
91
173
  const feeJuice = getContract({
92
174
  address: feeJuiceAddress.toString(),
93
- abi: contractsToDeploy.feeJuice.contractAbi,
175
+ abi: l1Artifacts.feeJuice.contractAbi,
94
176
  client: walletClient,
95
177
  });
96
178
  const rollup = getContract({
97
179
  address: getAddress(rollupAddress.toString()),
98
- abi: contractsToDeploy.rollup.contractAbi,
180
+ abi: l1Artifacts.rollup.contractAbi,
99
181
  client: walletClient,
100
182
  });
101
183
  // Transaction hashes to await
@@ -110,7 +192,7 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
110
192
  // otherwise we execute subsequent transactions too soon
111
193
  await publicClient.waitForTransactionReceipt({ hash: mintTxHash });
112
194
  logger.info(`Funding fee juice portal contract with fee juice in ${mintTxHash}`);
113
- if ((await feeJuicePortal.read.owner([])) !== zeroAddress) {
195
+ if (!(await feeJuicePortal.read.initialized([]))) {
114
196
  const initPortalTxHash = await feeJuicePortal.write.initialize([]);
115
197
  txHashes.push(initPortalTxHash);
116
198
  logger.verbose(`Fee juice portal initializing in tx ${initPortalTxHash}`);
@@ -153,7 +235,7 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
153
235
  // We need to call a function on the registry to set the various contract addresses.
154
236
  const registryContract = getContract({
155
237
  address: getAddress(registryAddress.toString()),
156
- abi: contractsToDeploy.registry.contractAbi,
238
+ abi: l1Artifacts.registry.contractAbi,
157
239
  client: walletClient,
158
240
  });
159
241
  if (!(await registryContract.read.isRollupRegistered([getAddress(rollupAddress.toString())]))) {
@@ -164,6 +246,14 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
164
246
  else {
165
247
  logger.verbose(`Registry ${registryAddress} has already registered rollup ${rollupAddress}`);
166
248
  }
249
+ // If the owner is not the Apella contract, transfer ownership to the Apella contract
250
+ if ((await registryContract.read.owner([])) !== getAddress(apellaAddress.toString())) {
251
+ const transferOwnershipTxHash = await registryContract.write.transferOwnership([getAddress(apellaAddress.toString())], {
252
+ account,
253
+ });
254
+ logger.verbose(`Transferring the ownership of the registry contract at ${registryAddress} to the Apella ${apellaAddress} in tx ${transferOwnershipTxHash}`);
255
+ txHashes.push(transferOwnershipTxHash);
256
+ }
167
257
  // Wait for all actions to be mined
168
258
  await Promise.all(txHashes.map(txHash => publicClient.waitForTransactionReceipt({ hash: txHash })));
169
259
  logger.verbose(`All transactions for L1 deployment have been mined`);
@@ -174,6 +264,10 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
174
264
  outboxAddress,
175
265
  feeJuiceAddress,
176
266
  feeJuicePortalAddress,
267
+ nomismatokopioAddress,
268
+ sysstiaAddress,
269
+ gerousiaAddress,
270
+ apellaAddress,
177
271
  };
178
272
  return {
179
273
  walletClient,
@@ -190,7 +284,7 @@ class L1Deployer {
190
284
  this.salt = maybeSalt ? padHex(numberToHex(maybeSalt), { size: 32 }) : undefined;
191
285
  }
192
286
  async deploy(params, args = []) {
193
- const { txHash, address } = await deployL1Contract(this.walletClient, this.publicClient, params.contractAbi, params.contractBytecode, args, this.salt, this.logger);
287
+ const { txHash, address } = await deployL1Contract(this.walletClient, this.publicClient, params.contractAbi, params.contractBytecode, args, this.salt, params.libraries, this.logger);
194
288
  if (txHash) {
195
289
  this.txHashes.push(txHash);
196
290
  }
@@ -222,7 +316,7 @@ export function compileContract(fileName, contractName, source, solc) {
222
316
  enabled: true,
223
317
  runs: 200,
224
318
  },
225
- evmVersion: 'paris',
319
+ evmVersion: 'cancun',
226
320
  outputSelection: {
227
321
  '*': {
228
322
  '*': ['evm.bytecode.object', 'abi'],
@@ -246,9 +340,32 @@ export function compileContract(fileName, contractName, source, solc) {
246
340
  * @param maybeSalt - Optional salt for CREATE2 deployment (does not wait for deployment tx to be mined if set, does not send tx if contract already exists).
247
341
  * @returns The ETH address the contract was deployed to.
248
342
  */
249
- export async function deployL1Contract(walletClient, publicClient, abi, bytecode, args = [], maybeSalt, logger) {
343
+ export async function deployL1Contract(walletClient, publicClient, abi, bytecode, args = [], maybeSalt, libraries, logger) {
250
344
  let txHash = undefined;
251
345
  let address = undefined;
346
+ if (libraries) {
347
+ // @note Assumes that we wont have nested external libraries.
348
+ const replacements = {};
349
+ for (const libraryName in libraries?.libraryCode) {
350
+ const lib = libraries.libraryCode[libraryName];
351
+ const { address } = await deployL1Contract(walletClient, publicClient, lib.contractAbi, lib.contractBytecode, [], maybeSalt, undefined, logger);
352
+ for (const linkRef in libraries.linkReferences) {
353
+ for (const c in libraries.linkReferences[linkRef]) {
354
+ const start = 2 + 2 * libraries.linkReferences[linkRef][c][0].start;
355
+ const length = 2 * libraries.linkReferences[linkRef][c][0].length;
356
+ const toReplace = bytecode.slice(start, start + length);
357
+ replacements[toReplace] = address;
358
+ }
359
+ }
360
+ }
361
+ const escapeRegExp = (s) => {
362
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // Escape special characters
363
+ };
364
+ for (const toReplace in replacements) {
365
+ const replacement = replacements[toReplace].toString().slice(2);
366
+ bytecode = bytecode.replace(new RegExp(escapeRegExp(toReplace), 'g'), replacement);
367
+ }
368
+ }
252
369
  if (maybeSalt) {
253
370
  const salt = padHex(maybeSalt, { size: 32 });
254
371
  const deployer = '0x4e59b44847b379578588920cA78FbF26c0B4956C';
@@ -275,4 +392,4 @@ export async function deployL1Contract(walletClient, publicClient, abi, bytecode
275
392
  return { address: EthAddress.fromString(address), txHash };
276
393
  }
277
394
  // docs:end:deployL1Contract
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95X2wxX2NvbnRyYWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXBsb3lfbDFfY29udHJhY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUszRCxPQUFPLEVBT0wsU0FBUyxFQUNULGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLElBQUksRUFDSixXQUFXLEVBQ1gsTUFBTSxFQUNOLFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBMEMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQWlHdkQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsTUFBYyxFQUNkLCtCQUF1RixFQUN2RixRQUFlLE9BQU87SUFFdEIsTUFBTSxTQUFTLEdBQ2IsT0FBTywrQkFBK0IsS0FBSyxRQUFRO1FBQ2pELENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxtQkFBbUIsQ0FBQywrQkFBZ0QsQ0FBQztZQUN2RSxDQUFDLENBQUMsaUJBQWlCLENBQUMsK0JBQStCLENBQUM7UUFDdEQsQ0FBQyxDQUFDLCtCQUErQixDQUFDO0lBRXRDLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO1FBQ3RDLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLEtBQUs7UUFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUN4QixDQUFDLENBQUM7SUFDSCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztRQUN0QyxLQUFLO1FB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
395
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95X2wxX2NvbnRyYWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXBsb3lfbDFfY29udHJhY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUczRCxPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLFNBQVMsRUFDVCxjQUFjLEVBQ2QsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsZUFBZSxFQUNmLFlBQVksRUFDWixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGtCQUFrQixHQUNuQixNQUFNLHFCQUFxQixDQUFDO0FBRzdCLE9BQU8sRUFPTCxTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsSUFBSSxFQUNKLFdBQVcsRUFDWCxNQUFNLEdBQ1AsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQTBDLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9HLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFtR3ZELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBcUM7SUFDM0QsUUFBUSxFQUFFO1FBQ1IsV0FBVyxFQUFFLFdBQVc7UUFDeEIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0tBQ25DO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsV0FBVyxFQUFFLFFBQVE7UUFDckIsZ0JBQWdCLEVBQUUsYUFB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
@@ -1,12 +1,11 @@
1
1
  import { type ConfigMappingsType } from '@aztec/foundation/config';
2
2
  import { EthAddress } from '@aztec/foundation/eth-address';
3
- import type { DebugLogger } from '@aztec/foundation/log';
4
3
  /**
5
4
  * The names of the current L1 contract addresses.
6
5
  * NOTE: When changing this list, make sure to update CLI & CI scripts accordingly.
7
6
  * For reference: https://github.com/AztecProtocol/aztec-packages/pull/5553
8
7
  */
9
- export declare const l1ContractsNames: readonly ["rollupAddress", "registryAddress", "inboxAddress", "outboxAddress", "feeJuiceAddress", "feeJuicePortalAddress"];
8
+ export declare const l1ContractsNames: readonly ["rollupAddress", "registryAddress", "inboxAddress", "outboxAddress", "feeJuiceAddress", "feeJuicePortalAddress", "nomismatokopioAddress", "sysstiaAddress", "gerousiaAddress", "apellaAddress"];
10
9
  /**
11
10
  * Provides the directory of current L1 contract addresses
12
11
  */
@@ -14,6 +13,4 @@ export type L1ContractAddresses = {
14
13
  [K in (typeof l1ContractsNames)[number]]: EthAddress;
15
14
  };
16
15
  export declare const l1ContractAddressesMapping: ConfigMappingsType<L1ContractAddresses>;
17
- export declare function getL1ContractAddressesFromEnv(): L1ContractAddresses;
18
- export declare function getL1ContractAddressesFromUrl(url: string, log: DebugLogger): Promise<L1ContractAddresses>;
19
16
  //# sourceMappingURL=l1_contract_addresses.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"l1_contract_addresses.d.ts","sourceRoot":"","sources":["../src/l1_contract_addresses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAyB,MAAM,0BAA0B,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,4HAOnB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;KAC/B,CAAC,IAAI,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,GAAG,UAAU;CACrD,CAAC;AAIF,eAAO,MAAM,0BAA0B,EAAE,kBAAkB,CAAC,mBAAmB,CA+B9E,CAAC;AAEF,wBAAgB,6BAA6B,wBAE5C;AAiBD,wBAAsB,6BAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAY/G"}
1
+ {"version":3,"file":"l1_contract_addresses.d.ts","sourceRoot":"","sources":["../src/l1_contract_addresses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,2MAWnB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;KAC/B,CAAC,IAAI,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,GAAG,UAAU;CACrD,CAAC;AAIF,eAAO,MAAM,0BAA0B,EAAE,kBAAkB,CAAC,mBAAmB,CAmD9E,CAAC"}
@@ -1,4 +1,3 @@
1
- import { getConfigFromMappings } from '@aztec/foundation/config';
2
1
  import { EthAddress } from '@aztec/foundation/eth-address';
3
2
  /**
4
3
  * The names of the current L1 contract addresses.
@@ -12,6 +11,10 @@ export const l1ContractsNames = [
12
11
  'outboxAddress',
13
12
  'feeJuiceAddress',
14
13
  'feeJuicePortalAddress',
14
+ 'nomismatokopioAddress',
15
+ 'sysstiaAddress',
16
+ 'gerousiaAddress',
17
+ 'apellaAddress',
15
18
  ];
16
19
  const parseEnv = (val) => EthAddress.fromString(val);
17
20
  export const l1ContractAddressesMapping = {
@@ -45,33 +48,25 @@ export const l1ContractAddressesMapping = {
45
48
  description: 'The deployed L1 Fee Juice portal contract address.',
46
49
  parseEnv,
47
50
  },
51
+ nomismatokopioAddress: {
52
+ env: 'NOMISMATOKOPIO_CONTRACT_ADDRESS',
53
+ description: 'The deployed L1 nomismatokopio contract address',
54
+ parseEnv,
55
+ },
56
+ sysstiaAddress: {
57
+ env: 'SYSSTIA_CONTRACT_ADDRESS',
58
+ description: 'The deployed L1 sysstia contract address',
59
+ parseEnv,
60
+ },
61
+ gerousiaAddress: {
62
+ env: 'GEROUSIA_CONTRACT_ADDRESS',
63
+ description: 'The deployed L1 gerousia contract address',
64
+ parseEnv,
65
+ },
66
+ apellaAddress: {
67
+ env: 'APELLA_CONTRACT_ADDRESS',
68
+ description: 'The deployed L1 apella contract address',
69
+ parseEnv,
70
+ },
48
71
  };
49
- export function getL1ContractAddressesFromEnv() {
50
- return getConfigFromMappings(l1ContractAddressesMapping);
51
- }
52
- function convertToL1ContractAddresses(obj) {
53
- if (typeof obj !== 'object' || obj === null) {
54
- throw new Error('Object is not valid');
55
- }
56
- const result = {};
57
- for (const key of l1ContractsNames) {
58
- const value = obj[key];
59
- result[key] = EthAddress.fromString(value);
60
- }
61
- return result;
62
- }
63
- export async function getL1ContractAddressesFromUrl(url, log) {
64
- try {
65
- const response = await fetch(url);
66
- if (!response.ok) {
67
- throw new Error(`HTTP error when fetching L1 contracts from ${url}. Status: ${response.status}`);
68
- }
69
- const data = await response.json();
70
- return convertToL1ContractAddresses(data);
71
- }
72
- catch (error) {
73
- log.error(`Error fetching JSON from ${url}:`, error);
74
- throw error;
75
- }
76
- }
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfY29udHJhY3RfYWRkcmVzc2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2wxX2NvbnRyYWN0X2FkZHJlc3Nlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTJCLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRzNEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLHVCQUF1QjtDQUNmLENBQUM7QUFTWCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUU3RCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBNEM7SUFDakYsYUFBYSxFQUFFO1FBQ2IsR0FBRyxFQUFFLHlCQUF5QjtRQUM5QixXQUFXLEVBQUUsMENBQTBDO1FBQ3ZELFFBQVE7S0FDVDtJQUNELGVBQWUsRUFBRTtRQUNmLEdBQUcsRUFBRSwyQkFBMkI7UUFDaEMsV0FBVyxFQUFFLDRDQUE0QztRQUN6RCxRQUFRO0tBQ1Q7SUFDRCxZQUFZLEVBQUU7UUFDWixHQUFHLEVBQUUsd0JBQXdCO1FBQzdCLFdBQVcsRUFBRSx5Q0FBeUM7UUFDdEQsUUFBUTtLQUNUO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsR0FBRyxFQUFFLHlCQUF5QjtRQUM5QixXQUFXLEVBQUUsMENBQTBDO1FBQ3ZELFFBQVE7S0FDVDtJQUNELGVBQWUsRUFBRTtRQUNmLEdBQUcsRUFBRSw0QkFBNEI7UUFDakMsV0FBVyxFQUFFLDZDQUE2QztRQUMxRCxRQUFRO0tBQ1Q7SUFDRCxxQkFBcUIsRUFBRTtRQUNyQixHQUFHLEVBQUUsbUNBQW1DO1FBQ3hDLFdBQVcsRUFBRSxvREFBb0Q7UUFDakUsUUFBUTtLQUNUO0NBQ0YsQ0FBQztBQUVGLE1BQU0sVUFBVSw2QkFBNkI7SUFDM0MsT0FBTyxxQkFBcUIsQ0FBc0IsMEJBQTBCLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRUQsU0FBUyw0QkFBNEIsQ0FBQyxHQUFRO0lBQzVDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFpQyxFQUFFLENBQUM7SUFFaEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsT0FBTyxNQUE2QixDQUFDO0FBQ3ZDLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLDZCQUE2QixDQUFDLEdBQVcsRUFBRSxHQUFnQjtJQUMvRSxJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLEdBQUcsYUFBYSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNuRyxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsT0FBTyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLEdBQUcsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEdBQUcsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMifQ==
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfY29udHJhY3RfYWRkcmVzc2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2wxX2NvbnRyYWN0X2FkZHJlc3Nlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFM0Q7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsY0FBYztJQUNkLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsdUJBQXVCO0lBQ3ZCLHVCQUF1QjtJQUN2QixnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLGVBQWU7Q0FDUCxDQUFDO0FBU1gsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFN0QsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQTRDO0lBQ2pGLGFBQWEsRUFBRTtRQUNiLEdBQUcsRUFBRSx5QkFBeUI7UUFDOUIsV0FBVyxFQUFFLDBDQUEwQztRQUN2RCxRQUFRO0tBQ1Q7SUFDRCxlQUFlLEVBQUU7UUFDZixHQUFHLEVBQUUsMkJBQTJCO1FBQ2hDLFdBQVcsRUFBRSw0Q0FBNEM7UUFDekQsUUFBUTtLQUNUO0lBQ0QsWUFBWSxFQUFFO1FBQ1osR0FBRyxFQUFFLHdCQUF3QjtRQUM3QixXQUFXLEVBQUUseUNBQXlDO1FBQ3RELFFBQVE7S0FDVDtJQUNELGFBQWEsRUFBRTtRQUNiLEdBQUcsRUFBRSx5QkFBeUI7UUFDOUIsV0FBVyxFQUFFLDBDQUEwQztRQUN2RCxRQUFRO0tBQ1Q7SUFDRCxlQUFlLEVBQUU7UUFDZixHQUFHLEVBQUUsNEJBQTRCO1FBQ2pDLFdBQVcsRUFBRSw2Q0FBNkM7UUFDMUQsUUFBUTtLQUNUO0lBQ0QscUJBQXFCLEVBQUU7UUFDckIsR0FBRyxFQUFFLG1DQUFtQztRQUN4QyxXQUFXLEVBQUUsb0RBQW9EO1FBQ2pFLFFBQVE7S0FDVDtJQUNELHFCQUFxQixFQUFFO1FBQ3JCLEdBQUcsRUFBRSxpQ0FBaUM7UUFDdEMsV0FBVyxFQUFFLGlEQUFpRDtRQUM5RCxRQUFRO0tBQ1Q7SUFDRCxjQUFjLEVBQUU7UUFDZCxHQUFHLEVBQUUsMEJBQTBCO1FBQy9CLFdBQVcsRUFBRSwwQ0FBMEM7UUFDdkQsUUFBUTtLQUNUO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsR0FBRyxFQUFFLDJCQUEyQjtRQUNoQyxXQUFXLEVBQUUsMkNBQTJDO1FBQ3hELFFBQVE7S0FDVDtJQUNELGFBQWEsRUFBRTtRQUNiLEdBQUcsRUFBRSx5QkFBeUI7UUFDOUIsV0FBVyxFQUFFLHlDQUF5QztRQUN0RCxRQUFRO0tBQ1Q7Q0FDRixDQUFDIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/ethereum",
3
- "version": "0.59.0",
3
+ "version": "0.61.0",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -24,7 +24,8 @@
24
24
  "../package.common.json"
25
25
  ],
26
26
  "dependencies": {
27
- "@aztec/foundation": "0.59.0",
27
+ "@aztec/foundation": "0.61.0",
28
+ "@aztec/l1-artifacts": "0.61.0",
28
29
  "dotenv": "^16.0.3",
29
30
  "tslib": "^2.4.0",
30
31
  "viem": "^2.7.15"
@@ -2,6 +2,31 @@ import { type AztecAddress } from '@aztec/foundation/aztec-address';
2
2
  import { EthAddress } from '@aztec/foundation/eth-address';
3
3
  import { type Fr } from '@aztec/foundation/fields';
4
4
  import { type DebugLogger } from '@aztec/foundation/log';
5
+ import {
6
+ ApellaAbi,
7
+ ApellaBytecode,
8
+ FeeJuicePortalAbi,
9
+ FeeJuicePortalBytecode,
10
+ GerousiaAbi,
11
+ GerousiaBytecode,
12
+ InboxAbi,
13
+ InboxBytecode,
14
+ NomismatokopioAbi,
15
+ NomismatokopioBytecode,
16
+ OutboxAbi,
17
+ OutboxBytecode,
18
+ RegistryAbi,
19
+ RegistryBytecode,
20
+ RollupAbi,
21
+ RollupBytecode,
22
+ RollupLinkReferences,
23
+ SysstiaAbi,
24
+ SysstiaBytecode,
25
+ TestERC20Abi,
26
+ TestERC20Bytecode,
27
+ TxsDecoderAbi,
28
+ TxsDecoderBytecode,
29
+ } from '@aztec/l1-artifacts';
5
30
 
6
31
  import type { Abi, Narrow } from 'abitype';
7
32
  import {
@@ -21,7 +46,6 @@ import {
21
46
  http,
22
47
  numberToHex,
23
48
  padHex,
24
- zeroAddress,
25
49
  } from 'viem';
26
50
  import { type HDAccount, type PrivateKeyAccount, mnemonicToAccount, privateKeyToAccount } from 'viem/accounts';
27
51
  import { foundry } from 'viem/chains';
@@ -47,6 +71,20 @@ export type DeployL1Contracts = {
47
71
  l1ContractAddresses: L1ContractAddresses;
48
72
  };
49
73
 
74
+ export interface LinkReferences {
75
+ [fileName: string]: {
76
+ [contractName: string]: ReadonlyArray<{
77
+ start: number;
78
+ length: number;
79
+ }>;
80
+ };
81
+ }
82
+
83
+ export interface Libraries {
84
+ linkReferences: LinkReferences;
85
+ libraryCode: Record<string, ContractArtifacts>;
86
+ }
87
+
50
88
  /**
51
89
  * Contract artifacts
52
90
  */
@@ -59,6 +97,10 @@ export interface ContractArtifacts {
59
97
  * The contract bytecode
60
98
  */
61
99
  contractBytecode: Hex;
100
+ /**
101
+ * The contract libraries
102
+ */
103
+ libraries?: Libraries;
62
104
  }
63
105
 
64
106
  /**
@@ -89,8 +131,76 @@ export interface L1ContractArtifactsForDeployment {
89
131
  * Fee juice portal contract artifacts. Optional for now as gas is not strictly enforced
90
132
  */
91
133
  feeJuicePortal: ContractArtifacts;
134
+ /**
135
+ * Nomismatokopio contract artifacts.
136
+ */
137
+ nomismatokopio: ContractArtifacts;
138
+ /**
139
+ * Sysstia contract artifacts.
140
+ */
141
+ sysstia: ContractArtifacts;
142
+ /**
143
+ * Gerousia contract artifacts.
144
+ */
145
+ gerousia: ContractArtifacts;
146
+ /**
147
+ * Apella contract artifacts.
148
+ */
149
+ apella: ContractArtifacts;
92
150
  }
93
151
 
152
+ export const l1Artifacts: L1ContractArtifactsForDeployment = {
153
+ registry: {
154
+ contractAbi: RegistryAbi,
155
+ contractBytecode: RegistryBytecode,
156
+ },
157
+ inbox: {
158
+ contractAbi: InboxAbi,
159
+ contractBytecode: InboxBytecode,
160
+ },
161
+ outbox: {
162
+ contractAbi: OutboxAbi,
163
+ contractBytecode: OutboxBytecode,
164
+ },
165
+ rollup: {
166
+ contractAbi: RollupAbi,
167
+ contractBytecode: RollupBytecode,
168
+ libraries: {
169
+ linkReferences: RollupLinkReferences,
170
+ libraryCode: {
171
+ TxsDecoder: {
172
+ contractAbi: TxsDecoderAbi,
173
+ contractBytecode: TxsDecoderBytecode,
174
+ },
175
+ },
176
+ },
177
+ },
178
+ feeJuice: {
179
+ contractAbi: TestERC20Abi,
180
+ contractBytecode: TestERC20Bytecode,
181
+ },
182
+ feeJuicePortal: {
183
+ contractAbi: FeeJuicePortalAbi,
184
+ contractBytecode: FeeJuicePortalBytecode,
185
+ },
186
+ sysstia: {
187
+ contractAbi: SysstiaAbi,
188
+ contractBytecode: SysstiaBytecode,
189
+ },
190
+ nomismatokopio: {
191
+ contractAbi: NomismatokopioAbi,
192
+ contractBytecode: NomismatokopioBytecode,
193
+ },
194
+ gerousia: {
195
+ contractAbi: GerousiaAbi,
196
+ contractBytecode: GerousiaBytecode,
197
+ },
198
+ apella: {
199
+ contractAbi: ApellaAbi,
200
+ contractBytecode: ApellaBytecode,
201
+ },
202
+ };
203
+
94
204
  export interface DeployL1ContractsArgs {
95
205
  /**
96
206
  * The address of the L2 Fee Juice contract.
@@ -161,7 +271,6 @@ export function createL1Clients(
161
271
  * @param account - Private Key or HD Account that will deploy the contracts.
162
272
  * @param chain - The chain instance to deploy to.
163
273
  * @param logger - A logger object.
164
- * @param contractsToDeploy - The set of L1 artifacts to be deployed
165
274
  * @param args - Arguments for initialization of L1 contracts
166
275
  * @returns A list of ETH addresses of the deployed contracts.
167
276
  */
@@ -170,7 +279,6 @@ export const deployL1Contracts = async (
170
279
  account: HDAccount | PrivateKeyAccount,
171
280
  chain: Chain,
172
281
  logger: DebugLogger,
173
- contractsToDeploy: L1ContractArtifactsForDeployment,
174
282
  args: DeployL1ContractsArgs,
175
283
  ): Promise<DeployL1Contracts> => {
176
284
  // We are assuming that you are running this on a local anvil node which have 1s block times
@@ -186,7 +294,7 @@ export const deployL1Contracts = async (
186
294
  return await (await fetch(rpcUrl, content)).json();
187
295
  };
188
296
  if (isAnvilTestChain(chain.id)) {
189
- const interval = 12;
297
+ const interval = 12; // @todo #8084
190
298
  const res = await rpcCall('anvil_setBlockTimestampInterval', [interval]);
191
299
  if (res.error) {
192
300
  throw new Error(`Error setting block interval: ${res.error.message}`);
@@ -198,24 +306,61 @@ export const deployL1Contracts = async (
198
306
 
199
307
  const walletClient = createWalletClient({ account, chain, transport: http(rpcUrl) });
200
308
  const publicClient = createPublicClient({ chain, transport: http(rpcUrl) });
201
- const deployer = new L1Deployer(walletClient, publicClient, args.salt, logger);
309
+ // Governance stuff
310
+ const govDeployer = new L1Deployer(walletClient, publicClient, args.salt, logger);
202
311
 
203
- const registryAddress = await deployer.deploy(contractsToDeploy.registry, [account.address.toString()]);
312
+ const registryAddress = await govDeployer.deploy(l1Artifacts.registry, [account.address.toString()]);
204
313
  logger.info(`Deployed Registry at ${registryAddress}`);
205
314
 
206
- const feeJuiceAddress = await deployer.deploy(contractsToDeploy.feeJuice);
315
+ const feeJuiceAddress = await govDeployer.deploy(l1Artifacts.feeJuice);
207
316
  logger.info(`Deployed Fee Juice at ${feeJuiceAddress}`);
208
317
 
209
- const feeJuicePortalAddress = await deployer.deploy(contractsToDeploy.feeJuicePortal, [
210
- account.address.toString(),
318
+ // @todo #8084
319
+ // @note These numbers are just chosen to make testing simple.
320
+ const quorumSize = 6n;
321
+ const roundSize = 10n;
322
+ const gerousiaAddress = await govDeployer.deploy(l1Artifacts.gerousia, [
323
+ registryAddress.toString(),
324
+ quorumSize,
325
+ roundSize,
326
+ ]);
327
+ logger.info(`Deployed Gerousia at ${gerousiaAddress}`);
328
+
329
+ const apellaAddress = await govDeployer.deploy(l1Artifacts.apella, [
330
+ feeJuiceAddress.toString(),
331
+ gerousiaAddress.toString(),
332
+ ]);
333
+ logger.info(`Deployed Apella at ${apellaAddress}`);
334
+
335
+ const nomismatokopioAddress = await govDeployer.deploy(l1Artifacts.nomismatokopio, [
336
+ feeJuiceAddress.toString(),
337
+ 1n * 10n ** 18n, // @todo #8084
338
+ apellaAddress.toString(),
339
+ ]);
340
+ logger.info(`Deployed Nomismatokopio at ${nomismatokopioAddress}`);
341
+
342
+ const sysstiaAddress = await govDeployer.deploy(l1Artifacts.sysstia, [
343
+ feeJuiceAddress.toString(),
344
+ registryAddress.toString(),
345
+ apellaAddress.toString(),
346
+ ]);
347
+ logger.info(`Deployed Sysstia at ${sysstiaAddress}`);
348
+
349
+ await govDeployer.waitForDeployments();
350
+ logger.info(`All governance contracts deployed`);
351
+
352
+ const deployer = new L1Deployer(walletClient, publicClient, args.salt, logger);
353
+
354
+ const feeJuicePortalAddress = await deployer.deploy(l1Artifacts.feeJuicePortal, [
211
355
  registryAddress.toString(),
212
356
  feeJuiceAddress.toString(),
213
357
  args.l2FeeJuiceAddress.toString(),
214
358
  ]);
215
359
  logger.info(`Deployed Fee Juice Portal at ${feeJuicePortalAddress}`);
216
360
 
217
- const rollupAddress = await deployer.deploy(contractsToDeploy.rollup, [
361
+ const rollupAddress = await deployer.deploy(l1Artifacts.rollup, [
218
362
  feeJuicePortalAddress.toString(),
363
+ sysstiaAddress.toString(),
219
364
  args.vkTreeRoot.toString(),
220
365
  args.protocolContractTreeRoot.toString(),
221
366
  account.address.toString(),
@@ -224,23 +369,23 @@ export const deployL1Contracts = async (
224
369
  logger.info(`Deployed Rollup at ${rollupAddress}`);
225
370
 
226
371
  await deployer.waitForDeployments();
227
- logger.info(`All contracts deployed`);
372
+ logger.info(`All core contracts deployed`);
228
373
 
229
374
  const feeJuicePortal = getContract({
230
375
  address: feeJuicePortalAddress.toString(),
231
- abi: contractsToDeploy.feeJuicePortal.contractAbi,
376
+ abi: l1Artifacts.feeJuicePortal.contractAbi,
232
377
  client: walletClient,
233
378
  });
234
379
 
235
380
  const feeJuice = getContract({
236
381
  address: feeJuiceAddress.toString(),
237
- abi: contractsToDeploy.feeJuice.contractAbi,
382
+ abi: l1Artifacts.feeJuice.contractAbi,
238
383
  client: walletClient,
239
384
  });
240
385
 
241
386
  const rollup = getContract({
242
387
  address: getAddress(rollupAddress.toString()),
243
- abi: contractsToDeploy.rollup.contractAbi,
388
+ abi: l1Artifacts.rollup.contractAbi,
244
389
  client: walletClient,
245
390
  });
246
391
 
@@ -259,7 +404,7 @@ export const deployL1Contracts = async (
259
404
  await publicClient.waitForTransactionReceipt({ hash: mintTxHash });
260
405
  logger.info(`Funding fee juice portal contract with fee juice in ${mintTxHash}`);
261
406
 
262
- if ((await feeJuicePortal.read.owner([])) !== zeroAddress) {
407
+ if (!(await feeJuicePortal.read.initialized([]))) {
263
408
  const initPortalTxHash = await feeJuicePortal.write.initialize([]);
264
409
  txHashes.push(initPortalTxHash);
265
410
  logger.verbose(`Fee juice portal initializing in tx ${initPortalTxHash}`);
@@ -310,7 +455,7 @@ export const deployL1Contracts = async (
310
455
  // We need to call a function on the registry to set the various contract addresses.
311
456
  const registryContract = getContract({
312
457
  address: getAddress(registryAddress.toString()),
313
- abi: contractsToDeploy.registry.contractAbi,
458
+ abi: l1Artifacts.registry.contractAbi,
314
459
  client: walletClient,
315
460
  });
316
461
  if (!(await registryContract.read.isRollupRegistered([getAddress(rollupAddress.toString())]))) {
@@ -323,6 +468,20 @@ export const deployL1Contracts = async (
323
468
  logger.verbose(`Registry ${registryAddress} has already registered rollup ${rollupAddress}`);
324
469
  }
325
470
 
471
+ // If the owner is not the Apella contract, transfer ownership to the Apella contract
472
+ if ((await registryContract.read.owner([])) !== getAddress(apellaAddress.toString())) {
473
+ const transferOwnershipTxHash = await registryContract.write.transferOwnership(
474
+ [getAddress(apellaAddress.toString())],
475
+ {
476
+ account,
477
+ },
478
+ );
479
+ logger.verbose(
480
+ `Transferring the ownership of the registry contract at ${registryAddress} to the Apella ${apellaAddress} in tx ${transferOwnershipTxHash}`,
481
+ );
482
+ txHashes.push(transferOwnershipTxHash);
483
+ }
484
+
326
485
  // Wait for all actions to be mined
327
486
  await Promise.all(txHashes.map(txHash => publicClient.waitForTransactionReceipt({ hash: txHash })));
328
487
  logger.verbose(`All transactions for L1 deployment have been mined`);
@@ -334,6 +493,10 @@ export const deployL1Contracts = async (
334
493
  outboxAddress,
335
494
  feeJuiceAddress,
336
495
  feeJuicePortalAddress,
496
+ nomismatokopioAddress,
497
+ sysstiaAddress,
498
+ gerousiaAddress,
499
+ apellaAddress,
337
500
  };
338
501
 
339
502
  return {
@@ -355,10 +518,7 @@ class L1Deployer {
355
518
  this.salt = maybeSalt ? padHex(numberToHex(maybeSalt), { size: 32 }) : undefined;
356
519
  }
357
520
 
358
- async deploy(
359
- params: { contractAbi: Narrow<Abi | readonly unknown[]>; contractBytecode: Hex },
360
- args: readonly unknown[] = [],
361
- ): Promise<EthAddress> {
521
+ async deploy(params: ContractArtifacts, args: readonly unknown[] = []): Promise<EthAddress> {
362
522
  const { txHash, address } = await deployL1Contract(
363
523
  this.walletClient,
364
524
  this.publicClient,
@@ -366,6 +526,7 @@ class L1Deployer {
366
526
  params.contractBytecode,
367
527
  args,
368
528
  this.salt,
529
+ params.libraries,
369
530
  this.logger,
370
531
  );
371
532
  if (txHash) {
@@ -406,7 +567,7 @@ export function compileContract(
406
567
  enabled: true,
407
568
  runs: 200,
408
569
  },
409
- evmVersion: 'paris',
570
+ evmVersion: 'cancun',
410
571
  outputSelection: {
411
572
  '*': {
412
573
  '*': ['evm.bytecode.object', 'abi'],
@@ -441,11 +602,52 @@ export async function deployL1Contract(
441
602
  bytecode: Hex,
442
603
  args: readonly unknown[] = [],
443
604
  maybeSalt?: Hex,
605
+ libraries?: Libraries,
444
606
  logger?: DebugLogger,
445
607
  ): Promise<{ address: EthAddress; txHash: Hex | undefined }> {
446
608
  let txHash: Hex | undefined = undefined;
447
609
  let address: Hex | null | undefined = undefined;
448
610
 
611
+ if (libraries) {
612
+ // @note Assumes that we wont have nested external libraries.
613
+
614
+ const replacements: Record<string, EthAddress> = {};
615
+
616
+ for (const libraryName in libraries?.libraryCode) {
617
+ const lib = libraries.libraryCode[libraryName];
618
+
619
+ const { address } = await deployL1Contract(
620
+ walletClient,
621
+ publicClient,
622
+ lib.contractAbi,
623
+ lib.contractBytecode,
624
+ [],
625
+ maybeSalt,
626
+ undefined,
627
+ logger,
628
+ );
629
+
630
+ for (const linkRef in libraries.linkReferences) {
631
+ for (const c in libraries.linkReferences[linkRef]) {
632
+ const start = 2 + 2 * libraries.linkReferences[linkRef][c][0].start;
633
+ const length = 2 * libraries.linkReferences[linkRef][c][0].length;
634
+
635
+ const toReplace = bytecode.slice(start, start + length);
636
+ replacements[toReplace] = address;
637
+ }
638
+ }
639
+ }
640
+
641
+ const escapeRegExp = (s: string) => {
642
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // Escape special characters
643
+ };
644
+
645
+ for (const toReplace in replacements) {
646
+ const replacement = replacements[toReplace].toString().slice(2);
647
+ bytecode = bytecode.replace(new RegExp(escapeRegExp(toReplace), 'g'), replacement) as Hex;
648
+ }
649
+ }
650
+
449
651
  if (maybeSalt) {
450
652
  const salt = padHex(maybeSalt, { size: 32 });
451
653
  const deployer: Hex = '0x4e59b44847b379578588920cA78FbF26c0B4956C';
@@ -1,6 +1,5 @@
1
- import { type ConfigMappingsType, getConfigFromMappings } from '@aztec/foundation/config';
1
+ import { type ConfigMappingsType } from '@aztec/foundation/config';
2
2
  import { EthAddress } from '@aztec/foundation/eth-address';
3
- import type { DebugLogger } from '@aztec/foundation/log';
4
3
 
5
4
  /**
6
5
  * The names of the current L1 contract addresses.
@@ -14,6 +13,10 @@ export const l1ContractsNames = [
14
13
  'outboxAddress',
15
14
  'feeJuiceAddress',
16
15
  'feeJuicePortalAddress',
16
+ 'nomismatokopioAddress',
17
+ 'sysstiaAddress',
18
+ 'gerousiaAddress',
19
+ 'apellaAddress',
17
20
  ] as const;
18
21
 
19
22
  /**
@@ -56,37 +59,24 @@ export const l1ContractAddressesMapping: ConfigMappingsType<L1ContractAddresses>
56
59
  description: 'The deployed L1 Fee Juice portal contract address.',
57
60
  parseEnv,
58
61
  },
62
+ nomismatokopioAddress: {
63
+ env: 'NOMISMATOKOPIO_CONTRACT_ADDRESS',
64
+ description: 'The deployed L1 nomismatokopio contract address',
65
+ parseEnv,
66
+ },
67
+ sysstiaAddress: {
68
+ env: 'SYSSTIA_CONTRACT_ADDRESS',
69
+ description: 'The deployed L1 sysstia contract address',
70
+ parseEnv,
71
+ },
72
+ gerousiaAddress: {
73
+ env: 'GEROUSIA_CONTRACT_ADDRESS',
74
+ description: 'The deployed L1 gerousia contract address',
75
+ parseEnv,
76
+ },
77
+ apellaAddress: {
78
+ env: 'APELLA_CONTRACT_ADDRESS',
79
+ description: 'The deployed L1 apella contract address',
80
+ parseEnv,
81
+ },
59
82
  };
60
-
61
- export function getL1ContractAddressesFromEnv() {
62
- return getConfigFromMappings<L1ContractAddresses>(l1ContractAddressesMapping);
63
- }
64
-
65
- function convertToL1ContractAddresses(obj: any): L1ContractAddresses {
66
- if (typeof obj !== 'object' || obj === null) {
67
- throw new Error('Object is not valid');
68
- }
69
-
70
- const result: Partial<L1ContractAddresses> = {};
71
-
72
- for (const key of l1ContractsNames) {
73
- const value = obj[key];
74
- result[key] = EthAddress.fromString(value);
75
- }
76
-
77
- return result as L1ContractAddresses;
78
- }
79
-
80
- export async function getL1ContractAddressesFromUrl(url: string, log: DebugLogger): Promise<L1ContractAddresses> {
81
- try {
82
- const response = await fetch(url);
83
- if (!response.ok) {
84
- throw new Error(`HTTP error when fetching L1 contracts from ${url}. Status: ${response.status}`);
85
- }
86
- const data = await response.json();
87
- return convertToL1ContractAddresses(data);
88
- } catch (error) {
89
- log.error(`Error fetching JSON from ${url}:`, error);
90
- throw error;
91
- }
92
- }