> For the complete documentation index, see [llms.txt](/llms.txt)

# Fund accounts

**Time:** \~5 minutes.

<!-- -->

<!-- -->

<!-- -->

## Fund the publisher

The publisher account pays a small amount of L1 gas every time your node publishes a checkpoint. At current mainnet gas levels a comfortable opening top-up is around **0.01 ETH per sequencer**.

Paste your L1 RPC URL into the calculator below to scan the last 30 days of network activity and get a runway estimate. Without an RPC the calculator still shows the per-call cost at each scenario, but cannot compute runway, because the propose-rate depends on the live validator-set size.

<!-- -->

<!-- -->

Monitor publisher balance

If the publisher balance runs dry, your sequencer cannot publish blocks, and an inactive sequencer is a slashable offense. Set a refill threshold and an alert using `aztec_l1_publisher_balance_eth` and `aztec_l1_publisher_sends_affordable` from your Prometheus stack (see [Metrics reference](/operate/operators/monitoring/metrics-reference.md#l1-publisher-eth-balance)), leaving enough headroom to refill before the publisher dries up at the worst-case gas price you expect, or set up [automatic top-ups](#optional-automatic-top-ups).

## Optional: automatic top-ups

Your node can refill its publishers from a separate funding account, so a publisher does not run dry between manual top-ups. Once a minute the node reads every publisher's balance, and sends `PUBLISHER_FUNDING_AMOUNT` to each publisher below `PUBLISHER_FUNDING_THRESHOLD`, in a single transaction from the funding account.

To set it up:

1. Add a funding account to your keystore. It goes in the top-level `fundingAccount` field, next to `validators`, and takes a private key, or an address held by a remote signer. You can set it with the CLI:

   ```bash
   aztec validator-keys set-funding-account [KEYSTORE_PATH] [FUNDING_PRIVATE_KEY_OR_ADDRESS]
   ```

   Pass `--remote-signer [URL]` for an address held by a remote signer, or `--password [PASSWORD]` to store the key encrypted.

2. Set both environment variables on the node. Both are in ETH (for example `0.05`), and top-ups stay off unless both are set.

   | Env var                       | What it does                                                      |
   | ----------------------------- | ----------------------------------------------------------------- |
   | `PUBLISHER_FUNDING_THRESHOLD` | A publisher whose balance falls below this amount gets topped up. |
   | `PUBLISHER_FUNDING_AMOUNT`    | ETH sent to the publisher in each top-up.                         |

3. Fund the funding account, and restart the node.

Keep in mind:

* The funding account must not also be one of your publishers. If it is, the node logs an error and disables top-ups.
* Set the threshold above the low-balance warning level, so publishers are refilled before the node warns that they are running low. The warning level is 4 times the cost of a proposal at current L1 fees by default (`PUBLISHER_LOW_BALANCE_WARNING_MULTIPLIER`). The node warns if the threshold is below it.
* The node warns when the funding account holds less than 10 top-ups, and logs an error when it cannot pay for any. Watch `aztec_l1_publisher_funder_balance_eth` to refill it in time.

## Optional: tuning publisher gas settings

The publisher uses sensible defaults, so most operators do not need to touch these. The settings below let you control what the publisher is willing to pay for L1 inclusion. All are environment variables set on the node.

A gas-price cap does not stop the broadcast

`L1_GAS_PRICE_MAX` (gwei) caps the L1 gas price your publisher will pay, to avoid runaway costs during fee spikes. The trap: **the cap does not stop the transaction from being broadcast.** When L1 gas is above your cap, the publisher still sends the proposal at your capped max fee. It loses the inclusion race against higher-paying transactions and does not get mined, but the broadcast still consumes fees, so a cap set too low costs money without producing a block. It also silently misses proposals during every fee spike even on a healthy node (one operator capped near 1 gwei missed roughly 20% of proposals while attesting at 100%). Missed proposals are forgone block rewards now, and skip-block slashing is slated to return in a later upgrade. Size the cap against real L1 conditions using the gas prices the [funding calculator](#fund-the-publisher) reports, not a low round number.

| Setting                 | Env var                                 | What it does                                                                      |
| ----------------------- | --------------------------------------- | --------------------------------------------------------------------------------- |
| Max gas price           | `L1_GAS_PRICE_MAX`                      | Ceiling on the L1 gas price (gwei) the publisher will pay. See the warning above. |
| Max blob fee            | `L1_BLOB_FEE_PER_GAS_MAX`               | Ceiling on the blob fee per gas (gwei). The same broadcast caveat applies.        |
| Priority fee bump       | `L1_PRIORITY_FEE_BUMP_PERCENTAGE`       | How much to raise the priority fee on each send, to win inclusion.                |
| Priority fee retry bump | `L1_PRIORITY_FEE_RETRY_BUMP_PERCENTAGE` | Extra priority-fee increase on each retry of a stuck transaction.                 |
| Minimum priority fee    | `L1_MINIMUM_PRIORITY_FEE_PER_GAS_GWEI`  | Floor on the computed priority fee (gwei).                                        |
| Gas-limit buffer        | `L1_GAS_LIMIT_BUFFER_PERCENTAGE`        | Headroom added to the estimated gas limit, to avoid underestimates.               |

If your proposals are frequently not getting included, the usual cause is a `L1_GAS_PRICE_MAX` set too low or priority fees too low for current L1 competition. Raise the cap and the priority-fee settings rather than lowering them.

## Verify the balance

```bash
cast balance {{PUBLISHER_ADDR}} --rpc-url {{ETH_RPC}} --ether
```

## Stake / delegated stake

You need **200,000<!-- --> AZTEC tokens** (200,000 × <!-- -->1<!-- --> sequencer<!-- -->) available in the wallet you'll connect to the staking dashboard when you [register as sequencer](/operate/operators/solo-sequencer/register-sequencer.md). Self-stake comes from this wallet directly.

| Item                     | Cost (for <!-- -->1<!-- --> sequencer<!-- -->)             |
| ------------------------ | ---------------------------------------------------------- |
| AZTEC self-stake         | **200,000<!-- --> AZTEC**                                  |
| Opening publisher top-up | **0.01<!-- --> ETH** (see the calculator above for runway) |
| Registration gas         | \~0.005 ETH per sequencer (rough)                          |

## Set your reward and withdrawer addresses

The **coinbase address** is the L1 (Ethereum) address that accumulates your sequencer rewards in the Rollup contract; you claim from it via `claimSequencerRewards(coinbase)`. The previous step's `aztec validator-keys new` command read this value from the **Coinbase Address** field in the configuration panel and baked it into `key1.json`. Confirm the panel still shows the wallet you intend to receive rewards. If the field is empty or wrong, fix it and rerun the keystore command before continuing. Coinbase can also be changed later by editing the `coinbase` field in `key1.json` and reloading the keystore (admin API call or node restart); doing it correctly at setup just avoids the cleanup.

The **withdrawer address** is a separate role: it controls the stake. It can later call `initiateWithdraw` to exit, names the recipient of the stake for every exit (including exits started by the attester), signs governance delegations, and receives residual stake on slash-driven ejection. See [Exiting a sequencer](/operate/operators/sequencer-management/exiting-a-sequencer.md). Use a cold wallet or multisig you control. Paste it into the **Withdrawer Address** field in the configuration panel.

For the full role map (caller / attester / publisher / withdrawer / coinbase / fee recipient), see the [keys-and-addresses deep-dive](/operate/operators/solo-sequencer/generate-keystore.md#the-keys-the-addresses-and-who-calls-what).

What just happened?

You confirmed the publisher account has enough ETH for at least a few weeks of attestation gas, and you confirmed your AZTEC self-stake is available. Self-staking locks your 200K AZTEC per sequencer in the Rollup contract on registration. It's economic security: if your sequencer misbehaves (double-signing, persistent liveness failure), a portion gets slashed.
