Conversation
Adds Chonk proof compression logic that utilizes two things: 1. Suyash's proposed EC point compression: store (x, sign_bit) instead of (x, y); leverage curve equation to reconstruct y-coord 2. Store all fields as u256 / 32 bytes. (Similar effect to Snappy compression but seems to do slightly better) Overall effect is that each single "component" of the proof is represented as 32 bytes. E.g. an Fq (naively 2 Frs) becomes one u256. A bn254 commitment (naively 2 Fqs = 4 Frs) becomes one u256 representing the x-coord. High level stats: | Metric | Value | |-------------------|------------------------------------------| | Original size | 1,935 Fr elements = ~60 KB| | Snappy compressed size | ~47 KB | | Compressed size | ~35 KB | | Compression ratio | 1.72x | | Compress time | 0.64 ms | | Decompress time | 3.5 ms |
This PR fixes issue A-548 by replacing the block-based L1-to-L2 message readiness API with a checkpoint-based one. The core insight: messages are grouped by checkpoint number, not block number, so readiness should be checked against the checkpoint the node has synced to. Key changes: New API getCheckpointNumber() added to AztecNode, L2BlockSource, and archiver interfaces — returns the latest synced checkpoint number. Renamed getL1ToL2MessageBlock → getL1ToL2MessageCheckpoint — now returns CheckpointNumber instead of BlockNumber, eliminating the deprecated BlockNumber.fromCheckpointNumber cast. Simplified isL1ToL2MessageReady — removed the forPublicConsumption flag entirely. This now checks whether we have reached the first block in the message's inclusion checkpoint. Updated all callers — bot factory, cross-chain bot, e2e tests, spartan setup, and epoch tests. Removed all A-548 workaround comments. E2E test improvements — new helpers advanceCheckpoint and waitForBlockToCheckpoint for checkpoint-aware test flow. The drift test now mines checkpoints instead of blocks.
Adapts `proof_compression.hpp` for v4's Translator proof layout, which differs from `next` in three ways: 1. **Wire commitments**: v4 uses `(NUM_WITNESS_ENTITIES - 3 - NUM_OP_QUEUE_WIRES)` as a single batch instead of separately listing gemini masking poly, `NUM_COMMITMENTS_IN_PROOF` wires, and z_perm 2. **Sumcheck evaluations**: v4 sends all entity evaluations (`NUM_ALL_ENTITIES`) instead of a subset (`NUM_SENT_EVALUATIONS`) 3. **Gemini P pos/neg**: v4 includes two extra Gemini interleaving evaluations that were removed on `next` The static_assert validates the walk produces exactly `TranslatorFlavor::PROOF_LENGTH` Fr elements. Build verified locally — `chonk_tests` compiles cleanly. This unblocks backport PR #21064. ClaudeBox log: http://ci.aztec-labs.com/eb8ee3312bb1d8e2-2
…ker (#21086) Fixes `TypeError: Do not know how to serialize a BigInt` in `p2p_client.proposal_tx_collector.bench.test.ts`. `childProcess.send()` uses JSON serialization under the hood, which cannot handle BigInt values. The recently added `priceBumpPercentage` config field is a `bigint`, causing the worker fork to crash. This omits `priceBumpPercentage` from the IPC config ClaudeBox log: http://ci.aztec-labs.com/6d6b6eba6d0eecf1-1
## Summary - Extracts the node's rollup standby logic into a shared module (`standby.ts`) so both the node and the prover broker can wait for a compatible L1 rollup before starting - Adds standby mode to the prover broker startup — previously it would crash on `getL1Config()` if the canonical rollup was incompatible (e.g. during L1 contract upgrades) - Reduces the standby poll interval from 600s to 60s and replaces the manual `while(true) + sleep` loop with `retryUntil` from `@aztec/foundation/retry` (both suggested as review feedback on #20937) ## Changes **New: `aztec/src/cli/cmds/standby.ts`** - `computeExpectedGenesisRoot(config, userLog)` — computes genesis archive root from test accounts, sponsored FPC, and prefund addresses - `waitForCompatibleRollup(config, expectedGenesisRoot, port, userLog)` — checks L1 rollup genesis root, enters standby with a K8s health server if mismatch, polls every 60s via `retryUntil` **Modified: `aztec/src/cli/cmds/start_node.ts`** - Removed inline `waitForCompatibleRollup` function and genesis computation logic - Now imports and calls the shared functions from `standby.ts` - Cleaned up unused imports (`RegistryContract`, `RollupContract`, `sleep`, `Koa`, etc.) **Modified: `aztec/src/cli/cmds/start_prover_broker.ts`** - Added `computeExpectedGenesisRoot` + `waitForCompatibleRollup` calls before `getL1Config()`, matching the node's pattern Fixes A-608
## Summary - Add `include` field to barretenberg-rs `Cargo.toml` so generated `api.rs` and `generated_types.rs` are packaged by `cargo publish`, even though they remain gitignored - Add `release` function to `barretenberg/rust/bootstrap.sh` — sets crate version from `REF_NAME`, verifies generated files exist, and runs `cargo publish` - Hook `barretenberg/rust` into the top-level release orchestrator (after `barretenberg/ts` which generates the Rust bindings) - Add `publish = false` to the tests crate ## How it works 1. Generated files stay **gitignored** — not committed to the repo 2. The `include` field in `Cargo.toml` overrides `.gitignore` for `cargo publish`, so the files are packaged as long as they exist on disk 3. During a release, `barretenberg/ts` runs first (which calls `yarn generate`), then `barretenberg/rust` publishes 4. No separate workflow — follows the same unified release flow as npm packages ## Test plan - [x] `cargo package --list --allow-dirty` confirms `src/api.rs` and `src/generated_types.rs` are included - [x] `cargo publish --dry-run --allow-dirty --no-verify` succeeds - [ ] Set `CARGO_REGISTRY_TOKEN` env var in release environment before first publish
…etup allowlist (backport #20909, #21122) (#21129) Combined backport of #20909 and #21122 to v4. #20909 re-enables function selector checking in the setup allowlist, and #21122 (which depends on it) adds `onlySelf` and `rejectNullMsgSender` validation flags. Cherry-picked in order with conflict resolution for v4 compatibility. ClaudeBox log: http://ci.aztec-labs.com/766112c90222bb64-2
What the title says.
…21139) ## Summary - Add calldata length validation to the public setup function allowlist in `PhasesTxValidator`, preventing setup calls with malformed arguments from being accepted - Extend `AllowedElement` with an optional `calldataLength` field and compute expected lengths dynamically from contract artifacts (`AuthRegistry`, `FeeJuice`, `Token`) - Reject setup calls where calldata length doesn't match the expected length for the matched allowlist entry, returning a new `TX_ERROR_SETUP_WRONG_CALLDATA_LENGTH` error ## Details Even when a setup function call matches the allowlist by address/class and selector, it can still revert if the arguments are malformed. Since Aztec's ABI has no variable-size inputs, validating that the calldata length matches the expected length for a given selector is sufficient to guarantee the arguments are deserializable. **AllowedElement type** (`stdlib`): Added optional `calldataLength?: number` to both `AllowedInstanceFunction` and `AllowedClassFunction`, plus corresponding Zod schema updates. **PhasesTxValidator** (`p2p`): After matching an entry by address or class+selector, checks `entry.calldataLength` against `publicCall.calldata.length` before proceeding to `onlySelf`/`rejectNullMsgSender` checks. When `calldataLength` is not set, any length is accepted (backwards compatible). **Default allowlist** (`p2p`): Uses `getFunctionArtifactByName` + `countArgumentsSize` from `stdlib/abi` to compute expected calldata lengths from `AuthRegistryArtifact`, `FeeJuiceArtifact`, and `TokenContractArtifact`. Fixes A-612
Resolve conflicts: - Use v4's perBlockAllocationMultiplier naming (not gasPerBlockAllocationMultiplier) - Keep backported txPublicSetupAllowListExtend rename - Keep v4's validator-specific limits (validateMax* fields) - Accept v4's deletion of proposal_validator test files - Merge changelog and README sections from both sides
…pool (#21138) ## Summary AVM simulations previously used `Napi::AsyncWorker` which runs on the **libuv thread pool**. During simulation, C++ calls back to JS for contract data via `BlockingCall`, and those JS callbacks do async I/O (LMDB, WorldState) that also needs libuv threads. With all libuv threads occupied by sims, the callback I/O deadlocks. This PR introduces `ThreadedAsyncOperation` which spawns a **dedicated `std::thread` per simulation** and signals completion back to the JS event loop via `ThreadSafeFunction`. This structurally prevents the deadlock — libuv threads are always available for callback I/O. ### Changes - **`async_op.hpp`**: New `ThreadedAsyncOperation` class — spawns `std::thread`, uses TSFN for completion, self-destructs after resolving/rejecting the promise - **`avm_simulate_napi.cpp`**: Both `simulate` and `simulateWithHintedDbs` now use `ThreadedAsyncOperation` instead of `AsyncOperation` - **`native_module.ts`**: Deadlock-prevention semaphore removed. Optional resource-limit semaphore available via `MAX_CONCURRENT_AVM_SIMULATIONS` env var (default: unlimited) ### Why this helps multi-sequencer tests Previously, running multiple sequencers in one process required careful tuning of `UV_THREADPOOL_SIZE` and concurrent sim limits to avoid deadlock. With this change, AVM sims don't touch the libuv pool at all, so any number of concurrent simulations can run without starving each other's callbacks. ClaudeBox log: http://ci.aztec-labs.com/884501541464780d-1
## Summary Removes non-protocol contracts (Token class-based entries) from the default public setup allowlist for alpha. Token class IDs change with aztec-nr releases, making the allowlist hard to maintain—and FPC-based fee payment with custom tokens won't be supported on mainnet alpha. - **Removed Token entries from the default allowlist** (`allowed_public_setup.ts`): only protocol contracts (AuthRegistry, FeeJuice) remain in the hardcoded defaults - **Extended `parseAllowList` to support validation flags**: new optional flags segment (`os`, `rn`, `cl=N`) so node operators who manually re-add entries get proper `onlySelf`, `rejectNullMsgSender`, and `calldataLength` validation - **Updated e2e tests to manually extend the allowlist**: `FeesTest` and `ClientFlowsBenchmark` now compute Token allowlist entries and pass them via `txPublicSetupAllowListExtend` - **Updated local network node** (`local-network.ts`): computes Token allowlist entries at startup so FPC-based fee payments continue to work in local development and CI - **Deprecated `PublicFeePaymentMethod` and `PrivateFeePaymentMethod`** in aztec.js with `@deprecated` JSDoc tags - **Added CLI wallet deprecation warnings** for `fpc-public` and `fpc-private` payment methods - **Added warning comment to FPC Noir contract** clarifying it's a reference implementation that won't work on mainnet alpha - **Updated v4 changelog** with the breaking change, new flag syntax documentation, and migration guidance ## Test plan - [x] Unit tests: `p2p/src/config.test.ts` (11 tests including 4 new flag parsing tests) - [x] Unit tests: `p2p/src/msg_validators/tx_validator/phases_validator.test.ts` (23 tests) - [x] E2E tests: all 8 fee test suites (26 tests total) — public_payments, private_payments, failures, account_init, gas_estimation, sponsored_payments, fee_juice_payments, fee_settings - [ ] E2E: `e2e_local_network_example.test.ts` (requires running local network — unchanged, validated via local-network.ts code review) - [x] Alert `@AztecProtocol/devrel` to update docs Fixes A-606
…20563) (#21110) ## Summary Backport of #20563 to v4. **Commit 1** — Cherry-pick of the original squash merge (authored by @mverzilli), conflicts resolved by accepting the incoming version. **Commit 2** — Fix commit adapting the cherry-pick for v4: - Resolved `send()` return type destructuring in 11 files - Wired `additionalScopes` in `base_wallet`, `interaction_options`, and `wallet.ts` schemas - Deleted modify/delete conflict files (`e2e_custom_message.test.ts`, `e2e_pxe.test.ts`) not present on v4 - Kept v4's `AvmGadgetsTestContract` name in `n_tps_prove.test.ts` - Added `GasFees` import for priority fee logic in `e2e_block_building.test.ts` - Updated bot factory for v4 PrivateToken deploy pattern Closes F-322. --------- Co-authored-by: Martin Verzilli <martin@aztec-labs.com>
Backport of #21155 to v4. This PR applies configuration settings for Alpha — renaming `SEQ_MAX_TX_PER_BLOCK` to `SEQ_MAX_TX_PER_CHECKPOINT` across environment files, deploy scripts, and terraform config. Also updates alpha/mainnet network defaults (enabling transactions, setting P2P pool count). The only conflict was `spartan/environments/alpha-net.env` which was deleted in v4, so that change was dropped. ClaudeBox log: http://ci.aztec-labs.com/73fd5ca0474b3c34-1 Co-authored-by: PhilWindle <60546371+PhilWindle@users.noreply.github.com>
When multiple validators fail, `runValidations` reported whichever failure appeared first in the Record by insertion order. Now it reports the one with the harshest penalty severity. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The v4.1.0-rc.1 release failed at cargo publish because CARGO_REGISTRY_TOKEN was not available in the build environment. Forward the token in both ci3.yml and bootstrap_ec2, matching what's already on next. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Just a smol docs PR tackling confusion between noir fields and struct members. In a process of finishing #20332 (comment)
- reduce aztec committee lag -> 1 for scenario network
Ref: A-459 Most packages are updated via resolutions. Except `minimatch`, it's used by multiple dependencies with different major versions. boxes/yarn.lock still has minimatch 9.0.3 pinned by @typescript-eslint/typescript-estree@6.21.0 (from boxes/boxes/react using @typescript-eslint v6). Fixing this requires upgrading boxes/react to @typescript-eslint v8. | yarn.lock | Package | Old Version | New Version | |-----------------------------------|----------------------|-------------|-------------| | yarn-project/yarn.lock | rollup | 4.52.3 | 4.59.0 | | boxes/yarn.lock | rollup | 4.41.1 | 4.59.0 | | playground/yarn.lock | rollup | 4.50.1 | 4.59.0 | | barretenberg/acir_tests/yarn.lock | basic-ftp | 5.0.5 | 5.2.0 | | docs/yarn.lock | h3 | 1.15.4 | 1.15.5 | | barretenberg/docs/yarn.lock | h3 | 1.15.3 | 1.15.5 | | yarn-project/yarn.lock | systeminformation | 5.23.8 | 5.31.1 | | yarn-project/yarn.lock | node-forge | 1.3.1 | 1.3.3 | | boxes/yarn.lock | node-forge | 1.3.1 | 1.3.3 | | docs/yarn.lock | node-forge | 1.3.1 | 1.3.3 | | barretenberg/acir_tests/yarn.lock | node-forge | 1.3.1 | 1.3.3 | | barretenberg/docs/yarn.lock | node-forge | 1.3.1 | 1.3.3 | | yarn-project/yarn.lock | koa | 2.16.2 | 2.16.4 | | yarn-project/yarn.lock | serve | 14.2.4 | 14.2.6 | | boxes/yarn.lock | serve | 14.2.4 | 14.2.6 | | barretenberg/acir_tests/yarn.lock | serve | 14.2.4 | 14.2.6 | | yarn-project/yarn.lock | minimatch | 3.1.2 | 3.1.5 | | boxes/yarn.lock | minimatch | 3.1.2 | 3.1.5 | | docs/yarn.lock | minimatch | 3.1.2 | 3.1.5 | | playground/yarn.lock | minimatch | 3.1.2 | 3.1.5 | | barretenberg/docs/yarn.lock | serve-handler | 6.1.6 | 6.1.7 | | docs/yarn.lock | serve-handler | 6.1.6 | 6.1.7 | | docs/yarn.lock | minimatch | 3.1.2 | 3.1.5 | | yarn-project/yarn.lock | minimatch | 5.1.6 | 5.1.9 | | boxes/yarn.lock | minimatch | 5.1.6 | 5.1.9 | | docs/yarn.lock | minimatch | 5.1.6 | 5.1.9 | | yarn-project/yarn.lock | minimatch | 9.0.5 | 9.0.9 | | docs/yarn.lock | minimatch | 9.0.5 | 9.0.9 | | barretenberg/acir_tests/yarn.lock | minimatch | 9.0.5 | 9.0.9 | | boxes/yarn.lock | minimatch | 9.0.5 | 9.0.9 | | yarn-project/yarn.lock | serialize-javascript | 6.0.2 | 7.0.4 | | boxes/yarn.lock | serialize-javascript | 6.0.2 | 7.0.4 | | docs/yarn.lock | serialize-javascript | 6.0.2 | 7.0.4 | | barretenberg/acir_tests/yarn.lock | serialize-javascript | 6.0.2 | 7.0.4 | | barretenberg/docs/yarn.lock | serialize-javascript | 6.0.2 | 7.0.4 | | boxes/yarn.lock | axios | 1.12.2 | 1.13.6 | | docs/yarn.lock | axios | 1.12.2 | 1.13.6 |
## Summary Follow-up to #21154, addressing review feedback to deduplicate code and use contract artifacts instead of hardcoded signature strings. - **New `buildAllowedElement` helper** (`@aztec/p2p/msg_validators`): Builds an `AllowedElement` from a `ContractArtifact` + function name, deriving both the selector (via `FunctionSelector.fromNameAndParameters`) and calldata length from the artifact. Eliminates all hardcoded `FunctionSelector.fromSignature(...)` calls. - **Refactored protocol allowlist** (`allowed_public_setup.ts`): Uses `buildAllowedElement` with `AuthRegistryArtifact` and `FeeJuiceArtifact` instead of manually constructing selectors and calldata lengths. - **Deduplicated token allowlist** into a single shared `getTokenAllowedSetupFunctions()` in `@aztec/aztec/testing`, removing three identical copies from `local-network.ts`, `fees_test.ts`, and `client_flows_benchmark.ts`. - **Refactored `fee_payer_balance.ts`**: Replaced hardcoded `fromSignature('_increase_public_balance((Field),u128)')` with artifact-derived selector using `FeeJuiceArtifact`. - **Left `public_fee_payment_method.ts` and `private_fee_payment_method.ts` as-is**: These deprecated classes in `aztec.js` would require adding contract artifact dependencies or API changes to refactor. Net result: **-154 lines** removed across 3 duplicated functions and hardcoded selectors, **+73 lines** added for the shared helper and single source of truth.
If we didn't register a block proposal handler on libp2p service, we'd log that validation had failed. This commit increases the log level for an unregistered handler, which should not happen, and supresses the validation failed error in that case.
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
## Summary - Fixes a bug in `AztecNodeService.findLeavesIndexes` where the block number lookup used the wrong array index whenever `findLeafIndices` returned `undefined` gaps, causing misaligned results (wrong block numbers/hashes mapped to wrong leaves). - Replaces array-index-based lookups with `Map`s (`indexToBlockNumber`, `blockNumberToHash`) to avoid the misalignment entirely. - Adds 7 unit tests covering: all found, none found, mixed found/not-found (the bug case), multiple leaves in same block, empty input, and error cases. ## Test plan - [x] Unit tests pass: `yarn workspace @aztec/aztec-node test src/aztec-node/server.test.ts -t 'findLeavesIndexes'` - [x] Build passes: `yarn build` - [x] Lint passes: `yarn lint aztec-node` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
3 tasks
…21320) Drops the default MAX_PARALLEL_BLOCKS from 32 to 4 to make better use of available CPUs.
In #20846 we showed the hash.js's sha256 implementation is very slow on large buffers and we know we're pushing hundreds of KB to megabytes to the broker every seconds, this would speed up proving job ID generation a lot. I have not used the async variant through `crypto.subtle` because ID generation is synchronous. The sync API is much faster than the async but won't be capable of as high throughput.
…21336) Adds a wait condition in the block-proposal-handler so it waits for the archiver L1 synchronizer to have synced to the slot `N-1` before processing a block proposal for slot `N`. This tackles race conditions where a checkpoint prune has yet to be processed by a validator, but the proposer was too fast and sent us a block proposal for that same block number, which gets rejected by the validator with a block-number-already-exists. In addition, it renames `getL2SlotNumber`/`getL2EpochNumber` to `getSyncedL2SlotNumber`/`getSyncedL2EpochNumber` from the archiver across the codebase, so that they return the last L2 slot/epoch that has been completely synched from L1.
…21279) Otherwise a tx could be sent with a max priority fee greater than its max fee, which cannot be realized (see `computeEffectiveGasFees`), and get a better priority in the mempool than it should.
…x bump loop truncation (#21323) The blob validateBlobs estimateGas call was intermittently failing with "max fee per blob gas less than block blob gas fee" because it computed a precise maxFeePerBlobGas that could go stale between the getBlobBaseFee RPC call and the estimateGas RPC call. Since gas estimation is a read-only, we now use a 2x buffer to pass EIP-4844 validation. Also fix integer truncation in the base fee bump loop where ceil is needed to ensure fees increase at small values (e.g. 1 wei).
ludamad
approved these changes
Mar 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
BEGIN_COMMIT_OVERRIDE
chore: chonk proof compression poc (#20645)
feat: Update L1 to L2 message APIs (#20913)
fix: adapt chonk proof compression for v4 Translator layout (#21067)
fix: omit bigint priceBumpPercentage from IPC config in testbench worker (#21086)
feat: standby mode for prover broker (#21098)
fix(p2p): remove default block handler in favor of block handler (#21105)
chore: prepare barretenberg-rs for crates.io publishing (#20496)
feat: reenable function selectors + additional validation in public setup allowlist (backport #20909, #21122) (#21129)
chore: remove stale aes comments (#21133)
chore: remove auto-tag job (#21127)
feat: calldata length validation of public setup function allowlist (#21139)
feat: run AVM NAPI simulations on dedicated threads instead of libuv pool (#21138)
feat: Remove non-protocol contracts from public setup allowlist (#21154)
feat!: Expose offchain effects when simulating/sending txs (backport #20563) (#21110)
chore: bump minor version (#21171)
chore: backport #21161 (tally slashing pruning improvements) to v4 (#21166)
chore: More updated Alpha configuration (backport #21155) (#21165)
fix(p2p): report most severe failure in runValidations (#21185)
feat: add ergonomic conversions for Noir's
Option<T>(#21107)docs: clarifying Noir fields vs struct fields in event metadata (#21172)
fix: bump lighthouse consensus client v7.1.0 -> v8.0.1 (#21170)
fix: update dependencies (#20997)
chore: New alpha-net environment (#20800) (#21202)
chore: code decuplication + refactor (public setup allowlist) (#21200)
feat: mask all ciphertext fields with Poseidon2-derived values (backport #21009) (#21140)
chore: disable sponsored FPC in testnet (#21235)
feat!: exposing pub event pagination on wallet (#21197)
refactor(pxe): narrow tryGetPublicKeysAndPartialAddress return type (backport #21208) (#21236)
feat: orchestrator enqueues via serial queue (#21247)
feat: rollup mana limit gas validation (#21219)
chore: deploy SPONSORED_FPC in test networks (#21254)
fix(sequencer): fix log when not enough txs (#21297)
fix: Simulate gas in n tps test. Set min txs per block to 1 (backport #21312) (#21329)
fix(log): do not log validation error if unregistered handler (#21111)
fix(node): fix index misalignment in findLeavesIndexes (#21327)
fix: limit parallel blocks in prover to max AVM parallel simulations (#21320)
fix: use native sha256 to speed up proving job id generation (#21292)
fix(validator): wait for l1 sync before processing block proposals (#21336)
fix(txpool): cap priority fee with max fees when computing priority (#21279)
chore: reduce severity of errors due to HA node not acquiring signature (#21311)
fix: (A-643) add buffer to maxFeePerBlobGas for gas estimation and fix bump loop truncation (#21323)
END_COMMIT_OVERRIDE