From 63b1b6ba4e1e7510e70296e6265d175618754663 Mon Sep 17 00:00:00 2001 From: Josh Crites Date: Tue, 24 Mar 2026 20:58:24 -0400 Subject: [PATCH 1/5] Replace hand-written doc snippets with #include_code directives Add docs:start/docs:end markers to scripts and config files, replace hand-written code blocks in ONBOARDING.src.md with #include_code directives so snippets stay in sync with source. Change remarkrc codeDir from ./src to . to reach files outside src/. Co-Authored-By: Claude Opus 4.6 (1M context) --- .remarkrc.mjs | 2 +- ONBOARDING.md | 202 ++++++++--------------- config/config.ts | 2 + docs/ONBOARDING.src.md | 182 ++++---------------- scripts/deploy_contract.ts | 3 +- scripts/get_block.ts | 3 +- scripts/interaction_existing_contract.ts | 9 +- scripts/multiple_wallet.ts | 3 +- scripts/profile_deploy.ts | 2 + 9 files changed, 117 insertions(+), 291 deletions(-) diff --git a/.remarkrc.mjs b/.remarkrc.mjs index 09bb687..8ad5a69 100644 --- a/.remarkrc.mjs +++ b/.remarkrc.mjs @@ -3,7 +3,7 @@ import { remarkIncludeCode } from 'include_code'; export default { plugins: [ [remarkIncludeCode, { - codeDir: './src', + codeDir: '.', repository: { owner: 'AztecProtocol', name: 'aztec-starter' }, commitTag: 'main', validation: 'error', diff --git a/ONBOARDING.md b/ONBOARDING.md index 6070c21..7e55cdb 100644 --- a/ONBOARDING.md +++ b/ONBOARDING.md @@ -101,7 +101,7 @@ struct Storage { } ``` -Source code: /main.nr#Lstorage +Source code: /src/main.nr#Lstorage **What is `Context`?** You'll notice `Context` appears as a generic parameter throughout the storage definition. In Aztec, the context is the execution environment passed to every function — it's how your contract accesses blockchain state like `context.msg_sender()` (the caller's address) and `context.block_number()`. Think of it as an expanded version of Solidity's global variables (`msg.sender`, `block.number`, etc.), but packaged as an object. The `` generic on storage types lets the same storage struct work in both public and private execution contexts. You don't need to construct it yourself — the framework provides `self.context` automatically in every contract function. @@ -149,7 +149,7 @@ fn constructor(admin: AztecAddress) { } ``` -Source code: /main.nr#Lconstructor +Source code: /src/main.nr#Lconstructor Sets the admin address. The `#[initializer]` macro means this runs once at deployment, like a Solidity constructor. @@ -180,7 +180,7 @@ fn create_game(game_id: Field) { } ``` -Source code: /main.nr#Lcreate-game +Source code: /src/main.nr#Lcreate-game Creates a new game. Checks the game ID isn't taken (player1 must be zero address), then writes a new `Race` struct with the caller as player1 and an expiration time. @@ -202,7 +202,7 @@ fn join_game(game_id: Field) { } ``` -Source code: /main.nr#Ljoin-game +Source code: /src/main.nr#Ljoin-game A second player joins. The `Race::join()` method validates that player1 exists, the player2 slot is empty, and the joiner isn't player1. @@ -236,7 +236,7 @@ fn finalize_game(game_id: Field) { } ``` -Source code: /main.nr#Lfinalize-game +Source code: /src/main.nr#Lfinalize-game After both players have revealed, this compares track scores, determines the winner, and updates the leaderboard. @@ -280,7 +280,7 @@ pub struct Race { } ``` -Source code: /race.nr#Lrace-struct +Source code: /src/race.nr#Lrace-struct Key methods: @@ -344,7 +344,7 @@ fn play_round( } ``` -Source code: /main.nr#Lplay-round +Source code: /src/main.nr#Lplay-round Three things happen here that have no direct Ethereum equivalent: @@ -406,7 +406,7 @@ fn finish_game(game_id: Field) { } ``` -Source code: /main.nr#Lfinish-game +Source code: /src/main.nr#Lfinish-game This is the "reveal" phase: @@ -442,7 +442,7 @@ pub struct GameRoundNote { } ``` -Source code: /game_round_note.nr#Lgame-round-note +Source code: /src/game_round_note.nr#Lgame-round-note The `#[note]` macro makes this a private state primitive. Each note stores one round's point allocation and the owner's address. Only the owner can read it. @@ -498,13 +498,13 @@ Here's exactly what an outside observer can and cannot see at each step. Some functions are labeled **"private, then public"** in the Type column. On Aztec, there are only two function types: `#[private]` and `#[public]`. But a private function can *enqueue* a public function to run after it — within the same transaction. The private part runs first (on the user's machine, hidden from everyone), then the public part runs on-chain (visible to all). This is how the contract hides sensitive data while still updating shared public state. -| Step | Function | Type | Observer **CAN** see | Observer **CANNOT** see | -| ---- | --------------- | ------------------- | --------------------------------------------------------- | ---------------------------------------------- | -| 1 | `create_game` | public | Game created, player1 address, expiration block | Nothing hidden | -| 2 | `join_game` | public | Player2 joined, both addresses | Nothing hidden | +| Step | Function | Type | Observer **CAN** see | Observer **CANNOT** see | +| ---- | --------------- | -------------------- | --------------------------------------------------------- | ---------------------------------------------- | +| 1 | `create_game` | public | Game created, player1 address, expiration block | Nothing hidden | +| 2 | `join_game` | public | Player2 joined, both addresses | Nothing hidden | | 3 | `play_round` | private, then public | Round counter incremented (e.g. "player1 played round 1") | Point allocation across tracks | -| 4 | `finish_game` | private, then public | Final track totals revealed (e.g. "player1: 7,7,7,3,3") | Individual round allocations | -| 5 | `finalize_game` | public | Winner declared, leaderboard updated | Nothing hidden (all data public at this point) | +| 4 | `finish_game` | private, then public | Final track totals revealed (e.g. "player1: 7,7,7,3,3") | Individual round allocations | +| 5 | `finalize_game` | public | Winner declared, leaderboard updated | Nothing hidden (all data public at this point) | The critical privacy window is between steps 3 and 4: both players have committed their strategies (as private notes), but neither can see the other's choices. This prevents the second player from gaining an advantage by observing the first player's moves. @@ -586,7 +586,7 @@ unconstrained fn test_initializer() { } ``` -Source code: /test/pod_racing.nr#Ltest-initializer +Source code: /src/test/pod_racing.nr#Ltest-initializer The `unconstrained` keyword means this test runs outside the ZK circuit (it's a test, not a provable function). `utils::setup()` deploys a fresh contract and returns the environment, contract address, and admin. @@ -611,7 +611,7 @@ unconstrained fn test_fail_play_round_too_many_points() { } ``` -Source code: /test/pod_racing.nr#Ltest-fail-too-many-points +Source code: /src/test/pod_racing.nr#Ltest-fail-too-many-points The `#[test(should_fail)]` attribute is like Foundry's `vm.expectRevert()`. @@ -646,7 +646,7 @@ pub unconstrained fn max_allocation() -> (u8, u8, u8, u8, u8) { } ``` -Source code: /test/helpers.nr#Lallocation-strategies +Source code: /src/test/helpers.nr#Lallocation-strategies And higher-level helpers: @@ -694,7 +694,7 @@ pub unconstrained fn play_all_rounds_with_strategy( } ``` -Source code: /test/helpers.nr#Lsetup-helpers +Source code: /src/test/helpers.nr#Lsetup-helpers #### Test setup (`src/test/utils.nr`) @@ -715,7 +715,7 @@ pub unconstrained fn setup() -> (TestEnvironment, AztecAddress, AztecAddress) { } ``` -Source code: /test/utils.nr#Ltest-setup +Source code: /src/test/utils.nr#Ltest-setup **Ethereum analogies:** @@ -776,11 +776,17 @@ The project uses JSON config files selected by the `AZTEC_ENV` environment varia **`config/config.ts`** — A `ConfigManager` singleton that loads the appropriate JSON file: -```typescript -const env = process.env.AZTEC_ENV || "local-network"; -this.configPath = path.resolve(process.cwd(), `config/${env}.json`); +```typescript title="config-loading" showLineNumbers +private constructor() { + const env = process.env.AZTEC_ENV || 'local-network'; + this.configPath = path.resolve(process.cwd(), `config/${env}.json`); + this.loadConfig(); + console.log(`Loaded configuration: ${this.config.name} environment`); +} ``` +Source code: /config/config.ts#Lconfig-loading + **`config/local-network.json`:** ```json @@ -843,7 +849,7 @@ export async function getSponsoredFPCInstance(): PromiseSource code: /utils/sponsored_fpc.ts#Lget-sponsored-fpc +Source code: /src/utils/sponsored_fpc.ts#Lget-sponsored-fpc **Run it:** @@ -869,9 +875,11 @@ AZTEC_ENV=local-network 3. Deploy a Schnorr account (or use one from env) 4. Deploy the contract: -```typescript +```typescript title="deploy-contract" showLineNumbers const deployRequest = PodRacingContract.deploy(wallet, address); -await deployRequest.simulate({ from: address }); +await deployRequest.simulate({ + from: address, +}); const { contract: podRacingContract, instance } = await deployRequest.send({ from: address, fee: { paymentMethod: sponsoredPaymentMethod }, @@ -879,6 +887,8 @@ const { contract: podRacingContract, instance } = await deployRequest.send({ }); ``` +Source code: /scripts/deploy_contract.ts#Ldeploy-contract + > **Important:** Always call `.simulate()` before `.send()`. Simulation runs the transaction locally and surfaces revert reasons immediately. Without it, a failing transaction hangs until timeout with an opaque error. **Run it:** @@ -898,21 +908,30 @@ The output includes the contract address, admin address, and instantiation data 3. Register the contract with the wallet: `wallet.registerContract(instance, PodRacingContract.artifact)` 4. Call methods: -```typescript -const podRacingContract = await PodRacingContract.at(contractAddress, wallet); +```typescript title="interact-existing" showLineNumbers +const podRacingContract = await PodRacingContract.at( + podRacingContractAddress, + wallet +); + +const gameId = Fr.random(); // Simulate first — surfaces revert reasons instantly -await podRacingContract.methods.create_game(gameId).simulate({ from: address }); +await podRacingContract.methods.create_game(gameId).simulate({ + from: address, +}); // Then send — only after simulation succeeds await podRacingContract.methods.create_game(gameId) - .send({ - from: address, - fee: { paymentMethod: sponsoredPaymentMethod }, - wait: { timeout: timeouts.txTimeout } - }); + .send({ + from: address, + fee: { paymentMethod: sponsoredPaymentMethod }, + wait: { timeout: timeouts.txTimeout } + }); ``` +Source code: /scripts/interaction_existing_contract.ts#Linteract-existing + Set the env vars from your deploy output, then run: ```bash @@ -960,29 +979,7 @@ yarn test:nr ### 5.1 — Guided Exercise: Add a Forfeit Function -Add a `forfeit_game` function to `src/main.nr` that lets a player concede: - -```rust -#[external("public")] -fn forfeit_game(game_id: Field) { - let game = self.storage.races.at(game_id).read(); - let caller = self.context.maybe_msg_sender().unwrap(); - - // Only a player in this game can forfeit - assert(caller.eq(game.player1) | caller.eq(game.player2)); - - // The other player wins - let winner = if caller.eq(game.player1) { - game.player2 - } else { - game.player1 - }; - - // Update win history - let previous_wins = self.storage.win_history.at(winner).read(); - self.storage.win_history.at(winner).write(previous_wins + 1); -} -``` +Add a `forfeit_game` function to `src/main.nr` that lets a player concede. Compile and regenerate TypeScript bindings: @@ -992,33 +989,7 @@ yarn compile && yarn codegen ### 5.2 — Write a Noir Test -Add a test to `src/test/pod_racing.nr`: - -```rust -#[test] -unconstrained fn test_forfeit_game() { - let (mut env, contract_address, _) = utils::setup(); - let player1 = env.create_light_account(); - let player2 = env.create_light_account(); - let game_id = helpers::TEST_GAME_ID_9; - - // Setup game - helpers::setup_two_player_game(&mut env, contract_address, player1, player2, game_id); - - // Player 1 forfeits - env.call_public(player1, PodRacing::at(contract_address).forfeit_game(game_id)); - - // Verify player2's win count increased - env.public_context_at(contract_address, |context| { - let win_slot = derive_storage_slot_in_map( - PodRacing::storage_layout().win_history.slot, - player2.to_field() - ); - let wins = context.storage_read(win_slot); - assert_eq(wins, 1); - }); -} -``` +Add a test to `src/test/pod_racing.nr`. Run: @@ -1028,40 +999,7 @@ yarn test:nr ### 5.3 — Write a TypeScript E2E Test -Add a test case to `src/test/e2e/index.test.ts`: - -```typescript -it("Allows a player to forfeit", async () => { - const gameId = new Fr(300); - - await setupGame( - contract, - gameId, - player1Account.address, - player2Account.address, - sponsoredPaymentMethod, - getTimeouts().txTimeout, - ); - - // Simulate first to surface revert reasons before sending - await contract.methods.forfeit_game(gameId).simulate({ - from: player1Account.address, - }); - - const tx = await contract.methods.forfeit_game(gameId).send({ - from: player1Account.address, - fee: { paymentMethod: sponsoredPaymentMethod }, - wait: { timeout: getTimeouts().txTimeout }, - }); - - expect([ - TxStatus.PROPOSED, - TxStatus.CHECKPOINTED, - TxStatus.PROVEN, - TxStatus.FINALIZED, - ]).toContain(tx.status); -}, 600000); -``` +Add a test case to `src/test/e2e/index.test.ts`. Run: @@ -1087,15 +1025,15 @@ yarn test:js **How it works (`scripts/multiple_wallet.ts`):** -The script creates two independent PXE instances (wallet1, wallet2), each with their own key store: +The script creates two independent `EmbeddedWallet` instances, each with their own PXE: -```typescript -const store1 = await createStore('pxe1', { dataDirectory: 'store', ... }); -const store2 = await createStore('pxe2', { dataDirectory: 'store', ... }); -const wallet1 = await TestWallet.create(node, fullConfig, { store: store1 }); -const wallet2 = await TestWallet.create(node, fullConfig, { store: store2 }); +```typescript title="multiple-wallets" showLineNumbers +const wallet1 = await EmbeddedWallet.create(node, walletOpts); +const wallet2 = await EmbeddedWallet.create(node, walletOpts); ``` +Source code: /scripts/multiple_wallet.ts#Lmultiple-wallets + It then deploys a Token contract from wallet1, creates an account on wallet2, mints tokens to wallet2's account, registers the token contract on wallet2, and reads balances. Key concept: `wallet2.registerContract(...)` is necessary because wallet2's PXE doesn't automatically know about contracts deployed by wallet1. Each PXE maintains its own registry. @@ -1137,14 +1075,13 @@ Devnet uses real provers and connects to the Aztec devnet at `https://next.devne **`scripts/profile_deploy.ts`** shows how to profile a transaction: -```typescript -const profileTx = await PodRacingContract.deploy(wallet, address).profile({ - profileMode: "full", - from: address, -}); +```typescript title="profile-tx" showLineNumbers +const profileTx = await PodRacingContract.deploy(wallet, address).profile({ profileMode: "full", from: address }); console.dir(profileTx, { depth: 2 }); ``` +Source code: /scripts/profile_deploy.ts#Lprofile-tx + The `.profile()` method runs the transaction through the prover and returns detailed metrics about gate counts and proving time. ```bash @@ -1155,12 +1092,15 @@ yarn profile **`scripts/get_block.ts`** shows how to query the Aztec node directly: -```typescript +```typescript title="get-block" showLineNumbers +const nodeUrl = getAztecNodeUrl(); const node = createAztecNodeClient(nodeUrl); let block = await node.getBlock(BlockNumber(1)); -console.log(block?.header); +console.log(block?.header) ``` +Source code: /scripts/get_block.ts#Lget-block + ```bash yarn get-block ``` diff --git a/config/config.ts b/config/config.ts index 04f9fb7..9bad4cb 100644 --- a/config/config.ts +++ b/config/config.ts @@ -33,12 +33,14 @@ export class ConfigManager { private config!: EnvironmentConfig; private configPath: string; + // docs:start:config-loading private constructor() { const env = process.env.AZTEC_ENV || 'local-network'; this.configPath = path.resolve(process.cwd(), `config/${env}.json`); this.loadConfig(); console.log(`Loaded configuration: ${this.config.name} environment`); } + // docs:end:config-loading public static getInstance(): ConfigManager { if (!ConfigManager.instance) { diff --git a/docs/ONBOARDING.src.md b/docs/ONBOARDING.src.md index e5acad8..42efc95 100644 --- a/docs/ONBOARDING.src.md +++ b/docs/ONBOARDING.src.md @@ -80,7 +80,7 @@ The Pod Racing contract ([`src/main.nr`](./src/main.nr)) is a two-player competi Open `src/main.nr` and look at the `Storage` struct: -#include_code storage /main.nr rust +#include_code storage /src/main.nr rust **What is `Context`?** You'll notice `Context` appears as a generic parameter throughout the storage definition. In Aztec, the context is the execution environment passed to every function — it's how your contract accesses blockchain state like `context.msg_sender()` (the caller's address) and `context.block_number()`. Think of it as an expanded version of Solidity's global variables (`msg.sender`, `block.number`, etc.), but packaged as an object. The `` generic on storage types lets the same storage struct work in both public and private execution contexts. You don't need to construct it yourself — the framework provides `self.context` automatically in every contract function. @@ -119,25 +119,25 @@ These functions should feel familiar if you've written Solidity. #### `constructor()` -#include_code constructor /main.nr rust +#include_code constructor /src/main.nr rust Sets the admin address. The `#[initializer]` macro means this runs once at deployment, like a Solidity constructor. #### `create_game()` -#include_code create-game /main.nr rust +#include_code create-game /src/main.nr rust Creates a new game. Checks the game ID isn't taken (player1 must be zero address), then writes a new `Race` struct with the caller as player1 and an expiration time. #### `join_game()` -#include_code join-game /main.nr rust +#include_code join-game /src/main.nr rust A second player joins. The `Race::join()` method validates that player1 exists, the player2 slot is empty, and the joiner isn't player1. #### `finalize_game()` -#include_code finalize-game /main.nr rust +#include_code finalize-game /src/main.nr rust After both players have revealed, this compares track scores, determines the winner, and updates the leaderboard. @@ -145,7 +145,7 @@ After both players have revealed, this compares track scores, determines the win The `Race` struct stores all public game state. It has 17 fields: -#include_code race-struct /race.nr rust +#include_code race-struct /src/race.nr rust Key methods: @@ -159,7 +159,7 @@ This is the "aha moment" — the part with no Ethereum equivalent. #### `play_round()` -#include_code play-round /main.nr rust +#include_code play-round /src/main.nr rust Three things happen here that have no direct Ethereum equivalent: @@ -169,7 +169,7 @@ Three things happen here that have no direct Ethereum equivalent: #### `finish_game()` -#include_code finish-game /main.nr rust +#include_code finish-game /src/main.nr rust This is the "reveal" phase: @@ -178,7 +178,7 @@ This is the "reveal" phase: #### `GameRoundNote` (`src/game_round_note.nr`) -#include_code game-round-note /game_round_note.nr rust +#include_code game-round-note /src/game_round_note.nr rust The `#[note]` macro makes this a private state primitive. Each note stores one round's point allocation and the owner's address. Only the owner can read it. @@ -234,13 +234,13 @@ Here's exactly what an outside observer can and cannot see at each step. Some functions are labeled **"private, then public"** in the Type column. On Aztec, there are only two function types: `#[private]` and `#[public]`. But a private function can _enqueue_ a public function to run after it — within the same transaction. The private part runs first (on the user's machine, hidden from everyone), then the public part runs on-chain (visible to all). This is how the contract hides sensitive data while still updating shared public state. -| Step | Function | Type | Observer **CAN** see | Observer **CANNOT** see | -| ---- | --------------- | ------------------- | --------------------------------------------------------- | ---------------------------------------------- | -| 1 | `create_game` | public | Game created, player1 address, expiration block | Nothing hidden | -| 2 | `join_game` | public | Player2 joined, both addresses | Nothing hidden | +| Step | Function | Type | Observer **CAN** see | Observer **CANNOT** see | +| ---- | --------------- | -------------------- | --------------------------------------------------------- | ---------------------------------------------- | +| 1 | `create_game` | public | Game created, player1 address, expiration block | Nothing hidden | +| 2 | `join_game` | public | Player2 joined, both addresses | Nothing hidden | | 3 | `play_round` | private, then public | Round counter incremented (e.g. "player1 played round 1") | Point allocation across tracks | -| 4 | `finish_game` | private, then public | Final track totals revealed (e.g. "player1: 7,7,7,3,3") | Individual round allocations | -| 5 | `finalize_game` | public | Winner declared, leaderboard updated | Nothing hidden (all data public at this point) | +| 4 | `finish_game` | private, then public | Final track totals revealed (e.g. "player1: 7,7,7,3,3") | Individual round allocations | +| 5 | `finalize_game` | public | Winner declared, leaderboard updated | Nothing hidden (all data public at this point) | The critical privacy window is between steps 3 and 4: both players have committed their strategies (as private notes), but neither can see the other's choices. This prevents the second player from gaining an advantage by observing the first player's moves. @@ -309,13 +309,13 @@ Tests live in `src/test/`: **Basic initialization test:** -#include_code test-initializer /test/pod_racing.nr rust +#include_code test-initializer /src/test/pod_racing.nr rust The `unconstrained` keyword means this test runs outside the ZK circuit (it's a test, not a provable function). `utils::setup()` deploys a fresh contract and returns the environment, contract address, and admin. **Expected failure test:** -#include_code test-fail-too-many-points /test/pod_racing.nr rust +#include_code test-fail-too-many-points /src/test/pod_racing.nr rust The `#[test(should_fail)]` attribute is like Foundry's `vm.expectRevert()`. @@ -327,15 +327,15 @@ This test creates a game, has both players play all 3 rounds with specific strat Reusable allocation strategies: -#include_code allocation-strategies /test/helpers.nr rust +#include_code allocation-strategies /src/test/helpers.nr rust And higher-level helpers: -#include_code setup-helpers /test/helpers.nr rust +#include_code setup-helpers /src/test/helpers.nr rust #### Test setup (`src/test/utils.nr`) -#include_code test-setup /test/utils.nr rust +#include_code test-setup /src/test/utils.nr rust **Ethereum analogies:** @@ -396,10 +396,7 @@ The project uses JSON config files selected by the `AZTEC_ENV` environment varia **`config/config.ts`** — A `ConfigManager` singleton that loads the appropriate JSON file: -```typescript -const env = process.env.AZTEC_ENV || "local-network"; -this.configPath = path.resolve(process.cwd(), `config/${env}.json`); -``` +#include_code config-loading /config/config.ts typescript **`config/local-network.json`:** @@ -455,7 +452,7 @@ Every Aztec account is a smart contract. There are no Externally Owned Accounts The `SponsoredFPC` is a canonical Fee Payment Contract deployed at a deterministic address (salt = 0). It pays transaction fees on behalf of users, useful for onboarding when users don't have Fee Juice yet. On the local network it's pre-deployed. -#include_code get-sponsored-fpc /utils/sponsored_fpc.ts typescript +#include_code get-sponsored-fpc /src/utils/sponsored_fpc.ts typescript **Run it:** @@ -481,15 +478,7 @@ AZTEC_ENV=local-network 3. Deploy a Schnorr account (or use one from env) 4. Deploy the contract: -```typescript -const deployRequest = PodRacingContract.deploy(wallet, address); -await deployRequest.simulate({ from: address }); -const { contract: podRacingContract, instance } = await deployRequest.send({ - from: address, - fee: { paymentMethod: sponsoredPaymentMethod }, - wait: { timeout: timeouts.deployTimeout, returnReceipt: true } -}); -``` +#include_code deploy-contract /scripts/deploy_contract.ts typescript > **Important:** Always call `.simulate()` before `.send()`. Simulation runs the transaction locally and surfaces revert reasons immediately. Without it, a failing transaction hangs until timeout with an opaque error. @@ -510,20 +499,7 @@ The output includes the contract address, admin address, and instantiation data 3. Register the contract with the wallet: `wallet.registerContract(instance, PodRacingContract.artifact)` 4. Call methods: -```typescript -const podRacingContract = await PodRacingContract.at(contractAddress, wallet); - -// Simulate first — surfaces revert reasons instantly -await podRacingContract.methods.create_game(gameId).simulate({ from: address }); - -// Then send — only after simulation succeeds -await podRacingContract.methods.create_game(gameId) - .send({ - from: address, - fee: { paymentMethod: sponsoredPaymentMethod }, - wait: { timeout: timeouts.txTimeout } - }); -``` +#include_code interact-existing /scripts/interaction_existing_contract.ts typescript Set the env vars from your deploy output, then run: @@ -572,29 +548,7 @@ yarn test:nr ### 5.1 — Guided Exercise: Add a Forfeit Function -Add a `forfeit_game` function to `src/main.nr` that lets a player concede: - -```rust -#[external("public")] -fn forfeit_game(game_id: Field) { - let game = self.storage.races.at(game_id).read(); - let caller = self.context.maybe_msg_sender().unwrap(); - - // Only a player in this game can forfeit - assert(caller.eq(game.player1) | caller.eq(game.player2)); - - // The other player wins - let winner = if caller.eq(game.player1) { - game.player2 - } else { - game.player1 - }; - - // Update win history - let previous_wins = self.storage.win_history.at(winner).read(); - self.storage.win_history.at(winner).write(previous_wins + 1); -} -``` +Add a `forfeit_game` function to `src/main.nr` that lets a player concede. Compile and regenerate TypeScript bindings: @@ -604,33 +558,7 @@ yarn compile && yarn codegen ### 5.2 — Write a Noir Test -Add a test to `src/test/pod_racing.nr`: - -```rust -#[test] -unconstrained fn test_forfeit_game() { - let (mut env, contract_address, _) = utils::setup(); - let player1 = env.create_light_account(); - let player2 = env.create_light_account(); - let game_id = helpers::TEST_GAME_ID_9; - - // Setup game - helpers::setup_two_player_game(&mut env, contract_address, player1, player2, game_id); - - // Player 1 forfeits - env.call_public(player1, PodRacing::at(contract_address).forfeit_game(game_id)); - - // Verify player2's win count increased - env.public_context_at(contract_address, |context| { - let win_slot = derive_storage_slot_in_map( - PodRacing::storage_layout().win_history.slot, - player2.to_field() - ); - let wins = context.storage_read(win_slot); - assert_eq(wins, 1); - }); -} -``` +Add a test to `src/test/pod_racing.nr`. Run: @@ -640,40 +568,7 @@ yarn test:nr ### 5.3 — Write a TypeScript E2E Test -Add a test case to `src/test/e2e/index.test.ts`: - -```typescript -it("Allows a player to forfeit", async () => { - const gameId = new Fr(300); - - await setupGame( - contract, - gameId, - player1Account.address, - player2Account.address, - sponsoredPaymentMethod, - getTimeouts().txTimeout, - ); - - // Simulate first to surface revert reasons before sending - await contract.methods.forfeit_game(gameId).simulate({ - from: player1Account.address, - }); - - const tx = await contract.methods.forfeit_game(gameId).send({ - from: player1Account.address, - fee: { paymentMethod: sponsoredPaymentMethod }, - wait: { timeout: getTimeouts().txTimeout }, - }); - - expect([ - TxStatus.PROPOSED, - TxStatus.CHECKPOINTED, - TxStatus.PROVEN, - TxStatus.FINALIZED, - ]).toContain(tx.status); -}, 600000); -``` +Add a test case to `src/test/e2e/index.test.ts`. Run: @@ -699,14 +594,9 @@ yarn test:js **How it works (`scripts/multiple_wallet.ts`):** -The script creates two independent PXE instances (wallet1, wallet2), each with their own key store: +The script creates two independent `EmbeddedWallet` instances, each with their own PXE: -```typescript -const store1 = await createStore('pxe1', { dataDirectory: 'store', ... }); -const store2 = await createStore('pxe2', { dataDirectory: 'store', ... }); -const wallet1 = await TestWallet.create(node, fullConfig, { store: store1 }); -const wallet2 = await TestWallet.create(node, fullConfig, { store: store2 }); -``` +#include_code multiple-wallets /scripts/multiple_wallet.ts typescript It then deploys a Token contract from wallet1, creates an account on wallet2, mints tokens to wallet2's account, registers the token contract on wallet2, and reads balances. @@ -749,13 +639,7 @@ Devnet uses real provers and connects to the Aztec devnet at `https://next.devne **`scripts/profile_deploy.ts`** shows how to profile a transaction: -```typescript -const profileTx = await PodRacingContract.deploy(wallet, address).profile({ - profileMode: "full", - from: address, -}); -console.dir(profileTx, { depth: 2 }); -``` +#include_code profile-tx /scripts/profile_deploy.ts typescript The `.profile()` method runs the transaction through the prover and returns detailed metrics about gate counts and proving time. @@ -767,11 +651,7 @@ yarn profile **`scripts/get_block.ts`** shows how to query the Aztec node directly: -```typescript -const node = createAztecNodeClient(nodeUrl); -let block = await node.getBlock(BlockNumber(1)); -console.log(block?.header); -``` +#include_code get-block /scripts/get_block.ts typescript ```bash yarn get-block diff --git a/scripts/deploy_contract.ts b/scripts/deploy_contract.ts index ca3a6e2..b5576c9 100644 --- a/scripts/deploy_contract.ts +++ b/scripts/deploy_contract.ts @@ -41,16 +41,17 @@ async function main() { logger.info(`📋 Admin address for pod racing contract: ${address}`); logger.info('⏳ Simulating deployment transaction...'); + // docs:start:deploy-contract const deployRequest = PodRacingContract.deploy(wallet, address); await deployRequest.simulate({ from: address, }); - logger.info('✅ Simulation successful, sending transaction...'); const { contract: podRacingContract, instance } = await deployRequest.send({ from: address, fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout: timeouts.deployTimeout, returnReceipt: true } }); + // docs:end:deploy-contract logger.info(`🎉 Pod Racing Contract deployed successfully!`); logger.info(`📍 Contract address: ${podRacingContract.address}`); diff --git a/scripts/get_block.ts b/scripts/get_block.ts index a38f43d..05a0de8 100644 --- a/scripts/get_block.ts +++ b/scripts/get_block.ts @@ -3,11 +3,12 @@ import { BlockNumber } from "@aztec/foundation/branded-types"; import { getAztecNodeUrl } from "../config/config.js"; async function main() { - + // docs:start:get-block const nodeUrl = getAztecNodeUrl(); const node = createAztecNodeClient(nodeUrl); let block = await node.getBlock(BlockNumber(1)); console.log(block?.header) + // docs:end:get-block } main() diff --git a/scripts/interaction_existing_contract.ts b/scripts/interaction_existing_contract.ts index 874889b..e09b9c3 100644 --- a/scripts/interaction_existing_contract.ts +++ b/scripts/interaction_existing_contract.ts @@ -78,28 +78,27 @@ async function main() { // Register the contract with the wallet await wallet.registerContract(instance, PodRacingContract.artifact); - // Get the contract instance from the PXE + // docs:start:interact-existing const podRacingContract = await PodRacingContract.at( podRacingContractAddress, wallet ); - // Create a new game const gameId = Fr.random(); - logger.info(`Creating new game with ID: ${gameId}`); - // Simulate first to surface revert reasons before sending + // Simulate first — surfaces revert reasons instantly await podRacingContract.methods.create_game(gameId).simulate({ from: address, }); - logger.info("Simulation successful, sending transaction..."); + // Then send — only after simulation succeeds await podRacingContract.methods.create_game(gameId) .send({ from: address, fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout: timeouts.txTimeout } }); + // docs:end:interact-existing logger.info("Game created successfully!"); logger.info(`Game ${gameId} is now waiting for a second player to join.`); diff --git a/scripts/multiple_wallet.ts b/scripts/multiple_wallet.ts index 6d5f92d..ed862fd 100644 --- a/scripts/multiple_wallet.ts +++ b/scripts/multiple_wallet.ts @@ -36,9 +36,10 @@ export async function getL2TokenContractInstance(deployerAddress: any, ownerAzte } async function main() { - + // docs:start:multiple-wallets const wallet1 = await EmbeddedWallet.create(node, walletOpts); const wallet2 = await EmbeddedWallet.create(node, walletOpts); + // docs:end:multiple-wallets const sponsoredFPC = await getSponsoredFPCInstance(); await wallet1.registerContract(sponsoredFPC, SponsoredFPCContractArtifact); await wallet2.registerContract(sponsoredFPC, SponsoredFPCContractArtifact); diff --git a/scripts/profile_deploy.ts b/scripts/profile_deploy.ts index f98e4bd..443be65 100644 --- a/scripts/profile_deploy.ts +++ b/scripts/profile_deploy.ts @@ -19,8 +19,10 @@ async function main() { let accountManager = await deploySchnorrAccount(wallet); const address = accountManager.address; + // docs:start:profile-tx const profileTx = await PodRacingContract.deploy(wallet, address).profile({ profileMode: "full", from: address }); console.dir(profileTx, { depth: 2 }); + // docs:end:profile-tx } main() From 2218244f0bff0fff07e59c6378a08b2ef575f396 Mon Sep 17 00:00:00 2001 From: Josh Crites Date: Fri, 27 Mar 2026 20:55:16 +0000 Subject: [PATCH 2/5] Update Aztec version to 4.2.0-aztecnr-rc.2 and remove devnet config - Update all version references: Nargo.toml, package.json, config JSONs, README.md, CLAUDE.md, CI workflow - Update Noir contract: self.msg_sender(), self.enqueue_self.* - Update TypeScript APIs: deploy().send() returns {contract, receipt}, send() returns {receipt}, simulate() returns {result} - Replace AztecAddress.ZERO with NO_FROM for account deploys - Remove devnet config, CI workflow, and ::devnet package.json scripts - Remove isDevnet() from ConfigManager and related prover toggle Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/devnet.yaml | 36 -- .github/workflows/local-network.yaml | 2 +- CLAUDE.md | 20 +- Nargo.toml | 2 +- ONBOARDING.md | 82 ++-- README.md | 31 +- config/config.ts | 16 +- config/devnet.json | 18 - config/local-network.json | 2 +- docs/ONBOARDING.src.md | 49 +-- package.json | 29 +- scripts/deploy_contract.ts | 5 +- scripts/fees.ts | 15 +- scripts/multiple_wallet.ts | 17 +- scripts/read_debug_logs.ts | 8 +- src/main.nr | 18 +- src/test/e2e/accounts.test.ts | 17 +- src/test/e2e/index.test.ts | 14 +- src/test/e2e/public_logging.test.ts | 9 +- src/utils/deploy_account.ts | 6 +- src/utils/setup_wallet.ts | 4 +- src/utils/sponsored_fpc.ts | 2 +- yarn.lock | 554 +++++++++++++-------------- 23 files changed, 401 insertions(+), 555 deletions(-) delete mode 100644 .github/workflows/devnet.yaml delete mode 100644 config/devnet.json diff --git a/.github/workflows/devnet.yaml b/.github/workflows/devnet.yaml deleted file mode 100644 index 09b9bde..0000000 --- a/.github/workflows/devnet.yaml +++ /dev/null @@ -1,36 +0,0 @@ -name: Devnet Tests - -on: - push: - branches: - - next - - dev - pull_request: - branches: - - next - - dev - workflow_dispatch: - -jobs: - devnet-deploy-account: - name: Deploy Account to Devnet - runs-on: ubuntu-latest - env: - AZTEC_ENV: devnet - AZTEC_VERSION: 4.0.0-devnet.2-patch.1 - - steps: - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: "22" - cache: "yarn" - - - name: Install project dependencies - run: yarn - - - name: Deploy account to devnet - run: yarn deploy-account::devnet diff --git a/.github/workflows/local-network.yaml b/.github/workflows/local-network.yaml index a14f4c9..2ecd691 100644 --- a/.github/workflows/local-network.yaml +++ b/.github/workflows/local-network.yaml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest env: AZTEC_ENV: local-network - AZTEC_VERSION: 4.0.0-devnet.2-patch.1 + AZTEC_VERSION: 4.2.0-aztecnr-rc.2 steps: - name: Checkout repository diff --git a/CLAUDE.md b/CLAUDE.md index 81a3c2c..81812b4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co Aztec Starter — a Pod Racing game contract built with Noir on the Aztec network. Two players allocate points across 5 tracks over 3 rounds with private state; scores are revealed at the end (commit-reveal pattern). The player who wins more tracks (best of 5) wins. -**Aztec version: `4.0.0-devnet.2-patch.1`** — pinned across `Nargo.toml`, `package.json`, `config/*.json`, and README. All must stay in sync when updating. +**Aztec version: `4.2.0-aztecnr-rc.2`** — pinned across `Nargo.toml`, `package.json`, `config/*.json`, and README. All must stay in sync when updating. ## Build & Development Commands @@ -47,33 +47,31 @@ NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache -- ## Deployment & Scripts -All scripts support `::devnet` and `::testnet` suffixes for remote network targeting: +All scripts support `::testnet` suffixes for remote network targeting: ```bash yarn deploy # Deploy contract to local network -yarn deploy::devnet # Deploy contract to devnet yarn deploy::testnet # Deploy contract to testnet yarn deploy-account # Deploy a Schnorr account yarn multiple-wallet # Deploy from one wallet, interact from another yarn profile # Profile a transaction deployment yarn read-logs # Demo utility function for client-side debug logging -yarn read-logs::devnet # Same on devnet yarn read-logs::testnet # Same on testnet ``` ## Environment Configuration -- `AZTEC_ENV` variable selects config: `local-network` (default), `devnet`, or `testnet` -- Config files: `config/local-network.json`, `config/devnet.json`, `config/testnet.json` +- `AZTEC_ENV` variable selects config: `local-network` (default) or `testnet` +- Config files: `config/local-network.json`, `config/testnet.json` - `config/config.ts` — singleton `ConfigManager` loads the appropriate JSON based on `AZTEC_ENV` - `.env` stores secrets (SECRET, SIGNING_KEY, SALT, contract keys) — never commit ## Branch Model -- **`next` branch** — default branch; used for local network and devnet development +- **`next` branch** — default branch; used for local network development - **`testnet` branch** — used for testnet development; may run a different Aztec version -Devnet PRs target `next`. Testnet PRs target `testnet`. Each branch pins its own Aztec version independently. +PRs target `next`. Testnet PRs target `testnet`. Each branch pins its own Aztec version independently. ## Project Structure @@ -98,7 +96,7 @@ Devnet PRs target `next`. Testnet PRs target `testnet`. Each branch pins its own **TypeScript utilities:** -- `src/utils/setup_wallet.ts` — creates `EmbeddedWallet` with environment-aware config (prover enabled on devnet) +- `src/utils/setup_wallet.ts` — creates `EmbeddedWallet` with environment-aware config - `src/utils/create_account_from_env.ts` — Schnorr account from env vars - `src/utils/deploy_account.ts` — account deployment with sponsored fees - `src/utils/sponsored_fpc.ts` — SponsoredFPC (Fee Payment Contract) setup @@ -113,7 +111,7 @@ Devnet PRs target `next`. Testnet PRs target `testnet`. Each branch pins its own - **ESM project**: `"type": "module"` in package.json. All TS scripts run via `node --loader ts-node/esm`. - **Private-public interaction**: `play_round` is private (creates `GameRoundNote` notes), then enqueues a public call (`validate_and_play_round`) to update round counters. `finish_game` reads private notes, sums them, and enqueues a public call to reveal totals. - **Fee payment**: All transactions use `SponsoredFeePaymentMethod` via the SponsoredFPC contract. -- **Wallet setup**: `EmbeddedWallet.create()` with `ephemeral: true` for tests; prover is enabled only on devnet. +- **Wallet setup**: `EmbeddedWallet.create()` with `ephemeral: true` for tests. - **PXE store**: Data persists in `./store`. Must delete after local network restart to avoid stale state errors. ## Simulate Before Send (IMPORTANT) @@ -152,7 +150,7 @@ When updating the Aztec version, update all of these locations: 1. `Nargo.toml` — `aztec` dependency tag 2. `package.json` — all `@aztec/*` dependency versions -3. `config/local-network.json`, `config/devnet.json`, and/or `config/testnet.json` — `settings.version` (update the configs relevant to the branch you're on) +3. `config/local-network.json` and/or `config/testnet.json` — `settings.version` (update the configs relevant to the branch you're on) 4. `README.md` — install command version > **Note:** The `next` and `testnet` branches may pin different Aztec versions. Only update the config files relevant to the branch. diff --git a/Nargo.toml b/Nargo.toml index 0f6e610..1de7d4c 100644 --- a/Nargo.toml +++ b/Nargo.toml @@ -5,4 +5,4 @@ authors = [ "" ] compiler_version = ">=0.18.0" [dependencies] -aztec = { git = "https://github.com/AztecProtocol/aztec-nr/", tag = "v4.0.0-devnet.2-patch.1", directory = "aztec" } +aztec = { git = "https://github.com/AztecProtocol/aztec-nr/", tag = "v4.2.0-aztecnr-rc.2", directory = "aztec" } diff --git a/ONBOARDING.md b/ONBOARDING.md index 7e55cdb..72a3aa7 100644 --- a/ONBOARDING.md +++ b/ONBOARDING.md @@ -1,6 +1,6 @@ # Onboarding: From Ethereum to Aztec -This guide takes you from "reading code in a browser" to "deploying on devnet" — progressively, with no install required until Phase 3. +This guide takes you from "reading code in a browser" to "deploying contracts" — progressively, with no install required until Phase 3. **What you'll learn:** How Aztec contracts work by studying a Pod Racing game — a two-player competitive game that uses private state to implement commit-reveal in a single transaction. @@ -9,7 +9,7 @@ This guide takes you from "reading code in a browser" to "deploying on devnet" * **Phases 1-2** need only a browser (read code, compile in a Codespace) * **Phases 3-6** need local tools (deploy, interact, extend, advanced topics) -**Aztec version pinned in this repo:** `4.0.0-devnet.2-patch.1` (check `Nargo.toml` and `package.json` for source of truth) +**Aztec version pinned in this repo:** `4.2.0-aztecnr-rc.2` (check `Nargo.toml` and `package.json` for source of truth) **Links:** @@ -164,7 +164,7 @@ fn create_game(game_id: Field) { // Ensure this game_id hasn't been used yet (player1 must be zero address) assert(self.storage.races.at(game_id).read().player1.eq(AztecAddress::zero())); - let player1 = self.context.maybe_msg_sender().unwrap(); + let player1 = self.msg_sender(); debug_log_format( "Creating game {0} by player {1}", [game_id, player1.to_field()], @@ -193,7 +193,7 @@ Creates a new game. Checks the game ID isn't taken (player1 must be zero address fn join_game(game_id: Field) { let maybe_existing_game = self.storage.races.at(game_id).read(); - let player2 = self.context.maybe_msg_sender().unwrap(); + let player2 = self.msg_sender(); debug_log_format("Player {0} joining game {1}", [player2.to_field(), game_id]); // Add the caller as player2 (validates that player1 exists and player2 is empty) @@ -236,7 +236,7 @@ fn finalize_game(game_id: Field) { } ``` -Source code: /src/main.nr#Lfinalize-game +Source code: /src/main.nr#Lfinalize-game After both players have revealed, this compares track scores, determines the winner, and updates the leaderboard. @@ -314,7 +314,7 @@ fn play_round( // Validate that total points don't exceed 9 (you can't max out all tracks) assert(track1 + track2 + track3 + track4 + track5 < 10); - let player = self.context.maybe_msg_sender().unwrap(); + let player = self.msg_sender(); debug_log_format( "Player {0} playing round {1} in game {2}", [player.to_field(), round as Field, game_id], @@ -336,15 +336,11 @@ fn play_round( // Enqueue a public function call to update the round counter // This reveals that a round was played, but not the point allocation - self.enqueue(PodRacing::at(self.context.this_address()).validate_and_play_round( - player, - game_id, - round, - )); + self.enqueue_self.validate_and_play_round(player, game_id, round); } ``` -Source code: /src/main.nr#Lplay-round +Source code: /src/main.nr#Lplay-round Three things happen here that have no direct Ethereum equivalent: @@ -361,7 +357,7 @@ Three things happen here that have no direct Ethereum equivalent: // This is the "reveal" phase where private choices become public #[external("private")] fn finish_game(game_id: Field) { - let player = self.context.maybe_msg_sender().unwrap(); + let player = self.msg_sender(); debug_log_format( "Player {0} finishing game {1}", [player.to_field(), game_id], @@ -394,7 +390,7 @@ fn finish_game(game_id: Field) { // Enqueue public function to store the revealed totals on-chain // Now the revealing player's track totals will be publicly visible - self.enqueue(PodRacing::at(self.context.this_address()).validate_finish_game_and_reveal( + self.enqueue_self.validate_finish_game_and_reveal( player, game_id, total_track1, @@ -402,11 +398,11 @@ fn finish_game(game_id: Field) { total_track3, total_track4, total_track5, - )); + ); } ``` -Source code: /src/main.nr#Lfinish-game +Source code: /src/main.nr#Lfinish-game This is the "reveal" phase: @@ -526,7 +522,7 @@ The `.devcontainer/` configures: * **Base image:** Ubuntu 24.04 with Node.js v22.15.0 * **Docker-in-Docker** for running the Aztec local network -* **Aztec CLI** installed via `curl -fsSL "https://install.aztec.network/4.0.0-devnet.2-patch.1" | VERSION="4.0.0-devnet.2-patch.1" bash -s` +* **Aztec CLI** installed via `curl -fsSL "https://install.aztec.network/4.2.0-aztecnr-rc.2" | VERSION="4.2.0-aztecnr-rc.2" bash -s` * **VS Code extension:** `noir-lang.vscode-noir` for Noir syntax highlighting * **Dependencies:** `yarn install` runs automatically @@ -737,7 +733,7 @@ pub unconstrained fn setup() -> (TestEnvironment, AztecAddress, AztecAddress) { **Aztec toolkit:** ```bash -export VERSION=4.0.0-devnet.2-patch.1 +export VERSION=4.2.0-aztecnr-rc.2 curl -fsSL "https://install.aztec.network/${VERSION}" | VERSION="${VERSION}" bash -s ``` @@ -801,25 +797,11 @@ private constructor() { } ``` -**`config/devnet.json`:** - -```json -{ - "name": "devnet", - "environment": "devnet", - "network": { - "nodeUrl": "https://next.devnet.aztec-labs.com", - "l1RpcUrl": "https://ethereum-sepolia-rpc.publicnode.com", - "l1ChainId": 11155111 - } -} -``` - Key exports from `config/config.ts`: * `getAztecNodeUrl()` — returns the node URL for the current environment -* `getTimeouts()` — returns environment-specific timeout values (local: 60s tx, devnet: 180s tx) -* `getEnv()` — returns the environment name (`"local-network"` or `"devnet"`) +* `getTimeouts()` — returns environment-specific timeout values +* `getEnv()` — returns the environment name (e.g. `"local-network"`) *** @@ -880,14 +862,15 @@ const deployRequest = PodRacingContract.deploy(wallet, address); await deployRequest.simulate({ from: address, }); -const { contract: podRacingContract, instance } = await deployRequest.send({ +const { contract: podRacingContract, receipt: deployReceipt } = await deployRequest.send({ from: address, fee: { paymentMethod: sponsoredPaymentMethod }, - wait: { timeout: timeouts.deployTimeout, returnReceipt: true } + wait: { timeout: timeouts.deployTimeout } }); +const instance = deployReceipt.instance; ``` -Source code: /scripts/deploy_contract.ts#Ldeploy-contract +Source code: /scripts/deploy_contract.ts#Ldeploy-contract > **Important:** Always call `.simulate()` before `.send()`. Simulation runs the transaction locally and surfaces revert reasons immediately. Without it, a failing transaction hangs until timeout with an opaque error. @@ -1017,7 +1000,7 @@ yarn test:js ## Phase 6: Advanced Topics -**Goal:** Explore multi-wallet patterns, fee strategies, devnet, and profiling. +**Goal:** Explore multi-wallet patterns, fee strategies, and profiling. ### 6.1 — Multiple Wallets / Multiple PXEs @@ -1032,7 +1015,7 @@ const wallet1 = await EmbeddedWallet.create(node, walletOpts); const wallet2 = await EmbeddedWallet.create(node, walletOpts); ``` -Source code: /scripts/multiple_wallet.ts#Lmultiple-wallets +Source code: /scripts/multiple_wallet.ts#Lmultiple-wallets It then deploys a Token contract from wallet1, creates an account on wallet2, mints tokens to wallet2's account, registers the token contract on wallet2, and reads balances. @@ -1058,20 +1041,7 @@ yarn multiple-wallet yarn fees ``` -### 6.3 — Deploying to Devnet - -All scripts support a `::devnet` suffix: - -```bash -yarn deploy::devnet -yarn deploy-account::devnet -yarn interaction-existing-contract::devnet -yarn test::devnet -``` - -Devnet uses real provers and connects to the Aztec devnet at `https://next.devnet.aztec-labs.com` with Sepolia as the L1. Timeouts are longer (deploy: 20 min, tx: 3 min) to account for real proving time. - -### 6.4 — Transaction Profiling +### 6.3 — Transaction Profiling **`scripts/profile_deploy.ts`** shows how to profile a transaction: @@ -1088,7 +1058,7 @@ The `.profile()` method runs the transaction through the prover and returns deta yarn profile ``` -### 6.5 — Querying Blocks +### 6.4 — Querying Blocks **`scripts/get_block.ts`** shows how to query the Aztec node directly: @@ -1137,7 +1107,6 @@ yarn get-block | `scripts/get_block.ts` | Block querying | | `config/config.ts` | Config manager (loads JSON by env) | | `config/local-network.json` | Local network configuration | -| `config/devnet.json` | Devnet configuration | | `Nargo.toml` | Noir project manifest | | `.devcontainer/devcontainer.json` | GitHub Codespace configuration | | `.devcontainer/Dockerfile` | Codespace Docker image | @@ -1162,8 +1131,6 @@ yarn get-block | `yarn get-block` | Query block data | | `yarn clean` | Delete `./src/artifacts` and `./target` | | `yarn clear-store` | Delete `./store` (PXE data) | -| `yarn deploy::devnet` | Deploy to devnet | -| `yarn test::devnet` | Run E2E tests on devnet | ### C. Troubleshooting @@ -1171,7 +1138,6 @@ yarn get-block | -------------------------------------------------------- | ------------------------------------------------------------------------ | | "Store" or PXE errors after restarting the local network | Delete `./store`: `rm -rf ./store` | | Compilation errors after updating dependencies | Run `yarn compile` again | -| Timeout errors on devnet | Check timeout values in `config/devnet.json` (deploy: 20 min, tx: 3 min) | | "Contract not registered" error | Call `wallet.registerContract(instance, artifact)` before interacting | | Account not found | Ensure `.env` has correct `SECRET`, `SIGNING_KEY`, and `SALT` values | | Local network not starting | Ensure Docker is running and the correct Aztec version is installed | diff --git a/README.md b/README.md index 0dff6cc..5763657 100644 --- a/README.md +++ b/README.md @@ -10,22 +10,21 @@ This repo is meant to be a starting point for learning to write Aztec contracts and tests on the Aztec local network (local development environment). It includes an example contract, useful commands in `package.json` and helpful scripts in `./scripts`. -**New to Aztec? Start with the [Onboarding Guide](./ONBOARDING.md)** — a progressive walkthrough that takes Ethereum developers from reading code to deploying on devnet. +**New to Aztec? Start with the [Onboarding Guide](./ONBOARDING.md)** — a progressive walkthrough that takes Ethereum developers from reading code to deploying contracts. You can find the **Pod Racing Game contract** in `./src/main.nr`. A simple integration test is in `./src/test/e2e/index.test.ts`. The Pod Racing contract is a two-player competitive game where players allocate points across 5 tracks over multiple rounds. The game demonstrates Aztec's private state capabilities - round choices remain private until players reveal their final scores. -## Devnet & Testnet +## Testnet -This repo connects to a locally running Aztec local network by default, but can be configured to connect to remote networks: +This repo connects to a locally running Aztec local network by default, but can be configured to connect to testnet: -- **Devnet**: `AZTEC_ENV=devnet` — development network on the `next` branch - **Testnet**: `AZTEC_ENV=testnet` — test network on the `testnet` branch -Set the variable in a `.env` file or prefix a command, e.g. `AZTEC_ENV=devnet yarn deploy`. +Set the variable in a `.env` file or prefix a command, e.g. `AZTEC_ENV=testnet yarn deploy`. -> **Branch model:** Devnet code lives on the `next` branch. Testnet code lives on the `testnet` branch. Each branch may run a different Aztec version. +> **Branch model:** Local development code lives on the `next` branch. Testnet code lives on the `testnet` branch. Each branch may run a different Aztec version.
@@ -50,7 +49,7 @@ Use **Node.js version 22.15.0**. Install the **Aztec toolkit** (local network, CLI, and other tooling) at the correct version: ```bash -export VERSION=4.0.0-devnet.2-patch.1 +export VERSION=4.2.0-aztecnr-rc.2 curl -fsSL "https://install.aztec.network/${VERSION}" | VERSION="${VERSION}" bash -s ``` @@ -61,7 +60,6 @@ Then install project dependencies: This project uses JSON configuration files to manage environment-specific settings: - `config/local-network.json` - Configuration for local network development -- `config/devnet.json` - Configuration for devnet deployment - `config/testnet.json` - Configuration for testnet deployment The system automatically loads the appropriate configuration file based on the `AZTEC_ENV` environment variable. If `AZTEC_ENV` is not set, it defaults to `local-network`. @@ -84,22 +82,9 @@ yarn deploy # Deploy to local network yarn test # Run tests on local network ``` -### Running on Devnet - -All scripts support a `::devnet` suffix to automatically use devnet configuration: - -```bash -yarn deploy::devnet # Deploy to devnet -yarn test::devnet # Run tests on devnet -yarn deploy-account::devnet # Deploy account to devnet -yarn interaction-existing-contract::devnet # Interact with devnet contracts -``` - -The `::devnet` suffix automatically sets `AZTEC_ENV=devnet`, loading configuration from `config/devnet.json`. - ### Running on Testnet -Similarly, all scripts support a `::testnet` suffix: +All scripts support a `::testnet` suffix: ```bash yarn deploy::testnet # Deploy to testnet @@ -110,7 +95,7 @@ yarn interaction-existing-contract::testnet # Interact with testnet contracts The `::testnet` suffix sets `AZTEC_ENV=testnet`, loading configuration from `config/testnet.json`. -> **Note:** Testnet code should be developed and merged into the `testnet` branch, not `next`. The `testnet` branch may use a different Aztec version than the `next` (devnet) branch. +> **Note:** Testnet code should be developed and merged into the `testnet` branch, not `next`. The `testnet` branch may use a different Aztec version than the `next` branch. --- diff --git a/config/config.ts b/config/config.ts index 9bad4cb..1859fc9 100644 --- a/config/config.ts +++ b/config/config.ts @@ -19,7 +19,7 @@ export interface TimeoutConfig { export interface EnvironmentConfig { name: string; - environment: 'local' | 'testnet' | 'devnet' | 'mainnet'; + environment: 'local' | 'testnet' | 'mainnet'; network: NetworkConfig; settings: { skipLocalNetwork: boolean; @@ -67,10 +67,6 @@ export class ConfigManager { return this.config.network; } - public isDevnet(): boolean { - return this.config.environment === 'devnet'; - } - public isLocalNetwork(): boolean { return this.config.environment === 'local'; } @@ -92,15 +88,7 @@ export class ConfigManager { return this.config.timeouts; } - // Otherwise, use defaults based on environment - if (this.isDevnet()) { - return { - deployTimeout: 1200000, // 20 minutes - txTimeout: 180000, // 3 minutes - waitTimeout: 60000 // 1 minute - }; - } - + // Otherwise, use defaults return { deployTimeout: 120000, // 2 minutes txTimeout: 60000, // 1 minute diff --git a/config/devnet.json b/config/devnet.json deleted file mode 100644 index 0ca16e7..0000000 --- a/config/devnet.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "devnet", - "environment": "devnet", - "network": { - "nodeUrl": "https://v4-devnet-2.aztec-labs.com", - "l1RpcUrl": "https://ethereum-sepolia-rpc.publicnode.com", - "l1ChainId": 11155111 - }, - "settings": { - "skipLocalNetwork": true, - "version": "4.0.0-devnet.2-patch.1" - }, - "timeouts": { - "deployTimeout": 1200000, - "txTimeout": 180000, - "waitTimeout": 60000 - } -} diff --git a/config/local-network.json b/config/local-network.json index eb7b9df..028767a 100644 --- a/config/local-network.json +++ b/config/local-network.json @@ -8,7 +8,7 @@ }, "settings": { "skipLocalNetwork": false, - "version": "4.0.0-devnet.2-patch.1" + "version": "4.2.0-aztecnr-rc.2" }, "timeouts": { "deployTimeout": 120000, diff --git a/docs/ONBOARDING.src.md b/docs/ONBOARDING.src.md index 42efc95..47abd7c 100644 --- a/docs/ONBOARDING.src.md +++ b/docs/ONBOARDING.src.md @@ -1,6 +1,6 @@ # Onboarding: From Ethereum to Aztec -This guide takes you from "reading code in a browser" to "deploying on devnet" — progressively, with no install required until Phase 3. +This guide takes you from "reading code in a browser" to "deploying contracts" — progressively, with no install required until Phase 3. **What you'll learn:** How Aztec contracts work by studying a Pod Racing game — a two-player competitive game that uses private state to implement commit-reveal in a single transaction. @@ -9,7 +9,7 @@ This guide takes you from "reading code in a browser" to "deploying on devnet" - **Phases 1-2** need only a browser (read code, compile in a Codespace) - **Phases 3-6** need local tools (deploy, interact, extend, advanced topics) -**Aztec version pinned in this repo:** `4.0.0-devnet.2-patch.1` (check `Nargo.toml` and `package.json` for source of truth) +**Aztec version pinned in this repo:** `4.2.0-aztecnr-rc.2` (check `Nargo.toml` and `package.json` for source of truth) **Links:** @@ -262,7 +262,7 @@ The `.devcontainer/` configures: - **Base image:** Ubuntu 24.04 with Node.js v22.15.0 - **Docker-in-Docker** for running the Aztec local network -- **Aztec CLI** installed via `curl -fsSL "https://install.aztec.network/4.0.0-devnet.2-patch.1" | VERSION="4.0.0-devnet.2-patch.1" bash -s` +- **Aztec CLI** installed via `curl -fsSL "https://install.aztec.network/4.2.0-aztecnr-rc.2" | VERSION="4.2.0-aztecnr-rc.2" bash -s` - **VS Code extension:** `noir-lang.vscode-noir` for Noir syntax highlighting - **Dependencies:** `yarn install` runs automatically @@ -357,7 +357,7 @@ And higher-level helpers: **Aztec toolkit:** ```bash -export VERSION=4.0.0-devnet.2-patch.1 +export VERSION=4.2.0-aztecnr-rc.2 curl -fsSL "https://install.aztec.network/${VERSION}" | VERSION="${VERSION}" bash -s ``` @@ -412,25 +412,11 @@ The project uses JSON config files selected by the `AZTEC_ENV` environment varia } ``` -**`config/devnet.json`:** - -```json -{ - "name": "devnet", - "environment": "devnet", - "network": { - "nodeUrl": "https://next.devnet.aztec-labs.com", - "l1RpcUrl": "https://ethereum-sepolia-rpc.publicnode.com", - "l1ChainId": 11155111 - } -} -``` - Key exports from `config/config.ts`: - `getAztecNodeUrl()` — returns the node URL for the current environment -- `getTimeouts()` — returns environment-specific timeout values (local: 60s tx, devnet: 180s tx) -- `getEnv()` — returns the environment name (`"local-network"` or `"devnet"`) +- `getTimeouts()` — returns environment-specific timeout values +- `getEnv()` — returns the environment name (e.g. `"local-network"`) --- @@ -586,7 +572,7 @@ yarn test:js ## Phase 6: Advanced Topics -**Goal:** Explore multi-wallet patterns, fee strategies, devnet, and profiling. +**Goal:** Explore multi-wallet patterns, fee strategies, and profiling. ### 6.1 — Multiple Wallets / Multiple PXEs @@ -622,20 +608,7 @@ yarn multiple-wallet yarn fees ``` -### 6.3 — Deploying to Devnet - -All scripts support a `::devnet` suffix: - -```bash -yarn deploy::devnet -yarn deploy-account::devnet -yarn interaction-existing-contract::devnet -yarn test::devnet -``` - -Devnet uses real provers and connects to the Aztec devnet at `https://next.devnet.aztec-labs.com` with Sepolia as the L1. Timeouts are longer (deploy: 20 min, tx: 3 min) to account for real proving time. - -### 6.4 — Transaction Profiling +### 6.3 — Transaction Profiling **`scripts/profile_deploy.ts`** shows how to profile a transaction: @@ -647,7 +620,7 @@ The `.profile()` method runs the transaction through the prover and returns deta yarn profile ``` -### 6.5 — Querying Blocks +### 6.4 — Querying Blocks **`scripts/get_block.ts`** shows how to query the Aztec node directly: @@ -689,7 +662,6 @@ yarn get-block | `scripts/get_block.ts` | Block querying | | `config/config.ts` | Config manager (loads JSON by env) | | `config/local-network.json` | Local network configuration | -| `config/devnet.json` | Devnet configuration | | `Nargo.toml` | Noir project manifest | | `.devcontainer/devcontainer.json` | GitHub Codespace configuration | | `.devcontainer/Dockerfile` | Codespace Docker image | @@ -714,8 +686,6 @@ yarn get-block | `yarn get-block` | Query block data | | `yarn clean` | Delete `./src/artifacts` and `./target` | | `yarn clear-store` | Delete `./store` (PXE data) | -| `yarn deploy::devnet` | Deploy to devnet | -| `yarn test::devnet` | Run E2E tests on devnet | ### C. Troubleshooting @@ -723,7 +693,6 @@ yarn get-block | -------------------------------------------------------- | ------------------------------------------------------------------------ | | "Store" or PXE errors after restarting the local network | Delete `./store`: `rm -rf ./store` | | Compilation errors after updating dependencies | Run `yarn compile` again | -| Timeout errors on devnet | Check timeout values in `config/devnet.json` (deploy: 20 min, tx: 3 min) | | "Contract not registered" error | Call `wallet.registerContract(instance, artifact)` before interacting | | Account not found | Ensure `.env` has correct `SECRET`, `SIGNING_KEY`, and `SALT` values | | Local network not starting | Ensure Docker is running and the correct Aztec version is installed | diff --git a/package.json b/package.json index a3889f4..f5916c9 100644 --- a/package.json +++ b/package.json @@ -9,43 +9,34 @@ "type": "module", "scripts": { "fees": "NODE_NO_WARNINGS=1 node --loader ts-node/esm scripts/fees.ts", - "fees::devnet": "NODE_NO_WARNINGS=1 AZTEC_ENV=devnet node --loader ts-node/esm scripts/fees.ts", "clean": "rm -rf ./src/artifacts ./target ./codegenCache.json", "clear-store": "rm -rf ./store", "codegen": "aztec codegen target --outdir src/artifacts", "compile": "aztec compile", "deploy": "NODE_NO_WARNINGS=1 node --loader ts-node/esm scripts/deploy_contract.ts", - "deploy::devnet": "NODE_NO_WARNINGS=1 AZTEC_ENV=devnet node --loader ts-node/esm scripts/deploy_contract.ts", "deploy-account": "NODE_NO_WARNINGS=1 node --loader ts-node/esm scripts/deploy_account.ts", - "deploy-account::devnet": "NODE_NO_WARNINGS=1 AZTEC_ENV=devnet node --loader ts-node/esm scripts/deploy_account.ts", "interaction-existing-contract": "NODE_NO_WARNINGS=1 node --loader ts-node/esm scripts/interaction_existing_contract.ts", - "interaction-existing-contract::devnet": "NODE_NO_WARNINGS=1 AZTEC_ENV=devnet node --loader ts-node/esm scripts/interaction_existing_contract.ts", "multiple-wallet": "NODE_NO_WARNINGS=1 node --loader ts-node/esm scripts/multiple_wallet.ts", - "multiple-wallet::devnet": "NODE_NO_WARNINGS=1 AZTEC_ENV=devnet node --loader ts-node/esm scripts/multiple_wallet.ts", "get-block": "NODE_NO_WARNINGS=1 node --loader ts-node/esm scripts/get_block.ts", - "get-block::devnet": "NODE_NO_WARNINGS=1 AZTEC_ENV=devnet node --loader ts-node/esm scripts/get_block.ts", "profile": "NODE_NO_WARNINGS=1 node --loader ts-node/esm scripts/profile_deploy.ts", - "profile::devnet": "NODE_NO_WARNINGS=1 AZTEC_ENV=devnet node --loader ts-node/esm scripts/profile_deploy.ts", "read-logs": "NODE_NO_WARNINGS=1 LOG_LEVEL='info; debug:contract_log' node --loader ts-node/esm scripts/read_debug_logs.ts", - "read-logs::devnet": "NODE_NO_WARNINGS=1 LOG_LEVEL='info; debug:contract_log' AZTEC_ENV=devnet node --loader ts-node/esm scripts/read_debug_logs.ts", "test": "yarn test:js && yarn test:nr", - "test::devnet": "AZTEC_ENV=devnet yarn test:js", "test:js": "rm -rf store/pxe && NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --runInBand --config jest.integration.config.json", "test:nr": "aztec test", "docs:build": "remark docs/ONBOARDING.src.md -o ONBOARDING.md", "update-readme-version": "node ./.github/scripts/update-readme-version.js" }, "dependencies": { - "@aztec/accounts": "4.0.0-devnet.2-patch.1", - "@aztec/aztec.js": "4.0.0-devnet.2-patch.1", - "@aztec/constants": "4.0.0-devnet.2-patch.1", - "@aztec/entrypoints": "4.0.0-devnet.2-patch.1", - "@aztec/noir-contracts.js": "4.0.0-devnet.2-patch.1", - "@aztec/protocol-contracts": "4.0.0-devnet.2-patch.1", - "@aztec/pxe": "4.0.0-devnet.2-patch.1", - "@aztec/stdlib": "4.0.0-devnet.2-patch.1", - "@aztec/wallet-sdk": "4.0.0-devnet.2-patch.1", - "@aztec/wallets": "4.0.0-devnet.2-patch.1", + "@aztec/accounts": "4.2.0-aztecnr-rc.2", + "@aztec/aztec.js": "4.2.0-aztecnr-rc.2", + "@aztec/constants": "4.2.0-aztecnr-rc.2", + "@aztec/entrypoints": "4.2.0-aztecnr-rc.2", + "@aztec/noir-contracts.js": "4.2.0-aztecnr-rc.2", + "@aztec/protocol-contracts": "4.2.0-aztecnr-rc.2", + "@aztec/pxe": "4.2.0-aztecnr-rc.2", + "@aztec/stdlib": "4.2.0-aztecnr-rc.2", + "@aztec/wallet-sdk": "4.2.0-aztecnr-rc.2", + "@aztec/wallets": "4.2.0-aztecnr-rc.2", "dotenv": "^17.2.2" }, "devDependencies": { diff --git a/scripts/deploy_contract.ts b/scripts/deploy_contract.ts index b5576c9..b3683aa 100644 --- a/scripts/deploy_contract.ts +++ b/scripts/deploy_contract.ts @@ -46,11 +46,12 @@ async function main() { await deployRequest.simulate({ from: address, }); - const { contract: podRacingContract, instance } = await deployRequest.send({ + const { contract: podRacingContract, receipt: deployReceipt } = await deployRequest.send({ from: address, fee: { paymentMethod: sponsoredPaymentMethod }, - wait: { timeout: timeouts.deployTimeout, returnReceipt: true } + wait: { timeout: timeouts.deployTimeout } }); + const instance = deployReceipt.instance; // docs:end:deploy-contract logger.info(`🎉 Pod Racing Contract deployed successfully!`); diff --git a/scripts/fees.ts b/scripts/fees.ts index 990b050..bd86629 100644 --- a/scripts/fees.ts +++ b/scripts/fees.ts @@ -22,6 +22,7 @@ import { SponsoredFPCContractArtifact } from '@aztec/noir-contracts.js/Sponsored import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice'; import { createAztecNodeClient } from '@aztec/aztec.js/node'; import { AztecAddress } from '@aztec/aztec.js/addresses'; +import { NO_FROM } from '@aztec/aztec.js/account'; import { getAztecNodeUrl, getTimeouts } from '../config/config.js'; import { GasSettings } from '@aztec/stdlib/gas'; @@ -74,7 +75,7 @@ async function main() { // Simulate before sending to surface revert reasons const podRacingDeploy = PodRacingContract.deploy(wallet, account1.address); await podRacingDeploy.simulate({ from: account1.address }); - const podRacingContract = await podRacingDeploy.send({ + const { contract: podRacingContract } = await podRacingDeploy.send({ from: account1.address, fee: { paymentMethod }, wait: { timeout: timeouts.deployTimeout } @@ -82,7 +83,7 @@ async function main() { const bananaCoinDeploy = TokenContract.deploy(wallet, account1.address, "bananaCoin", "BNC", 18); await bananaCoinDeploy.simulate({ from: account1.address }); - const bananaCoin = await bananaCoinDeploy.send({ + const { contract: bananaCoin } = await bananaCoinDeploy.send({ from: account1.address, fee: { paymentMethod }, wait: { timeout: timeouts.deployTimeout } @@ -92,7 +93,7 @@ async function main() { const claimAndPay = new FeeJuicePaymentMethodWithClaim(account2.address, claim); const deployMethod = await account2.getDeployMethod(); - await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod: claimAndPay }, wait: { timeout: timeouts.deployTimeout } }); + await deployMethod.send({ from: NO_FROM, fee: { paymentMethod: claimAndPay }, wait: { timeout: timeouts.deployTimeout } }); logger.info(`New account at ${account2.address} deployed using claimed funds for fees.`) // Pay fees yourself @@ -114,7 +115,7 @@ async function main() { // This uses bananaCoin as the fee paying asset that will be exchanged for fee juice const fpcDeploy = FPCContract.deploy(wallet, bananaCoin.address, account1.address); await fpcDeploy.simulate({ from: account1.address }); - const fpc = await fpcDeploy.send({ + const { contract: fpc } = await fpcDeploy.send({ from: account1.address, fee: { paymentMethod }, wait: { timeout: timeouts.deployTimeout } @@ -135,7 +136,7 @@ async function main() { fee: { paymentMethod }, wait: { timeout: timeouts.txTimeout } }); - const bananaBalance = await bananaCoin.methods.balance_of_private(account2.address).simulate({ + const { result: bananaBalance } = await bananaCoin.methods.balance_of_private(account2.address).simulate({ from: account2.address }); @@ -147,9 +148,9 @@ async function main() { await feeJuice.methods.claim(fpc.address, fpcClaim.claimAmount, fpcClaim.claimSecret, fpcClaim.messageLeafIndex).send({ from: account2.address, wait: { timeout: timeouts.txTimeout } }); - logger.info(`Fpc fee juice balance ${await feeJuice.methods.balance_of_public(fpc.address).simulate({ + logger.info(`Fpc fee juice balance ${(await feeJuice.methods.balance_of_public(fpc.address).simulate({ from: account2.address - })}`); + })).result}`); const maxFeesPerGas = (await node.getCurrentMinFees()).mul(1.5); const gasSettings = GasSettings.default({ maxFeesPerGas }); diff --git a/scripts/multiple_wallet.ts b/scripts/multiple_wallet.ts index ed862fd..87d464c 100644 --- a/scripts/multiple_wallet.ts +++ b/scripts/multiple_wallet.ts @@ -2,19 +2,20 @@ import { Fr } from "@aztec/aztec.js/fields"; import { GrumpkinScalar } from "@aztec/foundation/curves/grumpkin"; import { getContractInstanceFromInstantiationParams, type ContractInstanceWithAddress } from "@aztec/aztec.js/contracts"; import { AztecAddress } from "@aztec/aztec.js/addresses"; +import { NO_FROM } from "@aztec/aztec.js/account"; import { SponsoredFeePaymentMethod } from "@aztec/aztec.js/fee"; import { createAztecNodeClient } from "@aztec/aztec.js/node"; import { TokenContract } from "@aztec/noir-contracts.js/Token" import { getSponsoredFPCInstance } from "../src/utils/sponsored_fpc.js"; import { SponsoredFPCContractArtifact } from "@aztec/noir-contracts.js/SponsoredFPC"; -import configManager, { getAztecNodeUrl, getTimeouts } from "../config/config.js"; +import { getAztecNodeUrl, getTimeouts } from "../config/config.js"; import { EmbeddedWallet } from "@aztec/wallets/embedded"; const nodeUrl = getAztecNodeUrl(); const node = createAztecNodeClient(nodeUrl); const walletOpts = { ephemeral: true, - pxeConfig: { proverEnabled: configManager.isDevnet() }, + pxeConfig: { proverEnabled: false }, }; const L2_TOKEN_CONTRACT_SALT = Fr.random(); @@ -53,13 +54,13 @@ async function main() { let salt = Fr.random(); let schnorrAccount = await wallet1.createSchnorrAccount(secretKey, salt, signingKey); const deployMethod = await schnorrAccount.getDeployMethod(); - await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod }, wait: { timeout: timeouts.deployTimeout } }); + await deployMethod.send({ from: NO_FROM, fee: { paymentMethod }, wait: { timeout: timeouts.deployTimeout } }); let ownerAddress = schnorrAccount.address; // Simulate before sending to surface revert reasons const tokenDeploy = TokenContract.deploy(wallet1, ownerAddress, 'Clean USDC', 'USDC', 6); await tokenDeploy.simulate({ from: ownerAddress }); - const token = await tokenDeploy.send({ + const { contract: token } = await tokenDeploy.send({ from: ownerAddress, contractAddressSalt: L2_TOKEN_CONTRACT_SALT, fee: { paymentMethod }, @@ -77,7 +78,7 @@ async function main() { // deploy account on 2nd pxe const deployMethod2 = await schnorrAccount2.getDeployMethod(); - await deployMethod2.send({ from: AztecAddress.ZERO, fee: { paymentMethod }, wait: { timeout: timeouts.deployTimeout } }); + await deployMethod2.send({ from: NO_FROM, fee: { paymentMethod }, wait: { timeout: timeouts.deployTimeout } }); let wallet2Address = schnorrAccount2.address; await wallet2.registerSender(ownerAddress, '') @@ -85,7 +86,7 @@ async function main() { // Simulate before sending to surface revert reasons await token.methods.mint_to_private(schnorrAccount2.address, 100).simulate({ from: ownerAddress }); - const private_mint_tx = await token.methods.mint_to_private(schnorrAccount2.address, 100).send({ + const { receipt: private_mint_tx } = await token.methods.mint_to_private(schnorrAccount2.address, 100).send({ from: ownerAddress, fee: { paymentMethod }, wait: { timeout: timeouts.txTimeout } @@ -113,12 +114,12 @@ async function main() { ) // Check balances - const balance = await l2TokenContract.methods.balance_of_private(wallet2Address).simulate({ + const { result: balance } = await l2TokenContract.methods.balance_of_private(wallet2Address).simulate({ from: wallet2Address }) console.log("private balance should be 100", balance) - const publicBalance = await l2TokenContract.methods.balance_of_public(wallet2Address).simulate({ + const { result: publicBalance } = await l2TokenContract.methods.balance_of_public(wallet2Address).simulate({ from: wallet2Address }) console.log("public balance should be 100", publicBalance) diff --git a/scripts/read_debug_logs.ts b/scripts/read_debug_logs.ts index 77d7b1e..b592336 100644 --- a/scripts/read_debug_logs.ts +++ b/scripts/read_debug_logs.ts @@ -14,7 +14,7 @@ import { PodRacingContract } from "../src/artifacts/PodRacing.js"; import { createLogger } from "@aztec/foundation/log"; import { SponsoredFeePaymentMethod } from "@aztec/aztec.js/fee"; import { SponsoredFPCContractArtifact } from "@aztec/noir-contracts.js/SponsoredFPC"; -import { AztecAddress } from "@aztec/aztec.js/addresses"; +import { NO_FROM } from "@aztec/aztec.js/account"; import { Fr } from "@aztec/aztec.js/fields"; import { GrumpkinScalar } from "@aztec/foundation/curves/grumpkin"; import { setupWallet } from "../src/utils/setup_wallet.js"; @@ -36,14 +36,14 @@ async function main() { // Create two player accounts const p1Account = await wallet.createSchnorrAccount(Fr.random(), Fr.random(), GrumpkinScalar.random()); await (await p1Account.getDeployMethod()).send({ - from: AztecAddress.ZERO, + from: NO_FROM, fee: { paymentMethod }, wait: { timeout: timeouts.deployTimeout }, }); const p2Account = await wallet.createSchnorrAccount(Fr.random(), Fr.random(), GrumpkinScalar.random()); await (await p2Account.getDeployMethod()).send({ - from: AztecAddress.ZERO, + from: NO_FROM, fee: { paymentMethod }, wait: { timeout: timeouts.deployTimeout }, }); @@ -57,7 +57,7 @@ async function main() { logger.info('\n--- Deploying PodRacing contract (constructor logs) ---'); const deployRequest = PodRacingContract.deploy(wallet, p1Account.address); await deployRequest.simulate({ from: p1Account.address }); - const contract = await deployRequest.send({ + const { contract } = await deployRequest.send({ from: p1Account.address, fee: { paymentMethod }, wait: { timeout: timeouts.deployTimeout }, diff --git a/src/main.nr b/src/main.nr index 9199e9a..fa597ef 100644 --- a/src/main.nr +++ b/src/main.nr @@ -76,7 +76,7 @@ pub contract PodRacing { // Ensure this game_id hasn't been used yet (player1 must be zero address) assert(self.storage.races.at(game_id).read().player1.eq(AztecAddress::zero())); - let player1 = self.context.maybe_msg_sender().unwrap(); + let player1 = self.msg_sender(); debug_log_format( "Creating game {0} by player {1}", [game_id, player1.to_field()], @@ -99,7 +99,7 @@ pub contract PodRacing { fn join_game(game_id: Field) { let maybe_existing_game = self.storage.races.at(game_id).read(); - let player2 = self.context.maybe_msg_sender().unwrap(); + let player2 = self.msg_sender(); debug_log_format("Player {0} joining game {1}", [player2.to_field(), game_id]); // Add the caller as player2 (validates that player1 exists and player2 is empty) @@ -129,7 +129,7 @@ pub contract PodRacing { // Validate that total points don't exceed 9 (you can't max out all tracks) assert(track1 + track2 + track3 + track4 + track5 < 10); - let player = self.context.maybe_msg_sender().unwrap(); + let player = self.msg_sender(); debug_log_format( "Player {0} playing round {1} in game {2}", [player.to_field(), round as Field, game_id], @@ -151,11 +151,7 @@ pub contract PodRacing { // Enqueue a public function call to update the round counter // This reveals that a round was played, but not the point allocation - self.enqueue(PodRacing::at(self.context.this_address()).validate_and_play_round( - player, - game_id, - round, - )); + self.enqueue_self.validate_and_play_round(player, game_id, round); } // docs:end:play-round @@ -184,7 +180,7 @@ pub contract PodRacing { // This is the "reveal" phase where private choices become public #[external("private")] fn finish_game(game_id: Field) { - let player = self.context.maybe_msg_sender().unwrap(); + let player = self.msg_sender(); debug_log_format( "Player {0} finishing game {1}", [player.to_field(), game_id], @@ -217,7 +213,7 @@ pub contract PodRacing { // Enqueue public function to store the revealed totals on-chain // Now the revealing player's track totals will be publicly visible - self.enqueue(PodRacing::at(self.context.this_address()).validate_finish_game_and_reveal( + self.enqueue_self.validate_finish_game_and_reveal( player, game_id, total_track1, @@ -225,7 +221,7 @@ pub contract PodRacing { total_track3, total_track4, total_track5, - )); + ); } // docs:end:finish-game diff --git a/src/test/e2e/accounts.test.ts b/src/test/e2e/accounts.test.ts index 54ec921..16f2293 100644 --- a/src/test/e2e/accounts.test.ts +++ b/src/test/e2e/accounts.test.ts @@ -12,6 +12,7 @@ import { EmbeddedWallet } from "@aztec/wallets/embedded"; import { type AztecNode, createAztecNodeClient } from "@aztec/aztec.js/node"; import { L1FeeJuicePortalManager, type L2AmountClaim } from "@aztec/aztec.js/ethereum"; import { AztecAddress } from "@aztec/aztec.js/addresses"; +import { NO_FROM } from "@aztec/aztec.js/account"; import { type Logger, createLogger } from "@aztec/foundation/log"; import { type ContractInstanceWithAddress, getContractInstanceFromInstantiationParams } from "@aztec/aztec.js/contracts"; import { Fr } from "@aztec/aztec.js/fields"; @@ -68,7 +69,7 @@ describe("Accounts", () => { let salt = Fr.random(); ownerAccount = await wallet.createSchnorrAccount(secretKey, salt, signingKey); await (await ownerAccount.getDeployMethod()).send({ - from: AztecAddress.ZERO, + from: NO_FROM, fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout: getTimeouts().deployTimeout } }); @@ -90,7 +91,7 @@ describe("Accounts", () => { }) it("Creates accounts with fee juice", async () => { - if (getEnv() === 'devnet') return; + if (getEnv() !== 'local-network') return; console.log('Starting "Creates accounts with fee juice" test'); console.log(`Random addresses: ${randomAddresses.map(a => a.toString()).join(', ')}`); @@ -98,7 +99,7 @@ describe("Accounts", () => { // balance of each random account is 0 before bridge console.log('Checking initial balances...'); let balances = await Promise.all(randomAddresses.map(async a => - await feeJuiceContract.methods.balance_of_public(a).simulate({ from: ownerAccount.address }) + (await feeJuiceContract.methods.balance_of_public(a).simulate({ from: ownerAccount.address })).result )); console.log(`Initial balances: ${balances.join(', ')}`); balances.forEach(b => expect(b).toBe(0n)); @@ -137,7 +138,7 @@ describe("Accounts", () => { for (let i = 0; i < randomAccountManagers.length; i++) { const paymentMethod = new FeeJuicePaymentMethodWithClaim(randomAddresses[i], claims[i]); await (await randomAccountManagers[i].getDeployMethod()).send({ - from: AztecAddress.ZERO, + from: NO_FROM, fee: { paymentMethod }, wait: { timeout: getTimeouts().deployTimeout } }); @@ -145,9 +146,9 @@ describe("Accounts", () => { }); it("Deploys first unfunded account from first funded account", async () => { - const receipt = await (await randomAccountManagers[0].getDeployMethod()) + const { receipt } = await (await randomAccountManagers[0].getDeployMethod()) .send({ - from: AztecAddress.ZERO, + from: NO_FROM, fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout: getTimeouts().deployTimeout, returnReceipt: true } }); @@ -177,7 +178,7 @@ describe("Accounts", () => { await Promise.all(accounts.map(async (a, i) => { logger.info(`Deploying account ${i}: ${a.address.toString()}`); return (await a.getDeployMethod()).send({ - from: AztecAddress.ZERO, + from: NO_FROM, fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout: getTimeouts().deployTimeout } }); @@ -197,7 +198,7 @@ describe("Accounts", () => { deployer: deployerAccount.getAddress() }); const deployer = new ContractDeployer(PodRacingArtifact, wallet); - const receipt = await deployer.deploy(adminAddress).send({ + const { receipt } = await deployer.deploy(adminAddress).send({ from: deployerAddress, contractAddressSalt: salt, fee: { paymentMethod: sponsoredPaymentMethod }, diff --git a/src/test/e2e/index.test.ts b/src/test/e2e/index.test.ts index 706fec9..7f35400 100644 --- a/src/test/e2e/index.test.ts +++ b/src/test/e2e/index.test.ts @@ -8,6 +8,7 @@ import { setupWallet } from "../../utils/setup_wallet.js"; import { SponsoredFPCContractArtifact } from "@aztec/noir-contracts.js/SponsoredFPC"; import { getTimeouts } from "../../../config/config.js"; import { AztecAddress } from "@aztec/aztec.js/addresses"; +import { NO_FROM } from "@aztec/aztec.js/account"; import { type Logger, createLogger } from "@aztec/foundation/log"; import { type ContractInstanceWithAddress } from "@aztec/aztec.js/contracts"; import { Fr } from "@aztec/aztec.js/fields"; @@ -54,7 +55,7 @@ async function playRound( strategy.track1, strategy.track2, strategy.track3, strategy.track4, strategy.track5 ).simulate({ from: playerAccount }); - return await contract.methods.play_round( + const { receipt } = await contract.methods.play_round( gameId, round, strategy.track1, @@ -67,6 +68,7 @@ async function playRound( fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout } }); + return receipt; } // Helper to setup a game (create + join) @@ -119,7 +121,7 @@ describe("Pod Racing Game", () => { let salt1 = Fr.random(); player1Account = await wallet.createSchnorrAccount(secretKey1, salt1, signingKey1); await (await player1Account.getDeployMethod()).send({ - from: AztecAddress.ZERO, + from: NO_FROM, fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout: getTimeouts().deployTimeout } }); @@ -129,7 +131,7 @@ describe("Pod Racing Game", () => { let salt2 = Fr.random(); player2Account = await wallet.createSchnorrAccount(secretKey2, salt2, signingKey2); await (await player2Account.getDeployMethod()).send({ - from: AztecAddress.ZERO, + from: NO_FROM, fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout: getTimeouts().deployTimeout } }); @@ -141,11 +143,11 @@ describe("Pod Racing Game", () => { // Deploy the contract once for all tests logger.info('Deploying Pod Racing contract...'); const adminAddress = player1Account.address; - contract = await PodRacingContract.deploy(wallet, adminAddress).send({ + ({ contract } = await PodRacingContract.deploy(wallet, adminAddress).send({ from: adminAddress, fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout: getTimeouts().deployTimeout } - }); + })); logger.info(`Contract deployed at: ${contract.address.toString()}`); }, 600000) @@ -160,7 +162,7 @@ describe("Pod Racing Game", () => { logger.info('Starting create game test'); const gameId = new Fr(TEST_GAME_IDS.CREATE); - const tx = await contract.methods.create_game(gameId).send({ + const { receipt: tx } = await contract.methods.create_game(gameId).send({ from: player1Account.address, fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout: getTimeouts().txTimeout } diff --git a/src/test/e2e/public_logging.test.ts b/src/test/e2e/public_logging.test.ts index 9b6022c..db8ace7 100644 --- a/src/test/e2e/public_logging.test.ts +++ b/src/test/e2e/public_logging.test.ts @@ -16,6 +16,7 @@ import { setupWallet } from "../../utils/setup_wallet.js"; import { SponsoredFPCContractArtifact } from "@aztec/noir-contracts.js/SponsoredFPC"; import { getTimeouts } from "../../../config/config.js"; import { AztecAddress } from "@aztec/aztec.js/addresses"; +import { NO_FROM } from "@aztec/aztec.js/account"; import { type Logger, createLogger } from "@aztec/foundation/log"; import { type ContractInstanceWithAddress } from "@aztec/aztec.js/contracts"; import { Fr } from "@aztec/aztec.js/fields"; @@ -48,7 +49,7 @@ describe("Public Function Logging", () => { let salt1 = Fr.random(); player1Account = await wallet.createSchnorrAccount(secretKey1, salt1, signingKey1); await (await player1Account.getDeployMethod()).send({ - from: AztecAddress.ZERO, + from: NO_FROM, fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout: getTimeouts().deployTimeout } }); @@ -58,7 +59,7 @@ describe("Public Function Logging", () => { let salt2 = Fr.random(); player2Account = await wallet.createSchnorrAccount(secretKey2, salt2, signingKey2); await (await player2Account.getDeployMethod()).send({ - from: AztecAddress.ZERO, + from: NO_FROM, fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout: getTimeouts().deployTimeout } }); @@ -70,11 +71,11 @@ describe("Public Function Logging", () => { // Deploy the contract logger.info('Deploying Pod Racing contract...'); const adminAddress = player1Account.address; - contract = await PodRacingContract.deploy(wallet, adminAddress).send({ + ({ contract } = await PodRacingContract.deploy(wallet, adminAddress).send({ from: adminAddress, fee: { paymentMethod: sponsoredPaymentMethod }, wait: { timeout: getTimeouts().deployTimeout } - }); + })); logger.info(`Contract deployed at: ${contract.address.toString()}`); }, 600000) diff --git a/src/utils/deploy_account.ts b/src/utils/deploy_account.ts index e87b2d6..52cab9f 100644 --- a/src/utils/deploy_account.ts +++ b/src/utils/deploy_account.ts @@ -5,8 +5,8 @@ import { Fr } from "@aztec/aztec.js/fields"; import { GrumpkinScalar } from "@aztec/foundation/curves/grumpkin"; import { type Logger, createLogger } from "@aztec/foundation/log"; import { setupWallet } from "./setup_wallet.js"; -import { AztecAddress } from "@aztec/aztec.js/addresses"; import { AccountManager } from "@aztec/aztec.js/wallet"; +import { NO_FROM } from "@aztec/aztec.js/account"; import { EmbeddedWallet } from "@aztec/wallets/embedded"; export async function deploySchnorrAccount(wallet?: EmbeddedWallet): Promise { @@ -42,13 +42,13 @@ export async function deploySchnorrAccount(wallet?: EmbeddedWallet): Promise { @@ -7,7 +7,7 @@ export async function setupWallet(): Promise { const node = createAztecNodeClient(nodeUrl); const wallet = await EmbeddedWallet.create(node, { ephemeral: true, - pxeConfig: { proverEnabled: configManager.isDevnet() }, + pxeConfig: { proverEnabled: false }, }); return wallet; } diff --git a/src/utils/sponsored_fpc.ts b/src/utils/sponsored_fpc.ts index 8dc5c65..817f753 100644 --- a/src/utils/sponsored_fpc.ts +++ b/src/utils/sponsored_fpc.ts @@ -25,7 +25,7 @@ export async function setupSponsoredFPC(deployer: Wallet, log: LogFn) { const deployRequest = SponsoredFPCContract.deploy(deployer); // Simulate before sending to surface revert reasons await deployRequest.simulate({ from }); - const deployed = await deployRequest + const { contract: deployed } = await deployRequest .send({ from, contractAddressSalt: new Fr(SPONSORED_FPC_SALT), diff --git a/yarn.lock b/yarn.lock index ab28657..db7a625 100644 --- a/yarn.lock +++ b/yarn.lock @@ -583,59 +583,59 @@ resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.1.1.tgz#2e67f17040b930bde00a79ffb484eb9e77472b06" integrity sha512-RcLam17LdlbSOSp9VxmUu1eI6Mwxp+OwhD2QhiSNmNCzoDb0EeUXTD2n/WbcnrAYMGlmf05th6QYq23VqvJqpA== -"@aztec/accounts@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/accounts/-/accounts-4.0.0-devnet.2-patch.1.tgz#18f6aad989fa49c724ef71d65933639a1ab74def" - integrity sha512-1zylLQOQjWK6/heWo2c2y+VKee+E5fFWptk/x8mxZFD5F8Z2jcw82TGN1keKp38V7qk0K8jROCYq/QCEZy3SKg== - dependencies: - "@aztec/aztec.js" "4.0.0-devnet.2-patch.1" - "@aztec/entrypoints" "4.0.0-devnet.2-patch.1" - "@aztec/ethereum" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" +"@aztec/accounts@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/accounts/-/accounts-4.2.0-aztecnr-rc.2.tgz#490c39d3c82f016271c12a0a9a075077b1b89cff" + integrity sha512-CTIBp0WafXcnsHQcPeGnANCIHPhibvfZFoS0lvwlY4ypeVJoNDOQTwTkvPkG1TXjnuiY2rOZ0qLK7yreJf/oFw== + dependencies: + "@aztec/aztec.js" "4.2.0-aztecnr-rc.2" + "@aztec/entrypoints" "4.2.0-aztecnr-rc.2" + "@aztec/ethereum" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" tslib "^2.4.0" -"@aztec/aztec.js@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/aztec.js/-/aztec.js-4.0.0-devnet.2-patch.1.tgz#b4d1d9d9e4e24e0ba578b3a0765c8e11def7116e" - integrity sha512-tyaKVxp/Ba2FqTtPrM0u0j8ravdqWIggKtCxO+yusyg3sV/dZGa44BFoqrPX3pXPVITrcQGgRfqhOA13hNcc/Q== - dependencies: - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/entrypoints" "4.0.0-devnet.2-patch.1" - "@aztec/ethereum" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/l1-artifacts" "4.0.0-devnet.2-patch.1" - "@aztec/protocol-contracts" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" - axios "^1.12.0" +"@aztec/aztec.js@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/aztec.js/-/aztec.js-4.2.0-aztecnr-rc.2.tgz#0aaf280d9839e27b210019a66691e62f5754cfee" + integrity sha512-tAlj7kYEto0zGa+OwvtnRENQmGbYCeKFcQEVXqAmiox8P+/iHt4KI+mRxmLgPWqhFbsZJPr33lJXSS08s8MPSA== + dependencies: + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/entrypoints" "4.2.0-aztecnr-rc.2" + "@aztec/ethereum" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/l1-artifacts" "4.2.0-aztecnr-rc.2" + "@aztec/protocol-contracts" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" + axios "^1.13.5" tslib "^2.4.0" viem "npm:@aztec/viem@2.38.2" zod "^3.23.8" -"@aztec/bb-prover@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/bb-prover/-/bb-prover-4.0.0-devnet.2-patch.1.tgz#3b9bf7ebd0229fca6f2fe056fdf3c4cdae1c8d45" - integrity sha512-7jVwLQFWuIcbeev4jxAYvcm71RH7wm/mXc3tEt5X90QAvhvDOSqNOMQal7wr2Ars8h6OTvx45S4qFkITiJyLAA== - dependencies: - "@aztec/bb.js" "4.0.0-devnet.2-patch.1" - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/noir-noirc_abi" "4.0.0-devnet.2-patch.1" - "@aztec/noir-protocol-circuits-types" "4.0.0-devnet.2-patch.1" - "@aztec/noir-types" "4.0.0-devnet.2-patch.1" - "@aztec/simulator" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" - "@aztec/telemetry-client" "4.0.0-devnet.2-patch.1" - "@aztec/world-state" "4.0.0-devnet.2-patch.1" +"@aztec/bb-prover@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/bb-prover/-/bb-prover-4.2.0-aztecnr-rc.2.tgz#3f4d5438c1a4e416cce62d7f3be6419ecfab1aa4" + integrity sha512-DcVksNFCF+wKsxQoKCnm/c0KSHVwkE42qt2uH5v1xibBsRHE24ftlRYHYrBZ9CWcZXa4Zz7beXzQEr2ZydmQQQ== + dependencies: + "@aztec/bb.js" "4.2.0-aztecnr-rc.2" + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/noir-noirc_abi" "4.2.0-aztecnr-rc.2" + "@aztec/noir-protocol-circuits-types" "4.2.0-aztecnr-rc.2" + "@aztec/noir-types" "4.2.0-aztecnr-rc.2" + "@aztec/simulator" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" + "@aztec/telemetry-client" "4.2.0-aztecnr-rc.2" + "@aztec/world-state" "4.2.0-aztecnr-rc.2" commander "^12.1.0" pako "^2.1.0" source-map-support "^0.5.21" tslib "^2.4.0" -"@aztec/bb.js@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/bb.js/-/bb.js-4.0.0-devnet.2-patch.1.tgz#4caebd7590d2aaaba229a114c10e2b39f5259d55" - integrity sha512-SEOidi9kKFSE+DGA4w9h+PPJwXGXZ8VzG0xgrZgmx9cWFZMW7BW6k2kqkrmcd1n4YXrDYAztuLacw5oDvebuzg== +"@aztec/bb.js@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/bb.js/-/bb.js-4.2.0-aztecnr-rc.2.tgz#9eab340c5aa1621caf5ed1e98e8ea99daba97064" + integrity sha512-ksFWHrm8QYAXP059paItEKCM/UhpHg5Dwl/eSp2BI6EAtD9+JlonkOwJ+94TYai2y5Gz0qnrgd65dsvDwJelVQ== dependencies: comlink "^4.4.1" commander "^12.1.0" @@ -644,54 +644,54 @@ pako "^2.1.0" tslib "^2.4.0" -"@aztec/blob-lib@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/blob-lib/-/blob-lib-4.0.0-devnet.2-patch.1.tgz#ebaaa39f99e2b03cc5051690d325971793dfbde6" - integrity sha512-UxjqZSUd/B+puRp1hOYcrymsvSgMt+qFijwm6ygQtsnntb5+IJ35TYFGWXPEgvQnE5T0/+nIEJqwc2NvOlohcA== +"@aztec/blob-lib@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/blob-lib/-/blob-lib-4.2.0-aztecnr-rc.2.tgz#6acdb7d95486012d2c520fadb074c9a7f649f2bb" + integrity sha512-iXFx9S8W5Q4AmpqtgYHB6jxnJnGIFz/68YCoZbKj6Gy+jfelU1VYCKvZc3YbqcY9s/QGN68Y9HSf8lNSMCZOcQ== dependencies: - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" "@crate-crypto/node-eth-kzg" "^0.10.0" tslib "^2.4.0" -"@aztec/builder@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/builder/-/builder-4.0.0-devnet.2-patch.1.tgz#b7afe10628e92406c2b46147cfaa258df57d9b47" - integrity sha512-gzhHfqo4fRrYkB++0jJVGdXsKFBRQCmxQRJe+4fFRT7utarK12Kfgt99WYwhTUBR5fpxrz8xp8iLuF1qHJNAOQ== +"@aztec/builder@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/builder/-/builder-4.2.0-aztecnr-rc.2.tgz#dcc52b99b3a217472cd36948125ff2d6c20bacdf" + integrity sha512-W4AjGJgi0AhGiniO3cVTBFnsy5wUOJ6922EoOcMFQ1CP/ZMOIYAqRfYagF2eFaYnExEeZC46cuOgHhir9at1PA== dependencies: - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" commander "^12.1.0" -"@aztec/constants@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/constants/-/constants-4.0.0-devnet.2-patch.1.tgz#42c12878146347b972b4fc40082cc0ca1b65f53b" - integrity sha512-rVM0ATvof5Ve4GHGbnvOvJ468CCeYVPrfLGvLs9dv567EHU7Z78y3P4vXm8JsW1pqXXcldqn2f9591R7dKMYHg== +"@aztec/constants@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/constants/-/constants-4.2.0-aztecnr-rc.2.tgz#f065f4159f8e3b02874b738d5f6a8576ebdcb27c" + integrity sha512-CxctSLeUP59HJoxHXmczleJyta7DLuqz5FV2Jbq0Bqx/saMbhkCXfm6I9KnnlhvXdFZ+y2d3J1BrDTg0dEapIg== dependencies: - "@aztec/foundation" "4.0.0-devnet.2-patch.1" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" tslib "^2.4.0" -"@aztec/entrypoints@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/entrypoints/-/entrypoints-4.0.0-devnet.2-patch.1.tgz#e826a124d471954dfd04e9b5e788a20c80fce1c2" - integrity sha512-BqmKOuvMmWjL1MQFLIQUiCN9LBfqyFvOqFzLhxqnhQsKmjRMjmOFra5OBQMjmi04P7a1nIg45UgV+q41CoC/ag== +"@aztec/entrypoints@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/entrypoints/-/entrypoints-4.2.0-aztecnr-rc.2.tgz#5ea8f8edfbd8b4928f5d5201be13282a2ad5b3e9" + integrity sha512-2+/GWwJ/UsOIJArXqP4MaNXl4xZrN4d74znkTbLio6us5NBK/B/4OjtCkEZD5Qwb7DdNGfXSP088bs/yQX8Y6A== dependencies: - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/protocol-contracts" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/protocol-contracts" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" tslib "^2.4.0" zod "^3.23.8" -"@aztec/ethereum@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/ethereum/-/ethereum-4.0.0-devnet.2-patch.1.tgz#796a27822324ad6611c6b5932549d3689df65aef" - integrity sha512-MqdZBa3V/b8X80aVRa26V5yxo8gWWcSPfG7r4EaMQ2otA7t8MHRLJffN1TNwkYqJPCBuLiZpVGYM2gQw1qmx/A== +"@aztec/ethereum@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/ethereum/-/ethereum-4.2.0-aztecnr-rc.2.tgz#76cb2bfd7ec78a7126275ea4cafe1d3247d155f1" + integrity sha512-Xbrr0TqXZrY2OAsP72MINmiV9xBqDTd8zk8zTudUlnv8947wsYYPS6O0HcegM3xzQkJJoFDE5ZH3QiHiVxePoA== dependencies: - "@aztec/blob-lib" "4.0.0-devnet.2-patch.1" - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/l1-artifacts" "4.0.0-devnet.2-patch.1" + "@aztec/blob-lib" "4.2.0-aztecnr-rc.2" + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/l1-artifacts" "4.2.0-aztecnr-rc.2" "@viem/anvil" "^0.0.10" dotenv "^16.0.3" lodash.chunk "^4.2.0" @@ -700,12 +700,12 @@ viem "npm:@aztec/viem@2.38.2" zod "^3.23.8" -"@aztec/foundation@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/foundation/-/foundation-4.0.0-devnet.2-patch.1.tgz#670df4ddb5289d5f684e25261adc7b8aa86e2eae" - integrity sha512-s61AqiRhueNVqvCh+11QY/pWExmBtMYq1aD0nXt7ocpkbVEjbuP/1AzmIej5UDcUnC2l+2Z89dDiz4uXDd8pyQ== +"@aztec/foundation@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/foundation/-/foundation-4.2.0-aztecnr-rc.2.tgz#fd422e642bb424072e16b40ba2c932cdf11b0718" + integrity sha512-iNLLuhWISJIY1Mo4TSqDuMhP7lbVNKcHzYLCujY7sTIQHg358vNShDiFqUat9fMuigBFD8o+JuRr+xX8jl1WPQ== dependencies: - "@aztec/bb.js" "4.0.0-devnet.2-patch.1" + "@aztec/bb.js" "4.2.0-aztecnr-rc.2" "@koa/cors" "^5.0.0" "@noble/curves" "=1.7.0" "@noble/hashes" "^1.6.1" @@ -728,140 +728,140 @@ undici "^5.28.5" zod "^3.23.8" -"@aztec/key-store@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/key-store/-/key-store-4.0.0-devnet.2-patch.1.tgz#4f1f942641aac7234b98f6d32077bf453bfc09ea" - integrity sha512-UNMWNrfOCrRa9zKeHDOVN0YXUGhgMU477foTPcZ5YvAtYTJlQ8znbJ6xiaMWEJEroDIl5aorGlLIdxY3sseKRw== +"@aztec/key-store@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/key-store/-/key-store-4.2.0-aztecnr-rc.2.tgz#93c52fbd3f8cf875343669b1d00b5d86c0ed9925" + integrity sha512-48v0REsHRYbD5ShwN3GpQNTmsHB5k9Yvme43Yf4HpCNNl7Z3JPnxKs395HZSb6pNUltvV8s8pjN9+9q3o0fr1w== dependencies: - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/kv-store" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/kv-store" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" tslib "^2.4.0" -"@aztec/kv-store@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/kv-store/-/kv-store-4.0.0-devnet.2-patch.1.tgz#16afe1fcd60d835f77e8583e9d998bd992f6956c" - integrity sha512-z4IyhmseSFnP2shRtf6wmQxxMBwr7atdUnpYGP+y2L6LWtTvQ4wnHNY7wx/nSFcJ79bkyJF+j5DxJPCgcxDk7g== +"@aztec/kv-store@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/kv-store/-/kv-store-4.2.0-aztecnr-rc.2.tgz#97f1e1e4dd5e595061a2f3b85ab394b9d2a6aa57" + integrity sha512-svqtFq0PzAd9WUnAGtOKg9OFQQZbxlbklkbX00Jk4OLYnA0U6cWQLwPUWedzYQfE/ueK6wSoFjWj2ghQe8gMGg== dependencies: - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/ethereum" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/native" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/ethereum" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/native" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" idb "^8.0.0" lmdb "^3.2.0" msgpackr "^1.11.2" ohash "^2.0.11" ordered-binary "^1.5.3" -"@aztec/l1-artifacts@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/l1-artifacts/-/l1-artifacts-4.0.0-devnet.2-patch.1.tgz#d5d5e5c79b38d21047bb7100072dc37d4cba2ffe" - integrity sha512-Tj7BtWas0Z2zP390hLrZGBgvvmWJ33YIxwb+m8M/qdeAQNhszn3KFX0dPRH6kNiuBl/iikxLhjL+C5R1eLkgnA== +"@aztec/l1-artifacts@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/l1-artifacts/-/l1-artifacts-4.2.0-aztecnr-rc.2.tgz#42af9b2a6c8de7c47b41f4f5ed395ccde3f67d76" + integrity sha512-LbrF85CPKx4qfevV7JeVz5FDQytcxeGIdtjXChL2THKKmPAbr+TFOv3Qdb6EGP55sRM4MFrDE+Z6K9HMrnELdA== dependencies: tslib "^2.4.0" -"@aztec/merkle-tree@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/merkle-tree/-/merkle-tree-4.0.0-devnet.2-patch.1.tgz#a4a1105408abb3b86defb3f3bb85e23fd497c949" - integrity sha512-vmKwpOeKSE72Uj8XgOqdjys9jyEEfcJWIoVG2c/b/1hVBsp3+nARWIB73ksqjzfSbxSq3INZMYYjEWTiFfDbDA== +"@aztec/merkle-tree@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/merkle-tree/-/merkle-tree-4.2.0-aztecnr-rc.2.tgz#023281b061799821ca1136227859cab4950afc7e" + integrity sha512-dVbuh79Oc/kVx3MPis5Qwn1+m/u0jyHHat8Q1DAX+L1d6GSqGYaqSj0BBN5zkKEIjRCi53o7k7KUuJvv5TjzqA== dependencies: - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/kv-store" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/kv-store" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" sha256 "^0.2.0" tslib "^2.4.0" -"@aztec/native@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/native/-/native-4.0.0-devnet.2-patch.1.tgz#055c6530bf5121dc74a40d7cff3376f230f5e0b1" - integrity sha512-ljlDodg+QDpJjdobfu//6sb8J2crGNUmZfEDBQtq1FU/3WZGDEVw+Dpie3IM+U92Ca6nhe1/xCEy1GTacpuFpg== +"@aztec/native@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/native/-/native-4.2.0-aztecnr-rc.2.tgz#5acd395123da89b97be944415d37e25c867f9b97" + integrity sha512-4q+r7ejGipckbcIyj2yGbekN7fOC0PXQ1/OgqRyS3ird26aI5UsNVxuTAyFMrhIHJL98eZ8cjbc/Sf7lOpEk3w== dependencies: - "@aztec/bb.js" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" + "@aztec/bb.js" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" msgpackr "^1.11.2" -"@aztec/noir-acvm_js@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/noir-acvm_js/-/noir-acvm_js-4.0.0-devnet.2-patch.1.tgz#3ac027dbdc465e1d5180bcb9d0004f0c58187e18" - integrity sha512-wXi4cqLN/5jENfJtHTg5MZSBoU1/OPbAXozWmpi6yP26rBmVQY7c4Fq0D7HwxoGgBoYfflweszM9ZEhKS8Srlg== +"@aztec/noir-acvm_js@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/noir-acvm_js/-/noir-acvm_js-4.2.0-aztecnr-rc.2.tgz#5508016147afb9502acb1151a92cf3de4f61ed85" + integrity sha512-OBubDpTTYEcz2EX8APl1mfn3OHDvMuZIm0t1//+u1BZbosrAjCpI76Vz39DNKpCZups4A+dJKHXlkj+RsFstbw== -"@aztec/noir-contracts.js@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/noir-contracts.js/-/noir-contracts.js-4.0.0-devnet.2-patch.1.tgz#acbd0b4997115506da395c0a4200415678dea73e" - integrity sha512-BMyF++ifcnwd6ydcYJ9EmCvA1MEr0XkoAJhVImqUkYGQmGo9qXFlspQ908pz4nsfJ6Id4bz3DlReJFiuufvQAQ== +"@aztec/noir-contracts.js@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/noir-contracts.js/-/noir-contracts.js-4.2.0-aztecnr-rc.2.tgz#38a2c9c72245ba9f122be83fef0d1edcdf147564" + integrity sha512-WYNXApevXSEHggthbwgA5HIF1yP4s1bx4pNbZPPgV69AOQwjCjztTE6G3VCUrsC2sB+loNMnre2Csld0RrUXIQ== dependencies: - "@aztec/aztec.js" "4.0.0-devnet.2-patch.1" + "@aztec/aztec.js" "4.2.0-aztecnr-rc.2" tslib "^2.4.0" -"@aztec/noir-noir_codegen@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/noir-noir_codegen/-/noir-noir_codegen-4.0.0-devnet.2-patch.1.tgz#1e1419a7e58de6b3e0b12666de5325439dc7f4d7" - integrity sha512-E0mHd74YwJ6ZrBk64zjdN37DywavGMoRQZicDdc1CRIu/rKU94de+KJbH7xH+fIDQ1H23uEV555uajNo36zhDA== +"@aztec/noir-noir_codegen@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/noir-noir_codegen/-/noir-noir_codegen-4.2.0-aztecnr-rc.2.tgz#1058dc85fd4810797e92f9b1a8f6f8be69ac663d" + integrity sha512-gnBaP+uL3uXqbFGUE/qssoHhQRjThZBKAuSwo4IRsVW8iwMLS9LdJntUWfqyB599vE7b1OL9q1UfUdu0DJbALg== dependencies: - "@aztec/noir-types" "4.0.0-devnet.2-patch.1" + "@aztec/noir-types" "4.2.0-aztecnr-rc.2" glob "^13.0.0" ts-command-line-args "^2.5.1" -"@aztec/noir-noirc_abi@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/noir-noirc_abi/-/noir-noirc_abi-4.0.0-devnet.2-patch.1.tgz#26fe7a639d0fe2d7c03828fc0e07db7bf7f9f338" - integrity sha512-9cxLL0BZi0Jw7VT8OK9qYbH7Z7tdz0TIfDHDfiFsXSmtABflAN7XMZ1DwJnwIqPDoTVTBTev99Y9Wh01zyBbWg== - dependencies: - "@aztec/noir-types" "4.0.0-devnet.2-patch.1" - -"@aztec/noir-protocol-circuits-types@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/noir-protocol-circuits-types/-/noir-protocol-circuits-types-4.0.0-devnet.2-patch.1.tgz#e77c3569d82503b4a57ae7d1a79ec2ddabc81ccd" - integrity sha512-rzMyITJvLprXu+TXGSUeisrbl5A1cVZGui5KlaPo+FrqL+GKbBypvqicMgGnirHQ5uDbYH2j/W9IYnlYvwDhoA== - dependencies: - "@aztec/blob-lib" "4.0.0-devnet.2-patch.1" - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/noir-acvm_js" "4.0.0-devnet.2-patch.1" - "@aztec/noir-noir_codegen" "4.0.0-devnet.2-patch.1" - "@aztec/noir-noirc_abi" "4.0.0-devnet.2-patch.1" - "@aztec/noir-types" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" +"@aztec/noir-noirc_abi@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/noir-noirc_abi/-/noir-noirc_abi-4.2.0-aztecnr-rc.2.tgz#a909d9ac5fd8af38f7b5d4de9d7528a98e1e1b76" + integrity sha512-ivXHmrH7hoSB3dVJHws78+GrRq9w0sSLteTzkucXEC7BQ6G5mYArK6eZ3d/S1tr8x+himjU10A9h3yjsMXGb0A== + dependencies: + "@aztec/noir-types" "4.2.0-aztecnr-rc.2" + +"@aztec/noir-protocol-circuits-types@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/noir-protocol-circuits-types/-/noir-protocol-circuits-types-4.2.0-aztecnr-rc.2.tgz#28fd59c5c867ad8ab1ddf436caca4a031acf1277" + integrity sha512-ZlY4SyqbAfYmSL7FGNLwet1ELbRsuEcAybPCFP0xp1Td5tLjHTQ7i37u6RPu8NSalpia4ziU5lF25Ng0suzung== + dependencies: + "@aztec/blob-lib" "4.2.0-aztecnr-rc.2" + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/noir-acvm_js" "4.2.0-aztecnr-rc.2" + "@aztec/noir-noir_codegen" "4.2.0-aztecnr-rc.2" + "@aztec/noir-noirc_abi" "4.2.0-aztecnr-rc.2" + "@aztec/noir-types" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" change-case "^5.4.4" tslib "^2.4.0" -"@aztec/noir-types@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/noir-types/-/noir-types-4.0.0-devnet.2-patch.1.tgz#080ee9514c85bd0b8698b3a5321646449b46ad22" - integrity sha512-W6bY7YyYXNYYOt/xbIfiZEh8k+pDraxmK1UiU67JO+UYMz4cEru7utJ0vhJ7zbBhvZxRNP9Y59TjfKy5vBYyag== +"@aztec/noir-types@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/noir-types/-/noir-types-4.2.0-aztecnr-rc.2.tgz#097171c8fd310e7063c6b08892c280577cd4e822" + integrity sha512-5lP70mkEDZymZ+XyUjP4V9lGTISWQi4vLD+btSQC89KXBQan5a+wL/sJdizy2LtqX8AacXb3lta+Sq8n5BcheA== -"@aztec/protocol-contracts@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/protocol-contracts/-/protocol-contracts-4.0.0-devnet.2-patch.1.tgz#f15bf67904e005b3658896923a6b8a254afa1b29" - integrity sha512-7gcHZvqD2RgdtSp28KWS3Xsr7PbiYNj1GP3tcHtmCzCCFJnTCiruNdDWpW1Z4zojlcAWlddUG95enrjTliI8ZA== +"@aztec/protocol-contracts@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/protocol-contracts/-/protocol-contracts-4.2.0-aztecnr-rc.2.tgz#774e8e34cca922a8051625899c2e252e3d2fe1c4" + integrity sha512-3y+KN1kmUJGvILkEkRe/Zl+sakWsEqadY3XxficnSaD8Gf6YCH1OH/tpZwc/CCw9iFwvuJxMGMo5EffXFkLB4Q== dependencies: - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" lodash.chunk "^4.2.0" lodash.omit "^4.5.0" tslib "^2.4.0" -"@aztec/pxe@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/pxe/-/pxe-4.0.0-devnet.2-patch.1.tgz#fb554f1d2ef29aa49a2767c30ffb7a2b0ef2294f" - integrity sha512-AJcBsKQhYxitn8QM5HN1Rwoz7D5dCuYh2U5T6VIFRyGC4c0hp+lFoY20/5D2rG04O2JdUx1cDJDhg2R7ZVw+vQ== - dependencies: - "@aztec/bb-prover" "4.0.0-devnet.2-patch.1" - "@aztec/bb.js" "4.0.0-devnet.2-patch.1" - "@aztec/builder" "4.0.0-devnet.2-patch.1" - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/ethereum" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/key-store" "4.0.0-devnet.2-patch.1" - "@aztec/kv-store" "4.0.0-devnet.2-patch.1" - "@aztec/noir-protocol-circuits-types" "4.0.0-devnet.2-patch.1" - "@aztec/noir-types" "4.0.0-devnet.2-patch.1" - "@aztec/protocol-contracts" "4.0.0-devnet.2-patch.1" - "@aztec/simulator" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" +"@aztec/pxe@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/pxe/-/pxe-4.2.0-aztecnr-rc.2.tgz#5e2ee2d1352ea4bb91e1ca2ea52f553c47c13e67" + integrity sha512-V8p0EvbhYdAif7oQ3ihQ1GmPgTN5zBKGtwyWm8q+CW/eAOXLV3MLxyFUiHCHQGg9chbPnxbPvtyOfeMvbwwWRg== + dependencies: + "@aztec/bb-prover" "4.2.0-aztecnr-rc.2" + "@aztec/bb.js" "4.2.0-aztecnr-rc.2" + "@aztec/builder" "4.2.0-aztecnr-rc.2" + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/ethereum" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/key-store" "4.2.0-aztecnr-rc.2" + "@aztec/kv-store" "4.2.0-aztecnr-rc.2" + "@aztec/noir-protocol-circuits-types" "4.2.0-aztecnr-rc.2" + "@aztec/noir-types" "4.2.0-aztecnr-rc.2" + "@aztec/protocol-contracts" "4.2.0-aztecnr-rc.2" + "@aztec/simulator" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" koa "^2.16.1" koa-router "^13.1.1" lodash.omit "^4.5.0" @@ -869,42 +869,42 @@ tslib "^2.4.0" viem "npm:@aztec/viem@2.38.2" -"@aztec/simulator@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/simulator/-/simulator-4.0.0-devnet.2-patch.1.tgz#2cc70cf9af6f07b20379fc3b9f203ef10f69c9b0" - integrity sha512-etecxwltlKQ9vdSPtC1iByNcWrWfSLFQZeXviFpBV8Uj67v0H3nJ+86wgG9ivJ0yreWo+pgTKeX7GRyz+W/J6g== - dependencies: - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/native" "4.0.0-devnet.2-patch.1" - "@aztec/noir-acvm_js" "4.0.0-devnet.2-patch.1" - "@aztec/noir-noirc_abi" "4.0.0-devnet.2-patch.1" - "@aztec/noir-protocol-circuits-types" "4.0.0-devnet.2-patch.1" - "@aztec/noir-types" "4.0.0-devnet.2-patch.1" - "@aztec/protocol-contracts" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" - "@aztec/telemetry-client" "4.0.0-devnet.2-patch.1" - "@aztec/world-state" "4.0.0-devnet.2-patch.1" +"@aztec/simulator@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/simulator/-/simulator-4.2.0-aztecnr-rc.2.tgz#b8214ce2431350846996f4dafecee1e2ab87191e" + integrity sha512-Sw8nrUrmS1GqKJ0GTNM1ObAJ6SqvmdZxcJlddAjCCbxRRCPaXyjGLdNyNj1uTs/VKleplN/mKzXU74582U7wqg== + dependencies: + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/native" "4.2.0-aztecnr-rc.2" + "@aztec/noir-acvm_js" "4.2.0-aztecnr-rc.2" + "@aztec/noir-noirc_abi" "4.2.0-aztecnr-rc.2" + "@aztec/noir-protocol-circuits-types" "4.2.0-aztecnr-rc.2" + "@aztec/noir-types" "4.2.0-aztecnr-rc.2" + "@aztec/protocol-contracts" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" + "@aztec/telemetry-client" "4.2.0-aztecnr-rc.2" + "@aztec/world-state" "4.2.0-aztecnr-rc.2" lodash.clonedeep "^4.5.0" lodash.merge "^4.6.2" tslib "^2.4.0" -"@aztec/stdlib@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/stdlib/-/stdlib-4.0.0-devnet.2-patch.1.tgz#429e9bf8ed4f2e9baf8d6e23dca41eb85b879176" - integrity sha512-pgNAoejMOw7Xv+q+TkQScZ70D4eQxh5qUMyrwy1gYR3NXuHZahqKwg87eWP1JvqIitWD2n0jW2w49hU3rHmErg== +"@aztec/stdlib@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/stdlib/-/stdlib-4.2.0-aztecnr-rc.2.tgz#15d9e3afee55b38d6d6ad2ee63ab3a7a790f3306" + integrity sha512-Kf1rmn+s6DWKkLrKgj7VNe4/G93zY7n2URgLJTfavScJIoZXLtxy6Z8DtyukzDCa30Ux1ATni/ydDEC64UBxfw== dependencies: "@aws-sdk/client-s3" "^3.892.0" - "@aztec/bb.js" "4.0.0-devnet.2-patch.1" - "@aztec/blob-lib" "4.0.0-devnet.2-patch.1" - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/ethereum" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/l1-artifacts" "4.0.0-devnet.2-patch.1" - "@aztec/noir-noirc_abi" "4.0.0-devnet.2-patch.1" - "@aztec/validator-ha-signer" "4.0.0-devnet.2-patch.1" + "@aztec/bb.js" "4.2.0-aztecnr-rc.2" + "@aztec/blob-lib" "4.2.0-aztecnr-rc.2" + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/ethereum" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/l1-artifacts" "4.2.0-aztecnr-rc.2" + "@aztec/noir-noirc_abi" "4.2.0-aztecnr-rc.2" + "@aztec/validator-ha-signer" "4.2.0-aztecnr-rc.2" "@google-cloud/storage" "^7.15.0" - axios "^1.12.0" + axios "^1.13.5" json-stringify-deterministic "1.0.12" lodash.chunk "^4.2.0" lodash.isequal "^4.5.0" @@ -916,13 +916,13 @@ viem "npm:@aztec/viem@2.38.2" zod "^3.23.8" -"@aztec/telemetry-client@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/telemetry-client/-/telemetry-client-4.0.0-devnet.2-patch.1.tgz#e5c601c5eeb766ce5d87d495b9b080c0c9290d65" - integrity sha512-hrLHKcUYP9p4/5OzQxYhD9fUrywalOn/WwxladNICc4AoAkirbvS8cC6I03JfuQXVe5fR6GhEpr3J2nI7/dVtA== +"@aztec/telemetry-client@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/telemetry-client/-/telemetry-client-4.2.0-aztecnr-rc.2.tgz#c5a0a7933d3054a68cacf3be43d76c6fd48e5ff3" + integrity sha512-6NwrUng4b9ZJIuwNEGkDczsyI5S6AtZG/RdxkEGt0CvimXkpUwjQE/Rrea0mpHnc8fVjG5lD0vKk3LpnngCyhA== dependencies: - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" "@opentelemetry/api" "^1.9.0" "@opentelemetry/api-logs" "^0.55.0" "@opentelemetry/core" "^1.28.0" @@ -940,58 +940,58 @@ prom-client "^15.1.3" viem "npm:@aztec/viem@2.38.2" -"@aztec/validator-ha-signer@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/validator-ha-signer/-/validator-ha-signer-4.0.0-devnet.2-patch.1.tgz#c81ea2d08d5d60870e36cd20fe3b5a9cfafe3074" - integrity sha512-vp9dMqK5RzDzpKwnXSb99XNosOExDBUsjCAFDPoRz5RJZlEvgHOptPKB45YiQlHkWxZGLXKQil26DP+LcxALeA== +"@aztec/validator-ha-signer@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/validator-ha-signer/-/validator-ha-signer-4.2.0-aztecnr-rc.2.tgz#03d34775e7cf099122d3cfee592663e4b78d4924" + integrity sha512-VYTfdAKUIn0ruRVx/+h9XAoyPeT+THJeBo5ClXU336Kctdo1Ybb3IYyEDYuwHeqm7DpiHuNN0wAhkHohAO78KA== dependencies: - "@aztec/ethereum" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" + "@aztec/ethereum" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" node-pg-migrate "^8.0.4" pg "^8.11.3" tslib "^2.4.0" zod "^3.23.8" -"@aztec/wallet-sdk@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/wallet-sdk/-/wallet-sdk-4.0.0-devnet.2-patch.1.tgz#9d8dcb3828c8de8378a54b22c17bfbc36f9e8b41" - integrity sha512-Hmp/Dz/Pt0c8+h231LRTwUAt7MiKa94q3KTsTQir9xIz+ZyJKTnvrWBIzgCbLAUZQy/XpOSWrHsLk99FOX2EKg== - dependencies: - "@aztec/aztec.js" "4.0.0-devnet.2-patch.1" - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/entrypoints" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/pxe" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" - -"@aztec/wallets@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/wallets/-/wallets-4.0.0-devnet.2-patch.1.tgz#af858fd4673279fe84758e41fa9198caf04c397b" - integrity sha512-g34ULDFovIVmXv2VpkydAFkmp8mmDkHd94/+8BFwKzieg7omlIwQqSvGaClki7nxWBeLJ6r71OD8PK8PV54qpQ== - dependencies: - "@aztec/accounts" "4.0.0-devnet.2-patch.1" - "@aztec/aztec.js" "4.0.0-devnet.2-patch.1" - "@aztec/entrypoints" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/kv-store" "4.0.0-devnet.2-patch.1" - "@aztec/protocol-contracts" "4.0.0-devnet.2-patch.1" - "@aztec/pxe" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" - "@aztec/wallet-sdk" "4.0.0-devnet.2-patch.1" - -"@aztec/world-state@4.0.0-devnet.2-patch.1": - version "4.0.0-devnet.2-patch.1" - resolved "https://registry.yarnpkg.com/@aztec/world-state/-/world-state-4.0.0-devnet.2-patch.1.tgz#9c3c7c02e58f6e1b156e930a1292e7d49826e4ff" - integrity sha512-3NqI9Y8rhWp4pWD5qTO3QGoXTIajuTwoz3Up2/Sif7q/blBfnqfU5fiImiZgXER7waxDtJkBzeji02KhJip0uA== - dependencies: - "@aztec/constants" "4.0.0-devnet.2-patch.1" - "@aztec/foundation" "4.0.0-devnet.2-patch.1" - "@aztec/kv-store" "4.0.0-devnet.2-patch.1" - "@aztec/merkle-tree" "4.0.0-devnet.2-patch.1" - "@aztec/native" "4.0.0-devnet.2-patch.1" - "@aztec/protocol-contracts" "4.0.0-devnet.2-patch.1" - "@aztec/stdlib" "4.0.0-devnet.2-patch.1" - "@aztec/telemetry-client" "4.0.0-devnet.2-patch.1" +"@aztec/wallet-sdk@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/wallet-sdk/-/wallet-sdk-4.2.0-aztecnr-rc.2.tgz#d1f43d1260cc2582d279ab801f2bd0958949b8a1" + integrity sha512-ffJ41ln5GQfxHwM6D25VUpXH/vjQ1HWKd3TmVaa4Kwt3nLeNR3VGvUHeivm74eXh53a+eAJFi3SbwEEqsWM0mA== + dependencies: + "@aztec/aztec.js" "4.2.0-aztecnr-rc.2" + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/entrypoints" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/pxe" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" + +"@aztec/wallets@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/wallets/-/wallets-4.2.0-aztecnr-rc.2.tgz#d065e281abeef29366089001cf61f72cfd89f132" + integrity sha512-+REyXLuG2OpzqqxDKkgrcXZKh+9/ob1X1T6TLx0cEgqft8QzOlcgYw7qxMGa7Unf0o+2SS3fvFM7oXn8hB45Bw== + dependencies: + "@aztec/accounts" "4.2.0-aztecnr-rc.2" + "@aztec/aztec.js" "4.2.0-aztecnr-rc.2" + "@aztec/entrypoints" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/kv-store" "4.2.0-aztecnr-rc.2" + "@aztec/protocol-contracts" "4.2.0-aztecnr-rc.2" + "@aztec/pxe" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" + "@aztec/wallet-sdk" "4.2.0-aztecnr-rc.2" + +"@aztec/world-state@4.2.0-aztecnr-rc.2": + version "4.2.0-aztecnr-rc.2" + resolved "https://registry.yarnpkg.com/@aztec/world-state/-/world-state-4.2.0-aztecnr-rc.2.tgz#a1dc76ec863bf5f687b80517745f3955ed225fc5" + integrity sha512-lpjp2p6aLbW/6j7Buskrew6PP8uL/ZbUX2hy9Lt3DGYhygi072jUnMjbUHAQnj4elRbzWMtLmKEH16/6hrYaCg== + dependencies: + "@aztec/constants" "4.2.0-aztecnr-rc.2" + "@aztec/foundation" "4.2.0-aztecnr-rc.2" + "@aztec/kv-store" "4.2.0-aztecnr-rc.2" + "@aztec/merkle-tree" "4.2.0-aztecnr-rc.2" + "@aztec/native" "4.2.0-aztecnr-rc.2" + "@aztec/protocol-contracts" "4.2.0-aztecnr-rc.2" + "@aztec/stdlib" "4.2.0-aztecnr-rc.2" + "@aztec/telemetry-client" "4.2.0-aztecnr-rc.2" tslib "^2.4.0" zod "^3.23.8" @@ -3050,14 +3050,14 @@ atomic-sleep@^1.0.0: resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== -axios@^1.12.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.1.tgz#45b62dc8fe04e0e92274e08b98e910ba3d7963a7" - integrity sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw== +axios@^1.13.5: + version "1.14.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.14.0.tgz#7c29f4cf2ea91ef05018d5aa5399bf23ed3120eb" + integrity sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ== dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.4" - proxy-from-env "^1.1.0" + follow-redirects "^1.15.11" + form-data "^4.0.5" + proxy-from-env "^2.1.0" babel-jest@^29.7.0: version "29.7.0" @@ -3989,10 +3989,10 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== -follow-redirects@^1.15.6: - version "1.15.8" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.8.tgz#ae67b97ae32e0a7b36066a5448938374ec18d13d" - integrity sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig== +follow-redirects@^1.15.11: + version "1.15.11" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== foreground-child@^3.1.0, foreground-child@^3.3.1: version "3.3.1" @@ -4013,10 +4013,10 @@ form-data@^2.5.0: mime-types "^2.1.35" safe-buffer "^5.2.1" -form-data@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" - integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== +form-data@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -6199,10 +6199,10 @@ protobufjs@^7.3.0: "@types/node" ">=13.7.0" long "^5.0.0" -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +proxy-from-env@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" + integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== pump@^3.0.0: version "3.0.2" From 80cc0ad81fb170090f7635e7ea681e39b2b10c86 Mon Sep 17 00:00:00 2001 From: Josh Crites Date: Fri, 27 Mar 2026 21:24:12 -0400 Subject: [PATCH 3/5] Update Node.js from 22 to 24 Update CI workflow and devcontainer Dockerfile to use Node.js 24. Co-Authored-By: Claude Opus 4.6 (1M context) --- .devcontainer/Dockerfile | 2 +- .github/workflows/local-network.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 616bdec..2c78610 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -2,7 +2,7 @@ FROM --platform=linux/amd64 ubuntu:24.04 SHELL ["/bin/bash", "-c"] ENV NVM_DIR=/root/.nvm -ENV NODE_VERSION=22.15.0 +ENV NODE_VERSION=24.12.0 ARG AZTEC_VERSION=4.0.0-devnet.2-patch.1 ENV AZTEC_VERSION=$AZTEC_VERSION ENV NON_INTERACTIVE=1 diff --git a/.github/workflows/local-network.yaml b/.github/workflows/local-network.yaml index 2ecd691..cf9722d 100644 --- a/.github/workflows/local-network.yaml +++ b/.github/workflows/local-network.yaml @@ -26,7 +26,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: "22" + node-version: "24" cache: "yarn" - name: Install Foundry From 27285603edb6ad6c6f564e68d4b33cfcca7d30e9 Mon Sep 17 00:00:00 2001 From: Josh Crites Date: Fri, 27 Mar 2026 21:24:32 -0400 Subject: [PATCH 4/5] Update AZTEC_VERSION in devcontainer Dockerfile to 4.2.0-aztecnr-rc.2 Co-Authored-By: Claude Opus 4.6 (1M context) --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 2c78610..122568a 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -3,7 +3,7 @@ SHELL ["/bin/bash", "-c"] ENV NVM_DIR=/root/.nvm ENV NODE_VERSION=24.12.0 -ARG AZTEC_VERSION=4.0.0-devnet.2-patch.1 +ARG AZTEC_VERSION=4.2.0-aztecnr-rc.2 ENV AZTEC_VERSION=$AZTEC_VERSION ENV NON_INTERACTIVE=1 ENV BIN_PATH=/usr/local/bin From 8b9f5c8d74f03e292d3ec3b8faf274cdebcf7603 Mon Sep 17 00:00:00 2001 From: Josh Crites Date: Mon, 30 Mar 2026 11:23:40 -0400 Subject: [PATCH 5/5] Restore testnet workflow, config, and deploy script for testnet PR Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/testnet.yaml | 41 ++++++++++++++++++++++++++++++++++ config/testnet.json | 18 +++++++++++++++ package.json | 1 + 3 files changed, 60 insertions(+) create mode 100644 .github/workflows/testnet.yaml create mode 100644 config/testnet.json diff --git a/.github/workflows/testnet.yaml b/.github/workflows/testnet.yaml new file mode 100644 index 0000000..77cb77e --- /dev/null +++ b/.github/workflows/testnet.yaml @@ -0,0 +1,41 @@ +name: Testnet Tests + +on: + push: + branches: + - testnet + pull_request: + branches: + - testnet + workflow_dispatch: + +concurrency: + group: testnet-deploy + cancel-in-progress: true + +jobs: + testnet-deploy-account: + name: Deploy Account to Testnet + runs-on: ubuntu-latest + env: + AZTEC_ENV: testnet + L1_PRIVATE_KEY: ${{ secrets.L1_PRIVATE_KEY }} + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Read Aztec version from config + run: echo "AZTEC_VERSION=$(jq -r '.settings.version' config/testnet.json)" >> $GITHUB_ENV + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "24" + cache: "yarn" + + - name: Install project dependencies + run: yarn + + - name: Deploy account to testnet + run: yarn deploy-account::testnet diff --git a/config/testnet.json b/config/testnet.json new file mode 100644 index 0000000..3e45a28 --- /dev/null +++ b/config/testnet.json @@ -0,0 +1,18 @@ +{ + "name": "testnet", + "environment": "testnet", + "network": { + "nodeUrl": "https://rpc.testnet.aztec-labs.com", + "l1RpcUrl": "https://ethereum-sepolia-rpc.publicnode.com", + "l1ChainId": 11155111 + }, + "settings": { + "skipLocalNetwork": true, + "version": "4.2.0-aztecnr-rc.2" + }, + "timeouts": { + "deployTimeout": 1200000, + "txTimeout": 180000, + "waitTimeout": 60000 + } +} diff --git a/package.json b/package.json index f5916c9..828424e 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "compile": "aztec compile", "deploy": "NODE_NO_WARNINGS=1 node --loader ts-node/esm scripts/deploy_contract.ts", "deploy-account": "NODE_NO_WARNINGS=1 node --loader ts-node/esm scripts/deploy_account.ts", + "deploy-account::testnet": "NODE_NO_WARNINGS=1 AZTEC_ENV=testnet node --loader ts-node/esm scripts/deploy_account.ts", "interaction-existing-contract": "NODE_NO_WARNINGS=1 node --loader ts-node/esm scripts/interaction_existing_contract.ts", "multiple-wallet": "NODE_NO_WARNINGS=1 node --loader ts-node/esm scripts/multiple_wallet.ts", "get-block": "NODE_NO_WARNINGS=1 node --loader ts-node/esm scripts/get_block.ts",