@aztec/ethereum 0.51.0 → 0.51.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -96,6 +96,7 @@ export declare const deployL1Contracts: (rpcUrl: string, account: HDAccount | Pr
|
|
|
96
96
|
vkTreeRoot: Fr;
|
|
97
97
|
assumeProvenUntil?: number;
|
|
98
98
|
salt: number | undefined;
|
|
99
|
+
initialValidators?: EthAddress[];
|
|
99
100
|
}) => Promise<DeployL1Contracts>;
|
|
100
101
|
/**
|
|
101
102
|
* Helper function to deploy ETH contracts.
|
|
@@ -104,7 +105,11 @@ export declare const deployL1Contracts: (rpcUrl: string, account: HDAccount | Pr
|
|
|
104
105
|
* @param abi - The ETH contract's ABI (as abitype's Abi).
|
|
105
106
|
* @param bytecode - The ETH contract's bytecode.
|
|
106
107
|
* @param args - Constructor arguments for the contract.
|
|
108
|
+
* @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).
|
|
107
109
|
* @returns The ETH address the contract was deployed to.
|
|
108
110
|
*/
|
|
109
|
-
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<
|
|
111
|
+
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<{
|
|
112
|
+
address: EthAddress;
|
|
113
|
+
txHash: Hex | undefined;
|
|
114
|
+
}>;
|
|
110
115
|
//# sourceMappingURL=deploy_l1_contracts.d.ts.map
|
|
@@ -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,EAYlB,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;
|
|
1
|
+
{"version":3,"file":"deploy_l1_contracts.d.ts","sourceRoot":"","sources":["../src/deploy_l1_contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,7 +40,7 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
|
|
|
40
40
|
// We are assuming that you are running this on a local anvil node which have 1s block times
|
|
41
41
|
// To align better with actual deployment, we update the block interval to 12s
|
|
42
42
|
// The code is same as `setBlockInterval` in `cheat_codes.ts`
|
|
43
|
-
const rpcCall = async (
|
|
43
|
+
const rpcCall = async (method, params) => {
|
|
44
44
|
const paramsString = JSON.stringify(params);
|
|
45
45
|
const content = {
|
|
46
46
|
body: `{"jsonrpc":"2.0", "method": "${method}", "params": ${paramsString}, "id": 1}`,
|
|
@@ -51,7 +51,7 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
|
|
|
51
51
|
};
|
|
52
52
|
if (chain.id == foundry.id) {
|
|
53
53
|
const interval = 12;
|
|
54
|
-
const res = await rpcCall(
|
|
54
|
+
const res = await rpcCall('anvil_setBlockTimestampInterval', [interval]);
|
|
55
55
|
if (res.error) {
|
|
56
56
|
throw new Error(`Error setting block interval: ${res.error.message}`);
|
|
57
57
|
}
|
|
@@ -69,75 +69,85 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
|
|
|
69
69
|
logger.info(`Deployed Fee Juice at ${feeJuiceAddress}`);
|
|
70
70
|
const feeJuicePortalAddress = await deployer.deploy(contractsToDeploy.feeJuicePortal, [account.address.toString()]);
|
|
71
71
|
logger.info(`Deployed Gas Portal at ${feeJuicePortalAddress}`);
|
|
72
|
+
const rollupAddress = await deployer.deploy(contractsToDeploy.rollup, [
|
|
73
|
+
getAddress(registryAddress.toString()),
|
|
74
|
+
getAddress(availabilityOracleAddress.toString()),
|
|
75
|
+
getAddress(feeJuicePortalAddress.toString()),
|
|
76
|
+
args.vkTreeRoot.toString(),
|
|
77
|
+
account.address.toString(),
|
|
78
|
+
args.initialValidators?.map(v => v.toString()) ?? [],
|
|
79
|
+
]);
|
|
80
|
+
logger.info(`Deployed Rollup at ${rollupAddress}`);
|
|
81
|
+
await deployer.waitForDeployments();
|
|
82
|
+
logger.info(`All contracts deployed`);
|
|
72
83
|
const feeJuicePortal = getContract({
|
|
73
84
|
address: feeJuicePortalAddress.toString(),
|
|
74
85
|
abi: contractsToDeploy.feeJuicePortal.contractAbi,
|
|
75
86
|
client: walletClient,
|
|
76
87
|
});
|
|
77
|
-
// fund the portal contract with Fee Juice
|
|
78
88
|
const feeJuice = getContract({
|
|
79
89
|
address: feeJuiceAddress.toString(),
|
|
80
90
|
abi: contractsToDeploy.feeJuice.contractAbi,
|
|
81
91
|
client: walletClient,
|
|
82
92
|
});
|
|
93
|
+
const rollup = getContract({
|
|
94
|
+
address: getAddress(rollupAddress.toString()),
|
|
95
|
+
abi: contractsToDeploy.rollup.contractAbi,
|
|
96
|
+
client: walletClient,
|
|
97
|
+
});
|
|
98
|
+
// Transaction hashes to await
|
|
99
|
+
const txHashes = [];
|
|
83
100
|
// @note This value MUST match what is in `constants.nr`. It is currently specified here instead of just importing
|
|
84
101
|
// because there is circular dependency hell. This is a temporary solution. #3342
|
|
102
|
+
// @todo #8084
|
|
103
|
+
// fund the portal contract with Fee Juice
|
|
85
104
|
const FEE_JUICE_INITIAL_MINT = 20000000000;
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
logger.info(`
|
|
105
|
+
const mintTxHash = await feeJuice.write.mint([feeJuicePortalAddress.toString(), FEE_JUICE_INITIAL_MINT], {});
|
|
106
|
+
txHashes.push(mintTxHash);
|
|
107
|
+
logger.info(`Funding fee juice portal contract with fee juice in ${mintTxHash}`);
|
|
89
108
|
if ((await feeJuicePortal.read.registry([])) === zeroAddress) {
|
|
90
|
-
await
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
});
|
|
97
|
-
logger.verbose(`Fee juice portal initialized with registry ${registryAddress.toString()}`);
|
|
109
|
+
const initPortalTxHash = await feeJuicePortal.write.initialize([
|
|
110
|
+
registryAddress.toString(),
|
|
111
|
+
feeJuiceAddress.toString(),
|
|
112
|
+
args.l2FeeJuiceAddress.toString(),
|
|
113
|
+
]);
|
|
114
|
+
txHashes.push(initPortalTxHash);
|
|
115
|
+
logger.verbose(`Fee juice portal initializing with registry ${registryAddress.toString()} in tx ${initPortalTxHash}`);
|
|
98
116
|
}
|
|
99
117
|
else {
|
|
100
118
|
logger.verbose(`Fee juice portal is already initialized`);
|
|
101
119
|
}
|
|
102
120
|
logger.info(`Initialized Gas Portal at ${feeJuicePortalAddress} to bridge between L1 ${feeJuiceAddress} to L2 ${args.l2FeeJuiceAddress}`);
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
121
|
+
if (chain.id == foundry.id) {
|
|
122
|
+
// @note We make a time jump PAST the very first slot to not have to deal with the edge case of the first slot.
|
|
123
|
+
// The edge case being that the genesis block is already occupying slot 0, so we cannot have another block.
|
|
124
|
+
try {
|
|
125
|
+
// Need to get the time
|
|
126
|
+
const currentSlot = (await rollup.read.getCurrentSlot([]));
|
|
127
|
+
if (BigInt(currentSlot) === 0n) {
|
|
128
|
+
const ts = Number(await rollup.read.getTimestampForSlot([1]));
|
|
129
|
+
await rpcCall('evm_setNextBlockTimestamp', [ts]);
|
|
130
|
+
await rpcCall('hardhat_mine', [1]);
|
|
131
|
+
const currentSlot = (await rollup.read.getCurrentSlot([]));
|
|
132
|
+
if (BigInt(currentSlot) !== 1n) {
|
|
133
|
+
throw new Error(`Error jumping time: current slot is ${currentSlot}`);
|
|
134
|
+
}
|
|
135
|
+
logger.info(`Jumped to slot 1`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
throw new Error(`Error jumping time: ${e}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
111
142
|
// Set initial blocks as proven if requested
|
|
112
143
|
if (args.assumeProvenUntil && args.assumeProvenUntil > 0) {
|
|
113
|
-
const rollup = getContract({
|
|
114
|
-
address: getAddress(rollupAddress.toString()),
|
|
115
|
-
abi: contractsToDeploy.rollup.contractAbi,
|
|
116
|
-
client: walletClient,
|
|
117
|
-
});
|
|
118
144
|
await rollup.write.setAssumeProvenUntilBlockNumber([BigInt(args.assumeProvenUntil)], { account });
|
|
119
145
|
logger.info(`Set Rollup assumedProvenUntil to ${args.assumeProvenUntil}`);
|
|
120
146
|
}
|
|
121
147
|
// Inbox and Outbox are immutable and are deployed from Rollup's constructor so we just fetch them from the contract.
|
|
122
|
-
|
|
123
|
-
{
|
|
124
|
-
const rollup = getContract({
|
|
125
|
-
address: getAddress(rollupAddress.toString()),
|
|
126
|
-
abi: contractsToDeploy.rollup.contractAbi,
|
|
127
|
-
client: publicClient,
|
|
128
|
-
});
|
|
129
|
-
inboxAddress = EthAddress.fromString((await rollup.read.INBOX([])));
|
|
130
|
-
}
|
|
148
|
+
const inboxAddress = EthAddress.fromString((await rollup.read.INBOX([])));
|
|
131
149
|
logger.info(`Inbox available at ${inboxAddress}`);
|
|
132
|
-
|
|
133
|
-
{
|
|
134
|
-
const rollup = getContract({
|
|
135
|
-
address: getAddress(rollupAddress.toString()),
|
|
136
|
-
abi: contractsToDeploy.rollup.contractAbi,
|
|
137
|
-
client: publicClient,
|
|
138
|
-
});
|
|
139
|
-
outboxAddress = EthAddress.fromString((await rollup.read.OUTBOX([])));
|
|
140
|
-
}
|
|
150
|
+
const outboxAddress = EthAddress.fromString((await rollup.read.OUTBOX([])));
|
|
141
151
|
logger.info(`Outbox available at ${outboxAddress}`);
|
|
142
152
|
// We need to call a function on the registry to set the various contract addresses.
|
|
143
153
|
const registryContract = getContract({
|
|
@@ -146,12 +156,16 @@ export const deployL1Contracts = async (rpcUrl, account, chain, logger, contract
|
|
|
146
156
|
client: walletClient,
|
|
147
157
|
});
|
|
148
158
|
if (!(await registryContract.read.isRollupRegistered([getAddress(rollupAddress.toString())]))) {
|
|
149
|
-
await registryContract.write.upgrade([getAddress(rollupAddress.toString())], { account });
|
|
150
|
-
logger.verbose(`
|
|
159
|
+
const upgradeTxHash = await registryContract.write.upgrade([getAddress(rollupAddress.toString())], { account });
|
|
160
|
+
logger.verbose(`Upgrading registry contract at ${registryAddress} to rollup ${rollupAddress} in tx ${upgradeTxHash}`);
|
|
161
|
+
txHashes.push(upgradeTxHash);
|
|
151
162
|
}
|
|
152
163
|
else {
|
|
153
164
|
logger.verbose(`Registry ${registryAddress} has already registered rollup ${rollupAddress}`);
|
|
154
165
|
}
|
|
166
|
+
// Wait for all actions to be mined
|
|
167
|
+
await Promise.all(txHashes.map(txHash => publicClient.waitForTransactionReceipt({ hash: txHash })));
|
|
168
|
+
logger.verbose(`All transactions for L1 deployment have been mined`);
|
|
155
169
|
const l1Contracts = {
|
|
156
170
|
availabilityOracleAddress,
|
|
157
171
|
rollupAddress,
|
|
@@ -172,10 +186,18 @@ class L1Deployer {
|
|
|
172
186
|
this.walletClient = walletClient;
|
|
173
187
|
this.publicClient = publicClient;
|
|
174
188
|
this.logger = logger;
|
|
189
|
+
this.txHashes = [];
|
|
175
190
|
this.salt = maybeSalt ? padHex(numberToHex(maybeSalt), { size: 32 }) : undefined;
|
|
176
191
|
}
|
|
177
|
-
deploy(params, args = []) {
|
|
178
|
-
|
|
192
|
+
async deploy(params, args = []) {
|
|
193
|
+
const { txHash, address } = await deployL1Contract(this.walletClient, this.publicClient, params.contractAbi, params.contractBytecode, args, this.salt, this.logger);
|
|
194
|
+
if (txHash) {
|
|
195
|
+
this.txHashes.push(txHash);
|
|
196
|
+
}
|
|
197
|
+
return address;
|
|
198
|
+
}
|
|
199
|
+
async waitForDeployments() {
|
|
200
|
+
await Promise.all(this.txHashes.map(txHash => this.publicClient.waitForTransactionReceipt({ hash: txHash })));
|
|
179
201
|
}
|
|
180
202
|
}
|
|
181
203
|
// docs:start:deployL1Contract
|
|
@@ -186,38 +208,36 @@ class L1Deployer {
|
|
|
186
208
|
* @param abi - The ETH contract's ABI (as abitype's Abi).
|
|
187
209
|
* @param bytecode - The ETH contract's bytecode.
|
|
188
210
|
* @param args - Constructor arguments for the contract.
|
|
211
|
+
* @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).
|
|
189
212
|
* @returns The ETH address the contract was deployed to.
|
|
190
213
|
*/
|
|
191
214
|
export async function deployL1Contract(walletClient, publicClient, abi, bytecode, args = [], maybeSalt, logger) {
|
|
215
|
+
let txHash = undefined;
|
|
216
|
+
let address = undefined;
|
|
192
217
|
if (maybeSalt) {
|
|
193
218
|
const salt = padHex(maybeSalt, { size: 32 });
|
|
194
219
|
const deployer = '0x4e59b44847b379578588920cA78FbF26c0B4956C';
|
|
195
220
|
const calldata = encodeDeployData({ abi, bytecode, args });
|
|
196
|
-
|
|
221
|
+
address = getContractAddress({ from: deployer, salt, bytecode: calldata, opcode: 'CREATE2' });
|
|
197
222
|
const existing = await publicClient.getBytecode({ address });
|
|
198
223
|
if (existing === undefined || existing === '0x') {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
data: concatHex([salt, calldata]),
|
|
202
|
-
});
|
|
203
|
-
logger?.verbose(`Deploying contract with salt ${salt} to address ${address} in tx ${hash}`);
|
|
204
|
-
await publicClient.waitForTransactionReceipt({ hash, pollingInterval: 100 });
|
|
224
|
+
txHash = await walletClient.sendTransaction({ to: deployer, data: concatHex([salt, calldata]) });
|
|
225
|
+
logger?.verbose(`Deploying contract with salt ${salt} to address ${address} in tx ${txHash}`);
|
|
205
226
|
}
|
|
206
227
|
else {
|
|
207
228
|
logger?.verbose(`Skipping existing deployment of contract with salt ${salt} to address ${address}`);
|
|
208
229
|
}
|
|
209
|
-
return EthAddress.fromString(address);
|
|
210
230
|
}
|
|
211
231
|
else {
|
|
212
|
-
|
|
213
|
-
logger?.verbose(`Deploying contract in tx ${
|
|
214
|
-
const receipt = await publicClient.waitForTransactionReceipt({ hash, pollingInterval: 100 });
|
|
215
|
-
|
|
216
|
-
if (!
|
|
232
|
+
txHash = await walletClient.deployContract({ abi, bytecode, args });
|
|
233
|
+
logger?.verbose(`Deploying contract in tx ${txHash}`);
|
|
234
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash, pollingInterval: 100 });
|
|
235
|
+
address = receipt.contractAddress;
|
|
236
|
+
if (!address) {
|
|
217
237
|
throw new Error(`No contract address found in receipt: ${JSON.stringify(receipt, (_, val) => typeof val === 'bigint' ? String(val) : val)}`);
|
|
218
238
|
}
|
|
219
|
-
return EthAddress.fromString(contractAddress);
|
|
220
239
|
}
|
|
240
|
+
return { address: EthAddress.fromString(address), txHash };
|
|
221
241
|
}
|
|
222
242
|
// docs:end:deployL1Contract
|
|
223
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95X2wxX2NvbnRyYWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXBsb3lfbDFfY29udHJhY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUszRCxPQUFPLEVBT0wsU0FBUyxFQUNULGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLElBQUksRUFDSixXQUFXLEVBQ1gsTUFBTSxFQUNOLFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBMEMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQTJFdEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsTUFBYyxFQUNkLCtCQUF1RixFQUN2RixRQUFlLE9BQU87SUFFdEIsTUFBTSxTQUFTLEdBQ2IsT0FBTywrQkFBK0IsS0FBSyxRQUFRO1FBQ2pELENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxtQkFBbUIsQ0FBQywrQkFBZ0QsQ0FBQztZQUN2RSxDQUFDLENBQUMsaUJBQWlCLENBQUMsK0JBQStCLENBQUM7UUFDdEQsQ0FBQyxDQUFDLCtCQUErQixDQUFDO0lBRXRDLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO1FBQ3RDLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLEtBQUs7UUFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUN4QixDQUFDLENBQUM7SUFDSCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztRQUN0QyxLQUFLO1FBQ0wsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDeEIsQ0FBQyxD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
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95X2wxX2NvbnRyYWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXBsb3lfbDFfY29udHJhY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUszRCxPQUFPLEVBT0wsU0FBUyxFQUNULGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLElBQUksRUFDSixXQUFXLEVBQ1gsTUFBTSxFQUNOLFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBMEMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQTJFdEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsTUFBYyxFQUNkLCtCQUF1RixFQUN2RixRQUFlLE9BQU87SUFFdEIsTUFBTSxTQUFTLEdBQ2IsT0FBTywrQkFBK0IsS0FBSyxRQUFRO1FBQ2pELENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxtQkFBbUIsQ0FBQywrQkFBZ0QsQ0FBQztZQUN2RSxDQUFDLENBQUMsaUJBQWlCLENBQUMsK0JBQStCLENBQUM7UUFDdEQsQ0FBQyxDQUFDLCtCQUErQixDQUFDO0lBRXRDLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO1FBQ3RDLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLEtBQUs7UUFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUN4QixDQUFDLENBQUM7SUFDSCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztRQUN0QyxLQUFLO1FBQ0wsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDeEIsQ0FBQyxD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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/ethereum",
|
|
3
|
-
"version": "0.51.
|
|
3
|
+
"version": "0.51.1",
|
|
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.51.
|
|
27
|
+
"@aztec/foundation": "0.51.1",
|
|
28
28
|
"dotenv": "^16.0.3",
|
|
29
29
|
"tslib": "^2.4.0",
|
|
30
30
|
"viem": "^2.7.15"
|
|
@@ -147,12 +147,18 @@ export const deployL1Contracts = async (
|
|
|
147
147
|
chain: Chain,
|
|
148
148
|
logger: DebugLogger,
|
|
149
149
|
contractsToDeploy: L1ContractArtifactsForDeployment,
|
|
150
|
-
args: {
|
|
150
|
+
args: {
|
|
151
|
+
l2FeeJuiceAddress: AztecAddress;
|
|
152
|
+
vkTreeRoot: Fr;
|
|
153
|
+
assumeProvenUntil?: number;
|
|
154
|
+
salt: number | undefined;
|
|
155
|
+
initialValidators?: EthAddress[];
|
|
156
|
+
},
|
|
151
157
|
): Promise<DeployL1Contracts> => {
|
|
152
158
|
// We are assuming that you are running this on a local anvil node which have 1s block times
|
|
153
159
|
// To align better with actual deployment, we update the block interval to 12s
|
|
154
160
|
// The code is same as `setBlockInterval` in `cheat_codes.ts`
|
|
155
|
-
const rpcCall = async (
|
|
161
|
+
const rpcCall = async (method: string, params: any[]) => {
|
|
156
162
|
const paramsString = JSON.stringify(params);
|
|
157
163
|
const content = {
|
|
158
164
|
body: `{"jsonrpc":"2.0", "method": "${method}", "params": ${paramsString}, "id": 1}`,
|
|
@@ -163,7 +169,7 @@ export const deployL1Contracts = async (
|
|
|
163
169
|
};
|
|
164
170
|
if (chain.id == foundry.id) {
|
|
165
171
|
const interval = 12;
|
|
166
|
-
const res = await rpcCall(
|
|
172
|
+
const res = await rpcCall('anvil_setBlockTimestampInterval', [interval]);
|
|
167
173
|
if (res.error) {
|
|
168
174
|
throw new Error(`Error setting block interval: ${res.error.message}`);
|
|
169
175
|
}
|
|
@@ -190,35 +196,59 @@ export const deployL1Contracts = async (
|
|
|
190
196
|
|
|
191
197
|
logger.info(`Deployed Gas Portal at ${feeJuicePortalAddress}`);
|
|
192
198
|
|
|
199
|
+
const rollupAddress = await deployer.deploy(contractsToDeploy.rollup, [
|
|
200
|
+
getAddress(registryAddress.toString()),
|
|
201
|
+
getAddress(availabilityOracleAddress.toString()),
|
|
202
|
+
getAddress(feeJuicePortalAddress.toString()),
|
|
203
|
+
args.vkTreeRoot.toString(),
|
|
204
|
+
account.address.toString(),
|
|
205
|
+
args.initialValidators?.map(v => v.toString()) ?? [],
|
|
206
|
+
]);
|
|
207
|
+
logger.info(`Deployed Rollup at ${rollupAddress}`);
|
|
208
|
+
|
|
209
|
+
await deployer.waitForDeployments();
|
|
210
|
+
logger.info(`All contracts deployed`);
|
|
211
|
+
|
|
193
212
|
const feeJuicePortal = getContract({
|
|
194
213
|
address: feeJuicePortalAddress.toString(),
|
|
195
214
|
abi: contractsToDeploy.feeJuicePortal.contractAbi,
|
|
196
215
|
client: walletClient,
|
|
197
216
|
});
|
|
198
217
|
|
|
199
|
-
// fund the portal contract with Fee Juice
|
|
200
218
|
const feeJuice = getContract({
|
|
201
219
|
address: feeJuiceAddress.toString(),
|
|
202
220
|
abi: contractsToDeploy.feeJuice.contractAbi,
|
|
203
221
|
client: walletClient,
|
|
204
222
|
});
|
|
205
223
|
|
|
224
|
+
const rollup = getContract({
|
|
225
|
+
address: getAddress(rollupAddress.toString()),
|
|
226
|
+
abi: contractsToDeploy.rollup.contractAbi,
|
|
227
|
+
client: walletClient,
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// Transaction hashes to await
|
|
231
|
+
const txHashes: Hex[] = [];
|
|
232
|
+
|
|
206
233
|
// @note This value MUST match what is in `constants.nr`. It is currently specified here instead of just importing
|
|
207
234
|
// because there is circular dependency hell. This is a temporary solution. #3342
|
|
235
|
+
// @todo #8084
|
|
236
|
+
// fund the portal contract with Fee Juice
|
|
208
237
|
const FEE_JUICE_INITIAL_MINT = 20000000000;
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
logger.info(`
|
|
238
|
+
const mintTxHash = await feeJuice.write.mint([feeJuicePortalAddress.toString(), FEE_JUICE_INITIAL_MINT], {} as any);
|
|
239
|
+
txHashes.push(mintTxHash);
|
|
240
|
+
logger.info(`Funding fee juice portal contract with fee juice in ${mintTxHash}`);
|
|
212
241
|
|
|
213
242
|
if ((await feeJuicePortal.read.registry([])) === zeroAddress) {
|
|
214
|
-
await
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
243
|
+
const initPortalTxHash = await feeJuicePortal.write.initialize([
|
|
244
|
+
registryAddress.toString(),
|
|
245
|
+
feeJuiceAddress.toString(),
|
|
246
|
+
args.l2FeeJuiceAddress.toString(),
|
|
247
|
+
]);
|
|
248
|
+
txHashes.push(initPortalTxHash);
|
|
249
|
+
logger.verbose(
|
|
250
|
+
`Fee juice portal initializing with registry ${registryAddress.toString()} in tx ${initPortalTxHash}`,
|
|
251
|
+
);
|
|
222
252
|
} else {
|
|
223
253
|
logger.verbose(`Fee juice portal is already initialized`);
|
|
224
254
|
}
|
|
@@ -227,47 +257,40 @@ export const deployL1Contracts = async (
|
|
|
227
257
|
`Initialized Gas Portal at ${feeJuicePortalAddress} to bridge between L1 ${feeJuiceAddress} to L2 ${args.l2FeeJuiceAddress}`,
|
|
228
258
|
);
|
|
229
259
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
260
|
+
if (chain.id == foundry.id) {
|
|
261
|
+
// @note We make a time jump PAST the very first slot to not have to deal with the edge case of the first slot.
|
|
262
|
+
// The edge case being that the genesis block is already occupying slot 0, so we cannot have another block.
|
|
263
|
+
try {
|
|
264
|
+
// Need to get the time
|
|
265
|
+
const currentSlot = (await rollup.read.getCurrentSlot([])) as bigint;
|
|
266
|
+
|
|
267
|
+
if (BigInt(currentSlot) === 0n) {
|
|
268
|
+
const ts = Number(await rollup.read.getTimestampForSlot([1]));
|
|
269
|
+
await rpcCall('evm_setNextBlockTimestamp', [ts]);
|
|
270
|
+
await rpcCall('hardhat_mine', [1]);
|
|
271
|
+
const currentSlot = (await rollup.read.getCurrentSlot([])) as bigint;
|
|
272
|
+
|
|
273
|
+
if (BigInt(currentSlot) !== 1n) {
|
|
274
|
+
throw new Error(`Error jumping time: current slot is ${currentSlot}`);
|
|
275
|
+
}
|
|
276
|
+
logger.info(`Jumped to slot 1`);
|
|
277
|
+
}
|
|
278
|
+
} catch (e) {
|
|
279
|
+
throw new Error(`Error jumping time: ${e}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
238
282
|
|
|
239
283
|
// Set initial blocks as proven if requested
|
|
240
284
|
if (args.assumeProvenUntil && args.assumeProvenUntil > 0) {
|
|
241
|
-
const rollup = getContract({
|
|
242
|
-
address: getAddress(rollupAddress.toString()),
|
|
243
|
-
abi: contractsToDeploy.rollup.contractAbi,
|
|
244
|
-
client: walletClient,
|
|
245
|
-
});
|
|
246
285
|
await rollup.write.setAssumeProvenUntilBlockNumber([BigInt(args.assumeProvenUntil)], { account });
|
|
247
286
|
logger.info(`Set Rollup assumedProvenUntil to ${args.assumeProvenUntil}`);
|
|
248
287
|
}
|
|
249
288
|
|
|
250
289
|
// Inbox and Outbox are immutable and are deployed from Rollup's constructor so we just fetch them from the contract.
|
|
251
|
-
|
|
252
|
-
{
|
|
253
|
-
const rollup = getContract({
|
|
254
|
-
address: getAddress(rollupAddress.toString()),
|
|
255
|
-
abi: contractsToDeploy.rollup.contractAbi,
|
|
256
|
-
client: publicClient,
|
|
257
|
-
});
|
|
258
|
-
inboxAddress = EthAddress.fromString((await rollup.read.INBOX([])) as any);
|
|
259
|
-
}
|
|
290
|
+
const inboxAddress = EthAddress.fromString((await rollup.read.INBOX([])) as any);
|
|
260
291
|
logger.info(`Inbox available at ${inboxAddress}`);
|
|
261
292
|
|
|
262
|
-
|
|
263
|
-
{
|
|
264
|
-
const rollup = getContract({
|
|
265
|
-
address: getAddress(rollupAddress.toString()),
|
|
266
|
-
abi: contractsToDeploy.rollup.contractAbi,
|
|
267
|
-
client: publicClient,
|
|
268
|
-
});
|
|
269
|
-
outboxAddress = EthAddress.fromString((await rollup.read.OUTBOX([])) as any);
|
|
270
|
-
}
|
|
293
|
+
const outboxAddress = EthAddress.fromString((await rollup.read.OUTBOX([])) as any);
|
|
271
294
|
logger.info(`Outbox available at ${outboxAddress}`);
|
|
272
295
|
|
|
273
296
|
// We need to call a function on the registry to set the various contract addresses.
|
|
@@ -277,12 +300,19 @@ export const deployL1Contracts = async (
|
|
|
277
300
|
client: walletClient,
|
|
278
301
|
});
|
|
279
302
|
if (!(await registryContract.read.isRollupRegistered([getAddress(rollupAddress.toString())]))) {
|
|
280
|
-
await registryContract.write.upgrade([getAddress(rollupAddress.toString())], { account });
|
|
281
|
-
logger.verbose(
|
|
303
|
+
const upgradeTxHash = await registryContract.write.upgrade([getAddress(rollupAddress.toString())], { account });
|
|
304
|
+
logger.verbose(
|
|
305
|
+
`Upgrading registry contract at ${registryAddress} to rollup ${rollupAddress} in tx ${upgradeTxHash}`,
|
|
306
|
+
);
|
|
307
|
+
txHashes.push(upgradeTxHash);
|
|
282
308
|
} else {
|
|
283
309
|
logger.verbose(`Registry ${registryAddress} has already registered rollup ${rollupAddress}`);
|
|
284
310
|
}
|
|
285
311
|
|
|
312
|
+
// Wait for all actions to be mined
|
|
313
|
+
await Promise.all(txHashes.map(txHash => publicClient.waitForTransactionReceipt({ hash: txHash })));
|
|
314
|
+
logger.verbose(`All transactions for L1 deployment have been mined`);
|
|
315
|
+
|
|
286
316
|
const l1Contracts: L1ContractAddresses = {
|
|
287
317
|
availabilityOracleAddress,
|
|
288
318
|
rollupAddress,
|
|
@@ -302,6 +332,7 @@ export const deployL1Contracts = async (
|
|
|
302
332
|
|
|
303
333
|
class L1Deployer {
|
|
304
334
|
private salt: Hex | undefined;
|
|
335
|
+
private txHashes: Hex[] = [];
|
|
305
336
|
constructor(
|
|
306
337
|
private walletClient: WalletClient<HttpTransport, Chain, Account>,
|
|
307
338
|
private publicClient: PublicClient<HttpTransport, Chain>,
|
|
@@ -311,11 +342,11 @@ class L1Deployer {
|
|
|
311
342
|
this.salt = maybeSalt ? padHex(numberToHex(maybeSalt), { size: 32 }) : undefined;
|
|
312
343
|
}
|
|
313
344
|
|
|
314
|
-
deploy(
|
|
345
|
+
async deploy(
|
|
315
346
|
params: { contractAbi: Narrow<Abi | readonly unknown[]>; contractBytecode: Hex },
|
|
316
347
|
args: readonly unknown[] = [],
|
|
317
348
|
): Promise<EthAddress> {
|
|
318
|
-
|
|
349
|
+
const { txHash, address } = await deployL1Contract(
|
|
319
350
|
this.walletClient,
|
|
320
351
|
this.publicClient,
|
|
321
352
|
params.contractAbi,
|
|
@@ -324,6 +355,14 @@ class L1Deployer {
|
|
|
324
355
|
this.salt,
|
|
325
356
|
this.logger,
|
|
326
357
|
);
|
|
358
|
+
if (txHash) {
|
|
359
|
+
this.txHashes.push(txHash);
|
|
360
|
+
}
|
|
361
|
+
return address;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
async waitForDeployments(): Promise<void> {
|
|
365
|
+
await Promise.all(this.txHashes.map(txHash => this.publicClient.waitForTransactionReceipt({ hash: txHash })));
|
|
327
366
|
}
|
|
328
367
|
}
|
|
329
368
|
|
|
@@ -335,6 +374,7 @@ class L1Deployer {
|
|
|
335
374
|
* @param abi - The ETH contract's ABI (as abitype's Abi).
|
|
336
375
|
* @param bytecode - The ETH contract's bytecode.
|
|
337
376
|
* @param args - Constructor arguments for the contract.
|
|
377
|
+
* @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).
|
|
338
378
|
* @returns The ETH address the contract was deployed to.
|
|
339
379
|
*/
|
|
340
380
|
export async function deployL1Contract(
|
|
@@ -345,38 +385,37 @@ export async function deployL1Contract(
|
|
|
345
385
|
args: readonly unknown[] = [],
|
|
346
386
|
maybeSalt?: Hex,
|
|
347
387
|
logger?: DebugLogger,
|
|
348
|
-
): Promise<EthAddress> {
|
|
388
|
+
): Promise<{ address: EthAddress; txHash: Hex | undefined }> {
|
|
389
|
+
let txHash: Hex | undefined = undefined;
|
|
390
|
+
let address: Hex | null | undefined = undefined;
|
|
391
|
+
|
|
349
392
|
if (maybeSalt) {
|
|
350
393
|
const salt = padHex(maybeSalt, { size: 32 });
|
|
351
394
|
const deployer: Hex = '0x4e59b44847b379578588920cA78FbF26c0B4956C';
|
|
352
395
|
const calldata = encodeDeployData({ abi, bytecode, args });
|
|
353
|
-
|
|
396
|
+
address = getContractAddress({ from: deployer, salt, bytecode: calldata, opcode: 'CREATE2' });
|
|
354
397
|
const existing = await publicClient.getBytecode({ address });
|
|
355
398
|
|
|
356
399
|
if (existing === undefined || existing === '0x') {
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
data: concatHex([salt, calldata]),
|
|
360
|
-
});
|
|
361
|
-
logger?.verbose(`Deploying contract with salt ${salt} to address ${address} in tx ${hash}`);
|
|
362
|
-
await publicClient.waitForTransactionReceipt({ hash, pollingInterval: 100 });
|
|
400
|
+
txHash = await walletClient.sendTransaction({ to: deployer, data: concatHex([salt, calldata]) });
|
|
401
|
+
logger?.verbose(`Deploying contract with salt ${salt} to address ${address} in tx ${txHash}`);
|
|
363
402
|
} else {
|
|
364
403
|
logger?.verbose(`Skipping existing deployment of contract with salt ${salt} to address ${address}`);
|
|
365
404
|
}
|
|
366
|
-
return EthAddress.fromString(address);
|
|
367
405
|
} else {
|
|
368
|
-
|
|
369
|
-
logger?.verbose(`Deploying contract in tx ${
|
|
370
|
-
const receipt = await publicClient.waitForTransactionReceipt({ hash, pollingInterval: 100 });
|
|
371
|
-
|
|
372
|
-
if (!
|
|
406
|
+
txHash = await walletClient.deployContract({ abi, bytecode, args });
|
|
407
|
+
logger?.verbose(`Deploying contract in tx ${txHash}`);
|
|
408
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash, pollingInterval: 100 });
|
|
409
|
+
address = receipt.contractAddress;
|
|
410
|
+
if (!address) {
|
|
373
411
|
throw new Error(
|
|
374
412
|
`No contract address found in receipt: ${JSON.stringify(receipt, (_, val) =>
|
|
375
413
|
typeof val === 'bigint' ? String(val) : val,
|
|
376
414
|
)}`,
|
|
377
415
|
);
|
|
378
416
|
}
|
|
379
|
-
return EthAddress.fromString(contractAddress);
|
|
380
417
|
}
|
|
418
|
+
|
|
419
|
+
return { address: EthAddress.fromString(address!), txHash };
|
|
381
420
|
}
|
|
382
421
|
// docs:end:deployL1Contract
|