@aztec/ethereum 0.47.0 → 0.48.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.
@@ -61,13 +61,13 @@ export interface L1ContractArtifactsForDeployment {
61
61
  */
62
62
  rollup: ContractArtifacts;
63
63
  /**
64
- * The token to pay for gas. This will be bridged to L2 via the gasPortal below
64
+ * The token to pay for gas. This will be bridged to L2 via the feeJuicePortal below
65
65
  */
66
- gasToken: ContractArtifacts;
66
+ feeJuice: ContractArtifacts;
67
67
  /**
68
68
  * Gas portal contract artifacts. Optional for now as gas is not strictly enforced
69
69
  */
70
- gasPortal: ContractArtifacts;
70
+ feeJuicePortal: ContractArtifacts;
71
71
  }
72
72
  export type L1Clients = {
73
73
  publicClient: PublicClient<HttpTransport, Chain>;
@@ -92,8 +92,9 @@ export declare function createL1Clients(rpcUrl: string, mnemonicOrPrivateKeyOrHd
92
92
  * @returns A list of ETH addresses of the deployed contracts.
93
93
  */
94
94
  export declare const deployL1Contracts: (rpcUrl: string, account: HDAccount | PrivateKeyAccount, chain: Chain, logger: DebugLogger, contractsToDeploy: L1ContractArtifactsForDeployment, args: {
95
- l2GasTokenAddress: AztecAddress;
95
+ l2FeeJuiceAddress: AztecAddress;
96
96
  vkTreeRoot: Fr;
97
+ assumeProvenUntil?: number;
97
98
  }) => Promise<DeployL1Contracts>;
98
99
  /**
99
100
  * Helper function to deploy ETH contracts.
@@ -1 +1 @@
1
- {"version":3,"file":"deploy_l1_contracts.d.ts","sourceRoot":"","sources":["../src/deploy_l1_contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,GAAG,EACR,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,YAAY,EAMlB,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAA0C,MAAM,eAAe,CAAC;AAG/G,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1D;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACjD;;OAEG;IACH,mBAAmB,EAAE,mBAAmB,CAAC;CAC1C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC,GAAG,GAAG,SAAS,OAAO,EAAE,CAAC,CAAC;IAC9C;;OAEG;IACH,gBAAgB,EAAE,GAAG,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C;;OAEG;IACH,KAAK,EAAE,iBAAiB,CAAC;IACzB;;OAEG;IACH,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;OAEG;IACH,kBAAkB,EAAE,iBAAiB,CAAC;IACtC;;OAEG;IACH,QAAQ,EAAE,iBAAiB,CAAC;IAC5B;;OAEG;IACH,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;OAEG;IACH,QAAQ,EAAE,iBAAiB,CAAC;IAC5B;;OAEG;IACH,SAAS,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACjD,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;CAC3D,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,+BAA+B,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,GAAG,SAAS,GAAG,iBAAiB,EACvF,KAAK,GAAE,KAAe,GACrB,SAAS,CAmBX;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,WACpB,MAAM,WACL,SAAS,GAAG,iBAAiB,SAC/B,KAAK,UACJ,WAAW,qBACA,gCAAgC,QAC7C;IAAE,iBAAiB,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,EAAE,CAAA;CAAE,KACxD,QAAQ,iBAAiB,CA2I3B,CAAC;AAGF;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,EACzD,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,EAChD,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG,SAAS,OAAO,EAAE,CAAC,EACrC,QAAQ,EAAE,GAAG,EACb,IAAI,GAAE,SAAS,OAAO,EAAO,GAC5B,OAAO,CAAC,UAAU,CAAC,CAkBrB"}
1
+ {"version":3,"file":"deploy_l1_contracts.d.ts","sourceRoot":"","sources":["../src/deploy_l1_contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,GAAG,EACR,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,YAAY,EAMlB,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAA0C,MAAM,eAAe,CAAC;AAG/G,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1D;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACjD;;OAEG;IACH,mBAAmB,EAAE,mBAAmB,CAAC;CAC1C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC,GAAG,GAAG,SAAS,OAAO,EAAE,CAAC,CAAC;IAC9C;;OAEG;IACH,gBAAgB,EAAE,GAAG,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C;;OAEG;IACH,KAAK,EAAE,iBAAiB,CAAC;IACzB;;OAEG;IACH,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;OAEG;IACH,kBAAkB,EAAE,iBAAiB,CAAC;IACtC;;OAEG;IACH,QAAQ,EAAE,iBAAiB,CAAC;IAC5B;;OAEG;IACH,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;OAEG;IACH,QAAQ,EAAE,iBAAiB,CAAC;IAC5B;;OAEG;IACH,cAAc,EAAE,iBAAiB,CAAC;CACnC;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACjD,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;CAC3D,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,+BAA+B,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,GAAG,SAAS,GAAG,iBAAiB,EACvF,KAAK,GAAE,KAAe,GACrB,SAAS,CAmBX;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,WACpB,MAAM,WACL,SAAS,GAAG,iBAAiB,SAC/B,KAAK,UACJ,WAAW,qBACA,gCAAgC,QAC7C;IAAE,iBAAiB,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,EAAE,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,KACpF,QAAQ,iBAAiB,CAyK3B,CAAC;AAGF;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,EACzD,YAAY,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,EAChD,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG,SAAS,OAAO,EAAE,CAAC,EACrC,QAAQ,EAAE,GAAG,EACb,IAAI,GAAE,SAAS,OAAO,EAAO,GAC5B,OAAO,CAAC,UAAU,CAAC,CAkBrB"}
@@ -37,6 +37,24 @@ export function createL1Clients(rpcUrl, mnemonicOrPrivateKeyOrHdAccount, chain =
37
37
  * @returns A list of ETH addresses of the deployed contracts.
38
38
  */
39
39
  export const deployL1Contracts = async (rpcUrl, account, chain, logger, contractsToDeploy, args) => {
40
+ // We are assuming that you are running this on a local anvil node which have 1s block times
41
+ // To align better with actual deployment, we update the block interval to 12s
42
+ // The code is same as `setBlockInterval` in `cheat_codes.ts`
43
+ const rpcCall = async (rpcUrl, method, params) => {
44
+ const paramsString = JSON.stringify(params);
45
+ const content = {
46
+ body: `{"jsonrpc":"2.0", "method": "${method}", "params": ${paramsString}, "id": 1}`,
47
+ method: 'POST',
48
+ headers: { 'Content-Type': 'application/json' },
49
+ };
50
+ return await (await fetch(rpcUrl, content)).json();
51
+ };
52
+ const interval = 12;
53
+ const res = await rpcCall(rpcUrl, 'anvil_setBlockTimestampInterval', [interval]);
54
+ if (res.error) {
55
+ throw new Error(`Error setting block interval: ${res.error.message}`);
56
+ }
57
+ logger.info(`Set block interval to ${interval}`);
40
58
  logger.debug('Deploying contracts...');
41
59
  const walletClient = createWalletClient({
42
60
  account,
@@ -51,15 +69,25 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
51
69
  logger.info(`Deployed Registry at ${registryAddress}`);
52
70
  const availabilityOracleAddress = await deployL1Contract(walletClient, publicClient, contractsToDeploy.availabilityOracle.contractAbi, contractsToDeploy.availabilityOracle.contractBytecode);
53
71
  logger.info(`Deployed AvailabilityOracle at ${availabilityOracleAddress}`);
54
- const gasTokenAddress = await deployL1Contract(walletClient, publicClient, contractsToDeploy.gasToken.contractAbi, contractsToDeploy.gasToken.contractBytecode);
55
- logger.info(`Deployed Gas Token at ${gasTokenAddress}`);
72
+ const feeJuiceAddress = await deployL1Contract(walletClient, publicClient, contractsToDeploy.feeJuice.contractAbi, contractsToDeploy.feeJuice.contractBytecode);
73
+ logger.info(`Deployed Fee Juice at ${feeJuiceAddress}`);
56
74
  const rollupAddress = await deployL1Contract(walletClient, publicClient, contractsToDeploy.rollup.contractAbi, contractsToDeploy.rollup.contractBytecode, [
57
75
  getAddress(registryAddress.toString()),
58
76
  getAddress(availabilityOracleAddress.toString()),
59
- getAddress(gasTokenAddress.toString()),
77
+ getAddress(feeJuiceAddress.toString()),
60
78
  args.vkTreeRoot.toString(),
61
79
  ]);
62
80
  logger.info(`Deployed Rollup at ${rollupAddress}`);
81
+ // Set initial blocks as proven if requested
82
+ if (args.assumeProvenUntil && args.assumeProvenUntil > 0) {
83
+ const rollup = getContract({
84
+ address: getAddress(rollupAddress.toString()),
85
+ abi: contractsToDeploy.rollup.contractAbi,
86
+ client: walletClient,
87
+ });
88
+ await rollup.write.setAssumeProvenUntilBlockNumber([BigInt(args.assumeProvenUntil)], { account });
89
+ logger.info(`Set Rollup assumedProvenUntil to ${args.assumeProvenUntil}`);
90
+ }
63
91
  // Inbox and Outbox are immutable and are deployed from Rollup's constructor so we just fetch them from the contract.
64
92
  let inboxAddress;
65
93
  {
@@ -88,39 +116,39 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
88
116
  client: walletClient,
89
117
  });
90
118
  await registryContract.write.upgrade([getAddress(rollupAddress.toString()), getAddress(inboxAddress.toString()), getAddress(outboxAddress.toString())], { account });
91
- // this contract remains uninitialized because at this point we don't know the address of the gas token on L2
92
- const gasPortalAddress = await deployL1Contract(walletClient, publicClient, contractsToDeploy.gasPortal.contractAbi, contractsToDeploy.gasPortal.contractBytecode);
93
- logger.info(`Deployed Gas Portal at ${gasPortalAddress}`);
94
- const gasPortal = getContract({
95
- address: gasPortalAddress.toString(),
96
- abi: contractsToDeploy.gasPortal.contractAbi,
119
+ // this contract remains uninitialized because at this point we don't know the address of the Fee Juice on L2
120
+ const feeJuicePortalAddress = await deployL1Contract(walletClient, publicClient, contractsToDeploy.feeJuicePortal.contractAbi, contractsToDeploy.feeJuicePortal.contractBytecode);
121
+ logger.info(`Deployed Gas Portal at ${feeJuicePortalAddress}`);
122
+ const feeJuicePortal = getContract({
123
+ address: feeJuicePortalAddress.toString(),
124
+ abi: contractsToDeploy.feeJuicePortal.contractAbi,
97
125
  client: walletClient,
98
126
  });
99
127
  await publicClient.waitForTransactionReceipt({
100
- hash: await gasPortal.write.initialize([
128
+ hash: await feeJuicePortal.write.initialize([
101
129
  registryAddress.toString(),
102
- gasTokenAddress.toString(),
103
- args.l2GasTokenAddress.toString(),
130
+ feeJuiceAddress.toString(),
131
+ args.l2FeeJuiceAddress.toString(),
104
132
  ]),
105
133
  });
106
- logger.info(`Initialized Gas Portal at ${gasPortalAddress} to bridge between L1 ${gasTokenAddress} to L2 ${args.l2GasTokenAddress}`);
107
- // fund the rollup contract with gas tokens
108
- const gasToken = getContract({
109
- address: gasTokenAddress.toString(),
110
- abi: contractsToDeploy.gasToken.contractAbi,
134
+ logger.info(`Initialized Gas Portal at ${feeJuicePortalAddress} to bridge between L1 ${feeJuiceAddress} to L2 ${args.l2FeeJuiceAddress}`);
135
+ // fund the rollup contract with Fee Juice
136
+ const feeJuice = getContract({
137
+ address: feeJuiceAddress.toString(),
138
+ abi: contractsToDeploy.feeJuice.contractAbi,
111
139
  client: walletClient,
112
140
  });
113
- const receipt = await gasToken.write.mint([rollupAddress.toString(), 100000000000000000000n], {});
141
+ const receipt = await feeJuice.write.mint([rollupAddress.toString(), 100000000000000000000n], {});
114
142
  await publicClient.waitForTransactionReceipt({ hash: receipt });
115
- logger.info(`Funded rollup contract with gas tokens`);
143
+ logger.info(`Funded rollup contract with Fee Juice`);
116
144
  const l1Contracts = {
117
145
  availabilityOracleAddress,
118
146
  rollupAddress,
119
147
  registryAddress,
120
148
  inboxAddress,
121
149
  outboxAddress,
122
- gasTokenAddress,
123
- gasPortalAddress,
150
+ feeJuiceAddress,
151
+ feeJuicePortalAddress,
124
152
  };
125
153
  return {
126
154
  walletClient,
@@ -152,4 +180,4 @@ export async function deployL1Contract(walletClient, publicClient, abi, bytecode
152
180
  return EthAddress.fromString(receipt.contractAddress);
153
181
  }
154
182
  // docs:end:deployL1Contract
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95X2wxX2NvbnRyYWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXBsb3lfbDFfY29udHJhY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUszRCxPQUFPLEVBT0wsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsV0FBVyxFQUNYLElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBMEMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQTJFdEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsTUFBYyxFQUNkLCtCQUF1RixFQUN2RixRQUFlLE9BQU87SUFFdEIsTUFBTSxTQUFTLEdBQ2IsT0FBTywrQkFBK0IsS0FBSyxRQUFRO1FBQ2pELENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxtQkFBbUIsQ0FBQywrQkFBZ0QsQ0FBQztZQUN2RSxDQUFDLENBQUMsaUJBQWlCLENBQUMsK0JBQStCLENBQUM7UUFDdEQsQ0FBQyxDQUFDLCtCQUErQixDQUFDO0lBRXRDLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO1FBQ3RDLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLEtBQUs7UUFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUN4QixDQUFDLENBQUM7SUFDSCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztRQUN0QyxLQUFLO1FBQ0wsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDeEIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7Ozs7Ozs7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
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95X2wxX2NvbnRyYWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXBsb3lfbDFfY29udHJhY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUszRCxPQUFPLEVBT0wsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsV0FBVyxFQUNYLElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBMEMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQTJFdEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsTUFBYyxFQUNkLCtCQUF1RixFQUN2RixRQUFlLE9BQU87SUFFdEIsTUFBTSxTQUFTLEdBQ2IsT0FBTywrQkFBK0IsS0FBSyxRQUFRO1FBQ2pELENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxtQkFBbUIsQ0FBQywrQkFBZ0QsQ0FBQztZQUN2RSxDQUFDLENBQUMsaUJBQWlCLENBQUMsK0JBQStCLENBQUM7UUFDdEQsQ0FBQyxDQUFDLCtCQUErQixDQUFDO0lBRXRDLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO1FBQ3RDLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLEtBQUs7UUFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUN4QixDQUFDLENBQUM7SUFDSCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztRQUN0QyxLQUFLO1FBQ0wsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDeEIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7Ozs7Ozs7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
package/dest/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import { type EthereumChain } from './ethereum_chain.js';
2
2
  export * from './deploy_l1_contracts.js';
3
3
  export * from './l1_contract_addresses.js';
4
4
  export * from './constants.js';
5
+ export * from './l1_reader.js';
5
6
  /**
6
7
  * Helper function to create an instance of Aztec Chain from an rpc url and api key.
7
8
  * @param rpcUrl - The rpc url of the chain or a chain identifier (e.g. 'testnet')
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAE/B;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CA+B5F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAE/B;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CA+B5F"}
package/dest/index.js CHANGED
@@ -2,6 +2,7 @@ import { foundry } from 'viem/chains';
2
2
  export * from './deploy_l1_contracts.js';
3
3
  export * from './l1_contract_addresses.js';
4
4
  export * from './constants.js';
5
+ export * from './l1_reader.js';
5
6
  /**
6
7
  * Helper function to create an instance of Aztec Chain from an rpc url and api key.
7
8
  * @param rpcUrl - The rpc url of the chain or a chain identifier (e.g. 'testnet')
@@ -41,4 +42,4 @@ export function createEthereumChain(rpcUrl, _chainId) {
41
42
  };
42
43
  }
43
44
  }
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUl0QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxnQkFBZ0IsQ0FBQztBQUUvQjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxRQUF5QjtJQUMzRSxJQUFJLE9BQWUsQ0FBQztJQUNwQixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUN0QixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sR0FBRyxRQUFRLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixPQUFPO1lBQ0wsU0FBUyxFQUFFO2dCQUNULEVBQUUsRUFBRSxPQUFPO2dCQUNYLElBQUksRUFBRSxVQUFVO2dCQUNoQixPQUFPLEVBQUU7b0JBQ1AsT0FBTyxFQUFFO3dCQUNQLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQztxQkFDZjtpQkFDRjtnQkFDRCxjQUFjLEVBQUU7b0JBQ2QsUUFBUSxFQUFFLEVBQUU7b0JBQ1osSUFBSSxFQUFFLE9BQU87b0JBQ2IsTUFBTSxFQUFFLEtBQUs7aUJBQ2Q7YUFDRjtZQUNELE1BQU07U0FDUCxDQUFDO0lBQ0osQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPO1lBQ0wsU0FBUyxFQUFFLE9BQU87WUFDbEIsTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyJ9
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUl0QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGdCQUFnQixDQUFDO0FBRS9COzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsTUFBYyxFQUFFLFFBQXlCO0lBQzNFLElBQUksT0FBZSxDQUFDO0lBQ3BCLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakMsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ3RCLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxHQUFHLFFBQVEsQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE9BQU87WUFDTCxTQUFTLEVBQUU7Z0JBQ1QsRUFBRSxFQUFFLE9BQU87Z0JBQ1gsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLE9BQU8sRUFBRTtvQkFDUCxPQUFPLEVBQUU7d0JBQ1AsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDO3FCQUNmO2lCQUNGO2dCQUNELGNBQWMsRUFBRTtvQkFDZCxRQUFRLEVBQUUsRUFBRTtvQkFDWixJQUFJLEVBQUUsT0FBTztvQkFDYixNQUFNLEVBQUUsS0FBSztpQkFDZDthQUNGO1lBQ0QsTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU87WUFDTCxTQUFTLEVBQUUsT0FBTztZQUNsQixNQUFNO1NBQ1AsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIn0=
@@ -1,23 +1,19 @@
1
+ import { type ConfigMappingsType } from '@aztec/foundation/config';
1
2
  import { EthAddress } from '@aztec/foundation/eth-address';
3
+ import type { DebugLogger } from '@aztec/foundation/log';
2
4
  /**
3
5
  * The names of the current L1 contract addresses.
4
6
  * NOTE: When changing this list, make sure to update CLI & CI scripts accordingly.
5
7
  * For reference: https://github.com/AztecProtocol/aztec-packages/pull/5553
6
8
  */
7
- export declare const l1ContractsNames: readonly ["availabilityOracleAddress", "rollupAddress", "registryAddress", "inboxAddress", "outboxAddress", "gasTokenAddress", "gasPortalAddress"];
9
+ export declare const l1ContractsNames: readonly ["availabilityOracleAddress", "rollupAddress", "registryAddress", "inboxAddress", "outboxAddress", "feeJuiceAddress", "feeJuicePortalAddress"];
8
10
  /**
9
11
  * Provides the directory of current L1 contract addresses
10
12
  */
11
13
  export type L1ContractAddresses = {
12
14
  [K in (typeof l1ContractsNames)[number]]: EthAddress;
13
15
  };
14
- export declare function getL1ContractAddressesFromEnv(): {
15
- availabilityOracleAddress: EthAddress;
16
- rollupAddress: EthAddress;
17
- registryAddress: EthAddress;
18
- inboxAddress: EthAddress;
19
- outboxAddress: EthAddress;
20
- gasTokenAddress: EthAddress;
21
- gasPortalAddress: EthAddress;
22
- };
16
+ export declare const l1ContractAddressesMapping: ConfigMappingsType<L1ContractAddresses>;
17
+ export declare function getL1ContractAddressesFromEnv(): L1ContractAddresses;
18
+ export declare function getL1ContractAddressesFromUrl(url: string, log: DebugLogger): Promise<L1ContractAddresses>;
23
19
  //# 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,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,oJAQnB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;KAC/B,CAAC,IAAI,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,GAAG,UAAU;CACrD,CAAC;AAEF,wBAAgB,6BAA6B;;;;;;;;EAwB5C"}
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,yJAQnB,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,CAoC9E,CAAC;AAEF,wBAAgB,6BAA6B,wBAE5C;AAiBD,wBAAsB,6BAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAY/G"}
@@ -1,3 +1,4 @@
1
+ import { getConfigFromMappings } from '@aztec/foundation/config';
1
2
  import { EthAddress } from '@aztec/foundation/eth-address';
2
3
  /**
3
4
  * The names of the current L1 contract addresses.
@@ -10,23 +11,73 @@ export const l1ContractsNames = [
10
11
  'registryAddress',
11
12
  'inboxAddress',
12
13
  'outboxAddress',
13
- 'gasTokenAddress',
14
- 'gasPortalAddress',
14
+ 'feeJuiceAddress',
15
+ 'feeJuicePortalAddress',
15
16
  ];
17
+ const parseEnv = (val) => EthAddress.fromString(val);
18
+ export const l1ContractAddressesMapping = {
19
+ availabilityOracleAddress: {
20
+ env: 'AVAILABILITY_ORACLE_CONTRACT_ADDRESS',
21
+ description: 'The deployed L1 availability oracle contract address.',
22
+ parseEnv,
23
+ },
24
+ rollupAddress: {
25
+ env: 'ROLLUP_CONTRACT_ADDRESS',
26
+ description: 'The deployed L1 rollup contract address.',
27
+ parseEnv,
28
+ },
29
+ registryAddress: {
30
+ env: 'REGISTRY_CONTRACT_ADDRESS',
31
+ description: 'The deployed L1 registry contract address.',
32
+ parseEnv,
33
+ },
34
+ inboxAddress: {
35
+ env: 'INBOX_CONTRACT_ADDRESS',
36
+ description: 'The deployed L1 inbox contract address.',
37
+ parseEnv,
38
+ },
39
+ outboxAddress: {
40
+ env: 'OUTBOX_CONTRACT_ADDRESS',
41
+ description: 'The deployed L1 outbox contract address.',
42
+ parseEnv,
43
+ },
44
+ feeJuiceAddress: {
45
+ env: 'FEE_JUICE_CONTRACT_ADDRESS',
46
+ description: 'The deployed L1 Fee Juice contract address.',
47
+ parseEnv,
48
+ },
49
+ feeJuicePortalAddress: {
50
+ env: 'FEE_JUICE_PORTAL_CONTRACT_ADDRESS',
51
+ description: 'The deployed L1 Fee Juice portal contract address.',
52
+ parseEnv,
53
+ },
54
+ };
16
55
  export function getL1ContractAddressesFromEnv() {
17
- const { AVAILABILITY_ORACLE_CONTRACT_ADDRESS, ROLLUP_CONTRACT_ADDRESS, REGISTRY_CONTRACT_ADDRESS, INBOX_CONTRACT_ADDRESS, OUTBOX_CONTRACT_ADDRESS, GAS_TOKEN_CONTRACT_ADDRESS, GAS_PORTAL_CONTRACT_ADDRESS, } = process.env;
18
- return {
19
- availabilityOracleAddress: AVAILABILITY_ORACLE_CONTRACT_ADDRESS
20
- ? EthAddress.fromString(AVAILABILITY_ORACLE_CONTRACT_ADDRESS)
21
- : EthAddress.ZERO,
22
- rollupAddress: ROLLUP_CONTRACT_ADDRESS ? EthAddress.fromString(ROLLUP_CONTRACT_ADDRESS) : EthAddress.ZERO,
23
- registryAddress: REGISTRY_CONTRACT_ADDRESS ? EthAddress.fromString(REGISTRY_CONTRACT_ADDRESS) : EthAddress.ZERO,
24
- inboxAddress: INBOX_CONTRACT_ADDRESS ? EthAddress.fromString(INBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
25
- outboxAddress: OUTBOX_CONTRACT_ADDRESS ? EthAddress.fromString(OUTBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
26
- gasTokenAddress: GAS_TOKEN_CONTRACT_ADDRESS ? EthAddress.fromString(GAS_TOKEN_CONTRACT_ADDRESS) : EthAddress.ZERO,
27
- gasPortalAddress: GAS_PORTAL_CONTRACT_ADDRESS
28
- ? EthAddress.fromString(GAS_PORTAL_CONTRACT_ADDRESS)
29
- : EthAddress.ZERO,
30
- };
56
+ return getConfigFromMappings(l1ContractAddressesMapping);
31
57
  }
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfY29udHJhY3RfYWRkcmVzc2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2wxX2NvbnRyYWN0X2FkZHJlc3Nlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFM0Q7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLDJCQUEyQjtJQUMzQixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGtCQUFrQjtDQUNWLENBQUM7QUFTWCxNQUFNLFVBQVUsNkJBQTZCO0lBQzNDLE1BQU0sRUFDSixvQ0FBb0MsRUFDcEMsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLDBCQUEwQixFQUMxQiwyQkFBMkIsR0FDNUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0lBRWhCLE9BQU87UUFDTCx5QkFBeUIsRUFBRSxvQ0FBb0M7WUFDN0QsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsb0NBQW9DLENBQUM7WUFDN0QsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQ25CLGFBQWEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUN6RyxlQUFlLEVBQUUseUJBQXlCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDL0csWUFBWSxFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQ3RHLGFBQWEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUN6RyxlQUFlLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDakgsZ0JBQWdCLEVBQUUsMkJBQTJCO1lBQzNDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDO1lBQ3BELENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSTtLQUNwQixDQUFDO0FBQ0osQ0FBQyJ9
58
+ function convertToL1ContractAddresses(obj) {
59
+ if (typeof obj !== 'object' || obj === null) {
60
+ throw new Error('Object is not valid');
61
+ }
62
+ const result = {};
63
+ for (const key of l1ContractsNames) {
64
+ const value = obj[key];
65
+ result[key] = EthAddress.fromString(value);
66
+ }
67
+ return result;
68
+ }
69
+ export async function getL1ContractAddressesFromUrl(url, log) {
70
+ try {
71
+ const response = await fetch(url);
72
+ if (!response.ok) {
73
+ throw new Error(`HTTP error when fetching L1 contracts from ${url}. Status: ${response.status}`);
74
+ }
75
+ const data = await response.json();
76
+ return convertToL1ContractAddresses(data);
77
+ }
78
+ catch (error) {
79
+ log.error(`Error fetching JSON from ${url}:`, error);
80
+ throw error;
81
+ }
82
+ }
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfY29udHJhY3RfYWRkcmVzc2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2wxX2NvbnRyYWN0X2FkZHJlc3Nlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTJCLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRzNEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QiwyQkFBMkI7SUFDM0IsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixjQUFjO0lBQ2QsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQix1QkFBdUI7Q0FDZixDQUFDO0FBU1gsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFN0QsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQTRDO0lBQ2pGLHlCQUF5QixFQUFFO1FBQ3pCLEdBQUcsRUFBRSxzQ0FBc0M7UUFDM0MsV0FBVyxFQUFFLHVEQUF1RDtRQUNwRSxRQUFRO0tBQ1Q7SUFDRCxhQUFhLEVBQUU7UUFDYixHQUFHLEVBQUUseUJBQXlCO1FBQzlCLFdBQVcsRUFBRSwwQ0FBMEM7UUFDdkQsUUFBUTtLQUNUO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsR0FBRyxFQUFFLDJCQUEyQjtRQUNoQyxXQUFXLEVBQUUsNENBQTRDO1FBQ3pELFFBQVE7S0FDVDtJQUNELFlBQVksRUFBRTtRQUNaLEdBQUcsRUFBRSx3QkFBd0I7UUFDN0IsV0FBVyxFQUFFLHlDQUF5QztRQUN0RCxRQUFRO0tBQ1Q7SUFDRCxhQUFhLEVBQUU7UUFDYixHQUFHLEVBQUUseUJBQXlCO1FBQzlCLFdBQVcsRUFBRSwwQ0FBMEM7UUFDdkQsUUFBUTtLQUNUO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsR0FBRyxFQUFFLDRCQUE0QjtRQUNqQyxXQUFXLEVBQUUsNkNBQTZDO1FBQzFELFFBQVE7S0FDVDtJQUNELHFCQUFxQixFQUFFO1FBQ3JCLEdBQUcsRUFBRSxtQ0FBbUM7UUFDeEMsV0FBVyxFQUFFLG9EQUFvRDtRQUNqRSxRQUFRO0tBQ1Q7Q0FDRixDQUFDO0FBRUYsTUFBTSxVQUFVLDZCQUE2QjtJQUMzQyxPQUFPLHFCQUFxQixDQUFzQiwwQkFBMEIsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRCxTQUFTLDRCQUE0QixDQUFDLEdBQVE7SUFDNUMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQWlDLEVBQUUsQ0FBQztJQUVoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxPQUFPLE1BQTZCLENBQUM7QUFDdkMsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsNkJBQTZCLENBQUMsR0FBVyxFQUFFLEdBQWdCO0lBQy9FLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsR0FBRyxhQUFhLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ25HLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxPQUFPLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsR0FBRyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsR0FBRyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckQsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyJ9
@@ -0,0 +1,21 @@
1
+ import { type ConfigMappingsType } from '@aztec/foundation/config';
2
+ import { type L1ContractAddresses } from './l1_contract_addresses.js';
3
+ /**
4
+ * Configuration of the L1GlobalReader.
5
+ */
6
+ export interface L1ReaderConfig {
7
+ /**
8
+ * The RPC Url of the ethereum host.
9
+ */
10
+ l1RpcUrl: string;
11
+ /**
12
+ * The chain ID of the ethereum host.
13
+ */
14
+ l1ChainId: number;
15
+ /**
16
+ * The deployed l1 contract addresses
17
+ */
18
+ l1Contracts: L1ContractAddresses;
19
+ }
20
+ export declare const l1ReaderConfigMappings: ConfigMappingsType<L1ReaderConfig>;
21
+ //# sourceMappingURL=l1_reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l1_reader.d.ts","sourceRoot":"","sources":["../src/l1_reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,EAAE,KAAK,mBAAmB,EAA8B,MAAM,4BAA4B,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,WAAW,EAAE,mBAAmB,CAAC;CAClC;AAED,eAAO,MAAM,sBAAsB,EAAE,kBAAkB,CAAC,cAAc,CAgBrE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { l1ContractAddressesMapping } from './l1_contract_addresses.js';
2
+ export const l1ReaderConfigMappings = {
3
+ l1RpcUrl: {
4
+ env: 'ETHEREUM_HOST',
5
+ description: 'The RPC Url of the ethereum host.',
6
+ },
7
+ l1ChainId: {
8
+ env: 'L1_CHAIN_ID',
9
+ parseEnv: (val) => +val,
10
+ defaultValue: 31337,
11
+ description: 'The chain ID of the ethereum host.',
12
+ },
13
+ // NOTE: Special case for l1Contracts
14
+ l1Contracts: {
15
+ description: 'The deployed L1 contract addresses',
16
+ defaultValue: l1ContractAddressesMapping,
17
+ },
18
+ };
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfcmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2wxX3JlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFxQmxHLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUF1QztJQUN4RSxRQUFRLEVBQUU7UUFDUixHQUFHLEVBQUUsZUFBZTtRQUNwQixXQUFXLEVBQUUsbUNBQW1DO0tBQ2pEO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsR0FBRyxFQUFFLGFBQWE7UUFDbEIsUUFBUSxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUc7UUFDL0IsWUFBWSxFQUFFLEtBQUs7UUFDbkIsV0FBVyxFQUFFLG9DQUFvQztLQUNsRDtJQUNELHFDQUFxQztJQUNyQyxXQUFXLEVBQUU7UUFDWCxXQUFXLEVBQUUsb0NBQW9DO1FBQ2pELFlBQVksRUFBRSwwQkFBMEI7S0FDekM7Q0FDRixDQUFDIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/ethereum",
3
- "version": "0.47.0",
3
+ "version": "0.48.0",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -24,7 +24,7 @@
24
24
  "../package.common.json"
25
25
  ],
26
26
  "dependencies": {
27
- "@aztec/foundation": "0.47.0",
27
+ "@aztec/foundation": "0.48.0",
28
28
  "dotenv": "^16.0.3",
29
29
  "tslib": "^2.4.0",
30
30
  "viem": "^2.7.15"
@@ -79,13 +79,13 @@ export interface L1ContractArtifactsForDeployment {
79
79
  */
80
80
  rollup: ContractArtifacts;
81
81
  /**
82
- * The token to pay for gas. This will be bridged to L2 via the gasPortal below
82
+ * The token to pay for gas. This will be bridged to L2 via the feeJuicePortal below
83
83
  */
84
- gasToken: ContractArtifacts;
84
+ feeJuice: ContractArtifacts;
85
85
  /**
86
86
  * Gas portal contract artifacts. Optional for now as gas is not strictly enforced
87
87
  */
88
- gasPortal: ContractArtifacts;
88
+ feeJuicePortal: ContractArtifacts;
89
89
  }
90
90
 
91
91
  export type L1Clients = {
@@ -141,8 +141,27 @@ export const deployL1Contracts = async (
141
141
  chain: Chain,
142
142
  logger: DebugLogger,
143
143
  contractsToDeploy: L1ContractArtifactsForDeployment,
144
- args: { l2GasTokenAddress: AztecAddress; vkTreeRoot: Fr },
144
+ args: { l2FeeJuiceAddress: AztecAddress; vkTreeRoot: Fr; assumeProvenUntil?: number },
145
145
  ): Promise<DeployL1Contracts> => {
146
+ // We are assuming that you are running this on a local anvil node which have 1s block times
147
+ // To align better with actual deployment, we update the block interval to 12s
148
+ // The code is same as `setBlockInterval` in `cheat_codes.ts`
149
+ const rpcCall = async (rpcUrl: string, method: string, params: any[]) => {
150
+ const paramsString = JSON.stringify(params);
151
+ const content = {
152
+ body: `{"jsonrpc":"2.0", "method": "${method}", "params": ${paramsString}, "id": 1}`,
153
+ method: 'POST',
154
+ headers: { 'Content-Type': 'application/json' },
155
+ };
156
+ return await (await fetch(rpcUrl, content)).json();
157
+ };
158
+ const interval = 12;
159
+ const res = await rpcCall(rpcUrl, 'anvil_setBlockTimestampInterval', [interval]);
160
+ if (res.error) {
161
+ throw new Error(`Error setting block interval: ${res.error.message}`);
162
+ }
163
+ logger.info(`Set block interval to ${interval}`);
164
+
146
165
  logger.debug('Deploying contracts...');
147
166
 
148
167
  const walletClient = createWalletClient({
@@ -171,14 +190,14 @@ export const deployL1Contracts = async (
171
190
  );
172
191
  logger.info(`Deployed AvailabilityOracle at ${availabilityOracleAddress}`);
173
192
 
174
- const gasTokenAddress = await deployL1Contract(
193
+ const feeJuiceAddress = await deployL1Contract(
175
194
  walletClient,
176
195
  publicClient,
177
- contractsToDeploy.gasToken.contractAbi,
178
- contractsToDeploy.gasToken.contractBytecode,
196
+ contractsToDeploy.feeJuice.contractAbi,
197
+ contractsToDeploy.feeJuice.contractBytecode,
179
198
  );
180
199
 
181
- logger.info(`Deployed Gas Token at ${gasTokenAddress}`);
200
+ logger.info(`Deployed Fee Juice at ${feeJuiceAddress}`);
182
201
 
183
202
  const rollupAddress = await deployL1Contract(
184
203
  walletClient,
@@ -188,12 +207,23 @@ export const deployL1Contracts = async (
188
207
  [
189
208
  getAddress(registryAddress.toString()),
190
209
  getAddress(availabilityOracleAddress.toString()),
191
- getAddress(gasTokenAddress.toString()),
210
+ getAddress(feeJuiceAddress.toString()),
192
211
  args.vkTreeRoot.toString(),
193
212
  ],
194
213
  );
195
214
  logger.info(`Deployed Rollup at ${rollupAddress}`);
196
215
 
216
+ // Set initial blocks as proven if requested
217
+ if (args.assumeProvenUntil && args.assumeProvenUntil > 0) {
218
+ const rollup = getContract({
219
+ address: getAddress(rollupAddress.toString()),
220
+ abi: contractsToDeploy.rollup.contractAbi,
221
+ client: walletClient,
222
+ });
223
+ await rollup.write.setAssumeProvenUntilBlockNumber([BigInt(args.assumeProvenUntil)], { account });
224
+ logger.info(`Set Rollup assumedProvenUntil to ${args.assumeProvenUntil}`);
225
+ }
226
+
197
227
  // Inbox and Outbox are immutable and are deployed from Rollup's constructor so we just fetch them from the contract.
198
228
  let inboxAddress!: EthAddress;
199
229
  {
@@ -228,43 +258,43 @@ export const deployL1Contracts = async (
228
258
  { account },
229
259
  );
230
260
 
231
- // this contract remains uninitialized because at this point we don't know the address of the gas token on L2
232
- const gasPortalAddress = await deployL1Contract(
261
+ // this contract remains uninitialized because at this point we don't know the address of the Fee Juice on L2
262
+ const feeJuicePortalAddress = await deployL1Contract(
233
263
  walletClient,
234
264
  publicClient,
235
- contractsToDeploy.gasPortal.contractAbi,
236
- contractsToDeploy.gasPortal.contractBytecode,
265
+ contractsToDeploy.feeJuicePortal.contractAbi,
266
+ contractsToDeploy.feeJuicePortal.contractBytecode,
237
267
  );
238
268
 
239
- logger.info(`Deployed Gas Portal at ${gasPortalAddress}`);
269
+ logger.info(`Deployed Gas Portal at ${feeJuicePortalAddress}`);
240
270
 
241
- const gasPortal = getContract({
242
- address: gasPortalAddress.toString(),
243
- abi: contractsToDeploy.gasPortal.contractAbi,
271
+ const feeJuicePortal = getContract({
272
+ address: feeJuicePortalAddress.toString(),
273
+ abi: contractsToDeploy.feeJuicePortal.contractAbi,
244
274
  client: walletClient,
245
275
  });
246
276
 
247
277
  await publicClient.waitForTransactionReceipt({
248
- hash: await gasPortal.write.initialize([
278
+ hash: await feeJuicePortal.write.initialize([
249
279
  registryAddress.toString(),
250
- gasTokenAddress.toString(),
251
- args.l2GasTokenAddress.toString(),
280
+ feeJuiceAddress.toString(),
281
+ args.l2FeeJuiceAddress.toString(),
252
282
  ]),
253
283
  });
254
284
 
255
285
  logger.info(
256
- `Initialized Gas Portal at ${gasPortalAddress} to bridge between L1 ${gasTokenAddress} to L2 ${args.l2GasTokenAddress}`,
286
+ `Initialized Gas Portal at ${feeJuicePortalAddress} to bridge between L1 ${feeJuiceAddress} to L2 ${args.l2FeeJuiceAddress}`,
257
287
  );
258
288
 
259
- // fund the rollup contract with gas tokens
260
- const gasToken = getContract({
261
- address: gasTokenAddress.toString(),
262
- abi: contractsToDeploy.gasToken.contractAbi,
289
+ // fund the rollup contract with Fee Juice
290
+ const feeJuice = getContract({
291
+ address: feeJuiceAddress.toString(),
292
+ abi: contractsToDeploy.feeJuice.contractAbi,
263
293
  client: walletClient,
264
294
  });
265
- const receipt = await gasToken.write.mint([rollupAddress.toString(), 100000000000000000000n], {} as any);
295
+ const receipt = await feeJuice.write.mint([rollupAddress.toString(), 100000000000000000000n], {} as any);
266
296
  await publicClient.waitForTransactionReceipt({ hash: receipt });
267
- logger.info(`Funded rollup contract with gas tokens`);
297
+ logger.info(`Funded rollup contract with Fee Juice`);
268
298
 
269
299
  const l1Contracts: L1ContractAddresses = {
270
300
  availabilityOracleAddress,
@@ -272,8 +302,8 @@ export const deployL1Contracts = async (
272
302
  registryAddress,
273
303
  inboxAddress,
274
304
  outboxAddress,
275
- gasTokenAddress,
276
- gasPortalAddress,
305
+ feeJuiceAddress,
306
+ feeJuicePortalAddress,
277
307
  };
278
308
 
279
309
  return {
package/src/index.ts CHANGED
@@ -5,6 +5,7 @@ import { type EthereumChain } from './ethereum_chain.js';
5
5
  export * from './deploy_l1_contracts.js';
6
6
  export * from './l1_contract_addresses.js';
7
7
  export * from './constants.js';
8
+ export * from './l1_reader.js';
8
9
 
9
10
  /**
10
11
  * Helper function to create an instance of Aztec Chain from an rpc url and api key.
@@ -1,4 +1,6 @@
1
+ import { type ConfigMappingsType, getConfigFromMappings } from '@aztec/foundation/config';
1
2
  import { EthAddress } from '@aztec/foundation/eth-address';
3
+ import type { DebugLogger } from '@aztec/foundation/log';
2
4
 
3
5
  /**
4
6
  * The names of the current L1 contract addresses.
@@ -11,8 +13,8 @@ export const l1ContractsNames = [
11
13
  'registryAddress',
12
14
  'inboxAddress',
13
15
  'outboxAddress',
14
- 'gasTokenAddress',
15
- 'gasPortalAddress',
16
+ 'feeJuiceAddress',
17
+ 'feeJuicePortalAddress',
16
18
  ] as const;
17
19
 
18
20
  /**
@@ -22,28 +24,75 @@ export type L1ContractAddresses = {
22
24
  [K in (typeof l1ContractsNames)[number]]: EthAddress;
23
25
  };
24
26
 
27
+ const parseEnv = (val: string) => EthAddress.fromString(val);
28
+
29
+ export const l1ContractAddressesMapping: ConfigMappingsType<L1ContractAddresses> = {
30
+ availabilityOracleAddress: {
31
+ env: 'AVAILABILITY_ORACLE_CONTRACT_ADDRESS',
32
+ description: 'The deployed L1 availability oracle contract address.',
33
+ parseEnv,
34
+ },
35
+ rollupAddress: {
36
+ env: 'ROLLUP_CONTRACT_ADDRESS',
37
+ description: 'The deployed L1 rollup contract address.',
38
+ parseEnv,
39
+ },
40
+ registryAddress: {
41
+ env: 'REGISTRY_CONTRACT_ADDRESS',
42
+ description: 'The deployed L1 registry contract address.',
43
+ parseEnv,
44
+ },
45
+ inboxAddress: {
46
+ env: 'INBOX_CONTRACT_ADDRESS',
47
+ description: 'The deployed L1 inbox contract address.',
48
+ parseEnv,
49
+ },
50
+ outboxAddress: {
51
+ env: 'OUTBOX_CONTRACT_ADDRESS',
52
+ description: 'The deployed L1 outbox contract address.',
53
+ parseEnv,
54
+ },
55
+ feeJuiceAddress: {
56
+ env: 'FEE_JUICE_CONTRACT_ADDRESS',
57
+ description: 'The deployed L1 Fee Juice contract address.',
58
+ parseEnv,
59
+ },
60
+ feeJuicePortalAddress: {
61
+ env: 'FEE_JUICE_PORTAL_CONTRACT_ADDRESS',
62
+ description: 'The deployed L1 Fee Juice portal contract address.',
63
+ parseEnv,
64
+ },
65
+ };
66
+
25
67
  export function getL1ContractAddressesFromEnv() {
26
- const {
27
- AVAILABILITY_ORACLE_CONTRACT_ADDRESS,
28
- ROLLUP_CONTRACT_ADDRESS,
29
- REGISTRY_CONTRACT_ADDRESS,
30
- INBOX_CONTRACT_ADDRESS,
31
- OUTBOX_CONTRACT_ADDRESS,
32
- GAS_TOKEN_CONTRACT_ADDRESS,
33
- GAS_PORTAL_CONTRACT_ADDRESS,
34
- } = process.env;
35
-
36
- return {
37
- availabilityOracleAddress: AVAILABILITY_ORACLE_CONTRACT_ADDRESS
38
- ? EthAddress.fromString(AVAILABILITY_ORACLE_CONTRACT_ADDRESS)
39
- : EthAddress.ZERO,
40
- rollupAddress: ROLLUP_CONTRACT_ADDRESS ? EthAddress.fromString(ROLLUP_CONTRACT_ADDRESS) : EthAddress.ZERO,
41
- registryAddress: REGISTRY_CONTRACT_ADDRESS ? EthAddress.fromString(REGISTRY_CONTRACT_ADDRESS) : EthAddress.ZERO,
42
- inboxAddress: INBOX_CONTRACT_ADDRESS ? EthAddress.fromString(INBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
43
- outboxAddress: OUTBOX_CONTRACT_ADDRESS ? EthAddress.fromString(OUTBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
44
- gasTokenAddress: GAS_TOKEN_CONTRACT_ADDRESS ? EthAddress.fromString(GAS_TOKEN_CONTRACT_ADDRESS) : EthAddress.ZERO,
45
- gasPortalAddress: GAS_PORTAL_CONTRACT_ADDRESS
46
- ? EthAddress.fromString(GAS_PORTAL_CONTRACT_ADDRESS)
47
- : EthAddress.ZERO,
48
- };
68
+ return getConfigFromMappings<L1ContractAddresses>(l1ContractAddressesMapping);
69
+ }
70
+
71
+ function convertToL1ContractAddresses(obj: any): L1ContractAddresses {
72
+ if (typeof obj !== 'object' || obj === null) {
73
+ throw new Error('Object is not valid');
74
+ }
75
+
76
+ const result: Partial<L1ContractAddresses> = {};
77
+
78
+ for (const key of l1ContractsNames) {
79
+ const value = obj[key];
80
+ result[key] = EthAddress.fromString(value);
81
+ }
82
+
83
+ return result as L1ContractAddresses;
84
+ }
85
+
86
+ export async function getL1ContractAddressesFromUrl(url: string, log: DebugLogger): Promise<L1ContractAddresses> {
87
+ try {
88
+ const response = await fetch(url);
89
+ if (!response.ok) {
90
+ throw new Error(`HTTP error when fetching L1 contracts from ${url}. Status: ${response.status}`);
91
+ }
92
+ const data = await response.json();
93
+ return convertToL1ContractAddresses(data);
94
+ } catch (error) {
95
+ log.error(`Error fetching JSON from ${url}:`, error);
96
+ throw error;
97
+ }
49
98
  }
@@ -0,0 +1,40 @@
1
+ import { type ConfigMappingsType } from '@aztec/foundation/config';
2
+
3
+ import { type L1ContractAddresses, l1ContractAddressesMapping } from './l1_contract_addresses.js';
4
+
5
+ /**
6
+ * Configuration of the L1GlobalReader.
7
+ */
8
+ export interface L1ReaderConfig {
9
+ /**
10
+ * The RPC Url of the ethereum host.
11
+ */
12
+ l1RpcUrl: string;
13
+ /**
14
+ * The chain ID of the ethereum host.
15
+ */
16
+ l1ChainId: number;
17
+
18
+ /**
19
+ * The deployed l1 contract addresses
20
+ */
21
+ l1Contracts: L1ContractAddresses;
22
+ }
23
+
24
+ export const l1ReaderConfigMappings: ConfigMappingsType<L1ReaderConfig> = {
25
+ l1RpcUrl: {
26
+ env: 'ETHEREUM_HOST',
27
+ description: 'The RPC Url of the ethereum host.',
28
+ },
29
+ l1ChainId: {
30
+ env: 'L1_CHAIN_ID',
31
+ parseEnv: (val: string) => +val,
32
+ defaultValue: 31337,
33
+ description: 'The chain ID of the ethereum host.',
34
+ },
35
+ // NOTE: Special case for l1Contracts
36
+ l1Contracts: {
37
+ description: 'The deployed L1 contract addresses',
38
+ defaultValue: l1ContractAddressesMapping,
39
+ },
40
+ };