Skip to content

Commit 8cc27f0

Browse files
critesjoshclaude
andcommitted
Skip fee juice bridging if account already has L2 balance
Check the account's fee juice balance on L2 before bridging from L1. If the account already has fee juice (e.g. from a previous run), skip the mint+bridge step and deploy without a claim payment method. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 189ce1b commit 8cc27f0

1 file changed

Lines changed: 23 additions & 9 deletions

File tree

src/utils/deploy_account.ts

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { SponsoredFeePaymentMethod, FeeJuicePaymentMethodWithClaim } from "@aztec/aztec.js/fee";
2+
import type { FeePaymentMethod } from "@aztec/aztec.js/fee";
23
import { getSponsoredFPCInstance } from "./sponsored_fpc.js";
34
import { SponsoredFPCContractArtifact } from "@aztec/noir-contracts.js/SponsoredFPC";
5+
import { ProtocolContractAddress } from "@aztec/aztec.js/protocol";
46
import { Fr } from "@aztec/aztec.js/fields";
57
import { GrumpkinScalar } from "@aztec/foundation/curves/grumpkin";
68
import { type Logger, createLogger } from "@aztec/foundation/log";
@@ -9,6 +11,7 @@ import { AztecAddress } from "@aztec/aztec.js/addresses";
911
import { AccountManager } from "@aztec/aztec.js/wallet";
1012
import { EmbeddedWallet } from "@aztec/wallets/embedded";
1113
import { createAztecNodeClient } from "@aztec/aztec.js/node";
14+
import { deriveStorageSlotInMap } from "@aztec/stdlib/hash";
1215
import configManager, { getAztecNodeUrl, getTimeouts } from "../../config/config.js";
1316
import { bridgeL1FeeJuice } from "./bridge_fee_juice.js";
1417

@@ -36,15 +39,23 @@ export async function deploySchnorrAccount(wallet?: EmbeddedWallet): Promise<Acc
3639
const deployMethod = await account.getDeployMethod();
3740
const timeouts = getTimeouts();
3841

39-
let paymentMethod;
42+
let paymentMethod: FeePaymentMethod | undefined;
4043

4144
if (configManager.isTestnet()) {
42-
// Testnet: bridge fee juice from L1 and use it to pay for deployment
43-
logger.info('💰 Bridging fee juice from Sepolia L1 for account deployment...');
4445
const node = createAztecNodeClient(getAztecNodeUrl());
45-
const claim = await bridgeL1FeeJuice(node, account.address, FEE_JUICE_AMOUNT, logger);
46-
paymentMethod = new FeeJuicePaymentMethodWithClaim(account.address, claim);
47-
logger.info('✅ Fee juice claim ready for account deployment');
46+
47+
// Check if the account already has fee juice on L2
48+
const balanceSlot = await deriveStorageSlotInMap(new Fr(1), account.address);
49+
const balance = (await node.getPublicStorageAt('latest', ProtocolContractAddress.FeeJuice, balanceSlot)).toBigInt();
50+
51+
if (balance > 0n) {
52+
logger.info(`💰 Account already has ${balance} fee juice on L2, skipping bridge`);
53+
} else {
54+
logger.info('💰 No fee juice found, bridging from Sepolia L1...');
55+
const claim = await bridgeL1FeeJuice(node, account.address, FEE_JUICE_AMOUNT, logger);
56+
paymentMethod = new FeeJuicePaymentMethodWithClaim(account.address, claim);
57+
logger.info('✅ Fee juice claim ready for account deployment');
58+
}
4859
} else {
4960
// Devnet/local: use sponsored FPC
5061
logger.info('💰 Setting up sponsored fee payment for account deployment...');
@@ -64,11 +75,14 @@ export async function deploySchnorrAccount(wallet?: EmbeddedWallet): Promise<Acc
6475
logger.info('✅ Simulation successful, sending deployment transaction...');
6576

6677
// Deploy account
67-
await deployMethod.send({
78+
const sendOpts: any = {
6879
from: AztecAddress.ZERO,
69-
fee: { paymentMethod },
7080
wait: { timeout: timeouts.deployTimeout },
71-
});
81+
};
82+
if (paymentMethod) {
83+
sendOpts.fee = { paymentMethod };
84+
}
85+
await deployMethod.send(sendOpts);
7286

7387
logger.info(`✅ Account deployment transaction successful!`);
7488

0 commit comments

Comments
 (0)