\
--bootnodes /dnsaddr/bootnode.testnet.mev-commit.xyz \
--settlement-rpc-endpoint https://chainrpc.testnet.mev-commit.xyz
--provider-whitelist 0x6DcE7bcF4fCA9E14b546e583049B82474631b185,0x0979c194EaD08444B6e40415F5822AB32363f580
```
# Using the Bridge UI
Source: https://docs.primev.xyz/v1.2.x/get-started/bridge/bridge
How to bridge ETH between L1 and mev-commit using the web interface
The hosted bridge UI at mev-commit.xyz/bridge is decommissioned. That path now redirects here. Use the [Bridge CLI](/v1.2.x/get-started/bridge/bridge-cli) to move ETH. The steps below describe the old UI for reference.
The old mev-commit bridge UI transferred ETH between Ethereum and the mev-commit chain.
## Bridging to mev-commit
1. Visit [mev-commit.xyz/bridge](https://www.mev-commit.xyz/bridge)
2. Connect your wallet when prompted
3. Select Ethereum as the source chain and mev-commit as the destination chain
4. Enter the amount of ETH you want to transfer
5. Click "Bridge" and approve the transaction in your wallet
6. Wait for the bridging transaction to complete (approximately 15 minutes for L1 finality)
## Bridging from mev-commit
1. Visit [mev-commit.xyz/bridge](https://www.mev-commit.xyz/bridge)
2. Connect your wallet when prompted
3. Select mev-commit as the source chain and Ethereum as the destination chain
4. Enter the amount of ETH you want to transfer
5. Click "Bridge" and approve the transaction in your wallet
6. Transaction should complete within a few minutes
Note: A fixed fee of 0.005 ETH is charged when bridging from mev-commit to L1 to cover relayer costs.
For advanced users, programmatic access, or automation needs, the bridge CLI tool is also available - see [Bridge CLI](/v1.2.x/get-started/bridge-cli) for details.
# Bridge CLI
Source: https://docs.primev.xyz/v1.2.x/get-started/bridge/bridge-cli
The mev-commit chain uses native ETH that must be bridged from L1 using our lock and mint bridge. A user CLI application can be downloaded from the [releases page](https://github.com/primev/mev-commit/releases/latest).
You can confirm your operating system and architecture by running `uname -sm`.
Or use the following command which automatically downloads and extracts the latest bridge user CLI binary for your system into your \$HOME directory:
```shell theme={null}
curl -Ls $(curl -s https://api.github.com/repos/primev/mev-commit/releases \
| grep browser_download_url \
| grep "mev-commit-bridge-user-cli_[0-9].*$(uname -s)_$(uname -m)\.tar\.gz" \
| cut -d '"' -f 4 \
| head -n1) | tar -xz -C ~
```
The binary will then be available in your \$HOME directory as `user-cli`.
In order to bridge funds, users need to have an account which is funded with mainnet ETH.
```bash ❯_ bridge to settlement chain from L1 theme={null}
user-cli bridge-to-settlement \
--account-key \
--dest-addr \
--amount
```
```bash ❯_ bridge to L1 from settlement chain theme={null}
user-cli bridge-to-l1 \
--account-key \
--dest-addr \
--amount
```
```bash ❯_ bridge to settlement chain from L1 theme={null}
user-cli bridge-to-settlement \
--account-key $PRIVATE_KEY \
--dest-addr $DEST_ADDR \
--amount $AMOUNT_IN_WEI \
--l1-rpc-url https://0xrpc.io/hoodi \
--settlement-rpc-url https://chainrpc.testnet.mev-commit.xyz \
--l1-contract-addr 0x0b3b6Cf113959214E313d6Ad37Ad56831acb1776 \
--settlement-contract-addr 0xFaF6F0d4bbc7bC33a4b403b274aBb82d0E794202
```
A static fee is charged for bridging from the mev-commit chain to L1, to compensate the relayer for transaction inclusion. This fee is currently set to 0.005 ETH.
Users can also use a keystore file instead of using the private key.
CLI currently uses default contract addresses for mainnet and default mainnet RPC endpoints. Users can use separate RPC URLs using the respective options.
To check other options available in the user CLI, users can use the `-h` option
```
./user-cli -h
NAME:
mev-commit-bridge-user-cli - CLI for interacting with a custom bridge between L1 and the mev-commit (settlement) chain
USAGE:
mev-commit-bridge-user-cli [global options] command [command options]
COMMANDS:
bridge-to-settlement Submit a transaction to bridge ether to the settlement chain
bridge-to-l1 Submit a transaction to bridge ether back to L1
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--help, -h show help
```
```
./user-cli bridge-to-settlement -h
NAME:
mev-commit-bridge-user-cli bridge-to-settlement - Submit a transaction to bridge ether to the settlement chain
USAGE:
mev-commit-bridge-user-cli bridge-to-settlement [command options]
OPTIONS:
--account-key value private key of the account to use for signing transactions in hex encoding [$ACCOUNT_KEY]
--keystore-path value path to keystore location [$MEV_ORACLE_KEYSTORE_PATH]
--keystore-password value use to access keystore [$MEV_ORACLE_KEYSTORE_PASSWORD]
--amount value amount of ether to bridge in wei [$AMOUNT]
--dest-addr value destination address on the mev-commit (settlement) chain [$DEST_ADDR]
--l1-rpc-url value URL for L1 RPC [$L1_RPC_URL]
--settlement-rpc-url value URL for settlement RPC [$SETTLEMENT_RPC_URL]
--l1-contract-addr value address of the L1 gateway contract [$L1_CONTRACT_ADDR]
--settlement-contract-addr value address of the settlement gateway contract [$SETTLEMENT_CONTRACT_ADDR]
--silent disable spinner (default: false) [$SILENT]
--help, -h show help
```
The current bridge waits for finalization. Thus when moving funds from L1 to the settlement chain, users will have to wait for at least 15 mins (L1 finalization time) before getting a confirmation. Conversely, bridging from settlement to L1 chain will be significantly faster (less than 1 second settlement chain finalization time).
After the bridge is successful, the following command can be used to check their mev-commit chain balance
### Mainnet
```
curl -L https://foundry.paradigm.xyz | bash && foundryup && cast balance mev_commit_mainnet_address --rpc-url https://chainrpc.mev-commit.xyz/
```
### Testnet
```
curl -L https://foundry.paradigm.xyz | bash && foundryup && cast balance mev_commit_testnet_address --rpc-url https://chainrpc.testnet.mev-commit.xyz/
```
# Settlement explorer
Source: https://docs.primev.xyz/v1.2.x/get-started/explorer
The public mev-commit explorer is decommissioned. Apex now redirects to the validator opt-in page.
The public explorer at [mev-commit.xyz](https://mev-commit.xyz) is decommissioned. That host now redirects to [primev.xyz/ai](https://primev.xyz/ai), the validator opt-in homepage. The app is archived in [primev/mev-commit-ui](https://github.com/primev/mev-commit-ui) (`apps/xplorer`) and can be restored from there.
It was a settlement-chain explorer for the mev-commit chain (Chain ID 57173): decoded contract calls, block and transaction feeds, and address lookup. Those routes are not served on a public host anymore.
## What it used to show
| Contract | Purpose |
| --------------------- | --------------------------------------------------------- |
| **PreconfManager** | Preconfirmation commitments between bidders and providers |
| **BidderRegistry** | Bidder registrations and deposits |
| **ProviderRegistry** | Provider registrations and stakes |
| **Oracle** | Settles commitments from L1 block outcomes |
| **BlockTracker** | L1 block numbers for settlement |
| **SettlementGateway** | Cross-chain settlement |
Query the chain directly if you need the same data: RPC `https://chainrpc.mev-commit.xyz`, Chain ID `57173`. See [chain details](/v1.2.x/concepts/mev-commit-chain/chain-details).
For validator opt-in use [primev.xyz/ai](https://primev.xyz/ai) or the [agentic opt-in guide](/v1.2.x/get-started/validators/agentic-opt-in).
# Fast Swaps
Source: https://docs.primev.xyz/v1.2.x/get-started/fast-swaps
Your first token swap on Fast Swaps — a step-by-step guide
This guide walks you through performing your first token swap on [Fast Swaps](https://fastprotocol.io). By the end, you will have swapped tokens on Ethereum with near-instant preconfirmations and started earning mev rewards (Fast Miles).
**What you need before starting:**
* A web browser (Chrome, Firefox, or Brave recommended)
* A wallet extension installed ([MetaMask](https://metamask.io) or [Rabby](https://rabby.io) recommended)
* ETH in your wallet for gas fees (if swapping ETH) or for the one-time token approval
* The tokens you want to swap
***
Open your browser and navigate to **[fastprotocol.io](https://fastprotocol.io)**.
You will see the Fast Swaps landing page with the swap interface.
Click the **Connect Wallet** button in the top-right corner of the page.
A wallet selection modal will appear. Choose your wallet provider:
* **MetaMask**
* **Rabby**
* **WalletConnect** (for mobile wallets or other providers)
Your wallet extension will prompt you to approve the connection. Confirm the connection in your wallet.
Make sure your wallet is set to **Ethereum Mainnet**. For the best experience, set your Ethereum RPC to [FAST RPC](/v1.2.x/get-started/fastrpc) (`https://fastrpc.mev-commit.xyz`). This enables preconfirmations and mev rewards on all your Ethereum transactions — not just Fast Swaps. See the [FAST RPC setup guide](/v1.2.x/get-started/fastrpc#usage-for-wallets) for instructions.
The swap interface has two sections: **Sell** (top) and **Buy** (bottom).
Click the token selector dropdown in the **Sell** section. By default, it shows ETH.
A token selector modal opens where you can:
* **Search** by token name, symbol, or contract address
* **Browse popular tokens** in the quick-select bar (ETH, DAI, USDT, WBTC)
* **Add a custom token** by pasting any ERC-20 contract address
Select the token you want to sell. For this guide, we will use **ETH**.
Click the token selector button in the **Buy** section and choose your desired output token. For this guide, we will select **USDC**.
You can click the **switch button** (↕) between the Sell and Buy sections to reverse the swap direction at any time.
Click the amount field in the **Sell** section and type the amount you want to swap. For example, enter `0.1` to swap 0.1 ETH.
As you type, Fast Swaps automatically:
* **Fetches a real-time quote** via a competitive solver auction
* **Displays the output amount** in the Buy section (with USD equivalent)
* **Shows the exchange rate** between the two tokens
* **Shows price impact** — the effect your trade has on the market price
The quote refreshes every **15 seconds**. A countdown timer next to the exchange rate shows when the next refresh will occur.
Before confirming, review the swap details displayed below the Buy section:
| Detail | What It Means |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| **Exchange Rate** | How much of the output token you get per unit of input token, with a countdown timer showing when the quote refreshes |
| **Price Impact** | How much your swap moves the market price — green is negligible, yellow is moderate, red means you may want to reduce your swap size |
### Adjust Settings (Optional)
Click the **gear icon** (⚙) next to the Swap heading to open settings. Here you can adjust:
* **Max slippage** — The maximum price movement you are willing to accept (default: 0.5%). You can set a custom percentage.
* **Swap deadline** — How long (in minutes) the swap remains valid before it expires (default: 30 minutes).
Setting slippage too low may cause the swap to fail if the price moves. Setting it too high may result in a worse exchange rate.
**This step only applies to ERC-20 token swaps** (e.g., USDC → ETH). If you are swapping **ETH as the input token**, skip to the next step.
If this is your first time swapping a particular ERC-20 token on Fast Swaps, you need to approve the **Permit2** contract to access that token. This is a one-time on-chain transaction per token.
Click the **Approve** button. Your wallet will prompt you to confirm the approval transaction.
If you have previously approved this token for Permit2 on another app (like Uniswap), you will not need to approve it again.
Once the approval transaction confirms, the button changes to **Swap**.
Click the **Swap** button to initiate the swap.
A confirmation modal appears showing the full details of your swap, including input and output amounts, the exchange rate, price impact, minimum received after slippage, and estimated gas cost.
Review the details and click **Confirm Swap**.
Your wallet will prompt you to sign the transaction:
* **For ERC-20 input tokens**: You will sign an **EIP-712 message** (a signature, not a transaction). This is gasless — you do not pay gas at this step.
* **For ETH input**: You will sign and submit an **on-chain transaction**. This requires gas.
Confirm the signature or transaction in your wallet.
Within seconds of signing, your swap is **preconfirmed**. A confirmation toast appears at the bottom of the screen.
**Preconfirmed** means Ethereum block builders on the [mev-commit](/v1.2.x/concepts/mev-commit-intro/what-is-mev-commit) network have committed to including your swap in an upcoming block. This gives you near-instant confidence that your swap will settle — no need to wait for the full block to be produced.
This is the core Fast Swaps experience: your swap feels **instant**.
After the preconfirmation, your swap progresses to full on-chain confirmation in the background. The toast will update once the swap is included in a finalized Ethereum block. You do not need to wait for this — the preconfirmation is your signal that the swap is done.
| Status | What It Means |
| ---------------- | ------------------------------------------------------------------------------------------------------------------ |
| **Pending** | Your swap intent has been submitted to FAST RPC |
| **Preconfirmed** | Ethereum block builders on mev-commit have committed to including your transaction — your swap is effectively done |
| **Confirmed** | The swap has been included in a finalized Ethereum block. Your output tokens are fully settled on-chain |
Once fully confirmed on-chain, the toast updates with a link to the transaction on Etherscan.
Your output tokens are now in your wallet. The swap form resets, ready for your next trade.
You will see an **Earning Fast Rewards** indicator below the swap card — this confirms you are accumulating Fast Miles. Check your miles balance from the **My Miles** tab in the top navigation.
***
## Earn Fast Miles
Every swap you make on Fast Swaps earns **Fast Miles** — mev rewards proportional to the value your swaps generate through [Fast Protocol](/v1.2.x/concepts/fast-protocol). The more you swap, the more miles you earn. Users receive at least **90%** of the mev their transactions generate.
Click **My Miles** in the top navigation bar to view your miles balance and swap history.
Check your Fast Miles balance, swap history, and leaderboard position.
See how you rank against other Fast Swaps users.
***
## Tips & Troubleshooting
Ethereum block times are approximately 12 seconds. Most swaps are preconfirmed within seconds and fully confirmed within 1-2 blocks (12-24 seconds). If a swap takes longer:
* Check your wallet for any pending transactions
* The swap may be waiting for a mev-commit opted-in proposer — see [FAST RPC](/v1.2.x/get-started/fastrpc) for details
* If the swap times out (exceeds your deadline), it will automatically cancel and your tokens will remain in your wallet
Common reasons for swap failure:
* **Slippage exceeded** — The price moved more than your max slippage setting between quote and execution. Try increasing slippage via the gear icon (⚙).
* **Insufficient balance** — Make sure you have enough of the input token plus ETH for gas (if swapping ETH).
* **Deadline expired** — The swap was not executed before the swap deadline. Try again with a fresh quote.
* **Price impact too high** — For large swaps, try splitting into smaller amounts.
The Permit2 approval may still be confirming on-chain. Wait for the approval transaction to be mined (check your wallet's activity tab), then refresh the page.
Fast Swaps supports any ERC-20 token with on-chain liquidity on Ethereum. If a token does not appear in the default list, you can add it by pasting its contract address in the token selector search bar. Always verify the contract address from a trusted source like [Etherscan](https://etherscan.io) or [CoinGecko](https://coingecko.com).
* **Swapping ERC-20 tokens** (e.g., USDC → ETH): After the initial one-time Permit2 approval, subsequent swaps are **gasless** — you only sign a message.
* **Swapping ETH** (e.g., ETH → USDC): You submit an on-chain transaction and pay standard Ethereum gas fees.
* **First-time token approval**: The one-time Permit2 approval requires a small amount of ETH for gas.
***
## What's Next?
Learn about the technical architecture, smart contracts, and mev reward mechanics behind Fast Swaps.
Understand how mev is captured, distributed, and why users receive at least 90% of the mev their transactions generate.
Learn about the FAST RPC that powers preconfirmations and mev capture for Fast Swaps.
Quick FAQ on Fast Swaps fundamentals.
# FAST RPC
Source: https://docs.primev.xyz/v1.2.x/get-started/fastrpc
The FAST RPC is a drop-in replacement for standard Ethereum RPC transaction sending endpoints that enables dapps and wallets to easily obtain preconfirmations. Users interact with the RPC like they would with a normal Ethereum node (via `eth_sendRawTransaction`, `eth_getTransactionReceipt`, etc.), but under the hood, the RPC leverages mev-commit to coordinate a decentralized network of block builders who issue and honor transaction commitments. Additionally, the RPC also provides additional methods (such as `mevcommit_getTransactionCommitments`) for advanced use cases. See [FAST RPC API](/v1.2.x/developers/fast-rpc-api) for an overview of the supported methods.
[FAST RPC Usage Instructions for dApps](#usage-for-dapps)
[Usage Instructions for Wallets](#usage-for-wallets)
## How it Works
Users first configure their application to use the FAST RPC. Since fees are paid through a pre-funded gas tank, the user needs to deposit some ETH before sending transactions. For basic usage, the RPC can then be used transparently as any other Ethereum RPC. In particular, `eth_sendRawTransaction` is used to send transactions to the RPC. Instead of sending the transaction to the public mempool, the RPC instead sends encrypted bids to block builders in the mev-commit network. Once all registered block builders have issued a commitment and if the next block proposer is opted in, the RPC considers the transaction as preconfirmed. From that point on, `eth_getTransactionReceipt` will return a receipt for that transaction, including a special block hash, that can be used to call `eth_getBlockByHash`. That call will in turn return a special block that only contains this specific preconfirmed transaction. This ensures compatibility with existing wallets to recognize preconfirmed transactions.
The RPC is designed to integrate easily into existing tools and infrastructure. That means after setup, basic usage is equivalent to using any regular RPC, except that transactions quickly get preconfirmed.
## Usage for dApps
This guide walks you through integrating and using the FAST RPC into your DApp to obtain preconfirmations for Ethereum transactions.
To start using the FAST RPC, configure your application or wallet to use the following RPC endpoint:
```
https://fastrpc.mev-commit.xyz
```
This replaces your standard Ethereum RPC URL (e.g., from Infura or Alchemy).
Before submitting transactions through the FAST RPC, you must fund your gas tank. This is an internal balance used to pay for preconfirmation bids. Use the following RPC method to initiate the deposit process: `mevcommit_estimateDeposit`. This call returns:
* A deposit address (Ethereum address owned by the FAST RPC service),
* A bid amount, representing the cost of confirming your initial deposit.
Once you receive these details, fund the deposit address by sending a regular EOA transfer as described in the next step to the deposit address. The deposited amount will be the amount you send minus the bid amount.
The deposit transaction will already be preconfirmed in the same way as all future transactions via the RPC.
You can send transactions via the FAST RPC as usual using `eth_sendRawTransaction`.
Since fees are handled via mev-commit using the gas tank, the priority fee of the transaction should always be set to 0. To reflect this, the method `eth_maxPriorityFeePerGas` of the RPC therefore always returns 0.
To monitor the transaction status, you can as usual use the method `eth_getTransactionReceipt`. The FAST RPC will already return a receipt once a preconfirmation is obtained from all providers and if the next block proposer is opted in.
For more detailed information, you can also call `mevcommit_getTransactionCommitments`. This method takes the transaction hash as input and returns the commitments received for that transactions on the mev-commit network. This can be useful for advanced decision making in case `eth_getTransactionReceipt` does not return a receipt, e.g., if the block proposer is not opted in or if some, but not all, providers have committed to a transaction.
### Additional Features
Some useful additional features are described here. For an overview of the full available functionality see [FAST RPC API](/v1.2.x/developers/fast-rpc-api).
#### Checking current deposit balance
The balance available in the deposit for future transactions can be checked using `mevcommit_getBalance`. Once this balance runs low, it should be topped up as in the initial deposit described above.
#### Checking for opted in validators
The RPC only issues preconfs via `eth_getTransactionReceipt` if the next block proposer is opted into mev-commit. The DApp may therefore want to adjust its strategy based on whether the next proposers are opted in or not. To enable this, the FAST RPC provides the method `mevcommit_optedInBlock`, which returns the time in seconds until the next block with a mev-commit opted-in proposer.
## Usage for Wallets
**No deposit required — for a limited time, the FAST RPC sponsors your transactions.** Simply add the RPC to your wallet, set your priority fee to `0`, and transact as normal. The RPC will cover your preconfirmation fees, preconfirm your transactions, and rebalance any MEV generated back to your address.
Configure the RPC in your wallet with the values below. The old helper page at `/fastrpc` now redirects here.
### Manual Setup
Open your wallet's **Add Custom RPC** or **Add Network** screen and enter:
| Field | Value |
| --------------- | -------------------------------- |
| Network Name | Ethereum Mainnet |
| RPC URL | `https://fastrpc.mev-commit.xyz` |
| Chain ID | `1` |
| Currency Symbol | ETH |
| Block Explorer | `https://etherscan.io` |
This replaces your standard Ethereum RPC URL (e.g., from Infura or Alchemy) with the FAST RPC.
When sending transactions, set your priority fee to `0`. The FAST RPC handles preconfirmation fees on your behalf — you do not need to pay any extra tip.
Send ETH, use a dApp, or mint an NFT on mainnet with blazing speed. Your transactions are preconfirmed by mev-commit's decentralized network of block builders.
***
## Learn More
Full API method documentation.
FAQ on how FAST RPC fits into Fast Protocol.
# Consuming Bids from mev-commit
Source: https://docs.primev.xyz/v1.2.x/get-started/providers/consuming-bids
Providers that have registered in the mev-commit registry will automatically start receiving bids on the mev-commit p2p network from bidders. In order to see incoming bids, providers need to communicate with their mev-commit node:
Use the official go RPC client to communicate with your mev-commit node. Go get the mev-commit package and then import the generated client as below:
```bash ❯_ terminal theme={null}
go install github.com/primev/mev-commit@latest
```
```go theme={null}
import providerapiv1 "github.com/primev/mev-commit/p2p/gen/go/providerapi/v1"
conn, err = grpc.DialContext(
context.Background(),
"localhost:13524",
grpc.WithBlock(),
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
// handle error
}
client := providerapiv1.NewProviderClient(conn)
bidStream, err := client.ReceiveBids(context.Background(), &providerapiv1.EmptyMessage{})
if err != nil {
// handle error
}
bidC := make(chan *providerapiv1.Bid)
go func() {
defer close(bidC)
for {
bid, err := bidStream.Recv()
if err != nil {
// handle error
}
select {
case <-bidStream.Context().Done():
case bidC <- bid:
}
}
}()
stream, err := client.SendProcessedBids(context.Background())
if err != nil {
// handle error
}
for bid := range bidS {
// check the bid details and communicate with the block-building
// infrastructure to make a decision
status := getDecision(bid)
err := stream.Send(&providerapiv1.BidResponse{
BidDigest: bid.BidDigest,
Status: status,
})
if err != nil {
// handle error
}
}
```
There is an [example implementation](https://github.com/primev/mev-commit/tree/main/p2p/examples/provideremulator) of a dummy provider client which blindly accepts all the bids it sees from its mev-commit node. This could be a good starting point for providers implementing their commitment decision logic in golang.
### Alternative Methods
1. Use [https://github.com/fullstorydev/grpcurl](https://github.com/fullstorydev/grpcurl) or [https://github.com/bloomrpc/bloomrpc](https://github.com/bloomrpc/bloomrpc) or other GUI clients like [Postman](https://www.postman.com). Relevant protobuf files are available in the [mev-commit repository](https://github.com/primev/mev-commit).
2. Check the [API docs](/v1.2.x/api-reference/introduction) to use the REST APIs. The RPC APIs are also available on the HTTP server.
3. Users can use the protobuf files to generate a client in language of their choice.
# Registering as a Provider
Source: https://docs.primev.xyz/v1.2.x/get-started/providers/registering-a-provider
To register on the mev-commit network, providers need to stake ETH in the provider registry contract. This adds credibility to issued commitments, as stake may be slashed in the event of a broken commitment, such as committing to a preconfirmation bid and not including the relevant transaction in a block.
Providers must adhere to some rules and satisfy some criteria described [here](/v1.2.x/concepts/actors#rules-for-providers).
**Validator opt-in status and proposal eligibility.** Registered providers are eligible to win blocks for **any** validator slot — there is no longer a relay-side filter restricting opted-in proposers to registered builders. Your builder competes for every slot on its merits.
**Forthcoming: rewards contract.** A future protocol upgrade will introduce a rewards contract that providers winning blocks for opted-in proposers must route through as the block's `fee_recipient`. The contract takes a protocol fee from the producer reward and forwards the remainder to the validator's registered fee recipient. The fee is dynamic, bounded so opting in remains net-positive for validators. Specifications and activation timing will be published before this is enabled.
Once a provider is registered on the network, other nodes will connect to it, and the provider node will receive bids.
You can use the provider API to stake and check your stake balance.
Make sure you've [funded your account and launched a mev-commit node](/v1.2.x/get-started/quickstart) first.
Check the minimum amount that can be staked, and consider staking more than the minimum. Bidders will only connect to providers which have stake higher than this minimum. The larger a provider's stake, the greater the credibility behind that provider's commitments. The amount is set in `wei`.
```shell theme={null}
> curl localhost:13523/v1/provider/get_min_stake | jq
{
"amount": "1000000000000000000"
}
```
Get your provider's Ethereum address from the topology endpoint. This will be used as the challenge message for BLS signing:
```shell theme={null}
> curl localhost:13523/v1/debug/topology | jq .self."Ethereum Address"
"0xB9286CB4782E43A202BfD426AbB72c8cb34f886c"
```
Rewards on mev-commit now rely on the BLS key found in the relay and are then tied to the BLS key registered. The BLS key that is sending messages to the relay should be registered. This registration can now be done automatically without manual intervention. Once the registration is done, the settlement chain will be able to correctly attribute the winning providers on L1.
Download the bls-signer tool from the releases page and use it to generate your signature:
```shell theme={null}
> bls-signer --private-key YOUR_BLS_PRIVATE_KEY --payload 0xB9286CB4782E43A202BfD426AbB72c8cb34f886c
Payload: 0xB9286CB4782E43A202BfD426AbB72c8cb34f886c
Public Key: 0x8e7884b3c4961550c13c87c0d0d30bdf8f3c9f3b5e0fb6259b2d1dc8c93432fac8f55d8c0f9e4f2a0f7d0a7b9b9f5d1
Signature: 0xa1b2c3... # Your actual signature will be different
```
Make note of both the public key and signature outputs - you'll need these in the next step.
You can map multiple BLS keys to a single stake registration by including multiple public keys and signatures in the arrays. This allows you to use different BLS keys while maintaining a single stake amount.
Register your stake by submitting:
* The stake amount (in wei)
* Your BLS public key from the previous step
* The BLS signature you generated
Here's an example request:
```shell theme={null}
# Replace with your actual values from the previous step
> curl -sS -X POST "http://localhost:13523/v1/provider/stake/{AMOUNT}?bls_public_keys=${PK1}&bls_public_keys=${PK2}&bls_signatures=${SG1}&bls_signatures=${SG2}" | jq
```
Once staked, peer connection logs should appear within a few minutes. You can check the `/topology` endpoint again to verify connected peers.
Congrats, your provider node is registered on mev-commit and you're ready to [consume bids](/v1.2.x/get-started/providers/consuming-bids).
Be sure to view [Querying for Proposers API](/v1.2.x/get-started/bidders/bidder-node-commands#querying-for-proposers-api) for information on detecting mev-commit opted-in Ethereum validators. Other commands that can be used are:
* Check stake balance
```shell theme={null}
> curl localhost:13523/v1/provider/get_stake | jq
{
"amount": "0"
}
```
* Get the account address of your node
```shell theme={null}
> curl localhost:13523/v1/debug/topology | jq
{
"self": {
"Addresses": [
"/ip4/127.0.0.1/tcp/13522",
"/ip4/172.29.0.4/tcp/13522"
],
"Ethereum Address": "0xB9286CB4782E43A202BfD426AbB72c8cb34f886c",
"Peer Type": "provider",
"Underlay": "16Uiu2HAmDWZb4DxZQkS9yseXNukBFe6MhZdimSKuZcHFeJrF3jC9"
},
"connected_peers": null,
"blocked_peers": null
}
```
We recommend reading the [consuming bids](/v1.2.x/get-started/providers/consuming-bids) section next to consume bids effectively.
## Querying the Provider Registry
Bidders, relays, and other observers may want to enumerate currently registered providers and their BLS keys — for example, to identify which providers can issue credible commitments. The Provider Registry contract on the mev-commit chain is the source of truth.
**Contract address (mainnet):** see [Contracts](/v1.2.x/developers/contracts).
```javascript theme={null}
const ethers = require("ethers");
const provider = new ethers.JsonRpcProvider("https://chainrpc.mev-commit.xyz/");
const providerRegistryAddress = "0xb772Add4718E5BD6Fe57Fb486A6f7f008E52167E"; // mainnet
const abi = [
"event ProviderRegistered(address indexed provider, uint256 stakedAmount)",
"function isProviderValid(address provider) public view",
"function getBLSKeys(address provider) external view returns (bytes[])"
];
const contract = new ethers.Contract(providerRegistryAddress, abi, provider);
async function getRegisteredProviders() {
const events = await contract.queryFilter(contract.filters.ProviderRegistered());
const providerMap = {};
for (const event of events) {
const addr = event.args.provider;
try {
await contract.isProviderValid(addr);
const blsKeys = await contract.getBLSKeys(addr);
providerMap[addr] = blsKeys.map(k => ethers.hexlify(k));
} catch { /* skip invalid */ }
}
return providerMap;
}
getRegisteredProviders().then(map => {
for (const [addr, keys] of Object.entries(map)) {
console.log(`Provider: ${addr}`);
keys.forEach((k, i) => console.log(` Key ${i + 1}: ${k}`));
}
});
```
# Sending Commitments
Source: https://docs.primev.xyz/v1.2.x/get-started/providers/sending-commitments
To send your first commitment, you will need to connect to the mev-commit Testnet. This will allow you to consume bids incoming to the network and submit commitments. To do this, you'll want to run an emulator to simulate accepting and rejecting bids.
You will want to connect to a decisioning system that will accept and reject bids based on custom criteria. You can read more about the API to open a gRPC stream [here](/v1.2.x/api-reference/provider/sendprocessedbids).
As an example, a dummy decisioning system is implemented in the repository. This dummy system accepts all the bids it gets. To try it, you can open a new terminal and run the following command:
You require Go Version 1.21.1 to run the example emulator
```
git clone --recurse-submodules https://github.com/primev/mev-commit.git && cd mev-commit &&
git checkout v1.1.0 && cd p2p/examples/provideremulator && go run .
```
## Configuring custom logic to process bids and send Commitments
We can take a deeper look at how you can add custom logic to decision on the sending of commitments.
### Integrating Bid Processing in Your System
To integrate bid processing in your system using the Provider API, follow these steps to receive bid information and send back processed bids:
Implement the Provider service as outlined in the [providerapi.proto](https://github.com/primev/mev-commit/blob/main/p2p/rpc/providerapi/v1/providerapi.proto#L20). This requires setting up a server that can manage RPC methods, with a particular emphasis on the reception of bids and response of commitment authorizations.
Utilize the ReceiveBids RPC method to listen for incoming bids from clients. This method streams bid messages to your server.
The structure of the bid is as follows:
```proto theme={null}
message Bid {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
json_schema: {
title: "Bid message"
description: "Signed bid message from bidders to the provider."
required: ["txHashes", "bidAmount", "blockNumber", "bidDigest"]
}
example: "{\"txHashes\": [\"fe4cb47db3630551beedfbd02a71ecc69fd59758e2ba699606e2d5c74284ffa7\", \"71c1348f2d7ff7e814f9c3617983703435ea7446de420aeac488bf1de35737e8\"], \"amount\": \"1000000000000000000\", \"blockNumber\": 123456, \"bidDigest\": \"9dJinwL+FZ6B1xsIQQo8t8B0ZXJubJwY86l/Yu7yAH159QrPHU0qj2P+YFj+llbuI1ZygdxGsX8+P3byMEA5ig==\", \"decayStartTimestamp\":1725365301000, \"decayEndTimestamp\":1725365302000, \"revertingTxHashes\":[\"fe4cb47db3630551beedfbd02a71ecc69fd59758e2ba699606e2d5c74284ffa7\"]}"
};
repeated string tx_hashes = 1 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Hex string encoding of the hashes of the transactions that the bidder wants to include in the block."
pattern: "[a-fA-F0-9]{64}"
}, (buf.validate.field).cel = {
id: "tx_hashes",
message: "tx_hashes must be a valid array of transaction hashes.",
expression: "this.all(r, r.matches('^[a-fA-F0-9]{64}$'))"
}];
string bid_amount = 2 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Amount of ETH that the bidder is willing to pay to the provider for including the transaction in the block."
pattern: "[0-9]+"
}, (buf.validate.field).cel = {
id: "bid_amount",
message: "bid_amount must be a valid integer.",
expression: "this.matches('^[1-9][0-9]*$')"
}];
int64 block_number = 3 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Max block number that the bidder wants to include the transaction in."
}, (buf.validate.field).int64.gt = 0];
bytes bid_digest = 4 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Digest of the bid message signed by the bidder."
}, (buf.validate.field).bytes = {
min_len: 1,
max_len: 64
}];
int64 decay_start_timestamp = 5 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Timestamp at which the bid starts decaying."
}, (buf.validate.field).cel = {
id: "decay_start_timestamp",
message: "decay_start_timestamp must be a valid integer.",
expression: "uint(this) > 0"
}];
int64 decay_end_timestamp = 6 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Timestamp at which the bid ends decaying."
}, (buf.validate.field).cel = {
id: "decay_end_timestamp",
message: "decay_end_timestamp must be a valid integer.",
expression: "uint(this) > 0"
}];
repeated string reverting_tx_hashes = 7 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Optional array of tx hashes that are allowed to revert or be discarded."
}, (buf.validate.field).cel = {
id: "reverting_tx_hashes",
message: "reverting_tx_hashes must be an array of valid transaction hashes.",
expression: "this.all(r, r.matches('^[a-fA-F0-9]{64}$'))"
}];
repeated string raw_transactions = 8 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Optional array of RLP encoded raw signed transaction payloads that the bidder wants to include in the block."
}, (buf.validate.field).cel = {
id: "raw_transactions",
message: "raw_transactions must be an array of valid raw transactions.",
expression: "this.all(r, r.matches('^[a-fA-F0-9]+$'))"
}];
string slash_amount = 9 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Amount of ETH that will be slashed from the provider if they fail to include the transaction. If zero, the decayed bid amount is used for slashing."
pattern: "[0-9]+"
}, (buf.validate.field).cel = {
id: "slash_amount",
message: "slash_amount must be a valid integer.",
expression: "this == '' || (this.matches('^[0-9]+$') && uint(this) >= 0)"
}];
BidOptions bid_options = 10 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Optional bid options for the transaction."
}];
string bidder_address = 11 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Hex string encoding of the bidder's address recovered from the bid signature."
pattern: "^[a-fA-F0-9]{40}$"
}];
};
```
The raw transactions are optionally provided by the bidder. If provided the order of the transaction hashes in `txHashes` will be the same as the order or the corresponding `rawTransactions`.
Below is an image of the flow through which bids would be received through the gRPC API
The bid options are optionally used by bidders if they want additional constraints on the transaction. Currently, mev-commit supports positional constraints on the transactions w\.r.t the block. The decision logic should take these into consideration before returning.
```proto theme={null}
message PositionConstraint {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
json_schema: {
title: "Position Constraint"
description: "Constraint on the position of the transaction in the block."
}
};
enum Anchor {
ANCHOR_UNSPECIFIED = 0;
ANCHOR_TOP = 1; // Position is at the top of the block
ANCHOR_BOTTOM = 2; // Position is at the bottom of the block
}
enum Basis {
BASIS_UNSPECIFIED = 0;
BASIS_PERCENTILE = 1; // Position is a percentile of the block size
BASIS_ABSOLUTE = 2; // Position is an absolute position in the block
BASIS_GAS_PERCENTILE = 3; // Position is a percentile of the gas used in the block
}
Anchor anchor = 1 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Anchor position of the transaction in the block."
}];
Basis basis = 2 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Basis for the position constraint."
}];
int32 value = 3 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Value of the position constraint. If anchor is TOP, this is the position from the top of the block. If anchor is BOTTOM, this is the position from the bottom of the block."
}];
};
```
For each received bid, implement your custom logic to validate and process these bids. This could involve checking the bid's validity and feasibility based on orderflow, computing the effective gas price, and deciding whether to accept or reject the bid.
After processing each bid, construct a BidResponse message indicating the outcome. This message should include the bid's digest and a status indicating acceptance or rejection.
At a high level, to commit to a bid, your code must send a `STATUS_ACCEPTED` with the bid digest specified, and correspondingly `STATUS_REJECTED` to reject the bid.
The BidResponse structure is as follows:
```
message BidResponse {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
json_schema: {
title: "Bid response"
description: "Response sent by the provider with the decision on the bid received."
required: ["bidDigest", "status"]
}
example: "{\"bidDigest\": \"9dJinwL+FZ6B1xsIQQo8t8B0ZXJubJwY86l/Yu7yAH159QrPHU0qj2P+YFj+llbuI1ZygdxGsX8+P3byMEA5ig==\", \"status\": \"STATUS_ACCEPTED\"}"
};
bytes bid_digest = 1 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Digest of the bid message signed by the bidder."
}];
enum Status {
STATUS_UNSPECIFIED = 0;
STATUS_ACCEPTED = 1;
STATUS_REJECTED = 2;
}
Status status = 2 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Status of the bid."
}, (buf.validate.field).enum = {
defined_only: true,
in: [
1,
2
]
}];
int64 dispatch_timestamp = 3;
};
```
It contains the following fields:
1. bid\_digest: A byte array (bytes type) that represents the digest of the bid message signed by the bidder. This serves as a unique identifier for the bid in question.
2. status: An enumeration (enum Status) that indicates the status of the bid. The status can be one of three values:
STATUS\_UNSPECIFIED: The default value, indicating that the status has not been set or is unknown.
STATUS\_ACCEPTED: Indicates that the bid has been accepted by the provider.
STATUS\_REJECTED: Indicates that the bid has been rejected by the provider.
3. dispatch\_timestamp: Timestamp (int64 type) at which the commitment is accepted by provider and is used to compute the expected revenue from the preconfirmation.
Deploy your gRPC server on suitable infrastructure, ensuring it's accessible to clients. Configure necessary network settings for security and connectivity.
Example Server Implementation in Go:
```go theme={null}
import (
...
"github.com/primev/mev-commit/p2p/examples/provideremulator/client"
providerapiv1 "github.com/primev/mev-commit/p2p/gen/go/providerapi/v1"
)
func ...() {
...
providerClient, _ := client.NewProviderClient(*serverAddr, logger)
bidS, _ := providerClient.ReceiveBids()
for {
select {
case bid, more := <-bidS:
if !more {
return
}
logger.Info("received new bid", "bid", bid)
_ := providerClient.SendBidResponse(context.Background(), &providerapiv1.BidResponse{
BidDigest: bid.BidDigest,
Status: providerapiv1.BidResponse_STATUS_ACCEPTED, // decide here if you want to accept or reject
DispatchTimestamp: time.Now().Unix(),
})
}
}
}
```
This should help you integrate bid processing into your system, allowing you to receive bid information and send back processed bids as commitments.
# Withdraw Stake
Source: https://docs.primev.xyz/v1.2.x/get-started/providers/withdraw
Withdraws the stake from the provider registry.
Withdrawal on mev-commit chain should be done in two steps:
Unstake the funds from the provider registry.
```shell theme={null}
> curl -X POST "http://localhost:13523/v1/provider/unstake"
```
Withdraw the stake from the provider registry.
After 24 hours following the unstake operation, you can withdraw the funds from the provider registry.
```shell theme={null}
> curl -X POST "http://localhost:13523/v1/provider/withdraw_stake" | jq
{
"amount": "1000000000000000000"
}
```
# Quickstart: opt in validators
Source: https://docs.primev.xyz/v1.2.x/get-started/quickstart
Opt L1 validator keys into mev-commit with the mev-commit-opt-in skill.
The default path is agentic. Open [primev.xyz/ai](https://primev.xyz/ai), install the **mev-commit-opt-in** skill, and ask Claude, ChatGPT, or Grok to register your keys into the **mev-commit validator coalition**. Hub-true keys are one signal across many validators. Opt-in is membership, not extra block revenue from a live commitment market.
The old dashboard is deprecated. Any mev-boost relay set is fine. Why this exists: [why opt in](/v1.2.x/knowledge-base/why-should-validators-opt-in).
Full method detail lives on the [agentic opt-in](/v1.2.x/get-started/validators/agentic-opt-in) page.
```bash theme={null}
claude plugin marketplace add primev/claude-plugin
claude plugin install primev
```
```bash theme={null}
grok plugin marketplace add primev/claude-plugin
grok plugin install primev --trust
```
Add [https://primev.xyz/skills/mev-commit-opt-in.md](https://primev.xyz/skills/mev-commit-opt-in.md) as a skill in ChatGPT or Codex. Or click **Copy skill** on [primev.xyz/ai](https://primev.xyz/ai).
Upload a `.txt` or `.csv` of BLS pubkeys (`0x` + 96 hex, comma or newline separated). Batch 40 to 60 keys per transaction. Confirm the first and last key and the count before anything is sent.
Pick the method you already use:
* Vanilla: `Opt these validator pubkeys into mev-commit with simple staking`
* EigenLayer: `Register these BLS keys on the mev-commit AVS as this pod owner`
* Symbiotic: `Register these keys on the mev-commit Symbiotic middleware`
The agent uses **your** Ethereum RPC and wallet. It simulates, sends, waits for the receipt, then checks `ValidatorOptInHub`.
Then finish the steps in [Complete the registry](/v1.2.x/get-started/validators/agentic-opt-in#complete-the-registry). Do not stop after the send.
After the receipt, the agent must call Hub `areValidatorsOptedIn` on the full set.
Success is every key `true`, plus a report of method, key count, tx hash, and an Etherscan or Hoodi link. If any key is `false`, treat the job as unfinished.
Then ask: `Are these pubkeys opted in, and what is my total on-chain ETH stake?`
Hub `true` on each key means registration succeeded. Keep your existing relay set.
Path pages if you want `cast` instead of an agent: [vanilla](/v1.2.x/get-started/validators/vanilla), [EigenLayer](/v1.2.x/get-started/validators/eigenlayer), [Symbiotic](/v1.2.x/get-started/validators/symbiotic).
***
## Bidder or provider node
Running a p2p bidder or provider node is a different path. Create a keystore, [bridge](/v1.2.x/get-started/bridge/bridge-cli) ETH to the mev-commit chain, then start the binary from [releases](https://github.com/primev/mev-commit/releases/).
```bash theme={null}
# bidder
./mev-commit \
--keystore-path $HOME/keystore \
--keystore-password \
--enable-deposit-manager=true \
--target-deposit-amount \
--bootnodes /dnsaddr/bootnode.mev-commit.xyz \
--settlement-rpc-endpoint https://chainrpc.mev-commit.xyz
```
```bash theme={null}
# provider
./mev-commit \
--peer-type provider \
--keystore-path $HOME/keystore \
--keystore-password \
--bootnodes /dnsaddr/bootnode.mev-commit.xyz \
--settlement-rpc-endpoint https://chainrpc.mev-commit.xyz \
--nat-addr
```
Then see [bidder best practices](/v1.2.x/get-started/bidders/best-practices) or [provider registration](/v1.2.x/get-started/providers/registering-a-provider). System notes: [system requirements](/v1.2.x/developers/system-requirements).
# Agentic Opt-In
Source: https://docs.primev.xyz/v1.2.x/get-started/validators/agentic-opt-in
Join the mev-commit validator coalition with the mev-commit-opt-in skill. The old validator dashboard is deprecated.
The validator dashboard at validators.mev-commit.xyz is deprecated. Every opt-in path (vanilla, EigenLayer, Symbiotic) lives in the **mev-commit-opt-in** skill. Manual contract calls on the path pages remain valid if you want them.
Opt L1 validator BLS pubkeys into the **mev-commit validator coalition** from Claude, ChatGPT, or Grok. The skill uses your RPC and wallet, verifies on the ValidatorOptInHub, computes real on-chain ETH stake, and can opt out.
Membership is a single on-chain signal across many keys. It is not extra yield from a live bid market. No fees are enabled at this stage. There is no fee switch without your approval. When a fee is approved and enabled, it funds AI research. [Why join](/v1.2.x/knowledge-base/why-should-validators-opt-in).
Homepage: [primev.xyz/ai](https://primev.xyz/ai) (also [mev-commit.xyz](https://mev-commit.xyz), which redirects here).
Any mev-boost relay set is fine. There is no relay configuration step.
## Install the skill
```bash theme={null}
claude plugin marketplace add primev/claude-plugin
claude plugin install primev
```
```bash theme={null}
grok plugin marketplace add primev/claude-plugin
grok plugin install primev --trust
```
Open [https://primev.xyz/skills/mev-commit-opt-in.md](https://primev.xyz/skills/mev-commit-opt-in.md) and add it as a skill in ChatGPT or Codex.
Source: [github.com/primev/claude-plugin](https://github.com/primev/claude-plugin)
## Complete the registry
Skill install is not registration. Walk this list to a Hub-true result. Agents should execute it in order and ask before every write.
1. **Pick one method.** Vanilla, EigenLayer, or Symbiotic. One pubkey, one method. Do not double-register.
2. **Parse keys.** Accept `.txt`, `.csv`, paste, commas, or newlines. Normalize to `0x` + 96 hex. Confirm count and first/last pubkey with the operator.
3. **Confirm signer and RPC.** Use their `ETH_RPC_URL` (mainnet chain id 1, or Hoodi 560048). Wallet is Foundry keystore, hardware, or `PRIVATE_KEY` only if they insist. Never print a private key. If the signer is a **Safe / multi-sig**, do not send from an owner key. Follow [Safe / multi-sig](#safe--multi-sig).
4. **Prerequisites.**
* Vanilla: read `minStake()`. `msg.value` is split evenly. Extra ETH is a slash buffer. Hoodi vanilla is whitelisted. Mainnet whitelist is coming.
* EigenLayer: caller is the pod owner or the delegated AVS operator. Function name is plural: `registerValidatorsByPodOwners`.
* Symbiotic: vault and operator must already be registered. If not, stop and name the gap.
5. **Simulate, then send.** Batch 40 to 60 keys. Wait for the receipt. A receipt is not opted in.
6. **Verify on the Hub.** `ValidatorOptInHub.areValidatorsOptedIn(bytes[])` at `0x1059155bD5854224bF58e43CD3EEC6B07b4F30Ad`. Every key must be `true`.
7. **Report.** Method, key count, tx hash, Etherscan or Hoodi link, Hub booleans, next step. For stake, sum real on-chain balances. Never `32 ETH × key count`.
If a write reverts, name the contract, function, revert, and the address or pubkey that failed. If the vault or operator is missing, tell them to ping Primev with that address.
## What to say
After install:
* "Opt these validator pubkeys into mev-commit with simple staking."
* "Register these keys on the EigenLayer AVS as this pod owner."
* "Check whether these pubkeys are opted in, and sum my on-chain ETH stake."
* "Unstake these vanilla keys and withdraw when the period is done."
* "These keys should be opted in from our Gnosis Safe, not from an owner wallet."
Upload a `.txt` or `.csv` of BLS pubkeys (`0x` + 96 hex, comma or newline separated). Batch 40 to 60 keys per transaction.
## How it works
The skill follows the same registry calls the old dashboard used after a wallet was connected.
1. Choose a method: [vanilla](/v1.2.x/get-started/validators/vanilla), [EigenLayer](/v1.2.x/get-started/validators/eigenlayer), or [Symbiotic](/v1.2.x/get-started/validators/symbiotic).
2. Parse your key file.
3. Simulate, then send on **your** Ethereum RPC and wallet (Foundry keystore, hardware, or `PRIVATE_KEY` in the environment). If the signer is a Safe, encode the call and propose it in Safe instead. See [Safe / multi-sig](#safe--multi-sig).
4. Wait for the receipt (EOA) or Safe execution, then verify `ValidatorOptInHub.areValidatorsOptedIn`. Hub `true` is done. A receipt or Safe "Success" is not.
Mainnet Hub: `0x1059155bD5854224bF58e43CD3EEC6B07b4F30Ad`
| Method | Contract | Function |
| ---------- | ---------------------------------------------------------------- | ----------------------------------------------------- |
| Vanilla | VanillaRegistry `0x47afdcB2B089C16CEe354811EA1Bbe0DB7c335E9` | `stake(bytes[])` payable |
| EigenLayer | MevCommitAVS `0xBc77233855e3274E1903771675Eb71E602D9DC2e` | `registerValidatorsByPodOwners(bytes[][], address[])` |
| Symbiotic | MevCommitMiddleware `0x21fD239311B050bbeE7F32850d99ADc224761382` | `registerValidators(bytes[][], address[])` |
Read `minStake()` on-chain before vanilla staking. Extra ETH in that tx is a slash buffer, not prepaid capacity. Hoodi vanilla is whitelisted (mainnet whitelist coming).
Prerequisites that are not the skill's job (vault registration, AVS operator registration, EigenLayer delegation) stay on the path pages. If a revert says the vault or operator is missing, the skill names that step so you can ping Primev with the exact address.
## Safe / multi-sig
A Gnosis Safe cannot sign with `cast send`. The registry records `msg.sender`. That must be the **Safe**, not one owner.
The skill hand-holds this:
1. Simulate the call `--from` the Safe. If it reverts, stop.
2. Encode calldata (`cast calldata`).
3. You open [app.safe.global](https://app.safe.global) on that Safe → New transaction → Transaction Builder. Paste **To** (registry), **Value** (vanilla ETH only), **Data** (the calldata). Operation is Call.
4. Propose. Owners sign to threshold. Execute.
5. Paste the L1 hash back, or say it executed.
**How the agent knows it is complete:** it reads **ValidatorOptInHub** (`areValidatorsOptedIn` on your exact keys). That is the source of truth. If you give an L1 hash it also checks the receipt, then still checks the Hub. Safe UI "Success" or a receipt alone is not opted in.
Never give the agent every owner key.
## Opt out
* Vanilla: `unstake`, wait `unstakePeriodBlocks`, then `withdraw`
* EigenLayer: `requestValidatorsDeregistration`, wait, then `deregisterValidators`
* Symbiotic: `requestValDeregistrations`, wait, then `deregisterValidators`
## On-chain stake
Ask the skill for your total ETH stake. It sums beacon effective balances (beacon node or beaconcha.in; a `BEACONCHAIN_API_KEY` is fine) plus VanillaRegistry `getStakedAmount` and real EigenLayer / Symbiotic collateral. It will not use `32 ETH × key count`.
## Manual calls
Path pages still document `cast` / Foundry for operators who do not want an agent:
* [Vanilla](/v1.2.x/get-started/validators/vanilla)
* [EigenLayer](/v1.2.x/get-started/validators/eigenlayer)
* [Symbiotic](/v1.2.x/get-started/validators/symbiotic)
# Eigenlayer Opt-in
Source: https://docs.primev.xyz/v1.2.x/get-started/validators/eigenlayer
Opt into mev-commit by natively restaking to our AVS.
## Why use this method?
Opting-in validators through the mev-commit AVS is ideal for validators that are already natively restaked, or wish to natively restake through Eigenlayer.
This method of opt-in is capital efficient in that a validator's 32 ETH already staked with the beacon chain can be reused as collateral for opting-in to mev-commit. Further, that beacon chain ETH can be restaked towards other protocols.
## Prerequisites
If you plan to bulk opt-in a large number of validator pubkeys, check out the [Eigenlayer Operator Registration](/v1.2.x/knowledge-base/eigenlayer-operator-registration) guide.
Individual validator entities represented by a pod owner must delegate their natively restaked ETH to an Operator that's registered with the mev-commit AVS. See how to delegate [here](https://docs.eigenlayer.xyz/eigenlayer/restaking-guides/restaking-user-guide/restaker-delegation/delegate-to-an-operator).
Operators currently registered with the mev-commit AVS can be found through the Eigenlayer dashboard:
* [Mainnet](https://app.eigenlayer.xyz/avs/0xbc77233855e3274e1903771675eb71e602d9dc2e)
If your currently delegated operator is not registered with mev-commit, you have the option to [change your delegation](https://docs.eigenlayer.xyz/eigenlayer/restaking-guides/restaking-user-guide/restaker-delegation/redelegation-process).
The [Primev Operator](https://app.eigenlayer.xyz/operator/0xEde6F5F1Bf064a7Ee002D83A87C4890bE7B9b415) is available for delegation on mainnet, but will only operate for the mev-commit AVS.
Operators serve the purpose of (optionally) being able to register natively restaked validator pubkeys with the mev-commit AVS. Only the operator that a validator specifically delegates to, and a validator's pod owner, are given validator pubkey registration permissions.
If an Operator is registering pubkeys on behalf of validators, it should manage those validators itself, or represent them well enough to register them into the coalition (staking-as-a-service providers for example). This trustful relationship between validators and their delegated Operator piggybacks off already agreed upon trust assumptions with eigenlayer delegation.
## Pubkey Registration
Following operator delegation, each validator pubkey must be *registered* with the mev-commit AVS from the delegated operator's account, or from the pod owner account. This action adds those pubkeys to the [mev-commit validator coalition](/v1.2.x/knowledge-base/why-should-validators-opt-in). Any mev-boost relay set is fine.
The validator dashboard is deprecated. Pubkey registration is done with the [mev-commit-opt-in skill](/v1.2.x/get-started/validators/agentic-opt-in), which calls `MevCommitAVS.registerValidatorsByPodOwners`.
Pubkey registration is facilitated through the [agentic skill](/v1.2.x/get-started/validators/agentic-opt-in) (or a direct `cast send` to the same function).
The connected metamask account (who is invoking the pubkey registration transaction) must be the delegated operator, or pod owner, of the validator pubkeys that are being registered.
# Lido Opt-in
Source: https://docs.primev.xyz/v1.2.x/get-started/validators/lido
Opt into mev-commit using Validators registered through Lido.
## Why use this method?
Opting-in validators through the Lido Registry is for Lido validators that want those keys on the [mev-commit validator coalition](/v1.2.x/knowledge-base/why-should-validators-opt-in) roster. Hoodi only for now.
## Overview
⚠️ **Important Notes:**
* This contract is only deployed on **Hoodi** testnet at the moment. Mainnet and frontend integration coming soon!
* Operators must be **whitelisted by our team** before registering (see step 1 below).
***
## Contract
You can interact directly with the Hoodi contract on Etherscan using the "Write as Proxy" tab:
[Lido Registry Hoodi Contract](https://hoodi.etherscan.io/address/0xefd6333907fc73c1ac3167d843488b8899bac91b)
***
## Registering as an Operator
### Step 1: Get Whitelisted
To register, you must first be whitelisted as an operator. To request whitelisting, please fill out [this short google form](https://docs.google.com/forms/d/e/1FAIpQLSfIYZs1l7wqd6jkHHFZA8FQ6vg3T6KF6R_XBZsSGGbzN7q4Hg/viewform) with your operator info, or reach out to our team through [telegram](https://t.me/+-aiQNWqjZRQ1OWJh).
### Step 2: Call `stake`
Once whitelisted, you can register by calling:
```solidity theme={null}
stake(bytes[] blsKeys)
```
* **blsKeys**: Provide a list of your validator public keys.
* You must also provide the required ETH collateral when calling.
**Formatting Note for Etherscan:** When providing `bytes[]` input on Etherscan, use the format:
```
0xkey1,0xkey2,0xkey3,...
```
(No brackets, no quotes)
### Stake Requirement
The parameter `VanillaRegistry.minStake` determines how much ETH must be staked per validator pubkey to opt-in to mev-commit:
* **Mainnet**: .0001 ETH (not live yet)
* **Hoodi**: .0001 ETH
***
## Claiming Rewards
For instructions on how to claim rewards for your validators, please refer to the [Rewards Guide](/v1.2.x/get-started/validators/rewards).
## Withdrawing
If you need to deregister and withdraw:
1. Call `unstake(bytes[] blsKeys)` to start the process. Validators are considered opted out during this time.
2. Wait **96 blocks** on Hoodi (the unstaking period).
3. Call `withdraw(bytes[] blsKeys)` to receive your ETH back.
# Rewards
Source: https://docs.primev.xyz/v1.2.x/get-started/validators/rewards
RewardDistributor Operator Guide
The `RewardDistributor` contract is **Hoodi test plumbing** for later coalition fees and token grants. It is not a mainnet payout for extra block revenue.
**No fees are enabled at this stage.** There is no fee switch without your approval. Members must actively approve any fee before it starts. When a fee is approved and enabled, this contract can track it per operator and recipient so operators (or their delegates) can claim to the right addresses.
Opt-in today is coalition membership. See [Why should validators opt in](/v1.2.x/knowledge-base/why-should-validators-opt-in).
## Contract Details
* **Network**: Hoodi (Testnet)
* **Address**: [0x69f286fc7869c30809a9695462fa79a0fd99c5bc](https://hoodi.etherscan.io/address/0x69f286fc7869c30809a9695462fa79a0fd99c5bc#writeProxyContract)
## Interacting with the Contract
The Rewards Distributor is currently live on the [Hoodi testnet](https://hoodi.etherscan.io/address/0x69f286fc7869c30809a9695462fa79a0fd99c5bc#writeProxyContract). A Mainnet deployment and a dedicated claiming UI will be available in the future.
For now, you can manage and claim rewards programmatically or by interacting directly with the contract on Etherscan.
## Claiming rewards
Rewards do not stream automatically to your wallet; you must explicitly [claim them from the contract](https://hoodi.etherscan.io/address/0x69f286fc7869c30809a9695462fa79a0fd99c5bc#writeProxyContract).
### Claim as the operator
To transfer all pending rewards to your recipients:
1. Find the `claimRewards` function.
2. **recipients**: Enter your recipient address(es) in bracket format.
* Example: `[0xYourRecipientAddress]`
3. **tokenID**: Enter the ID of the token to claim.
* For **ETH**: `0`
* For **Tokens**: `1`
4. Click **Write** and confirm the transaction.
## Setting reward recipients
By default, if a recipient is not set, rewards earned by a validator are granted to the validator's operator address.
### Set a global default recipient
To ensure all rewards go to a specific address (e.g. a cold wallet or a splitter contract), you should set a global operator override. This applies to all your validator keys unless specifically overridden for a key. Individual key recipient overrides can also be set.
1. Find the `setOperatorGlobalOverride` function.
2. **recipient**: Enter the address you want to receive the rewards.
3. Click **Write** and confirm the transaction.
# Rocket Pool Opt-in
Source: https://docs.primev.xyz/v1.2.x/get-started/validators/rocketpool
Opt into mev-commit using Validators registered through Rocket Minipools.
This guide explains how to register Rocket Pool validators with the **Rocket Pool Minipool Registry** for mev-commit, how freezing works, and how to deregister. This Registry is only available on Hoodi testnet at the moment, with mainnet deployment coming soon.
***
## Why use this method?
Opting-in validators through the RocketMinipool Registry is for Rocket Pool validators that want those keys on the [mev-commit validator coalition](/v1.2.x/knowledge-base/why-should-validators-opt-in) roster. Hoodi only for now.
***
## How the Registry integrates with Rocket Pool
The registry relies on Rocket Pool's contracts to check for each validator's associated minipool and determine the **authorized operators**. The registry itself does not remap keys to minipools and operators; Rocket Pool contract data is checked at the time of the relevant call.
***
## Registering validators
### Registering using a withdrawal address
Simple registration can currently be executed on Hoodi etherscan from a Rocket Pool withdrawal address using the "Write as Proxy" tab on the [RocketMinipoolRegistry contract](https://hoodi.etherscan.io/address/0xbe5a803a7b68f442eff1953c672a3499779680b0#writeProxyContract) (address ). Mainnet deployment is planned in the near future.
Call:
```solidity theme={null}
registerValidators(bytes[] valPubKeys)
```
Requirements per key:
* The pubkey must be associated with an **active Rocket Pool minipool**.
* The validator must not already be registered.
* The caller must be the **withdrawal address** for that minipool.
**Etherscan input tip (bytes\[]):**
```
0xkey1, 0xkey2, 0xkey3, ...
```
No brackets, no quotes.
***
### Registering using a signature from your node address
Users can also register by authorizing an executor with a signature from their node address, signed locally via Smart Node. Full front-end support for generating these signatures will be available soon.
> **⚠️ Caution: Do not use your node address in a web browser**
>
> For node security, it is best practice to avoid putting node address keys into web browsers.
> When registering via a browser, use your withdrawal address instead, or perform the action locally via so keys never touch a website.
## Freezing & unfreezing
* **Freeze:** The **freeze oracle** can call `freeze(bytes[] valPubKeys)` for validators that violate protocol rules. Frozen validators are considered opted out.
* **Unfreeze:** Anyone can call `unfreeze(bytes[] valPubKeys)` and pay `unfreezeFee * numberOfKeys`. The current fee and receiver can be checked on-chain. The owner can also override with `ownerUnfreeze(bytes[] valPubKeys)`.
***
## Deregistration
Deregistration is a two-step process:
* Call `requestValidatorDeregistration(bytes[] valPubKeys)` to start the timer.
* After `deregistrationPeriod` has passed, call `deregisterValidators(bytes[] valPubKeys)` to complete it. Validators must not be frozen.
Helper: `getEligibleTimeForDeregistration(bytes pubkey)` returns the timestamp when a validator can be deregistered. A value of 0 indicates that no deregistration request has been made for the key.
# Symbiotic Opt-in
Source: https://docs.primev.xyz/v1.2.x/get-started/validators/symbiotic
Opt into mev-commit by ERC20 restaking with the MevCommitMiddleware contract through Symbiotic.
# Context
### Why use this method?
Opting-in through Symbiotic is ideal for validators that wish to be secured by ERC20 collateral residing from a Symbiotic vault.
Symbiotic is capital efficient in that vault collateral can be restaked towards other protocols. Further, Symbiotic offers a large degree of restaking configurability.
### Prerequisites
Prior to opt-in through Symbiotic, it's worth familiarizing yourself with their [documentation](https://docs.symbiotic.fi/) on Networks, Vaults, and Operators. This method of validator opt-in requires competency in vault and operator curation.
### Who is this for?
Mev-commit is flexible in the type of entities that use Symbiotic to restake, and secure validators with our protocol. Any combination of Operator and Vault entities can be used, whether each are from the same organization or not.
Most importantly, For L1 validators to be opted-in to mev-commit, a minimum of 3 ETH worth of restake must be slashable for each validator, in case that validator acts against its protocol commitments. This can be reduced for operators with a large number of validators to 1,000 ETH at the entity level. Vaults allocate slashable ERC20 collateral to Operators that are registered with the mev-commit network in Symbiotic. This collateral may be slashable by other Symbiotic networks, hence it is restaked.
Operators for the mev-commit network are responsible for bulk registering groups of L1 validator pubkeys to an associated vault. Every registered validator is represented by restaked collateral from a single Vault and Operator. Each Vault’s total collateral can be split up to secure/represent many validators in groups.
### What opt-in means
Opt-in through this method adds keys to the [mev-commit validator coalition](/v1.2.x/knowledge-base/why-should-validators-opt-in). It is not extra yield from higher mev-boost bids today.
All vault/operator pairs must agree how any later coalition fee or token grant is split.
See [Why Participate](/v1.2.x/get-started/validators/validator-guide#why-participate).
### Network Overview
The Symbiotic "network" in this context is mev-commit. Our network is represented by:
* A "network address", aka the Primev team multisig at [0x9101eda106A443A0fA82375936D0D1680D5a64F5](https://etherscan.io/address/0x9101eda106A443A0fA82375936D0D1680D5a64F5)
* A "middleware contract" at [0x21fD239311B050bbeE7F32850d99ADc224761382](https://etherscan.io/address/0x21fD239311B050bbeE7F32850d99ADc224761382)
# Setup
The following setup steps will reference various Symbiotic core contracts. Refer to their [deployments page](https://docs.symbiotic.fi/category/deployments) and [core source code](https://github.com/symbioticfi/core).
For technical users who're comfortable running foundry scripts, we've provided example code for every step in the setup process [here](https://github.com/primev/mev-commit/blob/main/contracts/scripts/validator-registry/middleware/ExampleSetup.s.sol).
Alternatively the Symbiotic CLI can assist in many of these steps. Refer to their [docs](https://docs.symbiotic.fi/guides/cli/).
A vault contract must be deployed and configured with slashable ERC20 `collateral`. Mev-commit will accept most forms of ERC20 collateral, unless they present significant risk of losing value. For non ETH denominated assets, overcollateralization may be required compared to their ETH denominated counterparts.
See Symbiotic's [vault deployment guide](https://docs.symbiotic.fi/guides/vault-deployment/) and [vault configuration docs](https://docs.symbiotic.fi/handbooks/vaults-handbook#vault-configuration).
We enforce that all of the `Vault`, `Delegator`, `Slasher`, and `BurnerRouter` contracts are deployed via their relevant "factory" contract. Using Symbiotic's `VaultConfigurator` achieves this, and is recommended. Factory and vault configurator addresses can be found from the Symbiotic [deployments page](https://docs.symbiotic.fi/category/deployments).
Mev-commit enforces vault configuration from the following dropdowns:
The `IVaultStorage.burner` address must be set to a `BurnerRouter` contract, and this contract must be deployed via Symbiotic's `IBurnerRouterFactory.create()`. Find more details about burner routers [here](https://docs.symbiotic.fi/modules/extensions/burners#burner-router).
If you're deploying a burner router for the first time, please set all necessary parameters upon contract initialization. This avoids unnecessary delays in the setup process. If your burner router is already deployed, the `delay` must elapse before `acceptNetworkReceiver` can be called, to properly set the network receiver.
The deployed burner router must be configured as follows:
* `IBurnerRouter.networkReceiver()` must be set to `0xD5881f91270550B8850127f05BD6C8C203B3D33f`.
* `IBurnerRouter.operatorNetworkReceiver()` must be disable by setting to `address(0)`, or set to `0xD5881f91270550B8850127f05BD6C8C203B3D33f`. Essentially this value must not override a valid network receiver.
* `IBurnerRouter.delay()` must be greater than `2 days`.
Upon vault registration, and validator registration, all burner router configuration is validated on-chain. If later on this validation fails, all validators associated to a vault will no longer be opted-in, as enforced in `_isValidatorOptedIn`.
The delegator module for the vault must be the `NetworkRestakeDelegator` or `OperatorSpecificDelegator` type. `FullRestakeDelegator` is not supported.
If using an `OperatorSpecificDelegator`, ensure the `IOperatorSpecificDelegator.operator()` field is initialized to the operator address that'll be used in subsequent steps. The operator field is immutable after delegator deployment!
The slasher module must be set, and can be either a `Slasher` or `VetoSlasher` type.
Vaults with an instant `Slasher` must have an `epochDuration` greater than `1 day` to register with our middleware contract.
Vaults with veto slashers:
* must have an `epochDuration` greater than `1 day + vetoDuration`, where `vetoDuration` is specified by the slasher.
* require the resolver to be disabled via `address(0)`, since a permissioned oracle account invokes slashing, requiring only the most basic slashing interface.
`IBaseSlasher.BaseParams` must have `isBurnerHook` set to `true`.
Considering these requirements, below is an example of how to deploy a vault with a burner router, delegator, and slasher, using a foundry script.
```solidity theme={null}
contract SetupVault is Script {
function run() external {
vm.startBroadcast();
// Deploy burner router
address burnerRouterFactory = 0x42dD40dC2130c658AB32d9989FF8aBe6c36463c0;
IBurnerRouter.NetworkReceiver[] memory networkReceivers = new IBurnerRouter.NetworkReceiver[](1);
networkReceivers[0] = IBurnerRouter.NetworkReceiver({
network: 0x9101eda106A443A0fA82375936D0D1680D5a64F5,
receiver: 0xD5881f91270550B8850127f05BD6C8C203B3D33f
});
address burnerRouter = IBurnerRouterFactory(burnerRouterFactory).create(
IBurnerRouter.InitParams({
owner: msg.sender,
collateral: 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84, // stETH
delay: 3 days, // > 2 days
globalReceiver: msg.sender,
networkReceivers: networkReceivers,
operatorNetworkReceivers: new IBurnerRouter.OperatorNetworkReceiver[](0) // Empty or same as networkReceivers
}));
console.log("Burner router deployed to:", address(burnerRouter));
// Deploy vault with delegator and slasher
IVaultConfigurator vaultConfigurator = IVaultConfigurator(0x29300b1d3150B4E2b12fE80BE72f365E200441EC);
address[] memory networkLimitSetRoleHolders = new address[](1);
networkLimitSetRoleHolders[0] = msg.sender;
address[] memory operatorNetworkSharesSetRoleHolders = new address[](1);
operatorNetworkSharesSetRoleHolders[0] = msg.sender;
IVaultConfigurator.InitParams memory initParams = IVaultConfigurator.InitParams({
version: 1,
owner: msg.sender,
vaultParams: abi.encode(IVault.InitParams({
collateral: 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84, // stETH
burner: address(burnerRouter),
epochDuration: 1 weeks,
depositWhitelist: false,
isDepositLimit: false,
depositLimit: 0,
defaultAdminRoleHolder: msg.sender,
depositWhitelistSetRoleHolder: msg.sender,
depositorWhitelistRoleHolder: msg.sender,
isDepositLimitSetRoleHolder: msg.sender,
depositLimitSetRoleHolder: msg.sender
})),
delegatorIndex: 2, // OperatorSpecificDelegator
delegatorParams: abi.encode(IOperatorSpecificDelegator.InitParams({
baseParams: IBaseDelegator.BaseParams({
defaultAdminRoleHolder: msg.sender,
hook: 0x0000000000000000000000000000000000000000,
hookSetRoleHolder: msg.sender
}),
networkLimitSetRoleHolders: networkLimitSetRoleHolders,
operator: 0xb4F13624966E874967d7C9231F2F740F03F1A832
})),
withSlasher: true,
slasherIndex: 0, // Instant slasher
slasherParams: abi.encode(ISlasher.InitParams({
baseParams: IBaseSlasher.BaseParams({
isBurnerHook: true // Required
})
}))
});
```
To run the script, use a command similar to
```bash theme={null}
forge script scripts/validator-registry/middleware/ExampleSetup.s.sol:SetupVault \
--via-ir \
--rpc-url $RPC_URL \
--keystore $KEYSTORE \
--password $PASSWORD \
--broadcast
```
After the vault, burner router, delegator, and slasher are deployed in the previous step, the vault must obtain deposits of the appropriate ERC20 collateral type. These deposits can come from a variety of sources depending on the vault.
Here is an example of how an account would deposit to a vault using a foundry script.
```solidity theme={null}
contract DepositToVault is Script {
function run() external {
vm.startBroadcast();
address stEthVault = 0x5DF518571733d5F4f496D76C9087110FAe98a946;
address stEthToken = 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84;
IERC20(stEthToken).approve(stEthVault, 0.1 ether);
IVault vault = IVault(stEthVault);
vault.deposit(msg.sender, 0.1 ether);
vm.stopBroadcast();
}
}
```
To run the script, use a command similar to
```bash theme={null}
forge script scripts/validator-registry/middleware/ExampleSetup.s.sol:DepositToVault \
--via-ir \
--rpc-url $RPC_URL \
--keystore $KEYSTORE \
--password $PASSWORD \
--broadcast
```
Next, a Symbiotic operator can be setup as an EOA or a contract. The Operator must be registered with Symbiotic via `OperatorRegistry.registerOperator()`.
The operator must then opt-in to any vault which will secure validators via `VaultOptInService.optIn(vaultAddress)`.
The operator then opts-in to the mev-commit network via `NetworkOptInService.optIn(networkAddress)`. The network address is `0x9101eda106A443A0fA82375936D0D1680D5a64F5` for mainnet. An operator only needs to opt-in to the mev-commit network once even if an operator represents multiple vaults.
Here is an example of the operator actions required in this step, using a foundry script.
```solidity theme={null}
contract OperatorActions is Script {
function run() external {
vm.startBroadcast();
IOperatorRegistry operatorRegistry = IOperatorRegistry(0xAd817a6Bc954F678451A71363f04150FDD81Af9F);
operatorRegistry.registerOperator();
IOptInService vaultOptInService = IOptInService(0xb361894bC06cbBA7Ea8098BF0e32EB1906A5F891);
address stEthVault = 0x5DF518571733d5F4f496D76C9087110FAe98a946;
vaultOptInService.optIn(stEthVault);
IOptInService networkOptInService = IOptInService(0x7133415b33B438843D581013f98A08704316633c);
networkOptInService.optIn(0x9101eda106A443A0fA82375936D0D1680D5a64F5);
vm.stopBroadcast();
}
}
```
To run the script, use a command similar to
```bash theme={null}
forge script scripts/validator-registry/middleware/ExampleSetup.s.sol:OperatorActions \
--via-ir \
--rpc-url $RPC_URL \
--keystore $KEYSTORE \
--password $PASSWORD \
--broadcast
```
At this point you've setup a vault and operator pair that can be used to opt-in a group of validator pubkeys. Next you'll need communicate the following details to our team:
* The vault address and operator address setup in previous steps.
* The type of ERC20 collateral that will be used to secure the validator pubkeys.
* The decimal precision of the ERC20 collateral (not all ERC20s have 18 decimal precision).
* The max amount of collateral your vault plans to allocate toward securing the mev-commit network. This value should be equal to or less than the total collateral in the vault.
Hey Primev team, here are the required details for step 4 of the Symbiotic opt-in process.
* Vault Address: `0xa0Fc5e70aad58028020A13ACd2e5B1f2431C912f`
* Operator Address: `0x7c096554FCb894DE83aEf8e5F31CC6B04cD9570d`
* Collateral Type: `stETH`, contract address: `0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84`
* Collateral Precision: `18`
* Amount of collateral available to allocate: `1000000.0 stETH`
Please provide these values to our team in the exact format described, and let us know if you have any questions.
From here our team will assign a `slashAmount` appropriate for the collateral type. `slashAmount` of collateral is required to define a single validator as being slashable, and therefore opted-in to mev-commit. The vault/operator pair is able to opt-in `totalCollateral / slashAmount` number of validators.
The network address (represented by Primev) will then set a max network limit for the vault's delegator module, `IBaseDelegator.setMaxNetworkLimit(uint96 identifier, uint256 amount)`. This is the maximum amount of collateral that will be accepted by the network from the vault.
The network address will also call:
* `MevCommitMiddleware.registerOperators` to register the operator with the middleware contract.
* `MevCommitMiddleware.registerVaults` to register the vault with the middleware contract, associated to a `slashAmount`.
Finally the vault curator address must make some calls. `setNetworkLimit(bytes32 subnetwork, uint256 amount)` should be called on the delegator module of the vault. This sets the total amount of collateral the vault would like to restake to the mev-commit network.
For mev-commit, the subnetwork id is always `1`, and the `subnetwork` argument can be computed using Symbiotic's [Subnetwork library](https://github.com/symbioticfi/core/blob/main/src/contracts/libraries/Subnetwork.sol), by concatenating the network address with the subnetwork ID. For mainnet the subnetwork bytes32 value is `0x9101eda106a443a0fa82375936d0d1680d5a64f5000000000000000000000001`.
If using a `NetworkRestakeDelegator`, the vault curator must then call `INetworkRestakeDelegator.setOperatorNetworkShares(bytes32 subnetwork, address operator, uint256 shares)`. This sets what portion of the mev-commit allocated stake the vault curator is allocating to a particular operator.
If using an `OperatorSpecificDelegator`, calling `setOperatorNetworkShares` is not required, as this type of delegator automatically allocates 100% of the "shares" to a single operator.
Here is an example of how the vault curator would complete this step, using a foundry script.
```solidity theme={null}
contract VaultActions is Script {
function run() external {
vm.startBroadcast();
IOperatorSpecificDelegator delegator = IOperatorSpecificDelegator(0x75b131De299A5D343b9408081DD6A8D6a9891b8c);
delegator.setNetworkLimit(0x9101eda106a443a0fa82375936d0d1680d5a64f5000000000000000000000001, 1000000 ether);
uint256 stake = delegator.stake(0x9101eda106a443a0fa82375936d0d1680d5a64f5000000000000000000000001, msg.sender);
console.log("Stake toward operator:", stake);
vm.stopBroadcast();
}
}
```
To run the script, use a command similar to
```bash theme={null}
forge script scripts/validator-registry/middleware/ExampleSetup.s.sol:VaultActions \
--via-ir \
--rpc-url $RPC_URL \
--keystore $KEYSTORE \
--password $PASSWORD \
--broadcast
```
Now that setup is complete, the operator can register validators to the vault, so long as enough slashable collateral is allocated to the operator from previous steps.
This is done with the [mev-commit-opt-in skill](/v1.2.x/get-started/validators/agentic-opt-in), which calls `MevCommitMiddleware.registerValidators`. The [old dashboard](https://validators.mev-commit.xyz/) is deprecated.
Validator deregistration is also done through this dashboard, and requires waiting a deregistration period.
# Hoodi Testnet
Users can test Symbiotic flow using our Hoodi Vault (no stake necessary) by completing step 3 of the setup process above using our Hoodi Vault and Hoodi Network address, then contacting our team for registration within the Hoodi MevCommitMiddleware contract.
Alternatively, users can follow the full setup steps to test using their own Hoodi Vaults.
**Note:** Mentioned mainnet addresses in the setup guide **must be substituted with corresponding testnet addresses** [**found here**](https://docs.primev.xyz/v1.2.x/developers/networks/testnet#other-addresses-hoodi) and [**Symbiotic's Hoodi addresses, found here.**](https://docs.symbiotic.fi/deployments/testnet/#core-2)
# How to Maintain Validators Stay Opted-In
It's an operator's responsibility to monitor vault collateral, and make sure all registered validators are also slashable. This means if vault collateral is reduced to a value that does not define all validators as slashable (considering `slashAmount`), the operator must deregister validators of its choice, or implicitly accept that some quasi-random validators will no longer be "opted-in".
# Validator Guide
Source: https://docs.primev.xyz/v1.2.x/get-started/validators/validator-guide
Join the mev-commit validator coalition. This guide covers what you need to opt in as an L1 validator.
## Why Participate?
Opt-in adds your L1 keys to the **mev-commit validator coalition**. The coalition is a single signal across a large key set: mev-forward, innovation-forward, and active in Ethereum policy (EF and related groups) on clients, staking, validators, and yield.
It is not a live payout from a commitment market. You keep your existing relay set. No fees are enabled at this stage. There is no fee switch without your approval. When members approve a fee and it is enabled, that fee funds AI research on Ethereum. Founding members are granted tokens in proportion to their contributions. Details: [Why should validators opt in](/v1.2.x/knowledge-base/why-should-validators-opt-in).
## Requirements
1. An operational L1 validator node.
2. An operational mev-boost or other sidecar.
3. 3 ETH worth of stake or restake per validator, or 1,000 ETH worth per operator entity.
As an opted-in validator, you can keep your existing mev-boost relay set unchanged. There is no requirement to take blocks only from a registered provider set.
By opting in **in one of the three forms described**, you add keys to the coalition roster (Hub-true). Keep your existing relay configuration. Historical bidder and provider node docs are under [mev-commit chain and p2p](/v1.2.x/get-started/bidders/best-practices) and are not the reason to opt in.
**No fees are enabled at this stage.** There is no fee switch without your approval. Members must actively approve any coalition fee before it starts. When a fee is approved and enabled, it funds AI research on Ethereum clients, validators, staking, and yield policy, including a step toward about 1% of validator yield. Founding members are granted tokens sized to match or exceed fees they contribute. The token is the right to create proposals for holders to accept.
**Use any relay.** Opted-in validators can run any mev-boost relay set. There is no curated list of supporting relays. Your existing mev-boost configuration works as-is.
Proposers who fall back to local block production are **not slashed** for that. See [flashbots docs](https://docs.flashbots.net/flashbots-mev-boost/architecture-overview/risks#liveness-and-local-fallback).
## How to opt in
The validator dashboard is deprecated. Use the [mev-commit-opt-in skill](/v1.2.x/get-started/validators/agentic-opt-in) from [primev.xyz/ai](https://primev.xyz/ai). Any mev-boost relay set is fine. There is no relay configuration step.
## Choose Your Opt-In Method
Note each validator pubkey should only opt-in using one of the three methods described below. Prefer the [agentic skill](/v1.2.x/get-started/validators/agentic-opt-in). The cards below are the contract-level detail pages.
[Click here](/v1.2.x/get-started/validators/eigenlayer) for more information on native restaking with mev-commit's AVS
[Click here](/v1.2.x/get-started/validators/symbiotic) for more information on ERC20 restaking with mev-commit's middleware contract
[Click here](/v1.2.x/get-started/validators/vanilla) for more information on "vanilla" staking with mev-commit
## Protocol Design
To learn more about the protocol design for any of the registries, see their respective READMEs:
* [MevCommitMiddleware](https://github.com/primev/mev-commit/tree/main/contracts/contracts/validator-registry/middleware#readme)
* [MevCommitAVS](https://github.com/primev/mev-commit/blob/main/contracts/contracts/validator-registry/avs/README.md)
* [VanillaRegistry](https://github.com/primev/mev-commit/tree/main/contracts/contracts/validator-registry#vanilla-registry---simple-staking-solution)
To query the on-chain parameters of any registry (on mainnet or Hoodi), run an example forge script like [this](https://github.com/primev/mev-commit/blob/main/contracts/scripts/validator-registry/GetParams.s.sol).
***
## Learn More
Coalition, policy, future fees, AI research, and founding-member tokens.
# Vanilla Opt-in
Source: https://docs.primev.xyz/v1.2.x/get-started/validators/vanilla
Opt into mev-commit by simply staking ETH.
## Why use this method?
**Pros:**
* Simple staking (aka vanilla staking) is the most straightforward method for validators to opt-in to mev-commit.
* Vanilla staking requires minimal setup and is permissionless. The vanilla registry allows validators to be opted-in directly by staking native ETH.
**Cons:**
* Vanilla staking is not as capital efficient as using Symbiotic or Eigenlayer, as restaking isn't possible. The ETH used to vanilla stake validators is completely separate from a validator's 32 ETH already staked with the beacon chain.
* Vanilla staking does not support the use of ERC20 collateral.
## Getting Started
Validators are able to *opt-in to mev-commit* by *vanilla* staking ETH directly with the `vanillaRegistry` contract.
This action adds those pubkeys to the [mev-commit validator coalition](/v1.2.x/knowledge-base/why-should-validators-opt-in). Any mev-boost relay set is fine.
The vanilla registry strictly accepts BLS public keys as the validator opt-in identifier. Any account can stake on behalf of validator pubkey(s), and only that account has the ability to unstake in the future.
Accounts must only register pubkeys for which they control or otherwise manage. If an account registers a pubkey for which they do not own/manage (think “griefing”), their relevant stake amount may be slashed.
## How staking works during registration
When registering validators, ETH must be sent as collateral **with the registration transaction**. That stake is **evenly distributed across all validators** included in that registration.
The `VanillaRegistry.minStake` parameter represents how much ETH must be staked per validator pubkey to define that validator as opted-in to mev-commit. The `minStake` is .0001 ETH on both mainnet and Hoodi.
> **Clarification:** Over collateralizing a registration does not pre-fund future registrations. If more ETH than `minstake * n keys` is sent during a registration, that extra ETH is simply spread across the validators registered in that tx (this can be used as a slash buffer).
For large groups of validators, it is recommended to stake in batches of 40-60 public keys at a time to ensure transaction success without hitting gas limits. This process can be tested on Hoodi.
### Staking validator keys
\*Whitelisting is now required on Hoodi, and will soon be added to mainnet. If registering on Hoodi, please reach out to our team with your operator address to enable registration!
The validator dashboard is deprecated. Vanilla opt-in is done with the [mev-commit-opt-in skill](/v1.2.x/get-started/validators/agentic-opt-in). Any mev-boost relay set is fine.
To vanilla stake validator pubkeys, install the skill from [primev.xyz/ai](https://primev.xyz/ai) and ask it to opt in via simple staking. It calls `VanillaRegistry.stake(bytes[])` on your RPC, then verifies `ValidatorOptInHub`. You can still send the same function yourself with `cast` if you prefer.
# Welcome to Primev
Source: https://docs.primev.xyz/v1.2.x/get-started/welcome-to-primev
Primev is an Ethereum mev research organization. We ship high-performance products that use mev and cryptography. This site is the technical documentation for those products and the mev-commit validator coalition.
### Mev-commit Validator Coalition
Operators opt L1 keys into one on-chain signal for policy and later, member-approved fees that fund AI research.
Opt-in is membership, not extra block revenue from a live commitment market. No fees are enabled at this stage. There is no fee switch without member approval. Registration is agentic from [primev.xyz/ai](https://primev.xyz/ai). The old dashboard is deprecated. Any mev-boost relay set is fine.
Install the skill, then finish registration until Hub returns true.
Coalition, policy, future fees, AI research, and founding-member tokens.
### For agents
If you are helping an operator **join the coalition**, register their keys on one registry, then prove it on the Hub. Do not stop at skill install. Do not tell them they now earn extra revenue from a running mev-commit network.
1. Load [mev-commit-opt-in](https://primev.xyz/skills/mev-commit-opt-in.md) or the Primev plugin.
2. Take their pubkey file, RPC, and wallet.
3. Follow [Complete the registry](/v1.2.x/get-started/validators/agentic-opt-in#complete-the-registry) until every key is Hub `true`.
4. Report method, key count, tx hash, explorer link, and Hub booleans.
One pubkey, one method. Never `32 ETH × key count` for stake.
### Registries
| Method | Contract | Function |
| ---------- | ---------------------------------------------------------------- | ----------------------------------------------------- |
| Vanilla | VanillaRegistry `0x47afdcB2B089C16CEe354811EA1Bbe0DB7c335E9` | `stake(bytes[])` payable |
| EigenLayer | MevCommitAVS `0xBc77233855e3274E1903771675Eb71E602D9DC2e` | `registerValidatorsByPodOwners(bytes[][], address[])` |
| Symbiotic | MevCommitMiddleware `0x21fD239311B050bbeE7F32850d99ADc224761382` | `registerValidators(bytes[][], address[])` |
Hub (source of opted-in): ValidatorOptInHub `0x1059155bD5854224bF58e43CD3EEC6B07b4F30Ad`
Contract-level pages: [vanilla](/v1.2.x/get-started/validators/vanilla), [EigenLayer](/v1.2.x/get-started/validators/eigenlayer), [Symbiotic](/v1.2.x/get-started/validators/symbiotic). Requirements: [validator guide](/v1.2.x/get-started/validators/validator-guide). Why: [why opt in](/v1.2.x/knowledge-base/why-should-validators-opt-in).
### Products
These products are currently in **maintenance mode**. Docs stay up. The active work is the validator coalition above.
Swaps, FAST RPC, and x402. In maintenance. Site: [fastprotocol.io](https://fastprotocol.io).
Protocol, contracts, and the p2p bidder and provider path. In maintenance.
# Eigenlayer Operator Registration
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/eigenlayer-operator-registration
Instructions for registering as an Eigenlayer operator for the mev-commit AVS, enabling validator opt-in via restaking.
## Why register as a mev-commit AVS operator?
Validator organizations may wish to register an operator entity with the mev-commit AVS in order to facilitate bulk validator opt-in to mev-commit via restaking.
Operators currently serve the purpose of (optionally) being able to register validators with mev-commit, if the relevant validator(s) are natively restaked with Eigenlayer and delegated to the operator. Future iterations of the mev-commit AVS may assign Operators further tasks, such as decentralized oracle attestations.
Operators currently registered with the mev-commit AVS can be found through the Eigenlayer dashboard:
* [Mainnet](https://app.eigenlayer.xyz/avs/0xbc77233855e3274e1903771675eb71e602d9dc2e)
## Prerequisites
To register with the mev-commit AVS, operators must first register their Ethereum account with the Eigenlayer core contracts.
You can follow Eigenlayer's instructions for operator account registration [here](https://docs.eigenlayer.xyz/eigenlayer/operator-guides/operator-installation).
You will need an `operator.yml` file to perform registration actions with the mev-commit AVS. This file is created as part of registering as an operator with the EigenLayer CLI, and does not need to be modified. See [Eigenlayer reference operator.yml](https://github.com/Layr-Labs/eigenlayer-cli/blob/master/pkg/operator/config/operator-config-example.yaml).
All interactions are enabled by the [operator CLI for the mev-commit AVS](https://github.com/primev/eigen-operator-cli). To get started, head over to the [releases page](https://github.com/primev/eigen-operator-cli/releases) and download a binary for your OS from the latest release. Alternatively you can build from source code included in the repo.
## Mev-commit AVS Registration
Mev-commit AVS registration is simple for Operators and only requires posting a signature over some AVS related metadata.
Registration signals to EigenLayer that you'd like to be an operator for the mev-commit AVS.
To register for the mev-commit AVS on mainnet use a command similar to:
```bash theme={null}
mev-commit-operator-cli register \
--operator-config $PATH_TO_OPERATOR_YML \
--avs-address "0xBc77233855e3274E1903771675Eb71E602D9DC2e" \
--boost-gas-params false \
--keystore-password $PASSWORD
```
The keystore password can be provided as an option, otherwise the CLI will prompt for it.
The registration command will query data from the AVS contracts and sign over a hash of the following:
1. Operator address
2. Mev-commit AVS address
3. Unique salt
4. 1 hour expiry
Then a registration transaction is sent on behalf of the operator account with the signed hash to be validated on-chain.
A full list of command options can be found by running `mev-commit-operator-cli register --help`.
## Deregistration
To deregister an operator from the mev-commit AVS, the operator account must first request deregistration:
```bash theme={null}
mev-commit-operator-cli request-deregistration [command options]
```
Then after waiting for the deregistration period to pass, the operator can deregister:
```bash theme={null}
mev-commit-operator-cli deregister [command options]
```
Both these commands accept the same options as the registration command.
# How do I fix the error: "failed to read msg: stream reset"?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/how-do-i-fix-the-error-failed-to-read-msg-stream-reset
Learn how to resolve the `failed to read msg: stream reset` error for provider nodes within the mev-commit network.
## Why does it happen?
If you're a provider node and you encounter the error `failed to read msg: stream reset`, it usually indicates a need for further action on your
part regarding staking and registration within the provider contract. This error often arises when the provider node has not been properly
staked or registered, which is a crucial step to fully integrate into the network and participate in the bidding and block-building processes.
## How to avoid this?
To resolve this issue, you should follow the detailed instructions in the [Provider Registration guide](/v1.2.x/get-started/providers/registering-a-provider). This step involves depositing
the required stake into the provider contract and completing the registration process to authenticate your node as a legitimate and active
participant within the mev-commit network. This staking and registration process not only addresses the immediate error but also enhances
the security and integrity of the network by ensuring that all active provider nodes have a vested interest in the network's success.
***
By following these steps and ensuring your node is correctly configured and registered, you can overcome the
`failed to read msg: stream reset` error and participate actively in the mev-commit ecosystem.
# How Do You Provide A Commitment for Execution?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/how-do-preconfs-work
Learn what providers do during an execution preconfirmation.
In [this guide](/v1.2.x/knowledge-base/what-happens-during-an-execution-preconf), we covered what goes into an execution preconf. Now, let's look at what preconf providers are doing behind the scenes to make this possible.
A provider receives bids through mev-commit and analyzes the bid parameters - transaction details, bid amount, and target L1 block number.
Favorable bids might include:
* Higher bid amounts
* Transactions that align with the provider's own block building strategies
* Bids for blocks in the near future (easier to plan for)
Based on the analysis, the provider decides whether to commit to including the transaction.
The provider's decision to commit generally depends on:
* Profitability of including the transaction
* Available block space
* Potential conflicts with other commitments
* The expected value of the opportunity as the timeslot nears its end
If decided positively, the provider generates a cryptographic commitment that includes the transaction and sends it back to the bidder's node.
Upon committing to a transaction, providers typically take the following steps:
1. They start a new simulation instance for the block they're building.
2. In this simulation, the committed transaction is treated as a fixed parameter, which allows them to ensure the committed transaction will execute as expected as they optimize the inclusion of additional transactions around the committed one.
Multiple providers may issue commitments for the same bid. Ideally, providers seek 100% coverage by getting commitments from all providers registered in mev-commit before issuing a guarantee to the bidder.
Block builders act as preconf providers. They receive bids and can issue commitments to include specific transactions in blocks they build.
As the block is proposed, the committed transactions are executed.
An oracle verifies that the committed transactions were indeed executed in the correct block.
Preconfirmations are about ensuring execution terms. By allowing searchers to specify their execution preferences, transactors can have the assurance that execution will conform to their stated parameters. It also makes value extraction more transparent and according to predefined goals.
# How Do Rewards and Slashing Work?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/how-do-rewards-and-slashing-work
A simplified overview of how mev-commit incentivizes honest behavior through rewards and slashing.
mev-commit uses a reward and slashing system to ensure providers and validators act honestly. Both must stake tokens to participate — honest behavior is rewarded, dishonest behavior is penalized.
## Validator Rewards
Validators earn more by opting in to mev-commit:
* **Higher block value** — Preconfirmation bids increase the total value of blocks proposed through mev-boost. Validators passively earn this extra value just by proposing blocks from mev-commit providers.
* **Points** — Opted-in validators earn [points](/v1.2.x/concepts/rewards-and-slashing/points) for each block proposed while opted in.
The more validators opt in, the more credible preconfirmations become, which increases their value — creating a positive feedback loop.
## Validator Slashing
The risk of slashing is very low for validators acting in good faith:
* **Missed blocks** — Not slashed. Network issues and chain reorgs are outside the validator's control.
* **Self-built blocks** — Not slashed. Rare edge case when relay value is too low.
* **Blocks from any builder or relay** — Not slashed. mev-commit no longer enforces a registered-provider-only block selection rule at the relay layer. Commitment accountability is enforced on the provider (builder) side; validators are not penalized for the builder their relay happened to select.
An [independent report by Chaos Labs](https://governance.ether.fi/t/primev-symbiotic-risk-analysis/) confirms the risk/reward profile is favorable for validators.
## Provider Rewards
Providers (block builders) earn from fulfilling commitments:
* **Fulfilled commitment** — Provider receives the bid amount minus a 2% protocol fee.
* **Neutral outcome** — If the provider didn't win the block, no action is taken. No reward, no penalty.
## Provider Slashing
Providers are penalized for breaking commitments they issued:
* **Broken commitment** — Provider is slashed the bid's specified slash amount, plus a 5% penalty fee. The slash amount goes to the bidder; the penalty goes to the protocol treasury.
* **Insufficient stake** — If the provider can't cover the full slash, the bidder is paid first, then the treasury receives whatever remains.
Decay is **not** applied to slash amounts — providers are slashed the full specified amount regardless of timing.
***
## Learn More
Complete technical documentation with diagrams.
The incentive case for validator participation.
Step-by-step opt-in instructions.
# How to Price A Bid
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/how-to-price-a-bid
Learn how to find the sweet spot for competitive bids.
Pricing a preconfirmation bid requires balancing several factors to optimize your chances of inclusion without overpaying. The formula developed by our research team takes into account:
* Time you're submitting the transaction, t
* Time at end of slot, T
* The amount of discretion based on how you prioritize your priority fee. Tweak it to understand how much to bid.
* The state contention factor. Factor in how much the extractable value is for the mev opportunity.
* The bidder margin, how much you think you can pocket if it goes through. Your target margin should be determined based on your risk tolerance and the potential value of the transaction.
**pFt \* M(t,T) + ασ(t,T) = Pbid**
| | |
| -- | ------------------- |
| P | price |
| pF | priority fee |
| t | current time |
| T | time at end of slot |
| σ | cost of state |
| α | 1 - bidder margin |
| M | multiplier |
Adjust your bid based on real-time commitments from providers. Start with conservative estimates and tweak as you learn the market.
The goal is to find the sweet spot where your bid is competitive enough for inclusion, but not higher than necessary.
# Introduction
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/introduction
A collection of answers to frequently asked questions, organized by topic.
## Fast Protocol
Overview of the incentive-aligned mev distribution system built on mev-commit.
How Fast Swaps lets you trade tokens on Ethereum while earning mev rewards.
The drop-in Ethereum RPC that enables preconfirmations for any wallet or dapp.
Sub-second USDC payments for AI agents on Ethereum mainnet.
Why operators join the mev-commit validator coalition.
## Preconfirmations
How mev-commit enforces execution guarantees and slashing for failed preconfirmed transactions.
End-to-end flow from a searcher's perspective — submitting bids and receiving commitments.
The provider side — analyzing bids, generating commitments, and verifying execution.
## Bidding & Economics
Learn about deposit amounts required for bidding and their significance.
Bid pricing formula factoring in priority fees, timing, and state contention.
Why deterministic ECDSA cryptography produces identical commitments for identical inputs.
Simplified overview of how mev-commit incentivizes honest behavior.
## Tooling & Setup
Foundry's role in smart contract development within the mev-commit ecosystem.
How cast simplifies blockchain interactions on the mev-commit chain.
Step-by-step guide to registering as an EigenLayer operator for the mev-commit AVS.
## Troubleshooting
Resolving the stream reset error for provider nodes in the mev-commit network.
# What are Fast Swaps?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/what-are-fast-swaps
How Fast Swaps lets you trade tokens on Ethereum while earning mev rewards.
Fast Swaps is a swap interface built on top of [Fast Protocol](/v1.2.x/knowledge-base/what-is-fast-protocol) that lets users trade tokens on Ethereum mainnet while earning mev rewards. Swaps are backed by mev-commit preconfirmations, routed through the [FAST RPC](/v1.2.x/get-started/fastrpc), and settled via the **FastSettlement** smart contracts on L1.
## How Swaps Work
The swap experience follows a familiar DEX flow — select an input token, an output token, and an amount. What happens next depends on the input token:
| Input Token | Execution |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| **ERC-20** (e.g. USDC, DAI) | You sign an off-chain EIP-712 intent. FAST RPC executes the swap via the FastSettlement contract — **no gas required from you**. |
| **ETH** | You submit the transaction directly from your wallet. |
### Permit2
ERC-20 swaps require a one-time [Permit2](https://docs.uniswap.org/contracts/permit2/overview) approval per input token. Once a token is approved, subsequent swaps with that token only require a signature. If Permit2 has already been approved for a given token on another application (such as Uniswap), no additional approval is needed.
## Fast Miles
Users earn Fast Miles proportional to the mev their swaps generate through Fast Protocol. Miles are planned to be tokenized in the near future. Early users can also earn bonus miles through one-time tasks and referrals available in the app.
Start swapping and earning miles.
Architecture, contracts, and EIP-712 signing details.
# What Happens During An Execution Preconfirmation?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/what-happens-during-an-execution-preconf
Learn about what happens behind the scenes during an execution preconfirmation.
Let's say you're a searcher or solver looking to execute a complex mev strategy on Ethereum involving multiple DeFi protocols.
## Problem
Currently, when you send a transaction bundle:
* You define your maximum slippage tolerance for each trade (eg. 1%)
* You broadcast your bundle to one or more block builders.
* You wait about 12 seconds (1 block) or more for it to be included.
During this time, you have no guarantee that:
* Your entire bundle will be included in the next block.
* The transactions won't revert due to changing conditions.
* Other mev actors won't push your transaction toward your slippage limit
As a result of these factors:
* You might miss your target prices.
* You might pay gas for failed transactions.
* Your bundle may not get included, which is especially problematic for single-shot opportunities in DeFi. Some arbitrage opportunities only exist for a very brief window, and missing this window means losing the entire opportunity.
## Using an Execution Preconfirmation
Instead of blindly sending your transaction, you can use an execution preconf. Here's how:
* Follow the [Quickstart guide](/v1.2.x/get-started/quickstart) to set up your mev-commit bidder node and fund your account.
* Identify your mev opportunity. Craft your bundle and send the signed transaction to block builders as per usual.
* Create and submit a bid for the transaction from your mev-commit bidder node (following the [bid structure here](/v1.2.x/concepts/bids/bid-structure)), supplying the hash of the transaction you just sent.
* When you submit a bid, it goes to multiple providers by default.
* If a provider accepts your bid, it will generate a cryptographic commitment to execute your transaction. These are typically sent in milliseconds.
* Your bidder node automatically verifies each commitment it receives.
* Aim to receive commitments from all registered providers. If you don’t, consider increasing your bid amount to make it more attractive to all providers.
* Your transaction is now guaranteed to be executed as per the preconf terms for that provider (or else that provider will be slashed).
* The transaction will execute in the specified block.
**Benefits**
* Real-time confirmation of future execution, translating to reduced risk for transacting
* Ability to secure a specific execution slot at a better price
* Even in the event of being frontrun, your transaction parameters will remain within your defined slippage, or else not execute
* Instant transaction UX for searchers
* Predictable gas costs
By using a preconf, you've eliminated the uncertainty of the 12-second wait, secured your execution parameters, and protected yourself against potential mev exploitation, all in real-time.
Unlike simple inclusion preconfirmations (which might still result in reverted transactions), execution preconfs ensure your bundle executes as intended. This leaderless, multi-provider approach offers superior guarantees that improve your chances to capture time-sensitive mev opportunities.
# What is the Deposit Amount?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/what-is-deposit-amount
Learn about deposit amounts required for bidding and their significance.
A deposit amount is made by bidders before participating in a bidding process.
This amount acts as a financial assurance and enables the bidder to place multiple bids.
It's designed to be larger than individual bid amounts to cover the potential volume of bids a bidder might want to make.
For instance, if a bid is set at 100 gwei, a bidder might need to deposit an amount like 1000 gwei to ensure they can
place several bids without needing to make additional deposits for each one. This system ensures that bidders are serious
and have the financial backing to support their bids, while also allowing providers to manage and monitor bidding activities efficiently.
For more details on deposit mechanics and how to manage deposits, see the [Bidder Deposit documentation](/v1.2.x/concepts/bids/bidder-deposit).
# What is Execution Preconfirmations?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/what-is-execution-preconfirmations
The mev-commit system enforces execution guarantees by default.
This means that transactions must be executed successfully to ensure providers aren't slashed.
We allow users to specify which transactions are critical and must succeed, and which can revert.
This is important because providers, in most cases, can provide inclusion guarantees with little cost.
For example, if a block builder has gas left in the block, they can trivially include any preconfirmed transaction at the bottom of the block.
## Related
Step-by-step walkthrough from a searcher's perspective.
The provider side of preconfirmations.
# What is Fast Protocol?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/what-is-fast-protocol
An overview of Fast Protocol, the incentive-aligned mev distribution system built on mev-commit.
Fast Protocol is an order flow auction (OFA) system built on top of [mev-commit](/v1.2.x/concepts/mev-commit-intro/what-is-mev-commit) that captures, routes, and redistributes mev across all participants in a transparent and incentive-aligned way.
## How It Works
When users send transactions through [FAST RPC](/v1.2.x/get-started/fastrpc), the system:
1. **Auctions and simulates backruns** for each transaction
2. **Realizes mev** through backrun bundles
3. **Secures commitments** from builders via mev-commit
4. **Distributes value** — validators receive a share based on opt-in status, and the remainder flows into mev distribution contracts that fund user rewards
## Who Benefits
* **Users** receive top-of-market mev refunds — at least 90% of the mev their transactions generate, and in mev-rich periods even more than 100%
* **Validators** earn strictly more when opting in, and materially more than in other OFA systems
* **Builders** maintain sustainable margins while delivering transactions
* **The protocol** becomes more valuable as usage increases, creating a positive feedback loop
## Why It's Unique
The system is designed so that no competing OFA can sustainably provide higher user mev refunds. If Fast Protocol offered less than 90% user refunds, users would switch to alternatives. If a competitor tried offering more, its builders or validators would become unprofitable. Fast Protocol optimally balances incentives so that all participants remain profitable.
Full economic model, fee parameters, and equilibrium analysis.
The swap interface built on Fast Protocol.
# What is FAST RPC?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/what-is-fast-rpc
A drop-in Ethereum RPC that enables preconfirmations for any wallet or dapp.
FAST RPC is a drop-in replacement for standard Ethereum RPC endpoints that enables preconfirmations. It works like a normal Ethereum node — you send transactions via `eth_sendRawTransaction` and check receipts via `eth_getTransactionReceipt` — but under the hood it coordinates with mev-commit's decentralized network of block builders to preconfirm your transactions.
## How It Works
1. You configure your wallet or dapp to point at `https://fastrpc.mev-commit.xyz` instead of a standard RPC like Infura or Alchemy.
2. When you send a transaction, the RPC encrypts it and sends bids to block builders in the mev-commit network.
3. Once all registered builders issue a commitment and the next block proposer is opted in, the transaction is preconfirmed.
4. `eth_getTransactionReceipt` returns a receipt immediately — no waiting 12+ seconds for the next block.
## Who Is It For?
* **Wallets** — Add the RPC as a custom network and get instant transaction confirmation UX. No deposit needed during the promotional period — gas is fully sponsored.
* **dApps** — Integrate preconfirmations with minimal code changes. Deposit ETH into a gas tank, then use standard RPC methods as usual.
* **Developers** — Access additional methods like `mevcommit_getTransactionCommitments` and `mevcommit_optedInBlock` for advanced preconfirmation logic.
## Key Benefits
* **Sub-second confirmation UX** — Transactions are preconfirmed in \~100-200ms, compared to 12+ seconds on standard Ethereum.
* **Drop-in compatibility** — Works with existing wallets and tools. No protocol changes or special SDKs required.
* **Gasless for wallets** — During the promotional period, the RPC sponsors transaction fees for wallet users.
* **mev redistribution** — Value captured through preconfirmations flows back to users and validators, not extractors.
***
## Learn More
Step-by-step instructions for wallets and dapps.
Full documentation of all supported RPC methods.
How FAST RPC fits into the broader Fast Protocol ecosystem.
The consumer-facing product built on FAST RPC.
# What is Fastx402?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/what-is-fastx402
An x402 payment facilitator for AI agents — sub-second USDC settlement on Ethereum mainnet.
Fastx402 is an [x402](https://www.x402.org/) payment facilitator that lets AI agents and applications pay for resources on Ethereum mainnet using USDC. It achieves sub-second settlement through [FAST RPC](/v1.2.x/knowledge-base/what-is-fast-rpc) preconfirmations.
## The Problem
Ethereum's 12+ second finality makes it unsuitable for real-time agent payments. An AI agent that needs to pay for an API call can't wait 12 seconds for confirmation — it needs a response in milliseconds. Existing x402 facilitators solve this by operating on Base or Solana, but that means agents can't access Ethereum's deep USDC liquidity.
## How It Works
Fastx402 uses USDC's native EIP-3009 `transferWithAuthorization` function for gasless, signature-based payments:
1. An agent encounters a `402 Payment Required` response from a resource server.
2. The agent signs an EIP-712 authorization message — no on-chain transaction needed.
3. The resource server forwards the signed payment to Fastx402's `/settle` endpoint.
4. Fastx402 verifies the signature and submits the transaction via FAST RPC.
5. FAST RPC preconfirms the transaction in \~100-200ms.
6. The resource server receives confirmation and grants access.
## Key Features
* **Sub-second settlement** — \~1.2 seconds end-to-end via FAST RPC preconfirmations (vs 12+ seconds on standard Ethereum).
* **Zero gas for agents** — Agents only need USDC. A relay wallet submits the on-chain transaction and covers gas.
* **Zero fees** — No facilitator fee during the promotional period.
* **Mainnet liquidity** — Access Ethereum's largest stablecoin issuance and DeFi ecosystem directly.
* **x402 compatible** — Drop-in replacement for any x402 facilitator. Works with the standard x402 flow.
***
## Learn More
Full API reference, EIP-3009 signing guide, and error codes.
The preconfirmation RPC that powers Fastx402 settlement.
# What is Foundry?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/what-is-foundry
Discover what Foundry is and its role in smart contract development and interactions within the mev-commit ecosystem.
## What is Foundry?
Foundry is a comprehensive toolkit designed to facilitate smart contract development and interaction,
playing a pivotal role in the mev-commit ecosystem. It offers a robust framework for developers to deploy,
test, and interact with smart contracts efficiently. This suite of tools is integral for the seamless development
lifecycle of smart contracts, from inception to deployment and beyond.
## Usage with mev-commit
The utility of Foundry extends to its ability to streamline the development process, providing developers with
the necessary tools to write, test, and deploy smart contracts with ease and precision. Its extensive use in
the mev-commit contracts underscores its reliability and effectiveness in managing complex smart contract
interactions and ensuring that contracts perform as intended under various conditions.
***
In summary, Foundry stands out as an essential toolset within the mev-commit environment, empowering
developers with the capabilities to bring smart contract projects to fruition with a high degree of efficiency and confidence.
# Why do I receive the same commitment when resending a bid?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/why-do-i-receive-the-same-commitment-when-resending-a-bid
Understand why resending a bid in the mev-commit ecosystem results in receiving the same commitment.
When you resend a bid within the mev-commit ecosystem, receiving the same commitment back is a direct result of
the deterministic nature of the underlying cryptographic mechanisms, specifically hashes and the Elliptic Curve
Digital Signature Algorithm (ECDSA). These mechanisms ensure that for a given set of inputs, the output will always be the same.
This means that if the bid's payload (the data contained within the bid) and the bidder's private key do not
change between submissions, and the provider's private key remains constant, the resulting commitment will be
identical for each submission of the bid. This deterministic behavior is crucial for maintaining consistency
and integrity in the bidding process, ensuring that each bid is uniquely tied to its specific data and the identities of the involved parties.
## Why is this needed?
This feature of cryptographic schemes like ECDSA provides a layer of security and predictability, ensuring
that bids cannot be tampered with or falsely represented without the private keys. It also simplifies the
process of verifying and accepting bids within the mev-commit framework, as each commitment
reliably represents its associated bid, regardless of the number of submissions.
# Why is cast necessary for mev-commit chain interactions?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/why-is-cast-necessary-for-mev-commit-chain-interactions
## What is cast?
The cli tool `cast` is used in the mev-commit ecosystem, designed to simplify user interactions with the blockchain.
It serves various purposes, from executing transactions and querying data to deploying smart contracts, making blockchain interactions more accessible and user-friendly.
## EVM Compatibility
While `cast` is highlighted for its ease of use and efficiency, the mev-commit chain's compatibility with the
Ethereum Virtual Machine (EVM) broadens the scope for user interaction. This EVM compatibility means users are
not limited to `cast`; they can leverage any EVM-compatible tools for their blockchain activities.
To use these tools, it's essential to configure the RPC URL appropriately to ensure connectivity with the mev-commit chain.
This flexibility underscores the mev-commit chain's user-centric approach, allowing for a choice in interaction methods
to suit diverse user preferences and technical backgrounds. Whether through `cast` or other EVM-compatible tools, the key
is seamless and effective interaction with the mev-commit chain.
# Why Should Validators Opt In?
Source: https://docs.primev.xyz/v1.2.x/knowledge-base/why-should-validators-opt-in
Opt-in is coalition membership: one signal across many keys, policy work, and a later fee that funds Ethereum AI research.
Opt-in adds your L1 BLS keys to the **mev-commit validator coalition**. That is the reason to join. It is not extra block revenue from a live commitment market.
## What you join
The coalition is a validator union that is mev-forward and innovation-forward. Hub-true keys produce **one signal** for a large number of validators. That roster is what the coalition uses when it:
* Frames policy with the Ethereum Foundation and Ethereum working groups, aimed at validator interest and durable yield
* Reviews and greenlights innovation as the protocol evolves
* Speaks as a set of keys, not as one operator
Keep your existing mev-boost relay set. There is no sidecar and no relay configuration step.
## What you do not get today
You do not earn extra producer rewards from mev-commit bids today. Do not treat Hub-true as a claim on a running preconf network. The [RewardDistributor](/v1.2.x/get-started/validators/rewards) on Hoodi is test plumbing, not mainnet yield.
## Fees and AI research (not enabled)
**No fees are enabled at this stage.** There is no fee switch without your approval. Members must actively approve any coalition fee before it starts.
When a fee is approved and enabled, it funds **AI research** on Ethereum clients, validators, staking, and yield policy. That work can fund researchers directly, join funding rounds, and run R\&D in house. The intended path is a small share of Ethereum validator yield (about 1%).
The entity can be a **nonprofit**.
**Founding members** are granted tokens in proportion to their contributions, sized so token value matches or exceeds fees they contribute. The token is the right to **create proposals** for holders to accept. Token grants are not live.
## How to opt in
Use the [mev-commit-opt-in skill](/v1.2.x/get-started/validators/agentic-opt-in) from [primev.xyz/ai](https://primev.xyz/ai). See the [Validator Guide](/v1.2.x/get-started/validators/validator-guide) for requirements, or the [EigenLayer](/v1.2.x/get-started/validators/eigenlayer), [Symbiotic](/v1.2.x/get-started/validators/symbiotic), and [vanilla](/v1.2.x/get-started/validators/vanilla) pages for contract details. The old validator dashboard is deprecated.