Showing preview only (631K chars total). Download the full file or copy to clipboard to get everything.
Repository: flashbots/flashbots-docs
Branch: main
Commit: b5fc2fea5931
Files: 163
Total size: 584.7 KB
Directory structure:
gitextract_k2vcmtga/
├── .cspell.json
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .github/
│ ├── CODEOWNERS
│ ├── dependabot.yml
│ └── workflows/
│ ├── algolia.yml.txt
│ ├── broken-link-check-cron.yml.txt
│ └── pr-tests.yml
├── .gitignore
├── .lintstagedrc.json
├── .nvmrc
├── .prettierignore
├── .prettierrc.json
├── .stylelintignore
├── .stylelintrc.js
├── .vscode/
│ ├── extensions.json
│ └── settings.json
├── LICENSE
├── LICENSE-docs
├── README.md
├── babel.config.js
├── docs/
│ ├── brand-assets.mdx
│ ├── cheatsheet.mdx
│ ├── code-of-conduct.mdx
│ ├── community-tools.mdx
│ ├── contribution-guide.mdx
│ ├── flashbots-auction/
│ │ ├── advanced/
│ │ │ ├── bundle-cancellations.mdx
│ │ │ ├── bundle-pricing.md
│ │ │ ├── co-locate.mdx
│ │ │ ├── coinbase-payment.mdx
│ │ │ ├── eip1559.mdx
│ │ │ ├── gas-fee-refunds.md
│ │ │ ├── multiplexing.mdx
│ │ │ ├── reputation.md
│ │ │ ├── rpc-endpoint.mdx
│ │ │ ├── testnets.mdx
│ │ │ ├── troubleshooting.mdx
│ │ │ └── understanding-bundles.mdx
│ │ ├── example-searchers/
│ │ │ ├── searcher-minter.md
│ │ │ ├── searcher-sponsored-tx.md
│ │ │ ├── simple-arbitrage-bot.md
│ │ │ └── synthetix-searcher.md
│ │ ├── faq.md
│ │ ├── libraries/
│ │ │ ├── alchemyprovider.md
│ │ │ ├── bundle-relay.md
│ │ │ ├── ethers-js-provider.md
│ │ │ ├── golang.md
│ │ │ ├── mev-share-clients.md
│ │ │ ├── rust-provider.md
│ │ │ └── web3py-provider.md
│ │ ├── other-resources.md
│ │ ├── overview.mdx
│ │ └── quick-start.mdx
│ ├── flashbots-mev-boost/
│ │ ├── FAQ.md
│ │ ├── architecture-overview/
│ │ │ ├── block-proposal.md
│ │ │ ├── risks.md
│ │ │ └── specifications.md
│ │ ├── block-builders.md
│ │ ├── block-proposers.md
│ │ ├── contributing.md
│ │ ├── getting-started/
│ │ │ ├── installation.md
│ │ │ ├── system-requirements.md
│ │ │ └── usage.md
│ │ ├── glossary.md
│ │ ├── introduction.md
│ │ ├── relay.md
│ │ ├── resources.md
│ │ ├── security.md
│ │ └── troubleshooting.md
│ ├── flashbots-mev-share/
│ │ ├── for-users.mdx
│ │ ├── introduction.mdx
│ │ ├── orderflow-providers.mdx
│ │ ├── release-notes/
│ │ │ ├── 2023-03.mdx
│ │ │ ├── 2023-06.mdx
│ │ │ ├── 2023-07.mdx
│ │ │ └── 2023-09.mdx
│ │ └── searchers/
│ │ ├── debugging.mdx
│ │ ├── event-stream.mdx
│ │ ├── getting-started.mdx
│ │ ├── ratelimiting.mdx
│ │ ├── sending-bundles.mdx
│ │ ├── tutorials/
│ │ │ ├── flash-loan-arbitrage/
│ │ │ │ ├── bot.mdx
│ │ │ │ ├── flash-loan-basics.mdx
│ │ │ │ ├── introduction.mdx
│ │ │ │ └── simple-blind-arbitrage.mdx
│ │ │ └── limit-order/
│ │ │ ├── debugging.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── more-resources.mdx
│ │ │ ├── sending-bundles.mdx
│ │ │ ├── setup.mdx
│ │ │ └── using-events.mdx
│ │ └── understanding-bundles.mdx
│ ├── flashbots-protect/
│ │ ├── additional-documentation/
│ │ │ ├── eth-sendPrivateTransaction.mdx
│ │ │ └── status-api.md
│ │ ├── cancellations.md
│ │ ├── gas-fee-refunds.md
│ │ ├── large-transactions.md
│ │ ├── mev-refunds.mdx
│ │ ├── nonce-management.mdx
│ │ ├── overview.mdx
│ │ ├── quick-start.mdx
│ │ ├── ratelimiting.mdx
│ │ ├── settings-guide.md
│ │ └── stuck_transactions.md
│ ├── guide-send-tx-bundle.mdx
│ ├── joining-flashbots.mdx
│ ├── new-to-mev.mdx
│ ├── policies/
│ │ ├── privacy.mdx
│ │ ├── prohibited-use-policy.mdx
│ │ └── terms-of-service.mdx
│ ├── sidebars.js
│ ├── specs/
│ │ ├── README.md
│ │ ├── contracts/
│ │ │ └── abi/
│ │ │ ├── _flashLoanArb.mdx
│ │ │ └── _uniswapV2Factory.mdx
│ │ ├── mev-share/
│ │ │ ├── HintsTable.jsx
│ │ │ ├── _builders.mdx
│ │ │ ├── _mev_sendBundle.mdx
│ │ │ ├── _mev_simBundle.mdx
│ │ │ ├── _streamEvent.mdx
│ │ │ ├── blurbs/
│ │ │ │ ├── _builderInheritance.mdx
│ │ │ │ ├── _whatsMevShareAdvanced.mdx
│ │ │ │ ├── _whatsMevShareBasic.mdx
│ │ │ │ └── _whatsaMEVShareNode.mdx
│ │ │ └── hints.json
│ │ └── protect-rpc/
│ │ └── _hints.mdx
│ ├── welcome.mdx
│ └── whitehat.mdx
├── docusaurus.config.js
├── package.json
├── project-words.txt
├── src/
│ ├── components/
│ │ ├── Banner/
│ │ │ ├── Banner.custom.module.scss
│ │ │ ├── Banner.module.scss
│ │ │ ├── Banner.tsx
│ │ │ ├── _base.scss
│ │ │ └── banner.config.tsx
│ │ ├── BrandAssets/
│ │ │ ├── AssetCard.tsx
│ │ │ ├── Download.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.module.css
│ │ ├── Checkbox/
│ │ │ └── index.tsx
│ │ ├── Grid/
│ │ │ ├── Grid.tsx
│ │ │ └── styles.module.css
│ │ ├── GridBlock/
│ │ │ ├── GridBlock.tsx
│ │ │ └── styles.module.css
│ │ ├── ProtectButton/
│ │ │ └── index.tsx
│ │ ├── RemoteCodeBlock/
│ │ │ └── index.tsx
│ │ ├── SimpleDropdown/
│ │ │ ├── index.tsx
│ │ │ └── styles.module.css
│ │ └── mev-share/
│ │ ├── buildersTable.tsx
│ │ └── useSupportedBuilders.tsx
│ ├── css/
│ │ └── custom.css
│ ├── pages/
│ │ └── styles.module.css
│ ├── theme/
│ │ ├── Layout/
│ │ │ └── index.tsx
│ │ └── Navbar/
│ │ ├── index.js
│ │ └── navbar.module.css
│ └── types/
│ └── global.d.ts
├── static/
│ ├── .nojekyll
│ ├── img/
│ │ └── site.webmanifest
│ └── robots.txt
├── tailwind.config.js
├── tsconfig.json
└── vercel.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .cspell.json
================================================
{
"version": "0.2",
"gitignoreRoot": ".",
"useGitignore": true,
"dictionaries": [
"css",
"html",
"fonts",
"typescript",
"softwareTerms",
"companies",
"project-words"
],
"dictionaryDefinitions": [
{
"name": "project-words",
"path": "./project-words.txt",
"noSuggest": false
}
],
"ignorePaths": [
"package.json",
"yarn.lock",
"project-words.txt",
"*.gitignore"
],
"ignoreRegExpList": [
"Email",
"Urls",
"#[\\w-]*"
]
}
================================================
FILE: .editorconfig
================================================
# http://editorconfig.org
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
max_line_length = 80
trim_trailing_whitespace = true
[*.md]
insert_final_newline = false
# 2 trailing whitespace indicate a new line in markdown
trim_trailing_whitespace = false
================================================
FILE: .eslintignore
================================================
node_modules
.yarn
.history
build
coverage
jest.config.js
jest.transform.js
jest/vendor
================================================
FILE: .eslintrc.js
================================================
/**
* Copyright (c) Flashbots Ltd. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
const OFF = 0;
const WARNING = 1;
const ERROR = 2;
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
project: true,
tsconfigRootDir: __dirname,
},
plugins: ['header'],
extends: [
'eslint:recommended',
'airbnb',
'airbnb/hooks',
'airbnb-typescript',
'plugin:@docusaurus/recommended',
'plugin:react/jsx-runtime',
'plugin:mdx/recommended',
'plugin:import/recommended',
'prettier',
],
rules: {
camelcase: WARNING,
'max-len': [
WARNING,
{
code: Infinity, // Code width is already enforced by Prettier
tabWidth: 2,
comments: 80,
ignoreUrls: true,
ignorePattern: '(eslint-disable|@)',
},
],
'header/header': [
ERROR,
'block',
[
'*',
' * Copyright (c) Flashbots Ltd. and its affiliates.',
' *',
' * This source code is licensed under the MIT license found in the',
' * LICENSE file in the root directory of this source tree.',
' ',
],
],
'import/no-unresolved': [ERROR, {ignore: ['^@docusaurus', '@theme']}],
'import/no-extraneous-dependencies': [ERROR, {includeTypes: true}],
'react/require-default-props': [
WARNING,
{
functions: 'defaultArguments',
},
],
'react/jsx-filename-extension': [
WARNING,
{extensions: ['.js', '.jsx', '.ts', '.tsx']},
],
"react/jsx-props-no-spreading": OFF,
},
settings: {
'import/parsers': {
'@typescript-eslint/parser': ['.ts', '.tsx'],
},
'import/resolver': {
typescript: {},
},
// optional, if you want to lint code blocks at the same time
'mdx/code-blocks': true,
// optional, if you want to disable language mapper, set it to `false`
// if you want to override the default language mapper inside, you can
// provide your own
'mdx/language-mapper': {
typescript: '@typescript-eslint/parser',
ts: '@typescript-eslint/parser',
javascript: 'espree',
js: 'espree',
},
},
overrides: [
{
files: ['*.mdx'],
extends: ['plugin:mdx/overrides'],
},
],
};
================================================
FILE: .github/CODEOWNERS
================================================
# These owners will be the default owners for everything in
# the repo. Unless a later match takes precedence,
# they will be requested for review when someone opens a pull request.
* @odysseus0 @sketsdever @zeroXbrock @sukoneck
================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "yarn" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"
groups:
dev-dependencies:
patterns:
- "*"
================================================
FILE: .github/workflows/algolia.yml.txt
================================================
name: Vercel -> Algolia Crawler (push on main)
on:
push:
branches: [ main ]
jobs:
algolia_recrawl:
name: Algolia Recrawl
runs-on: ubuntu-latest
steps:
# checkout this repo
- name: Checkout Repo
uses: actions/checkout@v2
- name: Vercel-MAIN => Algolia crawler creation and recrawl on preview (Push on Main branch)
uses: algolia/algoliasearch-crawler-github-actions@v1
id: crawler_push
with:
crawler-user-id: ${{ secrets.ALGOLIA_CRAWLER_USER_ID }}
crawler-api-key: ${{ secrets.ALGOLIA_CRAWLER_API_KEY }}
algolia-app-id: ${{ secrets.ALGOLIA_APP_ID }}
algolia-api-key: ${{ secrets.ALGOLIA_SEARCH_API_KEY }}
crawler-name: 'flashbots'
site-url: 'https://docs.flashbots.net/'
override-config: true
================================================
FILE: .github/workflows/broken-link-check-cron.yml.txt
================================================
name: Check for broken links (cron)
on:
workflow_dispatch:
schedule:
- cron: '0 10 * * *'
jobs:
check-for-broken-links:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v1
with:
node-version: '16.x'
- run: npm install -g linkinator
- run: linkinator https://docs.flashbots.net --recurse --timeout 3000 --concurrency 10 --retry -s https://dune.com/ChainsightAnalytics,'https://.*etherscan.io/tx.*','https://twitter.com.*','https://.*imgur.com.*'
================================================
FILE: .github/workflows/pr-tests.yml
================================================
name: PR Tests
on:
push:
branches:
- main
pull_request:
jobs:
build-and-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions/setup-node@v1
with:
node-version: "22.x"
- name: Test build
env:
TARGET_URL: "https://docs.flashbots.net"
BASE_URL: "/"
ALGOLIA_APP_ID: "example"
ALGOLIA_SEARCH_API_KEY: "example"
ALGOLIA_INDEX_NAME: "example"
run: |
yarn install --frozen-lockfile
yarn build
# - name: Check for broken links
# run: |
# cd build
# npm install -g linkinator
# linkinator "**/*.html" --recurse --timeout 3000 --concurrency 10 --retry -s https://dune.com/ChainsightAnalytics,'https://.*etherscan.io/.*','https://twitter.com.*','https://.*imgur.com.*'
================================================
FILE: .gitignore
================================================
# Dependencies
/node_modules
# Production
/build
# Generated files
.docusaurus
.cache-loader
# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
node_modules
.env
.vercel
.env*.local
.idea/
.eslintcache
================================================
FILE: .lintstagedrc.json
================================================
{
"*.{js,jsx,ts,tsx,mjs}": ["eslint --fix"],
"*.css": ["stylelint --allow-empty-input --fix"],
"*": [
"prettier --ignore-unknown --write",
"cspell --no-must-find-files --no-progress"
]
}
================================================
FILE: .nvmrc
================================================
v22
================================================
FILE: .prettierignore
================================================
# Dependencies
/node_modules
# Production
/build
# Generated files
.docusaurus
.cache-loader
# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
node_modules
.env
.vercel
================================================
FILE: .prettierrc.json
================================================
{
"arrowParens": "always",
"bracketSpacing": false,
"bracketSameLine": true,
"printWidth": 80,
"proseWrap": "never",
"singleQuote": true,
"trailingComma": "all",
"plugins": ["prettier-plugin-tailwindcss"]
}
================================================
FILE: .stylelintignore
================================================
# Stylelint runs on everything by default; we only lint CSS files.
*
!*/
!*.css
================================================
FILE: .stylelintrc.js
================================================
module.exports = {
extends: ['stylelint-config-standard', 'stylelint-config-prettier'],
rules: {
'at-rule-no-unknown': [
true,
{
ignoreAtRules: [
'tailwind',
'apply',
'variants',
'responsive',
'screen',
],
},
],
'declaration-block-trailing-semicolon': null,
'no-descending-specificity': null,
},
};
================================================
FILE: .vscode/extensions.json
================================================
{
// See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
"recommendations": [
"streetsidesoftware.code-spell-checker",
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"stylelint.vscode-stylelint",
"EditorConfig.EditorConfig",
"Gruntfuggly.todo-tree",
"github.vscode-github-actions",
"GitHub.vscode-pull-request-github",
"GitHub.remotehub",
"eamodio.gitlens",
"unifiedjs.vscode-mdx",
"christian-kohler.npm-intellisense",
"christian-kohler.path-intellisense",
"bradlc.vscode-tailwindcss",
],
"unwantedRecommendations": []
}
================================================
FILE: .vscode/settings.json
================================================
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"css.validate": false,
"scss.validate": false,
"javascript.validate.enable": false,
"typescript.validate.enable": true,
"javascript.suggest.paths": false,
"typescript.suggest.paths": false
}
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) Flashbots Ltd. and its affiliates.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: LICENSE-docs
================================================
Attribution 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution 4.0 International Public License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution 4.0 International Public License ("Public License"). To the
extent this Public License may be interpreted as a contract, You are
granted the Licensed Rights in consideration of Your acceptance of
these terms and conditions, and the Licensor grants You such rights in
consideration of benefits the Licensor receives from making the
Licensed Material available under these terms and conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
d. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
e. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
f. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
g. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
h. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
i. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
j. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
k. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part; and
b. produce, reproduce, and Share Adapted Material.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
1. If You Share the Licensed Material (including in modified
form), You must:
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
4. If You Share Adapted Material You produce, the Adapter's
License You apply must not prevent recipients of the Adapted
Material from complying with this Public License.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material; and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
=======================================================================
Creative Commons is not a party to its public licenses.
Notwithstanding, Creative Commons may elect to apply one of its public
licenses to material it publishes and in those instances will be
considered the “Licensor.” The text of the Creative Commons public
licenses is dedicated to the public domain under the CC0 Public Domain
Dedication. Except for the limited purpose of indicating that material
is shared under a Creative Commons public license or as otherwise
permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the public
licenses.
Creative Commons may be contacted at creativecommons.org.
================================================
FILE: README.md
================================================
# Website
This website is built using [Docusaurus 2](https://v2.docusaurus.io/), a modern static website generator.
## Installation
Use Node.js v22.18+
Note: if you want to install the node packages from within a Docker container (recommended for security), then you can start it like this:
```bash
docker run -p 3000:3000 --rm -it -w /mnt -v $(pwd):/mnt node:22.18.0 /bin/bash
```
First create a copy of the environment file `.env.template` in the root of the codebase and rename it to `.env`
Then run the following:
```console
yarn install
```
## Local Development
First create a local `.env` file to fill in env variable placeholders necessary for setting up the development. Note that these are merely placeholders.
```sh
cp .env.template .env
```
Then run the below command to start a local development server (and may open up a browser window). Some changes are reflected live without having to restart the server.
```console
yarn start
```
You can open the local docs at [http://localhost:3000/](http://localhost:3000/)
## Build
```console
yarn build
```
This command generates static content into the `build` directory and can be served using any static contents hosting service.
## Deployment
Create a PR and once merged, Github actions automatically deploy it.
The docs use Vercel for hosting, and deployment is done by Vercel on any merge into the master branch.
================================================
FILE: babel.config.js
================================================
module.exports = {
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
};
================================================
FILE: docs/brand-assets.mdx
================================================
---
title: Brand Assets
---
import BrandAssets from "@site/src/components/BrandAssets/index.tsx";
<BrandAssets />
================================================
FILE: docs/cheatsheet.mdx
================================================
---
title: Docs Cheatsheet
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import TOCInline from '@theme/TOCInline'
On this page you'll find every single markdown & mdx component used in our docs
## Page Title & Data
For the title of the page, and the name of the tab, at the very top of your file, just add this code snippet to the top.
Any thing inbetween the `---` tags will be used for the meta data of the page
```md
---
title: Cheatsheet
id: page-id-when-linking-to-it
---
```
For Heading 1 specifically, you should set the page title in the meta data.
[Docusaurus source docs](https://docusaurus.io/docs/next/markdown-features/headings)
```md
# Heading 1
```
## Heading 2
```md
## Heading 2
```
### Heading 3
```md
### Heading 3
```
#### Heading 4
```md
#### Heading 4
```
##### Heading 5
```md
##### Heading 5
```
###### Heading 6
```md
###### Heading 6
```
## Line breaks
```md
Some text
With a line between them
```
## Lists
### Unordered lists
- Unordered list 1
- Unordered list 2
- Unordered list 3
```md
- Unordered list 1
- Unordered list 2
- Unordered list 3
```
### Unordered lists
You don't actually have to do the numbers, as long as there is a number at the start it'll count incrementally starting with the first number in the list
1. Ordererd list 1
69. Ordererd list 2
42. Ordererd list 3
```md
1. Ordererd list 1
69. Ordererd list 2
42. Ordererd list 3
```
### Nested & Mixed lists
1. Ordererd list
1. Sable
2. Ferret
- Cat rat
- Fox weasel
8. Lamp
69. Ordererd list
- Grape
- Potatoes
- Chips
1. Crisps
1. Fondant
1. Frites
- Lemons
1. Three cats
1. Pasta
9. Ragu
42. Ordererd list
```md
1. Ordererd list
1. Sable
2. Ferret
- Cat rat
- Fox weasel
8. Lamp
69. Ordererd list
- Grape
- Potatoes
- Chips
1. Crisps
1. Fondant
1. Frites
- Lemons
1. Three cats
1. Pasta
9. Ragu
42. Ordererd list
```
## Text styling
_Italic/Emphasize_
```md
_Italic/Emphasize_
```
**Strong/Bold**
```md
**Strong/Bold**
```
**_Italic & Bold_**
```md
**_Italic & Bold_**
```
## Codeblocks
So you basically define a section using the ` ``` ` anything between two lines that contain these 3 back quotes will be in the block
If you want specific formatting for a certain language like for example Javascript here:
```js
const threeCats = ["cat", "cat", "cat"]
```
```md
Mind the indentation here, code blocks in code blocks isn't normal usage
```js
const threeCats = ["cat", "cat", "cat"]
```
```
Theres a lot of different formattings to use, `md`, `js`, `ts`, etc. The package used is [Prism react render](https://github.com/FormidableLabs/prism-react-renderer)
## Quotes
> Quoted text.
> > Quoted quote.
> Quoted text.
> > Quoted quote.
> > > Quoted quote.
> Quoted text.
> > Quoted quote.
> > > Quoted quote.
> > > > Quoted quote.
```md
> Quoted text.
> > Quoted quote.
> Quoted text.
> > Quoted quote.
> > > Quoted quote.
> Quoted text.
> > Quoted quote.
> > > Quoted quote.
> > > > Quoted quote.
```
## Admonitions
These are nifty notification blocks [from Docusaurus](https://docusaurus.io/docs/next/markdown-features/admonitions)
:::note
The content and title *can* include markdown.
:::
:::note Your Title
The content and title *can* include markdown.
:::
:::tip You can specify an optional title
Heads up! Here's a pro-tip.
:::
:::info
Useful information.
:::
:::caution
Warning! You better pay attention!
:::
:::danger
Danger danger, mayday!
:::
```
:::note
The content and title *can* include markdown.
:::
:::note Your Title
The content and title *can* include markdown.
:::
:::tip You can specify an optional title
Heads up! Here's a pro-tip.
:::
:::info
Useful information.
:::
:::caution
Warning! You better pay attention!
:::
:::danger
Danger danger, mayday!
:::
```
## Links
The links in this paragraph are being pulled from a list [a link][1] and
another [link][2].
```md
The links in this paragraph are being pulled from a list [a link][1] and
another [link][2].
```
```md
This is that list
[1]: http://example.com/ "Title"
[2]: http://example.org/ "Title"
```
[1]: http://example.com/ "Title"
[2]: http://example.org/ "Title"
## Images
### Alt tags for images
You can update the alt tag data for text like this:
Logo: 
```md
Logo: 
```
You can create a image with a hyperlink to another page or a hash link on the page by adding the link in the brackets next to it
Linked logo: [](https://docs.flashbots.net/ "Off to the docs")
```md
Linked logo: [](https://docs.flashbots.net/ "Off to the docs")
```
## MDX features
A quick note on using what's called `.mdx` features, `mdx` means markdown extended, to used these features, you need to name your file to have the extention `.mdx`
For example `cheatsheet.mdx`
This lets you use react components that are a bit more intricate that the standard markdown features.
To make use of an `mdx` component like `Tabs`, you need to add any `import ... from ...` lines to the top of the page, but below the meta data section. Heres an example:
```
---
title: Cheatsheet (Heading 1)
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
```
### Tabs
This is an example of the `tabs` component.
For extend usage, please refer to the [Docusaurus documentation.](https://docusaurus.io/docs/next/markdown-features/tabs)
<Tabs
defaultValue="apple"
values={[
{label: 'Apple', value: 'apple'},
{label: 'Orange', value: 'orange'},
{label: 'Banana', value: 'banana'},
]}>
<TabItem value="apple">This is an apple 🍎</TabItem>
<TabItem value="orange">This is an orange 🍊</TabItem>
<TabItem value="banana">This is a banana 🍌</TabItem>
</Tabs>
```mdx
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
<Tabs
defaultValue="apple"
values={[
{label: 'Apple', value: 'apple'},
{label: 'Orange', value: 'orange'},
{label: 'Banana', value: 'banana'},
]}>
<TabItem value="apple">This is an apple 🍎</TabItem>
<TabItem value="orange">This is an orange 🍊</TabItem>
<TabItem value="banana">This is a banana 🍌</TabItem>
</Tabs>
```
### Inline Table of Contents
If you need a table contents literally anywhere, you can make use of the `<TOCInline>` component.
For extend usage, please refer to the [Docusaurus documentation.](https://docusaurus.io/docs/next/markdown-features/inline-toc)
<TOCInline toc={toc} />
```mdx
import TOCInline from '@theme/TOCInline'
<TOCInline toc={toc} />
```
## Footnotes & references
This is how we make a reference to a foot note or reference that's found at the bottoms of the page.[^1]
```md
This is how we make a reference to a footnote [^1] that's found at the bottoms of the page
```
To create list of foot notes, you just add list like this somewhere, preferably at the bottom of the file
```md
[^1]: an amazing foot note, you can add links n things here as usual
```
[^1]: an amazing foot note, you can add links n things here as usual
================================================
FILE: docs/code-of-conduct.mdx
================================================
---
title: Code of Conduct
---
At Flashbots we contribute with the larger free software community to illuminate the dark forest.
You are welcome here \<3.
We just ask you to be nice. Please start by reading our code of conduct.
### Contributor Covenant Code of Conduct
#### Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
#### Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email address,
without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
#### Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
#### Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
#### Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement through
emailing fredrik@flashbots.net or contacting Fred in
[Discord](https://discord.gg/flashbots).
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
#### Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
##### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
##### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
##### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
##### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
#### Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
================================================
FILE: docs/community-tools.mdx
================================================
---
title: Community Tools
---
### [DotPics Info](https://dotpics.info/)
- A collection of interactive dashboards of the MEV-Boost ecosystem.
### [MEV Data by EigenPhi](https://eigenphi.io/)
- Analytical explorers detailing MEV and liquidity on-chain data.
### [libMEV](https://libmev.com/)
- A living dashboard with MEV searcher data.
### [Ethereum Block Value Analytics](https://payload.de/data/)
- Transaction pool, value over time, and builder bids of Ethereum block.
### [MEV-Boost Dashboard](https://dune.com/ChainsightAnalytics/mev-after-ethereum-merge)
- Overview of MEV-Boost adoption and profitability of proposers and block builders.
### [MEV-Boost Relay & Builder Stats](https://www.relayscan.io/)
- Ethereum MEV-Boost Relay Monitoring.
================================================
FILE: docs/contribution-guide.mdx
================================================
---
title: Docs Contribution Guide
---
Thank you for your interest in adding to our knowledge base!
## Repo structure
The docs repository is structured intuitively with the staging branch as the default branch. Once you click on docs [(docs/docs)](https://github.com/flashbots/docs/tree/staging/docs), you access a collection of .mds documents organized in folders the same way they are organized in the sidebar of the docs website.
- All the pages on Docusaurus are created from these mds
- the docusaurus sidebar is created from the [sidebar.js](https://github.com/flashbots/docs/blob/staging/docs/sidebars.js) file
## Cheatsheet
We've created a simple cheatsheet file with examples of every heading, code block & tab component you can use to create your doc entry.
[Click here to see the reference doc](cheatsheet)
## Contribution steps:
**Step 1:** Create a branch off of the staging branch
**Step 2:** Add your desired changes to your branch
- you can use yarn to visualize your edits of the docs locally, yarn instructions are on the [readme of the repository](https://github.com/flashbots/docs#readme)
**Step 3:** Make a PR to the staging branch
- once your PR is submitted, changes from your PR can be visualized thanks to Render
- the render bot will comment a link on your PR others can use to look at the version of the staging-docs website with your PR implemented [eg.](https://github.com/flashbots/docs/pull/23)
**Step 4:** Changes to staging branch (PRs) are reviewed and merged by *docs* admins
- after review, PRs are merged to the staging branch and your changes are now deployed live to the staging docs website
**Step 5:** Once enough changes have been collected/time is right, staging branch is merged into main branch by *docs* admins
- changes are now deployed live to the [docs website](/)
## Docusaurus-specific considerations
There's a couple things to be aware of when adding your own `*.md` files to our codebase:
- Please remove all `HTML` elements
- Links are done using `[text](link)` this can link out to external links or to local docs files
- For images, use the syntax `` to add an image, alternatively see below:
```md
<img
src={require('../static/img/example-banner.png').default}
alt="Example banner"
/>
```
### Adding meta data to your doc
The docs make use of a feature called [frontmatter](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-docs#markdown-frontmatter) which lets you add some meta data and
control the way the docs are referenced through the site.
This is done by adding a small section to the top of your doc like this:
```md
---
title: Example Doc
---
```
That title in the example will automatically add a `# Heading` to your page when it renders
There are a couple settings available;
Such as specifying the url you would like using
`slug: /questionably/deep/url/for/no/reason/buckwheat-crepes`
Adding `keywords` or `description` etc, below is a full example:
```
---
id: not-three-cats
title: Three Cats
hide_title: false
hide_table_of_contents: false
sidebar_label: Still not three cats
custom_edit_url: https://github.com/flashbots/docs/edit/main/docs/three-cats.md
description: Three cats are not unlike four cats like three cats
keywords:
- cats
- three
image: ./assets/img/logo.png
slug: /myDoc
---
My Document Markdown content
```
### Side bar navigation
To update the high level navigation, open the file in `docs/sidebars.js` and arrange n order as required. The titles for links are pulled from their files.
The `items` here take a page ID, a page ID by default is the title of the file, as example `example-doc.md` would be `example-doc`
To read the Docusaurus docs, [click here](https://docusaurus.io/docs/sidebar)
================================================
FILE: docs/flashbots-auction/advanced/bundle-cancellations.mdx
================================================
---
title: bundle cancellations
---
Bundle cancellations are currently deployed to our mainnet staging environment: `https://relay-staging.flashbots.net`. You must send both bundles and cancellations to this endpoint for it to be successful.
This staging environment is limited to sending and cancelling bundles, and
will only simulate bundles targeting currently built and the next blocks. The bundles make it to our staging builder (`0x81babe`) and you should see the bundles landing on mainnet as you would be using the production endpoint.
### Understanding bundle cancellations
Bundles can be replaced and canceled using a unique identifier (`replacementUuid`) assigned to a bundle at the time of submission.
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_sendBundle",
"params": [
{
txs,
blockNumber,
minTimestamp,
maxTimestamp,
revertingTxHashes,
replacementUuid, // UUIDv4 to uniquely identify submission
}
]
}
```
### Replacing bundles
To replace a bundle, send the new bundle via `eth_sendBundle` with the same `replacementUuid` as the bundle you want to replace.
### Canceling bundles
Canceling a bundle will prevent Flashbots builders from including it on-chain. To cancel a bundle, call the [`eth_cancelBundle`](/flashbots-auction/advanced/rpc-endpoint#eth_cancelbundle) endpoint, or use the `cancelBundle` function in your preferred [Flashbots library](/flashbots-auction/libraries/bundle-relay).
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_cancelBundle",
"params": [
{
replacementUuid, // UUIDv4 to uniquely identify submission
}
]
}
```
================================================
FILE: docs/flashbots-auction/advanced/bundle-pricing.md
================================================
---
title: Bundle Pricing
---
## Understanding bundle pricing
Searchers submit a huge amount of bundles every block, but the amount of blockspace is limited. So what decides what can be included in a block or not? To understand the answer we will first review some context.
At a high level _the Flashbots block builder is designed to include the most profitable transactions possible in the blocks it builds_.
In **PoW Ethereum**, this was achieved by inserting searcher's bundles at the _top of block_ and removing transactions at the _tail of the block_. Measured by gas price, these transactions at the tail of a block were the _least profitable_ for a miner to mine. That meant that for a Flashbots bundle to be considered profitable it must have a higher effective gas price than the transactions it displaces at the tail of the block.
In **PoS Ethereum**, the rule of thumb for bundle pricing on Flashbots is practically the same; more profitable transactions will generally be favored by the block-building algorithm. Bundle/transaction profitability is determined by fee per gas used, priority fee, and direct validator payments.
The most notable difference in PoS is that instead of all bundles being placed at the top of the block, bundles may be placed anywhere in a block. This might mean that other transactions (e.g. from the mempool) are placed between bundles. Bundles are still atomic, though -- no transactions will be placed in-between bundle transactions, only in-between separate bundles.
## Bundle ordering formula
The Flashbots builder employs a new algorithm aimed at maximizing block profitability. This new approach brings about several significant changes that searchers need to understand:
* Instead of ranking and including bundles based off of effective gas price the algorithm now optimizes for overall block profit.
* Top-of-block execution is no longer a guarantee.
* Bundle ordering by effective gas price is no longer a guarantee.
* Other transactions (e.g. from the mempool) may land between bundles (not between transactions in bundles, but between two different bundles).
* For example:
* If you have a bundle comprised of transactions `[B1, B2]`
* and someone else has a bundle comprised of transactions `[C1, C2]`
* and there are transactions in the mempool `[t1, t2, ...]`,
* then the block may be built such that:
* `BLOCK_TXS = [..., B1, B2, t1, t2, C1, C2, ...]`.
## Why aren't my bundles being included?
There could be two potential reasons why your bundles are not being included. The first reason to consider is that the gas price of your bundles might not be higher than that at the tail end of a block. It's recommended to analyze the gas price your bundles are offering by initially simulating the bundles and observing the difference in the coinbase and the gas consumed. If this value is found to be lower than the tail end of recent blocks, it would be necessary to increase your gas price accordingly.
Alternatively, your bundles may not be included due to competition with other searchers targeting the same opportunities. These competitors might be offering a higher gas price than you. To address this, first simulate your bundles to check the gas price they are offering. Log the amount you are paying for a specific opportunity in a specific block.
================================================
FILE: docs/flashbots-auction/advanced/co-locate.mdx
================================================
---
title: Co-locate with Flashbots Builder
---
For searchers who want to optimize the latency of their bundle submission, they can choose to co-locate with Flashbots Builders.
The Flashbots Builder is located in Ohio, USA. Specifically, it is located in the AWS `us-east-2` region.
================================================
FILE: docs/flashbots-auction/advanced/coinbase-payment.mdx
================================================
---
title: coinbase.transfer()
---
Flashbots allows you to pay validators for your transactions through a smart contract by using `block.coinbase.transfer(AMOUNT_TO_TRANSFER)`. This smart contract function transfers Ethereum from the contract to the address of the validator who proposes a block. The Flashbots builder will treat fees through coinbase transfers in the same way they do normal transaction fees, which is to say that 1 wei of coinbase payments is equivalent to 1 wei paid through transaction fees. This provides significant benefits to Flashbots users:
* You can condition payment to the validator on some criteria being met
* Related, you can only pay for successful transactions, not failures
* You can pay for a transaction from account X with ETH from account Y (see: searcher sponsored transaction repo [here](https://github.com/flashbots/searcher-sponsored-tx))
Here's an example from our open source simple arbitrage bot of how paying through coinbase transfers work:
```solidity
function uniswapWeth(uint256 _wethAmountToFirstMarket, uint256 _ethAmountToCoinbase, address[] memory _targets, bytes[] memory _payloads) external onlyExecutor payable {
require (_targets.length == _payloads.length);
uint256 _wethBalanceBefore = WETH.balanceOf(address(this));
WETH.transfer(_targets[0], _wethAmountToFirstMarket);
for (uint256 i = 0; i < _targets.length; i++) {
(bool _success, bytes memory _response) = _targets[i].call(_payloads[i]);
require(_success); _response;
}
uint256 _wethBalanceAfter = WETH.balanceOf(address(this));
require(_wethBalanceAfter > _wethBalanceBefore + _ethAmountToCoinbase);
if (_ethAmountToCoinbase == 0) return;
uint256 _ethBalance = address(this).balance;
if (_ethBalance < _ethAmountToCoinbase) {
WETH.withdraw(_ethAmountToCoinbase - _ethBalance);
}
block.coinbase.transfer(_ethAmountToCoinbase);
}
```
The above smart contract code will attempt to capitalize on arbitrage opportunities. If it does not make money doing so then the transaction will fail.
For more information on how coinbase transfers are priced see the [bundle pricing page](/flashbots-auction/advanced/bundle-pricing).
## Managing payments to coinbase.address when it is a contract
Validators will occasionally have a smart contract listed as their block.coinbase address. This changes the expected behavior of making payments to block.coinbase. Specifically it costs more gas to transfer ETH to block.coinbase if it is a contract than if it is an EOA, and as such many searchers will underestimate their gas consumption and their bundles will fail for validators who use contracts instead.
To handle this edge case searchers can up their gas limit to accommodate the additional payment to validators and call block.coinbase in the following way:
```solidity
block.coinbase.call{value: _ethAmountToCoinbase}(new bytes(0));
```
However, searchers should be acutely aware of the risk of [reentrancy attacks](https://medium.com/coinmonks/protect-your-solidity-smart-contracts-from-reentrancy-attacks-9972c3af7c21), as calling coinbase in this way temporarily gives execution to a third party, and typically payments to coinbase are made after checks for profit. Moreover, searchers should be aware that supporting payments to coinbase addresses that are contracts will cause their gas consumption to go up, and as a result their bundle gas price to go down. This is a tradeoff that should be considered.
================================================
FILE: docs/flashbots-auction/advanced/eip1559.mdx
================================================
---
title: EIP-1559 Support
---
EIP-1559 is an upgrade to the Ethereum network that changes how you pay for transactions. It introduces a base fee that varies depending on the network demand, and a priority fee that you can set to get faster confirmation. The base fee is burned, while the priority fee goes to the miner who includes your transaction in a block. Flashbots, starting from [mev-geth v1.10.5-mev-0.3.0](https://github.com/flashbots/mev-geth/releases/tag/v1.10.5-mev0.3.0), has integrated support for EIP-1559 transactions.
While users of the legacy transaction type don't need to make any configuration changes, they should be aware that it's now mandatory to include a `gasPrice` that is at least equal to the base fee. Coinbase transfer can still be used to incentivize faster inclusion, but it cannot be used to bypass the base fee requirement.
## Legacy Transaction example
Below is an example of signing bundles with a legacy transaction:
```js
const signedTransactions = await flashbotsProvider.signBundle([
{
signer: authSigner,
transaction: {
to: "0xf1a54b075fb71768ac31b33fd7c61ad8f9f7dd18",
gasPrice: 10,
gasLimit: 33000,
chainId: 5,
value: 0,
},
},
]);
```
The full amount of `gasPrice` will be consumed first to clear the base fee, and the remaining will be used as priority fee.
## EIP-1559 Transaction example
Below is an example of signing bundles with EIP-1559 transactions (note: `chainId` is a required attribute for 1559 or type2 transaction):
```js
const block = await provider.getBlock("latest");
const maxBaseFeeInFutureBlock =
FlashbotsBundleProvider.getMaxBaseFeeInFutureBlock(block.baseFeePerGas, 1);
const priorityFee = BigNumber.from(2).pow(9);
const signedTransactions = await flashbotsProvider.signBundle([
{
signer: authSigner,
transaction: {
to: "0xf1a54b075fb71768ac31b33fd7c61ad8f9f7dd18",
type: 2,
maxFeePerGas: priorityFee.add(maxBaseFeeInFutureBlock),
maxPriorityFeePerGas: priorityFee,
gasLimit: 33000,
chainId: 5,
value: 0,
},
},
]);
```
Here the priorityFee is set to 2 Gwei, and the maxFeePerGas is set to be exactly equal to the max base fee in the next block plus the priority fee.
## FAQ
### Can a transaction specify `maxFeePerGas=0`?
No, all transactions must have maxFeePerGas greater than or equal to `block.baseFeePerGas`, or they are not eligible for inclusion in a block.
### Can a transaction specify `maxPriorityFeePerGas=0`
Absolutely, although the builder will need some incentive to include this transaction. With a Flashbots bundle, you can incentivize a builder/validator to include your transactions with `block.coinbase.transfer()` payments _OR_ via `maxPriorityFeePerGas`. You can also use both at the same time; the incentive is cumulative.
### Will reverting transactions still be discarded?
Flashbots still uses the same reverting transactions logic after EIP-1559: unless specified in `revertingTxHashes` in `eth_sendBundle`, a transaction that reverts invalidates an entire bundle and will not appear on chain.
However, with the new requirement for searchers to provide a gas price that meets the `base fee` for each transaction, successfully included bundle transactions may end up in the mempool following block re-organizations. If `gasPrice=0` is used, re-organized transactions are swiftly dropped from the gossip network, making it unlikely for them to appear in a future block unless reintroduced by another searcher. Transactions that pay at least the base fee will remain in the mempool and have a higher chance of appearing in future blocks, potentially conflicting with expectations regarding reverting transactions.
### How can I send a transaction from an account with 0 ETH, like one with a malicious `sweeper` running against it?
We have a working example of how to accomplish this in our [Sponsored Transaction Github Repository](https://github.com/flashbots/searcher-sponsored-tx/), which has been updated to work with EIP-1559.
### Where can I learn more about EIP-1559?
[EIP-1559 Hackmd Cheat Sheet](https://hackmd.io/@q8X_WM2nTfu6nuvAzqXiTQ/1559-wallets)
================================================
FILE: docs/flashbots-auction/advanced/gas-fee-refunds.md
================================================
---
title: Gas Fee Refunds
---
## Introduction
Searchers and private transaction API users are automatically eligible to receive gas fee refunds. If a bundle can be included on chain for a lower price, you are eligible to receive a refund.
Gas fee refunds do not change how bundles are executed and searchers do not need to make any changes to be eligible for them.
## Where do refunds come from
Gas fee refunds include both priority fees and coinbase transfers.
In an optimal case, searchers are refunded the difference between their bid and the bid of the next-best bundle or transaction targeting the same state. Ie. the refund effectively results in the searcher paying the second price. In practice, searchers will receive some fraction of this amount depending on how much profit BuilderNet makes.
## Which bundles receive refunds
Flashbots provides refunds for bundles in blocks landed by [BuilderNet](https://buildernet.org/). Whether a bundle receives a refund depends on a few factors that vary from block to block:
* How much network congestion and competition there was
* Whether BuilderNet made a profit and how much
* How much the specific bundle contributed to the value of the block
* If the bundle was sent directly to Flashbots or BuilderNet, or shared with other block builders by the searcher
Note that transactions or bundles that are non-exclusive, sent directly to mev-share, or seen in the public mempool are excluded and do not receive refunds.
## How to maximize both refunds and speed
Transactions which are sent directly to the Flashbots Bundle Relay or BuilderNet, and not multiplexed _by the searcher_ to other block builders, are likely to receive higher refunds. This is because they increase the profit of BuilderNet which is used to provide refunds.
BuilderNet does not land 100% of blocks. In order to land bundles in all blocks, searchers can ask Flashbots to share their bundles with other block builders in cases where BuilderNet does not win a block. Flashbots will automatically share with all specified builders on the searcher's behalf.
### Smart multiplexing
To share bundles with other builders, add the `builders` field to your `eth_sendBundle` request. The `builders` field accepts a list of strings which correspond to the "name" tags of [registered builders](https://github.com/flashbots/dowg/blob/main/builder-registrations.json).
All `eth_sendBundle` requests are shared with BuilderNet. They are multiplexed to other block builders at the end of the slot if BuilderNet determines it will not win that block.
For example:
```
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_sendBundle",
"params": [
{
"txs": ["0x123abc...", "0x456def..."],
"blockNumber": "0xb63dcd",
"minTimestamp": 0,
"maxTimestamp": 1615920932
"builders": ["builder0x69", "beaverbuild.org"]
}
]
}
```
Searchers can also use `mev_sendBundle` to multiplex bundles if they prefer. This method is more complex and not necessary for gas fee refunds.
_Note: Smart multiplexing has a 1% rate of false positives, meaning that in 1% of MEV-Boost blocks there is a risk that searcher bundles will not be landed._
## How are refunds calculated
BuilderNet uses a refund rule to retroactively calculate refunds for all bundles landed in its blocks. For more information, see the [BuilderNet docs](https://buildernet.org/docs/refunds).
## Who receives refunds
By default, the refund recipient is the signer used on the `eth_sendBundle`, `mev_sendBundle`, or `eth_sendPrivateTransaction` request. You can delegate your recipient to a different address using the `flashbots_setFeeRefundRecipient` API.
## How to track refunds
Refunds are tracked from a start date of July 8, 2024. Refunds are sent to recipients in batches, the first batch originated from the Flashbots builder address `0xdf99A0839818B3f120EBAC9B73f82B617Dc6A555` while newer batches originate from [`refunds.buildernet.eth`](https://etherscan.io/address/0x62a29205f7ff00f4233d9779c210150787638e7f).
Track your refunds using the [`flashbots_getFeeRefundTotalsByRecipient`](/flashbots-auction/advanced/rpc-endpoint#flashbots_getfeerefundtotalsbyrecipient) RPC method or the [refund dashboard](https://app.hex.tech/9eb1e790-53f7-4c16-be76-4a22c1aa7d17/app/0c2d34ef-1304-481a-b3d6-b773ce9e0e19/latest) on Dune.
## Distributed refunds
The on-chain transactions corresponding to distributed refunds can be viewed with this Dune query: [https://dune.com/queries/4398421](https://dune.com/queries/4398421)
================================================
FILE: docs/flashbots-auction/advanced/multiplexing.mdx
================================================
---
title: Send transaction/bundle to multiple builders
---
import Builders from '../../specs/mev-share/_builders.mdx';
Some users might want to send their transactions or bundles to multiple builders for various reasons. The ability to multiplex is supported by our APIs.
If you are using [`mev_sendBundle`](https://docs.flashbots.net/flashbots-auction/advanced/rpc-endpoint#mev_sendbundle) to send bundles, or [`eth_sendPrivateTransaction`](https://docs.flashbots.net/flashbots-auction/advanced/rpc-endpoint#eth_sendprivatetransaction) to send transactions, specify the builders you want to multiplex to in the `privacy.builders` parameter.
If you are using [`eth_sendBundle`](https://docs.flashbots.net/flashbots-auction/advanced/rpc-endpoint#eth_sendbundle) to send bundles, specify the builders you want to multiplex to in the `builders` parameter.
Below is the list of builders that you can multiplex to:
<Builders />
================================================
FILE: docs/flashbots-auction/advanced/reputation.md
================================================
---
title: Searcher Reputation
---
In order to maintain reliable performance, we've introduced searcher reputation to provide consistent access to the Flashbots block builder for searchers with a good performance track record during periods of heavy load. Reputation is one of many solutions currently being explored to make Flashbots infrastructure resilient against sophisticated Layer 7 attacks. The system described on this page is likely to change and we encourage you to participate in defining the direction it will take by engaging in the [discussion board](https://github.com/flashbots/pm/discussions/79).
## Reputation queues
The current reputation system is designed to classify searchers into a high reputation and low reputation queue. The high reputation queue is designed to filter out searchers who use an excessive amount of computation resources. Otherwise, both queues are identical.
## Reputation scoring
To determine which queue a searcher belongs to, Flashbots looks at their history of submissions to the builder. Specifically, Flashbots uses the following scoring function:
$$
r(U) = \frac{\sum_{T\in H_U}(\Delta_{coinbase_T} + g_Tp_T)}{\sum_{T\in S_U}g_T}
$$
$r$: searcher reputation score.
$H_U$: set of all transactions $T$ submitted by searcher $U$ to `eth_sendBundle` RPC and successfully landed on chain.
$S_U$: set of all transactions $T$ submitted by searcher $U$ to `eth_sendBundle` and `eth_callBundle` RPC.
$g_{T}$: _gas used_ by transaction $T$.
$p_{T}$: _gas price_ of transaction $T$.
$\Delta_{coinbase_T}$: coinbase difference from direct payment in transaction $T$.
## Querying reputation
Flashbots uses a dynamic threshold to classify users between the high reputation and low reputation queue. The dynamic variables are: 1) the historical time period considered to calculate reputation, 2) the cutoff reputation score which classifies a searcher as "high reputation". Using a dynamic threshold allows the builder to adapt in periods of high demand and maintain high reliability for top searchers.
## Building reputation
Searcher reputation is associated with the signing key used to authenticate with Flashbots. That is, the ethereum address associated with the `X-Flashbots-Signature` field of your bundle submission.
As a searcher, the best way to improve your score is to only submit bundles/transactions which have a high likelihood of landing on chain.
================================================
FILE: docs/flashbots-auction/advanced/rpc-endpoint.mdx
================================================
---
title: JSON-RPC Endpoints
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import Hints from '../../specs/mev-share/HintsTable';
import Builders from '../../specs/mev-share/_builders.mdx';
import SendBundleSpec from '../../specs/mev-share/_mev_sendBundle.mdx';
import SimBundleSpec from '../../specs/mev-share/_mev_simBundle.mdx';
## Interact directly with the Flashbots RPC endpoint
Advanced users can interact with the RPC endpoint at `relay.flashbots.net`, or one of the testnet URLs below.
### Bundle Relay URLS
| Network | URL |
| -------- | ---------------------------------------- |
| Mainnet | `https://relay.flashbots.net` |
| Sepolia | `https://relay-sepolia.flashbots.net` |
The API provides JSON-RPC methods for interfacing with Flashbots. Below are some of the restrictions:
- There is a rate limit of 10,000 requests per second per IP
- Each bundle (`txs` parameter) can contain at most 100 transactions and have a size limit of 300,000 bytes
Each method is documented below.
### eth_sendBundle
`eth_sendBundle` can be used to send your bundles to the Flashbots builder. The `eth_sendBundle` RPC has the following payload format:
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_sendBundle",
"params": [
{
txs, // Array[String], A list of signed transactions to execute in an atomic bundle
blockNumber, // String, a hex encoded block number for which this bundle is valid on
minTimestamp, // (Optional) Number, the minimum timestamp for which this bundle is valid, in seconds since the unix epoch
maxTimestamp, // (Optional) Number, the maximum timestamp for which this bundle is valid, in seconds since the unix epoch
revertingTxHashes, // (Optional) Array[String], A list of tx hashes that are allowed to revert
replacementUuid, // (Optional) String, UUID that can be used to cancel/replace this bundle
builders, // (Optional) Array[String], A list of [registered](https://github.com/flashbots/dowg/blob/main/builder-registrations.json) block builder names to share the bundle with
}
]
}
```
example:
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_sendBundle",
"params": [
{
"txs": ["0x123abc...", "0x456def..."],
"blockNumber": "0xb63dcd",
"minTimestamp": 0,
"maxTimestamp": 1615920932
}
]
}
```
example response:
```json
{
"jsonrpc": "2.0",
"id": "123",
"result": {
"bundleHash": "0x2228f5d8954ce31dc1601a8ba264dbd401bf1428388ce88238932815c5d6f23f"
}
}
```
If `builders` are specified, the response will include an additional `smart` field.
example with `builders`:
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_sendBundle",
"params": [
{
"txs": ["0x123abc...", "0x456def..."],
"blockNumber": "0xb63dcd",
"minTimestamp": 0,
"maxTimestamp": 1615920932,
"builders": ["builder0x69"]
}
]
}
```
example response:
```json
{
"jsonrpc": "2.0",
"id": "123",
"result": {
"bundleHash": "0x2228f5d8954ce31dc1601a8ba264dbd401bf1428388ce88238932815c5d6f23f",
"smart": "true"
}
}
```
### mev_sendBundle
`mev_sendBundle` uses a new bundle format to send bundles to MEV-Share. See the [Understanding Bundles](/flashbots-mev-share/searchers/understanding-bundles) page for more information, or check out the [Sending Bundles](/flashbots-mev-share/searchers/sending-bundles) page for a short guide. Note that as of October 20, 2025, a bundle can now only contain one backrun transaction.
<SendBundleSpec />
example request:
```json
{
"params": [
{
"version": "v0.1",
"inclusion": {
"block": "0x8b8da8",
"maxBlock": "0x8b8dab"
},
"body": [
{
"hash": "0x24e6e999b8abf2c4df46e8a02516c0983043039a5a54f89fa87274427ce64798"
},
{
"tx": "0x02f880058201d685e9103fda0085e9103fda368255f0940000c335bc9d5d1af0402cad63fa7f258363d71a8092696d206261636b72756e6e69696969696e67c080a0c5058ccf5759e29d4ad28e038f632a9b6269bbb0644c61447e0f14d56c453d73a048e877ee621c4b6be1234a8ad84379e80d45b288a7271e2b1aede7a04f06fd98",
"canRevert": false
}
],
"validity": {
"refund": [],
"refundConfig": []
}
}
],
"method": "mev_sendBundle",
"id": 1,
"jsonrpc": "2.0"
}
```
example response:
```json
{
"bundleHash": "0x7d6e491ab67aee5f4b75321c936bf05664d2d9b234fd67083e46bd43bb42f383"
}
```
### eth_callBundle
`eth_callBundle` can be used to simulate a bundle against a specific block number, including simulating a bundle at the top of the next block. The `eth_callBundle` RPC has the following payload format:
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_callBundle",
"params": [
{
txs, // Array[String], A list of signed transactions to execute in an atomic bundle
blockNumber, // String, a hex encoded block number for which this bundle is valid on
stateBlockNumber, // String, either a hex encoded number or a block tag for which state to base this simulation on. Can use "latest"
timestamp, // (Optional) Number, the timestamp to use for this bundle simulation, in seconds since the unix epoch
}
]
}
```
example:
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_callBundle",
"params": [
{
"txs": ["0x123abc...", "0x456def..."],
"blockNumber": "0xb63dcd",
"stateBlockNumber": "latest",
"timestamp": 1615920932
}
]
}
```
example response:
```json
{
"jsonrpc": "2.0",
"id": "123",
"result": {
"bundleGasPrice": "476190476193",
"bundleHash": "0x73b1e258c7a42fd0230b2fd05529c5d4b6fcb66c227783f8bece8aeacdd1db2e",
"coinbaseDiff": "20000000000126000",
"ethSentToCoinbase": "20000000000000000",
"gasFees": "126000",
"results": [
{
"coinbaseDiff": "10000000000063000",
"ethSentToCoinbase": "10000000000000000",
"fromAddress": "0x02A727155aeF8609c9f7F2179b2a1f560B39F5A0",
"gasFees": "63000",
"gasPrice": "476190476193",
"gasUsed": 21000,
"toAddress": "0x73625f59CAdc5009Cb458B751b3E7b6b48C06f2C",
"txHash": "0x669b4704a7d993a946cdd6e2f95233f308ce0c4649d2e04944e8299efcaa098a",
"value": "0x"
},
{
"coinbaseDiff": "10000000000063000",
"ethSentToCoinbase": "10000000000000000",
"fromAddress": "0x02A727155aeF8609c9f7F2179b2a1f560B39F5A0",
"gasFees": "63000",
"gasPrice": "476190476193",
"gasUsed": 21000,
"toAddress": "0x73625f59CAdc5009Cb458B751b3E7b6b48C06f2C",
"txHash": "0xa839ee83465657cac01adc1d50d96c1b586ed498120a84a64749c0034b4f19fa",
"value": "0x"
}
],
"stateBlockNumber": 5221585,
"totalGasUsed": 42000
}
}
```
### mev_simBundle
`mev_simBundle` uses a new bundle format to simulate matched bundles on MEV-Share. See [mev-share spec](https://github.com/flashbots/mev-share/blob/main/specs) for more information.
<SimBundleSpec />
example request (sent after landing a bundle via `mev_sendBundle`):
```json
{
"params": [
{
"inclusion": {
"block": "0x8b8da8",
"maxBlock": "0x8b8dab"
},
"body": [
{
"tx": "0x02f87b058201d5843b9aca00843b9aca368255f0940000c335bc9d5d1af0402cad63fa7f258363d71a808f696d20736861726969696969696e67c001a00d8d998fb0dc1e4da9b1de477acea54f185153d66d0af45a4ecfd20e453772baa07bd0ad1e1afb3f19749aaa5660f22859a6e485942346cd7186c024a5da747ada",
"canRevert": false
},
{
"tx": "0x02f880058201d685e9103fda0085e9103fda368255f0940000c335bc9d5d1af0402cad63fa7f258363d71a8092696d206261636b72756e6e69696969696e67c080a0c5058ccf5759e29d4ad28e038f632a9b6269bbb0644c61447e0f14d56c453d73a048e877ee621c4b6be1234a8ad84379e80d45b288a7271e2b1aede7a04f06fd98",
"canRevert": false
}
],
"version": "v0.1",
"validity": {
"refund": [],
"refundConfig": []
}
},
{
"parentBlock": "0x8b8da8"
}
],
"method": "mev_simBundle",
"id": 1,
"jsonrpc": "2.0"
}
```
example response:
```json
{
"success": true,
"stateBlock": "0x8b8da8",
"mevGasPrice": "0x74c7906005",
"profit": "0x4bc800904fc000",
"refundableValue": "0x4bc800904fc000",
"gasUsed": "0xa620",
"logs": [{}, {}]
}
```
### eth_cancelBundle
`eth_cancelBundle` is used to prevent a submitted bundle from being included on-chain. See [bundle cancellations](/flashbots-auction/advanced/bundle-cancellations) for more information.
[`eth_cancelPrivateTransaction`](https://docs.alchemy.com/alchemy/apis/ethereum/eth_cancelPrivateTransaction/?a=fb) is also supported on [Alchemy](https://alchemy.com/?a=fb).
:::caution
`replacementUuid` must have been set when bundle was submitted.
:::
:::caution
When you cancel a bundle in Flashbots, the cancelled bundle is excluded from all future bids by the builder. However, there's no active adjustment to decrease the bid value on the relay for already placed bids. If the block value increases without your bundle, the bid might be replaced to reflect the new value.
:::
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_cancelBundle",
"params": [
{
replacementUuid, // UUIDv4 to uniquely identify submission
}
]
}
```
### eth_sendPrivateTransaction
`eth_sendPrivateTransaction` is used to send a single transaction to Flashbots. Flashbots will attempt to build a block including the transaction for the next 25 blocks. See [Private Transactions](/flashbots-protect/additional-documentation/eth-sendPrivateTransaction) for more info.
[`eth_sendPrivateTransaction`](https://docs.alchemy.com/reference/eth-sendprivatetransaction?a=fb) is also supported on [Alchemy](https://alchemy.com?a=fb).
This method has the following JSON-RPC format:
```typescript
{
jsonrpc: "2.0",
id: string | number,
method: "eth_sendPrivateTransaction",
params: [{
tx, // String, raw signed transaction
maxBlockNumber, // Hex-encoded number string, optional. Highest block number in which the transaction should be included.
preferences?: {
fast: boolean, // Sends transactions to all registered block builders, sets MEV-Share revenue share to 50%
privacy?: { // MEV-Share options; optional
hints?: Array< // data about tx to share w/ searchers on mev-share
"contract_address" |
"function_selector" |
"calldata" |
"logs" |
"hash"
>,
builders?: Array< // MEV-Share builders to exclusively receive bundles; optional
"default" |
"flashbots"
>,
},
validity?: {
refund?: Array<{address, percent}>
}
}
}]
}
```
example request:
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_sendPrivateTransaction",
"params": [
{
"tx": "0x123abc...",
"maxBlockNumber": "0xcd23a0",
"preferences": {
"fast": true,
"privacy": {
"hints": ["calldata", "transaction_hash"],
"builders": ["default"]
},
"validity": {
"refund": [{"address": "0xadd123", "percent": 50}]
}
}
}
]
}
```
example response:
```json
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x45df1bc3de765927b053ec029fc9d15d6321945b23cac0614eb0b5e61f3a2f2a" // tx hash
}
```
#### `privacy`
By default, transactions are sent to the Flashbots MEV-Share Node with the default [Stable](/flashbots-protect/mev-refunds#stable-configuration) configuration. The `privacy` parameter allows you to specify your own privacy parameters.
| Param | Type Info | Description |
| --- | --- | --- |
| `hint` | Array of strings | Each hint specifies which data about the transaction will be shared with searchers on mev-share. |
| `builders` | Array of strings | Builders to grant permission to include the transaction in a block. |
**`hint`**
<Hints />
**`builders`**
Flashbots currently supports sending orderflow to the following block builders. This is subject to change over time.
<Builders />
#### `validity`
Validity is used to specify the address and percentage to pay refund from the backrun of this transaction.
By default, the refund is paid to the signer of the transaction and 90% of the backrun value is sent to the user by default.
If multiple refund addresses are specified, then the backrun value is split between them according to the percentage specified. For example, if refund is `[{address: addr1, percent: 10}, {address: addr1, percent: 20}]` then 10% of the backrun value is sent to `addr1` and 20% is sent to `addr2` and 70% of the backrun value is left to the builder.
| Param | Type Info | Description |
| --- | --- | --- |
| `refund` | Array of objects | Each entry in the array specifies address that should receive refund from backrun and percent of the backrun value. |
| `refund[].address` | Address | Address that should receive refund. |
| `refund[].percent` | Number | Percentage of the total backrun value that this address should receive. |
### eth_sendPrivateRawTransaction
`eth_sendPrivateRawTransaction` behaves like [eth_sendPrivateTransaction](#eth_sendprivatetransaction) but its format is similar to that of [`eth_sendRawTransaction`](https://docs.alchemy.com/reference/eth-sendrawtransaction)
This method has the following JSON-RPC format:
```typescript
{
jsonrpc: "2.0",
id: string | number,
method: "eth_sendPrivateRawTransaction",
params: [
tx, // String, raw signed transaction
preferences?: {
fast: boolean, // Sends transactions to all registered block builders, sets MEV-Share revenue share to 50%
privacy?: { // MEV-Share options; optional
hints?: Array< // data about tx to share w/ searchers on mev-share
"contract_address" |
"function_selector" |
"calldata" |
"logs" |
"hash"
>,
builders?: Array< // MEV-Share builders to exclusively receive bundles; optional
"default" |
"flashbots"
>,
},
validity?: {
refund?: Array<{address, percent}>
}
}
]
}
```
example request:
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_sendPrivateRawTransaction",
"params": ["0x123abc..."]
}
```
example response:
```json
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x45df1bc3de765927b053ec029fc9d15d6321945b23cac0614eb0b5e61f3a2f2a" // tx hash
}
```
| Param | Type Info | Description |
| --- | --- | --- |
| `params[0]` | String | Raw signed transaction |
| `params[1]` | Object | Optional private tx preferences, see `preferences` in eth_sendPrivateTransaction. |
### eth_cancelPrivateTransaction
The `eth_cancelPrivateTransaction` method stops private transactions from being submitted for future blocks. A transaction can only be cancelled if the request is signed by the same key as the `eth_sendPrivateTransaction` call submitting the transaction in first place.
[`eth_cancelPrivateTransaction`](https://docs.alchemy.com/reference/eth-cancelprivatetransaction?a=fb) is also supported for free on [Alchemy](https://alchemy.com?a=fb).
This method has the following JSON-RPC format:
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_cancelPrivateTransaction",
"params": [{
txHash, // String, transaction hash of private tx to be cancelled
}]
}
```
example request:
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_cancelPrivateTransaction",
"params": [
{
"txHash": "0x45df1bc3de765927b053ec029fc9d15d6321945b23cac0614eb0b5e61f3a2f2a"
}
]
}
```
example response:
```json
{
"jsonrpc": "2.0",
"id": 1,
"result": true // true if tx successfully cancelled, false if not
}
```
### flashbots_getFeeRefundTotalsByRecipient
The `flashbots_getFeeRefundTotalsByRecipient` JSON-RPC method returns the total amount of fee refunds that have been earned by a specific address. Our refund process calculates these values weekly.
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "flashbots_getFeeRefundTotalsByRecipient",
"params": [
recipient, // String, the address to query for fee refunds
]
}
```
The response contains three fields:
```json
{
"pending":"0x17812ea4fbbe314",
"received":"0x108d1b27b63a213",
"maxBlockNumber":"0x13ddb08"
}
```
- `pending`: the total amount of fee refunds that have been earned but not yet received by the recipient
- `received`: the total amount of fee refunds that have been received by the recipient
- `maxBlockNumber`: the highest block number for which fee refunds have been processed
### flashbots_getFeeRefundsByRecipient
The `flashbots_getFeeRefundsByRecipient` JSON-RPC method returns detailed information about [fee refunds](/flashbots-protect/gas-fee-refunds) that have been earned by a specific address. Our refund process usually calculates these values with a 4 hour delay.
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "flashbots_getFeeRefundsByRecipient",
"params": [
{
recipient, // String, the address to query for fee refunds
cursor, // [optional] String, the cursor to continue from
}
]
}
```
Responses are paginated and contain the following fields:
```json
{
"refunds": [
{
"hash": "0x...",
"amount": "0x...",
"blockNumber": "0x13ddaa4",
"status": "pending",
"recipient": "0x..."
},
...
],
"cursor": "0x..."
}
```
The `"refunds"` field contains an array of per-order fee refunds, each with the following fields:
- `hash`: the bundle hash or transaction hash associated with the fee refund
- `amount`: the amount of the fee refund, in wei
- `blockNumber`: the block number the order was contained in
- `status`: the status of the fee refund, either "pending" or "received"
- `recipient`: the address the fee refund is credited to, either the bundle signer or transaction sender
The `"cursor"` field is only included if there are more fee refunds to fetch. To continue fetching fee refunds, include the cursor as the second argument in the next request.
NOTE: This API currently only returns details for bundles included in block 20802497 and later. To see total fee refunds processed for a specific address since inception, use the `flashbots_getFeeRefundTotalsByRecipient` method.
### flashbots_getFeeRefundsByBundle
The `flashbots_getFeeRefundsByBundle` is similar to `flashbots_getFeeRefundsByRecipient` but returns result for the given bundle.
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "flashbots_getFeeRefundsByBundle",
"params": [
{
bundle_hash, // String, the hash of the bundle
}
]
}
```
### flashbots_getFeeRefundsByBlock
The `flashbots_getFeeRefundsByBlock` is similar to `flashbots_getFeeRefundsByRecipient` but returns result for the given block.
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "flashbots_getFeeRefundsByBlock",
"params": [
{
block_number, // String, hex-encoded block number (e.g. 0x15d0280)
}
]
}
```
### flashbots_setFeeRefundRecipient
The `flashbots_setFeeRefundRecipient` JSON-RPC method allows a user to "delegate" their [fee refunds](/flashbots-auction/advanced/gas-fee-refunds) to a specific wallet address. Two addresses must be provided, the first is the address associated with the signing key used to authenticate your request, while the second is the address to send refunds to.
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "flashbots_setFeeRefundRecipient",
"params": [
"0xD2824D2D7D6399a4b9A47F258B870D2AFb213948",
"0xa273A268CE96E54cF6a7D879B7d016F57E396F48"
]
}
```
If the first address matches the authentication signature, then a response with `from` and `to` fields in the result will be returned:
```json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"from":"0xd2824d2d7d6399a4b9a47f258b870d2afb213948",
"to":"0xa273a268ce96e54cf6a7d879b7d016f57e396f48"
}
}
```
If the signature is invalid or does not match the first address, an appropriate error will be returned instead.
### buildernet_getDelayedRefunds
The `buildernet_getDelayedRefunds` JSON-RPC method returns detailed information about delayed refunds.
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "buildernet_getDelayedRefunds",
"params": [
{
recipient, // String, the address that receives delayed refunds
blockRangeFrom, // [optional] String, hex-encoded block number for the start of the range (inclusive)
blockRangeTo, // [optional] String, hex-encoded block number for the end of the range (inclusive)
cursor, // [optional] String, the cursor to continue from
hash, // [optional] String, bundle hash; if provided, you must also set both blockRangeFrom and blockRangeTo
}
]
}
```
Responses are paginated and contain the following fields:
```json
{
"refunds": [
{
"hash": "0x...",
"amount": "0x...",
"blockNumber": "0x13ddaa4",
"status": "pending",
"recipient": "0x..."
},
...
],
"nextCursor": "0x..."
"indexedUpTo": "0x..."
}
```
The `"refunds"` field contains an array of per-order fee refunds, each with the following fields:
- `hash`: the bundle hash that generated delayed refund
- `amount`: the amount of the delayed refund, in wei
- `blockNumber`: the block number the order was contained in
- `status`: the status of the delayed refund, either "pending" or "received"
- `recipient`: the address the delayed refund is credited to
The `"cursor"` field is only included if there are more delayed refunds to fetch, some data might be avaiable in the future. To continue fetching, include the cursor as the second argument in the next request. If response is empty but contains cursor retry later.
`"indexedUpTo"` contains maximum block number for which delayed refunds are indexed
### buildernet_getDelayedRefundTotalsByRecipient
The `buildernet_getDelayedRefundTotalsByRecipient` JSON-RPC method returns the total amount of delayed refunds that have been earned by a specific address.
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "buildernet_getDelayedRefundTotalsByRecipient",
"params": [{
recipient, // String, the address to query for delayed refunds
blockRangeFrom, // [optional] String, hex-encoded block number for the start of the range (inclusive)
blockRangeTo, // [optional] String, hex-encoded block number for the end of the range (inclusive)
}]
}
```
The response contains three fields:
```json
{
"pending":"0x17812ea4fbbe314",
"received":"0x108d1b27b63a213",
"indexedUpTo":"0x13ddb08"
}
```
- `pending`: the total amount of fee refunds that have been earned but not yet received by the recipient
- `received`: the total amount of fee refunds that have been received by the recipient
- `indexedUpTo`: the highest block number for which delayed refunds have been processed
### flashbots_getMevRefundTotalByRecipient
Returns the total amount of [MEV refunds](/flashbots-protect/mev-refunds) that have been paid to a specific recipient address. This API not require authentication.
#### Request
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "flashbots_getMevRefundTotalByRecipient",
"params": ["0xDCDDAE87EDF1D9F62AE2F3A66EB2018ACD0B2508"]
}
```
#### Response
```json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"total": "0xeff5f44e097dcfac"
}
}
```
Note: The total is returned as a hexadecimal string representing the amount in wei.
### flashbots_getMevRefundTotalBySender
Returns the total amount of [MEV refunds](/flashbots-protect/mev-refunds) that have been generated on transactions or bundles from a specific sender address. The sender is the `tx.origin` for individual transactions or bundles of size 1, or the Flashbots signer for bundles of size > 1. It may be different from the recipient if the recipient has been delegated to another address.
This API does not require authentication.
#### Request
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "flashbots_getMevRefundTotalBySender",
"params": ["0xDCDDAE87EDF1D9F62AE2F3A66EB2018ACD0B2508"]
}
```
#### Response
```json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"total": "0x4a817c800"
}
}
```
### API Response
- All method supports JSON-RPC standards for success response and not supported for error response(V2 methods are exceptions).
- V2 methods supports JSON-RPC standards for both success and error response.
### Authentication
To authenticate your request, Flashbots endpoints require you to sign the payload and include the signed payload in the `X-Flashbots-Signature` header of your request.
```curl
curl -X POST -H "Content-Type: application/json" -H "X-Flashbots-Signature: <public key address>:<signature>" --data '{"jsonrpc":"2.0","method":"eth_sendBundle","params":[{see above}],"id":1}' https://relay.flashbots.net
```
Any valid ECDSA-secp256k1 key, like an arbitrary Ethereum key, can be used to sign the payload. The address associated with this key will be used by Flashbots to keep track of your [reputation](/flashbots-auction/advanced/reputation) over time and provide user statistics. You can change the key you use at any time.
The signature is calculated by taking the [EIP-191](https://eips.ethereum.org/EIPS/eip-191) hash of the json body encoded as UTF-8 bytes. Here's an example using ethers.js:
<Tabs
defaultValue="ethers.js"
values={[
{ label: 'ethers.js', value: 'ethers.js', },
{ label: 'web3.py', value: 'web3.py' },
{ label: 'go', value: 'go' },
]}
>
<TabItem value="ethers.js">
```ts
import {Wallet, id} from 'ethers';
const privateKey = '0x1234';
const wallet = new Wallet(privateKey);
const body =
'{"jsonrpc":"2.0","method":"eth_sendBundle","params":[{see above}],"id":1}';
const signature = wallet.address + ':' + wallet.signMessage(id(body));
```
</TabItem>
<TabItem value="web3.py">
```py
from web3 import Web3
from eth_account import Account, messages
body = '{"jsonrpc":"2.0","method":"eth_sendBundle","params":[{see above}],"id":1}'
message = messages.encode_defunct(text=Web3.keccak(text=body).hex())
signature = Account.from_key(private_key).address + ':' + Account.sign_message(message, private_key).signature.hex()
```
</TabItem>
<TabItem value="go">
```go
body := `{"jsonrpc":"2.0","method":"eth_sendBundle","params":[{see above}],"id":1}`
hashedBody := crypto.Keccak256Hash([]byte(body)).Hex()
sig, err := crypto.Sign(accounts.TextHash([]byte(hashedBody)), privKey)
signature := crypto.PubkeyToAddress(privKey.PublicKey).Hex() + ":" + hexutil.Encode(sig)
```
</TabItem>
</Tabs>
================================================
FILE: docs/flashbots-auction/advanced/testnets.mdx
================================================
---
title: Testnets
---
Flashbots operates on Sepolia so that searchers can test Flashbots without risking real funds.
## Bundle Relay URLS
| Network | URL |
| --- | --- |
| Mainnet | `https://relay.flashbots.net` |
| Sepolia | `https://relay-sepolia.flashbots.net` |
## Examples
Here's how to setup the Flashbots Bundle Provider in Ethers to use Goerli or Sepolia:
```js
const provider = new ethers.getDefaultProvider("goerli");
// uncomment the line below to use Sepolia
// const provider = new ethers.getDefaultProvider("sepolia");
const authSigner = new ethers.Wallet(
'0x2000000000000000000000000000000000000000000000000000000000000000',
provider
);
const flashbotsProvider = await flashbots.FlashbotsBundleProvider.create(
provider,
authSigner,
// use "https://relay-sepolia.flashbots.net" for Sepolia
"https://relay-goerli.flashbots.net",
"goerli"
);
```
Sending bundles works the same as sending bundles on the mainnet. For example this will simulate a bundle and if it is successful then send a batch of 10:
```js
const wallet = new ethers.Wallet(SOME_PRIVATE_KEY);
const signedTransactions = await flashbotsProvider.signBundle([
{
signer: wallet,
transaction: {
to: "0xf1a54b075fb71768ac31b33fd7c61ad8f9f7dd18",
gasPrice: 10,
gasLimit: 21000,
chainId: 5,
value: 0,
},
},
{
signer: wallet,
transaction: {
to: "0xf1a54b075fb71768ac31b33fd7c61ad8f9f7dd18",
gasPrice: 10,
gasLimit: 21000,
chainId: 5,
value: 0,
},
},
]);
const blockNumber = await provider.getBlockNumber();
console.log(new Date());
const simulation = await flashbotsProvider.simulate(
signedTransactions,
blockNumber + 1
);
console.log(new Date());
// Using TypeScript discrimination
if ("error" in simulation) {
console.log(`Simulation Error: ${simulation.error.message}`);
} else {
console.log(
`Simulation Success: ${blockNumber} ${JSON.stringify(
simulation,
null,
2
)}`
);
}
console.log(signedTransactions);
for (var i = 1; i <= 10; i++) {
const bundleSubmission = flashbotsProvider.sendRawBundle(
signedTransactions,
blockNumber + i
);
console.log("submitted for block # ", blockNumber + i);
}
console.log("bundles submitted");
```
The reason why we submit bundles for the next 10 blocks is because Flashbots only runs a small portion of the validators on Goerli. We are more likely to have a bundle included if we submit bundles for several blocks into the future.
================================================
FILE: docs/flashbots-auction/advanced/troubleshooting.mdx
================================================
---
title: Bundle Inclusion Troubleshooting
---
## How to troubleshoot your Flashbots bundle not landing on-chain
Unlike broadcasting a transaction which lands on-chain even if the transaction fails, troubleshooting Flashbots bundles is considerably more challenging, since any of the following circumstances will prevent your bundle from landing on chain:
```
1. Any transaction failure within the bundle that isn't specified in the optional argument `revertingTxHashes`
2. Insufficient incentives (the sum of gas price and coinbase transfers) to compensate for the value of block space
3. Higher bids from competitors for the same opportunity
4. Late receipt of the bundle, preventing its inclusion in the target block
5. The validator for the target slot is not running mev-boost
```
Instead of relying on [Etherscan](https://etherscan.io) to examine the execution of your transaction, its on-chain status, and its comparison with competitors, you'll need a different approach with Flashbots. This is because Flashbots prevents failed transactions from appearing on the chain. For effective debugging, we highly recommend simulating your transactions, logging the results, and maintaining a record of all submitted data, including the complete bundle and its signed transactions. If you are a TEE searcher, you will receive logs with full transaction information at a 5 minute delay to help with troubleshooting and debugging.
The issues listed above are arranged in the order of their priority for consideration. In the following sections, we will explore each issue in detail, providing guidance on how to identify and address them. While the examples provided assume the use of the [Flashbots Ethers Provider](https://github.com/flashbots/ethers-provider-flashbots-bundle), the [RPC calls are standard](/flashbots-auction/advanced/rpc-endpoint) and the suggested strategies can be easily adapted for use with [other providers](/flashbots-auction/libraries/golang).
## Does your transaction work and pay enough?
Covers:
```
1. Transaction failure (ANY within the bundle)
2. Incentives (gas price/coinbase transfers) not high enough to offset value of block space
```
The first two issues are grouped together as their causes, investigations, and solutions are closely related. Flashbots will not include a bundle if:
1. A transaction within the bundle reverts, unless it's specified via the [optional argument `revertingTxHashes`](/flashbots-auction/advanced/rpc-endpoint#eth_sendbundle) or it's uncled.
2. The [gas price is below the base fee](/flashbots-auction/advanced/eip1559#faq), as this would result in an invalid block if included.
3. The effective priority fee is not sufficient to offset the opportunity cost of using the block space for other unrelated transactions. For instance, if your bundle is paying a 1 Gwei priority fee, but the cheapest transaction in the block is paying 2 Gwei, the builder would benefit more from discarding your bundle in favor of standard pending transactions.
As any of these conditions result in your bundle not appearing in a block, troubleshooting these issues requires _simulation_ using `eth_callBundle` RPC call. `eth_callBundle` is similar to an `eth_call` you might already be familiar with, but offers these key benefits:
1. It operates on an array of _signed_ transactions, as opposed to a single unsigned transaction description. These transactions are executed sequentially, starting from the top of the specified block. Simulating with signed transactions minimizes discrepancies between how your system creates transactions and how they will be processed on-chain. For instance, it eliminates the possibility of using an incorrect `from` field when simulating a signed transaction.
2. It provides the gas used and the coinbase transfer for each transaction. The coinbase transfer is a factor in the effective gas price calculation.
3. It allows for the precise specification of the following arguments, enabling a more accurate simulation:
- State block number: This determines the values read from SLOADs.
- EVM block number: This determines the value returned from `block.number`.
- EVM timestamp: This determines the value returned from `block.timestamp`.
The Flashbots ethers.js provider exposes `eth_callBundle` via the [simulate() method](https://github.com/flashbots/ethers-provider-flashbots-bundle#simulate-and-send). This only operates on a pre-signed bundle, so you must sign your bundle transactions manually.
```js
const signedTransactions =
await flashbotsProvider.signBundle(transactionBundle);
const simulation = await flashbotsProvider.simulate(
signedTransactions,
targetBlockNumber,
targetBlockNumber + 1,
);
console.log(JSON.stringify(simulation, null, 2));
```
Output:
```js
{
"totalGasUsed": 98564,
"bundleHash": "0x9a6a9fa038343fe3c57260fb7bdb2c79ebadb3088656300d8a494123ebda6d85",
"coinbaseDiff": BigNumber(0x034dc9949767a4),
},
"results": [
{
"coinbaseDiff": "929953106847652",
"ethSentToCoinbase": "0",
"fromAddress": "0x9874Ef8519a0Fc7a6B553aad92fDF0E469488931",
"gasFees": "929953106847652",
"gasPrice": "35008022393",
"gasUsed": 29964,
"toAddress": "0x48B2dD9CEFbA73c60882478a16BC3428Aceed2B9",
"txHash": "0xee3f6f22bf3b4740b36833d41d4872f48f98c6328fa04b3679558e482ba0e328",
"value": "0x0000000000000000000000000000000000000000000000000000000000000001"
},
...
],
}
```
To resolve, ensure the response from `eth_callBundle` does not revert and matches your expectations for bundle profitability. Compare your bundle's effective gas price against the profit of the conflicting bundle.
## Is your bundle paying enough to be competitive?
Covers:
```
3. Competitors paying more
```
[Flashbots bundles adhere to a "blind" auction](/flashbots-auction/overview), where bundle pricing is not released by Flashbots prior to landing on-chain. The winning "bids" are revealed _only_ after the block containing winning bundles is propagated.
While you cannot see a competitor's bid in real time, it is possible to look onchain AFTER the fact to:
1. Identify the exact bundle (if any) that conflicted with yours
2. Compare the conflicting bundle's `effective priority fee` with your own (to see if you should be bidding more to remain competitive)
### Types of conflicts
There are numerous reasons why two bundles might conflict. Consider that the basic algorithm for merging bundles is:
1. Simulate each bundle at the top of the block
2. Sort bundles by `effective priority fee`, highest first
3. In descending order, try each bundle **that does not error or lower its effective priority fee from top-of-block simulation** until you reach a maximum bundle inclusion count or you run out of profitable bundles
A conflict occurs when a bundle simulates one way at the top of the block, and a different [worse] way when placed after another bundle. Here is a list of the ways a bundle could conflict:
1. **Nonce collision** - The target bundle includes a transaction from account `A` and nonce `B`. The conflicting bundle also includes a transaction from account `A` and nonce `B`. The most common case for nonce collision is from including the exact same transaction, but it doesn't have to be; the conflicting bundle only needs to increment an account's nonce via any transaction.
2. **Revert** - The target bundle has no reverting transactions when simulated at the top of the block, but reverts when placed after a conflicting bundle that appears first
3. **Effective Priority Fee** - A bundle cannot significantly reduce its priority fee between simulating at the top of the block and when it is selected for inclusion. This commonly occurs when a bundle is operating on an arbitrage for which it pays a % of the profit to the validator, with an earlier bundle taking part, but not all, of the arbitrage opportunity.
### Detecting
If a block you targeted contained Flashbots bundles, but yours did not appear, the next step is to determine which bundles conflicted with yours and, if present, calculate their `effective priority fee`. This can be accomplished through several iterations of simulations, using this strategy:
1. Simulate your bundle at the head of the target block, note its revert states and `effective priority fee`
2. Fetch all bundles found in the target block
3. Simulate [bundle1 + your bundle] as a single bundle, check the behavior of your bundle
4. Simulate [bundle1 + bundle2 + your bundle] as a single bundle, see the behavior of your bundle
5. Simulate [bundle1 + bundle2 + ...bundleN + your bundle] as a single bundle, see the behavior of your bundle
6. And so on...
Using this method, we can identify the conflicting bundle that caused your target bundle to change behavior. The `Flashbots ethers.js provider` has a built-in helper function for running this strategy called `getConflictingBundle()`:
```js
const signedTransactions =
await flashbotsProvider.signBundle(transactionBundle);
console.log(
await flashbotsProvider.getConflictingBundle(
signedTransactions,
13140328, // blockNumber
),
);
```
Output:
```js
{
"conflictType": FlashbotsBundleConflictType.NonceCollision,
"initialSimulation": {
"totalGasUsed": 205860,
"bundleHash": "0x1720ea33d96dca026dddd5689f8cad21966988348ced04e9054a0dca5d60f1d4",
"coinbaseDiff": BigNumber(0x0176750858d000),
},
"results": [...]
},
"targetBundleGasPricing": {
"gasUsed": 205860,
"txCount": 1,
"gasFeesPaidBySearcher": BigNumber(0x0176750858d000),
"priorityFeesReceivedByMiner": BigNumber(0x52efd8d80dbc24),
"ethSentToCoinbase": BigNumber.from(0x00),
"effectiveGasPriceToSearcher": BigNumber(0x77359400),
"effectivePriorityFeeToMiner": BigNumber(0x1a6734f601)
},
"conflictingBundleGasPricing": {
"gasUsed": 396462,
"txCount": 3,
"gasFeesPaidBySearcher": BigNumber(0xc4c3c97ce1bff8b4),
"priorityFeesReceivedByMiner": BigNumber(0xc4213e4d7ad82006),
"ethSentToCoinbase": BigNumber(0xc4c2663d3b804731),
"effectiveGasPriceToSearcher": BigNumber(0x410ce509aa1e),
"effectivePriorityFeeToMiner": BigNumber(0x40f2069f201d)
},
"conflictingBundle": [
{
"transaction_hash": "0x23a33038289dda1b6e722835d2b9388cb41d96d085c19ca6b71bb3e9697e6692",
"tx_index": 0,
"bundle_type": "flashbots",
"bundle_index": 0,
"block_number": 13140328,
"eoa_address": "0x38563699560e4512c7574C8cC5Cf89fd43923BcA",
"to_address": "0x000000000035B5e5ad9019092C665357240f594e",
"gas_used": 100893,
"gas_price": "0",
"coinbase_transfer": "0",
"total_miner_reward": "0"
},
...
]
}
```
:::note
Parameters with `miner` in the name are retrofitted with Flashbots block builder data to maintain backwards compatibility. This nomenclature will be changed in a future release to accurately reflect PoS Ethereum architecture.
:::
To resolve, first determine if you have an issue of competitors paying more and, if so, increase your `effective priority fee`. This can be accomplished either by paying more to the builder or validator, _or_ using less gas to accomplish the same opportunity.
If your bundles are not outbid by a conflicting bundle, check to see if your bundles are being received too late:
## Is your bundle received too late?
Covers:
```
4. Bundle received too late to appear in target block
```
Each bundle submission is designed to target a specific block number. Therefore, it's crucial to ensure that your bundle is received as promptly as possible. This allows the bundle sufficient time to:
1. Arrive at the builder
2. Undergo simulation
3. Be included in a block
4. Reach the validator through an mev-boost relay
All these steps need to be completed before the targeted block is proposed. If you're targeting `blockNumber +1`, which is common for most bundles, it's vital to deliver your bundle to your builder(s) as quickly as you can.
It's important to remember that there's a time frame for every block when your local perspective of block height is `X`, while `X+1` has already been discovered and propagated to a portion of the network, but hasn't reached your local node yet. During this period of partial propagation, submitting a bundle targeting `X+1` may seem valid from your network perspective, but could be pointless if builders have already started working on solving X+2. In rare cases, targeting the `X+1` block just before its discovery can also cause bundle failure due to insufficient time for the bundle to complete the above listed 4 steps, each of which takes around 1-2 seconds.
To monitor the time taken from the submission of your bundle to the Flashbots and the proposal of the next block, Flashbots provides an RPC endpoint `eth_getBundleStats`. This endpoint returns timing information based on a previously-submitted bundle. Each submitted bundle is uniquely identified by a bundleHash and target block number for future reference. The bundleHash is straightforward to calculate, as shown [here](https://github.com/flashbots/ethers-provider-flashbots-bundle/blob/0d404bb041b82c12789bd62b18e218304a095b6f/src/index.ts#L266-L269).
```js
console.log(
await flashbotsProvider.getBundleStats(
"0x123456789abcdef123456789abcdef123456789abcdef123456789abcdef1234",
13509887,
),
);
```
Output:
```json
{
"isSimulated": true,
"isSentToMiners": true,
"isHighPriority": true,
"simulatedAt": "2021-10-29T04:00:50.526Z",
"submittedAt": "2021-10-29T04:00:50.472Z",
"sentToMinersAt": "2021-10-29T04:00:50.546Z"
}
```
:::note
Parameters with `miner` in the name are retrofitted with Flashbots block builder data to maintain backwards compatibility. This nomenclature will be changed in a future release to accurately reflect PoS Ethereum architecture.
:::
Analyze the timestamps above in relation to when you observe the targeted block being propagated to your node.
- If the time difference is minimal, focus on reducing your processing time and network latency.
- If there is a significant delay between `sentToMinersAt` and when you observe the target block, proceed to the next section for further troubleshooting.
## Is the validator for a particular block/slot running mev-boost?
```
5. A validator for target slot not running mev-boost
```
mev-boost is an opt-in system that runs alongside a validator's consensus client. Unless every validator on Ethereum runs mev-boost, some slots cannot be targeted with Flashbots. Additionally, your builder must be connected to the same relay as the proposer for the target slot.
If no blocks from a particular validator contain Flashbots bundles, it is possible your bundle was not seen by the validator who proposed the block for the target block height.
## Everything checks out, what's next?
Once you have validated the above issues are not affecting your bundle submission, consider filling out the Flashbots searcher support form:
[Fill out our Searcher Issue Reporting Form](https://flashbots.notion.site/Searcher-Issue-Reporting-Form-700a5ff3843a443c993912099b4c1b56)
Be sure to include the output from the above RPC calls:
- eth_callBundle / simulate
- eth_getBundleStats
- getConflictingBundle
in the form submission.
================================================
FILE: docs/flashbots-auction/advanced/understanding-bundles.mdx
================================================
---
title: Understanding Bundles
---
Searchers use Flashbots to submit bundles to block builders for inclusion in blocks. Bundles are one or more transactions that are grouped together and executed in the order they are provided. In addition to the searcher's transaction(s) a bundle can also potentially contain other users' pending transactions from the mempool, and bundles can target specific blocks for inclusion as well. Here's an example:
```js
const blockNumber = await provider.getBlockNumber()
const minTimestamp = (await provider.getBlock(blockNumber)).timestamp
const maxTimestamp = minTimestamp + 120
const signedBundle = flashbotsProvider.signBundle(
[
{
signedTransaction: SIGNED_ORACLE_UPDATE_FROM_PENDING_POOL // serialized signed transaction hex
},
{
signer: wallet, // ethers signer
transaction: transaction // ethers populated transaction object
}
])
const bundleReceipt = await flashbotsProvider.sendRawBundle(
signedBundle, // bundle we signed above
targetBlockNumber, // block number at which this bundle is valid
{
minTimestamp, // optional minimum timestamp at which this bundle is valid (inclusive)
maxTimestamp, // optional maximum timestamp at which this bundle is valid (inclusive)
revertingTxHashes: [tx1, tx2] // optional list of transaction hashes allowed to revert. Without specifying here, any revert invalidates the entire bundle.
})
```
In the above example we've constructed a bundle that includes our transaction (transaction) and a transaction from the mempool: SIGNED_ORACLE_UPDATE_FROM_PENDING_POOL.
================================================
FILE: docs/flashbots-auction/example-searchers/searcher-minter.md
================================================
---
title: Searcher Minter
---
searcher-minter is a repository that contains a very simple demo application which allows arbitrary submission of a single transaction to Flashbots. This could be used for many simple purposes, but in the demonstration, the goal was to mint an NFT.
You can find a walkthrough of Flashbots and the creation of this NFT minting bot here: [Using Flashbots to Mint NFTs on Ethereum - Part 1](https://www.youtube.com/watch?v=1ve1YIpDs_I)
Access the searcher-minter repository [here](https://github.com/flashbots/searcher-minter)
================================================
FILE: docs/flashbots-auction/example-searchers/searcher-sponsored-tx.md
================================================
---
title: Searcher Sponsored TX
---
searcher-sponsored-tx contains a simple Flashbots "searcher" for submitting a transaction from an executor account, but paying for the transaction from a sponsor account. This is accomplished by submitting a Flashbots transaction bundle, with the first "sponsor" transaction paying the "executor" wallet in ETH, followed by a series of executor transactions that spend this newly received ETH on gas fees.
We hope you will use this repository as an example of how to integrate Flashbots into your own searcher bot. Access the searcher-sponsored-tx repo [here](https://github.com/flashbots/searcher-sponsored-tx).
================================================
FILE: docs/flashbots-auction/example-searchers/simple-arbitrage-bot.md
================================================
---
title: Simple Arbitrage Bot
---
simple-arbitrage is a repository that contains a simple, mechanical system for discovering, evaluating, rating, and submitting arbitrage opportunities to the Flashbots bundle endpoint. Please note that this is **very unlikely to be profitable, as many users have access to it, and it is targeting well-known Ethereum opportunities.**
We hope you will use the simple repository as an example of how to integrate Flashbots into your own Flashbot searcher (bot). Access the simple-arbitrage repository [here](https://github.com/flashbots/simple-arbitrage).
================================================
FILE: docs/flashbots-auction/example-searchers/synthetix-searcher.md
================================================
---
title: Synthetix Searcher
---
This repo by [Bert Miller](https://twitter.com/bertcmiller) contains a searcher developed to take advantage of a 1 off MEV opportunity created by the Synthetix team deprecating their ETH collateral trial program. As a result of this there were many loans that would be liquidatable after the governance proposal was executed. Taking advantage of this required a bot that could backrun the governance proposal execution transaction from the mempool as well as monitoring and execution infrastructure - all of which is contained here.
An accompanying blog post talking through the process of writing this bot and its strategy can be found [on Bert Miller's website](https://bertcmiller.com/2021/09/05/mev-synthetix.html). This is highly recommended to understand the thought process and design decisions behind this repo.
Access the [synthetix searcher repository here](https://github.com/bertmiller/sMEV).
================================================
FILE: docs/flashbots-auction/faq.md
================================================
---
title: FAQ
---
The FAQ has been moved to the [Flashbots Collective Forum](https://collective.flashbots.net/).
If your question hasn't already been answered there, please feel free to post a new question in one of the forum's Self Support Groups.
================================================
FILE: docs/flashbots-auction/libraries/alchemyprovider.md
================================================
---
title: Alchemy Provider
---
The Alchemy SDK makes getting started, shipping builds, and accessing support faster and more streamlined. For instance, it provides high-level access to the `eth_sendPrivateTransaction` and `eth_cancelPrivateTransaction` RPC endpoints.
Benefits of the Alchemy SDK include providing:
**1. Automatic management of your Flashbots reputation** - the SDK takes on the work of actively, and manually, managing your reputation. Learn more about reputation [here](/flashbots-auction/advanced/reputation#querying-reputation)
**2. A superset of the ethers.js Provider library plus the suite of Alchemy APIs** - the Alchemy Provider exposes all Flashbots JSON-RPC endpoints. The Flashbots API can be used natively with the core EVM APIs as well as the suite of Alchemy APIs
**3. Webhook based notifications on [included and dropped private transactions](https://docs.alchemy.com/docs/alchemy-notify#features)**
To get started:
* [https://www.alchemy.com/sdk](https://www.alchemy.com/sdk)
* [https://docs.alchemy.com/reference/sendprivatetransaction-sdk-v3](https://docs.alchemy.com/reference/sendprivatetransaction-sdk-v3)
* [https://github.com/alchemyplatform/alchemy-sdk-js](https://github.com/alchemyplatform/alchemy-sdk-js)
================================================
FILE: docs/flashbots-auction/libraries/bundle-relay.md
================================================
---
title: Bundle Relay Clients
---
The following clients connect to the Bundle Relay API, which exposes [these JSON-RPC methods](/docs/flashbots-auction/advanced/rpc-endpoint.mdx).
- [ethers-js](/docs/flashbots-auction/libraries/ethers-js-provider.md)
- [golang](/docs/flashbots-auction/libraries/golang.md)
- [web3.py](/docs/flashbots-auction/libraries/web3py-provider.md)
- [Alchemy API](/docs/flashbots-auction/libraries/alchemyprovider.md)
MEV-Share endpoints (e.g. `mev_sendBundle`) are implemented in [their own libraries](/docs/flashbots-auction/libraries/mev-share-clients.md).
================================================
FILE: docs/flashbots-auction/libraries/ethers-js-provider.md
================================================
---
title: Ethers.js Provider
---
ethers-provider-flashbots-bundle is a repository that contains the `FlashbotsBundleProvider` ethers.js provider to provide high-level access to the `eth_sendBundle` rpc endpoint.
Flashbots exposes new json-rpc endpoints such as `eth_sendBundle` and `eth_callBundle`. Since these are non-standard endpoints, ethers.js and other libraries do not natively support these requests (like `getTransactionCount`). In order to interact with these endpoints, you will also need access to another full-featured (non-Flashbots) endpoint for nonce-calculation, gas estimation, and transaction status.
This library is not a fully functional ethers.js implementation, just a simple provider class, designed to interact with your existing ethers.js v5 module.
Access the ethers-provider-flashbots-bundle repository [here](https://github.com/flashbots/ethers-provider-flashbots-bundle).
================================================
FILE: docs/flashbots-auction/libraries/golang.md
================================================
---
title: Golang Provider
---
_These libraries are provided and maintained by third-parties rather than Flashbots. Please exercise caution._
The Golang libraries provide high-level access to the `eth_sendBundle` and `eth_callBundle` RPC endpoints on the Flashbots builder.
Flashbots exposes several specialized JSON-RPC endpoints, such as [`eth_sendBundle`](/flashbots-auction/advanced/rpc-endpoint/#eth_sendbundle) and [`eth_callBundle`](/flashbots-auction/advanced/rpc-endpoint/#eth_callbundle). Since these are non-standard endpoints, ethers.js and other libraries do not natively support these requests (like `getTransactionCount`).
Golang libraries:
* [github.com/metachris/flashbotsrpc](https://github.com/metachris/flashbotsrpc)
* [github.com/cryptoriums/flashbot](https://github.com/cryptoriums/flashbot)
================================================
FILE: docs/flashbots-auction/libraries/mev-share-clients.md
================================================
---
title: MEV-Share Clients
---
* [mev-share-client-ts](https://github.com/flashbots/mev-share-client-ts)
* [mev-share-rs](https://github.com/paradigmxyz/mev-share-rs)
* [mev-share-go](https://github.com/duoxehyon/mev-share-go)
* [mev-share-java](https://github.com/optimism-java/mev-share-java)
* [mev-share-py](https://github.com/ZigaMr/mev-share-py)
> :eyes: If you want to write a MEV-Share client for another language, please [reach out](/flashbots-mev-share/searchers/tutorials/limit-order/more-resources). We love client diversity!
================================================
FILE: docs/flashbots-auction/libraries/rust-provider.md
================================================
---
title: Rust Provider
---
Ethers-flashbots is a robust and user-friendly Rust library for interacting with flashbots.
By using this library, you can easily access the flashbots endpoints and send bundles of transactions with little effort from you favorite language.
This library is built on [ethers-rs,](https://github.com/gakonst/ethers-rs) which is a port of the popular ethers.js library, and it provides a convenient middleware layer for integrating with ethers-rs.
With ethers-flashbots, you can quickly and easily automate your trading activities on DEXs, allowing you to take advantage of market opportunities and maximize your profits. To learn more about ethers-flashbots and its features, visit the library's repository [here.](https://github.com/onbjerg/ethers-flashbots)
================================================
FILE: docs/flashbots-auction/libraries/web3py-provider.md
================================================
---
title: Web3.py Provider
---
web3-flashbots is a repository containing a library that works by injecting a new module in the web3.py instance, which can submit "bundles" of transactions to block builders. This is done by creating
a middleware which captures calls to `eth_sendBundle` and `eth_callBundle`, and sends
them to an RPC endpoint which you have specified, which corresponds your preferred block builder.
To apply correct headers, we use FlashbotProvider which injects the correct header on post.
Access the web3-flashbots repository [here](https://github.com/flashbots/web3-flashbots).
================================================
FILE: docs/flashbots-auction/other-resources.md
================================================
---
title: Other Resources
---
Remember you can ask any questions in the [#🐣newcomers or #🤖searchers](https://discord.com/invite/7hvTycdNcK) channel on our Discord, or in one of the Self Support Groups on [our forum](https://collective.flashbots.net/).
Below are a list of useful resources for searchers to wrap their heads around running Flashbots:
* [Walking through simple-arbitrage](https://www.youtube.com/watch?v=wn8r674U1B4) by Robert Miller
* [Finding & Capturing MEV 101](https://www.youtube.com/watch?v=70WtsHtFd8Y) by thegostep & Robert Miller
* [Using Flashbots to Mint NFTs on Ethereum - Part 1](https://youtu.be/1ve1YIpDs_I) by Scott Bigelow
* [Anatomy of an MEV Strategy: Synthetix](https://www.bertcmiller.com/2021/09/05/mev-synthetix.html) by Robert Miller
* [A thread of all of Robert's MEV-related twitter threads](https://twitter.com/bertcmiller/status/1402665992422047747?s=20) by Robert Miller
* [Flashbots: MEV Of The Week thread](https://twitter.com/epheph/status/1357089176898969600?s=20) by Scott Bigelow
* [Lost ENS sanctuary using Flashbots](https://twitter.com/andrekorol1/status/1358252320207876104?s=19) by Andre Korol 🔥
================================================
FILE: docs/flashbots-auction/overview.mdx
================================================
---
title: Overview
---
Flashbots Auction is a permissionless, transparent, and fair ecosystem for efficient MEV extraction and frontrunning protection which preserves the ideals of Ethereum. Flashbots Auction provides a private communication channel between Ethereum users and validators for efficiently communicating preferred transaction order within a block.
Flashbots Auction started with [mev-geth](https://github.com/flashbots/mev-geth), a patch on top of the go-ethereum client, along with the [mev-relay](https://github.com/flashbots/mev-relay-js), a transaction bundle relayer.
In PoS Ethereum, the Flashbots Auction is built on [mev-boost](https://boost.flashbots.net/), an implementation of proposer-builder separation for Ethereum.
## Why Flashbots Auction?
Throughout the second half of 2020 and beginning of 2021, a spike in Ethereum usage has revealed a set of negative externalities brought by MEV. These include network congestion (i.e. p2p network load) and chain congestion (i.e. block space usage) caused by inefficient communication between PGA bot operators and (PoW) miners for transaction order preference. These negative externalities create a deadweight loss which is shouldered by regular Ethereum users though high gas price volatility and artificially scarce blockspace.
The extraction of MEV introduces an existential threat to Ethereum's consensus security. This is primarily due to the potential for chain history re-org to extract past MEV, known as [time-bandit attacks](https://arxiv.org/pdf/1904.05234.pdf), and the centralization of transaction routing for the benefits of privacy, low latency, and control over transaction order. These factors critically undermine Ethereum's foundational principles of finality and permissionlessness, posing a serious risk to its very existence.
We've noted with deep concern about the rise of exclusive transaction routing infrastructures that could undermine Ethereum's neutrality, transparency, decentralization, and fairness. As a response, Flashbots Auction is built as an open-sourced, democratic, and credibly neutral alternative, designed to counter these existential threats and risks.
## Timeline
- July 2020: Formation of MEV-Ship Research Collective.
- November 2020: Formation of Flashbots Research Organization and proposal of [Flashbots Auction architecture](https://ethresear.ch/t/flashbots-frontrunning-the-mev-crisis/8251).
- January 2021: Flashbots Auction Alpha (v0.1) made available for miners and searchers to adopt.
- May 2021: Flashbots Auction Alpha (v0.2) made available for miners and searchers to adopt.
- August 2021: Flashbots Auction Alpha (v0.3) made available for miners and searchers to adopt.
- September 2021: Flashbots Auction Alpha (v0.4) made available for miners and searchers to adopt.
- February 2022: Flashbots Auction Alpha (v0.5) made available for miners and searchers to adopt.
- February, 2022: Flashbots Auction Alpha (v0.6) made available for miners and searchers to adopt.
## How does it work?
Flashbots Auction provides a private transaction pool and a sealed bid blockspace auction mechanism. This enables block proposers (validators; previously "miners" in PoW) to trustlessly outsource the task of finding the optimal block construction.
In the standard Ethereum transaction pool, users broadcast transactions to the public peer-to-peer network, specifying a gas price that represents their willingness to pay for each unit of computation on the Ethereum chain. Block builders receive these transactions, sort them by gas price, and employ a greedy algorithm to construct a block that aims to maximize the value derived from transaction fees. This mechanism is a hybrid of an [English auction](https://en.wikipedia.org/wiki/English_auction) and an [all-pay auction](https://en.wikipedia.org/wiki/All-pay_auction), where bids for blockspace are made openly, the highest bidder secures the opportunity, and all participants bear a cost.
Here are the key issues with this mechanism:
1. The open nature of the regular transaction pool leads to bidding wars for blockspace. This results in unnecessary network load and gas price volatility. It also puts less sophisticated network participants at a disadvantage, as they may lack access to advanced bidding strategies.
2. The all-pay nature of the auction results in failed bids reverting on-chain, unnecessarily consuming blockspace. This leads bidders to underprice their bids due to the risk of execution failure, creating artificial blockspace scarcity and reducing validator (previously "miner") revenues.
3. The dependency on gasPrice restricts bidders from expressing detailed ordering preferences, as they are limited to bidding for the top position in the block. This limitation encourages alternative strategies such as spamming to increase the chances of winning, thereby exacerbating the deadweight loss.
Instead, the Flashbots Auction infrastructure uses a [first-price sealed-bid auction](https://en.wikipedia.org/wiki/First-price_sealed-bid_auction) which allows users to privately communicate their bid and granular transaction order preference without paying for failed bids. This mechanism maximizes validator payoffs, while providing an efficient venue for price discovery on the value of a given MEV opportunity. Crucially, this mechanism eliminates frontrunning vulnerabilities.
## Roadmap
The Flashbots team is taking an iterative approach to decentralizing the Flashbots Auction architecture. As mentioned in our initial [ethresearch post](https://ethresear.ch/t/flashbots-frontrunning-the-mev-crisis/8251), there remain some key research questions to be answered.
The ultimate design goals include:
- **Pre-trade privacy**: Transactions are only made public after their inclusion in a block, excluding intermediaries such as relays and block builders. This means that the details of a transaction are not visible to the network until the transaction has been successfully included in a block.
- **Failed trade privacy**: Losing bids are never included in a block, thus they remain unknown to the public.
- **Efficiency**: MEV extraction is conducted without causing unnecessary network or chain congestion.
- **Bundle merging**: Multiple incoming bundles can be merged without conflict.
- **Finality protection**: Once propagated to the network, it becomes impractical to modify Flashbots blocks containing Flashbots bundles. This protects against time-bandit chain re-org attacks.
- **Complete Privacy**: This extends the concept of pre-trade privacy to all intermediaries involved in the transaction process. Not only are transactions hidden from the network until their inclusion in a block, but also intermediaries such as relays and validators are unable to view the content of transactions until they are included in the blockchain. This ensures that no party has an unfair advantage by being able to view transaction details before they are publicly available.
- **Permissionless**: This system does not rely on trusted intermediaries, thus eliminating the possibility of transaction censorship.
| Stage | PGA | DarkPool | ⚡🤖 v0.1 | ⚡🤖 v0.2 | ⚡🤖 v0.3 | ⚡🤖 v0.4 | ⚡🤖 v1.0 |
| -------------------- | :-: | :------: | :-------: | :-------: | :-------: | :-------: | :-------: |
| Pre-trade privacy | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Failed trade privacy | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Efficiency | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Bundle merging | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Finality protection | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| Complete privacy | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| Permissionless | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
## Technical Architecture
The Flashbots Auction architecture proposes a network with three distinct parties who specialize in performing a subset of the work required for sustaining this communication channel.
<div style={{textAlign: 'center'}}>

</div>
Flashbots Auction introduces a new `eth_sendBundle` RPC which standardizes the message format in the communication channel. This message is called a "Flashbots Bundle".
The bundle comprises an array of arbitrary signed Ethereum transactions, accompanied by metadata that specifies the conditions under which these transactions should be included.
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_sendBundle",
"params": [
{
txs, // Array[String], A list of signed transactions to execute in an atomic bundle
blockNumber, // String, a hex encoded block number for which this bundle is valid on
minTimestamp, // (Optional) Number, the minimum timestamp for which this bundle is valid, in seconds since the unix epoch
maxTimestamp, // (Optional) Number, the maximum timestamp for which this bundle is valid, in seconds since the unix epoch
revertingTxHashes, // (Optional) Array[String], A list of tx hashes that are allowed to revert
}
]
}
```
### Searchers
Searchers are Ethereum users who opt for the Flashbots private transaction pool over the standard p2p transaction pool. These users keep track of the chain's state and submit bundles to block builders.
Searchers typically fall into one of the following categories:
1. Ethereum bot operators seeking swift and risk-free access to blockspace, such as arbitrage and liquidation bots.
2. Ethereum users seeking protection from frontrunning for their transactions, such as Uniswap traders.
3. Ethereum Dapps that require advanced features like account abstraction or gasless transactions.
<div className="med caption-img">

Searchers create bundles with information from various sources and send them to a block builder.
</div>
Searchers submit bundles directly to block builders, bypassing the p2p network. This approach ensures `Pre-trade privacy` as the transactions remain unseen by the rest of the network until they are included in a block. Searchers express their inclusion bids through Ethereum transactions, either as a gas price or as a direct ETH transfer to the coinbase address. Opting for direct payments over gas price allows users to condition their payments on the success of their transaction, thereby eliminating the need to pay for unsuccessful bids.
See the [searcher quick-start guide](/flashbots-auction/quick-start) to learn how to get started.
### Block Builders
Block builders, often referred to as "builders", are specialized entities that receive transactions from users and searchers. Their primary role is to construct the most profitable block from these transactions. Once a block is built, it is transmitted to validators via an mev-boost relay. For a more detailed understanding of relays, refer to the [Relays](#relays) section. It's important to note that searchers can send bundles to multiple builders.
<div className="med caption-img">

Block builders construct blocks by integrating bundles from searchers and transactions from the mempool, which are submitted by regular users.
</div>
⚠️ Not all builders can be trusted ⚠️
Builders have full view of incoming transactions, which gives them the power to frontrun, censor, etc. When choosing a builder, there are a few criteria to look for:
- Do they uphold fair and unbiased execution principles?
- A reputable builder will refrain from front-running, sandwiching, or censoring bundles, and will avoid exploiting privileged data access.
- Are they connected to a reliable relay (or relays)?
- Remember that relays also have visibility of raw transactions, which could potentially enable front-running, censorship, and other manipulative practices.
- Are their relays linked to a sufficient number of validators?
- The more validators a relay is connected to, the more slots are typically available for builders linked to that relay. If you're aiming for a specific block/slot, it's crucial to send your transactions to a builder that is connected to the validator tasked with proposing a block in that slot. More validators equate to improved inclusion rates.
- Note: Any validator can [utilize mev-boost to establish connections with the Flashbots relay and other relays](https://github.com/flashbots/mev-boost#usage).
- It's also beneficial to consider the collective stake of the validators connected to a relay. Generally, if more than one block is proposed to the network (which is unusual but possible), the block with the highest collective stake attesting to it will be included. This scenario is further elaborated in the [Ethereum docs](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/#fork-choice).
Keep in mind that block builders can specialize in certain areas. Some may be more compatible with your strategy than others. While all builders are incentivized to include your bundles in their blocks due to competition, some may prioritize specific strategies over others, regardless of potential profits. Additionally, certain bundles may be censored by builders due to local regulations or corporate strategies. Given these variables, it's advisable to experiment with several reputable builders to determine which ones best suit your needs.
Learn more about the [trust assumptions of the Flashbots Auction](#trust-assumptions).
### Relays
Relays play a pivotal role as illustrated in the preceding architecture diagram. Their main responsibility is to securely store blocks received from builders and subsequently make them accessible to validators.
<div className="med caption-img">

The relay selects the most profitable block from the builders it is connected to and holds it in escrow for the validator.
</div>
In the mev-boost system, validators select the most profitable block from a variety of relays. Each relay maintains the privacy of a block's contents until the validator commits to proposing it for inclusion in the network.
Specifically, relays do the following:
- Receive new blocks from builders
- Send the header of the most profitable block to a validator upon request
- The validator secures their commitment to propose the full block by signing this header
- Send the full block to the validator after receiving the block header signed by the validator
- Execute all of these tasks swiftly and reliably to ensure validators meet proposal deadlines
For a deeper explanation of mev-boost and relays, Check out @thegostep's [ethresear.ch post](https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177).
For more information about how bundles are sent post-merge, see [this forum post](https://collective.flashbots.net/t/how-will-sending-bundles-change-in-pos-ethereum/147).
Learn more about the [trust assumptions of the Flashbots Auction](#trust-assumptions).
### Validators
In Proof of Stake (PoS) Ethereum, validators, also known as "proposers", have the crucial role of proposing new blocks to the network and appending these blocks to the blockchain. For a comprehensive understanding of validators, refer to the [Ethereum documentation](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/#validators).
<div className="med caption-img">

Validator uses mev-boost to choose the most profitable block to propose from multiple relays.
</div>
By incorporating MEV-generating transactions into their blocks, builders can increase the profitability of these blocks. Validators, in turn, can enhance their earnings by selecting these more profitable blocks via mev-boost. For a deeper understanding of mev-boost, visit [boost.flashbots.net](https://boost.flashbots.net).
Learn more about the [trust assumptions of the Flashbots Auction](#trust-assumptions).
## Trust Assumptions
The current iteration of Flashbots Auction has certain technical constraints that prevent it from operating in a completely trustless manner. Specifically, the network has yet to achieve complete privacy and permissionlessness, both of which are crucial for full decentralization.
Looking ahead, the [Flashbots Auction roadmap](#roadmap) is designed to replace these trust-based elements with cryptographic and cryptoeconomic guarantees that ensure total privacy. We encourage privacy researchers and other interested parties to review our proposed architecture and contribute to the development of a more robust and decentralized system.
================================================
FILE: docs/flashbots-auction/quick-start.mdx
================================================
---
title: Quick Start
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
This quickstart guide contains all the information necessary to get up and running as a searcher on Flashbots. If you have any questions, do not hesitate to ask in the ['#🐣 newcomers' or '#🤖 searchers' discord channels](https://discord.com/invite/7hvTycdNcK), or in the [Searcher Self-Support Forum](https://collective.flashbots.net/c/searchers/12).
See you on-chain! ⚡🤖
### Bundle Relay URLS
| Network | URL |
| ------- | ------------------------------------- |
| Mainnet | `https://relay.flashbots.net` |
| Sepolia | `https://relay-sepolia.flashbots.net` |
### Who should use Flashbots Auction?
1. Ethereum bot operators (we call them "searchers") looking for fast, and risk free access to blockspace (for example, arbitrage and liquidation bots)
2. Ethereum users looking for frontrunning protection on their transactions (for example, Uniswap traders)
3. Ethereum Dapps with advanced use cases like account abstraction or gasless transactions
### How does Flashbots work for searchers?
Flashbots provides a platform that connects searchers with validators, bypassing the public transaction pool. Searchers create 'bundles' of transactions they wish to send and forward these to block builders, such as Flashbots. The builder then simulates these bundles to ensure they won't revert and constructs a full block using the available bundles and transactions. Through the use of mev-boost and a network of relays and builders, these blocks are delivered to validators while preserving pre-trade privacy.
Getting onboarded to Flashbots is easy for searchers; you simply need to update how you send transactions.
### How to send your first Flashbots bundle
To access the Flashbots network you will need three things:
1. A unique ECDSA-secp256k1 key pair for Flashbots to identify you
2. A method to communicate with the Flashbots network
- [Alchemy](https://docs.alchemy.com/docs/how-to-send-a-private-transaction-on-ethereum?a=fb) provides a convenient way to dispatch individual transactions to Flashbots.
3. A "bundle" comprising your transactions
When you send bundles to Flashbots, they are signed with your key, which allows us to confirm your identity and accumulate your [reputation](/flashbots-auction/advanced/reputation) over time. Reputation system is set up to protect the infrastructure from attacks like DDoS. Searchers with higher reputation will have better access to the network especially during times of high congestion.
It's crucial to understand that this key **does not** manage any funds and does **not** have to be the main Ethereum key used for authenticating transactions. Its only function is to establish your identity with Flashbots. You can use any ECDSA-secp256k1 key for this purpose.
Next, you need a means to communicate with the Flashbots network. The Flashbots builder accepts bundles at `relay.flashbots.net`, and there are specific RPC endpoints that you must use to transmit transactions to us. To simplify this process, we've integrated with several widely-used developer tools such as Ethers.js and web3.py. Below are some examples of how to configure a Flashbots provider:
<Tabs
defaultValue="ethers.js"
values={[
{ label: 'ethers.js', value: 'ethers.js', },
{ label: 'web3.py', value: 'web3.py' },
{ label: 'go', value: 'go' },
{ label: 'rust', value: 'rust'},
]}
>
<TabItem value="ethers.js">
```ts
const { ethers } = require("ethers");
const {
FlashbotsBundleProvider,
} = require("@flashbots/ethers-provider-bundle");
// Standard json rpc provider directly from ethers.js. You can use Infura, Alchemy, or your own node.
const provider = new ethers.providers.JsonRpcProvider({
url: ETHEREUM_RPC_URL,
});
// `authSigner` is an Ethereum private key that does NOT store funds and is NOT your bot's primary key.
// This is an identifying key for signing payloads to establish reputation and whitelisting
const authSigner = new ethers.Wallet(
"0x0000000000000000000000000000000000000000000000000000000000000000"
);
// Flashbots provider requires passing in a standard provider and an auth signer
const flashbotsProvider = await FlashbotsBundleProvider.create(
provider,
authSigner
);
```
</TabItem>
<TabItem value="web3.py">
```python
import os
from eth_account.account import Account
from eth_account.signers.local import LocalAccount
from flashbots import flashbot
from web3 import Web3, HTTPProvider
# Create a web3 object with a standard json rpc provider, such as Infura, Alchemy, or your own node.
w3 = Web3(HTTPProvider("http://localhost:8545"))
# ETH_ACCOUNT_SIGNATURE is an Ethereum private key that does NOT store funds and is NOT your bot's primary key.
# This is an identifying key for signing payloads to establish reputation and whitelisting
ETH_ACCOUNT_SIGNATURE: LocalAccount = Account.from_key(os.environ.get("ETH_SIGNATURE_KEY"))
# Flashbots providers require both a standard provider and ETH_ACCOUNT_SIGNATURE (to establish reputation)
flashbot(w3, ETH_ACCOUNT_SIGNATURE)
```
</TabItem>
<TabItem value="go">
```go
package main
import (
"bytes"
"crypto/ecdsa"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto"
)
const (
flashbotURL = "https://relay.flashbots.net"
flashbotXHeader = "X-Flashbots-Signature"
)
var (
// authSigner is an Ethereum private key that does NOT store funds and is NOT your bot's primary key.
// This is an identifying key for signing payloads to establish reputation and whitelisting
privateKey, _ = crypto.HexToECDSA(
"2e19800fcbbf0abb7cf6d72ee7171f08943bc8e5c3568d1d7420e52136898154",
)
)
func flashbotHeader(signature []byte, privateKey *ecdsa.PrivateKey) string {
return crypto.PubkeyToAddress(privateKey.PublicKey).Hex() +
":" + hexutil.Encode(signature)
}
func main() {
// Example: create a Flashbots authenticated request
mevHTTPClient := &http.Client{
Timeout: time.Second * 3,
}
// Prepare your RPC request (e.g., eth_sendBundle, eth_callBundle, etc.)
params := map[string]interface{}{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_sendBundle", // or other Flashbots RPC methods
"params": []interface{}{ /* your bundle params */ },
}
payload, _ := json.Marshal(params)
req, _ := http.NewRequest("POST", flashbotURL, bytes.NewBuffer(payload))
// Sign the payload for Flashbots authentication
headerReady, _ := crypto.Sign(
accounts.TextHash([]byte(hexutil.Encode(crypto.Keccak256(payload)))),
privateKey,
)
req.Header.Add("content-type", "application/json")
req.Header.Add("Accept", "application/json")
req.Header.Add(flashbotXHeader, flashbotHeader(headerReady, privateKey))
resp, _ := mevHTTPClient.Do(req)
res, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(res))
}
```
</TabItem>
<TabItem value="rust">
```rust
use ethers::core::rand::thread_rng;
use ethers::prelude::*;
use ethers_flashbots::*;
use std::convert::TryFrom;
use url::Url;
#[tokio::main]
async fn main() {
// Connect to the network
let provider = Provider::<Http>::try_from("https://www.ankr.com/rpc/eth/").unwrap();
// This is your searcher identity
let bundle_signer = LocalWallet::new(&mut thread_rng());
// This signs transactions and is randomly generated in this example
let wallet = LocalWallet::new(&mut thread_rng());
// Add signer and Flashbots middleware
let flashbots_client = SignerMiddleware::new(
FlashbotsMiddleware::new(
provider,
Url::parse("https://relay.flashbots.net").unwrap(),
bundle_signer,
),
wallet,
);
}
```
</TabItem>
</Tabs>
Now that we have a private key to identify ourselves with and a Flashbots provider we can create and send a bundle. Here's how:
<Tabs
defaultValue="ethers.js"
values={[
{ label: 'ethers.js', value: 'ethers.js', },
{ label: 'rust', value: 'rust', },
]}
>
<TabItem value="ethers.js">
```js
const { ethers } = require("ethers");
const {
FlashbotsBundleProvider,
} = require("@flashbots/ethers-provider-bundle");
const provider = new ethers.providers.JsonRpcProvider({
url: ETHEREUM_RPC_URL,
});
const authSigner = new ethers.Wallet(
"0x2000000000000000000000000000000000000000000000000000000000000000"
);
const flashbotsProvider = await FlashbotsBundleProvider.create(
provider,
authSigner
);
const signedBundle = await flashbotsProvider.signBundle([
{
signer: SOME_SIGNER_TO_SEND_FROM,
transaction: SOME_TRANSACTION_TO_SEND,
},
]);
const bundleReceipt = await flashbotsProvider.sendRawBundle(
signedBundle,
TARGET_BLOCK_NUMBER
);
```
</TabItem>
<TabItem value="rust">
See https://github.com/onbjerg/ethers-flashbots
```rust
let tx = TransactionRequest::pay("vitalik.eth", 100);
let pending_tx = client.send_transaction(tx, None).await?;
// Get the receipt
let receipt = pending_tx
.await?
.ok_or_else(|| eyre::format_err!("tx not included"))?;
let tx = client.get_transaction(receipt.transaction_hash).await?;
println!("Sent transaction: {}\n", serde_json::to_string(&tx)?);
println!("Receipt: {}\n", serde_json::to_string(&receipt)?);
```
</TabItem>
</Tabs>
That's it!
### Next steps
Congrats! You should now have everything you need to start sending transactions to the Flashbots network.
- If you are looking to interact with Flashbots without using one of the libraries, check out the [RPC endpoint documentation](/flashbots-auction/advanced/rpc-endpoint) and other advanced concepts.
- For examples of advanced usage of Flashbots, check out the [example searchers](/flashbots-auction/example-searchers/simple-arbitrage-bot).
- For additional tools, check out the [searcher libraries](/flashbots-auction/libraries/ethers-js-provider).
- For potential MEV opportunities, check out the [MEV job board](https://github.com/flashbots/mev-job-board) 🤠
================================================
FILE: docs/flashbots-mev-boost/FAQ.md
================================================
---
title: FAQ
---
## Can I connect to multiple relays with MEV-Boost?
Yes. You can add multiple relays comma-separated to the `-relays` flag,
like this: `-relays https://relay1,https://relay2`
## How should I think about running `mev-boost` vs regular block construction?
The alternative to running `mev-boost` would be to get blocks from your local execution client, which can only get transactions from the public mempool and is not optimized for MEV extraction, meaning your rewards are likely to be less.
Or to implement your own builder, which is a complicated task and still leaves you with the problem of finding transactions that extract MEV and are not going through the public mempool.
## Can I check relay status when starting MEV-Boost?
Yes. The `-relay-check` flag can be called to check the status of relays, will return an error if none of the configured relays are responsive.
```bash
# Example -relay-check call:
./mev-boost -goerli -relays -relay-check https://0xafa4c6985aa049fb79dd37010438cfebeb0f2bd42b115b89dd678dab0670c1de38da0c4e9138c9290a398ecd9a0b3110@builder-relay-goerli.flashbots.net
```
## What is the difference between a beacon node, validator, and validator client?
A "**node**" or “**beacon node**” follows and reads the beacon chain. **validator clients (VC)** are specialized software that stake 32 ETH as collateral within Ethereum's **consensus layer** in order to participate in consensus duties. Validator clients are responsible for executing duties, such as proposing blocks and signing of attestations within Ethereum's proof-of-stake consensus mechanism, and will fully replace proof-of-work miners after [The Merge](https://ethereum.org/en/upgrades/merge/). **validators** most often refers to a validator client instance, but can refer to an individual that physically manages a validator client. This is an optional role in which a user posts ETH as collateral to a validator client in order to verify and attest to blocks, and seek financial returns in exchange for building and securing the protocol. This is similar to proof-of-work networks in which miners provide collateral in the form of hardware/hash-power to seek returns in exchange for building and securing the protocol. [Read more here.](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md)
## What prevents block proposers from stealing MEV from submitted builders’ blocks?
Slashing penalties. A builder provides the proposer with a "blind" execution layer header to incorporate into a block, and a "value" amount which will be transferred to the proposer once they create a block using this header. Once a proposer signs a block with a header, they are bound to this choice (or risk being slashed due to equivocation). Should a validator wish to steal MEV from a builder, they would need to sign a second block including the exploited MEV, which would result in a slashing penalty. This penalty is significant enough to discourage this behavior, allowing the builder to reveal the blinded transactions without the possibility of the proposer tampering with them, or stealing MEV. [Read more about slashing events here.](https://consensys.net/blog/codefi/rewards-and-penalties-on-ethereum-20-phase-0/)
## Does MEV-Boost have knowledge about the Beacon Chain?
No. MEV-boost has no knowledge about the beacon chain, such as which slots were proposed, etc.
================================================
FILE: docs/flashbots-mev-boost/architecture-overview/block-proposal.md
================================================
---
title: MEV-Boost Block Proposal
---

As depicted above and described in the [Builder — Honest Validator](https://github.com/ethereum/builder-specs) repository, the MEV-Boost block proposal process begins with a [registration step](https://github.com/ethereum/builder-specs) that validators must perform ahead of proposal duties. Registration ensures builders can craft blocks for a given validator’ block proposal. Once registered, validators wait until selected to propose a block. Once selected, a block proposer building a block on top of a beacon `state` in a given `slot` must take the following actions to obtain an [execution payload](https://github.com/ethereum/consensus-specs/blob/a45ee9bf5b1fde766d69e551a6b1a21fe2531734/specs/merge/beacon-chain.md#executionpayload):
1. Users/searchers send transactions to block builders through public or private peer-to-peer transaction pools.
2. Builders construct execution payloads using received transactions, and parameters the block proposer provided during registration. To process MEV payment, builders set their own address as the payload’s coinbase address and append a transaction to the [block proposers’ feeRecipient address](https://flashbots.notion.site/WIP-Builder-Payments-to-Block-Proposers-530eb36c60ad417a8702dd26da810b72) at the end of their proposed block. The block is then forwarded to relays.
3. Relays verify the validity of payloads (including amount of ETH paid to the block proposers’ feeRecipient), and send an [`ExecutionPayloadHeader`](https://github.com/ethereum/consensus-specs/blob/a45ee9bf5b1fde766d69e551a6b1a21fe2531734/specs/merge/beacon-chain.md#executionpayloadheader) (execution payloads stripped of transaction content) to MEV-Boost. MEV-boost selects the most valuable payload and forwards it to the block proposer.
4. The block proposer signs the payload and passes it back to MEV-Boost via a [`submitBlindedBlock`](https://ethereum.github.io/builder-specs/#/Builder/submitBlindedBlock) call, which is forwarded to the relay. Once the relay verifies the proposers’ signature, it responds with the full execution payload body for the validator to use when proposing a `SignedBeaconBlock` to the network.
================================================
FILE: docs/flashbots-mev-boost/architecture-overview/risks.md
================================================
---
title: MEV-Boost Risks and Considerations
---
## Liveness and Local Fallback
To prevent any risk to Ethereum **liveness,** mev-boost is implemented as a sidecar for consensus client software. Using the standard [builder specs](https://github.com/ethereum/builder-specs) ensures client diversity is maintained and validators benefit from operating in the same security model, regardless of which client is selected. Should a fault occur in the mev-boost software, the consensus nodes fall back to local block production. Check-out [understanding liveness risk](https://writings.flashbots.net/understanding-mev-boost-liveness-risks), the [circuit breaker proposal](https://hackmd.io/@ralexstokes/BJn9N6Thc), and the [relay monitor specification](https://hackmd.io/@ralexstokes/SynPJN_pq) for more information.
## Builder Centralization
A builder that dominates the market because of its outsized profitability gains the ability (although not the incentive) for censorship and access to exclusive transaction orderflow. It should be noted that MEV-boost doesn’t *create* the risk of builder centralization - MEV does. Encouraging competition between many builders is the primary mitigation to builder centralization, but it should be supported by techniques like [censorship resistance lists (crLists)](https://github.com/flashbots/mev-boost/issues/215) and others still in early research.
## Builder/Relay Collusion
Anyone can be a relay, and they will compete on reputation and service to both builders and validators. While this is a strict improvement to the trust model compared MEV extraction in PoW Ethereum, relays can still be a risk to both builders and validators. This risk will be addressed in Stage 3 PBS (enshrined), which is getting rid of the trusted relay altogether.
## Malicious Relays
Nothing prevents malicious relays from submitting fraudulent bids, which affects MEV-Boost’ profit switching logic. MEV-boost provides the bid with the highest value to the Beacon Node, but has no way of verifying that the value is indeed what is claimed in the bid. A Beacon Node will always be presented with a single bid. However, the [relay monitor specification](https://hackmd.io/@ralexstokes/SynPJN_pq) aims to detect and disqualify a malicious relay pretty quickly.
## MEV Hiding
A risk that occurs when node operators (often managing the stake of third party customers) are incentivized to hide MEV-rewards earned in a given block.
================================================
FILE: docs/flashbots-mev-boost/architecture-overview/specifications.md
================================================
---
title: MEV-Boost Specifications
---
`mev-boost` implements the latest versions of the [Ethereum Builder Specification](https://github.com/ethereum/builder-specs).
- The Builder API is a temporary solution for [Proposer-builder separation](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725)
(PBS), and aims to separate the roles of a validator into block proposing and block building. [You can interact with a rendered version of the Builder API here.](https://ethereum.github.io/builder-specs/#/Builder/status)
## Fundamental Specifications
[Ethereum Beacon APIs](https://github.com/ethereum/beacon-APIs)
- Collection of RESTful APIs exposed by a beacon node aiming to facilitate [Phase 0](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md) of Ethereum consensus.
[Consensus Specs](https://github.com/ethereum/consensus-specs)
- Current Ethereum PoS consensus specifications.
## Tooling and Related Repositories
- [MEV-Boost](https://github.com/flashbots/mev-boost)
- [MEV-Boost Relay](https://github.com/flashbots/mev-boost-relay)
- [Go Boost Utils](https://github.com/flashbots/go-boost-utils)
- [MEV-Boost Builder](https://github.com/flashbots/boost-geth-builder)
================================================
FILE: docs/flashbots-mev-boost/block-builders.md
================================================
---
title: Block Builders
---
## Builder Fundamentals
### What is a Builder?
Block builders are highly specialized actors who construct blocks from transaction orderflow (public transactions, bundles, private transactions, etc).
### The Role of Builders
Builders run algorithms and simulations (e.g. First Come First Serve, First Price Auctions, etc.) to order bundles and TXs in a block template (technically: `execution payload`) that maximizes profit. Builders then bid for and buy the validators’ blockspace, facilitated by one or more relays, so their execution payloads are proposed to the blockchain.
### How do builders pay block proposers?
Flashbots proposed a standardized specification for how payments are made from builders to block proposers through the following process:
1. The builder sets their own address as the `feeRecipient` of the payload block header they are constructing.
2. The builder includes a transaction which pays ETH to the proposer’s `feeRecipient` address at the end of their proposed block.
### Determining the value of blocks
A standard method for determining block value is crucial for multiple components of the MEV-Boost ecosystem; including relay monitoring, validator accounting, builder payments, block explorers, payment proofs, and MEV hiding.
Various methods for defining block value were [considered](https://collective.flashbots.net/t/block-scoring-for-mev-boost-relays/202) by members of the community. It was determined that block level scoring was the most simple and intuitive method for scoring block value.
### Block level scoring
Block level scoring looks at the difference in the balance of the fee recipient account before and after the block execution.
Note that a “block score” is not meant to be a formal definition of realized extractable value, since this is a difficult metric to quantify. For example, a Layer 2 transfer to a validator’ fee recipient address could be considered extractable value, but falls outside the scope of a block score calculation.
Constructing a payment proof for this scoring method requires a Merkle Proof of the fee recipient balance in block _(n - 1)_, and a Merkle Proof of the fee recipient balance in block _n_. **Payment proofs have not yet been put into production.** Active discussion about payment proof implementation is still on-going. For more details or to participate in the discussion around payment proofs and block-level scoring, please check out to the [block scoring](https://collective.flashbots.net/t/block-scoring-for-mev-boost-relays/202) forum thread.
## External Builders
External builders can submit blocks to Mainnet and Sepolia Flashbots relays. The table below outlines Builder API methods available on each network.
### Relay Block Submission Endpoints by Network
| | | Mainnet | Sepolia |
| --- | --- | --- | --- |
| `getValidators` | GET Request - Returns an array of validator registrations with assigned duties in the current and next epoch | [Mainnet](https://boost-relay.flashbots.net/relay/v1/builder/validators) | [Sepolia](https://boost-relay-sepolia.flashbots.net/relay/v1/builder/validators) |
| `submitBlock` | POST Request - submits a block to the relay | [Mainnet](https://boost-relay.flashbots.net/relay/v1/builder/blocks) | [Sepolia](https://boost-relay-sepolia.flashbots.net/relay/v1/builder/blocks) |
- See also the [Relay API documentation - Block Builder API](https://bit.ly/3BmGZ3T) for more details on the API and payloads.
- The example [Flashbots builder implementation](https://github.com/flashbots/boost-geth-builder) is a good external builder reference, and is currently used in production by several builders.
### Rate-limits
Submissions to all relays are currently rate-limited to 600 submissions / 5m / IP, which translates to in average 2 submissions / sec /IP.
## BuilderNet Block Builders
The keys used in BuilderNet are listed here: https://buildernet.org/docs/public-identity#bls-keys-for-submitting-blocks-to-mev-boost-relays
## Additional Links & References
- [rbuilder](https://github.com/flashbots/rbuilder) - Blazingly fast, cutting edge block builder written in Rust.
- [Relay API documentation - Block Builder API](https://bit.ly/3BmGZ3T)
- Block Builder Self-Help Group: [https://collective.flashbots.net/c/builders/14](https://collective.flashbots.net/c/builders/14)
- Github issue about becoming block builder: [https://github.com/flashbots/mev-boost/issues/145](https://github.com/flashbots/mev-boost/issues/145).
- [Mevboost.pics](https://www.mevboost.pics/) - Tracking MEV-Boost relays and block builders, by [Toni Wahrstätter](https://twitter.com/nero_eth).
- [Relayscan.io](https://www.relayscan.io/) - Up-to-date stats on the MEV-Boost ecosystem, by [Chris Hager](https://twitter.com/metachris).
_Note: Flashbots does not control and cannot verify the data coming from external people and organizations. Please direct questions or issues directly to the creators of external data sources._
================================================
FILE: docs/flashbots-mev-boost/block-proposers.md
================================================
---
title: Block Proposers
---
## What is a Block Proposer?
A block proposer is a validator that has been pseudorandomly selected to build a block for a given slot in an epoch (there are 32 slots per epoch). Proposers are selected from the validator set using the standard RANDAO mechanism.
Validators not pseudo-randomly assigned to propose blocks are assigned to attest, or vote on block proposals. These assignments are known 2 epochs in advance for attesters and 1 for proposers. The block in each slot will have a single validator serving as the proposer and many validators serving as the attesters to all information in that block. Attesters get rewarded for accurately voting on current values of 3 aspects of the beacon chain: the head of the chain (LMD Ghost), the justified checkpoint and the finalized checkpoint (Casper FFG).
## The Role of Block Proposers
Without MEV-Boost, the original role of block proposers consisted of two jobs:
(1) **building** the best block from all available transactions, and
(2) **proposing** this block to the PoS network.
With MEV-Boost, the role of validator is simplified to **proposal** duties only, and consists of the following:
- Receive a block from their local execution client, i.e. their local block builder, and sign / ‘propose’ it, or
- Receive an execution payload header from one or more relays and blindly sign a block without seeing the underlying execution payload (i.e. the blinded TXs escrowed by the relay).
The Ethereum [consensus-specs](https://github.com/ethereum/consensus-specs) have well defined expectations of honest validators, the most recent standard is the [Bellatrix -- Honest Validator](https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/validator.md#bellatrix----honest-validator) specification.
================================================
FILE: docs/flashbots-mev-boost/contributing.md
================================================
---
title: Contributing
---
[Flashbots](https://flashbots.net/) is a research and development collective working on mitigating the negative externalities of decentralized economies. We contribute with the larger free software community to illuminate the dark forest.
You are welcome here \<3.
- If you would like to contribute with code, check the [CONTRIBUTING file](https://github.com/flashbots/mev-boost/blob/develop/CONTRIBUTING.md) for further information.
- Please be kind and read our [code of conduct](https://github.com/flashbots/mev-boost/blob/develop/CODE_OF_CONDUCT.md).
### Report a Vulnerability
If you find a security vulnerability on this, or any other initiative related to Flashbots, please let us know by sending an email to [security@flashbots.net](mailto:security@flashbots.net).
### Report an Issue
If you have a questions, feedback, bugs to report, or other topics top of mind, please [open a new Issue](https://github.com/flashbots/mev-boost/issues).
### Propose New Features
Please [open an issue](https://github.com/flashbots/mev-boost/issues) with ideas for new features, we’d love to hear from you! Additionally, you can explore [open questions](https://github.com/flashbots/mev-boost/wiki/Research#open-questions) the Flashbots research team is tackling now.
================================================
FILE: docs/flashbots-mev-boost/getting-started/installation.md
================================================
---
title: Installation
---
Get started with MEV-Boost installation with this guide. Whether you are looking to install it on a machine with the beacon client or multiple beacon clients, this guide will assist you in setting it up smoothly.
## Prerequisites
- For a comprehensive guide on preparing for the merge, refer to [Rémy Roy's guide](https://github.com/remyroy/ethstaker/blob/main/prepare-for-the-merge.md#installing-mev-boost).
- Ensure you have [Go 1.18+](https://go.dev/doc/install) installed for source-based installations.
## Installation Methods
### Using Binaries
For convenience, each release includes binaries suitable for Linux, Windows, and macOS (both amd and arm). Find the latest releases [here](https://github.com/flashbots/mev-boost/releases).
### From Source
#### Build and install with `go install`
The easiest way to build and install MEV-Boost from sources is to use `go install`. You can simply execute the `go install` command as shown below:
```bash
go install github.com/flashbots/mev-boost@latest
mev-boost -help
```
This would install the latest version of MEV-Boost in your `$GOPATH/bin` directory. You can then run the `mev-boost` command from anywhere in your terminal.
If you want to install a specific version, you can use the `@` syntax:
```bash
go install github.com/flashbots/mev-boost@VERSION
```
Simply look up the specific version you want to install in the [releases](https://github.com/flashbots/mev-boost/releases) page.
#### Clone and Build
You can also clone the repository and build the software yourself without using `go install`.
1. Clone the repository:
```bash
git clone https://github.com/flashbots/mev-boost.git
cd mev-boost
```
2. (Optional) To build a specific release, refer to the available [releases](https://github.com/flashbots/mev-boost/releases) and checkout the desired tag:
```bash
git checkout tags/YOUR_VERSION
```
3. Build the software:
```bash
make build
```
4. If you experience issues, use the portable build:
```bash
make build-portable
```
5. Verify your installation:
```bash
./mev-boost -help
```
### From Docker Image
Flashbots provides maintained Docker images for MEV-Boost.
1. [Install Docker Engine](https://docs.docker.com/engine/install/).
2. Pull the latest MEV-Boost image:
```bash
docker pull flashbots/mev-boost:latest
```
Or pull the portable version:
```bash
docker pull flashbots/mev-boost:latest-portable
```
3. Run the Docker image:
```bash
docker run flashbots/mev-boost -help
```
## Systemd Configuration
To keep MEV-Boost running as a service, configure systemd by creating the systemd config file `/etc/systemd/system/mev-boost.service`.
Below is an example of a config file:
```ini
[Unit]
Description=mev-boost
Wants=network-online.target
After=network-online.target
[Service]
User=mev-boost
Group=mev-boost
WorkingDirectory=/home/mev-boost
Type=simple
Restart=always
RestartSec=5
ExecStart=/home/mev-boost/bin/mev-boost \
-mainnet \
-relay-check \
-relays YOUR_RELAY_CHOICE
[Install]
WantedBy=multi-user.target
```
## Troubleshooting
If you encounter an error: [`"SIGILL: illegal instruction"`](https://github.com/flashbots/mev-boost/issues/256), you'll need to use the portable build.
There are three ways to install the portable build:
1. Use the [portable Docker image](https://hub.docker.com/r/flashbots/mev-boost/tags).
2. Build the portable version from source:
```bash
make build-portable
```
3. Using `go install`:
```bash
CGO_CFLAGS="-O -D__BLST_PORTABLE__" go install github.com/flashbots/mev-boost@latest
```
================================================
FILE: docs/flashbots-mev-boost/getting-started/system-requirements.md
================================================
---
title: System Requirements
---
This guide assumes a pre-installed and hardened Ubuntu installation [as well as Docker](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04). Excellent introductory resources to start with are: [Coincashew](https://www.coincashew.com/coins/overview-eth/archived-guides/guide-or-how-to-setup-a-validator-on-eth2-mainnet/part-i-installation/guide-or-security-best-practices-for-a-eth2-validator-beaconchain-node), and [Rocketpool's Securing your Node](https://docs.rocketpool.net/guides/node/securing-your-node.html#securing-your-node)
## Requirements for different systems
### Execution + Beacon Requirements
- **Software**: Execution client, beacon node client (instructions for clients below), [curl](https://curl.se/download.html)
- **OS**: 64-bit Linux, Mac OS X 10.14+, Windows 10+ 64-bit
- **CPU**: 4+ cores @ 2.8+ GHz
- **Memory**: 16GB+ RAM
- **Storage**: SSD with at least 2TB free space
- **Network:** 8 MBit/sec broadband
:::tip
There are variations in client resource usage. Please review [CoinCashew’s Client Usage Guide](https://eth-docker.net/Usage/ResourceUsage) for more details!
:::
### Validator Requirements
- Everything above, plus...
- **Software:** Validator client, browser-based crypto wallet (instructions below)
- **Hardware** (Recommended): A new machine that has never been connected to the internet that you can use to securely generate your mnemonic phrase and keypair
- **32 ETH** (Mainnet)
- **32 testnet ETH** (Testnets)
### MEV-Boost Requirements
- Can run on any beacon-node system, and requires almost no resources.
## Consensus client configuration guides
| | MEV-Boost Client Guides |
| ---------- | ------------------------------------------------------------------------------------------------------------- |
| Teku | [Guide](hthttps://docs.teku.consensys.net/Concepts/Builder-Network/tps://hackmd.io/@StefanBratanov/BkMlo1RO9) |
| Prysm | [Guide](https://hackmd.io/@prysmaticlabs/BJeinxFsq) |
| Lighthouse | [Guide](https://lighthouse-book.sigmaprime.io/builders.html#mev-and-lighthouse) |
| Lodestar | [Guide](https://github.com/ChainSafe/lodestar/blob/unstable/docs/pages/beacon-management/mev-and-builder-integration.md) |
| Nimbus | [Guide](https://nimbus.guide/external-block-builder.html) |
================================================
FILE: docs/flashbots-mev-boost/getting-started/usage.md
================================================
---
title: Usage
---
When connecting to different networks using mev-boost, specify the desired network using its dedicated flag. Here are the available Network Flags:
| Network | Flag |
| --------------- | -------- |
| Mainnet | -mainnet |
| Sepolia Testnet | -sepolia |
| Kiln | -kiln |
You can add multiple relays comma-separated to the `-relays` flag, like this: `-relays RELAY_URL_1,RELAY_URL_2`. Refer to ETH staker [Relay List](https://github.com/eth-educators/ethstaker-guides/blob/main/MEV-relay-list.md) for a list of available relays.
### Mainnet Relay
Run mev-boost pointed at our [Mainnet Relay:](https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net/)
```bash
./mev-boost -mainnet -relay-check -relays https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net
```
### Sepolia testnet
Run mev-boost pointed at our [Sepolia Relay](https://builder-relay-sepolia.flashbots.net/):
```bash
./mev-boost -sepolia -relay-check -relays https://0x845bd072b7cd566f02faeb0a4033ce9399e42839ced64e8b2adcfc859ed1e8e1a5a293336a49feac6d9a5edb779be53a@builder-relay-sepolia.flashbots.net
```
## mev-boost CLI arguments
```bash
$ ./mev-boost -help
Usage of ./mev-boost:
-addr string
listen-address for mev-boost server (default "localhost:18550")
-debug
shorthand for '-loglevel debug'
-genesis-fork-version string
use a custom genesis fork version
-json
log in JSON format instead of text
-loglevel string
minimum loglevel: trace, debug, info, warn/warning, error, fatal, panic (default "info")
-mainnet
use Mainnet
-relay-check
check relay status on startup and on the status API call
-relay-monitors string
relay monitor urls - single entry or comma-separated list (scheme://host)
-relays string
relay urls - single entry or comma-separated list (scheme://pubkey@host)
-request-timeout-getheader int
timeout for getHeader requests to the relay [ms] (default 950)
-request-timeout-getpayload int
timeout for getPayload requests to the relay [ms] (default 4000)
-request-timeout-regval int
timeout for registerValidator requests [ms] (default 3000)
-sepolia
use Sepolia
-version
only print version
```
## Verifying Your Setup
You can check if you setup works by looking up the validator registration of your proposer using the [Relay Data API](https://flashbots.github.io/relay-specs/#/Data).
For example, let's suppose that your validator's public key is `0xb606e206c2bf3b78f53ebff8be8e8d4af2f0da68646b5642c4d511b15ab5ddb122ae57b48eab614f8ca5bafbe75a5999`. You can check if your validator is registered by querying the following endpoint:
```url
https://boost-relay.flashbots.net/relay/v1/data/validator_registration?pubkey=0xb606e206c2bf3b78f53ebff8be8e8d4af2f0da68646b5642c4d511b15ab5ddb122ae57b48eab614f8ca5bafbe75a5999
```
Below is the response:
```json
{
"message": {
"fee_recipient": "0x6db5c947ba388f0e708c03339d534af9fae5679c",
"gas_limit": "30000000",
"timestamp": "1663063595",
"pubkey": "0xb606e206c2bf3b78f53ebff8be8e8d4af2f0da68646b5642c4d511b15ab5ddb122ae57b48eab614f8ca5bafbe75a5999"
},
"signature": "0x94f1f635336f8c38909842f06550026bbc198f892c6a79c22a3365e547e87665e31feccfacda3533ef3cf8e2c965e03d1594cf8e981dfc75011b4d237552386377bcea714bcfb78d303fe5624625e1bbb8b23f3a6d1b7c9efb3d76cad4ca01a5"
}
```
The `fee_recipient` field should match the address you provided when registering your validator. If it does, then your setup is working correctly.
================================================
FILE: docs/flashbots-mev-boost/glossary.md
================================================
---
title: Glossary
---
- **attestation:** votes (embedded in messages) describing which blocks “should” be the head of the chain. We can think of each such attestation as a “vote” to move from block A to B. Each attestation has a weight, which is the stake of the validator writing the attestation.
- **beacon node (BN):** maintains the state of the beacon chain by communicating with other beacon nodes in the Ethereum network. Conceptually, a BN does not maintain keypairs that directly participate with the beacon chain.
- **block builder (builder)**: party specialized in MEV extraction and the construction of execution payloads. Builders are trusted by searchers and users for fair transaction inclusion.
- **block proposer (proposer)**: a validator selected to sign and submit a beacon block to the network.
- **builder API specification**: an [interface](https://github.com/ethereum/builder-specs) for consensus layer clients to source blocks built by external entities.
- **committee:** a group of validators. For security, each slot has committees of at least 128 validators. An attacker has less than a one in a trillion probability of controlling 2⁄3 of a committee.
- **execution payload**: a [message](https://github.com/ethereum/consensus-specs/blob/a45ee9bf5b1fde766d69e551a6b1a21fe2531734/specs/merge/beacon-chain.md#executionpayload) containing the complete content of an unsigned execution payload (an object containing block properties in addition to transactions) that is provided by the execution layer (previous PoW nodes).
- **fork choice rule:** A function evaluated by the client that takes, as input, the set of blocks and other messages that have been produced, and outputs to the client what the 'canonical chain' is.
- **liveness:** state of ethereum which is valid \*\*\*\*if the set of finalized blocks can grow.
- **MEV-boost “middleware”**: a piece of software that sits between the consensus client and the execution client to outsource block construction to a market of builders.
- **plausible liveness:** if, regardless of any previous events (attacks, latency, etc.), it is possible for new blocks to be finalized (the alternative is to become “deadlocked”). This is to prevent situations where honest validators cannot continue unless someone forfeits their own stake.
- **probabilistic liveness:** if, regardless of any previous events, it is probable for new
blocks to be finalized (after probabilistic assumptions about the network latency, capabilities of attackers, etc. are made).
- **Proposer/block-builder separation (PBS)**: Proposer/block-builder separation (**PBS**
) was proposed by Ethereum researchers as a response to the risk that MEV poses to decentralization of consensus networks. PBS is a change to the base Ethereum protocol that aims to separate block building from block proposing. Instead of the block proposer (currently the miner, after PoS the validator) also trying to produce a maximally profitable block by itself, it can outsource this to a block building *marketplace.* With this model, block builders would produce bundles consisting of a complete block and a fee for the proposer.
- **relay**: party that validates and routes execution payloads from builders to proposers. Relays are trusted by builders for fair routing and block inclusion. Relays are trusted by block proposers for block validity, accuracy, and data availability. Relay actors are often specialized in Denial of Service (DoS) protection and networking.
- **searcher**: advanced Ethereum user specialized in detecting and extracting MEV by submitting advanced transactions in batches called bundles.
- **staker:** actor that submit any amount of Ethereum to be staked.
- **user**: a normal Ethereum user who sends transactions for block inclusion.
- **validator:** Most often refers to a validator client instance, but can also refer to an individual that is physically managing a validator client. Validators\*\*\*\* participate in the consensus of Ethereum through validator duties. These duties include the production of beacon blocks and signing of attestations, as executed by the validator client.
- **validator client (VC):** Validator clients are specialized software that let people stake 32 ETH as collateral within Ethereum's **consensus layer**. Validators are responsible for proposing blocks within Ethereum's proof-of-stake consensus mechanism which replaced proof-of-work miners at [The Merge](https://ethereum.org/en/upgrades/merge/).
- **validator pubkey**: The validator's BLS public key, uniquely identifying them. *48-bytes, hex encoded with 0x prefix, case insensitive.*
================================================
FILE: docs/flashbots-mev-boost/introduction.md
================================================
---
title: Overview
---
## What is MEV-Boost?
`mev-boost` is open source middleware run by validators to access a competitive block-building market. MEV-Boost was built by Flashbots as an implementation of [proposer-builder separation (PBS)](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) for proof-of-stake (PoS) Ethereum.
With MEV-Boost, validators can access blocks from a marketplace of builders. Builders produce blocks containing transaction orderflow and a fee for the block proposing validator. Separating the role of proposers from block builders promotes greater competition, decentralization, and censorship-resistance for Ethereum.
See also:
- [boost.flashbots.net](https://boost.flashbots.net/)
- [boost-relay.flashbots.net](https://boost-relay.flashbots.net/)
- [github.com/flashbots/mev-boost](https://github.com/flashbots/mev-boost/)
---
## Why MEV-Boost?
MEV is a centralizing force on Ethereum. Unattended, the competition for MEV opportunities leads to consensus instability and permissioned communication infrastructure between searchers, block producers, and validators. Access to MEV is even more important in PoS Ethereum, as the planned [reduction in block subsidies](https://hackmd.io/@flashbots/mev-in-eth2) will make MEV an even [larger share of total staking revenue](https://github.com/flashbots/eth2-research/blob/main/notebooks/mev-in-eth2/eth2-mev-calc.ipynb).
Validators running MEV-Boost maximize their staking reward by selling their blockspace to an open market. It is estimated that validators running MEV-Boost can increase [staking rewards by over 60%](https://hackmd.io/@flashbots/mev-in-eth2).
## How does MEV-Boost work?

PoS node operators must run three pieces of software: a validator client, consensus client, and an execution client. MEV-boost is a sidecar for the consensus client, a separate piece of open source software, which queries and outsources block-building to a network of builders.
Block builders prepare full blocks, optimizing for MEV extraction and fair distribution of rewards, and send blocks to relays. A single MEV-boost instance can be configured to connect to **multiple** relays.
Relays aggregate blocks from **multiple** builders and identify the most profitable block to submit to the block proposer. The proposing validators’ consensus client then propagates the most profitable block received from MEV-boost to the Ethereum network for attestation and block inclusion.
================================================
FILE: docs/flashbots-mev-boost/relay.md
================================================
---
title: Relay Fundamentals
---
## Relay Fundamentals
### What is a Relay?
Relays are a doubly-trusted data-availability layer and communication interface between builders and validators. Relays are trusted by builders for fair payload routing, and trusted by proposers for block validity, accuracy, and data availability. They are often specialized in Denial of Service (DoS) protection and networking.
Relays can connect to one or many builders, and we expect that there will be both variants. A relay connecting to many builders will aggregate their bids (fun fact: in a previous iteration, we called them builder aggregators or builder pools). The relay can see all the blocks submitted by the builders to confirm their validity and how much they pay to the validator. The relay then only submits the highest valid bid to the validator to sign.
Before validators can receive any bids from relays, they need to [set up mev-boost](https://boost.flashbots.net/) and add relays to their mev-boost config. mev-boost is effectively just a relay aggregator or a local relay of relays. It will serve the validator the winning bid from all relays. A validator can connect to a small number of relays that aggregate all the builders, and many will probably do that. Other validators might connect to many relays.
### The Role of Relays
A relay has several responsibilities:
- They execute [builder-spec](https://ethereum.github.io/builder-specs/#/Builder) and data transparency API functionality.
- Handle validator registrations and block proposals in a scalable manner.
- Provide block escrow and data availability.
- Simulate and verify blocks sent by block-builders, and rate-limit as necessary. Relays simulate whether:
- the correct amount of fees are paid to recent validator feeRecipient.
- the correct block attributes and transactions exist.
- the block gas is within the gasLimit requested by validator.
## [Relay API Specification](https://flashbots.notion.site/Relay-API-Spec-5fb0819366954962bc02e81cb33840f5)
The current specification for the [open-source Flashbots relay](https://github.com/flashbots/mev-boost-relay). Diagram below displays the current architecture:

### [Proposer API](https://flashbots.notion.site/Relay-API-Spec-5fb0819366954962bc02e81cb33840f5)
Standard [builder spec](https://ethereum.github.io/builder-specs/#/Builder) APIs
- [registerValidator](https://ethereum.github.io/builder-specs/#/Builder/registerValidator): `POST /eth/v1/builder/validators`
- [getHeader](https://ethereum.github.io/builder-specs/#/Builder/getHeader): `GET /eth/v1/builder/header/{slot}/{parent_hash}/{pubkey}` - Get an execution payload header.
- [submitBlindedBlock](https://ethereum.github.io/builder-specs/#/Builder/submitBlindedBlock): `POST /eth/v1/builder/blinded_blocks` - Submit a signed blinded block and get unblinded execution payload.
- [status](https://ethereum.github.io/builder-specs/#/): `GET /eth/v1/builder/status`
### [Block Builder API](https://flashbots.notion.site/Relay-API-Spec-5fb0819366954962bc02e81cb33840f5)
Get a list of validator registrations for the current and next epoch, submit a new block to the relay.
### [Data API](https://flashbots.notion.site/Relay-API-Spec-5fb0819366954962bc02e81cb33840f5)
Provides data about received blocks from builders, payloads delivered to proposers as well as insights into validator registrations.
## [Circuit Breaker](https://hackmd.io/@ralexstokes/BJn9N6Thc)
The circuit breaker is implemented by client software teams to define “circuit breaking” conditions using globally available inputs (such as the chain) to determine whether clients should stop sourcing blocks from an external block builder network and fallback to local block production instead. Each consensus client implements different circuit breaker conditions and once the circuit breaker condition is met, clients have different behaviour regarding when to re
gitextract_k2vcmtga/ ├── .cspell.json ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .github/ │ ├── CODEOWNERS │ ├── dependabot.yml │ └── workflows/ │ ├── algolia.yml.txt │ ├── broken-link-check-cron.yml.txt │ └── pr-tests.yml ├── .gitignore ├── .lintstagedrc.json ├── .nvmrc ├── .prettierignore ├── .prettierrc.json ├── .stylelintignore ├── .stylelintrc.js ├── .vscode/ │ ├── extensions.json │ └── settings.json ├── LICENSE ├── LICENSE-docs ├── README.md ├── babel.config.js ├── docs/ │ ├── brand-assets.mdx │ ├── cheatsheet.mdx │ ├── code-of-conduct.mdx │ ├── community-tools.mdx │ ├── contribution-guide.mdx │ ├── flashbots-auction/ │ │ ├── advanced/ │ │ │ ├── bundle-cancellations.mdx │ │ │ ├── bundle-pricing.md │ │ │ ├── co-locate.mdx │ │ │ ├── coinbase-payment.mdx │ │ │ ├── eip1559.mdx │ │ │ ├── gas-fee-refunds.md │ │ │ ├── multiplexing.mdx │ │ │ ├── reputation.md │ │ │ ├── rpc-endpoint.mdx │ │ │ ├── testnets.mdx │ │ │ ├── troubleshooting.mdx │ │ │ └── understanding-bundles.mdx │ │ ├── example-searchers/ │ │ │ ├── searcher-minter.md │ │ │ ├── searcher-sponsored-tx.md │ │ │ ├── simple-arbitrage-bot.md │ │ │ └── synthetix-searcher.md │ │ ├── faq.md │ │ ├── libraries/ │ │ │ ├── alchemyprovider.md │ │ │ ├── bundle-relay.md │ │ │ ├── ethers-js-provider.md │ │ │ ├── golang.md │ │ │ ├── mev-share-clients.md │ │ │ ├── rust-provider.md │ │ │ └── web3py-provider.md │ │ ├── other-resources.md │ │ ├── overview.mdx │ │ └── quick-start.mdx │ ├── flashbots-mev-boost/ │ │ ├── FAQ.md │ │ ├── architecture-overview/ │ │ │ ├── block-proposal.md │ │ │ ├── risks.md │ │ │ └── specifications.md │ │ ├── block-builders.md │ │ ├── block-proposers.md │ │ ├── contributing.md │ │ ├── getting-started/ │ │ │ ├── installation.md │ │ │ ├── system-requirements.md │ │ │ └── usage.md │ │ ├── glossary.md │ │ ├── introduction.md │ │ ├── relay.md │ │ ├── resources.md │ │ ├── security.md │ │ └── troubleshooting.md │ ├── flashbots-mev-share/ │ │ ├── for-users.mdx │ │ ├── introduction.mdx │ │ ├── orderflow-providers.mdx │ │ ├── release-notes/ │ │ │ ├── 2023-03.mdx │ │ │ ├── 2023-06.mdx │ │ │ ├── 2023-07.mdx │ │ │ └── 2023-09.mdx │ │ └── searchers/ │ │ ├── debugging.mdx │ │ ├── event-stream.mdx │ │ ├── getting-started.mdx │ │ ├── ratelimiting.mdx │ │ ├── sending-bundles.mdx │ │ ├── tutorials/ │ │ │ ├── flash-loan-arbitrage/ │ │ │ │ ├── bot.mdx │ │ │ │ ├── flash-loan-basics.mdx │ │ │ │ ├── introduction.mdx │ │ │ │ └── simple-blind-arbitrage.mdx │ │ │ └── limit-order/ │ │ │ ├── debugging.mdx │ │ │ ├── introduction.mdx │ │ │ ├── more-resources.mdx │ │ │ ├── sending-bundles.mdx │ │ │ ├── setup.mdx │ │ │ └── using-events.mdx │ │ └── understanding-bundles.mdx │ ├── flashbots-protect/ │ │ ├── additional-documentation/ │ │ │ ├── eth-sendPrivateTransaction.mdx │ │ │ └── status-api.md │ │ ├── cancellations.md │ │ ├── gas-fee-refunds.md │ │ ├── large-transactions.md │ │ ├── mev-refunds.mdx │ │ ├── nonce-management.mdx │ │ ├── overview.mdx │ │ ├── quick-start.mdx │ │ ├── ratelimiting.mdx │ │ ├── settings-guide.md │ │ └── stuck_transactions.md │ ├── guide-send-tx-bundle.mdx │ ├── joining-flashbots.mdx │ ├── new-to-mev.mdx │ ├── policies/ │ │ ├── privacy.mdx │ │ ├── prohibited-use-policy.mdx │ │ └── terms-of-service.mdx │ ├── sidebars.js │ ├── specs/ │ │ ├── README.md │ │ ├── contracts/ │ │ │ └── abi/ │ │ │ ├── _flashLoanArb.mdx │ │ │ └── _uniswapV2Factory.mdx │ │ ├── mev-share/ │ │ │ ├── HintsTable.jsx │ │ │ ├── _builders.mdx │ │ │ ├── _mev_sendBundle.mdx │ │ │ ├── _mev_simBundle.mdx │ │ │ ├── _streamEvent.mdx │ │ │ ├── blurbs/ │ │ │ │ ├── _builderInheritance.mdx │ │ │ │ ├── _whatsMevShareAdvanced.mdx │ │ │ │ ├── _whatsMevShareBasic.mdx │ │ │ │ └── _whatsaMEVShareNode.mdx │ │ │ └── hints.json │ │ └── protect-rpc/ │ │ └── _hints.mdx │ ├── welcome.mdx │ └── whitehat.mdx ├── docusaurus.config.js ├── package.json ├── project-words.txt ├── src/ │ ├── components/ │ │ ├── Banner/ │ │ │ ├── Banner.custom.module.scss │ │ │ ├── Banner.module.scss │ │ │ ├── Banner.tsx │ │ │ ├── _base.scss │ │ │ └── banner.config.tsx │ │ ├── BrandAssets/ │ │ │ ├── AssetCard.tsx │ │ │ ├── Download.tsx │ │ │ ├── index.tsx │ │ │ └── styles.module.css │ │ ├── Checkbox/ │ │ │ └── index.tsx │ │ ├── Grid/ │ │ │ ├── Grid.tsx │ │ │ └── styles.module.css │ │ ├── GridBlock/ │ │ │ ├── GridBlock.tsx │ │ │ └── styles.module.css │ │ ├── ProtectButton/ │ │ │ └── index.tsx │ │ ├── RemoteCodeBlock/ │ │ │ └── index.tsx │ │ ├── SimpleDropdown/ │ │ │ ├── index.tsx │ │ │ └── styles.module.css │ │ └── mev-share/ │ │ ├── buildersTable.tsx │ │ └── useSupportedBuilders.tsx │ ├── css/ │ │ └── custom.css │ ├── pages/ │ │ └── styles.module.css │ ├── theme/ │ │ ├── Layout/ │ │ │ └── index.tsx │ │ └── Navbar/ │ │ ├── index.js │ │ └── navbar.module.css │ └── types/ │ └── global.d.ts ├── static/ │ ├── .nojekyll │ ├── img/ │ │ └── site.webmanifest │ └── robots.txt ├── tailwind.config.js ├── tsconfig.json └── vercel.json
SYMBOL INDEX (35 symbols across 18 files)
FILE: .eslintrc.js
constant OFF (line 7) | const OFF = 0;
constant WARNING (line 8) | const WARNING = 1;
constant ERROR (line 9) | const ERROR = 2;
FILE: docs/specs/mev-share/HintsTable.jsx
function HintsTable (line 9) | function HintsTable() {
FILE: docusaurus.config.js
method configurePostCss (line 108) | configurePostCss(postcssOptions) {
FILE: src/components/Banner/Banner.tsx
type BannerOptions (line 16) | interface BannerOptions {
class BannerConfigs (line 25) | class BannerConfigs {
method constructor (line 28) | constructor(options: BannerOptions) {
method getBannerStyle (line 34) | getBannerStyle(): React.CSSProperties | null {
method getBannerClass (line 45) | getBannerClass(): string {
method shouldShowBanner (line 54) | shouldShowBanner(): boolean {
function Banner (line 70) | function Banner(): JSX.Element {
FILE: src/components/BrandAssets/AssetCard.tsx
type IAssetCard (line 11) | interface IAssetCard {
function AssetCard (line 18) | function AssetCard({ title, cover, svg, png }: IAssetCard) {
FILE: src/components/BrandAssets/Download.tsx
type IDownload (line 9) | interface IDownload {
function Download (line 13) | function Download({ file, type }: IDownload) {
FILE: src/components/BrandAssets/index.tsx
function BrandAssets (line 10) | function BrandAssets() {
FILE: src/components/Checkbox/index.tsx
function Checkbox (line 8) | function Checkbox({
FILE: src/components/Grid/Grid.tsx
type IGrid (line 10) | interface IGrid {
function Grid (line 14) | function Grid({ children }: IGrid) {
FILE: src/components/GridBlock/GridBlock.tsx
type IGridBlock (line 10) | interface IGridBlock {
function GridBlock (line 16) | function GridBlock({ children, symbol, title }: IGridBlock) {
FILE: src/components/ProtectButton/index.tsx
function ProtectButton (line 10) | function ProtectButton() {
FILE: src/components/RemoteCodeBlock/index.tsx
type IRemoteCodeBlock (line 11) | interface IRemoteCodeBlock extends CodeProps {
function RemoteCodeBlock (line 17) | function RemoteCodeBlock({url, ...props}: IRemoteCodeBlock) {
FILE: src/components/SimpleDropdown/index.tsx
type SimpleDropdownParams (line 10) | type SimpleDropdownParams = {
function SimpleDropdown (line 17) | function SimpleDropdown({
function Body (line 60) | function Body(props) {
function HiddenBody (line 69) | function HiddenBody({children}) {
FILE: src/components/mev-share/buildersTable.tsx
function BuildersTable (line 9) | function BuildersTable() {
FILE: src/components/mev-share/useSupportedBuilders.tsx
type Builder (line 10) | type Builder = {
FILE: src/theme/Layout/index.tsx
type Props (line 6) | type Props = WrapperProps<typeof LayoutType>;
function LayoutWrapper (line 8) | function LayoutWrapper(props: Props): JSX.Element {
FILE: src/theme/Navbar/index.js
function NavbarWrapper (line 6) | function NavbarWrapper(props) {
FILE: src/types/global.d.ts
type Window (line 8) | interface Window {
Condensed preview — 163 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (636K chars).
[
{
"path": ".cspell.json",
"chars": 624,
"preview": "{\n \"version\": \"0.2\",\n \"gitignoreRoot\": \".\",\n \"useGitignore\": true,\n \"dictionaries\": [\n \"css\",\n "
},
{
"path": ".editorconfig",
"chars": 321,
"preview": "# http://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = "
},
{
"path": ".eslintignore",
"chars": 88,
"preview": "node_modules\n.yarn\n.history\nbuild\ncoverage\njest.config.js\njest.transform.js\njest/vendor\n"
},
{
"path": ".eslintrc.js",
"chars": 2366,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": ".github/CODEOWNERS",
"chars": 235,
"preview": "# These owners will be the default owners for everything in\n# the repo. Unless a later match takes precedence,\n# they wi"
},
{
"path": ".github/dependabot.yml",
"chars": 573,
"preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
},
{
"path": ".github/workflows/algolia.yml.txt",
"chars": 832,
"preview": "name: Vercel -> Algolia Crawler (push on main)\non:\n push:\n branches: [ main ]\n\njobs:\n algolia_recrawl:\n name: Al"
},
{
"path": ".github/workflows/broken-link-check-cron.yml.txt",
"chars": 509,
"preview": "name: Check for broken links (cron)\n\non:\n workflow_dispatch:\n schedule:\n - cron: '0 10 * * *'\n\njobs:\n check-for-br"
},
{
"path": ".github/workflows/pr-tests.yml",
"chars": 876,
"preview": "name: PR Tests\n\non:\n push:\n branches:\n - main\n pull_request:\n\njobs:\n build-and-check:\n runs-on: ubuntu-lat"
},
{
"path": ".gitignore",
"chars": 293,
"preview": "# Dependencies\n/node_modules\n\n# Production\n/build\n\n# Generated files\n.docusaurus\n.cache-loader\n\n# Misc\n.DS_Store\n.env.lo"
},
{
"path": ".lintstagedrc.json",
"chars": 203,
"preview": "{\n \"*.{js,jsx,ts,tsx,mjs}\": [\"eslint --fix\"],\n \"*.css\": [\"stylelint --allow-empty-input --fix\"],\n \"*\": [\n \"prettie"
},
{
"path": ".nvmrc",
"chars": 4,
"preview": "v22\n"
},
{
"path": ".prettierignore",
"chars": 259,
"preview": "# Dependencies\n/node_modules\n\n# Production\n/build\n\n# Generated files\n.docusaurus\n.cache-loader\n\n# Misc\n.DS_Store\n.env.lo"
},
{
"path": ".prettierrc.json",
"chars": 223,
"preview": "{\n \"arrowParens\": \"always\",\n \"bracketSpacing\": false,\n \"bracketSameLine\": true,\n \"printWidth\": 80,\n \"proseWrap\": \"n"
},
{
"path": ".stylelintignore",
"chars": 80,
"preview": "# Stylelint runs on everything by default; we only lint CSS files.\n*\n!*/\n!*.css\n"
},
{
"path": ".stylelintrc.js",
"chars": 405,
"preview": "module.exports = {\n extends: ['stylelint-config-standard', 'stylelint-config-prettier'],\n rules: {\n 'at-rule-no-unk"
},
{
"path": ".vscode/extensions.json",
"chars": 631,
"preview": "{\n // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.\n \"recommendations\":"
},
{
"path": ".vscode/settings.json",
"chars": 379,
"preview": "{\n \"editor.codeActionsOnSave\": {\n \"source.fixAll.eslint\": \"explicit\",\n \"source.fixAll.stylelint\": \"explicit\"\n },"
},
{
"path": "LICENSE",
"chars": 1086,
"preview": "MIT License\n\nCopyright (c) Flashbots Ltd. and its affiliates.\n\nPermission is hereby granted, free of charge, to any pers"
},
{
"path": "LICENSE-docs",
"chars": 18645,
"preview": "Attribution 4.0 International\n\n=======================================================================\n\nCreative Commons"
},
{
"path": "README.md",
"chars": 1393,
"preview": "# Website\n\nThis website is built using [Docusaurus 2](https://v2.docusaurus.io/), a modern static website generator.\n\n##"
},
{
"path": "babel.config.js",
"chars": 89,
"preview": "module.exports = {\n presets: [require.resolve('@docusaurus/core/lib/babel/preset')],\n};\n"
},
{
"path": "docs/brand-assets.mdx",
"chars": 115,
"preview": "---\ntitle: Brand Assets\n---\n\nimport BrandAssets from \"@site/src/components/BrandAssets/index.tsx\";\n\n<BrandAssets />"
},
{
"path": "docs/cheatsheet.mdx",
"chars": 7307,
"preview": "---\ntitle: Docs Cheatsheet\n---\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\nimport TOCInline fr"
},
{
"path": "docs/code-of-conduct.mdx",
"chars": 5818,
"preview": "---\ntitle: Code of Conduct\n---\n\nAt Flashbots we contribute with the larger free software community to illuminate the dar"
},
{
"path": "docs/community-tools.mdx",
"chars": 761,
"preview": "---\ntitle: Community Tools\n---\n\n### [DotPics Info](https://dotpics.info/)\n\n- A collection of interactive dashboards of t"
},
{
"path": "docs/contribution-guide.mdx",
"chars": 3765,
"preview": "---\ntitle: Docs Contribution Guide\n---\nThank you for your interest in adding to our knowledge base!\n\n## Repo structure\nT"
},
{
"path": "docs/flashbots-auction/advanced/bundle-cancellations.mdx",
"chars": 1653,
"preview": "---\ntitle: bundle cancellations\n---\n\nBundle cancellations are currently deployed to our mainnet staging environment: `ht"
},
{
"path": "docs/flashbots-auction/advanced/bundle-pricing.md",
"chars": 3332,
"preview": "---\ntitle: Bundle Pricing\n---\n\n## Understanding bundle pricing\n\nSearchers submit a huge amount of bundles every block, b"
},
{
"path": "docs/flashbots-auction/advanced/co-locate.mdx",
"chars": 285,
"preview": "---\ntitle: Co-locate with Flashbots Builder\n---\n\nFor searchers who want to optimize the latency of their bundle submissi"
},
{
"path": "docs/flashbots-auction/advanced/coinbase-payment.mdx",
"chars": 3500,
"preview": "---\ntitle: coinbase.transfer()\n---\n\nFlashbots allows you to pay validators for your transactions through a smart contrac"
},
{
"path": "docs/flashbots-auction/advanced/eip1559.mdx",
"chars": 4182,
"preview": "---\ntitle: EIP-1559 Support\n---\n\nEIP-1559 is an upgrade to the Ethereum network that changes how you pay for transaction"
},
{
"path": "docs/flashbots-auction/advanced/gas-fee-refunds.md",
"chars": 4542,
"preview": "---\ntitle: Gas Fee Refunds\n---\n\n## Introduction\n\nSearchers and private transaction API users are automatically eligible "
},
{
"path": "docs/flashbots-auction/advanced/multiplexing.mdx",
"chars": 930,
"preview": "---\ntitle: Send transaction/bundle to multiple builders\n---\n\nimport Builders from '../../specs/mev-share/_builders.mdx';"
},
{
"path": "docs/flashbots-auction/advanced/reputation.md",
"chars": 2422,
"preview": "---\ntitle: Searcher Reputation\n---\n\nIn order to maintain reliable performance, we've introduced searcher reputation to p"
},
{
"path": "docs/flashbots-auction/advanced/rpc-endpoint.mdx",
"chars": 26832,
"preview": "---\ntitle: JSON-RPC Endpoints\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\nimport Hints fr"
},
{
"path": "docs/flashbots-auction/advanced/testnets.mdx",
"chars": 2615,
"preview": "---\ntitle: Testnets\n---\n\nFlashbots operates on Sepolia so that searchers can test Flashbots without risking real funds. "
},
{
"path": "docs/flashbots-auction/advanced/troubleshooting.mdx",
"chars": 15286,
"preview": "---\ntitle: Bundle Inclusion Troubleshooting\n---\n\n## How to troubleshoot your Flashbots bundle not landing on-chain\n\nUnli"
},
{
"path": "docs/flashbots-auction/advanced/understanding-bundles.mdx",
"chars": 1602,
"preview": "---\ntitle: Understanding Bundles\n---\n\nSearchers use Flashbots to submit bundles to block builders for inclusion in block"
},
{
"path": "docs/flashbots-auction/example-searchers/searcher-minter.md",
"chars": 557,
"preview": "---\ntitle: Searcher Minter\n---\nsearcher-minter is a repository that contains a very simple demo application which allows"
},
{
"path": "docs/flashbots-auction/example-searchers/searcher-sponsored-tx.md",
"chars": 651,
"preview": "---\ntitle: Searcher Sponsored TX\n---\nsearcher-sponsored-tx contains a simple Flashbots \"searcher\" for submitting a trans"
},
{
"path": "docs/flashbots-auction/example-searchers/simple-arbitrage-bot.md",
"chars": 591,
"preview": "---\ntitle: Simple Arbitrage Bot\n---\nsimple-arbitrage is a repository that contains a simple, mechanical system for disco"
},
{
"path": "docs/flashbots-auction/example-searchers/synthetix-searcher.md",
"chars": 941,
"preview": "---\ntitle: Synthetix Searcher\n---\nThis repo by [Bert Miller](https://twitter.com/bertcmiller) contains a searcher develo"
},
{
"path": "docs/flashbots-auction/faq.md",
"chars": 252,
"preview": "---\ntitle: FAQ\n---\n\nThe FAQ has been moved to the [Flashbots Collective Forum](https://collective.flashbots.net/).\n\nIf y"
},
{
"path": "docs/flashbots-auction/libraries/alchemyprovider.md",
"chars": 1258,
"preview": "---\ntitle: Alchemy Provider\n---\nThe Alchemy SDK makes getting started, shipping builds, and accessing support faster and"
},
{
"path": "docs/flashbots-auction/libraries/bundle-relay.md",
"chars": 590,
"preview": "---\ntitle: Bundle Relay Clients\n---\n\nThe following clients connect to the Bundle Relay API, which exposes [these JSON-RP"
},
{
"path": "docs/flashbots-auction/libraries/ethers-js-provider.md",
"chars": 908,
"preview": "---\ntitle: Ethers.js Provider\n---\n\nethers-provider-flashbots-bundle is a repository that contains the `FlashbotsBundlePr"
},
{
"path": "docs/flashbots-auction/libraries/golang.md",
"chars": 818,
"preview": "---\ntitle: Golang Provider\n---\n_These libraries are provided and maintained by third-parties rather than Flashbots. Plea"
},
{
"path": "docs/flashbots-auction/libraries/mev-share-clients.md",
"chars": 542,
"preview": "---\ntitle: MEV-Share Clients\n---\n\n* [mev-share-client-ts](https://github.com/flashbots/mev-share-client-ts)\n* [mev-share"
},
{
"path": "docs/flashbots-auction/libraries/rust-provider.md",
"chars": 793,
"preview": "---\ntitle: Rust Provider\n---\n\nEthers-flashbots is a robust and user-friendly Rust library for interacting with flashbots"
},
{
"path": "docs/flashbots-auction/libraries/web3py-provider.md",
"chars": 601,
"preview": "---\ntitle: Web3.py Provider\n---\nweb3-flashbots is a repository containing a library that works by injecting a new module"
},
{
"path": "docs/flashbots-auction/other-resources.md",
"chars": 1155,
"preview": "---\ntitle: Other Resources\n---\n\nRemember you can ask any questions in the [#🐣newcomers or #🤖searchers](https://discord.c"
},
{
"path": "docs/flashbots-auction/overview.mdx",
"chars": 16861,
"preview": "---\ntitle: Overview\n---\n\nFlashbots Auction is a permissionless, transparent, and fair ecosystem for efficient MEV extrac"
},
{
"path": "docs/flashbots-auction/quick-start.mdx",
"chars": 10028,
"preview": "---\ntitle: Quick Start\n---\n\nimport Tabs from \"@theme/Tabs\";\nimport TabItem from \"@theme/TabItem\";\n\nThis quickstart guide"
},
{
"path": "docs/flashbots-mev-boost/FAQ.md",
"chars": 3408,
"preview": "---\ntitle: FAQ\n---\n\n## Can I connect to multiple relays with MEV-Boost?\n\nYes. You can add multiple relays comma-separate"
},
{
"path": "docs/flashbots-mev-boost/architecture-overview/block-proposal.md",
"chars": 2317,
"preview": "---\ntitle: MEV-Boost Block Proposal\n---\n\n is a research and development collective working on mit"
},
{
"path": "docs/flashbots-mev-boost/getting-started/installation.md",
"chars": 3722,
"preview": "---\ntitle: Installation\n---\n\nGet started with MEV-Boost installation with this guide. Whether you are looking to install"
},
{
"path": "docs/flashbots-mev-boost/getting-started/system-requirements.md",
"chars": 2601,
"preview": "---\ntitle: System Requirements\n---\n\nThis guide assumes a pre-installed and hardened Ubuntu installation [as well as Dock"
},
{
"path": "docs/flashbots-mev-boost/getting-started/usage.md",
"chars": 3729,
"preview": "---\ntitle: Usage\n---\n\nWhen connecting to different networks using mev-boost, specify the desired network using its dedic"
},
{
"path": "docs/flashbots-mev-boost/glossary.md",
"chars": 4640,
"preview": "---\ntitle: Glossary\n---\n\n- **attestation:** votes (embedded in messages) describing which blocks “should” be the head of"
},
{
"path": "docs/flashbots-mev-boost/introduction.md",
"chars": 2575,
"preview": "---\ntitle: Overview\n---\n\n## What is MEV-Boost?\n\n`mev-boost` is open source middleware run by validators to access a comp"
},
{
"path": "docs/flashbots-mev-boost/relay.md",
"chars": 4926,
"preview": "---\ntitle: Relay Fundamentals\n---\n\n## Relay Fundamentals\n\n### What is a Relay?\n\nRelays are a doubly-trusted data-availab"
},
{
"path": "docs/flashbots-mev-boost/resources.md",
"chars": 2174,
"preview": "---\ntitle: Resources\n---\n\n**Proof-of-Stake Ethereum**\n\n- [The Hitchhiker's Guide to Ethereum](https://members.delphidigi"
},
{
"path": "docs/flashbots-mev-boost/security.md",
"chars": 382,
"preview": "---\ntitle: Vulnerabilities\n---\n\nIf you find a security vulnerability on this project or any other initiative related to "
},
{
"path": "docs/flashbots-mev-boost/troubleshooting.md",
"chars": 167,
"preview": "---\ntitle: Troubleshooting\n---\n\nPlease refer to the [Troubleshooting Wiki](https://github.com/flashbots/mev-boost/wiki/T"
},
{
"path": "docs/flashbots-mev-share/for-users.mdx",
"chars": 396,
"preview": "---\ntitle: For Users\n---\n\nimport WhatIsMevShare from \"@site/docs/specs/mev-share/blurbs/_whatsMevShareBasic.mdx\"\n\n<WhatI"
},
{
"path": "docs/flashbots-mev-share/introduction.mdx",
"chars": 2440,
"preview": "---\ntitle: Introduction\n---\n\nimport WhatsMevShareAdvanced from \"../specs/mev-share/blurbs/_whatsMevShareAdvanced.mdx\"\n\n>"
},
{
"path": "docs/flashbots-mev-share/orderflow-providers.mdx",
"chars": 312,
"preview": "---\ntitle: For Orderflow Providers\n---\n\nFlashbots runs a MEV-Share Node that can be used by sending transactions to [Fla"
},
{
"path": "docs/flashbots-mev-share/release-notes/2023-03.mdx",
"chars": 694,
"preview": "# April 2023 (beta launch)\n\n## MEV-Share Protocol Specification\n\nhttps://github.com/flashbots/mev-share\n\n## `mev_` RPC e"
},
{
"path": "docs/flashbots-mev-share/release-notes/2023-06.mdx",
"chars": 1506,
"preview": "# June 2023\n\n## simBundle options\n\nNew options to override the simulation state for `mev_simBundle`:\n\n```typescript\ninte"
},
{
"path": "docs/flashbots-mev-share/release-notes/2023-07.mdx",
"chars": 1406,
"preview": "# July 2023\n\n## customized refunds\n\nConfigure the percent(s) and recipient(s) for MEV-Share refunds by adding the [`refu"
},
{
"path": "docs/flashbots-mev-share/release-notes/2023-09.mdx",
"chars": 921,
"preview": "# September 2023\n\n## default logs hint\n\nA new hint which shares a subset of logs, as described in the [hints] settings(/"
},
{
"path": "docs/flashbots-mev-share/searchers/debugging.mdx",
"chars": 11640,
"preview": "---\ntitle: Debugging\n---\n\nIf you find that your bundles aren't landing when you think they should, we have some tips to "
},
{
"path": "docs/flashbots-mev-share/searchers/event-stream.mdx",
"chars": 11799,
"preview": "---\ntitle: Event Stream\n---\n\nimport Tabs from '@theme/Tabs'\nimport TabItem from '@theme/TabItem'\nimport StreamEvent from"
},
{
"path": "docs/flashbots-mev-share/searchers/getting-started.mdx",
"chars": 4209,
"preview": "---\ntitle: Getting Started\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\nTo start searchin"
},
{
"path": "docs/flashbots-mev-share/searchers/ratelimiting.mdx",
"chars": 990,
"preview": "---\ntitle: Rate Limits\n---\n\nIn order to protect our services from abuse we have rate limits on the number of requests th"
},
{
"path": "docs/flashbots-mev-share/searchers/sending-bundles.mdx",
"chars": 5744,
"preview": "---\ntitle: Sending Bundles\n---\n\nimport Tabs from '@theme/Tabs'\nimport TabItem from '@theme/TabItem'\nimport SendBundleRpc"
},
{
"path": "docs/flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/bot.mdx",
"chars": 17343,
"preview": "import Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\nimport UniV2FactoryABI from \"@site/docs/specs/cont"
},
{
"path": "docs/flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/flash-loan-basics.mdx",
"chars": 3882,
"preview": "import RemoteCodeBlock from \"@site/src/components/RemoteCodeBlock\"\n\n# Flash Loan Basics (Balancer)\n\nTo recap, flash loan"
},
{
"path": "docs/flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/introduction.mdx",
"chars": 804,
"preview": "# Introduction\n\nIn this guide, we show you how to run an atomic arbitrage bot that uses flash loans. Flash loans allow y"
},
{
"path": "docs/flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/simple-blind-arbitrage.mdx",
"chars": 18406,
"preview": "import RemoteCodeBlock from \"@site/src/components/RemoteCodeBlock\";\nimport Admonition from \"@theme/Admonition\";\n\n# Break"
},
{
"path": "docs/flashbots-mev-share/searchers/tutorials/limit-order/debugging.mdx",
"chars": 229,
"preview": "---\ntitle: Debugging\n---\n\nIf your bundles aren't landing, there could be a few reasons why. Take a look at our [debuggin"
},
{
"path": "docs/flashbots-mev-share/searchers/tutorials/limit-order/introduction.mdx",
"chars": 3993,
"preview": "---\ntitle: Introduction\n---\n\nMEV-Share is a new protocol for sending and searching on Ethereum transactions. In this gui"
},
{
"path": "docs/flashbots-mev-share/searchers/tutorials/limit-order/more-resources.mdx",
"chars": 1453,
"preview": "---\ntitle: More Resources\n---\n\nWe hope you found this guide useful! This is only the first of several, in which we'll sh"
},
{
"path": "docs/flashbots-mev-share/searchers/tutorials/limit-order/sending-bundles.mdx",
"chars": 14512,
"preview": "---\ntitle: Sending Bundles\n---\n\n## Getting our trade ready\n\nAfter we find a transaction that touches the trading pair we"
},
{
"path": "docs/flashbots-mev-share/searchers/tutorials/limit-order/setup.mdx",
"chars": 24250,
"preview": "---\ntitle: Set Up\n---\n\nWe'll be writing this bot in Typescript. Client libraries and examples for other languages will b"
},
{
"path": "docs/flashbots-mev-share/searchers/tutorials/limit-order/using-events.mdx",
"chars": 9161,
"preview": "---\ntitle: Using Events\n---\n\n## Finding pending transactions with MEV-Share Event Stream\n\nNow that we have all the setup"
},
{
"path": "docs/flashbots-mev-share/searchers/understanding-bundles.mdx",
"chars": 4559,
"preview": "---\ntitle: Understanding Bundles\n---\n\nimport Tabs from '@theme/Tabs'\nimport TabItem from '@theme/TabItem'\nimport SendBun"
},
{
"path": "docs/flashbots-protect/additional-documentation/eth-sendPrivateTransaction.mdx",
"chars": 9806,
"preview": "---\ntitle: eth_sendPrivateTransaction\n---\n\nimport Tabs from \"@theme/Tabs\";\nimport TabItem from \"@theme/TabItem\";\nimport "
},
{
"path": "docs/flashbots-protect/additional-documentation/status-api.md",
"chars": 4720,
"preview": "---\ntitle: Transaction Status API\n---\n\nTransactions that you submit to Flashbots Protect won't be observable in the publ"
},
{
"path": "docs/flashbots-protect/cancellations.md",
"chars": 1041,
"preview": "---\ntitle: Cancellations\n---\n\nTransactions submitted to Flashbots Protect are directed to the Flashbots MEV-Share Node. "
},
{
"path": "docs/flashbots-protect/gas-fee-refunds.md",
"chars": 3777,
"preview": "---\ntitle: Gas Fee Refunds\n---\n\n## Introduction\n\nFlashbots Protect users are automatically eligible to receive gas fee r"
},
{
"path": "docs/flashbots-protect/large-transactions.md",
"chars": 681,
"preview": "---\ntitle: Large Transaction Allowlist\n---\n\nSome projects may need to post larger transactions (measured in bytes) than "
},
{
"path": "docs/flashbots-protect/mev-refunds.mdx",
"chars": 2488,
"preview": "---\ntitle: MEV Refunds\n---\n\nimport ProtectButton from '@site/src/components/ProtectButton';\n\n## Introduction\n\nFlashbots "
},
{
"path": "docs/flashbots-protect/nonce-management.mdx",
"chars": 2998,
"preview": "---\ntitle: Nonce Management\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\nNormally, a wall"
},
{
"path": "docs/flashbots-protect/overview.mdx",
"chars": 1607,
"preview": "---\ntitle: MEV Protection Overview\n---\n\n<head>\n <title>MEV Protection - Block MEV With Flashbots Protect RPC</title>\n "
},
{
"path": "docs/flashbots-protect/quick-start.mdx",
"chars": 4915,
"preview": "---\ntitle: Quick Start\n---\n\nimport ProtectButton from '@site/src/components/ProtectButton';\n\n### Key Considerations\n\nFla"
},
{
"path": "docs/flashbots-protect/ratelimiting.mdx",
"chars": 1307,
"preview": "---\ntitle: Rate Limits\n---\n\nIn order to protect our services from abuse we have rate limits on the number of requests th"
},
{
"path": "docs/flashbots-protect/settings-guide.md",
"chars": 8210,
"preview": "---\ntitle: Settings Guide\n---\n\nimport HintsTable from '../specs/mev-share/HintsTable';\nimport Builders from '../specs/me"
},
{
"path": "docs/flashbots-protect/stuck_transactions.md",
"chars": 553,
"preview": "---\ntitle: Fixing Stuck Transactions\n---\n\nIf your transaction is stuck in a \"pending\" state or you have an extremely hig"
},
{
"path": "docs/guide-send-tx-bundle.mdx",
"chars": 2527,
"preview": "---\ntitle: Sending Tx and Bundles\n---\n\nFlashbots provides a variety of methods for submitting transactions and bundles. "
},
{
"path": "docs/joining-flashbots.mdx",
"chars": 762,
"preview": "---\ntitle: Join Flashbots\n---\n\n### Interested in joining Flashbots?\nIf you are a self-directed individual who puts colle"
},
{
"path": "docs/new-to-mev.mdx",
"chars": 1042,
"preview": "---\ntitle: New to MEV?\n---\n\n### Here's where to get started\n\n* [Ethereum is a Dark Forest](https://www.paradigm.xyz/2020"
},
{
"path": "docs/policies/privacy.mdx",
"chars": 12240,
"preview": "---\ntitle: Data Privacy Notice\n---\n\n## Flashbots Ltd.\n\n*Updated December 10, 2021*\n\nFlashbots Ltd. (the “**Company**”) i"
},
{
"path": "docs/policies/prohibited-use-policy.mdx",
"chars": 2590,
"preview": "---\ntitle: Prohibited Use Policy\n---\n\n## Flashbots Ltd.\n*Updated July 6, 2023*\n\nUsers of the Flashbots Services may not "
},
{
"path": "docs/policies/terms-of-service.mdx",
"chars": 31377,
"preview": "---\ntitle: Terms of Service\n---\n\n## Flashbots Ltd.\n*Updated July 6, 2023*\n\n### ACCEPTANCE OF TERMS\n\nBY ACCESSING ANY SER"
},
{
"path": "docs/sidebars.js",
"chars": 6514,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "docs/specs/README.md",
"chars": 576,
"preview": "# specs\n\nCommonly used bits of information (\"specs\") live here so that they can be reused.\n\nTo use a spec in an mdx file"
},
{
"path": "docs/specs/contracts/abi/_flashLoanArb.mdx",
"chars": 114542,
"preview": "```json title=\"abi/blindBackrunFlashLoan.json\"\n{ \"abi\": [ { \"inputs\": [ { \"internalType\": \"address\", \"name\": \"_wethAddre"
},
{
"path": "docs/specs/contracts/abi/_uniswapV2Factory.mdx",
"chars": 2275,
"preview": "```json title=\"abi/uniswapV2Factory.json\"\n[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeToSetter\",\"type\":\"address\"}]"
},
{
"path": "docs/specs/mev-share/HintsTable.jsx",
"chars": 624,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "docs/specs/mev-share/_builders.mdx",
"chars": 96,
"preview": "import BuildersTable from \"@site/src/components/mev-share/buildersTable.tsx\"\n\n<BuildersTable />\n"
},
{
"path": "docs/specs/mev-share/_mev_sendBundle.mdx",
"chars": 1350,
"preview": "<!-- TODO: get this from https://github.com/flashbots/mev-share/blob/main/specs/mev_sendBundle.md instead of duplicating"
},
{
"path": "docs/specs/mev-share/_mev_simBundle.mdx",
"chars": 1792,
"preview": "<!-- TODO: get this from https://github.com/flashbots/mev-share/blob/main/specs/mev_sendBundle.md instead of duplicating"
},
{
"path": "docs/specs/mev-share/_streamEvent.mdx",
"chars": 1964,
"preview": "\n```typescript\n{\n hash: string,\n logs?: LogParams[],\n txs: Array<{\n hash?: string,\n callData?: st"
},
{
"path": "docs/specs/mev-share/blurbs/_builderInheritance.mdx",
"chars": 492,
"preview": "By default, when a user specifies which builders their transactions should be sent to (by setting `builders`), those set"
},
{
"path": "docs/specs/mev-share/blurbs/_whatsMevShareAdvanced.mdx",
"chars": 671,
"preview": "MEV-Share is an open-source protocol for users, wallets, and applications to internalize the MEV that their transactions"
},
{
"path": "docs/specs/mev-share/blurbs/_whatsMevShareBasic.mdx",
"chars": 218,
"preview": "[MEV-share](https://collective.flashbots.net/t/mev-share-programmably-private-orderflow-to-share-mev-with-users/1264) is"
},
{
"path": "docs/specs/mev-share/blurbs/_whatsaMEVShareNode.mdx",
"chars": 538,
"preview": "A MEV-Share Node is a service that matches user transactions with searcher bundles. Flashbots runs MEV-Share Nodes on Et"
},
{
"path": "docs/specs/mev-share/hints.json",
"chars": 1536,
"preview": "[\n {\n \"name\": \"calldata\",\n \"description\": \"Share data sent to the smart contract (if applicable) by the"
},
{
"path": "docs/specs/protect-rpc/_hints.mdx",
"chars": 136,
"preview": "```js\nhint: \"calldata\" |\n \"contract_address\" |\n \"function_selector\" |\n \"logs\" |\n \"hash\" |\n "
},
{
"path": "docs/welcome.mdx",
"chars": 3295,
"preview": "---\nslug: /\ntitle: Welcome to Flashbots\nhide_title: true\ndescription: The home page of the knowledge base\nkeywords:\n - "
},
{
"path": "docs/whitehat.mdx",
"chars": 699,
"preview": "---\ntitle: Whitehat Hotline\n---\n\nIf your wallet has been compromised by a malicious third party and you need help recove"
},
{
"path": "docusaurus.config.js",
"chars": 3740,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "package.json",
"chars": 3480,
"preview": "{\n \"name\": \"flashbot-docs\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"scripts\": {\n \"docusaurus\": \"docusaurus\",\n "
},
{
"path": "project-words.txt",
"chars": 112,
"preview": "camelcase\ndogfood\nflashbot\nflashbots\nFlashbots\nhideable\nInpage\nkatex\nMMSDK\nrehype\nSEPOLIA\nstylelint\ntailwindcss\n"
},
{
"path": "src/components/Banner/Banner.custom.module.scss",
"chars": 468,
"preview": "@use '_base';\n\n/*\nAdd custom CSS styling for your banner here\n\nYou can add any classes you'd like based on the markup fo"
},
{
"path": "src/components/Banner/Banner.module.scss",
"chars": 286,
"preview": "@use 'base';\n\n.banner {\n @extend %banner-structure;\n\n background-color: var(--banner-background-color, var(--ifm-navba"
},
{
"path": "src/components/Banner/Banner.tsx",
"chars": 2228,
"preview": "/* Custom Banner Module\nUse it to quickly deploy a simple banner to the Flashbots homepage\n\nTo add a new banner all you "
},
{
"path": "src/components/Banner/_base.scss",
"chars": 287,
"preview": "%banner-structure {\n height: fit-content;\n padding: 0.5rem 2rem;\n text-align: center;\n line-height: 1.25;\n\n a{\n "
},
{
"path": "src/components/Banner/banner.config.tsx",
"chars": 3000,
"preview": "/* Custom Banner Module\nUse it to quickly deploy a simple banner to the Flashbots homepage\n\nTo add a new banner all you "
},
{
"path": "src/components/BrandAssets/AssetCard.tsx",
"chars": 909,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "src/components/BrandAssets/Download.tsx",
"chars": 1038,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "src/components/BrandAssets/index.tsx",
"chars": 1255,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "src/components/BrandAssets/styles.module.css",
"chars": 162,
"preview": ".root {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(clamp(100px,(1024px - 100vw) *1000, 100%), 1fr"
},
{
"path": "src/components/Checkbox/index.tsx",
"chars": 923,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "src/components/Grid/Grid.tsx",
"chars": 460,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "src/components/Grid/styles.module.css",
"chars": 162,
"preview": ".root {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(clamp(100px,(1024px - 100vw) *1000, 100%), 1fr"
},
{
"path": "src/components/GridBlock/GridBlock.tsx",
"chars": 1124,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "src/components/GridBlock/styles.module.css",
"chars": 1471,
"preview": ".root {\n position: relative;\n padding: 2rem 1rem 1.5rem;\n}\n\n.background {\n position: absolute;\n top: 0;\n left: 0;\n "
},
{
"path": "src/components/ProtectButton/index.tsx",
"chars": 1116,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "src/components/RemoteCodeBlock/index.tsx",
"chars": 956,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "src/components/SimpleDropdown/index.tsx",
"chars": 1944,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "src/components/SimpleDropdown/styles.module.css",
"chars": 0,
"preview": ""
},
{
"path": "src/components/mev-share/buildersTable.tsx",
"chars": 705,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "src/components/mev-share/useSupportedBuilders.tsx",
"chars": 1164,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "src/css/custom.css",
"chars": 1495,
"preview": "/**\n * Any CSS included here will be global. The classic template\n * bundles Infima by default. Infima is a CSS framewor"
},
{
"path": "src/pages/styles.module.css",
"chars": 559,
"preview": "/* stylelint-disable docusaurus/copyright-header */\n\n/**\n * CSS files with the .module.css suffix will be treated as CSS"
},
{
"path": "src/theme/Layout/index.tsx",
"chars": 418,
"preview": "import React from 'react';\nimport Layout from '@theme-original/Layout';\nimport type LayoutType from '@theme/Layout';\nimp"
},
{
"path": "src/theme/Navbar/index.js",
"chars": 334,
"preview": "import React from 'react';\nimport Navbar from '@theme-original/Navbar';\nimport Banner from '../../components/Banner/Bann"
},
{
"path": "src/theme/Navbar/navbar.module.css",
"chars": 93,
"preview": ".combinedNavigation {\n position: sticky;\n top: 0px;\n z-index: var(--ifm-z-index-fixed);\n}\n"
},
{
"path": "src/types/global.d.ts",
"chars": 263,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "static/.nojekyll",
"chars": 0,
"preview": ""
},
{
"path": "static/img/site.webmanifest",
"chars": 263,
"preview": "{\"name\":\"\",\"short_name\":\"\",\"icons\":[{\"src\":\"/android-chrome-192x192.png\",\"sizes\":\"192x192\",\"type\":\"image/png\"},{\"src\":\"/"
},
{
"path": "static/robots.txt",
"chars": 24,
"preview": "User-agent: *\nDisallow:\n"
},
{
"path": "tailwind.config.js",
"chars": 393,
"preview": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
},
{
"path": "tsconfig.json",
"chars": 1551,
"preview": "{\n // This file is not used in compilation. It is here just for a nice editor experience.\n \"extends\": \"@tsconfig/docus"
},
{
"path": "vercel.json",
"chars": 1683,
"preview": "{\n \"cleanUrls\": true,\n \"trailingSlash\": false,\n \"redirects\": [\n {\n \"source\": \"/flashbots-protect/rpc/:path(un"
}
]
About this extraction
This page contains the full source code of the flashbots/flashbots-docs GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 163 files (584.7 KB), approximately 165.9k tokens, and a symbol index with 35 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.