Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
ae9874f
fix(p2p): stop checkpoint-replay storm when pruning to an uncheckpoin…
spalladino Jun 9, 2026
609014a
refactor(sequencer)!: always enforce timetable with concrete block du…
spalladino Jun 9, 2026
f19832a
fix(e2e): drop removed enforceTimeTable option from optimistic provin…
AztecBot Jun 10, 2026
58b628b
Merge branch 'v5-next' into merge-train/spartan-v5
Jun 10, 2026
024cd37
feat: persist peer bans for a configurable duration (A-1157) (#23922)
PhilWindle Jun 10, 2026
2ea7a8b
Merge branch 'v5-next' into merge-train/spartan-v5
Jun 10, 2026
ed92ec9
refactor!: rename node JSON-RPC to aztec_* prefixes (#23909)
spypsy Jun 10, 2026
3867206
fix(p2p): drive tx protection release from synced blocks instead of w…
spalladino Jun 10, 2026
6aff5b9
fix(p2p)!: resolve checkpoint tips from stored ids (#23968)
spalladino Jun 11, 2026
bd71022
fix: deflake HA full e2e suite by switching to in-proc interval-minin…
spalladino Jun 11, 2026
6ed544b
Merge remote-tracking branch 'origin/v5-next' into pw/fix-v5-conflicts
PhilWindle Jun 11, 2026
7c93630
fix(gas)!: client fallback limits track network per-block budget (A-1…
spalladino Jun 11, 2026
b2bcdba
feat: network-wide consensus config with validation and override prot…
spalladino Jun 11, 2026
227a74e
test(e2e): pick bad slots upfront and warp to them in `proposer inval…
AztecBot Jun 11, 2026
5570957
fix(bot): check L1-to-L2 message readiness against PXE sync tip (#24004)
spalladino Jun 11, 2026
cd9e095
fix: Merge Conflicts (#24014)
ludamad Jun 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/agents/aztec-wallet.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ fi

# Query node version
RESPONSE=$(curl -sf -X POST -H 'Content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"node_getNodeInfo"}' \
--data '{"jsonrpc":"2.0","id":1,"method":"aztec_getNodeInfo"}' \
"$RPC_URL" 2>&1) || {
echo "ERROR: Could not reach node at $RPC_URL" >&2
echo "Response: $RESPONSE" >&2
Expand Down
6 changes: 3 additions & 3 deletions .claude/skills/release-docs/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Fetch node info from the provided RPC URL:

```bash
curl -s -X POST -H 'Content-Type: application/json' \
-d '{"method":"node_getNodeInfo"}' <RPC_URL> | jq .result
-d '{"method":"aztec_getNodeInfo"}' <RPC_URL> | jq .result
```

Parse the response to extract:
Expand Down Expand Up @@ -214,7 +214,7 @@ These files are auto-generated — do not hand-edit them.

Regenerate the Node JSON-RPC API reference documentation. This script parses the
TypeScript interface definitions and Zod schemas in `yarn-project/stdlib/src/interfaces/`
to produce a complete markdown reference for the `node_` and `nodeAdmin_` RPC methods.
to produce a complete markdown reference for the `aztec_` and `aztecAdmin_` RPC methods.

**Prerequisite:** `yarn-project` must be built (already done in Step 6 prerequisites).

Expand Down Expand Up @@ -259,7 +259,7 @@ docs (Step 13), the generated content is included in the snapshot automatically.
### Step 9: Resolve Missing Contract Addresses & Update Network Info

The `networks.md` L1 table includes contracts that are **not** returned by
`node_getNodeInfo`. Before updating the tables, resolve these in three tiers.
`aztec_getNodeInfo`. Before updating the tables, resolve these in three tiers.

Determine the L1 RPC URL from the `l1ChainId`: `1` → Ethereum mainnet,
`11155111` → Sepolia. The Rollup and Registry addresses are already known from
Expand Down
4 changes: 2 additions & 2 deletions .claude/skills/release-network-docs/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ Fetch node info from the provided RPC URL:

```bash
curl -s -X POST -H 'Content-Type: application/json' \
-d '{"method":"node_getNodeInfo"}' <RPC_URL> | jq .result
-d '{"method":"aztec_getNodeInfo"}' <RPC_URL> | jq .result
```

Parse the response to extract:
Expand Down Expand Up @@ -87,7 +87,7 @@ git tag -l "v<nodeVersion>"
### Step 3: Identify and Resolve Missing Contract Addresses

The `networks.md` L1 table includes contracts that are **not** returned by
`node_getNodeInfo`. Resolve these addresses in three tiers:
`aztec_getNodeInfo`. Resolve these addresses in three tiers:

#### Tier 1: Query on-chain from known contracts

Expand Down
2 changes: 1 addition & 1 deletion .test_patterns.yml
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ tests:
owners:
- *palla

- regex: "yarn-project/end-to-end/scripts/run_test.sh ha src/composed/ha/e2e_ha_full.test.ts"
- regex: "yarn-project/end-to-end/scripts/run_test.sh ha src/composed/ha/e2e_ha_full.parallel.test.ts"
owners:
- *spyros

Expand Down
4 changes: 2 additions & 2 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,8 @@ The Node JSON-RPC API reference is auto-generated from the TypeScript interface

**Source files:**

- `yarn-project/stdlib/src/interfaces/aztec-node.ts` — `AztecNode` interface (`node_` methods)
- `yarn-project/stdlib/src/interfaces/aztec-node-admin.ts` — `AztecNodeAdmin` interface (`nodeAdmin_` methods)
- `yarn-project/stdlib/src/interfaces/aztec-node.ts` — `AztecNode` interface (`aztec_` methods)
- `yarn-project/stdlib/src/interfaces/aztec-node-admin.ts` — `AztecNodeAdmin` interface (`aztecAdmin_` methods)
- `yarn-project/stdlib/src/block/l2_block_source.ts` — `L2BlockSource` interface (JSDoc for inherited methods)

**Prerequisites:** `yarn-project` must have `node_modules/` installed so `npx tsx` can resolve `typescript`. Run `yarn install` from `yarn-project` if needed. No build is required — the generator parses source `.ts` files via the TypeScript Compiler API, not compiled output.
Expand Down
22 changes: 11 additions & 11 deletions docs/docs-developers/docs/aztec-js/how_to_pay_fees.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,25 +38,25 @@ Mana is Aztec's unit of computational effort (like gas on Ethereum), and Fee Jui
When using `EmbeddedWallet`, gas is estimated automatically on every `send()` call. You only need to manually estimate if you want to preview costs before sending, or if you're using a custom wallet implementation.
:::

Before sending a transaction, you can estimate the mana it will consume by simulating with `estimateGas: true`:
Before sending a transaction, you can read the mana it will consume by simulating with `includeMetadata: true` and reading `gasUsed` from the result:

#include_code estimate_mana /docs/examples/ts/aztecjs_advanced/index.ts typescript

The `estimatedGas` object contains:
The `gasUsed` object contains the raw gas the simulation consumed:

- `gasLimits.daGas` - Estimated DA mana for main execution
- `gasLimits.l2Gas` - Estimated L2 mana for main execution
- `teardownGasLimits.daGas` - Estimated DA mana for teardown phase
- `teardownGasLimits.l2Gas` - Estimated L2 mana for teardown phase
- `totalGas.daGas` / `totalGas.l2Gas` - DA and L2 mana consumed across the whole transaction
- `teardownGas.daGas` / `teardownGas.l2Gas` - DA and L2 mana consumed in the teardown phase

It is up to you to derive the gas limits you declare from this raw usage (typically by padding it, as shown above). If you don't declare any gas limits, the wallet fills in the network's per-tx admission limits for you.

### Calculate expected fee from estimate

To calculate the expected fee from estimated gas, use the `computeFee` method with current network fees:
To calculate the expected fee from the padded gas, use the `computeFee` method with current network fees:

#include_code compute_fee_from_estimate /docs/examples/ts/aztecjs_advanced/index.ts typescript

:::tip
The `estimatedGasPadding` parameter adds a safety margin to the estimate. A value of `0.1` adds 10% padding. Use higher padding for transactions with variable gas costs.
Pad the raw `gasUsed` yourself to leave a safety margin. Multiplying by `1.1` adds 10%; use higher padding for transactions with variable gas costs. The wallet rejects any declared limit above the network's per-tx admission limit.
:::

## Get transaction fee from receipt
Expand Down Expand Up @@ -148,7 +148,7 @@ const payment = await fpcClient.createPaymentMethod({
wallet,
user: aliceAddress, // the account paying the fee
tokenAddress, // the token you want to pay in
estimatedGas, // from a prior estimateGas call
estimatedGas, // gas limits derived from a prior simulation's gasUsed
});

// Use it like any other payment method
Expand All @@ -171,7 +171,7 @@ Fee Juice is non-transferable on L2, but you can bridge it from L1, claim it on

#include_code bridge_fee_juice_setup /docs/examples/ts/aztecjs_connection/index.ts typescript

Under the hood, `L1FeeJuicePortalManager` gets the L1 addresses from the node `node_getNodeInfo` endpoint. It then exposes an easy method `bridgeTokensPublic` which mints fee juice on L1 and sends it to an L2 address via the L1 portal:
Under the hood, `L1FeeJuicePortalManager` gets the L1 addresses from the node `aztec_getNodeInfo` endpoint. It then exposes an easy method `bridgeTokensPublic` which mints fee juice on L1 and sends it to an L2 address via the L1 portal:

#include_code bridge_fee_juice_execute /docs/examples/ts/aztecjs_connection/index.ts typescript

Expand Down Expand Up @@ -207,7 +207,7 @@ Note that `gasLimits` and `teardownGasLimits` use `daGas`/`l2Gas` field names, w
### Use automatic gas estimation

:::note
When using `EmbeddedWallet`, gas estimation happens automatically on every `send()`; you don't need to pass `estimateGas`. This option is useful for custom wallet implementations or when you want to estimate gas during a `simulate()` call.
When using `EmbeddedWallet`, gas estimation happens automatically on every `send()`; you don't need to declare gas limits at all. Reading `gasUsed` from a `simulate({ includeMetadata: true })` result is useful when you want to preview costs before sending, or to set explicit limits with a custom wallet implementation.
:::

#include_code auto_gas_estimation /docs/examples/ts/aztecjs_advanced/index.ts typescript
Expand Down
2 changes: 1 addition & 1 deletion docs/docs-developers/docs/aztec-js/how_to_read_data.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Set `includeMetadata: true` to get additional information about the simulation:

#include_code simulate_with_metadata /docs/examples/ts/aztecjs_advanced/index.ts typescript

The result includes `result` (the function return value), `stats` (execution statistics), `offchainEffects`, and `estimatedGas` (with `gasLimits` and `teardownGasLimits`).
The result includes `result` (the function return value), `stats` (execution statistics), `offchainEffects`, and `gasUsed` (the raw gas the simulation consumed, with `totalGas` and `teardownGas`). Derive your own gas limits from `gasUsed` if you want to declare them explicitly; otherwise the wallet fills in the network's per-tx admission limits.

### Private function considerations

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ Cold-start exists for users who have no other way to pay fees: the bridged amoun
Because neither `pay_fee` nor `mint_and_pay_fee` makes public cross-contract token calls in setup (they only deduct from the FPC's internal private balance and invoke `set_as_fee_payer`), the [setup-phase allowlist](../foundational-topics/transactions.md#setup-phase-non-revertible) never blocks these flows.

:::note No refund
`PrivateFPC.pay_fee()` deducts the full `max_gas_cost` and does not refund unused gas. Use `estimateGas` (see [Estimate mana costs](./how_to_pay_fees.md#estimate-mana-costs)) to right-size your limits.
`PrivateFPC.pay_fee()` deducts the full `max_gas_cost` and does not refund unused gas. Read `gasUsed` from a simulation (see [Estimate mana costs](./how_to_pay_fees.md#estimate-mana-costs)) to right-size your limits.
:::

## Share one FPC address across the ecosystem
Expand Down
79 changes: 77 additions & 2 deletions docs/docs-developers/docs/resources/migration_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,68 @@ Aztec is in active development. Each version may introduce breaking changes that

## TBD

### [Aztec.js] Wallets validate declared gas limits against the network's per-tx admission limit

Wallets now reject a transaction whose declared `gasLimits` exceed the network's per-tx admission limit (the node-advertised `txsLimits.gas`), throwing before the tx is sent — e.g. `Declared DA gas limit (X) exceeds the maximum this network allows per tx (Y)`. When you declare no gas limits, the wallet fills in the network's admission limits for you. This mirrors the node's inbound `GasLimitsValidator`, surfacing the rejection locally instead of on submission.

**Impact**: Transactions that previously over-declared gas (and were silently skipped by the proposer) now fail fast with a descriptive error. Declare limits at or below `txsLimits.gas`, or declare none and let the wallet fill them in.

### [Aztec.js] `estimateGas` / `estimatedGasPadding` simulate options and the `estimatedGas` result field removed

The `estimateGas` and `estimatedGasPadding` fee options are gone, and the `estimatedGas` field on simulation results is replaced by `gasUsed` (the raw gas the simulation consumed). Apps that want explicit gas limits read `gasUsed` and pad it themselves; otherwise the wallet fills in the network's admission limits automatically.

**Migration:**

```diff
- const { estimatedGas } = await contract.methods.foo(args).simulate({
- from,
- fee: { estimateGas: true, estimatedGasPadding: 0.1 },
- });
- const gasLimits = estimatedGas.gasLimits;
+ const { gasUsed } = await contract.methods.foo(args).simulate({ from, includeMetadata: true });
+ const gasLimits = gasUsed.totalGas.mul(1.1); // pad yourself
```

### [Aztec.js] `getGasLimits` moved to `@aztec/wallet-sdk` and is no longer exported from `@aztec/aztec.js`

`getGasLimits` is no longer exported from `@aztec/aztec.js`. It now lives in `@aztec/wallet-sdk/base-wallet`, takes the simulated `gasUsed` and the network's per-tx admission limit, and clamps the padded estimates to it. If the simulated usage already exceeds the network limit, it throws immediately rather than returning a limit the node would reject.

**Migration:**

```diff
- import { getGasLimits } from '@aztec/aztec.js';
- const { gasLimits, teardownGasLimits } = getGasLimits(simulationResult, 0.1);
+ import { getGasLimits } from '@aztec/wallet-sdk/base-wallet';
+ const { txsLimits } = await node.getNodeInfo();
+ const { gasLimits, teardownGasLimits } = getGasLimits(simulationResult.gasUsed, Gas.from(txsLimits.gas), 0.1);
```

### [Aztec.js / PXE] `NodeInfo.txsLimits` is now required

`NodeInfo` now carries a required `txsLimits` field: every node advertises the maximum gas a single tx may declare (`{ gas: { daGas, l2Gas } }`) and wallets rely on it for fallback gas limits. Clients built against this version cannot talk to nodes that predate the field.

### [Aztec.js] `GasSettings.fallback` requires explicit `gasLimits`

`GasSettings.fallback` no longer supplies a default value for `gasLimits`. Callers must pass the network's per-tx admission limit explicitly — read it from the node's `txsLimits.gas`.

**Migration:**

```diff
- const settings = GasSettings.fallback({ maxFeesPerGas });
+ const { txsLimits } = await node.getNodeInfo();
+ const settings = GasSettings.fallback({ gasLimits: Gas.from(txsLimits.gas), maxFeesPerGas });
```

### [Aztec.js / stdlib] Removed legacy fallback gas constants

The following exports have been removed from `@aztec/stdlib`:

- `APPROXIMATE_MAX_DA_GAS_PER_BLOCK`
- `FALLBACK_TEARDOWN_L2_GAS_LIMIT`
- `FALLBACK_TEARDOWN_DA_GAS_LIMIT`

**Impact**: Any code that imported these symbols must switch to the live node-advertised limits via the node's `txsLimits.gas`.

### [Aztec.nr] `messages::message_delivery` module moved to `messages::delivery`

The `message_delivery` module has been renamed to `delivery`. Update imports accordingly:
Expand All @@ -18,6 +80,19 @@ The `message_delivery` module has been renamed to `delivery`. Update imports acc
+ use aztec::messages::delivery::MessageDelivery;
```

### [Node JSON-RPC] Method prefixes changed to `aztec_*` and `aztecAdmin_*`

All Aztec node JSON-RPC method prefixes have changed:

- `node_*` → `aztec_*` (public node methods, port 8080)
- `nodeAdmin_*` → `aztecAdmin_*` (admin methods, port 8880)
- `nodeDebug_*` → `aztecDebug_*` (debug methods, port 8080, local-network or `--node-debug` only)
- `p2p_*` namespace removed; P2P queries are on `aztec_*`: `getPeers`, `getCheckpointAttestationsForSlot`, `getProposalsForSlot`
- New archiver sync helpers on `aztec_*`: `getL1Constants`, `getSyncedL2SlotNumber`, `getSyncedL2EpochNumber`, `getSyncedL1Timestamp`

If you call the node RPC directly (e.g. via `curl` or a custom client), update all method names accordingly.
Clients created via `createAztecNodeClient`, `createAztecNodeAdminClient`, and `createAztecNodeDebugClient` are updated automatically.

### [Aztec.nr] `get_pending_tagged_logs` oracle interface updated (oracle version 28)

The `aztec_utl_getPendingTaggedLogs` oracle now takes an additional `provided_secrets` parameter of type `EphemeralArray<ProvidedSecret>`. This lets apps pass tagging secrets that PXE cannot derive on its own (e.g. handshake-derived secrets) alongside the secrets PXE manages internally.
Expand Down Expand Up @@ -100,7 +175,7 @@ After the `auth_registry`, `public_checks`, and `multi_call_entrypoint` demotion

### [Aztec.nr] `multi_call_entrypoint` demoted from protocol contract

`multi_call_entrypoint` is no longer a protocol contract; its address is derived from its artifact rather than hardcoded at `6`, and PXE no longer auto-registers it. It is now a standard contract that PXE *preloads*: both `createPXE` and `EmbeddedWallet` preload the standard MultiCallEntrypoint automatically (and `EmbeddedWallet` additionally preloads `AuthRegistry`). **If you use the standard PXE or `EmbeddedWallet`, no changes are needed** — multicall keeps working out of the box.
`multi_call_entrypoint` is no longer a protocol contract; its address is derived from its artifact rather than hardcoded at `6`, and PXE no longer auto-registers it. It is now a standard contract that PXE _preloads_: both `createPXE` and `EmbeddedWallet` preload the standard MultiCallEntrypoint automatically (and `EmbeddedWallet` additionally preloads `AuthRegistry`). **If you use the standard PXE or `EmbeddedWallet`, no changes are needed** — multicall keeps working out of the box.

To preload a different set of standard contracts (for example to also preload `PublicChecks`, which is not preloaded by default), a wallet or app passes its own `preloadedContractsProvider` through the wallet's PXE options:

Expand All @@ -121,7 +196,7 @@ const wallet = await EmbeddedWallet.create(node, {
});
```

The provider *replaces* the default list (it is not additive), so include every standard contract you want available.
The provider _replaces_ the default list (it is not additive), so include every standard contract you want available.

### [Aztec.nr] `public_checks` demoted from protocol contract

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ Wait for output showing deployed contract addresses. To get the **Registry Addre

```bash
curl -s http://localhost:8080 -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"node_getNodeInfo","params":[],"id":1}' | jq '.result.l1ContractAddresses'
-d '{"jsonrpc":"2.0","method":"aztec_getNodeInfo","params":[],"id":1}' | jq '.result.l1ContractAddresses'
```

Note the `registryAddress` from the output.
Expand Down
3 changes: 3 additions & 0 deletions docs/docs-developers/getting_started_on_local_network.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,14 @@ Get started on your local environment using a local network. If you'd rather dep

The local network is a local development Aztec network running fully on your machine, and interacting with a development Ethereum node. You can develop and deploy on it just like on a testnet or mainnet (when the time comes). The local network makes it faster and easier to develop and test your Aztec applications.

The local network always owns the local chain it starts. It deploys its own Aztec protocol contracts to the local Ethereum node and is not a mode for connecting to an existing Aztec network.

What's included in the local network:

- Local Ethereum network (Anvil)
- Deployed Aztec protocol contracts (for L1 and L2)
- A set of test accounts with some test tokens to pay fees
- On-demand block production via the automine sequencer
- Development tools to compile contracts and interact with the network (`aztec` and `aztec-wallet`)

This guide will teach you how to install the Aztec local network, run it using the Aztec CLI, and interact with contracts using the wallet CLI. To jump right into the testnet instead, click the `Testnet` tab.
Expand Down
Loading
Loading