[
  {
    "path": ".cspell.json",
    "content": "{\n    \"version\": \"0.2\",\n    \"gitignoreRoot\": \".\",\n    \"useGitignore\": true,\n    \"dictionaries\": [\n        \"css\",\n        \"html\",\n        \"fonts\",\n        \"typescript\",\n        \"softwareTerms\",\n        \"companies\",\n        \"project-words\"\n    ],\n    \"dictionaryDefinitions\": [\n        {\n            \"name\": \"project-words\",\n            \"path\": \"./project-words.txt\",\n            \"noSuggest\": false\n        }\n    ],\n    \"ignorePaths\": [\n        \"package.json\",\n        \"yarn.lock\",\n        \"project-words.txt\",\n        \"*.gitignore\"\n    ],\n    \"ignoreRegExpList\": [\n        \"Email\",\n        \"Urls\",\n        \"#[\\\\w-]*\"\n    ]\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "# http://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 2\nmax_line_length = 80\ntrim_trailing_whitespace = true\n\n[*.md]\ninsert_final_newline = false\n# 2 trailing whitespace indicate a new line in markdown\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": ".eslintignore",
    "content": "node_modules\n.yarn\n.history\nbuild\ncoverage\njest.config.js\njest.transform.js\njest/vendor\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nconst OFF = 0;\nconst WARNING = 1;\nconst ERROR = 2;\n\nmodule.exports = {\n  parser: '@typescript-eslint/parser',\n  parserOptions: {\n    project: true,\n    tsconfigRootDir: __dirname,\n  },\n  plugins: ['header'],\n  extends: [\n    'eslint:recommended',\n    'airbnb',\n    'airbnb/hooks',\n    'airbnb-typescript',\n    'plugin:@docusaurus/recommended',\n    'plugin:react/jsx-runtime',\n    'plugin:mdx/recommended',\n    'plugin:import/recommended',\n    'prettier',\n  ],\n  rules: {\n    camelcase: WARNING,\n    'max-len': [\n      WARNING,\n      {\n        code: Infinity, // Code width is already enforced by Prettier\n        tabWidth: 2,\n        comments: 80,\n        ignoreUrls: true,\n        ignorePattern: '(eslint-disable|@)',\n      },\n    ],\n    'header/header': [\n      ERROR,\n      'block',\n      [\n        '*',\n        ' * Copyright (c) Flashbots Ltd. and its affiliates.',\n        ' *',\n        ' * This source code is licensed under the MIT license found in the',\n        ' * LICENSE file in the root directory of this source tree.',\n        ' ',\n      ],\n    ],\n    'import/no-unresolved': [ERROR, {ignore: ['^@docusaurus', '@theme']}],\n    'import/no-extraneous-dependencies': [ERROR, {includeTypes: true}],\n    'react/require-default-props': [\n      WARNING,\n      {\n        functions: 'defaultArguments',\n      },\n    ],\n    'react/jsx-filename-extension': [\n      WARNING,\n      {extensions: ['.js', '.jsx', '.ts', '.tsx']},\n    ],\n    \"react/jsx-props-no-spreading\": OFF,\n  },\n  settings: {\n    'import/parsers': {\n      '@typescript-eslint/parser': ['.ts', '.tsx'],\n    },\n    'import/resolver': {\n      typescript: {},\n    },\n    // optional, if you want to lint code blocks at the same time\n    'mdx/code-blocks': true,\n    // optional, if you want to disable language mapper, set it to `false`\n    // if you want to override the default language mapper inside, you can\n    // provide your own\n    'mdx/language-mapper': {\n      typescript: '@typescript-eslint/parser',\n      ts: '@typescript-eslint/parser',\n      javascript: 'espree',\n      js: 'espree',\n    },\n  },\n  overrides: [\n    {\n      files: ['*.mdx'],\n      extends: ['plugin:mdx/overrides'],\n    },\n  ],\n};\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# These owners will be the default owners for everything in\n# the repo. Unless a later match takes precedence,\n# they will be requested for review when someone opens a pull request.\n*       @odysseus0 @sketsdever @zeroXbrock @sukoneck\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where the package manifests are located.\n# Please see the documentation for all configuration options:\n# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\n\nversion: 2\nupdates:\n  - package-ecosystem: \"yarn\" # See documentation for possible values\n    directory: \"/\" # Location of package manifests\n    schedule:\n      interval: \"weekly\"\n    groups:\n      dev-dependencies:\n        patterns:\n          - \"*\"\n"
  },
  {
    "path": ".github/workflows/algolia.yml.txt",
    "content": "name: Vercel -> Algolia Crawler (push on main)\non:\n  push:\n    branches: [ main ]\n\njobs:\n  algolia_recrawl:\n    name: Algolia Recrawl\n    runs-on: ubuntu-latest\n    steps:\n      # checkout this repo\n      - name: Checkout Repo\n        uses: actions/checkout@v2\n\n      - name: Vercel-MAIN => Algolia crawler creation and recrawl on preview (Push on Main branch)\n        uses: algolia/algoliasearch-crawler-github-actions@v1\n        id: crawler_push\n        with:\n          crawler-user-id: ${{ secrets.ALGOLIA_CRAWLER_USER_ID }}\n          crawler-api-key: ${{ secrets.ALGOLIA_CRAWLER_API_KEY }}\n          algolia-app-id: ${{ secrets.ALGOLIA_APP_ID }}\n          algolia-api-key: ${{ secrets.ALGOLIA_SEARCH_API_KEY }}\n          crawler-name: 'flashbots'\n          site-url: 'https://docs.flashbots.net/'\n          override-config: true"
  },
  {
    "path": ".github/workflows/broken-link-check-cron.yml.txt",
    "content": "name: Check for broken links (cron)\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 10 * * *'\n\njobs:\n  check-for-broken-links:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/setup-node@v1\n        with:\n          node-version: '16.x'\n      - run: npm install -g linkinator\n      - 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.*'\n"
  },
  {
    "path": ".github/workflows/pr-tests.yml",
    "content": "name: PR Tests\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n\njobs:\n  build-and-check:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v1\n      - uses: actions/setup-node@v1\n        with:\n          node-version: \"22.x\"\n      - name: Test build\n        env:\n          TARGET_URL: \"https://docs.flashbots.net\"\n          BASE_URL: \"/\"\n          ALGOLIA_APP_ID: \"example\"\n          ALGOLIA_SEARCH_API_KEY: \"example\"\n          ALGOLIA_INDEX_NAME: \"example\"\n        run: |\n          yarn install --frozen-lockfile\n          yarn build\n      # - name: Check for broken links\n      #   run: |\n      #     cd build\n      #     npm install -g linkinator\n      #     linkinator \"**/*.html\" --recurse --timeout 3000 --concurrency 10 --retry -s https://dune.com/ChainsightAnalytics,'https://.*etherscan.io/.*','https://twitter.com.*','https://.*imgur.com.*'\n"
  },
  {
    "path": ".gitignore",
    "content": "# 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.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nnode_modules\n\n.env\n.vercel\n.env*.local\n\n.idea/\n.eslintcache\n"
  },
  {
    "path": ".lintstagedrc.json",
    "content": "{\n  \"*.{js,jsx,ts,tsx,mjs}\": [\"eslint --fix\"],\n  \"*.css\": [\"stylelint --allow-empty-input --fix\"],\n  \"*\": [\n    \"prettier --ignore-unknown --write\",\n    \"cspell --no-must-find-files --no-progress\"\n  ]\n}\n"
  },
  {
    "path": ".nvmrc",
    "content": "v22\n"
  },
  {
    "path": ".prettierignore",
    "content": "# 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.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nnode_modules\n\n.env\n.vercel"
  },
  {
    "path": ".prettierrc.json",
    "content": "{\n  \"arrowParens\": \"always\",\n  \"bracketSpacing\": false,\n  \"bracketSameLine\": true,\n  \"printWidth\": 80,\n  \"proseWrap\": \"never\",\n  \"singleQuote\": true,\n  \"trailingComma\": \"all\",\n  \"plugins\": [\"prettier-plugin-tailwindcss\"]\n}\n"
  },
  {
    "path": ".stylelintignore",
    "content": "# Stylelint runs on everything by default; we only lint CSS files.\n*\n!*/\n!*.css\n"
  },
  {
    "path": ".stylelintrc.js",
    "content": "module.exports = {\n  extends: ['stylelint-config-standard', 'stylelint-config-prettier'],\n  rules: {\n    'at-rule-no-unknown': [\n      true,\n      {\n        ignoreAtRules: [\n          'tailwind',\n          'apply',\n          'variants',\n          'responsive',\n          'screen',\n        ],\n      },\n    ],\n    'declaration-block-trailing-semicolon': null,\n    'no-descending-specificity': null,\n  },\n};\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n  // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.\n  \"recommendations\": [\n    \"streetsidesoftware.code-spell-checker\",\n    \"esbenp.prettier-vscode\",\n    \"dbaeumer.vscode-eslint\",\n    \"stylelint.vscode-stylelint\",\n    \"EditorConfig.EditorConfig\",\n    \"Gruntfuggly.todo-tree\",\n    \"github.vscode-github-actions\",\n    \"GitHub.vscode-pull-request-github\",\n    \"GitHub.remotehub\",\n    \"eamodio.gitlens\",\n    \"unifiedjs.vscode-mdx\",\n    \"christian-kohler.npm-intellisense\",\n    \"christian-kohler.path-intellisense\",\n    \"bradlc.vscode-tailwindcss\",\n  ],\n  \"unwantedRecommendations\": []\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"editor.codeActionsOnSave\": {\n    \"source.fixAll.eslint\": \"explicit\",\n    \"source.fixAll.stylelint\": \"explicit\"\n  },\n  \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n  \"css.validate\": false,\n  \"scss.validate\": false,\n  \"javascript.validate.enable\": false,\n  \"typescript.validate.enable\": true,\n  \"javascript.suggest.paths\": false,\n  \"typescript.suggest.paths\": false\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) Flashbots Ltd. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "LICENSE-docs",
    "content": "Attribution 4.0 International\n\n=======================================================================\n\nCreative Commons Corporation (\"Creative Commons\") is not a law firm and\ndoes not provide legal services or legal advice. Distribution of\nCreative Commons public licenses does not create a lawyer-client or\nother relationship. Creative Commons makes its licenses and related\ninformation available on an \"as-is\" basis. Creative Commons gives no\nwarranties regarding its licenses, any material licensed under their\nterms and conditions, or any related information. Creative Commons\ndisclaims all liability for damages resulting from their use to the\nfullest extent possible.\n\nUsing Creative Commons Public Licenses\n\nCreative Commons public licenses provide a standard set of terms and\nconditions that creators and other rights holders may use to share\noriginal works of authorship and other material subject to copyright\nand certain other rights specified in the public license below. The\nfollowing considerations are for informational purposes only, are not\nexhaustive, and do not form part of our licenses.\n\n     Considerations for licensors: Our public licenses are\n     intended for use by those authorized to give the public\n     permission to use material in ways otherwise restricted by\n     copyright and certain other rights. Our licenses are\n     irrevocable. Licensors should read and understand the terms\n     and conditions of the license they choose before applying it.\n     Licensors should also secure all rights necessary before\n     applying our licenses so that the public can reuse the\n     material as expected. Licensors should clearly mark any\n     material not subject to the license. This includes other CC-\n     licensed material, or material used under an exception or\n     limitation to copyright. More considerations for licensors:\n     wiki.creativecommons.org/Considerations_for_licensors\n\n     Considerations for the public: By using one of our public\n     licenses, a licensor grants the public permission to use the\n     licensed material under specified terms and conditions. If\n     the licensor's permission is not necessary for any reason--for\n     example, because of any applicable exception or limitation to\n     copyright--then that use is not regulated by the license. Our\n     licenses grant only permissions under copyright and certain\n     other rights that a licensor has authority to grant. Use of\n     the licensed material may still be restricted for other\n     reasons, including because others have copyright or other\n     rights in the material. A licensor may make special requests,\n     such as asking that all changes be marked or described.\n     Although not required by our licenses, you are encouraged to\n     respect those requests where reasonable. More considerations\n     for the public:\n     wiki.creativecommons.org/Considerations_for_licensees\n\n=======================================================================\n\nCreative Commons Attribution 4.0 International Public License\n\nBy exercising the Licensed Rights (defined below), You accept and agree\nto be bound by the terms and conditions of this Creative Commons\nAttribution 4.0 International Public License (\"Public License\"). To the\nextent this Public License may be interpreted as a contract, You are\ngranted the Licensed Rights in consideration of Your acceptance of\nthese terms and conditions, and the Licensor grants You such rights in\nconsideration of benefits the Licensor receives from making the\nLicensed Material available under these terms and conditions.\n\nSection 1 -- Definitions.\n\n  a. Adapted Material means material subject to Copyright and Similar\n     Rights that is derived from or based upon the Licensed Material\n     and in which the Licensed Material is translated, altered,\n     arranged, transformed, or otherwise modified in a manner requiring\n     permission under the Copyright and Similar Rights held by the\n     Licensor. For purposes of this Public License, where the Licensed\n     Material is a musical work, performance, or sound recording,\n     Adapted Material is always produced where the Licensed Material is\n     synched in timed relation with a moving image.\n\n  b. Adapter's License means the license You apply to Your Copyright\n     and Similar Rights in Your contributions to Adapted Material in\n     accordance with the terms and conditions of this Public License.\n\n  c. Copyright and Similar Rights means copyright and/or similar rights\n     closely related to copyright including, without limitation,\n     performance, broadcast, sound recording, and Sui Generis Database\n     Rights, without regard to how the rights are labeled or\n     categorized. For purposes of this Public License, the rights\n     specified in Section 2(b)(1)-(2) are not Copyright and Similar\n     Rights.\n\n  d. Effective Technological Measures means those measures that, in the\n     absence of proper authority, may not be circumvented under laws\n     fulfilling obligations under Article 11 of the WIPO Copyright\n     Treaty adopted on December 20, 1996, and/or similar international\n     agreements.\n\n  e. Exceptions and Limitations means fair use, fair dealing, and/or\n     any other exception or limitation to Copyright and Similar Rights\n     that applies to Your use of the Licensed Material.\n\n  f. Licensed Material means the artistic or literary work, database,\n     or other material to which the Licensor applied this Public\n     License.\n\n  g. Licensed Rights means the rights granted to You subject to the\n     terms and conditions of this Public License, which are limited to\n     all Copyright and Similar Rights that apply to Your use of the\n     Licensed Material and that the Licensor has authority to license.\n\n  h. Licensor means the individual(s) or entity(ies) granting rights\n     under this Public License.\n\n  i. Share means to provide material to the public by any means or\n     process that requires permission under the Licensed Rights, such\n     as reproduction, public display, public performance, distribution,\n     dissemination, communication, or importation, and to make material\n     available to the public including in ways that members of the\n     public may access the material from a place and at a time\n     individually chosen by them.\n\n  j. Sui Generis Database Rights means rights other than copyright\n     resulting from Directive 96/9/EC of the European Parliament and of\n     the Council of 11 March 1996 on the legal protection of databases,\n     as amended and/or succeeded, as well as other essentially\n     equivalent rights anywhere in the world.\n\n  k. You means the individual or entity exercising the Licensed Rights\n     under this Public License. Your has a corresponding meaning.\n\nSection 2 -- Scope.\n\n  a. License grant.\n\n       1. Subject to the terms and conditions of this Public License,\n          the Licensor hereby grants You a worldwide, royalty-free,\n          non-sublicensable, non-exclusive, irrevocable license to\n          exercise the Licensed Rights in the Licensed Material to:\n\n            a. reproduce and Share the Licensed Material, in whole or\n               in part; and\n\n            b. produce, reproduce, and Share Adapted Material.\n\n       2. Exceptions and Limitations. For the avoidance of doubt, where\n          Exceptions and Limitations apply to Your use, this Public\n          License does not apply, and You do not need to comply with\n          its terms and conditions.\n\n       3. Term. The term of this Public License is specified in Section\n          6(a).\n\n       4. Media and formats; technical modifications allowed. The\n          Licensor authorizes You to exercise the Licensed Rights in\n          all media and formats whether now known or hereafter created,\n          and to make technical modifications necessary to do so. The\n          Licensor waives and/or agrees not to assert any right or\n          authority to forbid You from making technical modifications\n          necessary to exercise the Licensed Rights, including\n          technical modifications necessary to circumvent Effective\n          Technological Measures. For purposes of this Public License,\n          simply making modifications authorized by this Section 2(a)\n          (4) never produces Adapted Material.\n\n       5. Downstream recipients.\n\n            a. Offer from the Licensor -- Licensed Material. Every\n               recipient of the Licensed Material automatically\n               receives an offer from the Licensor to exercise the\n               Licensed Rights under the terms and conditions of this\n               Public License.\n\n            b. No downstream restrictions. You may not offer or impose\n               any additional or different terms or conditions on, or\n               apply any Effective Technological Measures to, the\n               Licensed Material if doing so restricts exercise of the\n               Licensed Rights by any recipient of the Licensed\n               Material.\n\n       6. No endorsement. Nothing in this Public License constitutes or\n          may be construed as permission to assert or imply that You\n          are, or that Your use of the Licensed Material is, connected\n          with, or sponsored, endorsed, or granted official status by,\n          the Licensor or others designated to receive attribution as\n          provided in Section 3(a)(1)(A)(i).\n\n  b. Other rights.\n\n       1. Moral rights, such as the right of integrity, are not\n          licensed under this Public License, nor are publicity,\n          privacy, and/or other similar personality rights; however, to\n          the extent possible, the Licensor waives and/or agrees not to\n          assert any such rights held by the Licensor to the limited\n          extent necessary to allow You to exercise the Licensed\n          Rights, but not otherwise.\n\n       2. Patent and trademark rights are not licensed under this\n          Public License.\n\n       3. To the extent possible, the Licensor waives any right to\n          collect royalties from You for the exercise of the Licensed\n          Rights, whether directly or through a collecting society\n          under any voluntary or waivable statutory or compulsory\n          licensing scheme. In all other cases the Licensor expressly\n          reserves any right to collect such royalties.\n\nSection 3 -- License Conditions.\n\nYour exercise of the Licensed Rights is expressly made subject to the\nfollowing conditions.\n\n  a. Attribution.\n\n       1. If You Share the Licensed Material (including in modified\n          form), You must:\n\n            a. retain the following if it is supplied by the Licensor\n               with the Licensed Material:\n\n                 i. identification of the creator(s) of the Licensed\n                    Material and any others designated to receive\n                    attribution, in any reasonable manner requested by\n                    the Licensor (including by pseudonym if\n                    designated);\n\n                ii. a copyright notice;\n\n               iii. a notice that refers to this Public License;\n\n                iv. a notice that refers to the disclaimer of\n                    warranties;\n\n                 v. a URI or hyperlink to the Licensed Material to the\n                    extent reasonably practicable;\n\n            b. indicate if You modified the Licensed Material and\n               retain an indication of any previous modifications; and\n\n            c. indicate the Licensed Material is licensed under this\n               Public License, and include the text of, or the URI or\n               hyperlink to, this Public License.\n\n       2. You may satisfy the conditions in Section 3(a)(1) in any\n          reasonable manner based on the medium, means, and context in\n          which You Share the Licensed Material. For example, it may be\n          reasonable to satisfy the conditions by providing a URI or\n          hyperlink to a resource that includes the required\n          information.\n\n       3. If requested by the Licensor, You must remove any of the\n          information required by Section 3(a)(1)(A) to the extent\n          reasonably practicable.\n\n       4. If You Share Adapted Material You produce, the Adapter's\n          License You apply must not prevent recipients of the Adapted\n          Material from complying with this Public License.\n\nSection 4 -- Sui Generis Database Rights.\n\nWhere the Licensed Rights include Sui Generis Database Rights that\napply to Your use of the Licensed Material:\n\n  a. for the avoidance of doubt, Section 2(a)(1) grants You the right\n     to extract, reuse, reproduce, and Share all or a substantial\n     portion of the contents of the database;\n\n  b. if You include all or a substantial portion of the database\n     contents in a database in which You have Sui Generis Database\n     Rights, then the database in which You have Sui Generis Database\n     Rights (but not its individual contents) is Adapted Material; and\n\n  c. You must comply with the conditions in Section 3(a) if You Share\n     all or a substantial portion of the contents of the database.\n\nFor the avoidance of doubt, this Section 4 supplements and does not\nreplace Your obligations under this Public License where the Licensed\nRights include other Copyright and Similar Rights.\n\nSection 5 -- Disclaimer of Warranties and Limitation of Liability.\n\n  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE\n     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS\n     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF\n     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,\n     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,\n     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR\n     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,\n     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT\n     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT\n     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.\n\n  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE\n     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,\n     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,\n     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,\n     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR\n     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN\n     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR\n     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR\n     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.\n\n  c. The disclaimer of warranties and limitation of liability provided\n     above shall be interpreted in a manner that, to the extent\n     possible, most closely approximates an absolute disclaimer and\n     waiver of all liability.\n\nSection 6 -- Term and Termination.\n\n  a. This Public License applies for the term of the Copyright and\n     Similar Rights licensed here. However, if You fail to comply with\n     this Public License, then Your rights under this Public License\n     terminate automatically.\n\n  b. Where Your right to use the Licensed Material has terminated under\n     Section 6(a), it reinstates:\n\n       1. automatically as of the date the violation is cured, provided\n          it is cured within 30 days of Your discovery of the\n          violation; or\n\n       2. upon express reinstatement by the Licensor.\n\n     For the avoidance of doubt, this Section 6(b) does not affect any\n     right the Licensor may have to seek remedies for Your violations\n     of this Public License.\n\n  c. For the avoidance of doubt, the Licensor may also offer the\n     Licensed Material under separate terms or conditions or stop\n     distributing the Licensed Material at any time; however, doing so\n     will not terminate this Public License.\n\n  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public\n     License.\n\nSection 7 -- Other Terms and Conditions.\n\n  a. The Licensor shall not be bound by any additional or different\n     terms or conditions communicated by You unless expressly agreed.\n\n  b. Any arrangements, understandings, or agreements regarding the\n     Licensed Material not stated herein are separate from and\n     independent of the terms and conditions of this Public License.\n\nSection 8 -- Interpretation.\n\n  a. For the avoidance of doubt, this Public License does not, and\n     shall not be interpreted to, reduce, limit, restrict, or impose\n     conditions on any use of the Licensed Material that could lawfully\n     be made without permission under this Public License.\n\n  b. To the extent possible, if any provision of this Public License is\n     deemed unenforceable, it shall be automatically reformed to the\n     minimum extent necessary to make it enforceable. If the provision\n     cannot be reformed, it shall be severed from this Public License\n     without affecting the enforceability of the remaining terms and\n     conditions.\n\n  c. No term or condition of this Public License will be waived and no\n     failure to comply consented to unless expressly agreed to by the\n     Licensor.\n\n  d. Nothing in this Public License constitutes or may be interpreted\n     as a limitation upon, or waiver of, any privileges and immunities\n     that apply to the Licensor or You, including from the legal\n     processes of any jurisdiction or authority.\n\n=======================================================================\n\nCreative Commons is not a party to its public licenses.\nNotwithstanding, Creative Commons may elect to apply one of its public\nlicenses to material it publishes and in those instances will be\nconsidered the “Licensor.” The text of the Creative Commons public\nlicenses is dedicated to the public domain under the CC0 Public Domain\nDedication. Except for the limited purpose of indicating that material\nis shared under a Creative Commons public license or as otherwise\npermitted by the Creative Commons policies published at\ncreativecommons.org/policies, Creative Commons does not authorize the\nuse of the trademark \"Creative Commons\" or any other trademark or logo\nof Creative Commons without its prior written consent including,\nwithout limitation, in connection with any unauthorized modifications\nto any of its public licenses or any other arrangements,\nunderstandings, or agreements concerning use of licensed material. For\nthe avoidance of doubt, this paragraph does not form part of the public\nlicenses.\n\nCreative Commons may be contacted at creativecommons.org.\n"
  },
  {
    "path": "README.md",
    "content": "# Website\n\nThis website is built using [Docusaurus 2](https://v2.docusaurus.io/), a modern static website generator.\n\n## Installation\n\nUse Node.js v22.18+\n\nNote: if you want to install the node packages from within a Docker container (recommended for security), then you can start it like this:\n\n```bash\ndocker run -p 3000:3000 --rm -it -w /mnt -v $(pwd):/mnt node:22.18.0 /bin/bash\n```\n\nFirst create a copy of the environment file `.env.template` in the root of the codebase and rename it to `.env`\n\nThen run the following:\n\n```console\nyarn install\n```\n\n## Local Development\n\nFirst create a local `.env` file to fill in env variable placeholders necessary for setting up the development. Note that these are merely placeholders.\n\n```sh\ncp .env.template .env\n```\nThen 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.\n\n```console\nyarn start\n```\n\nYou can open the local docs at [http://localhost:3000/](http://localhost:3000/)\n\n## Build\n\n```console\nyarn build\n```\n\nThis command generates static content into the `build` directory and can be served using any static contents hosting service.\n\n## Deployment\n\nCreate a PR and once merged, Github actions automatically deploy it.\n\nThe docs use Vercel for hosting, and deployment is done by Vercel on any merge into the master branch.\n"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = {\n  presets: [require.resolve('@docusaurus/core/lib/babel/preset')],\n};\n"
  },
  {
    "path": "docs/brand-assets.mdx",
    "content": "---\ntitle: Brand Assets\n---\n\nimport BrandAssets from \"@site/src/components/BrandAssets/index.tsx\";\n\n<BrandAssets />"
  },
  {
    "path": "docs/cheatsheet.mdx",
    "content": "---\ntitle: Docs Cheatsheet\n---\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\nimport TOCInline from '@theme/TOCInline'\n\nOn this page you'll find every single markdown & mdx component used in our docs\n\n## Page Title & Data\n\nFor 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.\n\nAny thing inbetween the `---` tags will be used for the meta data of the page\n\n```md\n---\ntitle: Cheatsheet\nid: page-id-when-linking-to-it\n---\n```\n\nFor Heading 1 specifically, you should set the page title in the meta data.\n\n[Docusaurus source docs](https://docusaurus.io/docs/next/markdown-features/headings)\n\n```md\n# Heading 1\n```\n\n## Heading 2\n\n```md\n## Heading 2\n```\n\n### Heading 3\n\n```md\n### Heading 3\n```\n\n#### Heading 4\n\n```md\n#### Heading 4\n```\n\n##### Heading 5\n\n```md\n##### Heading 5\n```\n\n###### Heading 6\n\n```md\n###### Heading 6\n```\n\n## Line breaks\n\n```md\nSome text\n\nWith a line between them\n```\n\n## Lists\n\n### Unordered lists\n\n- Unordered list 1\n- Unordered list 2\n- Unordered list 3\n\n```md\n- Unordered list 1\n- Unordered list 2\n- Unordered list 3\n```\n\n### Unordered lists\n\nYou 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\n\n1. Ordererd list 1\n69. Ordererd list 2\n42. Ordererd list 3\n\n\n```md\n1. Ordererd list 1\n69. Ordererd list 2\n42. Ordererd list 3\n```\n\n### Nested & Mixed lists\n\n1. Ordererd list\n    1. Sable\n    2. Ferret\n        - Cat rat\n        - Fox weasel\n    8. Lamp\n69. Ordererd list\n    - Grape\n    - Potatoes\n        - Chips\n            1. Crisps\n            1. Fondant\n            1. Frites\n    - Lemons\n        1. Three cats\n        1. Pasta\n        9. Ragu\n42. Ordererd list\n\n```md\n1. Ordererd list\n    1. Sable\n    2. Ferret\n        - Cat rat\n        - Fox weasel\n    8. Lamp\n69. Ordererd list\n    - Grape\n    - Potatoes\n        - Chips\n            1. Crisps\n            1. Fondant\n            1. Frites\n    - Lemons\n        1. Three cats\n        1. Pasta\n        9. Ragu\n42. Ordererd list\n```\n\n## Text styling\n\n_Italic/Emphasize_\n\n```md\n_Italic/Emphasize_\n```\n\n**Strong/Bold**\n\n```md\n**Strong/Bold**\n```\n\n**_Italic & Bold_**\n\n```md\n**_Italic & Bold_**\n```\n\n## Codeblocks\n\nSo you basically define a section using the ` ``` ` anything between two lines that contain these 3 back quotes will be in the block\n\nIf you want specific formatting for a certain language like for example Javascript here:\n\n```js\nconst threeCats = [\"cat\", \"cat\", \"cat\"]\n```\n\n```md\nMind the indentation here, code blocks in code blocks isn't normal usage\n    ```js\n    const threeCats = [\"cat\", \"cat\", \"cat\"]\n    ```\n```\n\nTheres 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)\n\n\n## Quotes\n\n> Quoted text.\n\n> > Quoted quote.\n\n> Quoted text.\n> > Quoted quote.\n> > > Quoted quote.\n\n> Quoted text.\n> > Quoted quote.\n> > > Quoted quote.\n> > > > Quoted quote.\n\n```md\n> Quoted text.\n\n> > Quoted quote.\n\n> Quoted text.\n> > Quoted quote.\n> > > Quoted quote.\n\n> Quoted text.\n> > Quoted quote.\n> > > Quoted quote.\n> > > > Quoted quote.\n```\n\n## Admonitions\n\nThese are nifty notification blocks [from Docusaurus](https://docusaurus.io/docs/next/markdown-features/admonitions)\n\n:::note\n\nThe content and title *can* include markdown.\n\n:::\n\n:::note Your Title\n\nThe content and title *can* include markdown.\n\n:::\n\n:::tip You can specify an optional title\n\nHeads up! Here's a pro-tip.\n\n:::\n\n:::info\n\nUseful information.\n\n:::\n\n:::caution\n\nWarning! You better pay attention!\n\n:::\n\n:::danger\n\nDanger danger, mayday!\n\n:::\n\n```\n:::note\n\nThe content and title *can* include markdown.\n\n:::\n\n:::note Your Title\n\nThe content and title *can* include markdown.\n\n:::\n\n:::tip You can specify an optional title\n\nHeads up! Here's a pro-tip.\n\n:::\n\n:::info\n\nUseful information.\n\n:::\n\n:::caution\n\nWarning! You better pay attention!\n\n:::\n\n:::danger\n\nDanger danger, mayday!\n\n:::\n```\n\n\n\n## Links\n\nThe links in this paragraph are being pulled from a list [a link][1] and\nanother [link][2].\n\n```md\nThe links in this paragraph are being pulled from a list [a link][1] and\nanother [link][2].\n```\n\n```md\nThis is that list\n\n[1]: http://example.com/ \"Title\"\n[2]: http://example.org/ \"Title\"\n```\n\n[1]: http://example.com/ \"Title\"\n[2]: http://example.org/ \"Title\"\n\n## Images\n\n### Alt tags for images\n\nYou can update the alt tag data for text like this:\n\nLogo: ![Alt](/img/logo.png \"Flashbots logo\")\n\n```md\nLogo: ![Alt](/img/logo.png \"Flashbots logo\")\n```\n\nYou 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\n\nLinked logo: [![alt text](//img/logo.png)](https://docs.flashbots.net/ \"Off to the docs\")\n\n```md\nLinked logo: [![alt text](//img/logo.png)](https://docs.flashbots.net/ \"Off to the docs\")\n```\n\n## MDX features\n\nA 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`\n\nFor example `cheatsheet.mdx`\n\nThis lets you use react components that are a bit more intricate that the standard markdown features.\n\nTo 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:\n\n```\n---\ntitle: Cheatsheet (Heading 1)\n---\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n```\n\n### Tabs\n\nThis is an example of the `tabs` component.\n\nFor extend usage, please refer to the [Docusaurus documentation.](https://docusaurus.io/docs/next/markdown-features/tabs)\n\n<Tabs\n  defaultValue=\"apple\"\n  values={[\n    {label: 'Apple', value: 'apple'},\n    {label: 'Orange', value: 'orange'},\n    {label: 'Banana', value: 'banana'},\n  ]}>\n  <TabItem value=\"apple\">This is an apple 🍎</TabItem>\n  <TabItem value=\"orange\">This is an orange 🍊</TabItem>\n  <TabItem value=\"banana\">This is a banana 🍌</TabItem>\n</Tabs>\n\n```mdx\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\n<Tabs\n  defaultValue=\"apple\"\n  values={[\n    {label: 'Apple', value: 'apple'},\n    {label: 'Orange', value: 'orange'},\n    {label: 'Banana', value: 'banana'},\n  ]}>\n  <TabItem value=\"apple\">This is an apple 🍎</TabItem>\n  <TabItem value=\"orange\">This is an orange 🍊</TabItem>\n  <TabItem value=\"banana\">This is a banana 🍌</TabItem>\n</Tabs>\n```\n\n### Inline Table of Contents\n\nIf you need a table contents literally anywhere, you can make use of the `<TOCInline>` component.\n\nFor extend usage, please refer to the [Docusaurus documentation.](https://docusaurus.io/docs/next/markdown-features/inline-toc)\n\n<TOCInline toc={toc} />\n\n\n```mdx\nimport TOCInline from '@theme/TOCInline'\n\n<TOCInline toc={toc} />\n```\n\n## Footnotes & references\n\nThis is how we make a reference to a foot note or reference that's found at the bottoms of the page.[^1]\n\n```md\nThis is how we make a reference to a footnote [^1] that's found at the bottoms of the page\n```\n\nTo create list of foot notes, you just add list like this somewhere, preferably at the bottom of the file\n\n```md\n[^1]: an amazing foot note, you can add links n things here as usual\n\n```\n\n[^1]: an amazing foot note, you can add links n things here as usual\n"
  },
  {
    "path": "docs/code-of-conduct.mdx",
    "content": "---\ntitle: Code of Conduct\n---\n\nAt Flashbots we contribute with the larger free software community to illuminate the dark forest.\n\nYou are welcome here \\<3.\n\nWe just ask you to be nice. Please start by reading our code of conduct.\n\n### Contributor Covenant Code of Conduct\n\n#### Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, caste, color, religion, or sexual\nidentity and orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n#### Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the overall\n  community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or advances of\n  any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email address,\n  without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n#### Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n#### Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n#### Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement through\nemailing fredrik@flashbots.net or contacting Fred in\n[Discord](https://discord.gg/flashbots).\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n#### Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n##### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n##### 2. Warning\n\n**Community Impact**: A violation through a single incident or series of\nactions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or permanent\nban.\n\n##### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n##### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within the\ncommunity.\n\n#### Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.1, available at\n[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].\n\nCommunity Impact Guidelines were inspired by\n[Mozilla's code of conduct enforcement ladder][Mozilla CoC].\n\nFor answers to common questions about this code of conduct, see the FAQ at\n[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at\n[https://www.contributor-covenant.org/translations][translations].\n\n[homepage]: https://www.contributor-covenant.org\n[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html\n[Mozilla CoC]: https://github.com/mozilla/diversity\n[FAQ]: https://www.contributor-covenant.org/faq\n[translations]: https://www.contributor-covenant.org/translations\n"
  },
  {
    "path": "docs/community-tools.mdx",
    "content": "---\ntitle: Community Tools\n---\n\n### [DotPics Info](https://dotpics.info/)\n\n- A collection of interactive dashboards of the MEV-Boost ecosystem.\n\n### [MEV Data by EigenPhi](https://eigenphi.io/)\n\n- Analytical explorers detailing MEV and liquidity on-chain data.\n\n### [libMEV](https://libmev.com/)\n\n- A living dashboard with MEV searcher data.\n\n### [Ethereum Block Value Analytics](https://payload.de/data/)\n\n- Transaction pool, value over time, and builder bids of Ethereum block.\n\n### [MEV-Boost Dashboard](https://dune.com/ChainsightAnalytics/mev-after-ethereum-merge)\n\n- Overview of MEV-Boost adoption and profitability of proposers and block builders.\n\n### [MEV-Boost Relay & Builder Stats](https://www.relayscan.io/)\n\n- Ethereum MEV-Boost Relay Monitoring.\n"
  },
  {
    "path": "docs/contribution-guide.mdx",
    "content": "---\ntitle: Docs Contribution Guide\n---\nThank you for your interest in adding to our knowledge base!\n\n## Repo structure\nThe 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.\n- All the pages on Docusaurus are created from these mds\n- the docusaurus sidebar is created from the [sidebar.js](https://github.com/flashbots/docs/blob/staging/docs/sidebars.js) file\n\n\n## Cheatsheet\n\nWe've created a simple cheatsheet file with examples of every heading, code block & tab component you can use to create your doc entry.\n\n[Click here to see the reference doc](cheatsheet)\n\n## Contribution steps:\n\n**Step 1:**  Create a branch off of the staging branch\n\n**Step 2:** Add your desired changes to your branch\n- 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)\n\n**Step 3:** Make a PR to the staging branch\n- once your PR is submitted, changes from your PR can be visualized thanks to Render\n    - 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)\n\n**Step 4:** Changes to staging branch (PRs) are reviewed and merged by *docs* admins\n- after review, PRs are merged to the staging branch and your changes are now deployed live to the staging docs website\n\n**Step 5:** Once enough changes have been collected/time is right, staging branch is merged into main branch by *docs* admins\n- changes are now deployed live to the [docs website](/)\n\n## Docusaurus-specific considerations\nThere's a couple things to be aware of when adding your own `*.md` files to our codebase:\n\n- Please remove all `HTML` elements\n- Links are done using `[text](link)` this can link out to external links or to local docs files\n- For images, use the syntax `![Alt Text](image url)` to add an image, alternatively see below:\n\n```md\n<img\n  src={require('../static/img/example-banner.png').default}\n  alt=\"Example banner\"\n/>\n```\n\n### Adding meta data to your doc\n\nThe 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\ncontrol the way the docs are referenced through the site.\n\nThis is done by adding a small section to the top of your doc like this:\n\n```md\n---\ntitle: Example Doc\n---\n```\n\nThat title in the example will automatically add a `# Heading` to your page when it renders\n\nThere are a couple settings available;\n\nSuch as specifying the url you would like using\n\n`slug: /questionably/deep/url/for/no/reason/buckwheat-crepes`\n\nAdding `keywords` or `description` etc, below is a full example:\n```\n---\nid: not-three-cats\ntitle: Three Cats\nhide_title: false\nhide_table_of_contents: false\nsidebar_label: Still not three cats\ncustom_edit_url: https://github.com/flashbots/docs/edit/main/docs/three-cats.md\ndescription: Three cats are not unlike four cats like three cats\nkeywords:\n  - cats\n  - three\nimage: ./assets/img/logo.png\nslug: /myDoc\n---\nMy Document Markdown content\n```\n\n### Side bar navigation\n\nTo 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.\n\nThe `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`\n\nTo read the Docusaurus docs, [click here](https://docusaurus.io/docs/sidebar)\n"
  },
  {
    "path": "docs/flashbots-auction/advanced/bundle-cancellations.mdx",
    "content": "---\ntitle: bundle cancellations\n---\n\nBundle 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.\n\nThis staging environment is limited to sending and cancelling bundles, and\nwill 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.\n\n### Understanding bundle cancellations\n\nBundles can be replaced and canceled using a unique identifier (`replacementUuid`) assigned to a bundle at the time of submission.\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_sendBundle\",\n  \"params\": [\n    {\n      txs,\n      blockNumber,\n      minTimestamp,\n      maxTimestamp,\n      revertingTxHashes,\n      replacementUuid, // UUIDv4 to uniquely identify submission\n    }\n  ]\n}\n```\n\n### Replacing bundles\n\nTo replace a bundle, send the new bundle via `eth_sendBundle` with the same `replacementUuid` as the bundle you want to replace.\n\n### Canceling bundles\n\nCanceling 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).\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_cancelBundle\",\n  \"params\": [\n    {\n      replacementUuid, // UUIDv4 to uniquely identify submission\n    }\n  ]\n}\n```\n"
  },
  {
    "path": "docs/flashbots-auction/advanced/bundle-pricing.md",
    "content": "---\ntitle: Bundle Pricing\n---\n\n## Understanding bundle pricing\n\nSearchers 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.\n\nAt a high level _the Flashbots block builder is designed to include the most profitable transactions possible in the blocks it builds_.\n\nIn **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.\n\nIn **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.\n\nThe 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.\n\n## Bundle ordering formula\n\nThe Flashbots builder employs a new algorithm aimed at maximizing block profitability. This new approach brings about several significant changes that searchers need to understand:\n\n* Instead of ranking and including bundles based off of effective gas price the algorithm now optimizes for overall block profit.\n* Top-of-block execution is no longer a guarantee.\n* Bundle ordering by effective gas price is no longer a guarantee.\n* Other transactions (e.g. from the mempool) may land between bundles (not between transactions in bundles, but between two different bundles).\n  * For example:\n  * If you have a bundle comprised of transactions `[B1, B2]`\n  * and someone else has a bundle comprised of transactions `[C1, C2]`\n  * and there are transactions in the mempool `[t1, t2, ...]`,\n  * then the block may be built such that:\n  * `BLOCK_TXS = [..., B1, B2, t1, t2, C1, C2, ...]`.\n\n## Why aren't my bundles being included?\n\nThere 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.\n\nAlternatively, 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.\n"
  },
  {
    "path": "docs/flashbots-auction/advanced/co-locate.mdx",
    "content": "---\ntitle: Co-locate with Flashbots Builder\n---\n\nFor searchers who want to optimize the latency of their bundle submission, they can choose to co-locate with Flashbots Builders.\n\nThe Flashbots Builder is located in Ohio, USA. Specifically, it is located in the AWS `us-east-2` region.\n"
  },
  {
    "path": "docs/flashbots-auction/advanced/coinbase-payment.mdx",
    "content": "---\ntitle: coinbase.transfer()\n---\n\nFlashbots 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:\n* You can condition payment to the validator on some criteria being met\n* Related, you can only pay for successful transactions, not failures\n* 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))\n\nHere's an example from our open source simple arbitrage bot of how paying through coinbase transfers work:\n\n```solidity\nfunction uniswapWeth(uint256 _wethAmountToFirstMarket, uint256 _ethAmountToCoinbase, address[] memory _targets, bytes[] memory _payloads) external onlyExecutor payable {\n    require (_targets.length == _payloads.length);\n    uint256 _wethBalanceBefore = WETH.balanceOf(address(this));\n    WETH.transfer(_targets[0], _wethAmountToFirstMarket);\n    for (uint256 i = 0; i < _targets.length; i++) {\n        (bool _success, bytes memory _response) = _targets[i].call(_payloads[i]);\n        require(_success); _response;\n    }\n\n    uint256 _wethBalanceAfter = WETH.balanceOf(address(this));\n    require(_wethBalanceAfter > _wethBalanceBefore + _ethAmountToCoinbase);\n    if (_ethAmountToCoinbase == 0) return;\n\n    uint256 _ethBalance = address(this).balance;\n    if (_ethBalance < _ethAmountToCoinbase) {\n        WETH.withdraw(_ethAmountToCoinbase - _ethBalance);\n    }\n    block.coinbase.transfer(_ethAmountToCoinbase);\n}\n```\n\nThe above smart contract code will attempt to capitalize on arbitrage opportunities. If it does not make money doing so then the transaction will fail.\n\nFor more information on how coinbase transfers are priced see the [bundle pricing page](/flashbots-auction/advanced/bundle-pricing).\n\n## Managing payments to coinbase.address when it is a contract\nValidators 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.\n\nTo 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:\n\n```solidity\nblock.coinbase.call{value: _ethAmountToCoinbase}(new bytes(0));\n```\n\nHowever, 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.\n"
  },
  {
    "path": "docs/flashbots-auction/advanced/eip1559.mdx",
    "content": "---\ntitle: EIP-1559 Support\n---\n\nEIP-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.\n\nWhile 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.\n\n## Legacy Transaction example\n\nBelow is an example of signing bundles with a legacy transaction:\n\n```js\nconst signedTransactions = await flashbotsProvider.signBundle([\n  {\n    signer: authSigner,\n    transaction: {\n      to: \"0xf1a54b075fb71768ac31b33fd7c61ad8f9f7dd18\",\n      gasPrice: 10,\n      gasLimit: 33000,\n      chainId: 5,\n      value: 0,\n    },\n  },\n]);\n```\n\nThe full amount of `gasPrice` will be consumed first to clear the base fee, and the remaining will be used as priority fee.\n\n## EIP-1559 Transaction example\n\nBelow is an example of signing bundles with EIP-1559 transactions (note: `chainId` is a required attribute for 1559 or type2 transaction):\n\n```js\nconst block = await provider.getBlock(\"latest\");\nconst maxBaseFeeInFutureBlock =\n  FlashbotsBundleProvider.getMaxBaseFeeInFutureBlock(block.baseFeePerGas, 1);\nconst priorityFee = BigNumber.from(2).pow(9);\nconst signedTransactions = await flashbotsProvider.signBundle([\n  {\n    signer: authSigner,\n    transaction: {\n      to: \"0xf1a54b075fb71768ac31b33fd7c61ad8f9f7dd18\",\n      type: 2,\n      maxFeePerGas: priorityFee.add(maxBaseFeeInFutureBlock),\n      maxPriorityFeePerGas: priorityFee,\n      gasLimit: 33000,\n      chainId: 5,\n      value: 0,\n    },\n  },\n]);\n```\n\nHere 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.\n\n## FAQ\n\n### Can a transaction specify `maxFeePerGas=0`?\n\nNo, all transactions must have maxFeePerGas greater than or equal to `block.baseFeePerGas`, or they are not eligible for inclusion in a block.\n\n### Can a transaction specify `maxPriorityFeePerGas=0`\n\nAbsolutely, 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.\n\n### Will reverting transactions still be discarded?\n\nFlashbots 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.\n\nHowever, 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.\n\n### How can I send a transaction from an account with 0 ETH, like one with a malicious `sweeper` running against it?\n\nWe 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.\n\n### Where can I learn more about EIP-1559?\n\n[EIP-1559 Hackmd Cheat Sheet](https://hackmd.io/@q8X_WM2nTfu6nuvAzqXiTQ/1559-wallets)\n"
  },
  {
    "path": "docs/flashbots-auction/advanced/gas-fee-refunds.md",
    "content": "---\ntitle: Gas Fee Refunds\n---\n\n## Introduction\n\nSearchers 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.\n\nGas fee refunds do not change how bundles are executed and searchers do not need to make any changes to be eligible for them.\n\n## Where do refunds come from\n\nGas fee refunds include both priority fees and coinbase transfers.\n\nIn 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.\n\n## Which bundles receive refunds\n\nFlashbots 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:\n* How much network congestion and competition there was\n* Whether BuilderNet made a profit and how much\n* How much the specific bundle contributed to the value of the block\n* If the bundle was sent directly to Flashbots or BuilderNet, or shared with other block builders by the searcher\n\nNote 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.\n\n## How to maximize both refunds and speed\n\nTransactions 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.\n\nBuilderNet 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.\n\n### Smart multiplexing\n\nTo 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).\n\nAll `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.\n\nFor example:\n\n```\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_sendBundle\",\n  \"params\": [\n    {\n      \"txs\": [\"0x123abc...\", \"0x456def...\"],\n      \"blockNumber\": \"0xb63dcd\",\n      \"minTimestamp\": 0,\n      \"maxTimestamp\": 1615920932\n      \"builders\": [\"builder0x69\", \"beaverbuild.org\"]\n    }\n  ]\n}\n```\n\nSearchers can also use `mev_sendBundle` to multiplex bundles if they prefer. This method is more complex and not necessary for gas fee refunds.\n\n_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._\n\n## How are refunds calculated\n\nBuilderNet 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).\n\n## Who receives refunds\n\nBy 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.\n\n## How to track refunds\n\nRefunds 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). \n\nTrack 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.\n\n## Distributed refunds\n\nThe on-chain transactions corresponding to distributed refunds can be viewed with this Dune query: [https://dune.com/queries/4398421](https://dune.com/queries/4398421)\n"
  },
  {
    "path": "docs/flashbots-auction/advanced/multiplexing.mdx",
    "content": "---\ntitle: Send transaction/bundle to multiple builders\n---\n\nimport Builders from '../../specs/mev-share/_builders.mdx';\n\nSome users might want to send their transactions or bundles to multiple builders for various reasons. The ability to multiplex is supported by our APIs.\n\nIf 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.\n\nIf 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.\n\nBelow is the list of builders that you can multiplex to:\n\n<Builders />\n"
  },
  {
    "path": "docs/flashbots-auction/advanced/reputation.md",
    "content": "---\ntitle: Searcher Reputation\n---\n\nIn 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).\n\n## Reputation queues\n\nThe 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.\n\n## Reputation scoring\n\nTo determine which queue a searcher belongs to, Flashbots looks at their history of submissions to the builder. Specifically, Flashbots uses the following scoring function:\n\n$$\nr(U) = \\frac{\\sum_{T\\in H_U}(\\Delta_{coinbase_T} + g_Tp_T)}{\\sum_{T\\in S_U}g_T}\n$$\n\n$r$: searcher reputation score.  \n$H_U$: set of all transactions $T$ submitted by searcher $U$ to `eth_sendBundle` RPC and successfully landed on chain.  \n$S_U$: set of all transactions $T$ submitted by searcher $U$ to `eth_sendBundle` and `eth_callBundle` RPC.  \n$g_{T}$: _gas used_ by transaction $T$.  \n$p_{T}$: _gas price_ of transaction $T$.  \n$\\Delta_{coinbase_T}$: coinbase difference from direct payment in transaction $T$.\n\n## Querying reputation\n\nFlashbots 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.\n\n## Building reputation\n\nSearcher 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.\n\nAs a searcher, the best way to improve your score is to only submit bundles/transactions which have a high likelihood of landing on chain.\n"
  },
  {
    "path": "docs/flashbots-auction/advanced/rpc-endpoint.mdx",
    "content": "---\ntitle: JSON-RPC Endpoints\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\nimport Hints from '../../specs/mev-share/HintsTable';\nimport Builders from '../../specs/mev-share/_builders.mdx';\nimport SendBundleSpec from '../../specs/mev-share/_mev_sendBundle.mdx';\nimport SimBundleSpec from '../../specs/mev-share/_mev_simBundle.mdx';\n\n## Interact directly with the Flashbots RPC endpoint\n\nAdvanced users can interact with the RPC endpoint at `relay.flashbots.net`, or one of the testnet URLs below.\n\n### Bundle Relay URLS\n\n| Network  | URL                                      |\n| -------- | ---------------------------------------- |\n| Mainnet  | `https://relay.flashbots.net`            |\n| Sepolia  | `https://relay-sepolia.flashbots.net`    |\n\nThe API provides JSON-RPC methods for interfacing with Flashbots. Below are some of the restrictions:\n\n- There is a rate limit of 10,000 requests per second per IP\n- Each bundle (`txs` parameter) can contain at most 100 transactions and have a size limit of 300,000 bytes\n\nEach method is documented below.\n\n### eth_sendBundle\n\n`eth_sendBundle` can be used to send your bundles to the Flashbots builder. The `eth_sendBundle` RPC has the following payload format:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_sendBundle\",\n  \"params\": [\n    {\n      txs,               // Array[String], A list of signed transactions to execute in an atomic bundle\n      blockNumber,       // String, a hex encoded block number for which this bundle is valid on\n      minTimestamp,      // (Optional) Number, the minimum timestamp for which this bundle is valid, in seconds since the unix epoch\n      maxTimestamp,      // (Optional) Number, the maximum timestamp for which this bundle is valid, in seconds since the unix epoch\n      revertingTxHashes, // (Optional) Array[String], A list of tx hashes that are allowed to revert\n      replacementUuid,   // (Optional) String, UUID that can be used to cancel/replace this bundle\n      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\n    }\n  ]\n}\n```\n\nexample:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_sendBundle\",\n  \"params\": [\n    {\n      \"txs\": [\"0x123abc...\", \"0x456def...\"],\n      \"blockNumber\": \"0xb63dcd\",\n      \"minTimestamp\": 0,\n      \"maxTimestamp\": 1615920932\n    }\n  ]\n}\n```\n\nexample response:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": \"123\",\n  \"result\": {\n    \"bundleHash\": \"0x2228f5d8954ce31dc1601a8ba264dbd401bf1428388ce88238932815c5d6f23f\"\n  }\n}\n```\n\nIf `builders` are specified, the response will include an additional `smart` field.\n\nexample with `builders`:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_sendBundle\",\n  \"params\": [\n    {\n      \"txs\": [\"0x123abc...\", \"0x456def...\"],\n      \"blockNumber\": \"0xb63dcd\",\n      \"minTimestamp\": 0,\n      \"maxTimestamp\": 1615920932,\n      \"builders\": [\"builder0x69\"]\n    }\n  ]\n}\n```\n\nexample response:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": \"123\",\n  \"result\": {\n    \"bundleHash\": \"0x2228f5d8954ce31dc1601a8ba264dbd401bf1428388ce88238932815c5d6f23f\",\n    \"smart\": \"true\"\n  }\n}\n```\n\n### mev_sendBundle\n\n`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.\n<SendBundleSpec />\n\nexample request:\n\n```json\n{\n  \"params\": [\n    {\n      \"version\": \"v0.1\",\n      \"inclusion\": {\n        \"block\": \"0x8b8da8\",\n        \"maxBlock\": \"0x8b8dab\"\n      },\n      \"body\": [\n        {\n          \"hash\": \"0x24e6e999b8abf2c4df46e8a02516c0983043039a5a54f89fa87274427ce64798\"\n        },\n        {\n          \"tx\": \"0x02f880058201d685e9103fda0085e9103fda368255f0940000c335bc9d5d1af0402cad63fa7f258363d71a8092696d206261636b72756e6e69696969696e67c080a0c5058ccf5759e29d4ad28e038f632a9b6269bbb0644c61447e0f14d56c453d73a048e877ee621c4b6be1234a8ad84379e80d45b288a7271e2b1aede7a04f06fd98\",\n          \"canRevert\": false\n        }\n      ],\n      \"validity\": {\n        \"refund\": [],\n        \"refundConfig\": []\n      }\n    }\n  ],\n  \"method\": \"mev_sendBundle\",\n  \"id\": 1,\n  \"jsonrpc\": \"2.0\"\n}\n```\n\nexample response:\n\n```json\n{\n  \"bundleHash\": \"0x7d6e491ab67aee5f4b75321c936bf05664d2d9b234fd67083e46bd43bb42f383\"\n}\n```\n\n### eth_callBundle\n\n`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:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_callBundle\",\n  \"params\": [\n    {\n      txs,               // Array[String], A list of signed transactions to execute in an atomic bundle\n      blockNumber,       // String, a hex encoded block number for which this bundle is valid on\n      stateBlockNumber,  // String, either a hex encoded number or a block tag for which state to base this simulation on. Can use \"latest\"\n      timestamp,         // (Optional) Number, the timestamp to use for this bundle simulation, in seconds since the unix epoch\n    }\n  ]\n}\n```\n\nexample:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_callBundle\",\n  \"params\": [\n    {\n      \"txs\": [\"0x123abc...\", \"0x456def...\"],\n      \"blockNumber\": \"0xb63dcd\",\n      \"stateBlockNumber\": \"latest\",\n      \"timestamp\": 1615920932\n    }\n  ]\n}\n```\n\nexample response:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": \"123\",\n  \"result\": {\n    \"bundleGasPrice\": \"476190476193\",\n    \"bundleHash\": \"0x73b1e258c7a42fd0230b2fd05529c5d4b6fcb66c227783f8bece8aeacdd1db2e\",\n    \"coinbaseDiff\": \"20000000000126000\",\n    \"ethSentToCoinbase\": \"20000000000000000\",\n    \"gasFees\": \"126000\",\n    \"results\": [\n      {\n        \"coinbaseDiff\": \"10000000000063000\",\n        \"ethSentToCoinbase\": \"10000000000000000\",\n        \"fromAddress\": \"0x02A727155aeF8609c9f7F2179b2a1f560B39F5A0\",\n        \"gasFees\": \"63000\",\n        \"gasPrice\": \"476190476193\",\n        \"gasUsed\": 21000,\n        \"toAddress\": \"0x73625f59CAdc5009Cb458B751b3E7b6b48C06f2C\",\n        \"txHash\": \"0x669b4704a7d993a946cdd6e2f95233f308ce0c4649d2e04944e8299efcaa098a\",\n        \"value\": \"0x\"\n      },\n      {\n        \"coinbaseDiff\": \"10000000000063000\",\n        \"ethSentToCoinbase\": \"10000000000000000\",\n        \"fromAddress\": \"0x02A727155aeF8609c9f7F2179b2a1f560B39F5A0\",\n        \"gasFees\": \"63000\",\n        \"gasPrice\": \"476190476193\",\n        \"gasUsed\": 21000,\n        \"toAddress\": \"0x73625f59CAdc5009Cb458B751b3E7b6b48C06f2C\",\n        \"txHash\": \"0xa839ee83465657cac01adc1d50d96c1b586ed498120a84a64749c0034b4f19fa\",\n        \"value\": \"0x\"\n      }\n    ],\n    \"stateBlockNumber\": 5221585,\n    \"totalGasUsed\": 42000\n  }\n}\n```\n\n### mev_simBundle\n\n`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.\n\n<SimBundleSpec />\n\nexample request (sent after landing a bundle via `mev_sendBundle`):\n\n```json\n{\n  \"params\": [\n    {\n      \"inclusion\": {\n        \"block\": \"0x8b8da8\",\n        \"maxBlock\": \"0x8b8dab\"\n      },\n      \"body\": [\n        {\n          \"tx\": \"0x02f87b058201d5843b9aca00843b9aca368255f0940000c335bc9d5d1af0402cad63fa7f258363d71a808f696d20736861726969696969696e67c001a00d8d998fb0dc1e4da9b1de477acea54f185153d66d0af45a4ecfd20e453772baa07bd0ad1e1afb3f19749aaa5660f22859a6e485942346cd7186c024a5da747ada\",\n          \"canRevert\": false\n        },\n        {\n          \"tx\": \"0x02f880058201d685e9103fda0085e9103fda368255f0940000c335bc9d5d1af0402cad63fa7f258363d71a8092696d206261636b72756e6e69696969696e67c080a0c5058ccf5759e29d4ad28e038f632a9b6269bbb0644c61447e0f14d56c453d73a048e877ee621c4b6be1234a8ad84379e80d45b288a7271e2b1aede7a04f06fd98\",\n          \"canRevert\": false\n        }\n      ],\n      \"version\": \"v0.1\",\n      \"validity\": {\n        \"refund\": [],\n        \"refundConfig\": []\n      }\n    },\n    {\n      \"parentBlock\": \"0x8b8da8\"\n    }\n  ],\n  \"method\": \"mev_simBundle\",\n  \"id\": 1,\n  \"jsonrpc\": \"2.0\"\n}\n```\n\nexample response:\n\n```json\n{\n  \"success\": true,\n  \"stateBlock\": \"0x8b8da8\",\n  \"mevGasPrice\": \"0x74c7906005\",\n  \"profit\": \"0x4bc800904fc000\",\n  \"refundableValue\": \"0x4bc800904fc000\",\n  \"gasUsed\": \"0xa620\",\n  \"logs\": [{}, {}]\n}\n```\n\n### eth_cancelBundle\n\n`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.\n\n[`eth_cancelPrivateTransaction`](https://docs.alchemy.com/alchemy/apis/ethereum/eth_cancelPrivateTransaction/?a=fb) is also supported on [Alchemy](https://alchemy.com/?a=fb).\n\n:::caution\n`replacementUuid` must have been set when bundle was submitted.\n:::\n\n:::caution\nWhen 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.\n:::\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_cancelBundle\",\n  \"params\": [\n    {\n      replacementUuid, // UUIDv4 to uniquely identify submission\n    }\n  ]\n}\n```\n\n### eth_sendPrivateTransaction\n\n`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.\n\n[`eth_sendPrivateTransaction`](https://docs.alchemy.com/reference/eth-sendprivatetransaction?a=fb) is also supported on [Alchemy](https://alchemy.com?a=fb).\n\nThis method has the following JSON-RPC format:\n\n```typescript\n{\n  jsonrpc: \"2.0\",\n  id: string | number,\n  method: \"eth_sendPrivateTransaction\",\n  params: [{\n    tx,               // String, raw signed transaction\n    maxBlockNumber,   // Hex-encoded number string, optional. Highest block number in which the transaction should be included.\n    preferences?: {\n      fast: boolean,  // Sends transactions to all registered block builders, sets MEV-Share revenue share to 50%\n      privacy?: {     // MEV-Share options; optional\n        hints?: Array< // data about tx to share w/ searchers on mev-share\n            \"contract_address\" |\n            \"function_selector\" |\n            \"calldata\" |\n            \"logs\" |\n            \"hash\"\n        >,\n        builders?: Array< // MEV-Share builders to exclusively receive bundles; optional\n            \"default\" |\n            \"flashbots\"\n        >,\n      },\n      validity?: {\n        refund?: Array<{address, percent}>\n      }\n    }\n  }]\n}\n```\n\nexample request:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_sendPrivateTransaction\",\n  \"params\": [\n    {\n      \"tx\": \"0x123abc...\",\n      \"maxBlockNumber\": \"0xcd23a0\",\n      \"preferences\": {\n        \"fast\": true,\n        \"privacy\": {\n          \"hints\": [\"calldata\", \"transaction_hash\"],\n          \"builders\": [\"default\"]\n        },\n        \"validity\": {\n          \"refund\": [{\"address\": \"0xadd123\", \"percent\": 50}]\n        }\n      }\n    }\n  ]\n}\n```\n\nexample response:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": \"0x45df1bc3de765927b053ec029fc9d15d6321945b23cac0614eb0b5e61f3a2f2a\" // tx hash\n}\n```\n\n#### `privacy`\n\nBy 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.\n\n| Param | Type Info | Description |\n| --- | --- | --- |\n| `hint` | Array of strings | Each hint specifies which data about the transaction will be shared with searchers on mev-share. |\n| `builders` | Array of strings | Builders to grant permission to include the transaction in a block. |\n\n**`hint`**\n\n<Hints />\n\n**`builders`**\n\nFlashbots currently supports sending orderflow to the following block builders. This is subject to change over time.\n\n<Builders />\n\n#### `validity`\n\nValidity is used to specify the address and percentage to pay refund from the backrun of this transaction.\n\nBy default, the refund is paid to the signer of the transaction and 90% of the backrun value is sent to the user by default.\n\nIf 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.\n\n| Param | Type Info | Description |\n| --- | --- | --- |\n| `refund` | Array of objects | Each entry in the array specifies address that should receive refund from backrun and percent of the backrun value. |\n| `refund[].address` | Address | Address that should receive refund. |\n| `refund[].percent` | Number | Percentage of the total backrun value that this address should receive. |\n\n### eth_sendPrivateRawTransaction\n\n`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)\n\nThis method has the following JSON-RPC format:\n\n```typescript\n{\n  jsonrpc: \"2.0\",\n  id: string | number,\n  method: \"eth_sendPrivateRawTransaction\",\n  params: [\n    tx,               // String, raw signed transaction\n    preferences?: {\n      fast: boolean,  // Sends transactions to all registered block builders, sets MEV-Share revenue share to 50%\n      privacy?: {     // MEV-Share options; optional\n        hints?: Array< // data about tx to share w/ searchers on mev-share\n            \"contract_address\" |\n            \"function_selector\" |\n            \"calldata\" |\n            \"logs\" |\n            \"hash\"\n        >,\n        builders?: Array< // MEV-Share builders to exclusively receive bundles; optional\n            \"default\" |\n            \"flashbots\"\n        >,\n      },\n      validity?: {\n        refund?: Array<{address, percent}>\n      }\n    }\n  ]\n}\n```\n\nexample request:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_sendPrivateRawTransaction\",\n  \"params\": [\"0x123abc...\"]\n}\n```\n\nexample response:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": \"0x45df1bc3de765927b053ec029fc9d15d6321945b23cac0614eb0b5e61f3a2f2a\" // tx hash\n}\n```\n\n| Param | Type Info | Description |\n| --- | --- | --- |\n| `params[0]` | String | Raw signed transaction |\n| `params[1]` | Object | Optional private tx preferences, see `preferences` in eth_sendPrivateTransaction. |\n\n### eth_cancelPrivateTransaction\n\nThe `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.\n\n[`eth_cancelPrivateTransaction`](https://docs.alchemy.com/reference/eth-cancelprivatetransaction?a=fb) is also supported for free on [Alchemy](https://alchemy.com?a=fb).\n\nThis method has the following JSON-RPC format:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_cancelPrivateTransaction\",\n  \"params\": [{\n    txHash,   // String, transaction hash of private tx to be cancelled\n  }]\n}\n```\n\nexample request:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_cancelPrivateTransaction\",\n  \"params\": [\n    {\n      \"txHash\": \"0x45df1bc3de765927b053ec029fc9d15d6321945b23cac0614eb0b5e61f3a2f2a\"\n    }\n  ]\n}\n```\n\nexample response:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": true // true if tx successfully cancelled, false if not\n}\n```\n\n### flashbots_getFeeRefundTotalsByRecipient\n\nThe `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.\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"flashbots_getFeeRefundTotalsByRecipient\",\n  \"params\": [\n    recipient,       // String, the address to query for fee refunds\n  ]\n}\n```\n\nThe response contains three fields:\n\n```json\n{\n  \"pending\":\"0x17812ea4fbbe314\",\n  \"received\":\"0x108d1b27b63a213\",\n  \"maxBlockNumber\":\"0x13ddb08\"\n}\n```\n\n- `pending`: the total amount of fee refunds that have been earned but not yet received by the recipient\n- `received`: the total amount of fee refunds that have been received by the recipient\n- `maxBlockNumber`: the highest block number for which fee refunds have been processed\n\n### flashbots_getFeeRefundsByRecipient\n\nThe `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.\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"flashbots_getFeeRefundsByRecipient\",\n  \"params\": [\n    {\n      recipient,       // String, the address to query for fee refunds\n      cursor,          // [optional] String, the cursor to continue from\n    }\n  ]\n}\n```\n\nResponses are paginated and contain the following fields:\n\n```json\n{\n  \"refunds\": [\n    {\n      \"hash\": \"0x...\",\n      \"amount\": \"0x...\",\n      \"blockNumber\": \"0x13ddaa4\",\n      \"status\": \"pending\",\n      \"recipient\": \"0x...\"\n    },\n    ...\n  ],\n  \"cursor\": \"0x...\"\n}\n```\n\nThe `\"refunds\"` field contains an array of per-order fee refunds, each with the following fields:\n\n- `hash`: the bundle hash or transaction hash associated with the fee refund\n- `amount`: the amount of the fee refund, in wei\n- `blockNumber`: the block number the order was contained in\n- `status`: the status of the fee refund, either \"pending\" or \"received\"\n- `recipient`: the address the fee refund is credited to, either the bundle signer or transaction sender\n\nThe `\"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.\n\nNOTE: 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.\n\n### flashbots_getFeeRefundsByBundle\n\nThe `flashbots_getFeeRefundsByBundle` is similar to `flashbots_getFeeRefundsByRecipient` but returns result for the given bundle.\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"flashbots_getFeeRefundsByBundle\",\n  \"params\": [\n    {\n      bundle_hash,       // String, the hash of the bundle\n    }\n  ]\n}\n```\n\n### flashbots_getFeeRefundsByBlock\n\nThe `flashbots_getFeeRefundsByBlock` is similar to `flashbots_getFeeRefundsByRecipient` but returns result for the given block.\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"flashbots_getFeeRefundsByBlock\",\n  \"params\": [\n    {\n      block_number,       // String, hex-encoded block number (e.g. 0x15d0280)\n    }\n  ]\n}\n```\n\n\n\n### flashbots_setFeeRefundRecipient\n\nThe `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.\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"flashbots_setFeeRefundRecipient\",\n  \"params\": [\n    \"0xD2824D2D7D6399a4b9A47F258B870D2AFb213948\",\n    \"0xa273A268CE96E54cF6a7D879B7d016F57E396F48\"\n  ]\n}\n```\n\nIf the first address matches the authentication signature, then a response with `from` and `to` fields in the result will be returned:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": {\n    \"from\":\"0xd2824d2d7d6399a4b9a47f258b870d2afb213948\",\n    \"to\":\"0xa273a268ce96e54cf6a7d879b7d016f57e396f48\"\n  }\n}\n```\n\nIf the signature is invalid or does not match the first address, an appropriate error will be returned instead.\n\n### buildernet_getDelayedRefunds\n\nThe `buildernet_getDelayedRefunds` JSON-RPC method returns detailed information about delayed refunds.\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"buildernet_getDelayedRefunds\",\n  \"params\": [\n    {\n      recipient,       // String, the address that receives delayed refunds\n      blockRangeFrom,  // [optional] String, hex-encoded block number for the start of the range (inclusive)\n      blockRangeTo,    // [optional] String, hex-encoded block number for the end of the range (inclusive)\n      cursor,          // [optional] String, the cursor to continue from\n      hash,            // [optional] String, bundle hash; if provided, you must also set both blockRangeFrom and blockRangeTo\n    }\n  ]\n}\n```\n\nResponses are paginated and contain the following fields:\n\n```json\n{\n  \"refunds\": [\n    {\n      \"hash\": \"0x...\",\n      \"amount\": \"0x...\",\n      \"blockNumber\": \"0x13ddaa4\",\n      \"status\": \"pending\",\n      \"recipient\": \"0x...\"\n    },\n    ...\n  ],\n  \"nextCursor\": \"0x...\"\n  \"indexedUpTo\": \"0x...\"\n}\n```\n\nThe `\"refunds\"` field contains an array of per-order fee refunds, each with the following fields:\n\n- `hash`: the bundle hash that generated delayed refund\n- `amount`: the amount of the delayed refund, in wei\n- `blockNumber`: the block number the order was contained in\n- `status`: the status of the delayed refund, either \"pending\" or \"received\"\n- `recipient`: the address the delayed refund is credited to\n\nThe `\"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.\n\n`\"indexedUpTo\"` contains maximum block number for which delayed refunds are indexed\n\n### buildernet_getDelayedRefundTotalsByRecipient\n\nThe `buildernet_getDelayedRefundTotalsByRecipient` JSON-RPC method returns the total amount of delayed refunds that have been earned by a specific address.\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"buildernet_getDelayedRefundTotalsByRecipient\",\n  \"params\": [{\n    recipient,       // String, the address to query for delayed refunds\n    blockRangeFrom,  // [optional] String, hex-encoded block number for the start of the range (inclusive)\n    blockRangeTo,    // [optional] String, hex-encoded block number for the end of the range (inclusive)\n  }]\n}\n```\n\nThe response contains three fields:\n\n```json\n{\n  \"pending\":\"0x17812ea4fbbe314\",\n  \"received\":\"0x108d1b27b63a213\",\n  \"indexedUpTo\":\"0x13ddb08\"\n}\n```\n\n- `pending`: the total amount of fee refunds that have been earned but not yet received by the recipient\n- `received`: the total amount of fee refunds that have been received by the recipient\n- `indexedUpTo`: the highest block number for which delayed refunds have been processed\n\n\n### flashbots_getMevRefundTotalByRecipient\n\nReturns the total amount of [MEV refunds](/flashbots-protect/mev-refunds) that have been paid to a specific recipient address. This API not require authentication.\n\n#### Request\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"flashbots_getMevRefundTotalByRecipient\",\n  \"params\": [\"0xDCDDAE87EDF1D9F62AE2F3A66EB2018ACD0B2508\"]\n}\n```\n\n#### Response\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": {\n    \"total\": \"0xeff5f44e097dcfac\"\n  }\n}\n```\n\nNote: The total is returned as a hexadecimal string representing the amount in wei.\n\n### flashbots_getMevRefundTotalBySender\n\nReturns 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.\n\nThis API does not require authentication.\n\n#### Request\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"flashbots_getMevRefundTotalBySender\",\n  \"params\": [\"0xDCDDAE87EDF1D9F62AE2F3A66EB2018ACD0B2508\"]\n}\n```\n\n#### Response\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": {\n    \"total\": \"0x4a817c800\"\n  }\n}\n```\n\n### API Response\n\n- All method supports JSON-RPC standards for success response and not supported for error response(V2 methods are exceptions).\n- V2 methods supports JSON-RPC standards for both success and error response.\n\n### Authentication\n\nTo 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.\n\n```curl\ncurl -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\n```\n\nAny 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.\n\nThe 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:\n\n<Tabs\n  defaultValue=\"ethers.js\"\n  values={[\n    { label: 'ethers.js', value: 'ethers.js', },\n    { label: 'web3.py', value: 'web3.py' },\n    { label: 'go', value: 'go' },\n  ]}\n>\n<TabItem value=\"ethers.js\">\n\n```ts\nimport {Wallet, id} from 'ethers';\n\nconst privateKey = '0x1234';\nconst wallet = new Wallet(privateKey);\nconst body =\n  '{\"jsonrpc\":\"2.0\",\"method\":\"eth_sendBundle\",\"params\":[{see above}],\"id\":1}';\nconst signature = wallet.address + ':' + wallet.signMessage(id(body));\n```\n\n</TabItem>\n<TabItem value=\"web3.py\">\n\n```py\nfrom web3 import Web3\nfrom eth_account import Account, messages\n\nbody = '{\"jsonrpc\":\"2.0\",\"method\":\"eth_sendBundle\",\"params\":[{see above}],\"id\":1}'\nmessage = messages.encode_defunct(text=Web3.keccak(text=body).hex())\nsignature = Account.from_key(private_key).address + ':' + Account.sign_message(message, private_key).signature.hex()\n```\n\n</TabItem>\n<TabItem value=\"go\">\n\n```go\nbody := `{\"jsonrpc\":\"2.0\",\"method\":\"eth_sendBundle\",\"params\":[{see above}],\"id\":1}`\nhashedBody := crypto.Keccak256Hash([]byte(body)).Hex()\nsig, err := crypto.Sign(accounts.TextHash([]byte(hashedBody)), privKey)\nsignature := crypto.PubkeyToAddress(privKey.PublicKey).Hex() + \":\" + hexutil.Encode(sig)\n```\n\n</TabItem>\n</Tabs>\n"
  },
  {
    "path": "docs/flashbots-auction/advanced/testnets.mdx",
    "content": "---\ntitle: Testnets\n---\n\nFlashbots operates on Sepolia so that searchers can test Flashbots without risking real funds. \n\n## Bundle Relay URLS\n\n| Network | URL |\n| --- | --- |\n| Mainnet | `https://relay.flashbots.net` |\n| Sepolia | `https://relay-sepolia.flashbots.net` |\n\n## Examples\n\nHere's how to setup the Flashbots Bundle Provider in Ethers to use Goerli or Sepolia:\n\n```js\nconst provider = new ethers.getDefaultProvider(\"goerli\");\n// uncomment the line below to use Sepolia\n// const provider = new ethers.getDefaultProvider(\"sepolia\");\n\nconst authSigner = new ethers.Wallet(\n  '0x2000000000000000000000000000000000000000000000000000000000000000',\n  provider\n);\n\nconst flashbotsProvider = await flashbots.FlashbotsBundleProvider.create(\n  provider,\n  authSigner,\n  // use \"https://relay-sepolia.flashbots.net\" for Sepolia\n  \"https://relay-goerli.flashbots.net\",\n  \"goerli\"\n);\n```\n\nSending 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:\n\n```js\nconst wallet = new ethers.Wallet(SOME_PRIVATE_KEY);\nconst signedTransactions = await flashbotsProvider.signBundle([\n    {\n      signer: wallet,\n      transaction: {\n        to: \"0xf1a54b075fb71768ac31b33fd7c61ad8f9f7dd18\",\n        gasPrice: 10,\n        gasLimit: 21000,\n        chainId: 5,\n        value: 0,\n      },\n    },\n    {\n      signer: wallet,\n      transaction: {\n        to: \"0xf1a54b075fb71768ac31b33fd7c61ad8f9f7dd18\",\n        gasPrice: 10,\n        gasLimit: 21000,\n        chainId: 5,\n        value: 0,\n      },\n    },\n  ]);\n\n  const blockNumber = await provider.getBlockNumber();\n\n  console.log(new Date());\n  const simulation = await flashbotsProvider.simulate(\n    signedTransactions,\n    blockNumber + 1\n  );\n  console.log(new Date());\n\n  // Using TypeScript discrimination\n  if (\"error\" in simulation) {\n    console.log(`Simulation Error: ${simulation.error.message}`);\n  } else {\n    console.log(\n      `Simulation Success: ${blockNumber} ${JSON.stringify(\n        simulation,\n        null,\n        2\n      )}`\n    );\n  }\n  console.log(signedTransactions);\n\n  for (var i = 1; i <= 10; i++) {\n    const bundleSubmission = flashbotsProvider.sendRawBundle(\n      signedTransactions,\n      blockNumber + i\n    );\n    console.log(\"submitted for block # \", blockNumber + i);\n  }\n  console.log(\"bundles submitted\");\n```\n\nThe 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.\n"
  },
  {
    "path": "docs/flashbots-auction/advanced/troubleshooting.mdx",
    "content": "---\ntitle: Bundle Inclusion Troubleshooting\n---\n\n## How to troubleshoot your Flashbots bundle not landing on-chain\n\nUnlike 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:\n\n```\n1. Any transaction failure within the bundle that isn't specified in the optional argument `revertingTxHashes`\n2. Insufficient incentives (the sum of gas price and coinbase transfers) to compensate for the value of block space\n3. Higher bids from competitors for the same opportunity\n4. Late receipt of the bundle, preventing its inclusion in the target block\n5. The validator for the target slot is not running mev-boost\n```\n\nInstead 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.\n\nThe 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).\n\n## Does your transaction work and pay enough?\n\nCovers:\n\n```\n1. Transaction failure (ANY within the bundle)\n2. Incentives (gas price/coinbase transfers) not high enough to offset value of block space\n```\n\nThe first two issues are grouped together as their causes, investigations, and solutions are closely related. Flashbots will not include a bundle if:\n\n1. 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.\n2. The [gas price is below the base fee](/flashbots-auction/advanced/eip1559#faq), as this would result in an invalid block if included.\n3. 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.\n\nAs 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:\n\n1. 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.\n2. It provides the gas used and the coinbase transfer for each transaction. The coinbase transfer is a factor in the effective gas price calculation.\n3. It allows for the precise specification of the following arguments, enabling a more accurate simulation:\n   - State block number: This determines the values read from SLOADs.\n   - EVM block number: This determines the value returned from `block.number`.\n   - EVM timestamp: This determines the value returned from `block.timestamp`.\n\nThe 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.\n\n```js\nconst signedTransactions =\n  await flashbotsProvider.signBundle(transactionBundle);\nconst simulation = await flashbotsProvider.simulate(\n  signedTransactions,\n  targetBlockNumber,\n  targetBlockNumber + 1,\n);\nconsole.log(JSON.stringify(simulation, null, 2));\n```\n\nOutput:\n\n```js\n{\n  \"totalGasUsed\": 98564,\n  \"bundleHash\": \"0x9a6a9fa038343fe3c57260fb7bdb2c79ebadb3088656300d8a494123ebda6d85\",\n  \"coinbaseDiff\": BigNumber(0x034dc9949767a4),\n  },\n  \"results\": [\n    {\n      \"coinbaseDiff\": \"929953106847652\",\n      \"ethSentToCoinbase\": \"0\",\n      \"fromAddress\": \"0x9874Ef8519a0Fc7a6B553aad92fDF0E469488931\",\n      \"gasFees\": \"929953106847652\",\n      \"gasPrice\": \"35008022393\",\n      \"gasUsed\": 29964,\n      \"toAddress\": \"0x48B2dD9CEFbA73c60882478a16BC3428Aceed2B9\",\n      \"txHash\": \"0xee3f6f22bf3b4740b36833d41d4872f48f98c6328fa04b3679558e482ba0e328\",\n      \"value\": \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n    },\n    ...\n  ],\n}\n```\n\nTo 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.\n\n## Is your bundle paying enough to be competitive?\n\nCovers:\n\n```\n3. Competitors paying more\n```\n\n[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.\n\nWhile you cannot see a competitor's bid in real time, it is possible to look onchain AFTER the fact to:\n\n1. Identify the exact bundle (if any) that conflicted with yours\n2. Compare the conflicting bundle's `effective priority fee` with your own (to see if you should be bidding more to remain competitive)\n\n### Types of conflicts\n\nThere are numerous reasons why two bundles might conflict. Consider that the basic algorithm for merging bundles is:\n\n1. Simulate each bundle at the top of the block\n2. Sort bundles by `effective priority fee`, highest first\n3. 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\n\nA 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:\n\n1. **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.\n2. **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\n3. **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.\n\n### Detecting\n\nIf 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:\n\n1. Simulate your bundle at the head of the target block, note its revert states and `effective priority fee`\n2. Fetch all bundles found in the target block\n3. Simulate [bundle1 + your bundle] as a single bundle, check the behavior of your bundle\n4. Simulate [bundle1 + bundle2 + your bundle] as a single bundle, see the behavior of your bundle\n5. Simulate [bundle1 + bundle2 + ...bundleN + your bundle] as a single bundle, see the behavior of your bundle\n6. And so on...\n\nUsing 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()`:\n\n```js\nconst signedTransactions =\n  await flashbotsProvider.signBundle(transactionBundle);\nconsole.log(\n  await flashbotsProvider.getConflictingBundle(\n    signedTransactions,\n    13140328, // blockNumber\n  ),\n);\n```\n\nOutput:\n\n```js\n{\n  \"conflictType\": FlashbotsBundleConflictType.NonceCollision,\n  \"initialSimulation\": {\n    \"totalGasUsed\": 205860,\n    \"bundleHash\": \"0x1720ea33d96dca026dddd5689f8cad21966988348ced04e9054a0dca5d60f1d4\",\n    \"coinbaseDiff\": BigNumber(0x0176750858d000),\n    },\n    \"results\": [...]\n  },\n  \"targetBundleGasPricing\": {\n    \"gasUsed\": 205860,\n    \"txCount\": 1,\n    \"gasFeesPaidBySearcher\": BigNumber(0x0176750858d000),\n    \"priorityFeesReceivedByMiner\": BigNumber(0x52efd8d80dbc24),\n    \"ethSentToCoinbase\": BigNumber.from(0x00),\n    \"effectiveGasPriceToSearcher\": BigNumber(0x77359400),\n    \"effectivePriorityFeeToMiner\": BigNumber(0x1a6734f601)\n  },\n  \"conflictingBundleGasPricing\": {\n    \"gasUsed\": 396462,\n    \"txCount\": 3,\n    \"gasFeesPaidBySearcher\": BigNumber(0xc4c3c97ce1bff8b4),\n    \"priorityFeesReceivedByMiner\": BigNumber(0xc4213e4d7ad82006),\n    \"ethSentToCoinbase\": BigNumber(0xc4c2663d3b804731),\n    \"effectiveGasPriceToSearcher\": BigNumber(0x410ce509aa1e),\n    \"effectivePriorityFeeToMiner\": BigNumber(0x40f2069f201d)\n  },\n  \"conflictingBundle\": [\n    {\n      \"transaction_hash\": \"0x23a33038289dda1b6e722835d2b9388cb41d96d085c19ca6b71bb3e9697e6692\",\n      \"tx_index\": 0,\n      \"bundle_type\": \"flashbots\",\n      \"bundle_index\": 0,\n      \"block_number\": 13140328,\n      \"eoa_address\": \"0x38563699560e4512c7574C8cC5Cf89fd43923BcA\",\n      \"to_address\": \"0x000000000035B5e5ad9019092C665357240f594e\",\n      \"gas_used\": 100893,\n      \"gas_price\": \"0\",\n      \"coinbase_transfer\": \"0\",\n      \"total_miner_reward\": \"0\"\n    },\n   ...\n  ]\n}\n```\n\n:::note\n\nParameters 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.\n\n:::\n\nTo 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.\n\nIf your bundles are not outbid by a conflicting bundle, check to see if your bundles are being received too late:\n\n## Is your bundle received too late?\n\nCovers:\n\n```\n4. Bundle received too late to appear in target block\n```\n\nEach 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:\n\n1. Arrive at the builder\n2. Undergo simulation\n3. Be included in a block\n4. Reach the validator through an mev-boost relay\n\nAll 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.\n\nIt'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.\n\nTo 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).\n\n```js\nconsole.log(\n  await flashbotsProvider.getBundleStats(\n    \"0x123456789abcdef123456789abcdef123456789abcdef123456789abcdef1234\",\n    13509887,\n  ),\n);\n```\n\nOutput:\n\n```json\n{\n  \"isSimulated\": true,\n  \"isSentToMiners\": true,\n  \"isHighPriority\": true,\n  \"simulatedAt\": \"2021-10-29T04:00:50.526Z\",\n  \"submittedAt\": \"2021-10-29T04:00:50.472Z\",\n  \"sentToMinersAt\": \"2021-10-29T04:00:50.546Z\"\n}\n```\n\n:::note\n\nParameters 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.\n\n:::\n\nAnalyze the timestamps above in relation to when you observe the targeted block being propagated to your node.\n\n- If the time difference is minimal, focus on reducing your processing time and network latency.\n- If there is a significant delay between `sentToMinersAt` and when you observe the target block, proceed to the next section for further troubleshooting.\n\n## Is the validator for a particular block/slot running mev-boost?\n\n```\n5. A validator for target slot not running mev-boost\n```\n\nmev-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.\n\nIf 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.\n\n## Everything checks out, what's next?\n\nOnce you have validated the above issues are not affecting your bundle submission, consider filling out the Flashbots searcher support form:\n\n[Fill out our Searcher Issue Reporting Form](https://flashbots.notion.site/Searcher-Issue-Reporting-Form-700a5ff3843a443c993912099b4c1b56)\n\nBe sure to include the output from the above RPC calls:\n\n- eth_callBundle / simulate\n- eth_getBundleStats\n- getConflictingBundle\n\nin the form submission.\n"
  },
  {
    "path": "docs/flashbots-auction/advanced/understanding-bundles.mdx",
    "content": "---\ntitle: Understanding Bundles\n---\n\nSearchers 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:\n\n```js\nconst blockNumber = await provider.getBlockNumber()\nconst minTimestamp = (await provider.getBlock(blockNumber)).timestamp\nconst maxTimestamp = minTimestamp + 120\nconst signedBundle = flashbotsProvider.signBundle(\n  [\n    {\n      signedTransaction: SIGNED_ORACLE_UPDATE_FROM_PENDING_POOL // serialized signed transaction hex\n    },\n    {\n      signer: wallet, // ethers signer\n      transaction: transaction // ethers populated transaction object\n    }\n  ])\nconst bundleReceipt = await flashbotsProvider.sendRawBundle(\n  signedBundle, // bundle we signed above\n  targetBlockNumber, // block number at which this bundle is valid\n  {\n    minTimestamp, // optional minimum timestamp at which this bundle is valid (inclusive)\n    maxTimestamp, // optional maximum timestamp at which this bundle is valid (inclusive)\n    revertingTxHashes: [tx1, tx2] // optional list of transaction hashes allowed to revert. Without specifying here, any revert invalidates the entire bundle.\n  })\n```\n\nIn 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.\n"
  },
  {
    "path": "docs/flashbots-auction/example-searchers/searcher-minter.md",
    "content": "---\ntitle: Searcher Minter\n---\nsearcher-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.\n\nYou 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)\n\nAccess the searcher-minter repository [here](https://github.com/flashbots/searcher-minter)\n"
  },
  {
    "path": "docs/flashbots-auction/example-searchers/searcher-sponsored-tx.md",
    "content": "---\ntitle: Searcher Sponsored TX\n---\nsearcher-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.\n\nWe 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).\n"
  },
  {
    "path": "docs/flashbots-auction/example-searchers/simple-arbitrage-bot.md",
    "content": "---\ntitle: Simple Arbitrage Bot\n---\nsimple-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.**\n\nWe 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).\n"
  },
  {
    "path": "docs/flashbots-auction/example-searchers/synthetix-searcher.md",
    "content": "---\ntitle: Synthetix Searcher\n---\nThis 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.\n\nAn 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.\n\nAccess the [synthetix searcher repository here](https://github.com/bertmiller/sMEV).\n"
  },
  {
    "path": "docs/flashbots-auction/faq.md",
    "content": "---\ntitle: FAQ\n---\n\nThe FAQ has been moved to the [Flashbots Collective Forum](https://collective.flashbots.net/).\n\nIf 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.\n"
  },
  {
    "path": "docs/flashbots-auction/libraries/alchemyprovider.md",
    "content": "---\ntitle: Alchemy Provider\n---\nThe 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.\n\nBenefits of the Alchemy SDK include providing:\n\n**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)\n\n**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\n\n**3. Webhook based notifications on [included and dropped private transactions](https://docs.alchemy.com/docs/alchemy-notify#features)**\n\nTo get started:\n\n* [https://www.alchemy.com/sdk](https://www.alchemy.com/sdk)\n\n* [https://docs.alchemy.com/reference/sendprivatetransaction-sdk-v3](https://docs.alchemy.com/reference/sendprivatetransaction-sdk-v3)\n\n* [https://github.com/alchemyplatform/alchemy-sdk-js](https://github.com/alchemyplatform/alchemy-sdk-js)\n"
  },
  {
    "path": "docs/flashbots-auction/libraries/bundle-relay.md",
    "content": "---\ntitle: Bundle Relay Clients\n---\n\nThe following clients connect to the Bundle Relay API, which exposes [these JSON-RPC methods](/docs/flashbots-auction/advanced/rpc-endpoint.mdx).\n\n- [ethers-js](/docs/flashbots-auction/libraries/ethers-js-provider.md)\n- [golang](/docs/flashbots-auction/libraries/golang.md)\n- [web3.py](/docs/flashbots-auction/libraries/web3py-provider.md)\n- [Alchemy API](/docs/flashbots-auction/libraries/alchemyprovider.md)\n\nMEV-Share endpoints (e.g. `mev_sendBundle`) are implemented in [their own libraries](/docs/flashbots-auction/libraries/mev-share-clients.md).\n"
  },
  {
    "path": "docs/flashbots-auction/libraries/ethers-js-provider.md",
    "content": "---\ntitle: Ethers.js Provider\n---\n\nethers-provider-flashbots-bundle is a repository that contains the `FlashbotsBundleProvider` ethers.js provider to provide high-level access to the `eth_sendBundle` rpc endpoint.\n\nFlashbots 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.\n\nThis library is not a fully functional ethers.js implementation, just a simple provider class, designed to interact with your existing ethers.js v5 module.\n\nAccess the ethers-provider-flashbots-bundle repository [here](https://github.com/flashbots/ethers-provider-flashbots-bundle).\n"
  },
  {
    "path": "docs/flashbots-auction/libraries/golang.md",
    "content": "---\ntitle: Golang Provider\n---\n_These libraries are provided and maintained by third-parties rather than Flashbots. Please exercise caution._\n\nThe Golang libraries provide high-level access to the `eth_sendBundle` and `eth_callBundle` RPC endpoints on the Flashbots builder.\n\nFlashbots 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`).\n\nGolang libraries:\n\n* [github.com/metachris/flashbotsrpc](https://github.com/metachris/flashbotsrpc)\n* [github.com/cryptoriums/flashbot](https://github.com/cryptoriums/flashbot)\n"
  },
  {
    "path": "docs/flashbots-auction/libraries/mev-share-clients.md",
    "content": "---\ntitle: MEV-Share Clients\n---\n\n* [mev-share-client-ts](https://github.com/flashbots/mev-share-client-ts)\n* [mev-share-rs](https://github.com/paradigmxyz/mev-share-rs)\n* [mev-share-go](https://github.com/duoxehyon/mev-share-go)\n* [mev-share-java](https://github.com/optimism-java/mev-share-java)\n* [mev-share-py](https://github.com/ZigaMr/mev-share-py)\n\n> :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!\n"
  },
  {
    "path": "docs/flashbots-auction/libraries/rust-provider.md",
    "content": "---\ntitle: Rust Provider\n---\n\nEthers-flashbots is a robust and user-friendly Rust library for interacting with flashbots. \n\nBy using this library, you can easily access the flashbots endpoints and send bundles of transactions with little effort from you favorite language. \n\nThis 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. \n\nWith 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)"
  },
  {
    "path": "docs/flashbots-auction/libraries/web3py-provider.md",
    "content": "---\ntitle: Web3.py Provider\n---\nweb3-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\na middleware which captures calls to `eth_sendBundle` and `eth_callBundle`, and sends\nthem to an RPC endpoint which you have specified, which corresponds your preferred block builder.\n\nTo apply correct headers, we use FlashbotProvider which injects the correct header on post.\n\nAccess the web3-flashbots repository [here](https://github.com/flashbots/web3-flashbots).\n"
  },
  {
    "path": "docs/flashbots-auction/other-resources.md",
    "content": "---\ntitle: Other Resources\n---\n\nRemember 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/).\n\nBelow are a list of useful resources for searchers to wrap their heads around running Flashbots:\n\n* [Walking through simple-arbitrage](https://www.youtube.com/watch?v=wn8r674U1B4) by Robert Miller\n* [Finding & Capturing MEV 101](https://www.youtube.com/watch?v=70WtsHtFd8Y) by thegostep & Robert Miller\n* [Using Flashbots to Mint NFTs on Ethereum - Part 1](https://youtu.be/1ve1YIpDs_I) by Scott Bigelow\n* [Anatomy of an MEV Strategy: Synthetix](https://www.bertcmiller.com/2021/09/05/mev-synthetix.html) by Robert Miller\n* [A thread of all of Robert's MEV-related twitter threads](https://twitter.com/bertcmiller/status/1402665992422047747?s=20) by Robert Miller\n* [Flashbots: MEV Of The Week thread](https://twitter.com/epheph/status/1357089176898969600?s=20) by Scott Bigelow\n* [Lost ENS sanctuary using Flashbots](https://twitter.com/andrekorol1/status/1358252320207876104?s=19) by Andre Korol 🔥\n"
  },
  {
    "path": "docs/flashbots-auction/overview.mdx",
    "content": "---\ntitle: Overview\n---\n\nFlashbots 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.\n\nFlashbots 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.\n\nIn PoS Ethereum, the Flashbots Auction is built on [mev-boost](https://boost.flashbots.net/), an implementation of proposer-builder separation for Ethereum.\n\n## Why Flashbots Auction?\n\nThroughout 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.\n\nThe 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.\n\nWe'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.\n\n## Timeline\n\n- July 2020: Formation of MEV-Ship Research Collective.\n- November 2020: Formation of Flashbots Research Organization and proposal of [Flashbots Auction architecture](https://ethresear.ch/t/flashbots-frontrunning-the-mev-crisis/8251).\n- January 2021: Flashbots Auction Alpha (v0.1) made available for miners and searchers to adopt.\n- May 2021: Flashbots Auction Alpha (v0.2) made available for miners and searchers to adopt.\n- August 2021: Flashbots Auction Alpha (v0.3) made available for miners and searchers to adopt.\n- September 2021: Flashbots Auction Alpha (v0.4) made available for miners and searchers to adopt.\n- February 2022: Flashbots Auction Alpha (v0.5) made available for miners and searchers to adopt.\n- February, 2022: Flashbots Auction Alpha (v0.6) made available for miners and searchers to adopt.\n\n## How does it work?\n\nFlashbots 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.\n\nIn 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.\n\nHere are the key issues with this mechanism:\n\n1. 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.\n2. 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.\n3. 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.\n\nInstead, 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.\n\n## Roadmap\n\nThe 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.\n\nThe ultimate design goals include:\n\n- **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.\n- **Failed trade privacy**: Losing bids are never included in a block, thus they remain unknown to the public.\n- **Efficiency**: MEV extraction is conducted without causing unnecessary network or chain congestion.\n- **Bundle merging**: Multiple incoming bundles can be merged without conflict.\n- **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.\n- **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.\n- **Permissionless**: This system does not rely on trusted intermediaries, thus eliminating the possibility of transaction censorship.\n\n| Stage                | PGA | DarkPool | ⚡🤖 v0.1 | ⚡🤖 v0.2 | ⚡🤖 v0.3 | ⚡🤖 v0.4 | ⚡🤖 v1.0 |\n| -------------------- | :-: | :------: | :-------: | :-------: | :-------: | :-------: | :-------: |\n| Pre-trade privacy    | ❌  |    ✅    |    ✅     |    ✅     |    ✅     |    ✅     |    ✅     |\n| Failed trade privacy | ❌  |    ❌    |    ✅     |    ✅     |    ✅     |    ✅     |    ✅     |\n| Efficiency           | ❌  |    ❌    |    ✅     |    ✅     |    ✅     |    ✅     |    ✅     |\n| Bundle merging       | ❌  |    ❌    |    ❌     |    ✅     |    ✅     |    ✅     |    ✅     |\n| Finality protection  | ❌  |    ❌    |    ❌     |    ❌     |    ❌     |    ❌     |    ✅     |\n| Complete privacy     | ❌  |    ❌    |    ❌     |    ❌     |    ❌     |    ❌     |    ✅     |\n| Permissionless       | ✅  |    ❌    |    ❌     |    ❌     |    ❌     |    ❌     |    ✅     |\n\n## Technical Architecture\n\nThe 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.\n\n<div style={{textAlign: 'center'}}>\n\n![Auction Architecture](/img/mevboost-searcher-bundle-flow.png)\n\n</div>\n\nFlashbots Auction introduces a new `eth_sendBundle` RPC which standardizes the message format in the communication channel. This message is called a \"Flashbots Bundle\".\n\nThe bundle comprises an array of arbitrary signed Ethereum transactions, accompanied by metadata that specifies the conditions under which these transactions should be included.\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_sendBundle\",\n  \"params\": [\n    {\n      txs,               // Array[String], A list of signed transactions to execute in an atomic bundle\n      blockNumber,       // String, a hex encoded block number for which this bundle is valid on\n      minTimestamp,      // (Optional) Number, the minimum timestamp for which this bundle is valid, in seconds since the unix epoch\n      maxTimestamp,      // (Optional) Number, the maximum timestamp for which this bundle is valid, in seconds since the unix epoch\n      revertingTxHashes, // (Optional) Array[String], A list of tx hashes that are allowed to revert\n    }\n  ]\n}\n```\n\n### Searchers\n\nSearchers 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.\n\nSearchers typically fall into one of the following categories:\n\n1. Ethereum bot operators seeking swift and risk-free access to blockspace, such as arbitrage and liquidation bots.\n2. Ethereum users seeking protection from frontrunning for their transactions, such as Uniswap traders.\n3. Ethereum Dapps that require advanced features like account abstraction or gasless transactions.\n\n<div className=\"med caption-img\">\n\n![Searcher Architecture](/img/searcher-architecture.png)\n\nSearchers create bundles with information from various sources and send them to a block builder.\n\n</div>\n\nSearchers 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.\n\nSee the [searcher quick-start guide](/flashbots-auction/quick-start) to learn how to get started.\n\n### Block Builders\n\nBlock 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.\n\n<div className=\"med caption-img\">\n\n![Block Builder Flow](/img/block-builder-flow.png)\n\nBlock builders construct blocks by integrating bundles from searchers and transactions from the mempool, which are submitted by regular users.\n\n</div>\n\n⚠️ Not all builders can be trusted ⚠️\n\nBuilders 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:\n\n- Do they uphold fair and unbiased execution principles?\n  - A reputable builder will refrain from front-running, sandwiching, or censoring bundles, and will avoid exploiting privileged data access.\n- Are they connected to a reliable relay (or relays)?\n  - Remember that relays also have visibility of raw transactions, which could potentially enable front-running, censorship, and other manipulative practices.\n- Are their relays linked to a sufficient number of validators?\n  - 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.\n  - Note: Any validator can [utilize mev-boost to establish connections with the Flashbots relay and other relays](https://github.com/flashbots/mev-boost#usage).\n  - 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).\n\nKeep 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.\n\nLearn more about the [trust assumptions of the Flashbots Auction](#trust-assumptions).\n\n### Relays\n\nRelays 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.\n\n<div className=\"med caption-img\">\n\n![Relay Flow](/img/relay-flow.png)\n\nThe relay selects the most profitable block from the builders it is connected to and holds it in escrow for the validator.\n\n</div>\n\nIn 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.\n\nSpecifically, relays do the following:\n\n- Receive new blocks from builders\n- Send the header of the most profitable block to a validator upon request\n  - The validator secures their commitment to propose the full block by signing this header\n- Send the full block to the validator after receiving the block header signed by the validator\n- Execute all of these tasks swiftly and reliably to ensure validators meet proposal deadlines\n\nFor 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).\n\nFor 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).\n\nLearn more about the [trust assumptions of the Flashbots Auction](#trust-assumptions).\n\n### Validators\n\nIn 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).\n\n<div className=\"med caption-img\">\n\n![Validator Flow](/img/validator-flow.png)\n\nValidator uses mev-boost to choose the most profitable block to propose from multiple relays.\n\n</div>\n\nBy 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).\n\nLearn more about the [trust assumptions of the Flashbots Auction](#trust-assumptions).\n\n## Trust Assumptions\n\nThe 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.\n\nLooking 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.\n"
  },
  {
    "path": "docs/flashbots-auction/quick-start.mdx",
    "content": "---\ntitle: Quick Start\n---\n\nimport Tabs from \"@theme/Tabs\";\nimport TabItem from \"@theme/TabItem\";\n\nThis 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).\n\nSee you on-chain! ⚡🤖\n\n### Bundle Relay URLS\n\n| Network | URL                                   |\n| ------- | ------------------------------------- |\n| Mainnet | `https://relay.flashbots.net`         |\n| Sepolia | `https://relay-sepolia.flashbots.net` |\n\n### Who should use Flashbots Auction?\n\n1. Ethereum bot operators (we call them \"searchers\") looking for fast, and risk free access to blockspace (for example, arbitrage and liquidation bots)\n2. Ethereum users looking for frontrunning protection on their transactions (for example, Uniswap traders)\n3. Ethereum Dapps with advanced use cases like account abstraction or gasless transactions\n\n### How does Flashbots work for searchers?\n\nFlashbots 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.\n\nGetting onboarded to Flashbots is easy for searchers; you simply need to update how you send transactions.\n\n### How to send your first Flashbots bundle\n\nTo access the Flashbots network you will need three things:\n\n1. A unique ECDSA-secp256k1 key pair for Flashbots to identify you\n2. A method to communicate with the Flashbots network\n   - [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.\n3. A \"bundle\" comprising your transactions\n\nWhen 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.\n\nIt'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.\n\nNext, 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:\n\n<Tabs\n  defaultValue=\"ethers.js\"\n  values={[\n    { label: 'ethers.js', value: 'ethers.js', },\n    { label: 'web3.py', value: 'web3.py' },\n    { label: 'go', value: 'go' },\n\t{ label: 'rust', value: 'rust'},\n  ]}\n>\n<TabItem value=\"ethers.js\">\n\n```ts\nconst { ethers } = require(\"ethers\");\nconst {\n  FlashbotsBundleProvider,\n} = require(\"@flashbots/ethers-provider-bundle\");\n\n// Standard json rpc provider directly from ethers.js. You can use Infura, Alchemy, or your own node.\nconst provider = new ethers.providers.JsonRpcProvider({\n  url: ETHEREUM_RPC_URL,\n});\n\n// `authSigner` is an Ethereum private key that does NOT store funds and is NOT your bot's primary key.\n// This is an identifying key for signing payloads to establish reputation and whitelisting\nconst authSigner = new ethers.Wallet(\n  \"0x0000000000000000000000000000000000000000000000000000000000000000\"\n);\n\n// Flashbots provider requires passing in a standard provider and an auth signer\nconst flashbotsProvider = await FlashbotsBundleProvider.create(\n  provider,\n  authSigner\n);\n```\n\n</TabItem>\n<TabItem value=\"web3.py\">\n\n```python\nimport os\n\nfrom eth_account.account import Account\nfrom eth_account.signers.local import LocalAccount\nfrom flashbots import flashbot\n  from web3 import Web3, HTTPProvider\n\n\n# Create a web3 object with a standard json rpc provider, such as Infura, Alchemy, or your own node.\nw3 = Web3(HTTPProvider(\"http://localhost:8545\"))\n\n# ETH_ACCOUNT_SIGNATURE is an Ethereum private key that does NOT store funds and is NOT your bot's primary key.\n# This is an identifying key for signing payloads to establish reputation and whitelisting\nETH_ACCOUNT_SIGNATURE: LocalAccount = Account.from_key(os.environ.get(\"ETH_SIGNATURE_KEY\"))\n\n# Flashbots providers require both a standard provider and ETH_ACCOUNT_SIGNATURE (to establish reputation)\nflashbot(w3, ETH_ACCOUNT_SIGNATURE)\n```\n\n</TabItem>\n<TabItem value=\"go\">\n\n```go\npackage main\n\nimport (\n\t\"bytes\"\n\t\"crypto/ecdsa\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/ethereum/go-ethereum/accounts\"\n\t\"github.com/ethereum/go-ethereum/common/hexutil\"\n\t\"github.com/ethereum/go-ethereum/crypto\"\n)\n\nconst (\n\tflashbotURL     = \"https://relay.flashbots.net\"\n\tflashbotXHeader = \"X-Flashbots-Signature\"\n)\n\nvar (\n\t// authSigner is an Ethereum private key that does NOT store funds and is NOT your bot's primary key.\n\t// This is an identifying key for signing payloads to establish reputation and whitelisting\n\tprivateKey, _ = crypto.HexToECDSA(\n\t\t\"2e19800fcbbf0abb7cf6d72ee7171f08943bc8e5c3568d1d7420e52136898154\",\n\t)\n)\n\nfunc flashbotHeader(signature []byte, privateKey *ecdsa.PrivateKey) string {\n\treturn crypto.PubkeyToAddress(privateKey.PublicKey).Hex() +\n\t\t\":\" + hexutil.Encode(signature)\n}\n\nfunc main() {\n\t// Example: create a Flashbots authenticated request\n\tmevHTTPClient := &http.Client{\n\t\tTimeout: time.Second * 3,\n\t}\n\n\t// Prepare your RPC request (e.g., eth_sendBundle, eth_callBundle, etc.)\n\tparams := map[string]interface{}{\n\t\t\"jsonrpc\": \"2.0\",\n\t\t\"id\":      1,\n\t\t\"method\":  \"eth_sendBundle\", // or other Flashbots RPC methods\n\t\t\"params\":  []interface{}{ /* your bundle params */ },\n\t}\n\n\tpayload, _ := json.Marshal(params)\n\treq, _ := http.NewRequest(\"POST\", flashbotURL, bytes.NewBuffer(payload))\n\n\t// Sign the payload for Flashbots authentication\n\theaderReady, _ := crypto.Sign(\n\t\taccounts.TextHash([]byte(hexutil.Encode(crypto.Keccak256(payload)))),\n\t\tprivateKey,\n\t)\n\n\treq.Header.Add(\"content-type\", \"application/json\")\n\treq.Header.Add(\"Accept\", \"application/json\")\n\treq.Header.Add(flashbotXHeader, flashbotHeader(headerReady, privateKey))\n\n\tresp, _ := mevHTTPClient.Do(req)\n\tres, _ := ioutil.ReadAll(resp.Body)\n\tfmt.Println(string(res))\n}\n```\n\n</TabItem>\n<TabItem value=\"rust\">\n\n```rust\nuse ethers::core::rand::thread_rng;\nuse ethers::prelude::*;\nuse ethers_flashbots::*;\nuse std::convert::TryFrom;\nuse url::Url;\n\n#[tokio::main]\nasync fn main() {\n    // Connect to the network\n    let provider = Provider::<Http>::try_from(\"https://www.ankr.com/rpc/eth/\").unwrap();\n\n    // This is your searcher identity\n    let bundle_signer = LocalWallet::new(&mut thread_rng());\n\n    // This signs transactions and is randomly generated in this example\n    let wallet = LocalWallet::new(&mut thread_rng());\n\n    // Add signer and Flashbots middleware\n    let flashbots_client = SignerMiddleware::new(\n        FlashbotsMiddleware::new(\n            provider,\n            Url::parse(\"https://relay.flashbots.net\").unwrap(),\n            bundle_signer,\n        ),\n        wallet,\n    );\n}\n```\n\n</TabItem>\n</Tabs>\n\nNow that we have a private key to identify ourselves with and a Flashbots provider we can create and send a bundle. Here's how:\n\n<Tabs\n  defaultValue=\"ethers.js\"\n  values={[\n    { label: 'ethers.js', value: 'ethers.js', },\n\t{ label: 'rust', value: 'rust', },\n  ]}\n>\n<TabItem value=\"ethers.js\">\n\n```js\nconst { ethers } = require(\"ethers\");\nconst {\n  FlashbotsBundleProvider,\n} = require(\"@flashbots/ethers-provider-bundle\");\nconst provider = new ethers.providers.JsonRpcProvider({\n  url: ETHEREUM_RPC_URL,\n});\n\nconst authSigner = new ethers.Wallet(\n  \"0x2000000000000000000000000000000000000000000000000000000000000000\"\n);\nconst flashbotsProvider = await FlashbotsBundleProvider.create(\n  provider,\n  authSigner\n);\n\nconst signedBundle = await flashbotsProvider.signBundle([\n  {\n    signer: SOME_SIGNER_TO_SEND_FROM,\n    transaction: SOME_TRANSACTION_TO_SEND,\n  },\n]);\n\nconst bundleReceipt = await flashbotsProvider.sendRawBundle(\n  signedBundle,\n  TARGET_BLOCK_NUMBER\n);\n```\n\n</TabItem>\n<TabItem value=\"rust\">\n\nSee https://github.com/onbjerg/ethers-flashbots\n\n```rust\nlet tx = TransactionRequest::pay(\"vitalik.eth\", 100);\nlet pending_tx = client.send_transaction(tx, None).await?;\n\n// Get the receipt\nlet receipt = pending_tx\n\t.await?\n\t.ok_or_else(|| eyre::format_err!(\"tx not included\"))?;\nlet tx = client.get_transaction(receipt.transaction_hash).await?;\n\nprintln!(\"Sent transaction: {}\\n\", serde_json::to_string(&tx)?);\nprintln!(\"Receipt: {}\\n\", serde_json::to_string(&receipt)?);\n```\n\n</TabItem>\n</Tabs>\n\nThat's it!\n\n### Next steps\n\nCongrats! You should now have everything you need to start sending transactions to the Flashbots network.\n\n- 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.\n- For examples of advanced usage of Flashbots, check out the [example searchers](/flashbots-auction/example-searchers/simple-arbitrage-bot).\n- For additional tools, check out the [searcher libraries](/flashbots-auction/libraries/ethers-js-provider).\n- For potential MEV opportunities, check out the [MEV job board](https://github.com/flashbots/mev-job-board) 🤠\n"
  },
  {
    "path": "docs/flashbots-mev-boost/FAQ.md",
    "content": "---\ntitle: FAQ\n---\n\n## Can I connect to multiple relays with MEV-Boost?\n\nYes. You can add multiple relays comma-separated to the `-relays` flag,\nlike this: `-relays https://relay1,https://relay2`\n\n## How should I think about running `mev-boost` vs regular block construction?\n\nThe 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.\n\nOr 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.\n\n## Can I check relay status when starting MEV-Boost?\n\nYes. 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.\n\n```bash\n# Example -relay-check call:\n\n./mev-boost -goerli -relays -relay-check https://0xafa4c6985aa049fb79dd37010438cfebeb0f2bd42b115b89dd678dab0670c1de38da0c4e9138c9290a398ecd9a0b3110@builder-relay-goerli.flashbots.net\n```\n\n## What is the difference between a beacon node, validator, and validator client?\n\nA \"**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)\n\n## What prevents block proposers from stealing MEV from submitted builders’ blocks?\n\nSlashing 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/)\n\n## Does MEV-Boost have knowledge about the Beacon Chain?\n\nNo. MEV-boost has no knowledge about the beacon chain, such as which slots were proposed, etc.\n"
  },
  {
    "path": "docs/flashbots-mev-boost/architecture-overview/block-proposal.md",
    "content": "---\ntitle: MEV-Boost Block Proposal\n---\n\n![MEV-Boost Block Proposal](https://raw.githubusercontent.com/flashbots/mev-boost/develop/docs/block-proposal.png)\n\nAs 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):\n\n1. Users/searchers send transactions to block builders through public or private peer-to-peer transaction pools.\n2. 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.\n3. 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.\n4. 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.\n"
  },
  {
    "path": "docs/flashbots-mev-boost/architecture-overview/risks.md",
    "content": "---\ntitle: MEV-Boost Risks and Considerations\n---\n\n## Liveness and Local Fallback\n\nTo 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.\n\n## Builder Centralization\n\nA 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.\n\n## Builder/Relay Collusion\n\nAnyone 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.\n\n## Malicious Relays\n\nNothing 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.\n\n## MEV Hiding\n\nA 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.\n"
  },
  {
    "path": "docs/flashbots-mev-boost/architecture-overview/specifications.md",
    "content": "---\ntitle: MEV-Boost Specifications\n---\n\n\n\n`mev-boost` implements the latest versions of the [Ethereum Builder Specification](https://github.com/ethereum/builder-specs).\n\n- The Builder API is a temporary solution for [Proposer-builder separation](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725)\n (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)\n\n## Fundamental Specifications\n\n[Ethereum Beacon APIs](https://github.com/ethereum/beacon-APIs)\n\n- 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.\n\n[Consensus Specs](https://github.com/ethereum/consensus-specs)\n\n- Current Ethereum PoS consensus specifications.\n\n## Tooling and Related Repositories\n\n- [MEV-Boost](https://github.com/flashbots/mev-boost)\n- [MEV-Boost Relay](https://github.com/flashbots/mev-boost-relay)\n- [Go Boost Utils](https://github.com/flashbots/go-boost-utils)\n- [MEV-Boost Builder](https://github.com/flashbots/boost-geth-builder)\n"
  },
  {
    "path": "docs/flashbots-mev-boost/block-builders.md",
    "content": "---\ntitle: Block Builders\n---\n\n## Builder Fundamentals\n\n### What is a Builder?\n\nBlock builders are highly specialized actors who construct blocks from transaction orderflow (public transactions, bundles, private transactions, etc).\n\n### The Role of Builders\n\nBuilders 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.\n\n### How do builders pay block proposers?\n\nFlashbots proposed a standardized specification for how payments are made from builders to block proposers through the following process:\n\n1. The builder sets their own address as the `feeRecipient` of the payload block header they are constructing.\n2. The builder includes a transaction which pays ETH to the proposer’s `feeRecipient` address at the end of their proposed block.\n\n### Determining the value of blocks\n\nA 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.\n\nVarious 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.\n\n### Block level scoring\n\nBlock level scoring looks at the difference in the balance of the fee recipient account before and after the block execution.\n\nNote 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.\n\nConstructing 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.\n\n## External Builders\n\nExternal builders can submit blocks to Mainnet and Sepolia Flashbots relays. The table below outlines Builder API methods available on each network.\n\n### Relay Block Submission Endpoints by Network\n\n|  |  | Mainnet | Sepolia |\n| --- | --- | --- | --- |\n| `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) |\n| `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)  |\n\n- See also the [Relay API documentation - Block Builder API](https://bit.ly/3BmGZ3T) for more details on the API and payloads.\n- 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.\n\n### Rate-limits\n\nSubmissions to all relays are currently rate-limited to 600 submissions / 5m / IP, which translates to in average 2 submissions / sec /IP.\n\n## BuilderNet Block Builders\n\nThe keys used in BuilderNet are listed here: https://buildernet.org/docs/public-identity#bls-keys-for-submitting-blocks-to-mev-boost-relays\n\n## Additional Links & References\n\n- [rbuilder](https://github.com/flashbots/rbuilder) - Blazingly fast, cutting edge block builder written in Rust.\n- [Relay API documentation - Block Builder API](https://bit.ly/3BmGZ3T)\n- Block Builder Self-Help Group: [https://collective.flashbots.net/c/builders/14](https://collective.flashbots.net/c/builders/14)\n- Github issue about becoming block builder: [https://github.com/flashbots/mev-boost/issues/145](https://github.com/flashbots/mev-boost/issues/145).\n- [Mevboost.pics](https://www.mevboost.pics/) - Tracking MEV-Boost relays and block builders, by [Toni Wahrstätter](https://twitter.com/nero_eth).\n- [Relayscan.io](https://www.relayscan.io/) - Up-to-date stats on the MEV-Boost ecosystem, by [Chris Hager](https://twitter.com/metachris).\n\n_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._\n"
  },
  {
    "path": "docs/flashbots-mev-boost/block-proposers.md",
    "content": "---\ntitle: Block Proposers\n---\n\n## What is a Block Proposer?\n\nA 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.\n\nValidators 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).\n\n## The Role of Block Proposers\n\nWithout MEV-Boost, the original role of block proposers consisted of two jobs:\n\n(1) **building** the best block from all available transactions, and\n\n(2) **proposing** this block to the PoS network.\n\nWith MEV-Boost, the role of validator is simplified to **proposal** duties only, and consists of the following:\n\n- Receive a block from their local execution client, i.e. their local block builder, and sign / ‘propose’ it, or\n- 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).\n\nThe 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.\n"
  },
  {
    "path": "docs/flashbots-mev-boost/contributing.md",
    "content": "---\ntitle: Contributing\n---\n\n[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.\n\nYou are welcome here \\<3.\n\n- 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.\n- Please be kind and read our [code of conduct](https://github.com/flashbots/mev-boost/blob/develop/CODE_OF_CONDUCT.md).\n\n### Report a Vulnerability\n\nIf 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).\n\n### Report an Issue\n\nIf 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).\n\n### Propose New Features\n\nPlease [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.\n"
  },
  {
    "path": "docs/flashbots-mev-boost/getting-started/installation.md",
    "content": "---\ntitle: Installation\n---\n\nGet 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.\n\n## Prerequisites\n\n- 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).\n- Ensure you have [Go 1.18+](https://go.dev/doc/install) installed for source-based installations.\n\n## Installation Methods\n\n### Using Binaries\n\nFor 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).\n\n### From Source\n\n#### Build and install with `go install`\n\nThe 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:\n\n```bash\ngo install github.com/flashbots/mev-boost@latest\nmev-boost -help\n```\n\nThis 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.\n\nIf you want to install a specific version, you can use the `@` syntax:\n\n```bash\ngo install github.com/flashbots/mev-boost@VERSION\n```\n\nSimply look up the specific version you want to install in the [releases](https://github.com/flashbots/mev-boost/releases) page.\n\n#### Clone and Build\n\nYou can also clone the repository and build the software yourself without using `go install`.\n\n1. Clone the repository:\n\n   ```bash\n   git clone https://github.com/flashbots/mev-boost.git\n   cd mev-boost\n   ```\n\n2. (Optional) To build a specific release, refer to the available [releases](https://github.com/flashbots/mev-boost/releases) and checkout the desired tag:\n\n   ```bash\n   git checkout tags/YOUR_VERSION\n   ```\n\n3. Build the software:\n\n   ```bash\n   make build\n   ```\n\n4. If you experience issues, use the portable build:\n\n   ```bash\n   make build-portable\n   ```\n\n5. Verify your installation:\n\n   ```bash\n   ./mev-boost -help\n   ```\n\n### From Docker Image\n\nFlashbots provides maintained Docker images for MEV-Boost.\n\n1. [Install Docker Engine](https://docs.docker.com/engine/install/).\n\n2. Pull the latest MEV-Boost image:\n\n   ```bash\n   docker pull flashbots/mev-boost:latest\n   ```\n\n   Or pull the portable version:\n\n   ```bash\n   docker pull flashbots/mev-boost:latest-portable\n   ```\n\n3. Run the Docker image:\n\n   ```bash\n   docker run flashbots/mev-boost -help\n   ```\n\n## Systemd Configuration\n\nTo keep MEV-Boost running as a service, configure systemd by creating the systemd config file `/etc/systemd/system/mev-boost.service`.\n\nBelow is an example of a config file:\n\n   ```ini\n   [Unit]\n   Description=mev-boost\n   Wants=network-online.target\n   After=network-online.target\n\n   [Service]\n   User=mev-boost\n   Group=mev-boost\n   WorkingDirectory=/home/mev-boost\n   Type=simple\n   Restart=always\n   RestartSec=5\n   ExecStart=/home/mev-boost/bin/mev-boost \\\n   -mainnet \\\n   -relay-check \\\n   -relays YOUR_RELAY_CHOICE\n\n   [Install]\n   WantedBy=multi-user.target\n   ```\n\n## Troubleshooting\n\nIf you encounter an error: [`\"SIGILL: illegal instruction\"`](https://github.com/flashbots/mev-boost/issues/256), you'll need to use the portable build.\n\nThere are three ways to install the portable build:\n\n1. Use the [portable Docker image](https://hub.docker.com/r/flashbots/mev-boost/tags).\n2. Build the portable version from source:\n\n   ```bash\n   make build-portable\n   ```\n\n3. Using `go install`:\n\n   ```bash\n   CGO_CFLAGS=\"-O -D__BLST_PORTABLE__\" go install github.com/flashbots/mev-boost@latest\n   ```\n"
  },
  {
    "path": "docs/flashbots-mev-boost/getting-started/system-requirements.md",
    "content": "---\ntitle: System Requirements\n---\n\nThis 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)\n\n## Requirements for different systems\n\n### Execution + Beacon Requirements\n\n- **Software**: Execution client, beacon node client (instructions for clients below), [curl](https://curl.se/download.html)\n- **OS**: 64-bit Linux, Mac OS X 10.14+, Windows 10+ 64-bit\n- **CPU**: 4+ cores @ 2.8+ GHz\n- **Memory**: 16GB+ RAM\n- **Storage**: SSD with at least 2TB free space\n- **Network:** 8 MBit/sec broadband\n\n:::tip\nThere are variations in client resource usage. Please review [CoinCashew’s Client Usage Guide](https://eth-docker.net/Usage/ResourceUsage) for more details!\n:::\n\n### Validator Requirements\n\n- Everything above, plus...\n- **Software:** Validator client, browser-based crypto wallet (instructions below)\n- **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\n- **32 ETH** (Mainnet)\n- **32 testnet ETH** (Testnets)\n\n### MEV-Boost Requirements\n\n- Can run on any beacon-node system, and requires almost no resources.\n\n## Consensus client configuration guides\n\n|            | MEV-Boost Client Guides                                                                                       |\n| ---------- | ------------------------------------------------------------------------------------------------------------- |\n| Teku       | [Guide](hthttps://docs.teku.consensys.net/Concepts/Builder-Network/tps://hackmd.io/@StefanBratanov/BkMlo1RO9) |\n| Prysm      | [Guide](https://hackmd.io/@prysmaticlabs/BJeinxFsq)                                                           |\n| Lighthouse | [Guide](https://lighthouse-book.sigmaprime.io/builders.html#mev-and-lighthouse)                               |\n| Lodestar   | [Guide](https://github.com/ChainSafe/lodestar/blob/unstable/docs/pages/beacon-management/mev-and-builder-integration.md)                    |\n| Nimbus     | [Guide](https://nimbus.guide/external-block-builder.html)                                                     |\n"
  },
  {
    "path": "docs/flashbots-mev-boost/getting-started/usage.md",
    "content": "---\ntitle: Usage\n---\n\nWhen connecting to different networks using mev-boost, specify the desired network using its dedicated flag. Here are the available Network Flags:\n\n| Network         | Flag     |\n| --------------- | -------- |\n| Mainnet         | -mainnet |\n| Sepolia Testnet | -sepolia |\n| Kiln            | -kiln    |\n\nYou 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.\n\n### Mainnet Relay\n\nRun mev-boost pointed at our [Mainnet Relay:](https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net/)\n\n```bash\n./mev-boost -mainnet -relay-check -relays https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net\n```\n\n### Sepolia testnet\n\nRun mev-boost pointed at our [Sepolia Relay](https://builder-relay-sepolia.flashbots.net/):\n\n```bash\n./mev-boost -sepolia -relay-check -relays https://0x845bd072b7cd566f02faeb0a4033ce9399e42839ced64e8b2adcfc859ed1e8e1a5a293336a49feac6d9a5edb779be53a@builder-relay-sepolia.flashbots.net\n```\n\n## mev-boost CLI arguments\n\n```bash\n$ ./mev-boost -help\nUsage of ./mev-boost:\n  -addr string\n        listen-address for mev-boost server (default \"localhost:18550\")\n  -debug\n        shorthand for '-loglevel debug'\n  -genesis-fork-version string\n        use a custom genesis fork version\n  -json\n        log in JSON format instead of text\n  -loglevel string\n        minimum loglevel: trace, debug, info, warn/warning, error, fatal, panic (default \"info\")\n  -mainnet\n        use Mainnet\n  -relay-check\n        check relay status on startup and on the status API call\n  -relay-monitors string\n        relay monitor urls - single entry or comma-separated list (scheme://host)\n  -relays string\n        relay urls - single entry or comma-separated list (scheme://pubkey@host)\n  -request-timeout-getheader int\n        timeout for getHeader requests to the relay [ms] (default 950)\n  -request-timeout-getpayload int\n        timeout for getPayload requests to the relay [ms] (default 4000)\n  -request-timeout-regval int\n        timeout for registerValidator requests [ms] (default 3000)\n  -sepolia\n        use Sepolia\n  -version\n        only print version\n```\n\n## Verifying Your Setup\n\nYou 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).\n\nFor 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:\n\n```url\nhttps://boost-relay.flashbots.net/relay/v1/data/validator_registration?pubkey=0xb606e206c2bf3b78f53ebff8be8e8d4af2f0da68646b5642c4d511b15ab5ddb122ae57b48eab614f8ca5bafbe75a5999\n```\n\nBelow is the response:\n\n```json\n{\n  \"message\": {\n    \"fee_recipient\": \"0x6db5c947ba388f0e708c03339d534af9fae5679c\",\n    \"gas_limit\": \"30000000\",\n    \"timestamp\": \"1663063595\",\n    \"pubkey\": \"0xb606e206c2bf3b78f53ebff8be8e8d4af2f0da68646b5642c4d511b15ab5ddb122ae57b48eab614f8ca5bafbe75a5999\"\n  },\n  \"signature\": \"0x94f1f635336f8c38909842f06550026bbc198f892c6a79c22a3365e547e87665e31feccfacda3533ef3cf8e2c965e03d1594cf8e981dfc75011b4d237552386377bcea714bcfb78d303fe5624625e1bbb8b23f3a6d1b7c9efb3d76cad4ca01a5\"\n}\n```\n\nThe `fee_recipient` field should match the address you provided when registering your validator. If it does, then your setup is working correctly.\n"
  },
  {
    "path": "docs/flashbots-mev-boost/glossary.md",
    "content": "---\ntitle: Glossary\n---\n\n- **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.\n- **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.\n- **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.\n- **block proposer (proposer)**: a validator selected to sign and submit a beacon block to the network.\n- **builder API specification**: an [interface](https://github.com/ethereum/builder-specs) for consensus layer clients to source blocks built by external entities.\n- **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.\n- **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).\n- **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.\n- **liveness:** state of ethereum which is valid \\*\\*\\*\\*if the set of finalized blocks can grow.\n- **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.\n- **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.\n- **probabilistic liveness:** if, regardless of any previous events, it is probable for new\n  blocks to be finalized (after probabilistic assumptions about the network latency, capabilities of attackers, etc. are made).\n- **Proposer/block-builder separation (PBS)**: Proposer/block-builder separation (**PBS**\n  ) 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.\n- **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.\n- **searcher**: advanced Ethereum user specialized in detecting and extracting MEV by submitting advanced transactions in batches called bundles.\n- **staker:** actor that submit any amount of Ethereum to be staked.\n- **user**: a normal Ethereum user who sends transactions for block inclusion.\n- **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.\n- **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/).\n- **validator pubkey**: The validator's BLS public key, uniquely identifying them. *48-bytes, hex encoded with 0x prefix, case insensitive.*\n"
  },
  {
    "path": "docs/flashbots-mev-boost/introduction.md",
    "content": "---\ntitle: Overview\n---\n\n## What is MEV-Boost?\n\n`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.\n\nWith 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.\n\nSee also:\n\n- [boost.flashbots.net](https://boost.flashbots.net/)\n- [boost-relay.flashbots.net](https://boost-relay.flashbots.net/)\n- [github.com/flashbots/mev-boost](https://github.com/flashbots/mev-boost/)\n\n---\n\n## Why MEV-Boost?\n\nMEV 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).\n\nValidators 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).\n\n## How does MEV-Boost work?\n\n![MEV Boost Integration Overview](/img/mev-boost-integration-overview.jpg)\n\nPoS 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.\n\nBlock 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.\n\nRelays 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.\n"
  },
  {
    "path": "docs/flashbots-mev-boost/relay.md",
    "content": "---\ntitle: Relay Fundamentals\n---\n\n## Relay Fundamentals\n\n### What is a Relay?\n\nRelays 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.\n\nRelays 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.\n\nBefore 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.\n\n### The Role of Relays\n\nA relay has several responsibilities:\n\n- They execute [builder-spec](https://ethereum.github.io/builder-specs/#/Builder) and data transparency API functionality.\n- Handle validator registrations and block proposals in a scalable manner.\n- Provide block escrow and data availability.\n- Simulate and verify blocks sent by block-builders, and rate-limit as necessary. Relays simulate whether:\n  - the correct amount of fees are paid to recent validator feeRecipient.\n  - the correct block attributes and transactions exist.\n  - the block gas is within the gasLimit requested by validator.\n\n## [Relay API Specification](https://flashbots.notion.site/Relay-API-Spec-5fb0819366954962bc02e81cb33840f5)\n\nThe current specification for the [open-source Flashbots relay](https://github.com/flashbots/mev-boost-relay). Diagram below displays the current architecture:\n\n![Relay Architecture](/img/relay_architecture.jpg)\n\n### [Proposer API](https://flashbots.notion.site/Relay-API-Spec-5fb0819366954962bc02e81cb33840f5)\n\nStandard [builder spec](https://ethereum.github.io/builder-specs/#/Builder) APIs\n\n- [registerValidator](https://ethereum.github.io/builder-specs/#/Builder/registerValidator): `POST /eth/v1/builder/validators`\n- [getHeader](https://ethereum.github.io/builder-specs/#/Builder/getHeader): `GET  /eth/v1/builder/header/{slot}/{parent_hash}/{pubkey}` - Get an execution payload header.\n- [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.\n- [status](https://ethereum.github.io/builder-specs/#/): `GET /eth/v1/builder/status`\n\n### [Block Builder API](https://flashbots.notion.site/Relay-API-Spec-5fb0819366954962bc02e81cb33840f5)\n\nGet a list of validator registrations for the current and next epoch, submit a new block to the relay.\n\n### [Data API](https://flashbots.notion.site/Relay-API-Spec-5fb0819366954962bc02e81cb33840f5)\n\nProvides data about received blocks from builders, payloads delivered to proposers as well as insights into validator registrations.\n\n## [Circuit Breaker](https://hackmd.io/@ralexstokes/BJn9N6Thc)\n\nThe 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 resume sourcing external blocks. \n\nFor the exact behavior and available configuration around circuit breaker conditions for a specific client, please refer to the documentation for the specific consensus client.\n\n## [Relay Monitor](https://hackmd.io/@ralexstokes/SynPJN_pq)\n\nWhile relays are trusted actors, the ability to run a relay is permissionless. To mitigate potential abuses of this role, Flashbots [has suggested](https://github.com/flashbots/mev-boost/issues/142) a “relay monitor,” which uses publicly available data to form a view on the behavior and performance of the set of relays it is monitoring. This is an ongoing proposal and more details can be found in the [relay monitor design documentation](https://hackmd.io/@ralexstokes/SynPJN_pq), [keeping MEV-Boost relays honest](https://notes.ethereum.org/@yoav/BJeOQ8rI5), and [understanding liveness risks](https://writings.flashbots.net/understanding-mev-boost-liveness-risks)."
  },
  {
    "path": "docs/flashbots-mev-boost/resources.md",
    "content": "---\ntitle: Resources\n---\n\n**Proof-of-Stake Ethereum**\n\n- [The Hitchhiker's Guide to Ethereum](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum/)\n- [Combining Ghost and Casper - Vitalik Buterin et al.](https://arxiv.org/pdf/2003.03052.pdf)\n- [Endgame - Vitalik Buterin](https://vitalik.eth.limo/general/2021/12/06/endgame.html)\n- [Fork Choice](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/fork-choice.md)\n- [A compiled list of resources from Flashbots Research](https://github.com/flashbots/mev-boost/wiki/Research#open-questions)\n\n**MEV**\n\n- [MEV in eth2 - an early exploration](https://writings.flashbots.net/mev-eth2/)\n- [MEV Driven Centralization in Ethereum: Part 1](https://simbro.medium.com/mev-driven-centralization-in-ethereum-ec829a214f18)\n\n**MEV-Boost**\n\n- [Beginner's Guide to mev-boost](https://writings.flashbots.net/beginners-guide-mevboost/)\n- [MEV-Boost: Merge ready Flashbots Architecture](https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177)\n- [Why Run MEV-Boost?](https://writings.flashbots.net/why-run-mevboost/)\n- [Removing Trusted Relays in MEV-Boost Using Threshold Encryption](https://ethresear.ch/t/removing-trusted-relays-in-mev-boost-using-threshold-encryption/13449)\n- [Proposer/block builder separation-friendly fee market designs](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725)\n- [Open sourcing the Flashbots Relay](https://writings.flashbots.net/Flashbots-Relay-open-sourcing)\n- [Understanding liveness risks from mev-boost](https://writings.flashbots.net/understanding-mev-boost-liveness-risks)\n\n**Validator Guides**\n\n- [Validator Checklist - launchpad.ethereum.org](https://launchpad.ethereum.org/en/merge-readiness)\n- [eth-docker: Docker automation for Ethereum consensus and execution clients.](https://github.com/eth-educators/eth-docker)\n- [Validator Slashing Prevention Tips - Prysmatic Labs](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50)\n- [Understanding Eth2 Slashing Preventative Measures](https://www.bloxstaking.com/blog/ethereum-2-0/understanding-eth2-slashing-preventative-measures/)\n"
  },
  {
    "path": "docs/flashbots-mev-boost/security.md",
    "content": "---\ntitle: Vulnerabilities\n---\n\nIf you find a security vulnerability on this project or any other initiative related to Flashbots, please let us know sending an email to security@flashbots.net.\n# Security Audits\n\n- [20220620](https://github.com/flashbots/mev-boost/blob/develop/docs/audit-20220620.md), by [lotusbumi](https://github.com/lotusbumi).\n\n### Bug Bounties\n\n- Coming soon!"
  },
  {
    "path": "docs/flashbots-mev-boost/troubleshooting.md",
    "content": "---\ntitle: Troubleshooting\n---\n\nPlease refer to the [Troubleshooting Wiki](https://github.com/flashbots/mev-boost/wiki/Troubleshooting) for the most updated guidance.\n"
  },
  {
    "path": "docs/flashbots-mev-share/for-users.mdx",
    "content": "---\ntitle: For Users\n---\n\nimport WhatIsMevShare from \"@site/docs/specs/mev-share/blurbs/_whatsMevShareBasic.mdx\"\n\n<WhatIsMevShare />\n\nMEV-Share Nodes generally accept transactons using the `eth_sendRawTransaction` or `eth_sendPrivateTransaction` json rpc requests. Flashbots runs a MEV-Share Node that can be used by sending transactions to [Flashbots Protect](/flashbots-protect/quick-start).\n\n\n"
  },
  {
    "path": "docs/flashbots-mev-share/introduction.mdx",
    "content": "---\ntitle: Introduction\n---\n\nimport WhatsMevShareAdvanced from \"../specs/mev-share/blurbs/_whatsMevShareAdvanced.mdx\"\n\n> The MEV-Share Matchmaker was renamed to the MEV-Share Node to better reflect the role we envision this actor will play in SUAVE. This change will be reflected in our documentation after June 2023. The client library previously named `matchmaker-ts` has also been renamed to `mev-share-client-ts`.\n\n## What is MEV-Share?\n<WhatsMevShareAdvanced />\n\nTo start earning MEV refunds from MEV-Share, submit your transactions to the Flashbots **MEV-Share Node**, either by [connecting your wallet to the Protect RPC](/flashbots-protect/quick-start/#using-flashbots-protect), or sending a [private transaction](/flashbots-auction/advanced/rpc-endpoint#eth_sendprivatetransaction) to the MEV-Share Node API.\n\n## Why MEV-Share?\nMEV-Share redistributes MEV back to the party that creates it in the first place: users. It does so through a design that is built to scale and be decentralized, which means that it is permissionless for searchers to integrate and it does not enshrine a single block builder.\n\n## How does MEV-Share work?\nUsers send their transactions to a specialized actor called a MEV-Share Node. The MEV-Share Node selectively shares information about the user's transaction according to their privacy preferences. Seeing this information, searchers submit partial bundles to the MEV-Share Node to attempt to extract MEV from user's transactions without seeing the full transaction data. MEV-Share Nodes simulate each of these searcher bundles and forward the successful ones on to builders along with a condition that the user must be paid back specified percentage (by default 90%) of the MEV their transactions create.\n\nAt the moment, MEV-Share Nodes only accept backruns.\n\n## How do I use MEV-Share?\nThe simplest way to use MEV-Share is by sending transactions to [Flashbots Protect](/flashbots-protect/quick-start), which leverages the [Flashbots MEV-Share Node](/flashbots-protect/mev-refunds). Wallet and application developers should check out the [Flashbots Protect MEV-Share section](/flashbots-protect/mev-refunds) for information about integrating and configuring the Flashbots MEV-Share Node.\n\n\n## How do I search on MEV-Share?\nSearchers should see the [Getting Started](/flashbots-mev-share/searchers/getting-started) guide for a walkthrough of MEV-Share and how it differs from traditional searching.\n"
  },
  {
    "path": "docs/flashbots-mev-share/orderflow-providers.mdx",
    "content": "---\ntitle: For Orderflow Providers\n---\n\nFlashbots runs a MEV-Share Node that can be used by sending transactions to [Flashbots Protect](/flashbots-protect/quick-start). Wallets and application developers should see the [Protect MEV-Share Node guide](/flashbots-protect/mev-refunds) to configure your integration."
  },
  {
    "path": "docs/flashbots-mev-share/release-notes/2023-03.mdx",
    "content": "# April 2023 (beta launch)\n\n## MEV-Share Protocol Specification\n\nhttps://github.com/flashbots/mev-share\n\n## `mev_` RPC endpoints\n\nNew endpoints added to Flashbots bundle relay (relay.flashbots.net):\n\n- `mev_sendBundle` - send bundles with a [new format](https://github.com/flashbots/mev-share/blob/main/specs/bundles/v0.1.md), enabling modular privacy settings and sets the stage for future innovations.\n- `mev_simBundle` - simulate bundles in the context of MEV-Share using the new format.\n\n## SSE Event Stream\n\nEvents containing one or more transactions with varying data shared via hints, broadcast via SSE stream.\n\n- https://mev-share.flashbots.net\n- https://mev-share-goerli.flashbots.net\n"
  },
  {
    "path": "docs/flashbots-mev-share/release-notes/2023-06.mdx",
    "content": "# June 2023\n\n## simBundle options\n\nNew options to override the simulation state for `mev_simBundle`:\n\n```typescript\ninterface SimBundleOptions {\n    /** Block used for simulation state. Defaults to latest block on chain.\n     *\n     * Block header data will be derived from parent block by default.\n     * Specify other params in this interface to override the default values.\n     *\n     * Can be a block number or block hash.\n    */\n    parentBlock?: number | string,\n\n    // override the default values for the parentBlock header\n    /** default = parentBlock.number + 1 */\n    blockNumber?: number,\n    /** default = parentBlock.coinbase */\n    coinbase?: string,\n    /** default = parentBlock.timestamp + 12 */\n    timestamp?: number,\n    /** default = parentBlock.gasLimit */\n    gasLimit?: number,\n    /** default = parentBlock.baseFeePerGas */\n    baseFee?: bigint,\n    /** default = 5 (defined in seconds) */\n    timeout?: number,\n}\n```\n\n## event history api\n\nQuery past events with `/history`, get info about query params to use from `/history/info`.\n\n- https://mev-share.flashbots.net/api/v1/history/info\n- https://mev-share.flashbots.net/api/v1/history\n\n## tx_hash bundle hint\n\nEnables searchers to share the transaction hashes of their bundle's transactions with other searchers, allows other searchers to backrun them without compromising bundle privacy or atomicity.\n\n## public mev-share-node release\n\nOpen-sourced the backend node for MEV-Share: https://github.com/flashbots/mev-share-node\n"
  },
  {
    "path": "docs/flashbots-mev-share/release-notes/2023-07.mdx",
    "content": "# July 2023\n\n## customized refunds\n\nConfigure the percent(s) and recipient(s) for MEV-Share refunds by adding the [`refund`](/flashbots-protect/settings-guide#refunds) query parameter to Protect RPC requests\nor by adding `preferences.validity.refund` argument to the `eth_sendPrivateTransaction` JSON-RPC [method](/flashbots-auction/advanced/rpc-endpoint#eth_sendprivatetransaction).\n\n## builder sharing\nShare transactions and bundles with additional builders for faster inclusion.\n\n- Users: [Opt in to share with registered builders](/flashbots-protect/settings-guide#builders)\n- Builders: [Register to receive bundles](https://github.com/flashbots/dowg#builders)\n\n## debugging guide\n\nFollow this [guide](/flashbots-mev-share/searchers/debugging) for debugging bundles as a searcher on MEV-Share.\n\n## simple-limit-order-bot\n\nNew tutorial for searching on MEV-Share, using a simple limit order bot as an example.\n\n- [Step by step tutorial with full code examples](/flashbots-mev-share/searchers/tutorials/limit-order/introduction)\n- [Open source bot repository](https://github.com/flashbots/simple-limit-order-bot)\n\n### eth_sendPrivateRawTransaction\n\n- [eth_sendPrivateRawTransaction](/flashbots-auction/advanced/rpc-endpoint#eth_sendprivaterawtransaction)\nis now supported on relay endpoint. Its behavior is identical to `eth_sendPrivateTransaction` but its format is similar to `eth_sendRawTransaction`.\n"
  },
  {
    "path": "docs/flashbots-mev-share/release-notes/2023-09.mdx",
    "content": "# September 2023\n\n## default logs hint\n\nA new hint which shares a subset of logs, as described in the [hints] settings(/flashbots-protect/settings-guide#hints).\n\nPreviously these logs were shared by default. Now, users of the private transaction API, Protect RPC, and bundle relay can also request to share these logs when customizing their settings.\n\n## simple-limit-order-bot\n\nNew tutorial for searching on MEV-Share, using a flashloan arbitrage bot as an example.\n\n- [Step by step tutorial with full code examples](/flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/introduction)\n- [Open source bot repository](https://github.com/flashbots/simple-blind-arbitrage)\n\n## SSE stability updates\n\nMade several improvements to the SSE stream endpoint to reduce client timeouts and hanging connections. The SSE stream now scales better under dynamic workloads and can handle a greater number of client connections.\n"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/debugging.mdx",
    "content": "---\ntitle: Debugging\n---\n\nIf you find that your bundles aren't landing when you think they should, we have some tips to help you figure out why.\n\n> Note: Some examples you see in the code here are based on the [limit order bot tutorial](/flashbots-mev-share/searchers/tutorials/limit-order/introduction). The same tactics can be used to debug any MEV-Share bundle.\n\n## Simulate your bundle\n\nThe simplest way to find out what happened with your bundle is to simulate it. MEV-Share nodes offer the `mev_simBundle` [json rpc](/flashbots-auction/advanced/rpc-endpoint#mev_simbundle). Typically, MEV-Share Nodes will not return simulation results unless the private transaction being backrun has already landed on-chain.\n\n## Using a client\n\nThe [mev-share-client](https://www.npmjs.com/package/@flashbots/mev-share-client) library has a function `simulateBundle` which executes your bundle in a virtual environment based on the block which the bundle was targeting.\n\nIn our project, we can simply call the `simulateBundle` function with our original bundle. The block we choose is the block before the first transaction (the one we tried to backrun) lands on-chain, because we want the state as close as possible to when the transaction actually landed; this is the most accurate representation of the state of the blockchain (i.e. prices) when our bundle was supposed to have landed.\n\n```tsx\n// after you call sendBundle(bundleParams)\nlet simResult: SimBundleLogs = await mevshare.simulateBundle(bundleParams)\nconsole.log(\"simResult\", simResult)\n```\n\nHere's a breakdown of the simulation result:\n\n```tsx\ntype SimBundleLogs = {\n\t/* True if the simulation executes without error. */\n  success: boolean,\n\t/* The error message, if there is an error; otherwise undefined. */\n  error?: string,\n\t/* The block that the simulation derived its state from. */\n  stateBlock: number,\n\t/* (profit) / (gasUsed) */\n  mevGasPrice: bigint,\n\t/* Coinbase profit; the amount paid to the builder after user receives kickback. */\n  profit: bigint,\n\t/* Total ETH paid by searcher to coinbase (gas fees + coinbase transfers). */\n  refundableValue: bigint,\n\t/* Total gas used by transactions in the bundle. */\n  gasUsed: bigint,\n  logs?: Array<{\n\t\t/* ETH transaction logs. */\n\t\ttxLogs?: Array<LogParams>,\n\t\t/* Logs for nested bundles. */\n\t\tbundleLogs?: Array<SimBundleLogs>,\n\t}>,\n}\n```\n\n`LogParams` are defined in the [Ethers documentation](https://docs.ethers.org/v6/api/providers/formatting/#LogParams).\n\n:::info Simulating private Transactions\n\nThe backend endpoint for simulating bundles (`mev_simBundle`) only accepts signed transactions, not private transactions (specified by `{hash}`). The mev-share-client library automatically waits for the transactions in a bundle specified by `{hash}` to land on-chain  by querying for the full signed transactions with `provider.getTransaction` before it calls `mev_simBundle`. If the private transaction(s) in your bundle don't land on-chain, you won't be able to simulate your bundle with them.\n\n:::\n\nThere are several things you want to look for when debugging your bundles:\n\n### 'invalid inclusion'\n\nWhen simulating your bundles, you might see a result like this:\n\n```tsx\n{\n  success: false,\n  error: 'invalid inclusion',\n  stateBlock: 17674041,\n  mevGasPrice: 0n,\n  profit: 0n,\n  refundableValue: 0n,\n  gasUsed: 0n,\n  logs: undefined\n}\n```\n\nThis happens when `bundleParams.inclusion.block` (and `bundleParams.inclusion.maxBlock` if you set it) target a block (range) that doesn't overlap with the simulation state block.\n\nTo remedy this, you can adjust your `bundleParams` when you call `simulateBundle` to target more blocks — Protect transactions target 25 blocks starting from when they were submitted, so you may want to set your bundleParams like this:\n\n```tsx\nconst bundleParams = {\n  inclusion: { block: currentBlockNumber + 1 },\n  body: [\n    { hash: pendingTxHash },\n    { tx: backrunSignedTx, canRevert: false }\n  ]\n}\n// ...\nsendBundle(bundleParams)\n// ...\nsimulateBundle({\n\t...bundleParams,\n\tinclusion: {\n\t\t...bundleParams.inclusion,\n\t\tmaxBlock: bundleParams.inclusion.block + 24,\n\t}\n})\n```\n\nWe would just set the `maxBlock` parameter to `inclusion.block + 25`, but we have to subtract 1 since `inclusion.block` was `currentBlockNumber + 1` when we initially defined it.\n\nYou can also simply modify your original `bundleParams` to target more blocks, but note that this opens up the possibility of bundles using an outdated price landing on-chain.\n\n### 'tx failed'\n\n```tsx\n{\n  success: false,\n  error: 'tx failed',\n  stateBlock: 17674503,\n  mevGasPrice: 0n,\n  profit: 472614000000000n,\n  refundableValue: 472614000000000n,\n  gasUsed: 157538n,\n  logs: undefined\n}\n```\n\nThis happens when one of your transactions reverts. Since our `simulateBundle` function waits for private transactions to land on chain before simulating the bundle, we know that in our example, this error means that our backrun transaction failed.\n\nIf you see this error when running the bot, it most likely means that the transaction you tried to backrun didn't affect the price enough to meet our target. This is expected — it's a feature, not a bug!\n\nHowever, if you want to be sure, a good way to further verify what's happening is to simulate transactions in a local development environment. Toolkits such as [foundry](https://github.com/foundry-rs/foundry) or [hardhat](https://hardhat.org/docs) give you tools to compile contracts, create local nodes that fork their state from public nodes, and simulate transactions locally, with stack traces to show you where things went wrong.\n\n## Did it pay enough gas?\n\nOne of the most common reasons a bundle doesn't land is that it didn't pay enough gas. Of course, you need to pay at least the base fee (the current minimum gas price on Ethereum), but you may also be facing competition. If there are other searchers trying to include the same transaction as you in a bundle, then only one of these bundles can land, because the transaction specified in multiple bundles can only be included on-chain once. The one that lands is determined by who pays the most. \n\nIncreasing the priority fee (`maxPriorityFeePerGas`) on your backrun transaction is a reliable way to improve your chances of inclusion. Note that we also increase `maxFeePerGas` by the same amount — this ensures that the builder/validator gets the tip, and it isn't consumed by the base fee. See this [blog post from Blocknative](https://www.blocknative.com/blog/eip-1559-fees) for a detailed explanation of gas fees on Ethereum.\n\nHere's one example of how we can set higher gas fees in our code:\n\n```tsx\nasync function getSignedBackrunTx( outputAmount: bigint, nonce: number, gasTip: bigint ) {\n    const backrunTx = await uniswapRouterContract.swapExactTokensForTokens.populateTransaction(SELL_TOKEN_AMOUNT, outputAmount, [SELL_TOKEN_ADDRESS, BUY_TOKEN_ADDRESS], executorWallet.address, 9999999999n)\n    const backrunTxFull = {\n        ...backrunTx,\n        chainId: 1,\n        maxFeePerGas: MAX_GAS_PRICE * GWEI + gasTip,\n        maxPriorityFeePerGas: MAX_PRIORITY_FEE * GWEI + gasTip,\n        gasLimit: TX_GAS_LIMIT,\n        nonce: nonce\n    }\n    return executorWallet.signTransaction(backrunTxFull)\n}\n```\n\nThen we'd call it like this:\n\n```tsx\n// tip: +5 gwei per gas\nconst tip = 5n * GWEI;\nconst backrunTx = await getSignedBackrunTx(outputAmount, nonce, tip)\n```\n\nYou'll notice that we set our gas prices (`maxFeePerGas` and `maxPriorityFeePerGas`) to constant values. If you don't mind waiting for the gas price on Ethereum to go down, then you can safely ignore these errors. However, if you want to ensure that your trade goes through regardless of the gas price, then you'll have to track the base fee on Ethereum and adjust your transactions' gas prices accordingly.\n\nHere's how we can do that in our project:\n\n```tsx\nasync function getSignedBackrunTx( outputAmount: bigint, nonce: number, tip: bigint ) {\n    const gasFees = await provider.getFeeData()\n    const backrunTx = await uniswapRouterContract.swapExactTokensForTokens.populateTransaction(SELL_TOKEN_AMOUNT, outputAmount, [SELL_TOKEN_ADDRESS, BUY_TOKEN_ADDRESS], executorWallet.address, 9999999999n)\n    const backrunTxFull = {\n        ...backrunTx,\n        chainId: 1,\n        maxFeePerGas: gasFees.maxFeePerGas! + tip,\n        maxPriorityFeePerGas: gasFees.maxPriorityFeePerGas! + tip,\n        gasLimit: TX_GAS_LIMIT,\n        nonce: nonce\n    }\n    return executorWallet.signTransaction(backrunTxFull)\n}\n```\n\nWe start off by fetching the gas fees using `provider.getFeeData` — this queries the RPC provider. You may want to do this in a background thread (once per block) to avoid making redundant calls. But it's OK for demonstration's sake. \nIn `backrunTxFull`, we set our gas parameters with `gasFees`. We use the `!` suffix operator to coerce the value, which is possibly null, into a bigint. This is safe to do when you're sure that your network has EIP-1559 integrated, which Ethereum mainnet does. The values will only be null on old, deprecated networks.\n\n## Did any transactions fail? If so, which one(s)?\n\nIt's possible that one of the transactions in your bundle encountered an error and was not able to execute. If this is the case, you'll see `false` in the `success` parameter of the simulation response, along with an error message, and some data about gas usage and payment.\n\nFor example, a simulation result for a bundle including a transaction with its gas price set too low might look like this:\n\n```tsx\n{\n  success: false,\n  error: 'max fee per gas less than block base fee: address 0x2326Bd2F29a6004D31344a1FE2329F2C13284f0d, maxFeePerGas: 2000000000 baseFee: 13077974866',\n  stateBlock: 17674455,\n  mevGasPrice: 0n,\n  profit: 288942000000000n,\n  refundableValue: 288942000000000n,\n  gasUsed: 192628n,\n  logs: undefined\n}\n```\n\nIf `mevGasPrice` is 0, it just means that the transaction didn't use any gas (in this case, because it reverted).\n\nWhen a simulation succeeds, it looks something like this:\n\n```tsx\n{\n  success: true,\n  error: undefined,\n  stateBlock: 17674443,\n  mevGasPrice: 9485937386n,\n  profit: 2731874079688143n,\n  refundableValue: 2731874079688143n,\n  gasUsed: 287992n,\n  logs: [ { txLogs: [Array] }, { txLogs: [Array] } ]\n}\n```\n\nThis means that your bundle *could have* landed in a block, but it isn't a guarantee. If your `mevGasPrice` is not high enough, your bundle may not be included in a block. Refer back to [Did it pay enough gas?](#did-it-pay-enough-gas) for info on setting your gas price.\n\nThere is also one more factor that often comes into play…\n\n## Did the Flashbots builder have a chance to include my bundle?\n\nAnother common reason a bundle doesn't land is simply because the builders on MEV-Share didn't have an opportunity to build a block for the desired slot. For more details about how builders work, and why this happens, see [Searching Post-Merge](https://writings.flashbots.net/searching-post-merge). You can check to see if your target block was built by any of the builders connected to MEV-Share by checking the block's `miner` parameter. The Flashbots builder address is `0xDAFEA492D9c6733ae3d56b7Ed1ADB60692c98Bc5`\n\n```tsx\nasync function isBlockBuiltByFlashbots(blockNum: number) {\n    const flashbotsCoinbase = \"0xDAFEA492D9c6733ae3d56b7Ed1ADB60692c98Bc5\"\n    const block = await provider.getBlock(blockNum)\n    return block?.miner === flashbotsCoinbase\n}\n```\n\nWith this function, look at each block from `bundleParams.inclusion.block` through `bundleParams.inclusion.maxBlock` (if you set it) for a bundle to determine whether it was possible for the bundle to land in that block.\n"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/event-stream.mdx",
    "content": "---\ntitle: Event Stream\n---\n\nimport Tabs from '@theme/Tabs'\nimport TabItem from '@theme/TabItem'\nimport StreamEvent from '@site/docs/specs/mev-share/_streamEvent.mdx'\nimport RemoteCodeBlock from \"@site/src/components/RemoteCodeBlock\"\n\nEvents on MEV-Share are distributed via an Server-Sent Events (SSE) streaming endpoint. Searchers listen to this endpoint to receive a stream of new events, which contain data they can use in their bundles. Currently, the events refer to Ethereum transactions.\n\n## Quickstart\n\nSubscribe to the stream by making an HTTP GET request on the stream endpoint. The [mev-share-client-ts](https://npmjs.com/@flashbots/mev-share-client) library implements this as an asynchronous event handler.\n\n<Tabs>\n<TabItem value=\"ts\" label=\"mev-share-client-ts\">\n\n```typescript\nimport MevShareClient, { IPendingTransaction, IPendingBundle } from '@flashbots/mev-share-client'\n\nconst mevShareClient = MevShareClient.useEthereumMainnet(authSigner)\n\nconst txHandler = mevShareClient.on(\"transaction\", async (tx: IPendingTransaction) => {\n    /*\n    Do something with the pending tx here.\n    */\n})\n\nconst bundleHandler = mevShareClient.on(\"bundle\", async (tx: IPendingBundle) => {\n    /*\n    Do something with the pending bundle here.\n    */\n})\n\n// call before your program terminates:\ntxHandler.close()\nbundleHandler.close()\n```\n\n</TabItem>\n<TabItem value=\"rs\" label=\"mev-share-client-rs\">\n<RemoteCodeBlock url=\"https://raw.githubusercontent.com/paradigmxyz/mev-share-rs/main/examples/sse.rs\" language=\"rust\" showLineNumbers={false} />\n</TabItem>\n\n<TabItem value=\"sh\" label=\"curl\">\n\n```bash\ncurl https://mev-share-goerli.flashbots.net\n```\n\nThis will block until terminated manually (CTRL-C).\n\n_Response:_\n\n```bash\n:ping\n\ndata: {\"hash\":\"0xc7dc06c994400830054ab815732d91275bc1241f9be62b62b687b7882f19b8d4\",\"logs\":null,\"txs\":[{\"to\":\"0x0000c335bc9d5d1af0402cad63fa7f258363d71a\",\"functionSelector\":\"0x696d2073\",\"callData\":\"0x696d20736861726969696969696e67\"}]}\n```\n\n</TabItem>\n</Tabs>\n\n:::info Event Data\n\nEvents currently represent pending transactions, but eventually may be expanded to support other event types. For this reason we refer to this endpoint as an _event stream_, rather than a _transaction stream_.\n\n:::\n\n### Event Stream Endpoints\n\n| Network | URL |\n|-|-|\n| Mainnet | https://mev-share.flashbots.net |\n| Sepolia | https://mev-share-sepolia.flashbots.net |\n\nThe endpoint sends an event with the message `:ping` every 15 seconds if no other messages were sent in the last 15 seconds.\n\n## Event Scheme\n\nEvents dispatched via the SSE endpoint are JSON-encoded objects that adhere to the following scheme:\n\n<StreamEvent />\n\nNote that each of these properties are optional; if a field is not present, it means that the transaction sender chose not to share that information.\n\nBelow is an example of a transaction event received from the stream:\n\n```json\n{\n   \"hash\":\"0xb756c9f6c34309d32c32daf1289c96d64a1068dfc2ead5e9bd0504640b91249e\",\n   \"logs\":[\n      {\n         \"address\":\"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\",\n         \"topics\":[\n            \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\",\n            \"0x0000000000000000000000001b59718eafa2bffe5318e07c1c3cb2edde354f9c\",\n            \"0x0000000000000000000000005c7bcd6e7de5423a257d81b442095a1a6ced35c5\"\n         ],\n         \"data\":\"0x000000000000000000000000000000000000000000000000161545fdcf782a85\"\n      },\n      {\n         \"address\":\"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\",\n         \"topics\":[\n            \"0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65\",\n            \"0x0000000000000000000000005c7bcd6e7de5423a257d81b442095a1a6ced35c5\"\n         ],\n         \"data\":\"0x000000000000000000000000000000000000000000000000161545fdcf782a85\"\n      },\n      {\n         \"address\":\"0x5c7bcd6e7de5423a257d81b442095a1a6ced35c5\",\n         \"topics\":[\n            \"0x8ab9dc6c19fe88e69bc70221b339c84332752fdd49591b7c51e66bae3947b73c\",\n            \"0x0000000000000000000000000000000000000000000000000000000000000089\",\n            \"0x0000000000000000000000000000000000000000000000000000000000117363\",\n            \"0x0000000000000000000000003a23f943181408eac424116af7b7790c94cb97a5\"\n         ],\n         \"data\":\"0x000000000000000000000000000000000000000000000000161fb772f99eaf7a000000000000000000000000000000000000000000000000161fb772f99eaf7a000000000000000000000000000000000000000000000000161fb772f99eaf7a000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000005216e484d6dde00000000000000000000000000000000000000000000000000016b90ac92248e000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000001b59718eafa2bffe5318e07c1c3cb2edde354f9c000000000000000000000000b658ba58f7153e99c05c9b7610f17bfeeab6bff5000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b658ba58f7153e99c05c9b7610f17bfeeab6bff500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000005216e484d6dde000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"\n      }\n   ],\n   \"txs\":[\n      {\n         \"to\":\"0x5c7bcd6e7de5423a257d81b442095a1a6ced35c5\",\n         \"functionSelector\":\"0x44b8be68\",\n         \"callData\":\"0x44b8be680000000000000000000000003a23f943181408eac424116af7b7790c94cb97a5000000000000000000000000b658ba58f7153e99c05c9b7610f17bfeeab6bff5000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000161fb772f99eaf7a000000000000000000000000000000000000000000000000161fb772f99eaf7a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000016b90ac92248e0000000000000000000000000000000000000000000000000005216e484d6dde00000000000000000000000000000000000000000000000000000000001173630000000000000000000000000000000000000000000000000000000000000180ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000\"\n      }\n   ]\n}\n```\n\n### Understanding double-hash\n\nNote that the `hash` field is actually a keccak256 hash of the underlying bundle/transaction hash, essentially a double-hash.\n\nBelow is code-snippet in golang to calculate double-hash for testing purposes.\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/ethereum/go-ethereum/common\"\n\t\"golang.org/x/crypto/sha3\"\n)\n\nfunc main() {\n\tunderlyingHash := common.HexToHash(\"0xd2d662b8aa0e8d86ea75d363522c9ede42ef538ae353da564d501c044a885293\")\n\tdoubleHasher := sha3.NewLegacyKeccak256()\n\tdoubleHasher.Write(underlyingHash.Bytes())\n\tdHash := doubleHasher.Sum(nil)\n\tmatchingHash := common.BytesToHash(dHash)\n\tfmt.Println(matchingHash.String()) //prints 0x90b4f5664cc201c3aa112d6bb2fa414c4aee10f00994692b282c1d14a1db6e4d\n}\n```\n\n---\n\nNow that you've started listening to transactions, you're almost ready to start searching! Read on to the next page to learn [about bundles](/flashbots-mev-share/searchers/understanding-bundles).\n\n\n## Historical Data\n\nHistorical hints can be retrieved from the historical hint API supported by the event stream endpoint.\nEach hint is associated with a block number and timestamp. Block number is the latest Ethereum block number at the time the hint was generated.\nTimestamp is the timestamp at the time the hint was generated.\n\n### GET /api/v1/history/info\n\nReturns information about the available historical hint data.\n\n#### Response\n\n| Field | Type | Description |\n|-|-|-|\n| count | number | The number of historical hints available. |\n| minBlock | number | The earliest block number for which historical hints are available. |\n| maxBlock | number | The latest block number for which historical hints are available. |\n| minTimestamp | number | The earliest timestamp for which historical hints are available. |\n| maxTimestamp | number | The latest timestamp for which historical hints are available. |\n| maxLimit | number | The maximum number of historical hints that can be requested in a single request. |\n\n\n### GET /api/v1/history\n\n#### Query Parameters\n\n| Field | Type | Description |\n|-|-|-|\n| blockStart (optional) | number | The block number to start retrieving historical hints from. |\n| blockEnd (optional) | number | The block number to end retrieving historical hints from. |\n| timestampStart (optional) | number | The timestamp to start retrieving historical hints from. |\n| timestampEnd (optional) | number | The timestamp to end retrieving historical hints from. |\n| limit (optional) | number | The maximum number of historical hints to retrieve. Default limit is `maxLimit`. |\n| offset (optional) | number | The offset to start retrieving historical hints from. |\n\n#### Response\n\nReturns an array of historical hints.\n\n| Field | Type | Description |\n|-|-|-|\n| block | number | The block number associated with the historical hint. |\n| timestamp | number | The timestamp associated with the historical hint. |\n| hint | Hint | Hint as it was sent to the live streaming endpoint in the past. |\n\n\n### Example\n\n#### Get information about historical hint data\n\n```bash\ncurl https://mev-share-goerli.flashbots.net/api/v1/history/info\n```\n\n_Response:_\n\n```json\n{\n    \"count\": 20146,\n    \"minBlock\": 9091377,\n    \"maxBlock\": 9143624,\n    \"minTimestamp\": 1685452445,\n    \"maxTimestamp\": 1686225251,\n    \"maxLimit\": 500\n}\n```\n\n#### Get historical event data beginning at start of stream history\n\n```bash\ncurl https://mev-share-goerli.flashbots.net/api/v1/history\n```\n\n#### Get historical hint data from a specific block range\n\n```bash\ncurl 'https://mev-share-goerli.flashbots.net/api/v1/history?blockStart=9091377&blockEnd=9091379'\n```\n\n_Response:_\n\n```json\n[\n  {\n    \"block\": 9091377,\n    \"timestamp\": 1685452445,\n    \"hint\": {\n      \"txs\": [\n        {\n          \"to\": \"0x8d460b72eaf3d63830e16c22d1fc6908d0834abe\",\n          \"callData\": \"0x\",\n          \"functionSelector\": \"0x00000000\"\n        }\n      ],\n      \"hash\": \"0x50df4922dd5f9adee91d44119132da85b50fe61f0c77556b039261f7828e1794\",\n      \"logs\": null,\n      \"gasUsed\": \"0x5208\",\n      \"mevGasPrice\": \"0x3b9aca00\"\n    }\n  },\n  {\n    \"block\": 9091379,\n    \"timestamp\": 1685452489,\n    \"hint\": {\n      \"txs\": null,\n      \"hash\": \"0x40a85a6e37b449033924da72c0cf9dabcf2ac726b5a88f0ceff330f11bd01913\",\n      \"logs\": null,\n      \"gasUsed\": \"0xaae60\",\n      \"mevGasPrice\": \"0x45a9b5b00\"\n    }\n  }\n]\n```\n\n#### Querying with Offset & Limit\n\nEvent history results are returned in chunks whose size are defined by `limit`, the maximum limit being specified in the [`/history/info` endpoint](#get-apiv1historyinfo).\n\n```bash\n# assuming the limit is 500\ncurl 'https://mev-share-goerli.flashbots.net/api/v1/history?blockStart=9091377'\ncurl 'https://mev-share-goerli.flashbots.net/api/v1/history?blockStart=9091377&offset=500'\ncurl 'https://mev-share-goerli.flashbots.net/api/v1/history?blockStart=9091377&offset=1000'\ncurl 'https://mev-share-goerli.flashbots.net/api/v1/history?blockStart=9091377&offset=1500'\n\n# or with a custom limit\ncurl 'https://mev-share-goerli.flashbots.net/api/v1/history?blockStart=9091377&limit=100'\ncurl 'https://mev-share-goerli.flashbots.net/api/v1/history?blockStart=9091377&limit=100&offset=100'\ncurl 'https://mev-share-goerli.flashbots.net/api/v1/history?blockStart=9091377&limit=100&offset=200'\ncurl 'https://mev-share-goerli.flashbots.net/api/v1/history?blockStart=9091377&limit=100&offset=300'\n```\n"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/getting-started.mdx",
    "content": "---\ntitle: Getting Started\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\nTo start searching on MEV-Share, you will first need to connect to a MEV-Share Node. As a reminder, the MEV-Share Node is responsible for receiving transactions and bundles from users, and selectively sharing information (\"hints\") about them with searchers. When a searcher wants to include a transaction in their bundle, they use that transaction's hash. The MEV-Share Node replaces it with the original transaction before sending the bundle to a block builder.\n\n## Connect to MEV-Share Node\n\nFlashbots operates an MEV-Share Node on the Ethereum mainnet. This Node provides endpoints for user transactions and searcher bundles. Additionally, it offers a Server-Sent Events (SSE) streaming endpoint, broadcasting pending events/transactions to searchers.\n\nThe simplest way to connect to the Flashbots MEV-Share Node is to use a [client library](/flashbots-auction/libraries/mev-share-clients). For this guide, we'll refer to [mev-share-client-ts](https://github.com/flashbots/mev-share-client-ts).\n\n<Tabs>\n<TabItem value=\"ts\" label=\"Typescript\">\n\n_Add library to your project:_\n\n```bash\nyarn add @flashbots/mev-share-client\n```\n\n_Use the following code to import the library_ (Replace ALL_CAPS placeholders with your data):\n\n```typescript\nimport {Wallet, JsonRpcProvider} from 'ethers';\nimport MevShareClient, {\n  BundleParams,\n  IPendingBundle,\n  IPendingTransaction,\n  TransactionOptions,\n} from '@flashbots/mev-share-client';\n\nconst provider = new JsonRpcProvider(RPC_URL);\nconst authSigner = new Wallet(FB_REPUTATION_PRIVATE_KEY, provider);\nconst mevShareClient = MevShareClient.useEthereumMainnet(authSigner);\n```\n\nTo use custom network parameters, you can instantiate a new MevShareClient instance directly. This example is what the client uses to connect to mainnet:\n\n```typescript\n// connect to MEV-Share on mainnet\nconst mevShareClient = new MevShareClient(authSigner, {\n  name: 'mainnet',\n  chainId: 1,\n  streamUrl: 'https://mev-share.flashbots.net',\n  apiUrl: 'https://relay.flashbots.net',\n});\n```\n\nFurther documentation on the client library can be found in the [mev-share-client-ts](https://github.com/flashbots/mev-share-client-ts).\n\n</TabItem>\n\n<TabItem value=\"Rust\" label=\"Rust\">\nFor Rust users, thanks to Paradigm's effort, we have a Rust MEV-Share client [mev-share-rs](https://github.com/paradigmxyz/mev-share-rs).\n\nIf you want a complete MEV bot framework, you could also directly go for [Artemis](https://github.com/paradigmxyz/artemis), which has built-in support for MEV-Share as outlined in this [example](https://github.com/paradigmxyz/artemis/blob/main/examples/mev-share-arb/src/main.rs).\n</TabItem>\n</Tabs>\n\n### A note on other languages\n\nIf you're coding in a language that doesn't yet have a MEV-Share Node client library, you can send transactions and bundles directly with the [JSON-RPC endpoint](/flashbots-auction/advanced/rpc-endpoint). To listen for transactions, all you need is an HTTP client. More details on that in the [Event Stream](/flashbots-mev-share/searchers/event-stream) page.\n\n---\n\nNow you should be connected to the Flashbots MEV-Share Node. Continue reading on the next page to learn how to [listen for hints](/flashbots-mev-share/searchers/event-stream) about pending transactions shared by the MEV-Share Node.\n\n:::note A note for experienced searchers getting acquainted with MEV-Share\n\nSearching on MEV-Share is different from searching on the mempool in that only certain parts of a transaction are shared with searchers. In the mempool, we can see all parts of a transaction, such as its calldata or who the transaction is from. But on MEV-Share, a transaction might only reveal its function selector, making a traditional arbitrage calculation infeasible.\n\nThere are three primary strategies for searching on MEV-Share:\n\n- Probabilistically: send many bundles that probabilistically backrun MEV-Share orderflow.\n- On-chain: perform more of your searching on-chain instead of off-chain.\n- Existing: only search on transactions which share all the information you need.\n\nTo maximally leverage MEV-Share searchers will need to employ new strategies.\n"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/ratelimiting.mdx",
    "content": "---\ntitle: Rate Limits\n---\n\nIn order to protect our services from abuse we have rate limits on the number of requests that can be made. Currently, the rate limits are set as follows.\n\n## `relay.flashbots.net` - Bundles\n\n| Method              | Limit              |\n|---------------------|--------------------|\n| `eth_sendBundle`    | 1800 / IP / 1 min  |\n| `mev_sendBundle`    | 1800 / IP / 1 min  |\n| `eth_cancelBundle`  | 600 / IP / 1 min   |\n| `mev_simBundle`     | 300 / IP / 1 min   |\n| `eth_callBundle`    | 300 / IP / 1 min   |\n| All others          | 120 / IP / 1 min   |\n\nNote that this is _requests_ and not _transactions_ submitted per second. There is no limitation on the number of transactions in a request.\n\nRPC rate limits for retail user transactions sent to `rpc.flashbots.net` [can be found here](../../flashbots-protect/ratelimiting).\n\n## Rate limit exceptions\n\nIf you require a higher rate limit please reach out to [Shea Ketsdever](https://twitter.com/SheaKetsdever).\n"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/sending-bundles.mdx",
    "content": "---\ntitle: Sending Bundles\n---\n\nimport Tabs from '@theme/Tabs'\nimport TabItem from '@theme/TabItem'\nimport SendBundleRpc from '@site/docs/specs/mev-share/_mev_sendBundle.mdx'\nimport BuilderInheritance from '@site/docs/specs/mev-share/blurbs/_builderInheritance.mdx'\n\nWhile the new [bundle spec](/flashbots-mev-share/searchers/understanding-bundles#bundle-definition) may look complex, a bundle can be sent with default parameters using a client library, which ends up looking quite similar to sending bundles on mev-boost.\n\n## Sending a Bundle\n\n:::info Placeholders\n\nVariables in `ALL_CAPS` are placeholders. To use this code, replace them with your own data.\n\n:::\n\n<Tabs>\n<TabItem value=\"ts\" label=\"mev-share-client-ts\">\n\n```typescript\nimport MevShareClient, { BundleParams } from '@flashbots/mev-share-client'\n\nconst mevShareClient = MevShareClient.useEthereumMainnet(authSigner)\n\n// ...\n\nconst bundle = [\n    {hash: PENDING_TX_HASH},\n    {tx: await wallet.signTransaction(BACKRUN_TX), canRevert: false},\n]\n\nconst params: BundleParams = {\n    inclusion: {\n        block: targetBlock,\n        // target several blocks with `maxBlock`\n        maxBlock: targetBlock + 3,\n    },\n    body: bundle,\n    // send the bundles to more builders to speed up inclusion\n    privacy: {\n      builders: [\"flashbots\", \"beaverbuild.org\", \"rsync\", \"Titan\"]\n    }\n}\n\nconst bundleResult = await mevShareClient.sendBundle(params)\n```\n\nThe first transaction in the bundle contains the hash of a pending transaction, which we presumably got from listening to the [event stream](/flashbots-mev-share/searchers/event-stream). The second transaction is one we sign ourself, which backruns the first transaction, presumably for a profit.\n\n:::info Bundle endpoint\n\nMEV-Share bundles are sent to the same RPC endpoint as MEV-Boost bundles: `https://relay.flashbots.net`\n\n:::\n\nSee [mev-share-client-ts](https://github.com/flashbots/mev-share-client-ts/blob/main/src/examples/sendBackrunBundle.ts) for a full working example.\n\n</TabItem>\n</Tabs>\n\n---\n\nThe params not included in the previous example can be used to configure more advanced conditions for your bundle's execution and the MEV refunds you earn.\n\n### Share bundle data\n\nTo earn more MEV refunds and improve your bundle's chances of inclusion, you can specify data about your bundle's transactions that you wish to share with other searchers. The data that is shared is specified via the `privacy` parameter.\n\n:::caution bundles with signed txs only\n\nNote that bundles with transactions including the `hash` parameter are considered \"unmatched\", and will throw an error.\n\n:::\n\n<Tabs>\n<TabItem value=\"ts\" label=\"mev-share-client-ts\">\n\n```typescript\nconst params: BundleParams = {\n    inclusion: {\n        block: 17539448,\n        maxBlock: 17539450\n    },\n    body: [\n        {tx: \"0x02...\", canRevert: false},\n        //can only include one backrun tx\n    ],\n    privacy: {\n        hints: {\n            calldata: true,\n            logs: true,\n            txHash: true,\n        },\n    },\n}\n```\n\n</TabItem>\n<TabItem value=\"curl\" label=\"curl\">\n\n```bash\ncurl -X POST -H \"Content-Type: application/json\" -H \"X-Flashbots-Signature: $FB_SIG\" -d '{\n    inclusion: {\n        block: \"0x10ba178\",\n        maxBlock: \"0x10ba17a\",\n    },\n    body: [\n        {tx: \"0x02...\", canRevert: false},\n        {tx: \"0x02...\", canRevert: false},\n    ],\n    privacy: {\n        hints: [\"calldata\", \"logs\", \"tx_hash\"],\n    },\n}'\n```\n</TabItem>\n</Tabs>\n\nEven sharing only the `tx_hash` hint can be enough to earn some extra MEV. The only requirement to earn it is that your bundle is included in another searcher's bundle.\n\nThis strategy is particularly relevant to searchers who operate on public mempool transactions, and/or employ strategies that leave leftover MEV on the table (for example, if your strategy changes prices enough for a backrun arbitrage to be profitable).\n\n### Nest bundles (be a MEV-Share Node)\n\nMEV-Share Nodes nest bundles to build composite bundles that are more profitable.\n\n<Tabs>\n<TabItem value=\"ts\" label=\"mev-share-client-ts\">\n\n```typescript\nconst params: BundleParams = {\n    inclusion: {\n        block: TARGET_BLOCK,\n    },\n    body: {\n        {hash: PENDING_TX_HASH},\n        {bundle: {\n            inclusion: {...},\n            body: {...},\n            privacy: {...},\n            validity: {...},\n        }}\n    },\n}\n```\n\n</TabItem>\n</Tabs>\n\n### Builder Inheritance\n\n<BuilderInheritance />\n\n## Simulating Bundles\n\nBundles matched by the MEV-Share Node can be simulated to check MEV profits. To simulate a bundle, we use the [`mev_simBundle`](/flashbots-auction/advanced/rpc-endpoint#mev_simbundle) endpoint. \n\n:::caution only matched bundles can be simulated\n\nBundle simulations can only be executed on matched bundles, which contain only signed transactions, or nested bundles which also contain only signed transactions. Bundles with transactions including the `hash` parameter are considered \"unmatched\", and will throw an error.\n\n:::\n\n<Tabs>\n<TabItem value=\"ts\" label=\"mev-share-client-ts\">\n\n```typescript\nconst params: BundleParams = {\n    inclusion: {\n        block: TARGET_BLOCK\n    },\n    body: [\n        {bundle: {\n            version: \"beta-1\",\n            inclusion: {\n                block: TARGET_BLOCK,\n                maxBlock: TARGET_BLOCK + 3,\n            },\n            body: [{tx: SIGNED_TX_1}],\n            privacy: {\n                hints: {calldata: true},\n            },\n            validity: {\n                refundConfig: [{address: REFUND_ADDRESS, percent: 100}]\n            }\n        }},\n        {tx: SIGNED_TX_2},\n    ],\n    validity: {\n        refund: [{bodyIdx: 0, percent: 90}]\n    }\n}\n\nconst simResult = await mevShareClient.simulateBundle(params)\n```\n\n</TabItem>\n</Tabs>\n"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/bot.mdx",
    "content": "import Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\nimport UniV2FactoryABI from \"@site/docs/specs/contracts/abi/_uniswapV2Factory.mdx\";\nimport FlashLoanArbABI from \"@site/docs/specs/contracts/abi/_flashLoanArb.mdx\";\n\n# Automated Arbitrage Bot\n\nWith the flash-loan arbitrage smart contract finished, our last task is to automate the process of finding and back-running other users' trades.\n\nSince we already have a full bot that you can look at for a complete example, we'll just lay out the core principles and methods here, without walking through a whole bot step by step. This guide aims to give you everything you need to write your own edition of [simple-blind-arbitrage](https://github.com/flashbots/simple-blind-arbitrage).\n\nFor a more in-depth guide on writing a bot from scratch, check out the [MEV-Share Limit Order Bot tutorial](/flashbots-mev-share/searchers/tutorials/limit-order/introduction).\n\n## Client Libraries\n\nTo write your own bot, you'll need a way to interact with Flashbots APIs. Client libraries implement all the functionality of the APIs in their native programming language. If your preferred language doesn't have a MEV-Share client library already, you can interact with the APIs directly, effectively implementing your own client (let us know if you do!). Information about Flashbots APIs can be found in the [RPC docs](/flashbots-auction/advanced/rpc-endpoint) and [Event Stream docs](/flashbots-mev-share/searchers/event-stream).\n\nClient libraries have been developed for the following programming languages (more to come soon):\n\n|||\n|-|-|\n| typescript/javascript | [mev-share-client-ts](https://github.com/flashbots/mev-share-client-ts) ([npm](https://www.npmjs.com/package/@flashbots/mev-share-client)) |\n| rust | [mev-share-rs](https://github.com/paradigmxyz/mev-share-rs) ([crates.io](https://crates.io/crates/mev-share)) |\n\n## Finding Pending Transactions\n\nTo reiterate our goal, we need to find pending transactions from other Ethereum users and backrun them (send our transaction immediately after the user's transaction). If the user's trade moves the price enough, we'll arbitrage the trading pair between two exchanges for a profit.\n\nAs MEV-Share receives new transactions, it broadcasts them to searchers via the [Event Stream](/flashbots-mev-share/searchers/event-stream). Each transaction shares varying amounts of data via [hints](/flashbots-protect/mev-refunds#hints), but by default, transactions that trade on Uniswap, Balancer, or Curve will expose the trading pair's contract address in the log topics.\n\nHere's an example of an event generated by a user who's (most likely) using MEV-Share's default privacy settings:\n\n### Example Event\n\n```json noInline\n{\n  \"hash\": \"0x0c459dce812747c643f06c82eeca2a2f584b4e30af79b2b546fd015e4aac4541\",\n  \"logs\": [\n    {\n      \"address\": \"0xca25091555d36ac0be8119ad967898ac30223b41\",\n      \"topics\": [\n        \"0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822\",\n        \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n        \"0x0000000000000000000000000000000000000000000000000000000000000000\"\n      ],\n      \"data\": \"0x\"\n    }, {\n      \"address\": \"0xca25091555d36ac0be8119ad967898ac30223b41\",\n      \"topics\": [\n        \"0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822\",\n        \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n        \"0x0000000000000000000000000000000000000000000000000000000000000000\"\n      ],\n      \"data\": \"0x\"\n    }\n  ],\n  \"txs\": null\n}\n```\n\nIf we [look up the address](https://etherscan.io/address/0xca25091555d36ac0be8119ad967898ac30223b41) specified in the log topics, we'll see that it's a trading pair contract for QPEPE/WETH on Uniswap V2. This tells us that the user is buying/selling QPEPE on Uniswap, which means that we may be able to arbitrage it with Sushiswap or another Uni-V2 derivative.\n\n![](/img/mevshare-flashloan-arb-guide/qpepe5.jpg \"arbitrage profit per amount_in\")\n\nTo detect events yourself, listen to the SSE Event Stream at [https://mev-share.flashbots.net](https://mev-share.flashbots.net).\n\nEvents are comprised of either a single **transaction** or a **bundle** (multiple transactions):\n\n- In a **bundle** event, the `hash` field is the _bundle hash_ and the `txs` field will be populated with transaction-related data for each tx in the bundle.\n- In a single-**transaction** event, `hash` represents the _transaction hash_ and the `txs` field is `null`.\n\n<Tabs defaultValue=\"tsjs\"\n  values={[\n    {label: 'TS/JS', value: 'tsjs'},\n    {label: 'Rust', value: 'rs'},\n    {label: 'curl', value: 'curl'},\n  ]}>\n\n<TabItem value=\"tsjs\">\n\n```typescript\nconst authSigner = new Wallet(Env.authKey).connect(provider)\nconst mevshare = MevShareClient.useEthereumMainnet(authSigner)\n\nmevshare.on(\"transaction\", async (pendingTx: IPendingTransaction) => {\n  // handle tx event\n})\n```\n\nIn this library, transactions are natively differentiated from bundles, so if you want to detect bundles too, just add another handler using `on(\"bundle\", ...)`:\n\n```typescript\nmevshare.on(\"bundle\", async (pendingBundle: IPendingBundle) => {\n  // handle bundle event\n})\n```\n\nCheck out the [implementation](https://github.com/flashbots/mev-share-client-ts/blob/main/src/api/interfaces.ts#L222-L282) for a closer look at how events are defined.\n\n</TabItem>\n\n<TabItem value=\"rs\">\n\n```rust\nlet mainnet_sse = \"https://mev-share.flashbots.net\";\nlet client = EventClient::default();\nlet mut stream = client.events(mainnet_sse).await.unwrap();\nwhile let Some(event) = stream.next().await {\n  // handle event\n}\n```\n\nIn this library, an event whose `txs` field is null is encoded as an empty array, so in practice, we need to check if `event.txs` is empty to see if we have a transaction or a bundle.\n\n```rust\nwhile let Some(event) = stream.next().await {\n  if event.txs.len() == 0 {\n    // handle single tx\n  } else {\n    // handle bundle\n  }\n}\n```\n</TabItem>\n\n<TabItem value=\"curl\">\n\n```bash\ncurl  https://mev-share.flashbots.net\n```\n\nThe Event Stream is streamed via SSE over a simple HTTP GET request, which may seem confusing. It's not terribly important for the purpose of building bots, but if you're curious, SSE was [added to HTML](https://html.spec.whatwg.org/multipage/server-sent-events.html) in HTML5.\n\n</TabItem>\n\n</Tabs>\n\n---\n\n_To read more about how the SSE stream works, see the [Event Stream docs](/flashbots-mev-share/searchers/event-stream)._\n\n## Filtering Relevant Transactions\n\nMEV-Share uses [**hints**](/flashbots-protect/mev-refunds#hints) to selectively share information about a transaction. Based on the hint preferences specifies by the user when connecting, the transactions (or bundles) they send will trigger events containing information about their transaction which is filtered according to their hint preferences.\n\nIn this guide, we're only concerned with the fields in `logs`: `address` and `topics`. Other fields not covered in this guide are detailed in the [Event Scheme docs](/flashbots-mev-share/searchers/event-stream#event-scheme).\n\n_Snippet from an example event:_\n\n```json\n{\n  ...,\n  \"logs\": [\n    {\n      \"address\": \"0xca25091555d36ac0be8119ad967898ac30223b41\",\n      \"topics\": [\n        \"0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822\",\n        \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n        \"0x0000000000000000000000000000000000000000000000000000000000000000\"\n      ],\n      \"data\": \"0x\"\n    }, ...\n  ],\n}\n```\n\n**`address`** tells us which contract address the user is interacting with. Looking back at the [example event](/flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/bot#example-event), you'll notice that the `address` is the [trading pair](https://etherscan.io/address/0xca25091555d36ac0be8119ad967898ac30223b41), and not a router contract. This is likely because the user is using the default hints, which expose the trading pair instead of whatever router they might be interacting with. It's also possible that the user is another searcher, and they're trading on the pair directly. At any rate, it makes no difference to us.\n\nGiven the default hint preferences, MEV-Share also exposes _only_ swap-related function signatures (if present) in the `topics`. The [simple-blind-arbitrage](https://github.com/flashbots/simple-blind-arbitrage/blob/main/execute/index.js#L54) bot uses the [Uniswap V2 Swap event signature](https://docs.uniswap.org/contracts/v2/reference/smart-contracts/pair#swap) to find pending Uniswap V2 trades.\n\nTo find event signatures yourself, you need to take the keccak256 hash of the event signature. A nice tool to use for this is [**`cast`** from Foundry](https://github.com/foundry-rs/foundry):\n\n```bash\n# get the hash of the UniV2 Swap event\ncast sig-event \"event Swap(\n  address indexed sender,\n  uint amount0In,\n  uint amount1In,\n  uint amount0Out,\n  uint amount1Out,\n  address indexed to\n);\"\n0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822\n```\n\nTo filter our results so that we only deal with Swap events, we can simply check the `logs` field. If it isn't empty, each entry should contain `topics`. If our event signature hash is in those topics, then we know we're looking at a swap that we can backrun. For events generated by Protect users, the relevant signature hash is the first topic in the array, so we check `log.topics[0]`.\n\nOnce we find a pending swap on one exchange, we need to find another exchange to arbitrage with. For example, if we detect a Uniswap V2 event, then we should try to arbitrage with Sushiswap. To get the trading pair on the other exchange, we need to use that exchange's [Factory](https://docs.uniswap.org/contracts/v2/reference/smart-contracts/factory) contract, which maps pairs of token addresses to [Pair](https://docs.uniswap.org/contracts/v2/reference/smart-contracts/pair) contract addresses.\n\n<Tabs defaultValue=\"tsjs\"\n  values={[\n    {label: 'TS/JS', value: 'tsjs'},\n    {label: 'Rust', value: 'rs'},\n  ]}>\n<TabItem value=\"tsjs\">\n\n```typescript\nimport {Contract} from \"ethers\"\nimport uniV2FactoryABI from \"./abi/uniswapV2Factory.json\"\n\nconst swapTopic = \"0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822\"\n\n// instantiate factory contracts\nconst uniV2FactoryAddress = \"0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f\"\nconst uniV2Factory = new Contract(uniV2FactoryAddress, uniV2FactoryABI)\nconst sushiFactoryAddress = \"0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac\"\nconst sushiFactory = new Contract(sushiFactoryAddress, uniV2FactoryABI)\n\nmevshare.on(\"transaction\", async (tx: IPendingTransaction) => {\n  for (const log of tx.logs) {\n    // skip if it isn't a swap event\n    if (log.topics[0] !== swapTopic) {\n      continue\n    }\n\n    // data needed to find arb pair on another exchange\n    const pair = new ethers.Contract(log.address, pairABI)\n    const token0 = await pair.token0()\n    const token1 = await pair.token1()\n    // primitive differentiator between uniswap & sushiswap. ideally you'd use an enum to support >2 exchanges.\n    const isUniswap = pair.factory === uniV2FactoryAddress\n\n    const altFactory = isUniswap ? sushiFactory : uniV2Factory\n    const altPair = await altFactory.getPair(token0, token1)\n    if (altPair === \"0x0000000000000000000000000000000000000000\") {\n      console.error(\"pair not found on alternative exchange\")\n      continue\n    }\n\n    // placeholder: send backrun bundle\n    await tryBackrun(pair.address, altPair)\n  }\n})\n```\n\nNote: querying the blockchain can cost precious time -- a better design would be to store arb-ready pairs somewhere fast, like in memory or a fast DB, and only query the blockchain when a stored pair alternative can't be found.\n\n</TabItem>\n<TabItem value=\"rs\">\n\n```rust\nlet swap_topic = \"0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822\"\n  .parse::<H256>()\n  .unwrap();\nwhile let Some(event) = stream.next().await {\n  dbg!(&event);\n  // handle tx or bundle events containing swap logs\n  let event = event.unwrap();\n  for log in event.logs {\n    // skip if it isn't a swap event\n    if log.topics[0] != swap_topic {\n      continue;\n    }\n\n    // get data needed to find arb pair\n    // TODO\n\n    // placeholder: send backrun bundle\n    tryBackrun(pair.address, altPair.address).await?;\n  }\n}\n```\n\n</TabItem>\n</Tabs>\n\nNote that the Sushiswap factory uses the same ABI as the Uniswap contract. Sushiswap is just a Uniswap V2 clone, so we know that the code is the same, which means the ABIs are also the same.\n\n:::info blind backruns\n\nNote that we potentially send a bundle for every log in the array. This is because some trades affect many trading pairs. Because we don't know which one was affected, we just attempt to backrun them all. The bundles we'll send for a given opportunity will use the same nonce for every backrun tx, so only the most profitable one will land.\n\n:::\n\n## Sending Backrun Bundles\n\nSo far we've seen how to find the events we want to backrun, and we have a placeholder (`tryBackrun`) in place to send our backrun bundles. Once we implement `tryBackrun`, we'll have everything we need to send backrun bundles.\n\nA backrun bundle is an array consisting of two or more transactions: the user's transaction, and the following \"backrun transactions.\" The backrun transaction we'll send is a call to `makeFlashLoan` on our arbitrage contract. If you recall from the implementation of the [flash loan arbitrage contract](https://github.com/flashbots/simple-blind-arbitrage/blob/main/src/BlindBackrunFlashLoan.sol), the [`receiveFlashLoan`](https://github.com/flashbots/simple-blind-arbitrage/blob/main/src/BlindBackrunFlashLoan.sol#L54-L87) function calls `_executeArbitrage` before paying back the loan. So all we have to do is get a flash loan, and then our contract will try to execute an arbitrage with the tokens it receives. If it's profitable, we pay the loan back, pay the builder, and keep the rest. If not, it reverts and is discarded by the builder.\n\n_This is the function we need to call:_\n\n```solidity\nfunction makeFlashLoan(\n  IERC20[] memory tokens,\n  uint256[] memory amounts,\n  bytes memory userData\n)\n```\n\nTo call `makeFlashLoan`, we specify the `tokens` we want to borrow, the respective `amounts` of tokens to borrow, and the ABI-encoded `userData` which will contain the arguments to the `_executeArbitrage` function.\n\n<Tabs defaultValue=\"tsjs\"\n  values={[\n    {label: 'TS/JS', value: 'tsjs'},\n    {label: 'Rust', value: 'rs'},\n  ]}>\n<TabItem value=\"tsjs\">\n\n<FlashLoanArbABI />\n\nThis function sends a backrun given two pair addresses and a pending tx hash from the Event Stream:\n\n```typescript\nimport ArbContractAbi from \".abi/blindBackrunFlashLoan.json\"\n\nconst arbContractAddress = \"0xTODO\"\nconst arbContract = new Contract(arbContractAddress, ArbContractAbi, provider)\n\nasync function tryBackrun(startPair, endPair, txHash) {\n  let blockNumber = Number(await this.signer.provider.getBlockNumber())\n  console.log(\"Current block number:\", blockNumber)\n  console.log(\"Building bundles\")\n\n  let bundleTransactionOptions = {\n      gasPrice: (await this.signer.provider.getGasPrice()), // This is *extremely* naive.\n      gasLimit: ethers.BigNumber.from(400000),\n      nonce: await this.signer.getTransactionCount(),\n  }\n  const types = [\n    'address',\n    'address',\n    'uint256'\n  ]\n  const values = [\n    startPair,\n    endPair,\n    this.percentageToKeep\n  ]\n  let params = Web3EthAbi.encodeParameters(types, values)\n\n  let bundleTransaction = await arbContract.populateTransaction.makeFlashLoan(\n    config.mainnetWETHAddress,\n    ethers.BigNumber.from(10**21).toString(),\n    params,\n    bundleTransactionOptions\n  )\n  let bundle = [\n    {hash: txHash},\n    {tx: await this.signer.signTransaction(bundleTransaction), canRevert: false},\n  ]\n  let fullBundle = {\n    inclusion: {\n      block: blockNumber + 1, // try to land in next block\n      maxBlock: ethers.utils.hexValue(blockNumber + 24) // Protect txs expire after 25 blocks\n    },\n    body: bundle,\n  }\n\n  return await mevshare.sendBundle(fullBundle)\n\n  // for the reader: also send another bundle that calls `makeFlashLoan`\n  // with `startPair` and `endPair` in switched in `values`.\n}\n```\n\nWe get `blockNumber` at the start to set the target block in our bundle params. `bundleTransactionOptions` is pretty self-explanatory -- we use this because we're signing our backrun transaction manually, so it needs these params to be set manually.\n\n`types` and `values` define the function params that are passed via `userData` (as the variable `params`) in `makeFlashLoan`, and then decoded in `receiveFlashLoan` and passed to `_executeArbitrage`.\n\nWe use `arbContract.populateTransaction.makeFlashLoan` to construct the backrun transaction, and then build a bundle with it and the user's pending tx hash. Lastly, we add the full bundle params for the MEV-Share `sendBundle` call, and then call it and return its result.\n\n</TabItem>\n<TabItem value=\"rs\">\n\n[mev-share-rs](https://github.com/paradigmxyz/mev-share-rs)\n\n```typescript\n// rs\n```\n\n// TODO: Explain specific rust code here.\n\n</TabItem>\n</Tabs>\n\nPut these examples together and you should have a working flash-loan arbitrage bot. If you get stuck, checkout [simple-blind-arbitrage](https://github.com/flashbots/simple-blind-arbitrage/blob/main/execute/index.js), written in javascript.\n"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/flash-loan-basics.mdx",
    "content": "import RemoteCodeBlock from \"@site/src/components/RemoteCodeBlock\"\n\n# Flash Loan Basics (Balancer)\n\nTo recap, flash loans allow us to borrow vast amounts of tokens, which we can use to pay for trades. If we make a profit from executing an arbitrage, we pay the loan back and keep what's left over. If the arbitrage fails or does not produce enough profit to repay the loan, the transaction reverts and Flashbots prevents it from landing onchain, so we don't pay any fees. The only fees we pay are gas fees for successful arbitrage trades.\n\nFlash loans work because of [**transaction atomiticy**](https://www.webopedia.com/definitions/atomic-operation/). Ethereum implements this notion of atomicity over a single transaction: either all steps of the transaction succeed, or the entire transaction fails. So we say \"the transaction reverts.\" The obvious example is a flash loan: if you borrow tokens with a flash loan, and then exit the transaction without paying it back, that transaction would be forced to revert. This is because the flash loan code itself is designed to revert if the borrower doesn't send the borrowed tokens back.\n\nWe'll implement flash loans using Balancer because they don't charge any loan fees, and have plenty of capital with which we can perform our arbitrage trades. Typically, flash loans (including Balancer) work by using callbacks. Callbacks are just functions that _other_ smart contracts call on _your_ smart contract. A callback in solidity is implemented by declaring a function in your smart contract with the exact function signature (name, arguments, return type) of the callback. The function must also be `external` (we'll see why soon), but we won't make it `public` since we don't plan to call it ourselves.\n\nIn the case of a flash loan on Balancer, the callback we have to create is the `receiveFlashLoan` function. When we want to get a flash loan, we'll call `vault.flashLoan`, where `vault` is the Balancer Vault smart contract, which holds the capital used for flash loans. In turn, the vault contract will call the `receiveFlashLoan` callback on our smart contract (this is why the function is `external`). In this function, the contract will have received the funds from the flash loan, so that's where we'll performs an arbitrage trade and pay back the loan. That's all there is to it!\n\n## Adding Flash Loans to Your Contract\n\nFlash loan capabilities can be added to any smart contract by simply implementing the `receiveFlashLoan` function. The only requirement for this function is that it pays back the flash loan, but we'll also call our arbitrage function here, since we only need flash loans for executing arbitrages. Add this function to your existing smart contract, and then add a function that calls `vault.flashLoan`. Here's an example we borrowed from the [Balancer docs](https://docs.balancer.fi/reference/contracts/flash-loans.html#example-code):\n\n```solidity\nfunction makeFlashLoan(\n        IERC20[] memory tokens,\n        uint256[] memory amounts,\n        bytes memory userData\n    ) external {\n    vault.flashLoan(this, tokens, amounts, userData);\n}\n```\n\nWe'll call `makeFlashLoan` to get a flash loan, which will in turn trigger the `receiveFlashLoan` function, which will execute the arbitrage trade and pay the loan back.\n\nHere's a finished smart contract from [simple-blind-arbitrage](https://github.com/flashbots/simple-blind-arbitrage/blob/main/src/BlindBackrunFlashLoan.sol) for reference:\n\n<RemoteCodeBlock url=\"https://raw.githubusercontent.com/flashbots/simple-blind-arbitrage/main/src/BlindBackrunFlashLoan.sol\" title=\"BlindBackrunFlashLoan.sol\" language=\"solidity\" showLineNumbers={true} />\n\nNow that our contract is ready, we need to watch for new pending transactions and send arbitrage bundles to Flashbots when we find them. See the next page for instructions on writing a bot to do this for you.\n"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/introduction.mdx",
    "content": "# Introduction\n\nIn this guide, we show you how to run an atomic arbitrage bot that uses flash loans. Flash loans allow you to borrow vast amounts of capital, which we'll use to pay for arbitrage trades. If you make a profit, then you pay back the loan and keep what's left over. If you don't, then the transaction simply reverts. Thanks to Flashbots, we don't pay for reverted transactions; we only have to pay gas for successful transactions. In sum, this is an ultra-low-risk strategy that requires very little upfront capital.\n\nWe'll start with a [turnkey bot](https://github.com/flashbots/simple-blind-arbitrage) you can run yourself. For a detailed description of how it works, see the next page. \n\n---\n\n- [simple-blind-arbitrage walkthrough video](https://youtu.be/Twcr2vZ1tRU?si=krmJbMH5htNTd-HK)\n"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/simple-blind-arbitrage.mdx",
    "content": "import RemoteCodeBlock from \"@site/src/components/RemoteCodeBlock\";\nimport Admonition from \"@theme/Admonition\";\n\n# Breakdown: simple-blind-arbitrage\n\nOur goal is to make an _arbitrage bot_ that uses flash loans to fund its trades. Arbitrage opportunities arise when one user makes a trade that results in a significant price shift on one exchange. If there is a trading pair on another exchange for the same tokens, and the difference in price between the two exchanges is large enough, we can turn a profit by sending a two trades immediately after the one that caused the price shift: one to buy tokens on one exchange, one to sell them on another. Sending one or more transactions immediately after another is known as **backrunning**.\n\nThe goal of backrunning is to guarantee that our trades are first in line to execute after the result of some transaction (e.g. a price shift). This allows us to calculate the optimal trade at execution-time with certainty that it will either execute the ideal arbitrage, or revert.\n\n> This guide is based off of [simple-blind-arbitrage](https://github.com/flashbots/simple-blind-arbitrage). Before you continue with this guide, we recommend skimming the [README](https://github.com/flashbots/simple-blind-arbitrage#readme) for a technical overview of the system. If this raises more questions than it answers, that's OK! This guide will break down each component of the bot in detail.\n\nBefore we backrun any transactions, we need to create a smart contract to make trades for us. The backrun transaction we send will call a function on the contract that executes the arbitrage. So how does the smart contract execute an arbitrage?\n\nTo find out, let's examine this bot's strategy: _onchain searching_.\n\n## Onchain Searching\n\nMEV-Share introduces some key differences from more common strategies that you may have seen elsewhere (e.g. [simple-arbitrage](https://github.com/flashbots/simple-arbitrage), [subway](https://github.com/libevm/subway), [rusty-sando](https://github.com/mouseless-eth/rusty-sando)). These bots rely on _full transaction simulations_ (with signatures) to calculate the optimal trade _off-chain_. Calculating trades off-chain saves gas, but comes at the cost of uncertainty. Based on your bundle's placement in the block, the state your transaction relies on may change, which could potentially invalidate your transaction.\n\nOn MEV-Share, pending transactions typically expose _less data_ than transactions in the public mempool. Transaction signatures are _always_ hidden from searchers. Simulation-based strategies (e.g. rusty-sando) on these transactions are usually not possible, since the amount traded by the user is typically hidden. That being said, users can choose to reveal more data to searchers, so all the classic strategies can still be used; they'll just land less often.\n\nThe strategy we'll use is called \"onchain\" searching: we calculate how much to trade within the \"trade\" itself, effectively executing the searching strategy & algorithm _on the blockchain_ (\"onchain\"). The advantage of this strategy is that it has direct access to onchain state, meaning it can _always_ calculate the most optimal arbitrage trade parameters, unlike off-chain strategies.\n\nWe send a backrun for every transaction that touches the tokens we're interested in trading, and rely on Flashbots to prevent unprofitable trades from landing on-chain. The _amount_ we buy & sell in our arbitrage trades is derived from the prices of the assets on the blockchain at the time of execution. Because we place our transaction behind another user's transaction (\"backrunning\"), the price that our transaction sees is the price which has been changed by the user's trade. This is where we get our arbitrage opportunity.\n\n## Arbitrage Contract\n\nWe'll start by looking at a ready-made smart contract, and then break it down piece by piece. \n\nThis is the **core logic contract**, which contains functions for performing arbitrage between Uniswap-V2-like exchanges (e.g. UniV2 / Sushiswap). Later on, we'll create other contracts that inherit this one, so that we can add custom asset management logic (flash loans, where to store profits, etc.) without having to rewrite all the Uniswap-centric logic, which you likely won't need to change.\n\n<RemoteCodeBlock url=\"https://raw.githubusercontent.com/flashbots/simple-blind-arbitrage/main/src/BlindBackrunLogic.sol\" language=\"solidity\" title=\"BlindBackrunLogic.sol\" showLineNumbers={true} />\n\nThis may look complicated, but by the end we'll have explained every line of code. We'll start at the top with Imports & Interfaces.\n\n### Imports & Interfaces\n\nWe start by importing some contract interfaces [`openzeppelin/access/Ownable.sol`](https://github.com/flashbots/simple-blind-arbitrage/blob/main/lib/openzeppelin-contracts/contracts/access/Ownable.sol) and [`./IWETH.sol`](https://github.com/flashbots/simple-blind-arbitrage/blob/main/src/IWETH.sol). Ownable allows us to restrict certain functions to the contract owner. IWETH allows us to deposit/withdraw ETH for [WETH](https://cointelegraph.com/news/what-is-wrapped-ethereum-weth-and-how-does-it-work). We need WETH because Uniswap (V2/V3) only supports ERC20 tokens.\n\nWe also define a couple interfaces ourselves: `IUniswapV2Pair` and `IPairReserves`. We could import these from the official Uniswap contract library like we did with OpenZeppelin for the Ownable contract, but that comes with a lot of bloat for our project. In this case, we only need four functions from `IUniswapV2Pair`, and the struct definition of `PairReserves` from `IPairReserves`.\n\nDefining these interfaces allows us to interact with other smart contracts directly, as we'll see in the next sections.\n\n### Abstract Contract\n\nIt's important to remember that this is an abstract contract, meaning that to use it, we'll need to write another smart contract that extends it (using the `is` keyword). This contract is responsible for implementing the capital-management strategy; where to keep money, where/how to get it; as well as any other custom logic such as fee payments, etc. We'll do a walkthrough of a finished implementation with flash loans after we break down the core logic contract. Read on to learn how our arbitrage algorithm works.\n\n### Calculating the Optimal Arbitrage\n\nTo illustrate what the algorithm does, we plot profit (in ETH) from an arbitrage, where we buy `amount_in` tokens for WETH on one exchange and sell them all for WETH on another.\n\n![](/img/mevshare-flashloan-arb-guide/arb-profit-plot.png \"arbitrage profit per amount_in\")\n\nAs you can see, the optimal amount_in to buy is approximately 35 ETH, but that's just eyeballing. How do we calculate the exact optimal point?\n\nThe following function calculates the optimal trade amount such that gross profit is as high as possible:\n\n- let $F$ = `FEE` = 997\n- let $D$ = `FEE_DIVISOR` = 1000\n- let ${R_i}_{A|B}$ = `reserveIn` for exchange A or B\n    - this refers to the reserves of the token that we're paying _into_ the trade\n- let ${R_o}_{A|B}$ = `reserveOut` for exchange A or B\n    - this refers to the reserves of the token that we're getting _out_ of the trade\n\n$$\nprofit_{gross} = {\n    \\left(\\sqrt{F^2 \\cdot {R_o}_A \\cdot {R_o}_B \\over {R_i}_B \\cdot {R_i}_A} - D\\right) \\cdot {R_i}_B \\cdot {R_i}_A \\cdot D\n    \\over\n    \\left(F \\cdot {R_i}_B \\cdot D \\right) + \\left( F^2 \\cdot {R_o}_A \\right)\n}\n$$\n\n_For example, if we're arbitraging WETH -> TKN on exchange A, then TKN -> WETH on exchange B, our variables would be:_\n\n- ${R_i}_A$ = `WETH.reserves`\n- ${R_o}_A$ = `TKN.reserves`\n- ${R_i}_B$ = `TKN.reserves`\n- ${R_o}_B$ = `WETH.reserves`\n\nHow to derive this formula is beyond the scope of this document, but if you want to dig deeper, check out [this paper](https://arxiv.org/pdf/1911.03380.pdf).\n\nThis formula is implemented by the `getAmountIn` function [in our smart contract](https://github.com/flashbots/simple-blind-arbitrage/blob/main/src/BlindBackrunLogic.sol#L116C14-L130), which relies on [`getNumerator`](https://github.com/flashbots/simple-blind-arbitrage/blob/main/src/BlindBackrunLogic.sol#L132-L173) and [`getDenominator`](https://github.com/flashbots/simple-blind-arbitrage/blob/main/src/BlindBackrunLogic.sol#L175-L206) to do the math (and to avoid \"stack too deep\" errors).\n\nNow that we know how to calculate the optimal amount of WETH to send for an arbitrage, let's put it to use.\n\n### `_executeArbitrage`\n\n`_executeArbitrage` is the core function responsible for looking up trading prices, calculating the optimal buy/sell amounts, and executing the two trades that make up the arbitrage. It only takes three arguments:\n\n```solidity\nfunction _executeArbitrage(\n    address firstPairAddress,\n    address secondPairAddress,\n    uint percentageToPayToCoinbase\n) ...\n```\n\nWe just tell it which token pairs to trade, and how much profit to tip the validator. We choose to make `percentageToPayToCoinbase` a function argument because as competition increases, you may have to pay more to the validator to be selected over another competing bundle. This may change frequently, so it's important to monitor the bot and adjust the tip as needed.\n\nThe function starts by reading the smart contract's own WETH balance. This is used later to verify our profits. We use the pair addresses to instantiate uniswap Pair contracts, which we pass to `getPairData` to read the reserves, which we then use to calculate the optimal arbitrage with `getAmountIn(firstPairData, secondPairData)`.\n\nUniswap token pairs refer to their tokens as `token0` and `token1`; `token0` being the one whose address is numerically less than the other (e.g. 0x0123 < 0x0234); so we need to discern which token of the pair's two tokens is WETH. Our `getPairData` function sets this in the `isWETHZero` field. If WETH is token0, then we'll trade token0 -> token1 on exchange A, then token1 -> token0 on exchange B. If WETH is token1, then we just switch \"token0\" with \"token1\" and apply the same formula.\n\nOnce we know which token is which, we can make assertions about our profits and calculate how much to send for the second trade. To calculate how many tokens we'll receive from a single trade, we use a [custom `getAmountOut` function](https://github.com/flashbots/simple-blind-arbitrage/blob/main/src/BlindBackrunLogic.sol#L249C1-L258C6). It's adapted from the [UniswapV2 Library contract](https://github.com/Uniswap/v2-periphery/blob/master/contracts/libraries/UniswapV2Library.sol#L43-L50); we just removed the safety checks to save gas. We don't need guard rails since Flashbots will prevent reverting transactions from landing onchain.\n\nWe use the values calculated from `getAmountOut` as inputs to the token pairs' swap functions: we use `amountIn` (the \"optimal arbitrage\" value) as the amount (of WETH) to send for the first trade, then use the output (`firstPairAmountOut`) of the first trade as the input to the second trade, selling all the tokens we bought from the first exchange to the other.\n\nOnce we've executed our trades, we should expect to have more ETH (or WETH) than we started with. But that won't always be the case. To ensure that we don't pay for an unprofitable trade, we check the WETH balance at the end of the `_executeArbitrage` function. If the balance isn't greater than when we first called the function, the transaction will revert. This protects us from malicious tokens, unforeseen market conditions, and a variety of other ways you can lose your money.\n\nWhen we do turn a profit, we need to pay some of it to the validators/builders in order to get our transactions on-chain. Block builders have differing preferences & ordering algorithms, but a good rule of thumb is to use `maxBaseFeePerGas` and `maxPriorityFeePerGas` values that are slightly higher than the market average, and then tip a percentage of your profits to the builder. MEV-Share uses this builder tip to pay the user; this is the \"MEV kickback.\"\n\n### Fee Considerations\n\nIf you have no competition, you only need to send as much as is required to pay the user's kickback, which includes the gas cost of the payment transaction and a non-zero kickback.\n\nTo prevent negligible-value tips from being sent, MEV-Share uses 30,000 gas to represent the cost of the user payment transaction, instead of 21,000. The minimum tip payment required for a MEV-Share bundle to be eligible for inclusion is as follows:\n\n- let $F_B$ = `block.baseFee`\n\n$$\nT_{min} = 30000 \\cdot F_B\n$$\n\nThis represents the **total surplus ETH** that the coinbase must have received _in addition to gas fees_ for all transactions in the bundle. Note that we don't include a priority fee for the tip; this is because the builder will send the transaction that pays the user with a priority fee of 0.\n\nBots that only send two-transaction bundles will probably want send this tip in the backrun tx. However, this may also be paid by multiple transactions.\nAlso note: sending your tip via `block.coinbase.transfer` is not technically necessary; it is possible to achieve the same effect by simply increasing the gas price (`maxBaseFeePerGas` and `maxPriorityFeePerGas`) of your backrun transaction(s).\n\n<Admonition type=\"info\" icon=\"👾\" title=\"Competition\">\n\nTipping the minimum is unlikely to result in your bundle landing on-chain unless you have zero competition. If there are other searchers competing to include the same transaction in their bundles, you will have to pay a higher percentage of your profits to outbid them.\n\nYou may try tipping low to start, but over time, you should expect competition to increase. With healthy competition, your tip is likely to be around 80-90%.\n\n- let $P_{net}$ = net profit (profit after paying gas fees)\n- let $\\gamma$ ($\\gamma \\in \\R; \\gamma > 0, \\gamma < 1$) = percentage of profit sufficient to outbid competition\n\n$$\nT_{optimal} = (30000 \\cdot F_B) + (P_{net} \\cdot \\gamma)\n$$\n\nHow you find the exact optimal value of $\\gamma$ is a matter of trial-and-error, and will continually change, but you'll probably find success between 50-90%.\n\n</Admonition>\n\nBy default, 90% of the tip $T$ is sent to the user whose transaction was included by your bundle. This can be changed with the `validity` parameter in the `mev_sendBundle` params, but it suffices for now to keep the default settings and just send less from the smart contract.\n\n### Compile & Deploy (optional)\n\nIf you want to run a capital-intensive strategy (not using flash loans) you'll have to deploy your own contract. This is not required if you use our flash loan contract. The flash loan contract is designed to send profits to the caller when the arbitrage is done. This allows anyone to execute arbitrages without paying to deploy the contract. The tradeoff with this is that it costs more gas to transfer the profit to your wallet than it does to keep the money in the contract. However, if you decide to deploy your own contract, its transactions will use less gas (at the risk of your contract containing a bug that might compromise the funds), but will only land bundles if it holds enough capital to buy the required tokens.\n\nA simple way to deploy contracts is to use [**`forge`** from Foundry](https://github.com/foundry-rs/foundry):\n\n```bash\n# compile contracts\nforge build\n\n# to test with a local fork:\nanvil -f $MAINNET_RPC_URL --chain-id 1 &\n\n# these vars are set to deploy on local fork; change as/if needed\nexport PRIVATE_KEY=\"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\nexport WETH_ADDRESS=\"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\"\nexport RPC_URL=\"http://localhost:8545\"\n\n# deploy flashloan arb contract\nforge create -r $RPC_URL --private-key $PRIVATE_KEY BlindBackrunFlashLoan --constructor-args $WETH_ADDRESS\n\n# or deploy capital-intensive contract\nforge create -r $RPC_URL --private-key $PRIVATE_KEY BlindBackrun --constructor-args $WETH_ADDRESS\n```\n\n_output:_\n\n```\nNo files changed, compilation skipped\nDeployer: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\nDeployed to: 0xc075BC0f734EFE6ceD866324fc2A9DBe1065CBB1\nTransaction hash: 0xe9567cce60dfdc1f815f4724340228f2af77ee5cc157a69d07c4b270fcab3a30\n```\n\n## Tradeoffs\n\nOur onchain searching strategy is relatively straightforward, but it has its drawbacks:\n\n- calculating trade amounts onchain costs gas, making the strategy less efficient\n- only Uniswap-V2-like trading pairs are compatible with this strategy\n    - Uniswap V3 uses a different algorithm, which is very costly to compute onchain\n\n### Offchain Searching\n\nThe more data you can compute offchain, the less gas you have to spend. This gives you more ETH to tip with; better profit margins or a competitive edge.\n\nHowever, off-chain data is not always as accurate as on-chain data. This is because other transactions may affect the state of the blockchain (e.g. the price of a trading pair) if they are placed before your bundle in the block. \nThe very first position in an upcoming block (\"top of the block\") is the only one that's guaranteed to match the state of the last block.\n\nUnless you're the block builder (or have privileged access to their orderflow), you have no way of knowing where in the block your transaction will be placed, so you have no way of knowing whether the off-chain state used to calculate your strategy's parameters (e.g. your trade amounts) is still accurate. You may add logic in your smart contract that reverts if the transaction isn't placed in the first position, which will guarantee that your information is accurate, but may lower your chances of being included, depending on the builder's transaction-sorting algorithm.\n\n### Other Exchanges\n\nWe strictly use Uniswap V2 in this guide/bot because its pricing algorithm is simple, making arbitrages easily calculable. Uniswap V2 and Sushiswap use the same pricing algorithms, so we efficiently arb between those two exchanges. Uniswap V3 math is more complicated, making arbitrages on V3 very inefficient to calculate onchain.\n\nHowever, Uniswap V3+ processes much more trade volume than V2. To improve your profits, consider developing a strategy that integrates Uniswap V3 into your own contract. It will likely involve probabilistic methods. Also note: Uniswap V4 uses the same pricing math as V3.\n\nMEV-Share also shares hints for swaps on Balancer and Curve, from users with the default hint settings.\n\n---\n\nNow that the core contract is ready, let's add flash loans. Read on in the next page.\n"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/tutorials/limit-order/debugging.mdx",
    "content": "---\ntitle: Debugging\n---\n\nIf your bundles aren't landing, there could be a few reasons why. Take a look at our [debugging guide](/flashbots-mev-share/searchers/debugging) for tips on how to simulate and interpret bundle failures."
  },
  {
    "path": "docs/flashbots-mev-share/searchers/tutorials/limit-order/introduction.mdx",
    "content": "---\ntitle: Introduction\n---\n\nMEV-Share is a new protocol for sending and searching on Ethereum transactions. In this guide, we'll write our own bot to see first-hand how MEV-Share works, and how to find profitable opportunities.\n\nThis guide assumes you have some programming experience, but we've tried to make it as beginner-friendly as possible! No prior searching experience will be required.\n\nWe'll provide full examples with code so you can follow along and run the bot yourself!\n\n## Limit Orders\n\nIn this guide, we'll be making a version of a [limit order](https://www.investor.gov/introduction-investing/investing-basics/how-stock-markets-work/types-orders#:~:text=A%20limit%20order%20is%20an,for%20no%20more%20than%20%2410.) bot. Limit orders are a common feature on exchanges which let you fill an order when the price of a trading pair (e.g. ETH/DAI) reaches a target that you specify. For example, if I wanted to buy DAI when the price reaches 1800 DAI/ETH, I could place a limit order for to buy 1800 DAI for 1 ETH, and the trade would automatically execute when the price reached 1800. If the price was over 1800, then we'd want to fill our order at the higher price — since we're buying DAI, we want more DAI out for a fixed amount of ETH in.\n\nLimit orders are useful if you are sensitive to price but not time. For example, I might have a lot of ETH and I want to make sure I get a good price for it. But it's okay if it takes week to complete the trades.\n\nThe bot we're building works like a traditional limit order — we'll buy when the price reaches our target. But in this case, we'll have an additional edge: private orderflow (and some clever code).\n\n## MEV-Share Bot\n\nWe'll use the MEV-Share event stream to watch for pending transactions (private orderflow) that change the price of our trading pair. Then we'll backrun each of those transactions with our ideal trade. When a transaction sufficiently shifts the price in our favor, our backrun will be first in line to buy the tokens at a discounted rate.\n\nOur backrun transaction will specify an exact price at which the order can be filled, otherwise the transaction reverts. Because we're sending to Flashbots, reverted transactions won't land on chain and we won't pay any fees for failed attempts.\n\nIn short, we'll attempt to backrun all trades for the assets we care about — but only land the backruns that execute at a desirable price.\n\n> This guide is based on the [simple-limit-order-bot repo](https://github.com/flashbots/simple-limit-order-bot). If you want to get straight to the code, the repo contains a fully-operational bot that only requires a `.env` file for you to run.\n\n## Glossary\n\n*Remember the following terminology (because we use it a lot!):*\n\n- **MEV**: [Maximal Extractable Value](https://ethereum.org/en/developers/docs/mev/).\n- **bundle**: an array of transactions that execute in order and [atomically](https://en.wikipedia.org/wiki/Atomicity_(database_systems)).\n- **backrun**: a transaction sent immediately after another transaction.\n    - example: a “backrun bundle” is an array with two or more transactions; the first transaction (presumably chosen from a public pool of pending transactions) creates an MEV opportunity, which the following transactions try to capture.\n- **orderflow**: umbrella term for transactions or bundles.\n- **searcher**: a bot operator (or bot) that attempts to extract MEV.\n- **on-chain**: a transaction that lands “on chain” (or on-chain, or onchain) is permanently included on the blockchain.\n- **WETH**: “Wrapped ETH” — ERC-20 version of ETH, used by Uniswap in trading pairs\n- **MEV-Share**: “a protocol that lets users selectively share orderflow and information with searchers”.\n\n:::info Running this bot requires that you have an Ethereum account with some ETH and WETH.\n\nOur example uses 1/10000000000 of an ETH — you may want more. If you don't have any WETH, you can wrap ETH into WETH on Uniswap:\n\n![Example weth swap](/img/weth-swap.png)\n\n::: info"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/tutorials/limit-order/more-resources.mdx",
    "content": "---\ntitle: More Resources\n---\n\nWe hope you found this guide useful! This is only the first of several, in which we'll show you more exciting ways to use MEV-Share, and all its unique features. In future guides, we'll talk about how to write more advanced bots that extract MEV opportunities, how to maximize your profits by using hints, and cover advanced features and techniques that are made possible by MEV-Share.\n\nWhile we work on more guides, we encourage you to check out our other resources on MEV-Share, and get in touch with us on Discord, on our Forum, or @ one of us on Twitter!\n\n- [Discord](https://discord.gg/flashbots)\n- [Forum](https://collective.flashbots.net/)\n- Twitter handles for MEV-Share: [@SheaKetsdever](https://twitter.com/SheaKetsdever) [@epheph](https://twitter.com/epheph) [@drog_v](https://twitter.com/drog_v) [@zeroXbrock](https://twitter.com/zeroxbrock)\n\n**Specifications**\n\n- [MEV-Share Spec](https://github.com/flashbots/mev-share)\n\n**Code Examples**\n\n- https://github.com/flashbots/simple-limit-order-bot (Typescript)\n- https://github.com/flashbots/simple-blind-arbitrage (Javascript) ([Video walk through](https://www.youtube.com/watch?v=Twcr2vZ1tRU))\n- https://github.com/paradigmxyz/artemis (Rust)\n\n**MEV-Share Client Libraries**\n\n- https://github.com/flashbots/matchmaker-ts (Typescript)\n- https://github.com/paradigmxyz/mev-share-rs (Rust)\n\n**MEV-Share Backend Node**\n\n- https://github.com/flashbots/mev-share-node"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/tutorials/limit-order/sending-bundles.mdx",
    "content": "---\ntitle: Sending Bundles\n---\n\n## Getting our trade ready\n\nAfter we find a transaction that touches the trading pair we're targeting, we need to calculate how many tokens we should expect to receive. In this project, we are specifically *buying* DAI with ETH (technically WETH, because Uniswap only trades ERC-20 tokens), so we want the price of DAI/WETH to be as low as possible. In code, we define our price requirements in terms of the *amount of tokens we receive* from the trade — so we want the *highest* amount of tokens possible, but we have a definite minimum (1800 DAI).\n\nIn terms of a limit order, we're saying that we want our order to be filled when the price is *at most* 1800 DAI, but if the price is lower, then we want to fill at the lower price, which yields more DAI per WETH.\n\nTo find our token's market price, we simulate our trade by calling the `swapExactTokensForTokens` function with a static call. A static call simply simulates the transaction, so we can see what it would do if we were to actually send it. We set our buy/sell amounts that we defined earlier to see how much we'd get from the swap. Add this function to your code — we'll add it to our main function later.\n\n`src/index.ts`\n\n```tsx\nasync function getBuyTokenAmountWithExtra() {\n  const resultCallResult = await uniswapRouterContract\n\t\t.swapExactTokensForTokens\n\t\t.staticCallResult(\n\t\t\tSELL_TOKEN_AMOUNT,\n\t\t\t1n,\n\t\t\t[SELL_TOKEN_ADDRESS, BUY_TOKEN_ADDRESS],\n\t\t\texecutorWallet.address,\n\t\t\t9999999999n\n\t\t)\n  const normalOutputAmount = resultCallResult[0][1]\n  const extraOutputAmount = normalOutputAmount * (10000n + DISCOUNT_IN_BPS) / 10000n\n  return extraOutputAmount\n}\n```\n\nThe minimum amount we can expect to receive from a swap is defined by `normalOutputAmount`. Then, we calculate how much we'd get if with a 40 basis-points discount, which we should expect if we successfully backrun a transaction that shifts the price in our favor, and assign this value to `extraOutputAmount`.\n\nWhen we detect a new transaction, we'll need to check the going price and set up our trade accordingly. If the price is lower than our target, and because we're trying to *buy* tokens, we want to make sure our trade expects more tokens out; as many as we can get at the lower price with our fixed sell amount (the ETH we'll spend to buy the tokens). If the price is higher than our target, then we'll just set the expected output to the minimum amount we'd expect to if the price were at our target, in hopes that the transaction we backrun will move the price enough for us to make a trade.\n\nLet's add a couple more functions to implement this logic:\n\n`src/index.ts`\n\n```tsx\nasync function getSignedBackrunTx( outputAmount: bigint, nonce: number ) {\n    const backrunTx = await uniswapRouterContract.swapExactTokensForTokens.populateTransaction(SELL_TOKEN_AMOUNT, outputAmount, [SELL_TOKEN_ADDRESS, BUY_TOKEN_ADDRESS], executorWallet.address, 9999999999n)\n    const backrunTxFull = {\n        ...backrunTx,\n        chainId: 1,\n        maxFeePerGas: MAX_GAS_PRICE * GWEI,\n        maxPriorityFeePerGas: MAX_PRIORITY_FEE * GWEI,\n        gasLimit: TX_GAS_LIMIT,\n        nonce: nonce\n    }\n    return executorWallet.signTransaction(backrunTxFull)\n}\n\nasync function backrunAttempt( currentBlockNumber: number, nonce: number, pendingTxHash: string ) {\n    let outputAmount = await getBuyTokenAmountWithExtra()\n    if (outputAmount < BUY_TOKEN_AMOUNT_CUTOFF) {\n        console.log(`Even with extra amount, not enough BUY token: ${ outputAmount.toString() }. Setting to amount cut-off`)\n        outputAmount = BUY_TOKEN_AMOUNT_CUTOFF\n    }\n    const backrunSignedTx = await getSignedBackrunTx(outputAmount, nonce)\n    try {\n        const sendBundleResult = await mevshare.sendBundle({\n            inclusion: { block: currentBlockNumber + 1 },\n            body: [\n                { hash: pendingTxHash },\n                { tx: backrunSignedTx, canRevert: false }\n            ]\n        },)\n        console.log('Bundle Hash: ' + sendBundleResult.bundleHash)\n    } catch (e) {\n        console.log('err', e)\n    }\n}\n```\n\nThe `getSignedBackrunTx` function creates the transaction we'll send to execute our trade on Uniswap. We set a fixed gas price here for simplicity. If you prefer, you could replace it with dynamic fees that track the base fee of the chain. But constant gas prices may work better if you don't want to spend a lot on gas, and don't mind having to wait if the network's base fee exceeds your settings.\n\nThe `backrunAttempt` function defines our price requirement logic: we make sure that `outputAmount` is at least our previously-defined cutoff amount. However, if the simulated output amount is higher, then we set `outputAmount` to expect that much, which protects us from [slippage](https://en.wikipedia.org/wiki/Slippage_(finance)) in case other transactions in the block happen to trade on the same pair. This function then sends our bundle to MEV-Share. If the bundle was received successfully, we should see a bundle hash logged to our console.\n\nUsing `getBuyTokenAmountWithExtra`, we define `outputAmount`, the amount we expect to receive from the trade. We create our backrun transaction `backrunSignedTx` and send it to MEV-Share in a bundle by calling `mevshare.sendBundle`.\n\n*Real quick, let's break down the bundle we passed to `sendBundle`:*\n\nThe `block` parameter in `inclusion` specifies which block we want the bundle to land in. We indicate here that we want our bundle to land in the next block.\n\nThe `body` parameter is where we set our bundle's transactions. The order in which they're specified is the order in which they'll execute on chain. Each transaction is specified as an object, with either a `hash` parameter, or a `tx` parameter (paired with `canRevert` to specify whether this transaction is allowed to revert and land on chain). The transaction we specify with `hash` is the pending transaction from the event stream that we want to backrun. We have to use its hash because the MEV-Share event stream does not reveal the entire signed transaction. Naturally, the following transaction, specified by `tx`, is our trade.\n\nOnce we stitch all these new functions into our main loop, our bot will be done!\n\n## Sending a backrun bundle\n\nWhen we detect a new pending transaction in the `mevshare.on(\"transaction\")` callback that affects the price of our target pair, we need to send a bundle using the `backrunAttempt` function. This bundle checks our target price and sets up our trade to get us the best price possible.\n\n`src/index.ts`\n\n```tsx\nmevshare.on(\"transaction\", (pendingTx) => {\n  // ...\n  // TODO: backrun the user tx\n  if (!transactionIsRelatedToPair(pendingTx, PAIR_ADDRESS)) {\n    console.log('skipping tx: ' + pendingTx.hash)\n    return\n  }\n  console.log(`It's a match: ${ pendingTx.hash }`)\n  const currentBlockNumber = await provider.getBlockNumber()\n  backrunAttempt(currentBlockNumber, nonce, pendingTx.hash)\n})\n```\n\nWe'll also want to set up a callback that watches for new blocks and retries previous backrun attempts. Our bundles only target one block, but Protect transactions (which make up the transactions in the event stream) are valid for 25 blocks from when they're received. This means that if our backrun wasn't successful before, we can try again up to 24 more times.\n\nAdd this code to your `main` function:\n\n```tsx\nlet recentPendingTxHashes: Array<{ txHash: string, blockNumber: number }> = []\nprovider.on('block', ( blockNumber ) => {\n  for (const recentPendingTxHash of recentPendingTxHashes) {\n    console.log(recentPendingTxHash)\n    backrunAttempt(blockNumber, nonce, recentPendingTxHash.txHash)\n  }\n  // Cleanup old pendingTxHashes\n  recentPendingTxHashes = recentPendingTxHashes.filter(( recentPendingTxHash ) =>\n      blockNumber > recentPendingTxHash.blockNumber + BLOCKS_TO_TRY)\n})\n```\n\nAnd in your `mevshare.on` callback, add this piece at the end:\n\n```tsx\nrecentPendingTxHashes.push({ txHash: pendingTx.hash, blockNumber: currentBlockNumber })\n```\n\nWhen you're done, your main function should look like this:\n\n`src/index.ts`\n\n```tsx\nasync function main() {\n    console.log('mev-share auth address: ' + authSigner.address)\n    console.log('executor address: ' + executorWallet.address)\n    const PAIR_ADDRESS = (await uniswapFactoryContract.getPair(SELL_TOKEN_ADDRESS, BUY_TOKEN_ADDRESS)).toLowerCase()\n\t\tawait approveTokenToRouter(SELL_TOKEN_ADDRESS, UNISWAP_V2_ADDRESS)\n    const nonce = await executorWallet.getNonce('latest')\n    let recentPendingTxHashes: Array<{ txHash: string, blockNumber: number }> = []\n\n    mevshare.on('transaction', async ( pendingTx: IPendingTransaction ) => {\n        if (!transactionIsRelatedToPair(pendingTx, PAIR_ADDRESS)) {\n            console.log('skipping tx: ' + pendingTx.hash)\n            return\n        }\n        console.log(`It's a match: ${ pendingTx.hash }`)\n        const currentBlockNumber = await provider.getBlockNumber()\n        backrunAttempt(currentBlockNumber, nonce, pendingTx.hash)\n        recentPendingTxHashes.push({ txHash: pendingTx.hash, blockNumber: currentBlockNumber })\n    })\n    provider.on('block', ( blockNumber ) => {\n        for (const recentPendingTxHash of recentPendingTxHashes) {\n            console.log(recentPendingTxHash)\n            backrunAttempt(blockNumber, nonce, recentPendingTxHash.txHash)\n        }\n        // Cleanup old pendingTxHashes\n        recentPendingTxHashes = recentPendingTxHashes.filter(( recentPendingTxHash ) =>\n            blockNumber > recentPendingTxHash.blockNumber + BLOCKS_TO_TRY)\n    })\n}\n```\n\n> For a full, working code example, check out https://github.com/flashbots/simple-limit-order-bot\n\n![Mario finish](/img/mario-finish.jpg)\n\n*That's all you need!* This code will listen for new transactions and blocks, and trigger our code to send bundles when we find a transaction that changes the price.\n\nRun the code and you should see something like this:\n\n```bash\n$ npx ts-node src/index.ts\nmev-share auth address: 0xE52A621a647A1013cE44EEBB37676F4c7205F87e\nexecutor address: 0x5b2c1E34C3Be923c123Ec858F474645B1Fcee0A3\nskipping tx: 0x8ec57508495115338395a0de7cb9b85956845c83047bc523fc5b169fc9820251\nskipping tx: 0xbe8be3ddfe27c03d79d44bf5f46a40e3491960c85fc29ceb9b9d7b968e3c7760\nskipping tx: 0xd8bdceffde345bf71fb8058c0baae04eee58c25739dd31d3354c9777162be769\nskipping tx: 0xfdc9ed3cd98e15d9e2b6bcea832f7f178d23f7c20d7900de5cf23af9051337c3\nskipping tx: 0x4878de9bf339cffd8facb5037698839f97e8624806dec97f39d71254101ed712\nskipping tx: 0x0b1964af41ddf4d4082f6d68073f200b1d72ffc9852441aa7621feba34c4e045\nskipping tx: 0x23494341ec01dd3797778958e02cf9a8dbb8bb91989150b162cc7c16fe177267\nskipping tx: 0xb201acbfe4c140a14cdd90b84d3a2c277d14bbb53e9bbacc095282c7b5e93c93\nskipping tx: 0x8777978ea1c14af518d32ce74c8671905619ee8b6008c4c6f9a94e83fa2dda15\nskipping tx: 0x6f25db574493009c6a9a22f3c15370038f80b8c86f3547f72811c0c58dfc6160\nskipping tx: 0xb98f1e587f9a292043738f5c70e6532a6cd94a2f530a060556ce99256ca52e05\nskipping tx: 0x0c347e08df1fee8bb0f4fafe606b1a1b8159804623bbcd78c03097dc316ca47a\nskipping tx: 0x2081950a40ca29cbc46c043f846a1e3205f3baaa09a8e531a20ff63c649617ed\nskipping tx: 0x8ccc554df02cf2c8880bde8ea4b7dcfecc533ec4c799e2a14a55282937934abf\nskipping tx: 0x7258bf29fb9879f10ee859ae80f491a7a652caf0825a1b2196cb2b39747e9a77\nskipping tx: 0x8d49b3d723457845484c16b1d637265821a63c601dc0184417c2a20789ec2881\nskipping tx: 0xfacd7b58b52184724fc1d8ad688544d0f45fb005110f49b790d320997e5ba79e\nskipping tx: 0x176d69b0353ea5cb421f7218f94ec54191bdca3cc1d659587546235d73ae8837\nskipping tx: 0x518f3b9844a92d617146520b61face546aa399358f40136827fc24db8827b9ea\nskipping tx: 0x58da384fd342fdc8d8ba96faf3e12bc89417c7099888eaedfd77a00bcf10f701\nskipping tx: 0x1431112c598a1a7969f048d6893b3ad72424fcc7a1de0b880ffc98585fcd2e7d\nskipping tx: 0x55bb0a2209665e464a385b188d0dcc1d91c93bae1509368cdc5abf9cb38afdfe\nskipping tx: 0x0978078667fd1bd834c5b8ca20e06b403e0df6311455de6dc6651c33542a594d\nskipping tx: 0xed23e27981fba7b4e661c10c9d4e70ada3eafb9cd4197a24f4566c1c5266e601\nskipping tx: 0x3734c599be31a485a84376cf108fd76d5edc9637f834a9982a1600f0abd533d0\nskipping tx: 0xc932320f77f8436037ab27ead89c004acc8f8bc52e0c19dcb6ecea103bc2973a\nskipping tx: 0xe880ce068eba29657bf14c535f421adefc43933fe84ef157cf4cdf7524edd22e\nskipping tx: 0x350aaae85d6167e219480fb60104d27a773675ff387c2634da44f1b36bbeba6b\nskipping tx: 0xfddcfb509e19be4500e4a1a03c97d77b2261fe41d8f019d48e0c0cea11cd1cc8\nskipping tx: 0x08867976aecc2b09c57cf17d2e16dda9e3c3026da9c2ca3fed3187c7b577fa91\n```\n\nAnd after some time…\n\n```bash\nskipping tx: 0x82b46667867fd7e1684f14dd34503ee9b9bbe106352c00006592ceae8e58a9d7\nskipping tx: 0x51c79454c4e86df176b51524fc254ab2e04c0861c329cdeab7a90d2e3309c3b7\nskipping tx: 0xf0977236782c93462ea442514a28be64f11cd5feee647929b74834adff0b527a\nskipping tx: 0x8d5273f1eefa3a6daa40355df621e488dcf434e7bffb6201e0d98c26709ea35b\nskipping tx: 0x382ba4c5d62557277f494032b2578ba52435cccef7fd236f02278df337fa0f7b\nskipping tx: 0x04b40010c4a986f19fdedde1c2b0b92bf146074fae98693dc53a10d32a15bbba\nskipping tx: 0x7c89acc455e040f8690933af2fa40cac714f5f2790758972a35d4ea39ced32c9\nskipping tx: 0xfcb49a980017cc3e0e5d5d4a0ff40aa170dc2e32021f81319c8d2b117b12bf52\nskipping tx: 0x1861b5afc21a2e82dbdb8bc26777ced087c6a4830482b2f65273ba7159c204c8\nskipping tx: 0x0817d834d6a537b6839858465f5e7ce2f95c9c5e353cf85282cd0f1da5b90e50\nskipping tx: 0x387dd96be2b59da5f6e991b41d670f752fecd4d6571198729f1037996a4e2d3c\nskipping tx: 0x6b8577d861ce46f1e780c7ce59925ac9be40fd5428954c15a7e115cacaf974e2\nskipping tx: 0xc41d53c886897aeda1fc401f337a2d8b3ef737e78f06a52cbbe29b501a1c7736\nskipping tx: 0x52f2f383b4af41aa47f09ed8fd237358b32f33a0f471fc7be40b83179e513458\nskipping tx: 0xbcc799ad42925730cbb724c0fe5ed7b8444e7fbc8a4219d7346a2a03e8ac5131\nIt's a match: 0xf76ce750b75ccd34b9174fdf8b574d129630d51422f3ca84f4f308952a4ea3b4\n```\n\nIt may take a while to find a match — remember, the code scans for a trade on the ETH/DAI pair on Uniswap V2. There are lots of other events to consider for future improvements to this bot!\n\nYou may also consider removing the code that checks the event to see if it matches our pair address. It's possible that the price could move to our target level without us seeing an event to backrun. If we simply backrun every transaction we see, then we can potentially benefit from opportunities that we can't yet see. However, it is essential to understand how to use logs on MEV-Share, as they provide critical data that can be used for a multitude of other purposes, so we've introduced it here as a practical example.\n"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/tutorials/limit-order/setup.mdx",
    "content": "---\ntitle: Set Up\n---\n\nWe'll be writing this bot in Typescript. Client libraries and examples for other languages will be available soon.\n\n## Starting a new bot project\n\nFirst, some boilerplate project setup. Run these commands to set up a new typescript project.\n\n```bash\nmkdir simple-limit-order-bot && cd simple-limit-order-bot\nyarn init\n# install typescript & eslint dev dependencies\nyarn add -D @types/node @typescript-eslint/eslint-plugin @typescript-eslint/parser dotenv eslint eslint-plugin-tsdoc ts-node typescript\n# install ethers & mev-share client\nyarn add ethers @flashbots/mev-share-client\n```\n\nNow in your editor, make a `src` directory and add a new file called `index.ts`\n\nThen, import the required dependencies.\n\n`src/index.ts`\n\n```tsx\nimport MevShareClient, {IPendingTransaction} from '@flashbots/mev-share-client'\nimport { Contract, JsonRpcProvider, Wallet } from 'ethers'\n```\n\nWe'll use the mev-share-client library to listen for new pending transactions, and we'll use ethers to create and sign our own transactions, and query the blockchain.\n\nLastly, we'll create a file called `.env` in the project root directory to store our private variables, such as private keys and RPC endpoints.\n\n`.env`\n\n```\nRPC_URL=\nEXECUTOR_KEY=\nFB_REPUTATION_KEY=\n```\n\nFill this in with your own values.\n\n- `RPC_URL` is the Ethereum RPC endpoint we'll use to query smart contract values and account balances. [Alchemy](https://www.alchemy.com/), [Quicknode](https://www.quicknode.com/), and [Infura](https://www.infura.io/) are popular options for free RPC endpoints.\n- `EXECUTOR_KEY` is the private key that will send transactions; it should have at least 0.05 ETH in it to pay for our trade (or more, if you want to make a larger trade than our example).\n- `FB_REPUTATION_KEY` is the private key used to sign the payload sent to Flashbots, and is used for tracking searcher reputation. If you earn a high reputation, you may be placed in a high-priority queue, which is prioritized during periods of high traffic. This account *should not* have any ETH in it.\n\nYour project should now look like this:\n\n![Project setup](/img/limit-order-project-setup.png)\n\n:::info *Use [cast](https://github.com/foundry-rs/foundry#readme) to generate private keys for cool addresses like this:*\n\n```bash\ncast wallet vanity --starts-with babe\n```\n\n```\nStarting to generate vanity address...\nSuccessfully found vanity address in 0 seconds.\nAddress: 0xbabe32A9112Dc37a0A9274c86CAD0D1676fEA55a\nPrivate Key: 😉\n```\n\n::: info\n\nNext we'll read in the variables from our .env file with `dotenv`.\n\nAdd the following code to your project:\n\n`src/index.ts`\n\n```tsx\nimport dotenv from \"dotenv\"\ndotenv.config()\n\nconst RPC_URL = process.env.RPC_URL || 'http://127.0.0.1:8545'\nconst EXECUTOR_KEY = process.env.EXECUTOR_KEY || Wallet.createRandom().privateKey\nconst FB_REPUTATION_PRIVATE_KEY = process.env.FB_REPUTATION_KEY || Wallet.createRandom().privateKey\n```\n\n> Notice we set default values with the **||** operator. You can omit these if you prefer the variables to remain undefined when they're not set in the .env file.\n> \n\n## Connecting to smart contracts to get prices and make trades\n\nTo get the price of our trading pair and make trades, we'll need to interact with a few smart contracts: the Uniswap V2 Router, the ERC20 token contracts, and the factory contract. \n\n- **Uniswap V2 Router contract**: smart contract to trade tokens on Uniswap V2. We also use it to get the market price of the trading pair, by simulating a small trade.\n- **factory contract**: this is where Uniswap trading pairs are created. We use it to find the pair address for the tokens we want to trade (e.g. WETH/DAI).\n- **ERC20 token contract**: the tokens themselves; in our example, we use the WETH contract to call `approve`, so that the router can transfer our WETH tokens for us.\n\nTo do this in our code, we'll create contract instances using ethers. We instantiate contracts with the ABI and contract address of each contract we want to use. The ABI specifies the functions that can be called on the contract.\n\nFor convenience, we've gathered the ABIs required to create ethers contracts for Uniswap V2. Copy these into a new file `src/abi.ts`.\n\n`src/abi.ts`\n\n```tsx\nexport const UNISWAP_V2_ABI = [{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_factory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_WETH\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenA\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenB\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amountADesired\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountBDesired\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountAMin\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountBMin\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"addLiquidity\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountA\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountB\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"liquidity\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amountTokenDesired\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountTokenMin\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountETHMin\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"addLiquidityETH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountToken\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountETH\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"liquidity\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reserveIn\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reserveOut\",\"type\":\"uint256\"}],\"name\":\"getAmountIn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reserveIn\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reserveOut\",\"type\":\"uint256\"}],\"name\":\"getAmountOut\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"path\",\"type\":\"address[]\"}],\"name\":\"getAmountsIn\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"path\",\"type\":\"address[]\"}],\"name\":\"getAmountsOut\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountA\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reserveA\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reserveB\",\"type\":\"uint256\"}],\"name\":\"quote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountB\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenA\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenB\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"liquidity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountAMin\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountBMin\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"removeLiquidity\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountA\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountB\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"liquidity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountTokenMin\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountETHMin\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"removeLiquidityETH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountToken\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountETH\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"liquidity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountTokenMin\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountETHMin\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"removeLiquidityETHSupportingFeeOnTransferTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountETH\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"liquidity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountTokenMin\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountETHMin\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approveMax\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"removeLiquidityETHWithPermit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountToken\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountETH\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"liquidity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountTokenMin\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountETHMin\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approveMax\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountETH\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenA\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenB\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"liquidity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountAMin\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountBMin\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approveMax\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"removeLiquidityWithPermit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountA\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountB\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"path\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"swapETHForExactTokens\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountOutMin\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"path\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"swapExactETHForTokens\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountOutMin\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"path\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"swapExactETHForTokensSupportingFeeOnTransferTokens\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountOutMin\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"path\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"swapExactTokensForETH\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountOutMin\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"path\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"swapExactTokensForETHSupportingFeeOnTransferTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountOutMin\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"path\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"swapExactTokensForTokens\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountOutMin\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"path\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"swapExactTokensForTokensSupportingFeeOnTransferTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountInMax\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"path\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"swapTokensForExactETH\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountInMax\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"path\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"swapTokensForExactTokens\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]\nexport const UNISWAP_FACTORY_ABI = [{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeToSetter\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token0\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token1\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pair\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"PairCreated\",\"type\":\"event\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"allPairs\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"allPairsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenA\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenB\",\"type\":\"address\"}],\"name\":\"createPair\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"pair\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"feeTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"feeToSetter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"getPair\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeTo\",\"type\":\"address\"}],\"name\":\"setFeeTo\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeToSetter\",\"type\":\"address\"}],\"name\":\"setFeeToSetter\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]\nexport const ERC20_ABI = [{ \"constant\": true, \"inputs\": [], \"name\": \"name\", \"outputs\": [{ \"name\": \"\", \"type\": \"string\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": false, \"inputs\": [{ \"name\": \"_spender\", \"type\": \"address\" }, { \"name\": \"_value\", \"type\": \"uint256\" }], \"name\": \"approve\", \"outputs\": [{ \"name\": \"\", \"type\": \"bool\" }], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [], \"name\": \"totalSupply\", \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": false, \"inputs\": [{ \"name\": \"_from\", \"type\": \"address\" }, { \"name\": \"_to\", \"type\": \"address\" }, { \"name\": \"_value\", \"type\": \"uint256\" }], \"name\": \"transferFrom\", \"outputs\": [{ \"name\": \"\", \"type\": \"bool\" }], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [], \"name\": \"decimals\", \"outputs\": [{ \"name\": \"\", \"type\": \"uint8\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [{ \"name\": \"_owner\", \"type\": \"address\" }], \"name\": \"balanceOf\", \"outputs\": [{ \"name\": \"balance\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [], \"name\": \"symbol\", \"outputs\": [{ \"name\": \"\", \"type\": \"string\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": false, \"inputs\": [{ \"name\": \"_to\", \"type\": \"address\" }, { \"name\": \"_value\", \"type\": \"uint256\" }], \"name\": \"transfer\", \"outputs\": [{ \"name\": \"\", \"type\": \"bool\" }], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [{ \"name\": \"_owner\", \"type\": \"address\" }, { \"name\": \"_spender\", \"type\": \"address\" }], \"name\": \"allowance\", \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"payable\": true, \"stateMutability\": \"payable\", \"type\": \"fallback\" }, { \"anonymous\": false, \"inputs\": [{ \"indexed\": true, \"name\": \"owner\", \"type\": \"address\" }, { \"indexed\": true, \"name\": \"spender\", \"type\": \"address\" }, { \"indexed\": false, \"name\": \"value\", \"type\": \"uint256\" }], \"name\": \"Approval\", \"type\": \"event\" }, { \"anonymous\": false, \"inputs\": [{ \"indexed\": true, \"name\": \"from\", \"type\": \"address\" }, { \"indexed\": true, \"name\": \"to\", \"type\": \"address\" }, { \"indexed\": false, \"name\": \"value\", \"type\": \"uint256\" }], \"name\": \"Transfer\", \"type\": \"event\" }]\n```\n\nWe need to add this import in `src/index.ts`, and then write just a little more boilerplate code. It should look like this all together:\n\n```tsx\nimport MevShareClient, {IPendingTransaction} from '@flashbots/mev-share-client'\nimport { Contract, JsonRpcProvider, Wallet } from 'ethers'\nimport { UNISWAP_V2_ABI, UNISWAP_FACTORY_ABI, ERC20_ABI } from './abi' // <-- new import\nimport dotenv from \"dotenv\"\ndotenv.config()\n\nconst RPC_URL = process.env.RPC_URL || 'http://127.0.0.1:8545'\nconst EXECUTOR_KEY = process.env.EXECUTOR_KEY || Wallet.createRandom().privateKey\nconst FB_REPUTATION_PRIVATE_KEY = process.env.FB_REPUTATION_KEY || Wallet.createRandom().privateKey\n\n// create web3 provider & wallets, connect to mev-share\nconst provider = new JsonRpcProvider(RPC_URL)\nconst executorWallet = new Wallet(EXECUTOR_KEY, provider)\nconst authSigner = new Wallet(FB_REPUTATION_PRIVATE_KEY, provider)\nconst mevshare = MevShareClient.useEthereumGoerli(authSigner)\n// if you want to connect to mainnet instead:\n// const mevshare = MevShareClient.useEthereumMainnet(authSigner)\n\n// create contract instances\nconst UNISWAP_V2_ADDRESS = '0x7a250d5630b4cf539739df2c5dacb4c659f2488d'\nconst UNISWAP_FACTORY_ADDRESS = '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f'\nconst uniswapRouterContract = new Contract(UNISWAP_V2_ADDRESS, UNISWAP_V2_ABI, executorWallet)\nconst uniswapFactoryContract = new Contract(UNISWAP_FACTORY_ADDRESS, UNISWAP_FACTORY_ABI, provider)\n\n/* While we're here, let's also set some useful constants we'll use later */\n// discount we expect from the backrun trade (basis points):\nconst DISCOUNT_IN_BPS = 40n\n// try sending a backrun bundle for this many blocks:\nconst BLOCKS_TO_TRY = 24\n// WETH:\nconst SELL_TOKEN_ADDRESS = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'\nconst SELL_TOKEN_AMOUNT = 100000000n\n// DAI:\nconst BUY_TOKEN_ADDRESS = '0x6b175474e89094c44da98b954eedeac495271d0f'\nconst BUY_TOKEN_AMOUNT_CUTOFF = SELL_TOKEN_AMOUNT * 1800n\n\nconst TX_GAS_LIMIT = 400000\nconst MAX_GAS_PRICE = 20n\nconst MAX_PRIORITY_FEE = 5n\nconst GWEI = 10n ** 9n\n```\n\n`uniswapRouterContract`is the contract we use to execute trades.\n\n`uniswapFactoryContract` is used to find the contract address of the token pair we trade on (e.g. [WETH/DAI](https://etherscan.io/address/0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11)).\n\n`SELL_TOKEN_ADDRESS` is the token we want to sell (in this case, WETH). The token we're buying in this example is [DAI](https://etherscan.io/address/0x6b175474e89094c44da98b954eedeac495271d0f). Choose whichever tokens you want to trade if you're following along — you can check to see if your tokens have a pair by calling the `getPair` function with your token addresses on the Uniswap [factory contract](https://etherscan.io/address/0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f#readContract).\n\n`SELL_TOKEN_AMOUNT` specifies 0.1 gwei of WETH to spend, and in `BUY_TOKEN_AMOUNT_CUTOFF` we specify that we want to buy when the token price is **1800** DAI/WETH.\n\n*We set our gas fees (see `MAX_GAS_PRICE` and `MAX_PRIORITY_FEE`) to constant values for the example. If you don't mind possibly paying more gas, we recommend setting your gas parameters so that they follow the base fee. Ethers has a function for this called [getFeeData](https://docs.ethers.org/v5/single-page/#/v5/api/providers/provider/-%23-Provider-getFeeData).*"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/tutorials/limit-order/using-events.mdx",
    "content": "---\ntitle: Using Events\n---\n\n## Finding pending transactions with MEV-Share Event Stream\n\nNow that we have all the setup done, we need to find some transactions to backrun. Remember, we're looking for transactions that affect the price of our trading pair (WETH/DAI), so that we can take advantage of the price impact created by the transaction to get a better price for our trade. By placing the two transactions in a bundle (the transaction we found on the event stream, and our backrun trade), we ensure that our trade only executes if it gets placed immediately behind the transaction that causes the price impact that benefits us.\n\nWe'll start by listening to the MEV-Share event stream. The event stream shares data about pending transactions (and bundles). We can use this information to deduce whether a transaction affects the price of our trading pair.\n\nIn our project, we add a main function at the bottom, and in it, use the mev-share client's `.on` function to execute our own code when we receive new pending transaction events. To start, let's just look at the event stream by printing each event to the console.\n\n`src/index.ts`\n\n```tsx\n// ... previous code still up here ^\n\nasync function main() {\n    console.log(\"mev-share auth address: \" + authSigner.address)\n    console.log(\"executor address: \" + executorWallet.address)\n\n    // bot only executes one trade, so get the nonce now\n    const nonce = await executorWallet.getNonce(\"latest\")\n\n    mevshare.on('transaction', async ( pendingTx: IPendingTransaction ) => {\n\t\t\t\t// callback to handle pending transaction\n        console.log(pendingTx)\n    })\n}\nmain()\n```\n\nTry running this:\n\n```bash\nnpx ts-node src/index.ts\n```\n\nYou should see events popping up in the console. Something like this:\n\n```tsx\nPendingTransaction {\n  hash: '0x26aba6f3c5083d58915161efb0cd0f713418cdd7a95425cdde451efd1dfb5dff',\n  logs: [\n    {\n      address: '0x8255ffbb54bbb825cc544b67ccf36526e6101f5e',\n      topics: [Array],\n      data: 'Ox'\n    },\n    {\n      address: '0x8255ffbb54bbb825cc544b67ccf36526e6101f5e'\n      topics: [Array],\n      data: 'Ox'\n    }\n  ],\n  to: null,\n  functionSelector: null,\n  callData: null,\n  gasUsed: undefined,\n  mevGasPrice: undefined\n}\nPendingTransaction {\n  hash: '0xeb0d75030e0c7253b60a17a58eb2a2e66a6e3ca58343cadece70a528dfd378a1',\n  logs: [\n    {\n      address: 'Oxdac17f958d2ee523a2206206994597c13d831ec7',\n      topics: [Array],\n      data: '0x0000000000000000000000000000000000000000000000000000000253f52170'\n    },\n    {\n      address: 'Oxdac17f958d2ee523a2206206994597c13d831ec7',\n      topics: [Array],\n      data: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n    },\n    {\n      address: 'Oxdac17f958d2ee523a2206206994597c13d831ec7',\n      topics: [Array],\n      data: '0x0000000000000000000000000000000000000000000000000000000253f52170'\n    },\n    {\n      address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n      topics: [Array],\n      data: '0x00000000000000000000000000000000000000000000021e08ad287c5f8d3bff'\n    }\n  ]\n}\n```\n\n> Traffic is often low on goerli, so you may want to try connecting to mainnet with `MevShareClient.useEthereumMainnet(authSigner)` to see more events.\n\nThe logs filling up your console are all transactions which we can backrun. You'll notice that some share more data than others. We'll cover how to include these transactions in our bundles soon, but first we need to go a little deeper to understand these events, and how we might use them to our advantage.\n\n## Finding backrun opportunities using event data\n\nTransactions on MEV-Share can share a wide variety of data with searchers. They can choose to only share their transaction hash to maintain the most privacy, or they can share logs, calldata, the function selector, and/or the `to` address of their transaction. Sharing more data gives searchers more options for running MEV strategies with those transactions, and so improves the chances of those transactions landing on chain quickly.\n\n:::info For the Adventurous\n\n💡 Bundles can also be shared on MEV-Share. If you query the raw stream (you can view it in your web browser here: https://mev-share.flashbots.net), you'll see that each event actually has a `txs` property, which itself may contains transaction events. In the client library, we convert the events into transaction or bundle types for you. To listen for bundles with the client lib, call the function `.on(\"bundle\", ...)`. We'll talk more about this in a later guide.\n\n:::info\n\nIn our project, we want to know whether a transaction interacts with the token pair that we want to trade on (in our case, WETH/DAI). We want to know this because these transactions might move the price towards our target price.\n\nTo find out which trading pair a transaction is interacting with, we need to look at one of two fields: `to` and `logs`, depending on which is shared by the sender of the transaction.\n\nThe `to` address is the actual recipient of the transaction. Typically, this would be a router contract like the [Uniswap Universal Router](https://etherscan.io/address/0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD), which allows users of the Uniswap web app to split trades between multiple Uniswap liquidity pools. However, we're not interested in any Uniswap routers. We're looking for the token pair contract (e.g. [WETH/DAI](https://etherscan.io/address/0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11)). If the `to` field is the pair address, the transaction sender is trading directly on the pair, which may mean that the transaction is from another searcher, as web UI users would most likely be interacting with the router contract. Nevertheless, if someone is trading on the token pair, we want to try to backrun it.\n\nIf the `logs` field is specified, we look for the pair address in the `address` field of one of the logs. MEV-Share, by default, shares the pair address in logs for swaps on Uniswap V2/V3 (V4 coming soon), Curve and Balancer. We'll look more in depth at decoding logs in a later guide, but for now it's sufficient to simply look for the pair address — if a log contains this address, then we can be confident that the transaction in the event is a good candidate to backrun.\n\nAdd the following code in your project:\n\n`src/index.ts`\n\n```tsx\n// preceding code omitted for brevity\n\nfunction transactionIsRelatedToPair(pendingTx: IPendingTransaction, PAIR_ADDRESS: string) {\n    return pendingTx.to === PAIR_ADDRESS ||\n        ((pendingTx.logs || []).some(log => log.address === PAIR_ADDRESS))\n}\n```\n\nAdditionally, we'll need to approve the router to spend our WETH. Add this function:\n\n```tsx\nasync function approveTokenToRouter( tokenAddress: string, routerAddress: string ) {\n    const tokenContract = new Contract(tokenAddress, ERC20_ABI, executorWallet)\n    const allowance = await tokenContract.allowance(executorWallet.address, routerAddress)\n    const balance = await tokenContract.balanceOf(executorWallet.address)\n    if (balance == 0n) {\n        console.error(\"No token balance for \" + tokenAddress)\n        process.exit(1)\n    }\n    if (allowance >= balance) {\n        console.log(\"Token already approved\")\n        return\n    }\n    await tokenContract.approve(routerAddress, 2n**256n - 1n)\n}\n```\n\nThen at the start of your `main` function, find the smart contract address for the token pair we want to trade, and call our function to approve the router to trade our WETH:\n\n```tsx\nconst PAIR_ADDRESS = (await uniswapFactoryContract.getPair(\n\t\tSELL_TOKEN_ADDRESS,\n\t\tBUY_TOKEN_ADDRESS\n\t)).toLowerCase()\nawait approveTokenToRouter(SELL_TOKEN_ADDRESS, UNISWAP_V2_ADDRESS)\n```\n\nThen, where we handle new pending transactions, call `transactionIsRelatedToPair` to see if we should backrun the transaction.\n\nYour main function should similar to this when you're done:\n\n```tsx\nasync function main() {\n    console.log('mev-share auth address: ' + authSigner.address)\n    console.log('executor address: ' + executorWallet.address)\n    const PAIR_ADDRESS = (await uniswapFactoryContract.getPair(SELL_TOKEN_ADDRESS, BUY_TOKEN_ADDRESS)).toLowerCase()\n\t\tawait approveTokenToRouter(SELL_TOKEN_ADDRESS, UNISWAP_V2_ADDRESS)\n    const nonce = await executorWallet.getNonce('latest')\n\n    mevshare.on('transaction', async ( pendingTx: IPendingTransaction ) => {\n        if (!transactionIsRelatedToPair(pendingTx, PAIR_ADDRESS)) {\n            console.log('skipping tx: ' + pendingTx.hash)\n            return\n        }\n        console.log(`It's a match: ${ pendingTx.hash }`)\n    })\n}\n```\n\nIf you run the code now, you'll probably see a lot of skipped transactions, but eventually you'll find a match! If you're not seeing any activity, try switching to mainnet:\n\n```tsx\n// const mevshare = MevShareClient.useEthereumGoerli(authSigner)\n// if you want to connect to mainnet instead:\nconst mevshare = MevShareClient.useEthereumMainnet(authSigner)\n```\n\n:::info For the Adventurous\nTry logging `pendingTx` in its entirety; look at all the fields. Or in code, check out the [interface](https://github.com/flashbots/matchmaker-ts/blob/main/src/api/interfaces.ts#L258) directly. See if you can find any patterns in the `logs` parameter.\n\n:::info\n"
  },
  {
    "path": "docs/flashbots-mev-share/searchers/understanding-bundles.mdx",
    "content": "---\ntitle: Understanding Bundles\n---\n\nimport Tabs from '@theme/Tabs'\nimport TabItem from '@theme/TabItem'\nimport SendBundleRpc from '@site/docs/specs/mev-share/_mev_sendBundle.mdx'\nimport BuilderInheritance from '@site/docs/specs/mev-share/blurbs/_builderInheritance.mdx'\nimport Hints from '@site/docs/specs/mev-share/HintsTable'\n\nBundles on MEV-Share are conceptually the same as bundles on MEV-Boost: they are an ordered array of transactions that execute atomically. However, their structure is a bit different. MEV-Share bundles use a new method called [`mev_sendBundle`](https://github.com/flashbots/mev-share/blob/main/specs/bundles/v0.1.md) which has additional fields used to specify privacy preferences and introduce other new features like post-execution validity checks.\n\n## Bundle Definition\n\nMEV-Share Bundles have the following structure:\n\n<SendBundleRpc />\n\nKey Fields:\n* **inclusion**: Defines the pre-inclusion predicates to check (e.g. block range).\n* **body**: Contains transactions, bundle hashes, or transaction hashes.\n* **validity**: (Optional) Defines the post-inclusion predicates to check, which are just refund parameters at the moment.\n* **privacy**: (Optional) Sets privacy configurations, including which builders to submit to. NOTE: the Flashbots builder is submitted to by default even if only other builders are specified.\nOptional properties are denoted with a ?.\n\n:::info Note to searchers on builders\n\n<BuilderInheritance />\n\n:::\n\nThis is the generic bundle structure used in MEV-Share. This comprehensive specification enables several exciting features, outlined in the next section.\n\n## Sharing hints\nMEV-Share bundles can share hints with searchers, which can be used to backrun the bundle. This is done by setting the `privacy` parameter in `mev_sendBundle`. The `privacy` parameter is an object with the following fields:\n<Hints />\n\nSearchers can share hints to give other searchers information about their bundle that would allow them to be backrun. If your bundle gets backrun by another searcher, you get paid a cut of the MEV they extract!\n\n## Builders\nMEV-Share bundles can be sent to multiple builders at once. This is done by setting the `builders` field in the `privacy` parameter of `mev_sendBundle`.\n\n## Bundle composition (backrunning other bundles)\nWith the `privacy` parameter in `mev_sendBundle` you can share select information about your bundle with other searchers, who can then use that to try to extract MEV. Should they succeed, you get paid some of the MEV they extracted!\n\nOne example that works well with bundle composition is a liquidation bot. Liquidations often cause a price shift, leaving MEV on the table which can be captured by arbitrage with a backrun bundle. If you run a liquidation bot, you can earn more MEV by sending your bundles to MEV-Share with the `tx_hash` hint enabled, which will allow other searchers to backrun your bundle.\n\nAn example would look something like this:\n\n<Tabs>\n<TabItem value=\"ts\" label=\"mev-share-client-ts\">\n\n```typescript\nconst params: BundleParams = {\n    inclusion: {\n        block: 17539448,\n        maxBlock: 17539458\n    },\n    body: [\n        {tx: \"0x02...\", canRevert: false},\n        {tx: \"0x02...\", canRevert: false},\n    ],\n    privacy: {\n        hints: {\n            txHash: true,\n        },\n    },\n}\n```\n\n</TabItem>\n</Tabs>\n\nSpecifying the `tx_hash` hint in your bundle shares the hashes of your bundle's transactions with searchers on MEV-Share, which is what allows them to backrun your bundle. Again, when they do this, you earn a cut of the profit!\n\nYou may also try experimenting with other hints to give searchers more data with which to formulate a backrun. Sharing more data will lower your privacy, but will make your bundle easier to backrun, and increase the likelihood of your bundles earning extra MEV.\n\n:::caution only original transactions are supported\n\nBundles that set the `privacy` parameter can only contain original signed transactions in the `body` parameter. Bundles using transactions specified by `{hash}` are not allowed to use the privacy parameter (full bundle privacy is maintained in this case). Allowing such bundles to share data using the `privacy` parameter would compromise the privacy guarantees of user transactions.\n\n:::\n\nSee [Sending Bundles](/flashbots-mev-share/searchers/sending-bundles#share-bundle-data) for more information.\n--\nNow that we know all the different ways in which we can send and share bundles, we're finally ready to [send a bundle](/flashbots-mev-share/searchers/sending-bundles).\n"
  },
  {
    "path": "docs/flashbots-protect/additional-documentation/eth-sendPrivateTransaction.mdx",
    "content": "---\ntitle: eth_sendPrivateTransaction\n---\n\nimport Tabs from \"@theme/Tabs\";\nimport TabItem from \"@theme/TabItem\";\nimport Hints from \"../../specs/mev-share/HintsTable\";\nimport Builders from \"../../specs/mev-share/_builders.mdx\";\n\n## Introduction\n\nThe `eth_sendPrivateTransaction` method allows for the sending of individual private transactions. This provides users with the ability to customize their transactions beyond the default configurations.\n\n## Implementation\n\nBelow are some details about the implementation of `eth_sendPrivateTransaction`:\n\n- Endpoint: Send your eth_sendPrivateTransaction requests to https://relay.flashbots.net.\n- Header: Use the X-Flashbots-Signature header.\n- Cancellation: Private transactions can be halted using eth_cancelPrivateTransaction.\n\nYou can access this method using the following libraries:\n\n- For JavaScript, use [ethers-provider-flashbots-bundle.js](/flashbots-auction/libraries/ethers-js-provider).\n- For Python, use [web3-flashbots.py](/flashbots-auction/libraries/web3py-provider).\n- Additionally, [`eth_sendPrivateTransaction`](https://docs.alchemy.com/reference/eth-sendprivatetransaction?a=fb) is freely supported on [Alchemy](https://alchemy.com?a=fb).\n\n## Priority fee\n\nWhen sending transaction using `eth_sendPrivateTransaction` or `eth_sendPrivateRawTransaction` methods you should set\npriority fee (tips) to be strictly greater than zero. Transactions with 0 priority fee will not be shared with block\nbuilders and included on chain, unless they are bundled by a searcher via MEV-Share.\n\n## Examples\n\nThe following code examples show how to use eth_sendPrivateTransaction using the Flashbots ethers and web3.py libraries.\n\n<Tabs\n  defaultValue=\"ethers.js\"\n  values={[\n    { label: \"ethers.js\", value: \"ethers.js\" },\n    { label: \"web3-flashbots.py\", value: \"web3-flashbots.py\" },\n]}>\n\n<TabItem value=\"ethers.js\">\n\n```ts\nconst signer = Wallet.createRandom();\nconst provider = new providers.JsonRpcProvider(\"http://localhost:8545\");\nconst flashbotsProvider = await FlashbotsBundleProvider.create(\n  provider,\n  signer,\n);\n\nconst transaction = {\n  from: signer.address,\n  to: signer.address,\n  value: \"0x42\",\n  gasPrice: BigNumber.from(99).mul(1e9),\n  gasLimit: BigNumber.from(21000),\n};\n\nconst res = await flashbotsProvider.sendPrivateTransaction(\n  {\n    transaction,\n    signer,\n  },\n  {\n    maxBlockNumber: (await provider.getBlockNumber()) + 5, // only allow tx to be included for the next 5 blocks\n  },\n);\n\nconst waitRes = await res.wait();\nif (waitRes === FlashbotsTransactionResolution.TransactionIncluded) {\n  console.log(\"Private transaction successfully included on-chain.\");\n} else if (waitRes === FlashbotsTransactionResolution.TransactionDropped) {\n  console.log(\n    \"Private transaction was not included in a block and has been removed from the system.\",\n  );\n}\n```\n\n</TabItem>\n\n<TabItem value=\"web3-flashbots.py\">\n\n```python\nweb3 = Web3(HTTPProvider(\"http://localhost:8545\"))\nflashbot(w3, signer)\nsigner: LocalAccount = Account.from_key(\"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\")\nnonce = web3.eth.get_transaction_count(signer.address)\n\ntx1: TxParams = {\n    \"to\": \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\",\n    \"value\": Web3.toWei(1, \"ether\"),\n    \"data\": \"0xd0e30db0\",\n    \"gas\": 21000,\n    \"maxFeePerGas\": Web3.toWei(100, \"gwei\"),\n    \"maxPriorityFeePerGas\": Web3.toWei(10, \"gwei\"),\n    \"nonce\": nonce,\n    \"chainId\": 1,\n    \"type\": 2,\n}\nweb3.flashbots.send_private_transaction({\n    \"signer\": signer,\n    \"transaction\": tx1,\n})\n```\n\n</TabItem>\n</Tabs>\n\n## JSON-RPC\n\nDetailed JSON-RPC structure for the method are below:\n\n```typescript\n{\n  jsonrpc: \"2.0\",\n  id: string | number,\n  method: \"eth_sendPrivateTransaction\",\n  params: [{\n    tx,               // String, raw signed transaction\n    maxBlockNumber,   // Hex-encoded number string, optional. Highest block number in which the transaction should be included.\n    preferences?: {\n      fast: boolean,  // Sends transactions to all registered block builders, sets MEV-Share revenue share to 50%\n      privacy?: {     // MEV-Share options; optional\n        hints?: Array< // data about tx to share w/ searchers on mev-share\n            \"contract_address\" |\n            \"function_selector\" |\n            \"calldata\" |\n            \"logs\" |\n            \"hash\"\n        >,\n        builders?: Array< // MEV-Share builders to exclusively receive bundles; optional\n            \"default\" |\n            \"flashbots\"\n        >,\n      },\n      validity?: {\n        refund?: Array<{address, percent}>\n      }\n    }\n  }]\n}\n```\n\nexample request:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_sendPrivateTransaction\",\n  \"params\": [\n    {\n      \"tx\": \"0x123abc...\",\n      \"maxBlockNumber\": \"0xcd23a0\",\n      \"preferences\": {\n        \"fast\": true,\n        \"privacy\": {\n          \"hints\": [\"calldata\", \"transaction_hash\"],\n          \"builders\": [\"default\"]\n        },\n        \"validity\": {\n          \"refund\": [{ \"address\": \"0xadd123\", \"percent\": 50 }]\n        }\n      }\n    }\n  ]\n}\n```\n\nexample response:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": \"0x45df1bc3de765927b053ec029fc9d15d6321945b23cac0614eb0b5e61f3a2f2a\" // tx hash\n}\n```\n\n#### Privacy options\n\nBy 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 customize privacy settings:\n\n| Parameter  | Type         | Description                                                          |\n| ---------- | ------------ | -------------------------------------------------------------------- |\n| `hint`     | String array | Indicates the type of data from the transaction shared on mev-share. |\n| `builders` | String array | Builders that are sent the transaction.                              |\n\n**`hint`**\n\n<Hints />\n\n**`builders`**\n\nFlashbots currently supports sending orderflow to the following block builders. This is subject to change over time.\n\n<Builders />\n\n#### `validity`\n\nValidity is used to specify the address and percentage to pay any refund from the backrun of a `eth_sendPrivateTranasction` transaction.\n\nBy default, the refund is paid to the signer of the transaction and 90% of the backrun value is sent to the signer's address.\n\nIf multiple refund addresses are specified, then the backrun value is split between them according to the percentage specified.\nFor 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`\nand 70% of the backrun value is left to the builder.\n\n| Parameter          | Type             | Description                                                                                                         |\n| ------------------ | ---------------- | ------------------------------------------------------------------------------------------------------------------- |\n| `refund`           | Array of objects | Each entry in the array specifies address that should receive refund from backrun and percent of the backrun value. |\n| `refund[].address` | Address          | Address that should receive refund.                                                                                 |\n| `refund[].percent` | Number           | Percentage of the total backrun value that this address should receive.                                             |\n\n## Additional methods\n\n### eth_sendPrivateRawTransaction\n\n`eth_sendPrivateRawTransaction` behaves like [eth_sendPrivateTransaction](#) but its format\nis similar to that of [`eth_sendRawTransaction`](https://docs.alchemy.com/reference/eth-sendrawtransaction)\n\nThis method has the following JSON-RPC format:\n\n```typescript\n{\n  jsonrpc: \"2.0\",\n  id: string | number,\n  method: \"eth_sendPrivateRawTransaction\",\n  params: [\n    tx,               // String, raw signed transaction\n    preferences?      // Optional, see eth_sendPrivateTransaction\n  ]\n}\n```\n\nexample request:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_sendPrivateRawTransaction\",\n  \"params\": [\"0x123abc...\"]\n}\n```\n\nexample response:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": \"0x45df1bc3de765927b053ec029fc9d15d6321945b23cac0614eb0b5e61f3a2f2a\" // tx hash\n}\n```\n\n| Parameter   | Type   | Description                                                                       |\n| ----------- | ------ | --------------------------------------------------------------------------------- |\n| `params[0]` | String | Raw signed transaction                                                            |\n| `params[1]` | Object | Optional private tx preferences, see `preferences` in eth_sendPrivateTransaction. |\n\n### eth_cancelPrivateTransaction\n\nThe `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.\n\n[`eth_cancelPrivateTransaction`](https://docs.alchemy.com/reference/eth-cancelprivatetransaction?a=fb) is also supported for free on [Alchemy](https://alchemy.com?a=fb).\n\nThis method has the following JSON-RPC format:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_cancelPrivateTransaction\",\n  \"params\": [{\n    txHash,   // String, transaction hash of private tx to be cancelled\n  }]\n}\n```\n\nexample request:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_cancelPrivateTransaction\",\n  \"params\": [\n    {\n      \"txHash\": \"0x45df1bc3de765927b053ec029fc9d15d6321945b23cac0614eb0b5e61f3a2f2a\"\n    }\n  ]\n}\n```\n\nexample response:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": true // true if tx successfully cancelled, false if not\n}\n```\n"
  },
  {
    "path": "docs/flashbots-protect/additional-documentation/status-api.md",
    "content": "---\ntitle: Transaction Status API\n---\n\nTransactions that you submit to Flashbots Protect won't be observable in the public mempool. However, you can use our status API to check the status of your transactions. The URL for doing so is: `https://protect.flashbots.net/tx/YOUR_TX_HASH_HERE`, and you can also use Etherscan as you normally would for transactions. They will show the status of your transaction from the status API as well.\n\nThe Transaction Status API is also available on test networks. Below is a table of URLs for accessing the API across different networks:\n\n| Network  | URL                                                |\n| -------- | -------------------------------------------------- |\n| Mainnet  | `https://protect.flashbots.net/tx/` |\n| Sepolia  | `https://protect-sepolia.flashbots.net/tx/` |\n\n\n\nIn turn you will receive a JSON response that looks like the following:\n\n```json\n{\n  \"status\": \"PENDING\",\n  \"hash\": \"YOUR_TX_HASH\",\n  \"maxBlockNumber\": 13543898,\n  \"transaction\": {\n    \"from\": \"\",\n    \"to\": \"\",\n    \"gasLimit\": \"\",\n    \"maxFeePerGas\": \"\",\n    \"maxPriorityFeePerGas\": \"\",\n    \"nonce\": \"\",\n    \"value\": \"\"\n  },\n  \"fastMode\": true, // for backwards compatibility; may be removed in a future version\n  \"seenInMempool\": false,\n  \"simError\": \"\",\n  \"revertReason\": \"\",\n  \"isRevert\": false\n}\n```\n\nBelow is a table of status codes that can be returned:\n\n| Status Code | Description                                                                        |\n| ----------- | ---------------------------------------------------------------------------------- |\n| `PENDING`   | The transaction was received and is currently being processed by the block builder |\n| `INCLUDED`  | The transaction was included on-chain                                              |\n| `FAILED`    | The transaction was submitted for 25 blocks and failed to be included on-chain     |\n| `CANCELLED` | The transaction was cancelled by the user and not included on-chain                |\n| `UNKNOWN`   | The transaction was not received                                                   |\n\n## Privacy\n\nThe `transaction` fields are disclosed only for transactions with an `INCLUDED` status to maintain privacy for trades that are pending, failed, or cancelled. These fields will remain empty for transactions with `PENDING`, `FAILED`, `UNKNOWN`, or `CANCELLED` statuses. Protect fast mode transactions are an exception to this rule as TEE searchers will receive all fields (without signature) for all transactions, including reverted or failed transactions, with a 5 minute delay for troubleshooting and debugging purposes. \n\nFor instance, once a transaction is included, the JSON response will be populated with data for all fields:\n\n```json\n{\n  \"status\": \"INCLUDED\",\n  \"hash\": \"YOUR_TX_HASH\",\n  \"maxBlockNumber\": 13543898,\n  \"transaction\": {\n    \"from\": \"0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8\",\n    \"to\": \"0xac03bb73b6a9e108530aff4df5077c2b3d481e5a\",\n    \"gasLimit\": \"21000\",\n    \"maxFeePerGas\": \"300\",\n    \"maxPriorityFeePerGas\": \"10\",\n    \"nonce\": \"41\",\n    \"value\": \"10000000000\"\n  },\n  \"fastMode\": true, // for backwards compatibility; may be removed in a future version\n  \"seenInMempool\": false,\n  \"isRevert\": false\n}\n```\n\nWhile your transaction is `PENDING` or `FAILED` we will try to respond with the latest seen simulation error and revert reason if exists.\n\nBelow is the table of currently supported `simError` values.\n\n| Sim error                    | Description                                                                                 |\n|------------------------------|---------------------------------------------------------------------------------------------|\n| `SimErrorMaxFeePerGasTooLow` | Consensus incompatible tx that wasn't caught on rpc                                         |\n| `SimErrorInsufficientFunds`  | Insufficient ETH balance to pay for gas                                                     |\n| `SimErrorNonceTooLow`        | Nonce too low                                                                               |\n| `SimErrorNonceTooHigh`       | Nonce too high                                                                              |\n| `SimErrorInvalidChainId`     | Consensus incompatible tx that wasn't caught on rpc                                         |\n| `SimErrorExecutionReverted`  | Execution reverted (slippage tolerance exceeded). Check revertReason field for more details |\n| `SimErrorOutOfGas`           | Ran out of gas during execution (gas limit too low)                                         |\n\n`revertReason` field is a valid utf-8 part of the simulation result. Example: `TRANSFER_FROM_FAILED`, `UniswapV2: INSUFFICIENT_OUTPUT_AMOUNT` \n"
  },
  {
    "path": "docs/flashbots-protect/cancellations.md",
    "content": "---\ntitle: Cancellations\n---\n\nTransactions submitted to Flashbots Protect are directed to the Flashbots MEV-Share Node. Here, they may remain in a pending state for a duration of up to 6 minutes.\n\nFlashbots Protect provides the functionality to cancel pending transactions. To do so, a cancellation transaction must be submitted to Flashbots Protect. This cancellation transaction should adhere to the following criteria:\n\n- It must be submitted from the **same address** as the original transaction that is intended to be cancelled.\n- It should have the **same nonce** as the original transaction.\n- The **from and to addresses** should both be set to the **from address** of the original transaction.\n- The **data field** of the cancellation transaction should be left empty.\n\n## No cost to cancel\n\nThe cancellation transaction serves solely for authentication purposes, verifying that you have control over the account that initiated the transaction you wish to cancel. Since this transaction is not included on-chain, it incurs no cost.\n"
  },
  {
    "path": "docs/flashbots-protect/gas-fee-refunds.md",
    "content": "---\ntitle: Gas Fee Refunds\n---\n\n## Introduction\n\nFlashbots Protect users are automatically eligible to receive gas fee refunds, if a transaction can be landed onchain for a lower price. This applies to both the RPC and the private transaction API.\n\nGas fee refunds do not change how transactions are executed and users do not need to make any changes to be eligible for them. Gas fee refunds are calculated separately, and applied in addition to, MEV refunds from [MEV-Share](/flashbots-protect/mev-refunds).\n\n## Where do refunds come from\n\nUsers and orderflow providers (like wallets) often pay high priority fees to land transactions on chain. Many of these transactions could be executed just as quickly for a fraction of the gas cost.\n\nIt can be difficult to estimate gas correctly when sending a transaction. Flashbots Protect sends all transactions to [BuilderNet](https://buildernet.org/), which calculates the optimal fee on your behalf and refunds transactions that overpay.\n\nGas fee refunds include both priority fees (more common in user transactions) and coinbase transfers (less common).\n\n## Which transactions receive refunds\n\nFlashbots Protect provides refunds for transactions in blocks landed by BuilderNet. Whether a transaction receives a refund depends on a few factors that vary from block to block:\n* How much network congestion and competition there was\n* Whether BuilderNet made a profit and how much\n* How much the specific transaction contributed to the value of the block\n* If the transaction was sent directly to Flashbots Protect, or shared with other RPCs and block builders\n\nNote 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.\n\n## How to maximize both refunds and speed\n\nTransactions which are sent directly to the Flashbots RPC or API, and not multiplexed _by the user_ to other RPCs or block builders, are likely to receive higher refunds. This is because they increase the profit of BuilderNet which is used to provide refunds.\n\nBuilderNet does not land 100% of blocks. In order to improve inclusion speed, users can ask Flashbots to share their transactions with other block builders in cases where BuilderNet does not win a block. Flashbots will automatically share with all specified builders on the user's behalf.\n\nThere are two ways to share with other builders:\n* Use [fast mode](/flashbots-protect/quick-start#faster-transactions) to share with all registered builders\n* Choose [specific builders](/flashbots-protect/settings-guide#builders) to share transactions with\n\n## Who receives refunds\n\nFor the RPC: The refund recipient is the address specified in the first [refund parameter](/flashbots-protect/settings-guide#refunds) on an RPC request, if one is provided. Otherwise, refunds are sent to the transaction originator (`tx.origin`) by default.\n\nFor the private transaction API: The refund recipient is the signer used on the `eth_sendPrivateTransaction` request.\n\n## How to track refunds\n\nRefunds 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). The recipient can track the status of their refunds using the [`flashbots_getFeeRefundTotalsByRecipient`](/flashbots-auction/advanced/rpc-endpoint#flashbots_getfeerefundtotalsbyrecipient) RPC method.\n\n## Distributed refunds\n\nThe on-chain transactions corresponding to distributed refunds can be viewed with this Dune query: [https://dune.com/queries/4398421](https://dune.com/queries/4398421)\n"
  },
  {
    "path": "docs/flashbots-protect/large-transactions.md",
    "content": "---\ntitle: Large Transaction Allowlist\n---\n\nSome projects may need to post larger transactions (measured in bytes) than the transaction pool allows. Flashbots bundles are not subject to the transaction pool size constraints. However, at the RPC level only transactions to certain contracts are allowed to be over 128kb.\n\nThe list of contracts supporting large transactions can be seen in the [RPC endpoint's allowlist](https://github.com/flashbots/rpc-endpoint/blob/main/server/whitelist.go#L21). To add your contract to this list please make a PR to the RPC endpoint appending your contract address to the allowlist and share a description of your use case in the body of the PR.\n"
  },
  {
    "path": "docs/flashbots-protect/mev-refunds.mdx",
    "content": "---\ntitle: MEV Refunds\n---\n\nimport ProtectButton from '@site/src/components/ProtectButton';\n\n## Introduction\n\nFlashbots Protect users are automatically eligible to receive MEV refunds from [MEV-Share](/flashbots-mev-share/introduction). If your transaction (eg. a large DEX swap) generates MEV, MEV-Share can help you reclaim a significant portion of this value. The remainder is split with searchers and validators to facilitate transaction inclusion.\n\nBy default, all Protect transactions use the [default](/flashbots-protect/settings-guide#default) privacy setting which is continuously optimized by Flashbots to balance efficient execution and protection against harmful MEV. Advanced users can customize their settings when configuring their RPC or by manually editing the query parameters their Protect RPC request.\n\n<ProtectButton />\n\n## Common privacy settings\n\nYou can customize how much information is shared about your transactions in MEV-Share. Each piece of information is called a \"hint\". Sharing more hints can increase refunds, while sharing fewer hints can increase privacy. Below are some common hint choices for different levels of privacy. See the complete [settings page](/flashbots-protect/settings-guide) for a full list of all settings you can apply to your RPC request.\n\n### Default\n\nTo use the default privacy settings, you don't need to specify any query parameters.\n\n```url\nhttps://rpc.flashbots.net\n```\n\nCurrently, this configuration shares the following information:\n\n- The `hash` of all transactions\n- `default_logs` Partial logs (the pool id and the fact that a swap was made) for curve, balancer, and uniswapV2/V3/V4-style trades\n\n### Max Privacy\n\nTo use Protect with full privacy, set _only_ the `hash` hint in your Protect RPC URL:\n\n```url\nhttps://rpc.flashbots.net?hint=hash\n```\n\nThis configuration ensures that all identifiable transaction data sent to the MEV-Share Node is concealed from searchers. However, it's important to note that this could make it more challenging for searchers to spot MEV opportunities, leading to a very likely decrease in your MEV refund.\n\n### Max Refund\n\nTo use Protect with the maximum refund, set _all_ hints in your Protect RPC URL:\n\n```url\nhttps://rpc.flashbots.net?hint=calldata&hint=contract_address&hint=function_selector&hint=logs\n```\n\nThis configuration provides searchers with comprehensive details about your transaction, giving them a better chance to identify more MEV opportunities and return MEV refunds.\n"
  },
  {
    "path": "docs/flashbots-protect/nonce-management.mdx",
    "content": "---\ntitle: Nonce Management\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\nNormally, a wallet can call `eth_getTransactionCount` to get the next nonce to use for a transaction.\nHowever, since transactions sent to Flashbots Protect are potentially sensitive, even exposing the incremented nonce can leak information about the user's activity.\n\nAs such, transactions sent to Flashbots Protect are only included in the `eth_getTransactionCount` results when querying the `\"pending\"` nonce, and only if the request is signed by the user's private key.\n\nThis is done by sending a JSON-RPC request to the Flashbots Protect RPC endpoint with the following parameters:\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"method\": \"eth_getTransactionCount\",\n  \"params\": [\n    \"0xYOUR_ADDRESS\",\n    \"pending\"\n  ],\n  \"id\": 1\n}\n```\n\nThe request is then signed and the signature is included in the `X-Flashbots-Signature` header. Without such a signature, the returned nonce will only include transactions sent to the public mempool.\n\n### Authentication\n\nTo authenticate your request, sign the payload and include the signed payload in the `X-Flashbots-Signature` header of your request.\n\n```curl\ncurl -X POST -H \"Content-Type: application/json\" -H \"X-Flashbots-Signature: <public key address>:<signature>\" --data '{\"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionCount\",\"params\":[\"0xYOUR_ADDRESS\",\"pending\"],\"id\":1}' https://rpc.flashbots.net\n```\n\nThe private key of the address your want to query must be used to sign the payload.\n\nThe 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:\n\n<Tabs\ndefaultValue=\"ethers.js\"\nvalues={[\n{ label: 'ethers.js', value: 'ethers.js', },\n{ label: 'web3.py', value: 'web3.py' },\n{ label: 'go', value: 'go' },\n]}\n>\n<TabItem value=\"ethers.js\">\n\n```ts\nimport {Wallet, utils} from 'ethers';\n\nconst privateKey = '0x1234';\nconst wallet = new Wallet(privateKey);\nconst body =\n  '{\"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionCount\",\"params\":[\"0xYOUR_ADDRESS\",\"pending\"],\"id\":1}';\nconst signature = wallet.address + ':' + wallet.signMessage(utils.id(body));\n```\n\n</TabItem>\n<TabItem value=\"web3.py\">\n\n```py\nfrom web3 import Web3\nfrom eth_account import Account, messages\n\nbody = '{\"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionCount\",\"params\":[\"0xYOUR_ADDRESS\",\"pending\"],\"id\":1}'\nmessage = messages.encode_defunct(text=Web3.keccak(text=body).hex())\nsignature = Account.from_key(private_key).address + ':' + Account.sign_message(message, private_key).signature.hex()\n```\n\n</TabItem>\n<TabItem value=\"go\">\n\n```go\nbody := `{\"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionCount\",\"params\":[\"0xYOUR_ADDRESS\",\"pending\"],\"id\":1}`\nhashedBody := crypto.Keccak256Hash([]byte(body)).Hex()\nsig, err := crypto.Sign(accounts.TextHash([]byte(hashedBody)), privKey)\nsignature := crypto.PubkeyToAddress(privKey.PublicKey).Hex() + \":\" + hexutil.Encode(sig)\n```\n\n</TabItem>\n</Tabs>\n\n"
  },
  {
    "path": "docs/flashbots-protect/overview.mdx",
    "content": "---\ntitle: MEV Protection Overview\n---\n\n<head>\n  <title>MEV Protection - Block MEV With Flashbots Protect RPC</title>\n  <meta\n    name=\"description\"\n    content=\"Privacy notice: Flashbots MEV Protect RPC does not track user information (i.e. IP, location, etc.). No user information is stored or logged.\"\n  />\n</head>\n\nimport ProtectButton from '@site/src/components/ProtectButton';\n\nFlashbots Protect is a cheaper and safer way to transact on Ethereum. It protects your transactions from frontrunning and gives you refunds on gas fees and MEV.\n\nKey benefits:\n- **Frontrunning protection:** Transactions are sent to a private Flashbots mempool where they will be hidden from frontrunning and sandwich bots.\n- **Refunds**: If your transaction creates MEV, you can earn an [MEV refund](/flashbots-protect/mev-refunds). If your transaction pays high priority fees, you can earn [gas fee refunds](/flashbots-protect/gas-fee-refunds).\n- **No failed transactions:** Transactions are only included in the block if they do not revert. Users do not pay fees for failed transactions.\n- **Configurable:** You can customize your privacy, speed, and refund settings.\n\nUse Flashbots Protect by clicking the button below or by sending `eth_sendRawTransaction` API requests to `rpc.flashbots.net/fast`.\n\n<ProtectButton />\n\n<br />\n<br />\n\nWe want to thank MiningDAO, mistX, and Nethermind for significant code contributions, testing, and being early adopters of Flashbots Protect.\n\n**Privacy notice: Flashbots Protect RPC does not track** user information (i.e. IP, location, etc.). No user information is stored or logged.\n"
  },
  {
    "path": "docs/flashbots-protect/quick-start.mdx",
    "content": "---\ntitle: Quick Start\n---\n\nimport ProtectButton from '@site/src/components/ProtectButton';\n\n### Key Considerations\n\nFlashbots Protect has the following key benefits:\n\n- **Frontrunning protection:** Transactions are hidden from the public mempool away from front-running and sandwich bots.\n- **Refunds**: If your transaction creates MEV, you can earn an [MEV refund](/flashbots-protect/mev-refunds). If your transaction pays high priority fees, you can earn [gas fee refunds](/flashbots-protect/gas-fee-refunds).\n- **No failed transactions:** Transactions are only included in the block if they do not revert. Users do not pay fees for failed transactions.\n- **Configurable:** You can customize your privacy, speed, and refund settings.\n\n### Faster Transactions\n\nUse Protect in fast mode to land your transactions faster on chain. Click the \"fast\" option when [configuring your Protect RPC](/flashbots-protect/quick-start#using-flashbots-protect) or manually set your RPC to `rpc.flashbots.net/fast`.\n\nFast mode details:\n\n1. **Shared with all builders:** Transactions are multiplexed, or shared, with all [registered builders](https://github.com/flashbots/dowg/blob/main/builder-registrations.json) within one block after they are received. Multiplexing increases the probability that the transaction will be sent to the builder building the winning block.\n2. **Larger validator payment:** With the default RPC, 10% of the MEV-Share refund is paid to validators. In fast mode, validators receive a higher percentage of the MEV-Share refund increasing the probability that the transaction will be included in the winning block.\n3. **Shared with TEE searchers:** Full transaction information is also shared with searchers in TEEs (secure enviroments), leading to better MEV refunds while preserving frontrunning protection. \n\n**Note**: When you send your transaction to a builder, you trust them not to frontrun your transaction or disclose it to third-party MEV searchers. \n\n### Customer Support\n\nWallets and applications can receive customer support for transactions tagged with their `originId`. To opt into customer support, update your RPC URL to `rpc.flashbots.net/fast?originId=[your-wallet-name]`.\n\n:::warning Do Not Switch RPCs Before Transaction Confirmation\n\nIf you submit a transaction through Flashbots Protect via the MetaMask wallet, do not switch RPCs before transaction confirmation. MetaMask may resend the transaction to the public mempool exposing your transaction to potential MEV attacks if RPCs are switched before transaction confirmation.\n\n:::\n\n### 0 Priority Fees\n\nFlashbots Protect does not accept transactions with a priority fee of 0. They will be dropped and a standard error message will be returned.\n\n## Using Flashbots Protect\n\nThere are three ways to use Flashbots Protect:\n\n1. Add the Flashbots Protect RPC to your wallet.\n2. Send transactions to the RPC URL using [eth_sendRawTransaction](https://docs.alchemy.com/reference/eth-sendrawtransaction).\n3. Send transactions to Flashbots using [eth_sendPrivateTransaction](/flashbots-protect/additional-documentation/eth-sendPrivateTransaction).\n\nThe easiest way to use Flashbots Protect is to add the Flashbots Protect RPC to your wallet. Use the button below to create a custom Protect RPC or follow the manual instructions. **Note that you can configure the builders you send to and your MEV-Share hints as well**.\n\n<ProtectButton />\n\n## Adding Flashbots Protect RPC Manually\n\nYou can also add Flashbots Protect RPC manually in MetaMask by following these steps:\n\n1. Expand the Network drop-down menu by clicking on your current network at the top of your MetaMask. By default you are connected to “Ethereum mainnet.”\n2. Click “Add network”\n3. Click “Add a network manually” and fill in the following information:\n\n- **Network Name:** Flashbots Protect\n- **New RPC URL:** [https://rpc.flashbots.net/fast](https://rpc.flashbots.net/fast) or the URL provided above based on your configuration\n- **Chain ID:** 1\n- **Currency Symbol:** ETH\n- **Block Explorer URL:** [https://etherscan.io/](https://etherscan.io/)\n\n4. Click “Save.”\n5. Click “Switch to Flashbots Protect”\n\n![mm_rpc](/img/mm_rpc.png)\n\nBelow is the list of Flashbots Protect RPCs we currently support across Ethereum mainnet and testnets:\n\n| Network | URL                                  |\n| ------- | ------------------------------------ |\n| Mainnet | `https://rpc.flashbots.net/fast`     |\n| Sepolia | `https://rpc-sepolia.flashbots.net/` |\n\n## Stuck transactions\n\nPlease see our [stuck transactions guide](/flashbots-protect/stuck_transactions) for help with dealing with transactions that are \"stuck\" as pending.\n\n## Proxy via Tor\n\nProtect RPC supports access through the Tor network, allowing users to maintain privacy and anonymity. To access through Tor, use http://protectfbnoqyfgo3t5ouw3c7odp55qqoxnfdd7u24nzz5pkbclbzzyd.onion instead of https://rpc.flashbots.net\n"
  },
  {
    "path": "docs/flashbots-protect/ratelimiting.mdx",
    "content": "---\ntitle: Rate Limits\n---\n\nIn order to protect our services from abuse we have rate limits on the number of requests that can be made. Currently, the rate limits are set as follows.\n\n## `rpc.flashbots.net` - Flashbots Protect RPC\n\n| Method                                     | Limit             |\n|--------------------------------------------|-------------------|\n| `eth_sendRawTransaction`                   | None              |\n| `eth_call`                                 | 200 / IP / 5 min  |\n| `eth_getTransactionReceipt`                | 200 / IP / 5 min  |\n| `eth_getTransactionByBlockNumberAndIndex`  | 200 / IP / 5 min  |\n| `eth_getBalance`                           | 200 / IP / 5 min  |\n| All others                                 | 600 / IP / 5 min  |\n\nNote that you are not required to read JSON RPC requests to send transactions to Flashbots Protect RPC.\n\nRelay rate limits for advanced user bundles sent to `relay.flashbots.net` [can be found here](../flashbots-mev-share/searchers/ratelimiting).\n\n## Rate limiting exceptions\n\nIf you are a wallet or application integrating with protect and you require a higher rate limit please reach out to [Shea Ketsdever](https://twitter.com/SheaKetsdever).\n\n## Batch request support\n\nFlashbots Protect RPC is not supporting batch JSON-RPC requests.\n"
  },
  {
    "path": "docs/flashbots-protect/settings-guide.md",
    "content": "---\ntitle: Settings Guide\n---\n\nimport HintsTable from '../specs/mev-share/HintsTable';\nimport Builders from '../specs/mev-share/_builders.mdx';\n\nThe Protect RPC uses query parameters and URL paths to convey your preferences. These parameters indicate which builders to share your transaction with, how potential refunds should be distributed, when to send transactions to the mempool, and other features.\n\n### Default\n\n```url\nhttps://rpc.flashbots.net\n```\n\nBy default, Flashbots Protect uses the following settings:\n- Transactions are only forwarded to the Flashbots block builder\n- Transactions are retried for 25 blocks and dropped if they do not land on chain within this time\n- The `hash` and `default_logs` [hints](/flashbots-protect/settings-guide#hints) are shared with MEV-Share searchers\n- 90% of MEV refunds are sent to `tx.origin` (the remaining 10% is sent to the validator)\n- 100% of gas fee refunds are sent to `tx.origin`\n- 0 priority fee transactions are not included on chain\n- Reverted transactions are not included on chain\n\nThis may change as the configuration is tuned to maximize benefits.\n\n### Fast\n\nSpeed up your transactions by using fast mode.\n\n```url\nhttps://rpc.flashbots.net/fast\n```\n\nCompared with the default configuration:\n- Transactions are shared with all [registered builders](https://github.com/flashbots/dowg/blob/main/builder-registrations.json)\n- Validators receive a higher percentage of the MEV-Share refund increasing the probability that the transaction will be included in the winning block.\n- Full transaction information (without signatures) is shared with searchers inside TEEs to increase MEV refunds while preserving frontrunning protection. Searchers not in TEEs will receive only the hints specified. TEE searchers will be able to see full transaction information (even for failed or reverted transactions) after a 5-minute delay for troubleshooting and debugging purposes.\n  \n### Hints\n\nChange what transaction data is visible to MEV-Share searchers with the `hint` query parameter. The [default](/flashbots-protect/settings-guide#default) hint configuration will be used if no hints are provided. If you specify one or more hints, any hint that is _not_ included will be disabled. If fast mode is used, searchers not in TEEs will only receive the hints specified while TEE searchers will receive all hints regardless of specification. \n\n<HintsTable />\n\nHere is an example:\n\n```url\nhttps://rpc.flashbots.net?hint=contract_address&hint=logs\n```\n\nThis configuration shares the contract address and logs with searchers. It does not share the calldata or function selector.\n\n### Builders\n\nDesignate which builders will receive your transaction with the `builder` query parameter. This parameter can be repeated multiple times to include different builders. The builders listed below are currently supported.\n\nNote that all transactions are shared with the Flashbots block builder, even if it is not explicitly specified.\n\n<Builders />\n\nIt's important to understand that while adding more builders can increase your transaction inclusion rate, it also requires you to place trust in those builders. Here's an example of how to utilize the `builder` parameter:\n\n```url\nhttps://rpc.flashbots.net?builder=ABC&builder=XYZ\n```\n\nThis configuration sends your transaction to ABC block builder, XYZ block builder, and the Flashbots block builder.\n\n### Refunds\n\nTailor your refund settings using the `refund` query parameter. This determines how MEV and gas fee refunds will be distributed across different addresses. If not specified, the transaction originator (tx.origin) will receive all refunds.\n\nThe refund parameter contains two colon-separated values: an address for the refund and the percentage of the payment that should be refunded to that address.\n\nHere is an example of a refund parameter that sends 10% of refunds to the address `recipientAddress`:\n\n```URL\nhttps://rpc.flashbots.net?refund=recipientAddress:10\n```\n\n#### MEV Refund Recipients\n\nMEV refunds can be split across multiple recipients. To distribute the payment across multiple addresses, append a new refund parameter for each address.\n\nThe sum of all refund percentages must be less than 100. The remaining percentage, inferred from 100 - total refund percentages, is the payment to the validator.\n\n**Note**: Keeping a larger percentage of the refund may result in longer block inclusion times as it reduces the payment to the validator.\n\n#### Gas Fee Refund Recipients\n\nGas fee refunds can only be sent to a single recipient. If multiple addresses are specified, the first refund address listed will receive 100% of the gas fee refund. There is no additional payment split with the validator.\n\n### Mempool Configuration\n\nSend certain transactions to the public mempool to improve the likelihood of inclusion by including the `useMempool` query parameter. If either of the following conditions are true, Flashbots will send all pending transactions with this parameter to the public mempool:\n1. The Ethereum validator responsible for proposing the next block does not run [MEV-Boost](/flashbots-mev-boost/introduction). Approximately 10% of Ethereum blocks do not include any private transactions. Sending your transaction to the public mempool will give you access to those blocks at the expense of privacy and MEV refunds.\n2. The transaction has not been included for 25 blocks: Some transactions pay very low priority fees are unlikely to land within 25 blocks. Send them to the public mempool to allow them to wait for lower gas prices.\n\nTo enable this feature, add the `useMempool` parameter to your Protect RPC URL:\n\n```url\nhttps://rpc.flashbots.net?useMempool=true\n```\n\nFor analytics or other purposes, you can also specify a custom mempool URL by adding the `mempoolRpc` parameter:\n\n```url\nhttps://rpc.flashbots.net?useMempool=true&mempoolRpc=https://your-custom-node-url\n```\n\nNote: If this setting is enabled, all cancellations will be immediately forwarded to the public mempool, regardless of if the transaction itself has been made public.\n\n### Reverted Transactions\n\nAllow reverted transactions by including the `canRevert` query parameter in your request. By default, Flashbots Protect does not land reverted transactions on chain to save users gas fees. You can override this feature to receive faster feedback about failing transactions.\n\n```url\nhttps://rpc.flashbots.net?canRevert=true\n```\n\n### Block range\n\nBy default we try to land transactions in the next 25 blocks. You can change this range by including the `blockRange` query parameter in your request.\n\n```url\nhttps://rpc.flashbots.net?blockRange=10\n```\n\n### Bundle Mode\n\nUse the Protect PRC in bundle mode to interactively construct a bundle of transactions that you want to be land together. This setting is typically used for whitehat rescues and you can find the complete documentation in the [Flashbots API docs](https://docs.flashbots.net/flashbots-protect/additional-documentation/bundle-cache).\n\nBundle mode has a few differences from the regular Protect experience:\n- Protect will not immediately attempt to land transactions sent in bundle mode. Instead, new transactions will be queued and kept in a pending state.\n- To send all pending transactions as a bundle, you must make a separate API request to Flashbots.\n- Querying the balance of an address in bundle mode will return a fake balance of 100 ETH.\n\n### Custom Read RPC\n\nUse a custom RPC endpoint for **read** requests by including the `url` query parameter in your request. **Write** requests (eg. `eth_sendRawTransaction`) will still be sent to the Protect RPC. This feature is recommended for wallets and applications with large volumes of read requests.\n\n```url\nhttps://rpc.flashbots.net?url=http://RPC-ENDPOINT.COM\n```\n\n### Auction timeout\n\nIf `auctionTimeout=T`, where `T` is the time in milliseconds, is specified, and a transaction arrives within `T` milliseconds of the end of the current slot, it will be scheduled for the next slot.\nThis ensures the transaction is processed at the beginning of the next slot, giving searchers the full slot duration to submit their bundles and backruns.\n\n```\nhttps://rpc.flashbots.net?auctionTimeout=3000\n```\n"
  },
  {
    "path": "docs/flashbots-protect/stuck_transactions.md",
    "content": "---\ntitle: Fixing Stuck Transactions\n---\n\nIf your transaction is stuck in a \"pending\" state or you have an extremely high nonce, you should clear your activity and nonce data in your MetaMask. This will cause Metamask to update the nonce and transaction history from the network. \n\n**Note**: Your funds and keys are safe during this process.\n\nTo reset your MetaMask account, follow these steps:\n\n1. Click the account icon on the top-right corner of MetaMask.\n2. Click \"Settings\".\n3. Click \"Advanced\".\n4. Scroll down and click “Clear activity tab data”.\n"
  },
  {
    "path": "docs/guide-send-tx-bundle.mdx",
    "content": "---\ntitle: Sending Tx and Bundles\n---\n\nFlashbots provides a variety of methods for submitting transactions and bundles. This guide is designed to help you understand these options and select the one that best fits your needs.\n\n## Understanding Relay and RPC Endpoints\n\nFlashbots offers two primary JSON-RPC endpoints on Ethereum Mainnet: `rpc.flashbots.net` and `relay.flashbots.net`.\n\n### `rpc.flashbots.net` - For Retail Users\n- **Purpose**: Designed specifically for retail users as a drop-in RPC replacement in their wallet.\n- **Features**: Provides MEV protection and MEV refunds for eligible transactions. Support all the regular [Ethereum JSON RPC methods](https://docs.infura.io/networks/ethereum/json-rpc-methods/) but not [Flashbots specific JSON RPC\nmethods](flashbots-auction/advanced/rpc-endpoint).\n- **Note**: Transactions are submitted through `eth_sendRawTransaction` to fit wallet RPC interface. Underneath, the endpoint uses `relay.flashbots.net` to submit transactions.\n\n### `relay.flashbots.net` - For Advanced Users\n- **Purpose**: Designed for advanced users, including searchers, applications, and Telegram bots. It accepts both transactions and bundles.\n- **Features**: Support all [Flashbots specific JSON RPC methods](flashbots-auction/advanced/rpc-endpoint). Does not support regular [Ethereum JSON RPC methods](https://docs.infura.io/networks/ethereum/json-rpc-methods/).\n- **Recommendation**: Ideal for activities beyond simple transaction submissions via wallets.\n\n## Choosing the Right JSON-RPC Method\n\nWith `relay.flashbots.net` identified as the go-to for advanced operations, the choice of JSON-RPC methods is as follows:\n\n- **For Single Transactions**: Use `eth_sendPrivateTransaction`.\n- **For Bundles of Transactions**:\n  - **Use**: `mev_sendBundle` for more flexibility and power, like leveraging the [new bundle format](flashbots-mev-share/searchers/understanding-bundles) and [MEV-Share](flashbots-mev-share/introduction).\n  - **Use**: `eth_sendBundle` if you want something simple and quick! The OG way of sending bundles.\n  - Both bundle APIs support [multiplexing to multiple builders](flashbots-auction/advanced/multiplexing).\n\n## Rate Limits\n\nIn order to protect our services from abuse we have rate limits on the number of requests that can be made.\n\n- [RPC rate limits for retail user transactions sent to](flashbots-protect/ratelimiting) `rpc.flashbots.net`\n- [Relay rate limits for advanced user bundles sent to](flashbots-mev-share/searchers/ratelimiting) `relay.flashbots.net`\n"
  },
  {
    "path": "docs/joining-flashbots.mdx",
    "content": "---\ntitle: Join Flashbots\n---\n\n### Interested in joining Flashbots?\nIf you are a self-directed individual who puts collective success above your own and are motivated by solving hard problems with asymmetric impact, you will fit right in.\n\n* [Open job positions](https://www.flashbots.net/jobs) - full-time roles we're actively recruiting for.\n* [Flashbots research fellowship](https://github.com/flashbots/mev-research/blob/main/grants.md) - we issue research grants to flashbots research proposals submitters. Find out more in our research repo.\n* Flashbots part-time contractor - become a part-time contractor in Flashbots and join one of our ongoing projects. Reach out to the team to learn more!\n* Nothing fits in the above? reach out at jobs@flashbots.net\n"
  },
  {
    "path": "docs/new-to-mev.mdx",
    "content": "---\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/08/ethereum-is-a-dark-forest/) by Dan Robinson & Georgios Konstantopoulos\n* [How to get Front-Run on Ethereum mainnet](https://youtu.be/UZ-NNd6yjFM) by Scott Bigelow\n* [Escaping the Dark Forest](https://samczsun.com/escaping-the-dark-forest/) by samczsun\n* [Frontrunning in DEXs, Miner Extractable Value, and Consensus Instability](https://youtu.be/vR1v7AQ8i3k) by Phil Daian at IEEE Symposium on Security and Privacy\n* [Flashbots: Frontrunning the MEV Crisis](https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752) by Flashbots\n* [ETHOnline - Phil & Georgios Talk Miner Extractable Value](https://youtu.be/tv0CkmcoGkM)\n* [Quantifying MEV: Introducing MEV-Explore v0](https://medium.com/flashbots/quantifying-mev-introducing-mev-explore-v0-5ccbee0f6d02) by Flashbots\n\nYou can check out a full list of MEV resources in our [Research Vault](https://github.com/flashbots/mev-research/blob/main/resources.md)\n"
  },
  {
    "path": "docs/policies/privacy.mdx",
    "content": "---\ntitle: Data Privacy Notice\n---\n\n## Flashbots Ltd.\n\n*Updated December 10, 2021*\n\nFlashbots Ltd. (the “**Company**”) is a company incorporated under the laws of the Cayman Islands.\n\nThe purpose of this document is to provide you with information on the Company's use of your personal data in accordance with the Cayman Islands Data Protection Act, 2017 and, in respect of any EU data subjects, the EU General Data Protection Regulation (together, the \"**Data Protection Legislation**\").  For individuals in California, please see California notices below.\n\nThe Company operates Flashbots Relay and receives information through its authentication process and through the Relay process (between a “**Transaction Submitter**” and a “**Transaction Acceptor**”).\n\nTo the extent that the Company receives personal information of individuals through Miner Authentication, this will affect you directly.  If you are an institutional or collective participant in Flashbots Relay that provides us with personal data on individuals connected to you for any reason in relation to your participation in the Flashbots Relay or through other communications including Discord, this will be relevant for those individuals and you should transmit this document to such individuals or otherwise advise them of its content.\n\n*Your personal data, if any, may  be processed by the Company, and by persons engaged by the Company.  Under the Data Protection Legislation, you have rights, and the Company has obligations, with respect to your personal data.  The purpose of this notice is to explain how and why the Company, and persons engaged by the Company, will use, store, share and otherwise process your personal data. This notice also sets out your rights under the Data Protection Legislation, and how you may exercise them.*\n\n### YOUR PERSONAL DATA\nBy virtue of being either a Transaction Submitter or a Transaction Acceptor (the “**Services**”),   (including the initial application and ongoing interactions with the Company and any affiliates and persons engaged by the Company) or by virtue of you otherwise providing us with personal information on individuals connected with you (for example directors, trustees, employees, representatives, shareholders, investors, clients, beneficial owners or agents), you may provide us with certain personal information which constitutes personal data within the meaning of the Data Protection Legislation.\n\nWe may also obtain personal data on you from other publicly accessible directories and sources. These may include websites; blockchains, bankruptcy registers; tax authorities; governmental agencies and departments, and regulatory authorities, to whom we have regulatory obligations; credit reference agencies; sanctions screening databases; and fraud prevention and detection agencies and organisations, including law enforcement.\n\nThis includes information relating to you and/or any individuals connected with you such as:  IP address, device information, geolocation, name, residential address, email address, contact details, corporate contact information, signature, nationality, place of birth, date of birth, tax identification, credit history, correspondence records, passport number, bank account details, source of funds details and details relating to your Relay activity.\n\n### HOW THE COMPANY MAY USE YOUR PERSONAL DATA\nThe Company, as the data controller, may collect, store and use your personal data for purposes including the following.\n\nThe processing that is necessary for the performance of Relay, if any, including:\n- administering or managing the Company;\n- performing Miner Authentication in connection with your involvement in the Relay project of the Company;\n- processing your Relay transaction, including failed transactions;\n- sending you  reports relating to your Relay transaction;\n- facilitating the continuation or termination of the contractual relationship between you and the Company; and\n- facilitating any transfer of funds, and administering and facilitating any other transaction, between you and the Company.\n\nThe processing may be necessary for compliance with applicable legal or regulatory obligations, including:\n- undertaking due diligence including anti-money laundering and counter-terrorist financing checks, including verifying the identity and addresses of Transaction Submitters or Transaction Acceptors (and, where applicable, their beneficial owners);\n- sanctions screening and complying with applicable sanctions and embargo legislation;\n- complying with requests from regulatory, governmental, tax and law enforcement authorities;\n- surveillance and investigation activities;\n- carrying out audit checks, and instructing our auditors;\n- maintaining statutory registers; and\n- preventing and detecting fraud.\n\nIn pursuance of our legitimate interests, or those of a third party to whom your personal data are disclosed, including:\n- complying with a legal, tax, accounting or regulatory obligation to which we or the third party are subject;\n- assessing and processing requests you make;\n- sending updates, information and notices or otherwise corresponding with you in connection with your participation  in the Relay;\n- investigating any complaints, or pursuing or defending any claims, proceedings or disputes;\n- providing you with, and informing you about investment products and services;\n- managing our risk and operations;\n- complying with audit requirements;\n- ensuring internal compliance with our policies and procedures;\n- protecting the Company against fraud, breach of confidence or theft of proprietary materials;\n- seeking professional advice, including legal advice;\n- facilitating business asset transactions involving the Company or related entities;\n- monitoring communications to/from us (where permitted by law); and\n- protecting the security and integrity of our IT systems.\n\nWe will only process your personal data in pursuance of our legitimate interests where we have considered that the processing is necessary and, on balance, our legitimate interests are not overridden by your legitimate interests, rights or freedoms.\n\nThe Company continues to be a data controller even if it has engaged other third parties to perform certain activities on the Company's behalf.\n\n### SHARING YOUR PERSONAL DATA\n\nWe may share your personal data with our affiliates and delegates. In certain circumstances we may be legally obliged to share your personal data and other financial information with respect to your Relay transaction with relevant regulatory authorities such as the Cayman Islands Monetary Authority or the Tax Information Authority. They, in turn, may exchange this information with foreign authorities, including tax authorities and other applicable regulatory authorities.\n\nThe Company’s affiliates and delegates may process your personal data on the Company's behalf, including with our banks, accountants, auditors and lawyers which may be data controllers in their own right.  The Company's services providers are generally processors acting on the instructions of the Company. Additionally, a service provider may use your personal data where this is necessary for compliance with a legal obligation to which it is directly subject (for example, to comply with applicable law in the area of anti-money laundering and counter terrorist financing or where mandated by a court order or regulatory sanction). The service provider, in respect of this specific use of personal data, may be deemed to be acting as a data controller.\n\nIn exceptional circumstances, and to the extent possible after notice to you, we will share your Personal Data with regulatory, prosecuting and other governmental agencies or departments, and parties to litigation (whether pending or threatened) in any country or territory.\n\n### SENDING YOUR PERSONAL DATA INTERNATIONALLY\n\nDue to the international nature of our business, your personal data may be transferred to jurisdictions that do not offer equivalent protection of personal data as under the Data Protection Legislation. In such cases, we will process personal data or procure that it be processed in accordance with the requirements of the Data Protection Legislation, which may include having appropriate contractual undertakings in legal agreements with service providers who process personal data on our behalf.\n\n### RETENTION AND DELETION OF YOUR PERSONAL DATA\n\nWe will keep your personal data for as long as it is required by us in connection with a single Relay transaction. For example, we may require it for our legitimate business purposes, to perform our contractual obligations, or where law or regulation obliges us to. We will generally retain your personal data throughout the lifecycle of the specific Relay transaction  you are involved in. Some personal data will be retained after your relationship with us ends. We expect to delete your personal data (at the latest) once there is no longer any legal or regulatory requirement or legitimate business purpose for retaining your personal data.\n\n### AUTOMATED DECISION-MAKING\n\nWe will not take decisions producing legal effects concerning you, or otherwise significantly affecting you, based solely on automated processing of your personal data, unless we have considered the proposed processing in a particular case and concluded in writing that it meets the applicable requirements under the Data Protection Legislation.\n\n### YOUR RIGHTS\n\nYou have certain data protection rights, including the right to:\n- be informed about the purposes for which your personal data are processed;\n- access your personal data;\n- stop direct marketing;\n- restrict the processing of your personal data;\n- have incomplete or inaccurate personal data corrected;\n- ask us to stop processing your personal data;\nbe informed of a personal data breach (unless the breach is unlikely to be prejudicial to you);\n- complain to the Data Protection Ombudsman; and\n- require us to delete your personal data in some limited circumstances.\n\n### CONTACT US\n\nWe are committed to processing your personal data lawfully and to respecting your data protection rights. Please contact us if you have any questions about this notice or the personal data we hold about you. Our contact details are:  legal@flashbots.net, marking your communication \"Data Protection Enquiry\".\n\n### LEGAL DISCLOSURES REQUIRED BY THE STATE OF CALIFORNIA UNITED STATES INFORMATION FROM CHILDREN UNDER THIRTEEN (AKA THE “DINESH” CLAUSE)\n\nWe do not knowingly collect information online from children under 13. If you are a parent or guardian and you learn that your children have provided Flashbots with Personal Information, please contact us. If we become aware that  Personal Information has been collected from a child under age 13 without verification of parental consent, we will take steps to remove that information from our servers.\n\n### CALIFORNIA PRIVACY RIGHTS\n\nKeep in mind we do not use personal information for marketing, whether by ourselves or by others.\n\nPursuant to Section 1798.83 of the California Civil Code, residents of California have the right to request from a business, with whom the California resident has an established business relationship, information with respect to the types of personal information the business shares with third parties for direct marketing purposes by such third party\nand the identities of the third parties with whom the business has shared such information during the immediately preceding calendar year.  Flashbots does not share information with third parties for direct marketing purposes.\n\nTo request a copy of the information disclosure pursuant to Section 1798.83 of the California Civil Code, please contact legal@flashbots.net.\n\n### CHANGES TO THIS POLICY\n\nThe Company may revise this Privacy Policy from time to time. If we make a change to this policy that, in our sole discretion, is material, we will take steps to notify all users by a notice on the site. By continuing to access or use the Services after those changes become effective, you agree to be bound by the revised Privacy Policy.\n\n\n### CONTACT\n\nIf you have questions about this Privacy Policy, you can contact us by email at legal@flashbots.net.\n"
  },
  {
    "path": "docs/policies/prohibited-use-policy.mdx",
    "content": "---\ntitle: Prohibited Use Policy\n---\n\n## Flashbots Ltd.\n*Updated July 6, 2023*\n\nUsers of the Flashbots Services may not use the Flashbots Services or Flashbots webpages or social media pages managed by FLASHBOTS (the “Flashbots Sites”) to engage in the following activities:\n\nUnlawful Activity: Activity which would violate, or assist in violation of, any law, statute, ordinance, regulation, or sanctions programs administered in the countries where Flashbots Services are used, including but not limited to the U.S. Department of Treasury's Office of Foreign Assets Control (\"OFAC\") and the United Kingdom’s Office of Financial Sanctions Implementation (“OFSI”), or which would involve proceeds of any unlawful activity; publishing, distributing or disseminating any unlawful material or information; misrepresentation; hacks; transaction manipulation (including, e.g., frontrunning a transaction, time bandit attacks, or similar activities); theft; deceit; or unlawful or unregistered sales or offerings of securities.\n\nAbusive Activity: Actions which impose an unreasonable or disproportionately large load on Flashbots Services infrastructure, or detrimentally interfere with, intercept, or expropriate any system, data, or information; transmit or upload any material to the Flashbots Sites that contains viruses, trojan horses, worms, or any other harmful or deleterious programs; attempt to gain unauthorized access to Flashbots Services, Flashbots Sites, computer systems or networks connected to FLASHBOTS; use information of another party to access or use the Flashbots Services; or transfer your access or rights to any Flashbots Service to a third party, unless by operation of law or with the express permission of FLASHBOTS.\n\nAbuse Other Users: Interfere with another individual’s or entity’s access to or use of any Flashbots Services; defame, discriminate, abuse, extort, harass, stalk, threaten or otherwise violate or infringe the legal rights (such as, but not limited to, rights of privacy, publicity and intellectual property) of others; harvest or otherwise collect information from the Flashbots Sites about others, including without limitation email addresses, without proper consent; or use Flashbots Services or Flashbots Sites in connection with surveys, contests, pyramid schemes, chain letters, junk email, spamming, or any duplicative or unsolicited messages (commercial or otherwise). \n\nFraud: Activity which operates to defraud FLASHBOTS, Flashbots Services users, or any other person; provide any false, inaccurate, or misleading information to FLASHBOTS.\n"
  },
  {
    "path": "docs/policies/terms-of-service.mdx",
    "content": "---\ntitle: Terms of Service\n---\n\n## Flashbots Ltd.\n*Updated July 6, 2023*\n\n### ACCEPTANCE OF TERMS\n\nBY ACCESSING ANY SERVICES PROVIDED BY FLASHBOTS LTD. (**“FLASHBOTS”**) OR FLASHBOTS SITES, AS DEFINED BELOW, YOU AGREE TO THESE  TERMS OF SERVICE, [THE FLASHBOTS POLICIES](/policies/terms-of-service#flashbots-policies-appendix), AND THE [PRIVACY POLICY](/policies/privacy#contact) AS GOVERNING TO YOUR USE OF THE FLASHBOTS SERVICES AND FLASHBOTS SITES. IF YOU ARE ENTERING INTO OR ACCEPTING THESE TERMS ON BEHALF OF A LEGAL ENTITY, YOU REPRESENT AND WARRANT THAT YOU HAVE THE RIGHT, AUTHORITY AND CAPACITY TO BIND SUCH ENTITY AND ITS AFFILIATES TO THESE TERMS, IN WHICH CASE, REFERENCES TO “YOU\" SHALL REFER TO SUCH ENTITY AND ITS AFFILIATES. IF YOU DO NOT HAVE SUCH AUTHORITY, OR IF YOU DO NOT AGREE TO BE BOUND BY ALL OF THE PROVISIONS OF THESE TERMS, DO NOT ACCESS OR USE FLASHBOTS SERVICES.\nTHIS AGREEMENT IS SUBJECT TO BINDING ARBITRATION AND A WAIVER OF CLASS ACTION RIGHTS.\n\nFLASHBOTS provides certain software, as set forth in [FLASHBOTS’ Github repository](https://github.com/flashbots), as well as other related software that FLASHBOTS may provide from time to time, (each program, a “**Software Program**” and collectively, the “**Software Programs**”) to Ethereum Network node operators, wallet and application providers, block builders, block searchers, and other participants (the “**Users**”).\n\nThe Software Programs are provided under a separate open-source license, which means that anyone can use, copy, modify, or distribute them. As such, FLASHBOTS, its affiliates, and any of their respective officers, members, owners, employees, or agents (such parties, in their individual and collective capacities, the “Flashbots Parties”) are not responsible for the operation of the Software Programs and make no guarantees regarding their security, functionality, or availability. In the event of a conflict between these Terms of Service and any separate license, the separate license will prevail with respect to the subject thereof.\n\nFLASHBOTS also provides certain content, including research and product information, functionality and features, as further described on [FLASHBOTS’ website](/), as well as FLASHBOTS related websites and other social media pages (the “Flashbots Sites”) and such other related services that FLASHBOTS may provide from time to time, including without limitation security, configuration, and other technical support services (each, a “Flashbots Service” and collectively, the “**Flashbots Services**”).  \nThe Flashbots Services are subject to the following terms of service (“**Terms of Service**” or “**ToS**”). FLASHBOTS reserves the right to update these ToS at any time without notice to You. If You do not agree with the terms of the updated ToS, Your sole and exclusive remedy is to terminate Your use of Flashbots Services.\n\nFLASHBOTS shall have the right at any time to change or discontinue any aspect or feature of the Flashbots Services, including, but not limited to, content, access, or use.\n\n### ELIGIBILITY\n\nYou represent and warrant that You are at least 18 years of age or the age of majority in Your state or jurisdiction of residence, whichever is greater; that You are capable of entering into a legally binding agreement; and that You reside in a jurisdiction where Your use of the Flashbots Services is lawful. Your right to use the Flashbots Services is conditioned upon Your acceptance and compliance with these ToS. If You do not agree to be bound by the terms and conditions set forth in these ToS, You are not authorized to use the Flashbots Services and You agree to immediately discontinue any access to or use of the Flashbots Services.\n\nIn addition, You represent to FLASHBOTS that You, Your digital currency addresses, and Your financial institutions, or any party that owns or controls You, Your digital currency addresses or Your financial institutions, are (1) not subject to sanctions or otherwise designated on any list of prohibited or restricted parties, including but not limited to the lists maintained by  the U.S. Government (i.e., the Specially Designated Nationals List and Foreign Sanctions Evaders List of the U.S. Department of Treasury and the Entity List of the U.S. Department of Commerce), the ,the United Kingdom, or other applicable government authority and (2) not located in  or attempting to use Flashbots Services from any country subject to a comprehensive sanctions program implemented by the United States or the United Kingdom.\n\n### SCOPE OF USE\n\nThese Terms of Service cover all use of the Flashbots Services, regardless of how any Flashbots Service is accessed, and regardless of which device is used for access.\n\n### ONBOARDING\n\nPrior to using any Flashbots Service, You may be required to complete onboarding steps, such as personal verification. In addition, FLASHBOTS reserves the right to require additional documentation and procedures to verify Your identity and/or control of any associated digital wallets.\n\n### AVAILABILITY\n\nFLASHBOTS does not represent that any of the Flashbots Services will be available without interruption or for any particular duration, and the Flashbots Parties shall not be responsible for any losses, damages, costs, expenses, lost opportunities, or other harm suffered by You in connection with interruption or termination of any Flashbots Service. YOU SHOULD READ THE LIMITATION OF LIABILITY HEREIN, WHICH INCLUDES LIMITATIONS ON THE FLASHBOTS’ PARTIES AND OTHER THIRD PARTIES’ POTENTIAL LIABILITY FOR ANY SUCH SERVICE INTERRUPTIONS.\n\n### ACKNOWLEDGMENT OF RISK\n\nYou acknowledge that the underlying blockchain technologies involved in using any Flashbots Service are novel, technically complex, and involve inherent risks, with or without the use of any Software Program. You bear all risk of loss from Your use of any Flashbots Service. The Flashbots Parties shall have no liability for fluctuations in the value of any cryptocurrency, transaction, or any bundle of transactions, whether requested or provided.\n\nYou acknowledge that although FLASHBOTS is constantly improving its security measures against security breaches that might result in the loss or corruption of data, the Flashbots Parties and FLASHBOTS’ third-party partners shall not be responsible for the operation of any Flashbots Service or Software Program and shall not be liable to You or any other Users for any damage caused by such loss or corruption of data. You understand that the Software Program and other protocol upgrades may inadvertently contain bugs or security vulnerabilities that may result in loss of functionality and ultimately funds.\n\nYou acknowledge that the Flashbots Services involve novel technological innovations. Results depend on a multiplicity of factors beyond the control of FLASHBOTS, including but not limited to network health, congestion, latency, incentives, user configuration settings, operation of third party software or hardware, wallet compatibility, protocol upgrades or forks, the activities of searchers, block builders, producers, etc. Therefore, the outcomes cannot be predicted, and no representations or warranties are made with respect to the Flashbots Services. OUTCOMES ARE NOT GUARANTEED. You agree that the Flashbots Parties are not responsible for the regulatory status or treatment in any jurisdiction of any digital assets that You may access or transact with using the Flashbots Services. \n\nYour participation in the Flashbots Services involves the use of sophisticated hardware and software. The Flashbots Parties will not be liable or responsible to You, nor be deemed to have defaulted or breached these Terms of Service, for any failure or delay in our performance under these Terms of Service when and to the extent such failure or delay is caused by or results from acts or circumstances beyond our reasonable control and/or from the hardware used in the Flashbots Service, including, without limitation, acts of God, cyberattack or ransomware, flood, fire, earthquake, explosion, governmental actions, war, invasion or hostilities (whether war is declared or, terrorist threats or acts, riot or other civil unrest, national emergency, revolution, insurrection, epidemic, pandemic, lockouts, strikes or other labor disputes (whether or not relating to our workforce), or restraints or delays affecting carriers or inability or delay in obtaining supplies of adequate or suitable materials, telecommunication or third party service provider breakdown, interruption or unavailability, electrical disruptions, or power outage.\n\nYou represent that You have the technical and financial knowledge, experience, and wherewithal to understand and undertake these risks.\n\n### USE OF FLASHBOTS SERVICES\n\nYou agree to use the Flashbots Services for lawful purposes only, and solely in a manner consistent with the intent of FLASHBOTS as described in these Terms of Service including without limitation, the Flashbots Policies, as updated from time to time.\n\nYou agree that You shall not upload, or otherwise make available, files that contain images, photographs, software, or other material protected by intellectual property laws, including, by way of example, and not as limitation, copyright or trademark laws (or by rights of privacy or publicity) unless You own or control the rights thereto or have received all necessary consent to do the same, use any material or information, including images or photographs, which are made available through the Flashbots Service in any manner that infringes any copyright, trademark, patent, trade secret, or other proprietary right of any party, upload files that contain viruses, Trojan horses, worms, time bombs, cancelbots, corrupted files, or any other similar software or programs that may damage the operation of another’s computer or damage the property of another, falsify or delete any copyright management information such as author attributions, watermarks, legal or other proper notices or proprietary designations or labels of the origin or source of software or other material contained in a file that is uploaded, violate any code of conduct or other guidelines that may be applicable, harvest or otherwise collect information about others, including personal information or personal data. You shall be solely liable for any damage resulting from any unlawful, wrongful, deceitful or other act, or from infringement of copyrights, proprietary rights, or any other harm resulting from such an act. The foregoing provisions of this section are for the benefit of the Flashbots Parties,(including but not limited to FLASHBOTS’s third-party service and content providers) and licensors, and each shall have the right to assert and enforce such provisions directly or on its own behalf.\n\nAlways use caution when giving out any personally identifiable information in any service. The Flashbots Parties do not control or endorse the third-party content, messages, or information found in the Flashbots Service. The Flashbots Parties disclaim any liability with regards to the Flashbots Service, and any actions resulting from Your participation in the Flashbots Service.\n\nFLASHBOTS reserves the right to not admit You or other Users to any Flashbots Service, or otherwise restrict access to any Flashbots Service, without any reason or cause. In addition, excessive application program interface (“API”) requests may result in the temporary or permanent suspension of Your access to a Flashbots Service.\n\nYou agree that the Flashbots Parties have  no responsibility for other Users’ use of the Flashbots Services and shall not be responsible to You to the extent that any security, configuration or technical support services that it may provide to other Users in connection with the Flashbots Services impacts Your use of the Flashbots Services.\n\nIn the event any or all of the Flashbots Services are permanently or temporarily terminated, FLASHBOTS shall re-start services at its sole discretion as to timing and as to approach; in such event no resumption of service is promised or warranted.\n\n### YOUR RESPONSIBILITIES\n\nUse: You are responsible for all activities that occur with respect to Your use of the Flashbots Services, regardless of whether the activities are authorized by You or undertaken by You, Your employees or a third party (including but not limited to Your contractors, agents and other users), and (b) The Flashbots Parties are not responsible for unauthorized access to the Flashbots Services, including any access that occurred as a result of fraud, phishing, or other criminal activity perpetrated against You by third parties. \n\nSecurity, Configuration and Backup: You are solely responsible for properly configuring and using the Flashbots Services and otherwise taking appropriate action to secure, protect, and backup Your data and Your customers’ data, as applicable, in a manner that will provide appropriate security and protection.  \n\nIf You cannot or do not want to take such actions to ensure security and protection, then You should not use the Flashbots Services.  Your obligations under this Agreement include ensuring any available software updates or upgrades relating to any Flashbots Service You are using are promptly installed or implemented and managing Your secure access to Your use of the Flashbots Services.\n\nAPI Authentication: To the extent we provide You with API authentication generated by a Flashbots Service or similar credentials, such API authentication and similar credentials are for Your use only and You will not sell, transfer, or sublicense them to any other entity or person, except that You may disclose Your private key to Your agents and subcontractors performing work on Your behalf.\n\n### LICENSE GRANT FROM FLASHBOTS\n\nFLASHBOTS hereby grants You a single, revocable, non-exclusive, non-transferable, and limited license, personal to You, to access and use the Flashbots Services and no other rights under this Terms of Use, including related intellectual property rights. This license grant is conditioned on Your acceptance and adherence to these Terms of Service.\n\n### LICENSE GRANT TO FLASHBOTS\n\nUnless otherwise agreed upon by You and FLASHBOTS, Your transaction, transaction bundle, or blocks of transactions (Your “Protected Data”) will be treated as proprietary and confidential to the extent not published to a public blockchain or other public record by virtue of the operation of such networks. You hereby grant FLASHBOTS a limited, non-exclusive license to use, adapt, or reproduce Your Protected Data for purely internal purposes, such as improvement of the Flashbots Service; as part of an anonymized, aggregated data set; to derive and publish system performance metrics and logs; or otherwise consistent with the purposes for which such information was disclosed to FLASHBOTS.\n\n### TAXES & FEES\n\nFLASHBOTS does not charge any fee for the use of Flashbots Services; however, FLASHBOTS reserves the right to charge a fee in connection with Your use of the Flashbots Service. In the event FLASHBOTS chooses to charge a fee, it will be published in advance on GitHub and other Flashbots Sites including the FLASHBOTS official Discord channel. Flashbots does not collect or deduct any taxes, levies, duties, or similar governmental assessments of any nature, accessible by any jurisdiction whatsoever (collectively, \"Taxes\"). You are responsible for determining whether any Taxes may apply to Your use of the Flashbots Service, or any activity You undertake in connection with such use, and it is Your responsibility to report and remit the relevant Taxes to the appropriate taxing authorities. You agree that the Flashbots Parties are  not responsible for determining whether any Taxes apply, or the amount of any Taxes that may apply, to the Flashbots Service.\n\n### NO INVESTMENT ADVICE OR RECOMMENDATIONS\n\nNothing contained in the Flashbots Services or any other content on the Flashbots Sites constitutes a solicitation, recommendation, endorsement, or offer by FLASHBOTS to buy or sell any digital asset or other financial instruments..\n\nYou alone assume the sole responsibility of evaluating the merits and risks associated with the use of the Flashbots Services or any related service before making any decisions based on information we provide to You, such as information made available though application program interfaces (APIs). In exchange for using the Flashbots Service, You agree not to hold the Flashbots Parties (including, without limitation, third party service and content providers and licensors liable for any possible claim for damages arising from any decision You make based on information made available to You through any of the Flashbots Services.\n\n### CERTAIN INFORMATION MADE AVAILABLE BY FLASHBOTS\n\nFLASHBOTS may make available to You certain public data and other information (including, without limitation, information derived from public blockchain records, system logs, and other operational metrics), including information that we obtain from our agents, including but not limited to partners, vendors, and infrastructure providers. FLASHBOTS makes this information available to You as a service for Your convenience; the Flashbots Parties neither endorse nor approve any such information. The Flashbots Parties neither (1) guarantee the accuracy, timeliness, or completeness of any such information, nor (2) warrant any results from Your use or reliance on such information. You agree that You use any such information at Your own risk. \n\n### DISCLAIMER\n\nYOU EXPRESSLY AGREE THAT USE OF THE FLASHBOTS SERVICES IS AT YOUR SOLE RISK. NEITHER THE FLASHBOTS PARTIES NOR  ITS LICENSORS WILL BE LIABLE FOR ANY USE OR MISUSE OF THE FLASHBOTS SERVICES, WHETHER THAT USE IS BY THE FLASHBOTS PARTIES, YOU, OR A THIRD PARTY. NEITHER THE FLASHBOTS PARTIES NOR ITS LICENSORS WARRANT THAT THE FLASHBOTS SERVICES WILL BE UNINTERRUPTED OR ERROR FREE; NOR DO THEY MAKE ANY WARRANTY AS TO THE RESULTS THAT MAY BE OBTAINED FROM USE OF THE FLASHBOTS SERVICES, OR AS TO THE ACCURACY, RELIABILITY OR CONTENT OF ANY INFORMATION, SERVICE, MATERIALS, OR MERCHANDISE PROVIDED THROUGH THE FLASHBOTS SERVICES. THE FLASHBOTS SERVICES ARE PROVIDED ON AN “AS IS” BASIS WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF TITLE, IMPLIED WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE, OTHER THAN THOSE WARRANTIES THAT ARE BOTH (I) IMPLIED BY LAW AND (II) INCAPABLE OF EXCLUSION, RESTRICTION OR MODIFICATION, UNDER LAWS APPLICABLE TO THESE TERMS OF SERVICE.\n\nWITHOUT LIMITING THE FOREGOING, THIS DISCLAIMER OF LIABILITY APPLIES TO ANY DAMAGES OR INJURY CAUSED BY ANY FAILURE OF PERFORMANCE, ERROR, OMISSION, INTERRUPTION, DELETION, DEFECT, DELAY IN OPERATION OR TRANSMISSION, COMPUTER VIRUS, COMMUNICATION LINE FAILURE, THEFT OR DESTRUCTION, OR UNAUTHORIZED ACCESS TO, ALTERATION OF, OR USE OF, THE FLASHBOTS SERVICES AND ANY MATERIALS OR CONTENT FOUND THEREIN, WHETHER FOR BREACH OF CONTRACT, TORTIOUS BEHAVIOR, NEGLIGENCE, OR UNDER ANY OTHER CAUSE OF ACTION.\n\nYOU ACKNOWLEDGE THAT FLASHBOTS PARTIES ARE NOT LIABLE FOR THE DEFAMATORY, OFFENSIVE, OR ILLEGAL CONDUCT OF OTHER USERS, AND THAT YOU ALONE ARE ASSUMING THE RISK OF INJURY FROM THE FOREGOING, TO THE FULLEST EXTENT OF THE LAW. IN NO EVENT WILL THE FLASHBOTS PARTIES, , ITS LICENSORS OR ANY OTHER PERSON OR ENTITY INVOLVED IN CREATING, PRODUCING OR PROVIDING THE FLASHBOTS SERVICES OR THE SOFTWARE PROGRAMS, BE LIABLE FOR ANY DAMAGES, INCLUDING, WITHOUT LIMITATION, DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR PUNITIVE DAMAGES ARISING OUT OF THE USE OF OR INABILITY TO USE THE FLASHBOTS SERVICES. IN ADDITION TO THE TERMS SET FORTH ABOVE, NEITHER THE FLASHBOTS PARTIES , NOR FLASHBOTS’ INFORMATION PROVIDERS, OR CONTENT PARTNERS, SHALL BE LIABLE REGARDLESS OF THE CAUSE OR DURATION, FOR ANY ERRORS, INACCURACIES, OMISSIONS, OR OTHER DEFECTS IN, OR UNTIMELINESS OR UNAUTHENTICITY OF, THE INFORMATION CONTAINED WITHIN THE FLASHBOTS SERVICES, OR FOR ANY DELAY OR INTERRUPTION IN THE TRANSMISSION THEREOF TO YOU, OR FOR ANY CLAIMS OR LOSSES ARISING THEREFROM OR OCCASIONED THEREBY. THE FLASHBOTS PARTIES SHALL NOT BE LIABLE FOR ANY THIRD-PARTY CLAIMS OR LOSSES OF ANY NATURE, INCLUDING, BUT NOT LIMITED TO, LOST PROFITS, PUNITIVE OR CONSEQUENTIAL DAMAGES.\n\nFLASHBOTS RESERVES THE RIGHT TO MAKE CHANGES AND CORRECTIONS TO THE FLASHBOTS SERVICES, THESE TERMS OF SERVICE AND THE FLASHBOTS POLICIES AT ANY TIME, WITHOUT NOTICE. THE INFORMATION PROVIDED THROUGH THE FLASHBOTS SERVICES IS PROVIDED “AS IS” AND “AS AVAILABLE.” FLASHBOTS DOES NOT WARRANT, AND AFFIRMATIVELY DISCLAIMS, ANY AND ALL WARRANTIES REGARDING, THE ACCURACY, COMPLETENESS OR TIMELINESS OF INFORMATION, TEXT, GRAPHICS, LINKS OR OTHER ITEMS CONTAINED IN THE FLASHBOTS SERVICES. FLASHBOTS PROVIDES NO GUARANTEE AGAINST THE POSSIBILITY OF DELETION, MIS-DELIVERY OR FAILURE TO STORE COMMUNICATIONS, PERSONALIZED SETTINGS, OR OTHER DATA. FLASHBOTS EXPRESSLY DISCLAIMS ALL LIABILITY FOR ERRORS OR OMISSIONS IN, OR THE MISUSE OR MISINTERPRETATION OF, ANY INFORMATION CONTAINED IN THE FLASHBOTS SERVICES OR THE OPERATION THEREOF. FLASHBOTS MAY CHANGE INFORMATION CONTAINED IN THE FLASHBOTS SERVICES AT ANY TIME AND MAKES NO COMMITMENT TO UPDATE THE INFORMATION CONTAINED THEREIN. YOU ASSUME THE ENTIRE RISK AS TO THE USE OF THE FLASHBOTS SERVICES.\n\nANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF FLASHBOTS SERVICES IS DONE AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER OR OTHER ELECTRONIC SYSTEM OR LOSS OF DATA THAT RESULTS FROM THE DOWNLOAD OF ANY SUCH MATERIAL. NO ADVICE OR INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED BY YOU THROUGH OR FROM THE FLASHBOTS SERVICES, WILL CREATE ANY WARRANTY NOT EXPRESSLY STATED IN THESE TERMS.\n\n### LIMITATION OF LIABILITY\n\nIN NO EVENT SHALL FLASHBOTS PARTIES BE LIABLE FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER, EVEN IF ANY OF THE FLASHBOTS PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, RESULTING FROM LOSS FROM YOUR: (I) INABILITY TO USE, (II) USE, AND/OR (III) MISUSE OF, DATA; NOR SHALL THE FLASHBOTS PARTIES BE LIABLE FOR ANY LOSS OF PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE FLASHBOTS SERVICE, DOCUMENTS, PROVISION OF OR FAILURE TO PROVIDE SERVICES, OR INFORMATION AVAILABLE RELATED TO THE FLASHBOTS SERVICE. \n\nIN NO EVENT WILL THE FLASHBOTS PARTIES BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY TORT, CONTRACT OR ANY OTHER LIABILITY ARISING IN CONNECTION WITH THE USE OF THE FLASHBOTS SERVICE, OR RELIANCE ON ANY INFORMATION OR SERVICES PROVIDED BY FLASHBOTS. THE FLASHBOTS PARTIES WILL UNDER NO CIRCUMSTANCES BE LIABLE TO YOU AND/OR ANY THIRD PARTY, REGARDLESS OF THE FORM OF ACTION, FOR ANY LOSS OF PROFITS, GOODWILL, USE, DATA OR OTHER INTANGIBLE LOSSES, OR ANY DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES WHATSOEVER, EVEN IF ANY OF THE FLASHBOTS PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES RESULTING FROM: (I) THE USE OR THE INABILITY TO USE THE FLASHBOTS SERVICE; (II) THE TIMELINESS, DELETION, MISDELIVERY, OR FAILURE TO STORE ANY USER DATA, COMMUNICATIONS OR PERSONALIZATION SETTINGS; (III) THE COST OF GETTING SUBSTITUTE SERVICES RESULTING FROM ANY PRODUCTS, DATA, INFORMATION OR SERVICES PURCHASED OR OBTAINED OR MESSAGES RECEIVED OR TRANSACTIONS ENTERED INTO, THROUGH OR FROM THE FLASHBOTS SERVICE; (IV) UNAUTHORIZED ACCESS TO OR ALTERATION OF YOUR TRANSMISSIONS OR DATA; (V) STATEMENTS OR CONDUCT OF ANYONE ON THE FLASHBOTS SERVICE; (VI) THE USE, INABILITY TO USE, UNAUTHORIZED USE, PERFORMANCE OR NON-PERFORMANCE OF ANY THIRD PARTY, EVEN IF THE THIRD PARTY HAS BEEN ADVISED PREVIOUSLY OF THE POSSIBILITY OF SUCH DAMAGES; OR (VII) ANY OTHER MATTER RELATING TO THE FLASHBOTS SERVICE. YOU AGREE THAT YOU WILL NOT IN ANY WAY HOLD THE FLASHBOTS PARTIES RESPONSIBLE FOR ANY SELECTION OR RETENTION OF, OR THE ACTS OR OMISSIONS OF, THIRD PARTIES IN CONNECTION WITH THE FLASHBOTS SERVICE.\n\nBecause some jurisdictions may prohibit limitations of liability for consequential or incidental damages, in such jurisdictions the limitation of liability only with respect to consequential or incidental damages may not apply to You, and the respective liability of the Flashbots Parties shall be limited to the greatest extent allowable under applicable law in those states.\n\nIn the event that a court or arbitration panel, as the case may be, should hold that the limitations of liabilities or remedies available as set forth in this Agreement, or any portions thereof, are unenforceable for any reason, or that any of Your remedies under these Terms of Service fail, then You expressly agree that under no circumstances will the total, aggregate liability of the Flashbots Parties  to You or any party claiming by or through You for any cause whatsoever, exceed $100 (U.S.), regardless of the form of action and whether in contract, statute, tort or otherwise.\n\n### LINKS TO THIRD-PARTY SITES\n\nLinks found in the Flashbots Services or Flashbots Sites may let you leave the Flashbots Services to enter other sites. You acknowledge that such linked sites are not under the control of FLASHBOTS, and the Flashbots Parties are not responsible for the contents of any linked site or any link contained in a linked site, or any changes or updates to such sites. The Flashbots Parties are not responsible for any form of transmission received from any linked site. FLASHBOTS is providing these links to you only as a convenience, and the inclusion of any link does not imply endorsement of the site by FLASHBOTS. Once you transfer to another site, you are subject to their terms of use, privacy policy and cookie policy, if any.\n\n### INDEMNIFICATION\n\nYou agree to defend, indemnify and hold harmless the Flashbots Parties from and against all federal, state, and international claims, demands, losses, costs, and/or expenses, including attorneys’ fees, arising out of the use of the Flashbots Services by You.  By way of clarification and not limitation, you acknowledge that this indemnification applies to each of the Flashbots Parties.\n\n### TERMINATION\n\nFLASHBOTS reserves the right to terminate Your access to the Flashbots Services at any time, without notice, for any reason whatsoever, including without limitation, violation of these ToS or the FLASHBOTS POLICIES, or conduct that FLASHBOTS, in its sole discretion, considers to be unacceptable.\n\nYou agree that the Flashbots Parties will not be liable to You or to any third party for any such termination or any suspension, or modification of Your access to the Flashbots Services.\n\nThese Terms of Service shall survive the termination of Your access to the Flashbots Services to the full extent necessary for their enforcement and for the protection of the party in whose favor they operate.\n\n### TRADEMARKS\n\nYou will not use any trademarks, service marks, service or trade names, logos, and other designations of Flashbots Parties that we may make available to You or on the Flashbots Sites unless You first obtain our written consent. \n\n### NOTICE\n\nTo You: FLASHBOTS may provide any notice to You under this ToS using commercially reasonable means, including: (i) posting a notice on the Flashbots Sites; (ii) sending a direct message to Your email address or social media account; (iii) posting the notice in the interface of the applicable Flashbots Service, if applicable; or (iv) using public communication channels. Notices we provide by posting on the Flashbots Sites or using public communication channels will be effective upon posting, and notices we provide by direct message will be effective when we send the message. It is Your responsibility to keep Your email and social media contact information current to the extent You use them to communicate with FLASHBOTS. You will be deemed to have received any direct message then associated with Your use of Flashbots Services or Flashbots Sites, whether or not You actually receive the direct message.\n\nTo Us: To give FLASHBOTS notice under these ToS, You must contact FLASHBOTS by email at legal@flashbots.net.  For support inquiries, You may contact FLASHBOTS by info@flashbots.net.\n\n### CHOICE OF LAW\n\nThese Terms of Service and any access or use of the Flashbots Services are governed by and construed in accordance with the laws of the Cayman Islands, excluding that body of laws pertaining to conflict of laws. If any provision of these Terms of Service is determined by a competent court of law to be illegal or unenforceable, such provision will be enforced to the maximum extent possible and the other provisions will remain effective and enforceable.\n\n### DISPUTE RESOLUTION\n\nTHIS SECTION MAY SIGNIFICANTLY AFFECT YOUR LEGAL RIGHTS.  BY AGREEING TO THESE TERMS OF SERVICE YOU WAIVE ANY RIGHT TO TRIAL BY JURY AND A WAIVER OF CLASS ACTIONS.\n\nAny dispute, controversy or claim arising out of or relating to these Terms of Service, including the formation, interpretation, breach or termination thereof, including whether the claims asserted are arbitrable, will be referred to and finally determined by arbitration in accordance with the JAMS International Arbitration Rules. The Tribunal will consist of one arbitrator. The place of arbitration will be London, United Kingdom. The language to be used in the arbitral proceedings will be English. Judgment upon the award rendered by the arbitrator(s) may be entered in any court having jurisdiction thereof.  Unless otherwise agreed in writing between the parties, the arbitration shall be administered by the JAMS in accordance with JAMS International Arbitration Rules,  The arbitrator shall apply the laws applicable in the Cayman Islands (without regard to the conflict of laws rules thereof). Judgment on the arbitral award may be entered in any court having jurisdiction thereof. The foregoing arbitration provisions shall not preclude either party from seeking an injunction or other provisional remedies in aid of arbitration from a court of appropriate jurisdiction. The arbitrator shall, in the arbitral award, allocate all or part of the costs of the arbitration, including the fees of the arbitrator and reasonable attorneys’ fees of the prevailing party, for payment by the non-prevailing party, and shall determine the prevailing party for this purpose. The parties further agree that (i) any claims brought by either party must be brought in such party’s individual capacity and not as a plaintiff or class member in any purported class or representative proceeding, and (ii) the arbitrator may not (x) consolidate more than one person’s claims, (y) otherwise preside over any form of a representative or class proceeding or (z) award class-wide relief. \n\nYOU AGREE THAT YOU MAY BRING CLAIMS AGAINST THE FLASHBOTS PARTIES ONLY ON AN INDIVIDUAL BASIS, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED CLASS OR REPRESENTATIVE PROCEEDING. YOU AND THE FLASHBOTS PARTIES EXPRESSLY WAIVES ANY RIGHT TO FILE A CLASS ACTION OR SEEK RELIEF ON A CLASS BASIS. \n\n---\n\n### FLASHBOTS POLICIES APPENDIX\n\n[Prohibited Use Policy](/policies/prohibited-use-policy)"
  },
  {
    "path": "docs/sidebars.js",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nmodule.exports = {\n  docs: [\n    {\n      \"Welcome\": [\n        'welcome', 'new-to-mev', 'code-of-conduct', 'guide-send-tx-bundle'\n      ],\n    },\n    {\n      'Flashbots Builders': [\n        'flashbots-auction/overview',\n        'flashbots-auction/quick-start',\n        {\n          \"Example Searchers\": [\n            'flashbots-auction/example-searchers/simple-arbitrage-bot',\n            'flashbots-auction/example-searchers/searcher-sponsored-tx',\n            'flashbots-auction/example-searchers/searcher-minter',\n            'flashbots-auction/example-searchers/synthetix-searcher',\n          ],\n          \"Libraries\": [\n            'flashbots-auction/libraries/bundle-relay',\n            'flashbots-auction/libraries/mev-share-clients',\n            'flashbots-auction/libraries/golang',\n            'flashbots-auction/libraries/ethers-js-provider',\n            'flashbots-auction/libraries/web3py-provider',\n            'flashbots-auction/libraries/alchemyprovider',\n            'flashbots-auction/libraries/rust-provider',\n          ],\n          \"Advanced Concepts\": [\n            'flashbots-auction/advanced/understanding-bundles',\n            'flashbots-auction/advanced/multiplexing',\n            'flashbots-auction/advanced/gas-fee-refunds',\n            'flashbots-auction/advanced/coinbase-payment',\n            'flashbots-auction/advanced/bundle-pricing',\n            'flashbots-auction/advanced/reputation',\n            'flashbots-auction/advanced/testnets',\n            'flashbots-auction/advanced/eip1559',\n            'flashbots-auction/advanced/troubleshooting',\n            'flashbots-auction/advanced/bundle-cancellations',\n            'flashbots-auction/advanced/co-locate',\n          ],\n        },\n        'flashbots-auction/faq',\n        'flashbots-auction/other-resources',\n      ]\n    },\n    {\n      \"Flashbots Protect\": [\n        'flashbots-protect/overview',\n        'flashbots-protect/quick-start',\n        'flashbots-protect/mev-refunds',\n        'flashbots-protect/gas-fee-refunds',\n        'flashbots-protect/settings-guide',\n        'flashbots-protect/cancellations',\n        'flashbots-protect/nonce-management',\n        'flashbots-protect/stuck_transactions',\n        'flashbots-protect/large-transactions',\n        'flashbots-protect/ratelimiting',\n        {\n          'Additional Documentation': [\n            'flashbots-protect/additional-documentation/eth-sendPrivateTransaction',\n          ],\n        }\n      ],\n    },\n    {\n      \"MEV-Boost\": [\n        'flashbots-mev-boost/introduction',\n        {\n          'Architecture Overview': [\n            'flashbots-mev-boost/architecture-overview/specifications',\n            'flashbots-mev-boost/architecture-overview/block-proposal',\n            'flashbots-mev-boost/architecture-overview/risks'\n          ]\n        },\n\n          'flashbots-mev-boost/block-builders',\n          'flashbots-mev-boost/block-proposers',\n          'flashbots-mev-boost/relay',\n        {\n          'Getting Started':[\n            'flashbots-mev-boost/getting-started/system-requirements',\n            'flashbots-mev-boost/getting-started/installation',\n            'flashbots-mev-boost/getting-started/usage',\n          ]\n        },\n          'flashbots-mev-boost/troubleshooting',\n          'flashbots-mev-boost/contributing',\n          'flashbots-mev-boost/security',\n          'flashbots-mev-boost/FAQ',\n          'flashbots-mev-boost/glossary',\n          'flashbots-mev-boost/resources',\n      ],\n    },\n    {\n      \"MEV-Share\": [\n        'flashbots-mev-share/introduction',\n        'flashbots-mev-share/for-users',\n        'flashbots-mev-share/orderflow-providers',\n        {\n          'For Searchers': [\n            'flashbots-mev-share/searchers/getting-started',\n            'flashbots-mev-share/searchers/event-stream',\n            'flashbots-mev-share/searchers/understanding-bundles',\n            'flashbots-mev-share/searchers/sending-bundles',\n            'flashbots-mev-share/searchers/debugging',\n            'flashbots-mev-share/searchers/ratelimiting',\n            {\n              'Tutorials': [\n                {\n                  'Limit Order Bot': [\n                    'flashbots-mev-share/searchers/tutorials/limit-order/introduction',\n                    'flashbots-mev-share/searchers/tutorials/limit-order/setup',\n                    'flashbots-mev-share/searchers/tutorials/limit-order/using-events',\n                    'flashbots-mev-share/searchers/tutorials/limit-order/sending-bundles',\n                    'flashbots-mev-share/searchers/tutorials/limit-order/debugging',\n                    'flashbots-mev-share/searchers/tutorials/limit-order/more-resources'\n                  ],\n                  'Flash Loan Arbitrage Bot': [\n                    'flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/introduction',\n                    'flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/simple-blind-arbitrage',\n                    'flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/flash-loan-basics',\n                    'flashbots-mev-share/searchers/tutorials/flash-loan-arbitrage/bot',\n                  ]\n                }\n              ]\n            }\n          ],\n          'Release Notes': [\n            'flashbots-mev-share/release-notes/2023-03',\n            'flashbots-mev-share/release-notes/2023-06',\n            'flashbots-mev-share/release-notes/2023-07',\n            'flashbots-mev-share/release-notes/2023-09'\n          ]\n        }\n      ]\n    },\n    {\n      \"Community\": [\n        'community-tools', 'whitehat',\n      ],\n    },\n    {\n      \"Contribute\": [\n        'joining-flashbots', 'contribution-guide', 'cheatsheet',\n      ],\n    },\n    {\n      type: 'link',\n      label: 'Forum',\n      href: 'https://collective.flashbots.net/',\n    },\n    {\n      type: 'link',\n      label: 'Discord',\n      href: 'https://discord.gg/flashbots',\n    },\n    {\n      type: 'link',\n      href: 'https://github.com/flashbots/pm',\n      label: 'GitHub',\n    },\n    {\n      type: 'link',\n      href: 'https://status.flashbots.net/',\n      label: 'Status',\n    },\n        'policies/privacy','policies/terms-of-service', 'policies/prohibited-use-policy', 'brand-assets',\n  ],\n  api: [\n    \"flashbots-auction/advanced/rpc-endpoint\",\n    \"flashbots-protect/additional-documentation/status-api\",\n  ]\n};\n"
  },
  {
    "path": "docs/specs/README.md",
    "content": "# 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:\n\n```mdx\nimport SomeSpec from \"../relative/path/to/_file.mdx\"\n\n## We include the specification again\n\nYou may recall that this specification has been mentioned in many places, and due to its DRYness, has always accurately reflected the truth:\n\n<SomeSpec />\n```\n\n> :information_source: Note that the spec file is prefixed with an underscore. This lets Docusaurus know that it's a spec, and allows us to use it in our markdown files like a React component.\n"
  },
  {
    "path": "docs/specs/contracts/abi/_flashLoanArb.mdx",
    "content": "```json title=\"abi/blindBackrunFlashLoan.json\"\n{ \"abi\": [ { \"inputs\": [ { \"internalType\": \"address\", \"name\": \"_wethAddress\", \"type\": \"address\" } ], \"stateMutability\": \"nonpayable\", \"type\": \"constructor\" }, { \"anonymous\": false, \"inputs\": [ { \"indexed\": true, \"internalType\": \"address\", \"name\": \"previousOwner\", \"type\": \"address\" }, { \"indexed\": true, \"internalType\": \"address\", \"name\": \"newOwner\", \"type\": \"address\" } ], \"name\": \"OwnershipTransferred\", \"type\": \"event\" }, { \"inputs\": [], \"name\": \"WETH_ADDRESS\", \"outputs\": [ { \"internalType\": \"address\", \"name\": \"\", \"type\": \"address\" } ], \"stateMutability\": \"view\", \"type\": \"function\" }, { \"inputs\": [ { \"internalType\": \"address payable\", \"name\": \"_to\", \"type\": \"address\" }, { \"internalType\": \"uint256\", \"name\": \"_value\", \"type\": \"uint256\" }, { \"internalType\": \"bytes\", \"name\": \"_data\", \"type\": \"bytes\" } ], \"name\": \"call\", \"outputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"inputs\": [ { \"internalType\": \"address\", \"name\": \"firstPairAddress\", \"type\": \"address\" }, { \"internalType\": \"address\", \"name\": \"secondPairAddress\", \"type\": \"address\" }, { \"internalType\": \"uint256\", \"name\": \"percentageToPayToCoinbase\", \"type\": \"uint256\" }, { \"internalType\": \"address\", \"name\": \"recipient\", \"type\": \"address\" } ], \"name\": \"executeArbitrage\", \"outputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"inputs\": [ { \"components\": [ { \"internalType\": \"uint256\", \"name\": \"reserve0\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"reserve1\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"price\", \"type\": \"uint256\" }, { \"internalType\": \"bool\", \"name\": \"isWETHZero\", \"type\": \"bool\" } ], \"internalType\": \"struct IPairReserves.PairReserves\", \"name\": \"firstPairData\", \"type\": \"tuple\" }, { \"components\": [ { \"internalType\": \"uint256\", \"name\": \"reserve0\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"reserve1\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"price\", \"type\": \"uint256\" }, { \"internalType\": \"bool\", \"name\": \"isWETHZero\", \"type\": \"bool\" } ], \"internalType\": \"struct IPairReserves.PairReserves\", \"name\": \"secondPairData\", \"type\": \"tuple\" } ], \"name\": \"getAmountIn\", \"outputs\": [ { \"internalType\": \"uint256\", \"name\": \"\", \"type\": \"uint256\" } ], \"stateMutability\": \"view\", \"type\": \"function\" }, { \"inputs\": [ { \"components\": [ { \"internalType\": \"uint256\", \"name\": \"reserve0\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"reserve1\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"price\", \"type\": \"uint256\" }, { \"internalType\": \"bool\", \"name\": \"isWETHZero\", \"type\": \"bool\" } ], \"internalType\": \"struct IPairReserves.PairReserves\", \"name\": \"firstPairData\", \"type\": \"tuple\" }, { \"components\": [ { \"internalType\": \"uint256\", \"name\": \"reserve0\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"reserve1\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"price\", \"type\": \"uint256\" }, { \"internalType\": \"bool\", \"name\": \"isWETHZero\", \"type\": \"bool\" } ], \"internalType\": \"struct IPairReserves.PairReserves\", \"name\": \"secondPairData\", \"type\": \"tuple\" } ], \"name\": \"getDenominator\", \"outputs\": [ { \"internalType\": \"uint256\", \"name\": \"\", \"type\": \"uint256\" } ], \"stateMutability\": \"view\", \"type\": \"function\" }, { \"inputs\": [ { \"components\": [ { \"internalType\": \"uint256\", \"name\": \"reserve0\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"reserve1\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"price\", \"type\": \"uint256\" }, { \"internalType\": \"bool\", \"name\": \"isWETHZero\", \"type\": \"bool\" } ], \"internalType\": \"struct IPairReserves.PairReserves\", \"name\": \"firstPairData\", \"type\": \"tuple\" }, { \"components\": [ { \"internalType\": \"uint256\", \"name\": \"reserve0\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"reserve1\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"price\", \"type\": \"uint256\" }, { \"internalType\": \"bool\", \"name\": \"isWETHZero\", \"type\": \"bool\" } ], \"internalType\": \"struct IPairReserves.PairReserves\", \"name\": \"secondPairData\", \"type\": \"tuple\" } ], \"name\": \"getNumerator\", \"outputs\": [ { \"internalType\": \"uint256\", \"name\": \"\", \"type\": \"uint256\" } ], \"stateMutability\": \"view\", \"type\": \"function\" }, { \"inputs\": [ { \"internalType\": \"contract IERC20[]\", \"name\": \"tokens\", \"type\": \"address[]\" }, { \"internalType\": \"uint256[]\", \"name\": \"amounts\", \"type\": \"uint256[]\" }, { \"internalType\": \"bytes\", \"name\": \"userData\", \"type\": \"bytes\" } ], \"name\": \"makeFlashLoan\", \"outputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"inputs\": [], \"name\": \"owner\", \"outputs\": [ { \"internalType\": \"address\", \"name\": \"\", \"type\": \"address\" } ], \"stateMutability\": \"view\", \"type\": \"function\" }, { \"inputs\": [ { \"internalType\": \"contract IERC20[]\", \"name\": \"tokens\", \"type\": \"address[]\" }, { \"internalType\": \"uint256[]\", \"name\": \"amounts\", \"type\": \"uint256[]\" }, { \"internalType\": \"uint256[]\", \"name\": \"feeAmounts\", \"type\": \"uint256[]\" }, { \"internalType\": \"bytes\", \"name\": \"userData\", \"type\": \"bytes\" } ], \"name\": \"receiveFlashLoan\", \"outputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"inputs\": [], \"name\": \"renounceOwnership\", \"outputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"inputs\": [ { \"internalType\": \"address\", \"name\": \"newOwner\", \"type\": \"address\" } ], \"name\": \"transferOwnership\", \"outputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"inputs\": [], \"name\": \"withdrawETHToOwner\", \"outputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"inputs\": [], \"name\": \"withdrawWETHToOwner\", \"outputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"stateMutability\": \"payable\", \"type\": \"receive\" } ], \"bytecode\": { \"object\": \"0x60a06040526103e560015534801561001657600080fd5b50604051611a56380380611a56833981016040819052610035916100a1565b8061003f33610051565b6001600160a01b0316608052506100d1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100b357600080fd5b81516001600160a01b03811681146100ca57600080fd5b9392505050565b60805161192b61012b600039600081816101370152818161039101528181610457015281816106d8015281816107d50152818161087101528181610b5401528181610be601528181610d380152610fd5015261192b6000f3fe6080604052600436106100c45760003560e01c806377432b8c1161007f578063ea3e506c11610059578063ea3e506c14610219578063eb6b21161461022e578063f04f27071461024e578063f2fde38b1461026e57600080fd5b806377432b8c146101c65780638da5cb5b146101db578063c9a69562146101f957600080fd5b8062bb7d67146100d0578062fb430414610103578063040141e5146101255780631fa7d39b146101715780636dbf2fa014610191578063715018a6146101b157600080fd5b366100cb57005b600080fd5b3480156100dc57600080fd5b506100f06100eb366004611290565b61028e565b6040519081526020015b60405180910390f35b34801561010f57600080fd5b5061012361011e3660046112db565b610379565b005b34801561013157600080fd5b506101597f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100fa565b34801561017d57600080fd5b506100f061018c366004611290565b610922565b34801561019d57600080fd5b506101236101ac36600461139e565b6109b6565b3480156101bd57600080fd5b50610123610a69565b3480156101d257600080fd5b50610123610a7d565b3480156101e757600080fd5b506000546001600160a01b0316610159565b34801561020557600080fd5b506101236102143660046114ea565b610ab8565b34801561022557600080fd5b50610123610b34565b34801561023a57600080fd5b506100f0610249366004611290565b610c5b565b34801561025a57600080fd5b50610123610269366004611568565b610c94565b34801561027a57600080fd5b50610123610289366004611615565b610e33565b606082015160009015156001036103175760006102e484600001516102de85602001516102de87600001516102d88a602001516102d8600154600154610eac90919063ffffffff16565b90610eac565b90610ebf565b9050600061030d85600001516102d886602001516102d86103e861030788610ecb565b90610f17565b9250610373915050565b600061035084602001516102de85600001516102de87602001516102d88a600001516102d8600154600154610eac90919063ffffffff16565b9050600061030d85602001516102d886600001516102d86103e861030788610ecb565b92915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156103e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104049190611632565b90508484600061041383610f23565b9050600061042083610f23565b9050600061042e8383610c5b565b60405163a9059cbb60e01b81526001600160a01b038c81166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af11580156104a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c6919061164b565b506000808460600151151560011515036105cf576104ed83866000015187602001516110cd565b915061050282856020015186600001516110cd565b9050866001600160a01b031663022c0d9f6000848e6040518463ffffffff1660e01b815260040161053593929190611668565b600060405180830381600087803b15801561054f57600080fd5b505af1158015610563573d6000803e3d6000fd5b505060405163022c0d9f60e01b81526001600160a01b038916925063022c0d9f91506105989084906000903090600401611668565b600060405180830381600087803b1580156105b257600080fd5b505af11580156105c6573d6000803e3d6000fd5b505050506106c0565b6105e283866020015187600001516110cd565b91506105f782856000015186602001516110cd565b9050866001600160a01b031663022c0d9f8360008e6040518463ffffffff1660e01b815260040161062a93929190611668565b600060405180830381600087803b15801561064457600080fd5b505af1158015610658573d6000803e3d6000fd5b505060405163022c0d9f60e01b81526001600160a01b038916925063022c0d9f915061068d9060009085903090600401611668565b600060405180830381600087803b1580156106a757600080fd5b505af11580156106bb573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074b9190611632565b90508881116107945760405162461bcd60e51b815260206004820152601060248201526f105c989a5d1c9859d94819985a5b195960821b60448201526064015b60405180910390fd5b60006107a0828b610f17565b905060006107bc60646102de8f85610eac90919063ffffffff16565b604051632e1a7d4d60e01b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561082157600080fd5b505af1158015610835573d6000803e3d6000fd5b505060405141925083156108fc02915083906000818181858888f19350505050158015610866573d6000803e3d6000fd5b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb8d6108a18585610f17565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156108ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610910919061164b565b50505050505050505050505050505050565b6060820151600090151560010361098557600061097c61095785602001516102d8600154600154610eac90919063ffffffff16565b6109766103e86102d88760200151600154610eac90919063ffffffff16565b90611115565b91506103739050565b825160015460009161097c916109a091906102d89080610eac565b8451600154610976916103e8916102d891610eac565b6109be611121565b6000836001600160a01b031683836040516109d991906116ba565b60006040518083038185875af1925050503d8060008114610a16576040519150601f19603f3d011682016040523d82523d6000602084013e610a1b565b606091505b5050905080610a635760405162461bcd60e51b8152602060048201526014602482015273115e1d195c9b985b0818d85b1b0819985a5b195960621b604482015260640161078b565b50505050565b610a71611121565b610a7b600061117b565b565b610a85611121565b6040514790339082156108fc029083906000818181858888f19350505050158015610ab4573d6000803e3d6000fd5b5050565b610ac0611121565b604051632e1c224f60e11b815273ba12222222228d8ba445958a75a0704d566bf2c890635c38449e90610afd903090879087908790600401611702565b600060405180830381600087803b158015610b1757600080fd5b505af1158015610b2b573d6000803e3d6000fd5b50505050505050565b610b3c611121565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc79190611632565b60405163a9059cbb60e01b8152336004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab4919061164b565b600080610c68848461028e565b90506000610c768585610922565b90506000610c8a826102de856103e8610eac565b9695505050505050565b3373ba12222222228d8ba445958a75a0704d566bf2c814610d0b5760405162461bcd60e51b815260206004820152602b60248201527f466c6173684c6f616e526563697069656e743a2063616c6c6572206973206e6f60448201526a1d081d1a19481d985d5b1d60aa1b606482015260840161078b565b600080600083806020019051810190610d24919061179e565b925092509250610d3682848330610379565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb73ba12222222228d8ba445958a75a0704d566bf2c887600081518110610d8d57610d8d6117e1565b602002602001015189600081518110610da857610da86117e1565b6020026020010151610dba919061180d565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e29919061164b565b5050505050505050565b610e3b611121565b6001600160a01b038116610ea05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161078b565b610ea98161117b565b50565b6000610eb88284611820565b9392505050565b6000610eb88284611837565b600081600003610edd57506000919050565b6000610eef60026102de856001611115565b9050825b80821015610eb8575080610f1060026102de836109768882610ebf565b9150610ef3565b6000610eb88284611859565b610f5060405180608001604052806000815260200160008152602001600081526020016000151581525090565b600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190611888565b506001600160701b031691506001600160701b03169150600080600090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f91906118d8565b6001600160a01b03160361108e57611083846102de85670de0b6b3a7640000610eac565b9150600190506110a7565b6110a4836102de86670de0b6b3a7640000610eac565b91505b604080516080810182529485526020850193909352918301521515606082015292915050565b6000806110dc856103e5610eac565b905060006110ea8285610eac565b905060006110fe83610976886103e8610eac565b905061110a8183611837565b979650505050505050565b6000610eb8828461180d565b6000546001600160a01b03163314610a7b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561120a5761120a6111cb565b604052919050565b8015158114610ea957600080fd5b60006080828403121561123257600080fd5b6040516080810181811067ffffffffffffffff82111715611255576112556111cb565b8060405250809150823581526020830135602082015260408301356040820152606083013561128381611212565b6060919091015292915050565b60008061010083850312156112a457600080fd5b6112ae8484611220565b91506112bd8460808501611220565b90509250929050565b6001600160a01b0381168114610ea957600080fd5b600080600080608085870312156112f157600080fd5b84356112fc816112c6565b9350602085013561130c816112c6565b9250604085013591506060850135611323816112c6565b939692955090935050565b600082601f83011261133f57600080fd5b813567ffffffffffffffff811115611359576113596111cb565b61136c601f8201601f19166020016111e1565b81815284602083860101111561138157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156113b357600080fd5b83356113be816112c6565b925060208401359150604084013567ffffffffffffffff8111156113e157600080fd5b6113ed8682870161132e565b9150509250925092565b600067ffffffffffffffff821115611411576114116111cb565b5060051b60200190565b600082601f83011261142c57600080fd5b8135602061144161143c836113f7565b6111e1565b82815260059290921b8401810191818101908684111561146057600080fd5b8286015b84811015611484578035611477816112c6565b8352918301918301611464565b509695505050505050565b600082601f8301126114a057600080fd5b813560206114b061143c836113f7565b82815260059290921b840181019181810190868411156114cf57600080fd5b8286015b8481101561148457803583529183019183016114d3565b6000806000606084860312156114ff57600080fd5b833567ffffffffffffffff8082111561151757600080fd5b6115238783880161141b565b9450602086013591508082111561153957600080fd5b6115458783880161148f565b9350604086013591508082111561155b57600080fd5b506113ed8682870161132e565b6000806000806080858703121561157e57600080fd5b843567ffffffffffffffff8082111561159657600080fd5b6115a28883890161141b565b955060208701359150808211156115b857600080fd5b6115c48883890161148f565b945060408701359150808211156115da57600080fd5b6115e68883890161148f565b935060608701359150808211156115fc57600080fd5b506116098782880161132e565b91505092959194509250565b60006020828403121561162757600080fd5b8135610eb8816112c6565b60006020828403121561164457600080fd5b5051919050565b60006020828403121561165d57600080fd5b8151610eb881611212565b92835260208301919091526001600160a01b0316604082015260806060820181905260009082015260a00190565b60005b838110156116b1578181015183820152602001611699565b50506000910152565b600082516116cc818460208701611696565b9190910192915050565b600081518084526116ee816020860160208601611696565b601f01601f19169290920160200192915050565b6001600160a01b0385811682526080602080840182905286519184018290526000928782019290919060a0860190855b81811015611750578551851683529483019491830191600101611732565b5050858103604087015287518082529082019350915080870160005b838110156117885781518552938201939082019060010161176c565b50505050828103606084015261110a81856116d6565b6000806000606084860312156117b357600080fd5b83516117be816112c6565b60208501519093506117cf816112c6565b80925050604084015190509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610373576103736117f7565b8082028115828204841417610373576103736117f7565b60008261185457634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610373576103736117f7565b80516001600160701b038116811461188357600080fd5b919050565b60008060006060848603121561189d57600080fd5b6118a68461186c565b92506118b46020850161186c565b9150604084015163ffffffff811681146118cd57600080fd5b809150509250925092565b6000602082840312156118ea57600080fd5b8151610eb8816112c656fea2646970667358221220676487a1d86f39c43717d6d35a54a941fb253b31450166709b652d8163b2b26464736f6c63430008130033\", \"sourceMap\": \"1103:1241:26:-:0;;;941:3:23;918:26;;1267:63:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1314:12;936:32:0;719:10:4;936:18:0;:32::i;:::-;-1:-1:-1;;;;;1039:27:23;;;-1:-1:-1;1103:1241:26;;2426:187:0;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:0;;;-1:-1:-1;;;;;;2534:17:0;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;14:290:28:-;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:28;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:28:o;:::-;1103:1241:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\", \"linkReferences\": {} }, \"deployedBytecode\": { \"object\": \"0x6080604052600436106100c45760003560e01c806377432b8c1161007f578063ea3e506c11610059578063ea3e506c14610219578063eb6b21161461022e578063f04f27071461024e578063f2fde38b1461026e57600080fd5b806377432b8c146101c65780638da5cb5b146101db578063c9a69562146101f957600080fd5b8062bb7d67146100d0578062fb430414610103578063040141e5146101255780631fa7d39b146101715780636dbf2fa014610191578063715018a6146101b157600080fd5b366100cb57005b600080fd5b3480156100dc57600080fd5b506100f06100eb366004611290565b61028e565b6040519081526020015b60405180910390f35b34801561010f57600080fd5b5061012361011e3660046112db565b610379565b005b34801561013157600080fd5b506101597f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100fa565b34801561017d57600080fd5b506100f061018c366004611290565b610922565b34801561019d57600080fd5b506101236101ac36600461139e565b6109b6565b3480156101bd57600080fd5b50610123610a69565b3480156101d257600080fd5b50610123610a7d565b3480156101e757600080fd5b506000546001600160a01b0316610159565b34801561020557600080fd5b506101236102143660046114ea565b610ab8565b34801561022557600080fd5b50610123610b34565b34801561023a57600080fd5b506100f0610249366004611290565b610c5b565b34801561025a57600080fd5b50610123610269366004611568565b610c94565b34801561027a57600080fd5b50610123610289366004611615565b610e33565b606082015160009015156001036103175760006102e484600001516102de85602001516102de87600001516102d88a602001516102d8600154600154610eac90919063ffffffff16565b90610eac565b90610ebf565b9050600061030d85600001516102d886602001516102d86103e861030788610ecb565b90610f17565b9250610373915050565b600061035084602001516102de85600001516102de87602001516102d88a600001516102d8600154600154610eac90919063ffffffff16565b9050600061030d85602001516102d886600001516102d86103e861030788610ecb565b92915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156103e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104049190611632565b90508484600061041383610f23565b9050600061042083610f23565b9050600061042e8383610c5b565b60405163a9059cbb60e01b81526001600160a01b038c81166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af11580156104a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c6919061164b565b506000808460600151151560011515036105cf576104ed83866000015187602001516110cd565b915061050282856020015186600001516110cd565b9050866001600160a01b031663022c0d9f6000848e6040518463ffffffff1660e01b815260040161053593929190611668565b600060405180830381600087803b15801561054f57600080fd5b505af1158015610563573d6000803e3d6000fd5b505060405163022c0d9f60e01b81526001600160a01b038916925063022c0d9f91506105989084906000903090600401611668565b600060405180830381600087803b1580156105b257600080fd5b505af11580156105c6573d6000803e3d6000fd5b505050506106c0565b6105e283866020015187600001516110cd565b91506105f782856000015186602001516110cd565b9050866001600160a01b031663022c0d9f8360008e6040518463ffffffff1660e01b815260040161062a93929190611668565b600060405180830381600087803b15801561064457600080fd5b505af1158015610658573d6000803e3d6000fd5b505060405163022c0d9f60e01b81526001600160a01b038916925063022c0d9f915061068d9060009085903090600401611668565b600060405180830381600087803b1580156106a757600080fd5b505af11580156106bb573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074b9190611632565b90508881116107945760405162461bcd60e51b815260206004820152601060248201526f105c989a5d1c9859d94819985a5b195960821b60448201526064015b60405180910390fd5b60006107a0828b610f17565b905060006107bc60646102de8f85610eac90919063ffffffff16565b604051632e1a7d4d60e01b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561082157600080fd5b505af1158015610835573d6000803e3d6000fd5b505060405141925083156108fc02915083906000818181858888f19350505050158015610866573d6000803e3d6000fd5b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb8d6108a18585610f17565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156108ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610910919061164b565b50505050505050505050505050505050565b6060820151600090151560010361098557600061097c61095785602001516102d8600154600154610eac90919063ffffffff16565b6109766103e86102d88760200151600154610eac90919063ffffffff16565b90611115565b91506103739050565b825160015460009161097c916109a091906102d89080610eac565b8451600154610976916103e8916102d891610eac565b6109be611121565b6000836001600160a01b031683836040516109d991906116ba565b60006040518083038185875af1925050503d8060008114610a16576040519150601f19603f3d011682016040523d82523d6000602084013e610a1b565b606091505b5050905080610a635760405162461bcd60e51b8152602060048201526014602482015273115e1d195c9b985b0818d85b1b0819985a5b195960621b604482015260640161078b565b50505050565b610a71611121565b610a7b600061117b565b565b610a85611121565b6040514790339082156108fc029083906000818181858888f19350505050158015610ab4573d6000803e3d6000fd5b5050565b610ac0611121565b604051632e1c224f60e11b815273ba12222222228d8ba445958a75a0704d566bf2c890635c38449e90610afd903090879087908790600401611702565b600060405180830381600087803b158015610b1757600080fd5b505af1158015610b2b573d6000803e3d6000fd5b50505050505050565b610b3c611121565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc79190611632565b60405163a9059cbb60e01b8152336004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab4919061164b565b600080610c68848461028e565b90506000610c768585610922565b90506000610c8a826102de856103e8610eac565b9695505050505050565b3373ba12222222228d8ba445958a75a0704d566bf2c814610d0b5760405162461bcd60e51b815260206004820152602b60248201527f466c6173684c6f616e526563697069656e743a2063616c6c6572206973206e6f60448201526a1d081d1a19481d985d5b1d60aa1b606482015260840161078b565b600080600083806020019051810190610d24919061179e565b925092509250610d3682848330610379565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb73ba12222222228d8ba445958a75a0704d566bf2c887600081518110610d8d57610d8d6117e1565b602002602001015189600081518110610da857610da86117e1565b6020026020010151610dba919061180d565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e29919061164b565b5050505050505050565b610e3b611121565b6001600160a01b038116610ea05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161078b565b610ea98161117b565b50565b6000610eb88284611820565b9392505050565b6000610eb88284611837565b600081600003610edd57506000919050565b6000610eef60026102de856001611115565b9050825b80821015610eb8575080610f1060026102de836109768882610ebf565b9150610ef3565b6000610eb88284611859565b610f5060405180608001604052806000815260200160008152602001600081526020016000151581525090565b600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190611888565b506001600160701b031691506001600160701b03169150600080600090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f91906118d8565b6001600160a01b03160361108e57611083846102de85670de0b6b3a7640000610eac565b9150600190506110a7565b6110a4836102de86670de0b6b3a7640000610eac565b91505b604080516080810182529485526020850193909352918301521515606082015292915050565b6000806110dc856103e5610eac565b905060006110ea8285610eac565b905060006110fe83610976886103e8610eac565b905061110a8183611837565b979650505050505050565b6000610eb8828461180d565b6000546001600160a01b03163314610a7b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561120a5761120a6111cb565b604052919050565b8015158114610ea957600080fd5b60006080828403121561123257600080fd5b6040516080810181811067ffffffffffffffff82111715611255576112556111cb565b8060405250809150823581526020830135602082015260408301356040820152606083013561128381611212565b6060919091015292915050565b60008061010083850312156112a457600080fd5b6112ae8484611220565b91506112bd8460808501611220565b90509250929050565b6001600160a01b0381168114610ea957600080fd5b600080600080608085870312156112f157600080fd5b84356112fc816112c6565b9350602085013561130c816112c6565b9250604085013591506060850135611323816112c6565b939692955090935050565b600082601f83011261133f57600080fd5b813567ffffffffffffffff811115611359576113596111cb565b61136c601f8201601f19166020016111e1565b81815284602083860101111561138157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156113b357600080fd5b83356113be816112c6565b925060208401359150604084013567ffffffffffffffff8111156113e157600080fd5b6113ed8682870161132e565b9150509250925092565b600067ffffffffffffffff821115611411576114116111cb565b5060051b60200190565b600082601f83011261142c57600080fd5b8135602061144161143c836113f7565b6111e1565b82815260059290921b8401810191818101908684111561146057600080fd5b8286015b84811015611484578035611477816112c6565b8352918301918301611464565b509695505050505050565b600082601f8301126114a057600080fd5b813560206114b061143c836113f7565b82815260059290921b840181019181810190868411156114cf57600080fd5b8286015b8481101561148457803583529183019183016114d3565b6000806000606084860312156114ff57600080fd5b833567ffffffffffffffff8082111561151757600080fd5b6115238783880161141b565b9450602086013591508082111561153957600080fd5b6115458783880161148f565b9350604086013591508082111561155b57600080fd5b506113ed8682870161132e565b6000806000806080858703121561157e57600080fd5b843567ffffffffffffffff8082111561159657600080fd5b6115a28883890161141b565b955060208701359150808211156115b857600080fd5b6115c48883890161148f565b945060408701359150808211156115da57600080fd5b6115e68883890161148f565b935060608701359150808211156115fc57600080fd5b506116098782880161132e565b91505092959194509250565b60006020828403121561162757600080fd5b8135610eb8816112c6565b60006020828403121561164457600080fd5b5051919050565b60006020828403121561165d57600080fd5b8151610eb881611212565b92835260208301919091526001600160a01b0316604082015260806060820181905260009082015260a00190565b60005b838110156116b1578181015183820152602001611699565b50506000910152565b600082516116cc818460208701611696565b9190910192915050565b600081518084526116ee816020860160208601611696565b601f01601f19169290920160200192915050565b6001600160a01b0385811682526080602080840182905286519184018290526000928782019290919060a0860190855b81811015611750578551851683529483019491830191600101611732565b5050858103604087015287518082529082019350915080870160005b838110156117885781518552938201939082019060010161176c565b50505050828103606084015261110a81856116d6565b6000806000606084860312156117b357600080fd5b83516117be816112c6565b60208501519093506117cf816112c6565b80925050604084015190509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610373576103736117f7565b8082028115828204841417610373576103736117f7565b60008261185457634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610373576103736117f7565b80516001600160701b038116811461188357600080fd5b919050565b60008060006060848603121561189d57600080fd5b6118a68461186c565b92506118b46020850161186c565b9150604084015163ffffffff811681146118cd57600080fd5b809150509250925092565b6000602082840312156118ea57600080fd5b8151610eb8816112c656fea2646970667358221220676487a1d86f39c43717d6d35a54a941fb253b31450166709b652d8163b2b26464736f6c63430008130033\", \"sourceMap\": \"1103:1241:26:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4524:1133:23;;;;;;;;;;-1:-1:-1;4524:1133:23;;;;;:::i;:::-;;:::i;:::-;;;1750:25:28;;;1738:2;1723:18;4524:1133:23;;;;;;;;1424:2330;;;;;;;;;;-1:-1:-1;1424:2330:23;;;;;:::i;:::-;;:::i;:::-;;951:37;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2689:32:28;;;2671:51;;2659:2;2644:18;951:37:23;2525:203:28;5663:687:23;;;;;;;;;;-1:-1:-1;5663:687:23;;;;;:::i;:::-;;:::i;9330:236::-;;;;;;;;;;-1:-1:-1;9330:236:23;;;;;:::i;:::-;;:::i;1824:101:0:-;;;;;;;;;;;;;:::i;8794:152:23:-;;;;;;;;;;;;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1247:7:0;1273:6;-1:-1:-1;;;;;1273:6:0;1201:85;;1336:210:26;;;;;;;;;;-1:-1:-1;1336:210:26;;;;;:::i;:::-;;:::i;8459:190:23:-;;;;;;;;;;;;;:::i;4097:421::-;;;;;;;;;;-1:-1:-1;4097:421:23;;;;;:::i;:::-;;:::i;1552:790:26:-;;;;;;;;;;-1:-1:-1;1552:790:26;;;;;:::i;:::-;;:::i;2074:198:0:-;;;;;;;;;;-1:-1:-1;2074:198:0;;;;;:::i;:::-;;:::i;4524:1133:23:-;4711:24;;;;4688:7;;4711:32;;4739:4;4711:32;4707:944;;4759:12;4774:229;4980:13;:22;;;4774:184;4934:14;:23;;;4774:138;4888:14;:23;;;4774:92;4843:13;:22;;;4774:47;4808:12;;4774;;:33;;:47;;;;:::i;:::-;:68;;:92::i;:138::-;:159;;:184::i;:229::-;4759:244;;5018:17;5038:115;5130:13;:22;;;5038:70;5084:14;:23;;;5039:22;5057:3;5039:13;5044:7;5039:4;:13::i;:::-;:17;;:22::i;5038:115::-;5018:135;-1:-1:-1;5168:16:23;;-1:-1:-1;;5168:16:23;4707:944;5215:12;5230:229;5436:13;:22;;;5230:184;5390:14;:23;;;5230:138;5344:14;:23;;;5230:92;5299:13;:22;;;5230:47;5264:12;;5230;;:33;;:47;;;;:::i;:229::-;5215:244;;5474:17;5494:115;5586:13;:22;;;5494:70;5540:14;:23;;;5495:22;5513:3;5495:13;5500:7;5495:4;:13::i;4707:944::-;4524:1133;;;;:::o;1424:2330::-;1633:45;;-1:-1:-1;;;1633:45:23;;1672:4;1633:45;;;2671:51:28;1609:21:23;;1640:12;-1:-1:-1;;;;;1633:30:23;;;;2644:18:28;;1633:45:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1609:69;-1:-1:-1;1730:16:23;1800:17;1688:24;1879:44;1730:16;1879:11;:44::i;:::-;1829:94;;1933:48;1984:45;2009:10;1984:11;:45::i;:::-;1933:96;;2040:16;2059:42;2071:13;2086:14;2059:11;:42::i;:::-;2111:57;;-1:-1:-1;;;2111:57:23;;-1:-1:-1;;;;;7933:32:28;;;2111:57:23;;;7915:51:28;7982:18;;;7975:34;;;2040:61:23;;-1:-1:-1;2118:12:23;2111:29;;;;;;7888:18:28;;2111:57:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2179:26;2215:22;2251:13;:24;;;:32;;2279:4;2251:32;;;2247:1034;;2320:132;2350:8;2376:13;:22;;;2416:13;:22;;;2320:12;:132::i;:::-;2299:153;;2483:144;2513:18;2549:14;:23;;;2590:14;:23;;;2483:12;:144::i;:::-;2466:161;;2642:9;-1:-1:-1;;;;;2642:14:23;;2657:1;2660:18;2680:17;2642:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2716:53:23;;-1:-1:-1;;;2716:53:23;;-1:-1:-1;;;;;2716:15:23;;;-1:-1:-1;2716:15:23;;-1:-1:-1;2716:53:23;;2732:14;;2748:1;;2759:4;;2716:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2247:1034;;;2821:132;2851:8;2877:13;:22;;;2917:13;:22;;;2821:12;:132::i;:::-;2800:153;;2984:144;3014:18;3050:14;:23;;;3091:14;:23;;;2984:12;:144::i;:::-;2967:161;;3143:9;-1:-1:-1;;;;;3143:14:23;;3158:18;3178:1;3181:17;3143:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3217:53:23;;-1:-1:-1;;;3217:53:23;;-1:-1:-1;;;;;3217:15:23;;;-1:-1:-1;3217:15:23;;-1:-1:-1;3217:53:23;;3233:1;;3236:14;;3260:4;;3217:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2247:1034;3314:45;;-1:-1:-1;;;3314:45:23;;3353:4;3314:45;;;2671:51:28;3291:20:23;;3321:12;-1:-1:-1;;;;;3314:30:23;;;;2644:18:28;;3314:45:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3291:68;;3392:13;3377:12;:28;3369:57;;;;-1:-1:-1;;;3369:57:23;;9548:2:28;3369:57:23;;;9530:21:28;9587:2;9567:18;;;9560:30;-1:-1:-1;;;9606:18:28;;;9599:46;9662:18;;3369:57:23;;;;;;;;;3436:11;3450:31;:12;3467:13;3450:16;:31::i;:::-;3436:45;;3491:21;3515:46;3557:3;3515:37;3526:25;3515:6;:10;;:37;;;;:::i;:46::-;3571;;-1:-1:-1;;;3571:46:23;;;;;1750:25:28;;;3491:70:23;;-1:-1:-1;3577:12:23;-1:-1:-1;;;;;3571:28:23;;;;1723:18:28;;3571:46:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3627:41:23;;:14;;-1:-1:-1;3627:41:23;;;;;-1:-1:-1;3651:16:23;;3627:41;;;;3651:16;3627:14;:41;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3684:12:23;3678:28;;3707:9;3718:28;:6;3729:16;3718:10;:28::i;:::-;3678:69;;-1:-1:-1;;;;;;3678:69:23;;;;;;;-1:-1:-1;;;;;7933:32:28;;;3678:69:23;;;7915:51:28;7982:18;;;7975:34;7888:18;;3678:69:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1599:2155;;;;;;;;;;;1424:2330;;;;:::o;5663:687::-;5852:24;;;;5829:7;;5852:32;;5880:4;5852:32;5848:496;;5900:19;5922:147;6010:58;6045:13;:22;;;6010:30;6027:12;;6010;;:16;;:30;;;;:::i;:58::-;5940:51;5986:4;5940:41;5957:14;:23;;;5940:12;;:16;;:41;;;;:::i;:51::-;5922:87;;:147::i;:::-;5900:169;-1:-1:-1;6083:18:23;;-1:-1:-1;6083:18:23;5848:496;6277:22;;6259:12;;6132:19;;6154:147;;6242:58;;6277:22;6242:30;;6259:12;6242:16;:30::i;:58::-;6189:23;;6172:12;;:51;;6218:4;;6172:41;;:16;:41::i;9330:236::-;1094:13:0;:11;:13::i;:::-;9461:12:23::1;9479:3;-1:-1:-1::0;;;;;9479:8:23::1;9495:6;9503:5;9479:30;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9460:49;;;9527:7;9519:40;;;::::0;-1:-1:-1;;;9519:40:23;;10440:2:28;9519:40:23::1;::::0;::::1;10422:21:28::0;10479:2;10459:18;;;10452:30;-1:-1:-1;;;10498:18:28;;;10491:50;10558:18;;9519:40:23::1;10238:344:28::0;9519:40:23::1;9450:116;9330:236:::0;;;:::o;1824:101:0:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;8794:152:23:-;1094:13:0;:11;:13::i;:::-;8902:37:23::1;::::0;8871:21:::1;::::0;8910:10:::1;::::0;8902:37;::::1;;;::::0;8871:21;;8853:15:::1;8902:37:::0;8853:15;8902:37;8871:21;8910:10;8902:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;8843:103;8794:152::o:0;1336:210:26:-;1094:13:0;:11;:13::i;:::-;1491:48:26::1;::::0;-1:-1:-1;;;1491:48:26;;1217:42:::1;::::0;1491:15:::1;::::0;:48:::1;::::0;1507:4:::1;::::0;1513:6;;1521:7;;1530:8;;1491:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;1336:210:::0;;;:::o;8459:190:23:-;1094:13:0;:11;:13::i;:::-;8537:45:23::1;::::0;-1:-1:-1;;;8537:45:23;;8576:4:::1;8537:45;::::0;::::1;2671:51:28::0;8519:15:23::1;::::0;8544:12:::1;-1:-1:-1::0;;;;;8537:30:23::1;::::0;::::1;::::0;2644:18:28;;8537:45:23::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8592:50;::::0;-1:-1:-1;;;8592:50:23;;8622:10:::1;8592:50;::::0;::::1;7915:51:28::0;7982:18;;;7975:34;;;8519:63:23;;-1:-1:-1;8599:12:23::1;-1:-1:-1::0;;;;;8592:29:23::1;::::0;::::1;::::0;7888:18:28;;8592:50:23::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4097:421::-:0;4260:7;4279:17;4299:43;4312:13;4327:14;4299:12;:43::i;:::-;4279:63;;4352:19;4374:45;4389:13;4404:14;4374;:45::i;:::-;4352:67;-1:-1:-1;4430:16:23;4449:36;4352:67;4449:19;:9;4463:4;4449:13;:19::i;:36::-;4430:55;4097:421;-1:-1:-1;;;;;;4097:421:23:o;1552:790:26:-;1758:10;1217:42;1758:28;1737:118;;;;-1:-1:-1;;;1737:118:26;;12517:2:28;1737:118:26;;;12499:21:28;12556:2;12536:18;;;12529:30;12595:34;12575:18;;;12568:62;-1:-1:-1;;;12646:18:28;;;12639:41;12697:19;;1737:118:26;12315:407:28;1737:118:26;1880:24;1918:25;1957:33;2014:8;2003:49;;;;;;;;;;;;:::i;:::-;1866:186;;;;;;2063:153;2093:17;2124:16;2154:25;2201:4;2063:16;:153::i;:::-;2233:12;-1:-1:-1;;;;;2227:28:26;;1217:42;2311:10;2322:1;2311:13;;;;;;;;:::i;:::-;;;;;;;2297:7;2305:1;2297:10;;;;;;;;:::i;:::-;;;;;;;:28;;;;:::i;:::-;2227:108;;-1:-1:-1;;;;;;2227:108:26;;;;;;;-1:-1:-1;;;;;7933:32:28;;;2227:108:26;;;7915:51:28;7982:18;;;7975:34;7888:18;;2227:108:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1727:615;;;1552:790;;;;:::o;2074:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:0;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:0;;13790:2:28;2154:73:0::1;::::0;::::1;13772:21:28::0;13829:2;13809:18;;;13802:30;13868:34;13848:18;;;13841:62;-1:-1:-1;;;13919:18:28;;;13912:36;13965:19;;2154:73:0::1;13588:402:28::0;2154:73:0::1;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;3465:96:5:-;3523:7;3549:5;3553:1;3549;:5;:::i;:::-;3542:12;3465:96;-1:-1:-1;;;3465:96:5:o;3850:::-;3908:7;3934:5;3938:1;3934;:5;:::i;7359:268:23:-;7406:7;7429:1;7434;7429:6;7425:20;;-1:-1:-1;7444:1:23;;7359:268;-1:-1:-1;7359:268:23:o;7425:20::-;7455:9;7467:15;7480:1;7467:8;:1;7473;7467:5;:8::i;:15::-;7455:27;-1:-1:-1;7504:1:23;7515:88;7526:1;7522;:5;7515:88;;;-1:-1:-1;7547:1:23;7566:26;7590:1;7567:17;7547:1;7568:8;:1;7547;7568:5;:8::i;7566:26::-;7562:30;;7515:88;;3122:96:5;3180:7;3206:5;3210:1;3206;:5;:::i;6621:552:23:-;6699:33;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6699:33:23;6745:16;6763;6785:4;-1:-1:-1;;;;;6785:16:23;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6744:59;-1:-1:-1;;;;;6744:59:23;;;-1:-1:-1;;;;;6744:59:23;;;6813:13;6837:15;6855:5;6837:23;;6891:12;-1:-1:-1;;;;;6874:29:23;:4;-1:-1:-1;;;;;6874:11:23;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6874:29:23;;6870:202;;6927:32;6950:8;6927:18;:8;6940:4;6927:12;:18::i;:32::-;6919:40;;6986:4;6973:17;;6870:202;;;7029:32;7052:8;7029:18;:8;7042:4;7029:12;:18::i;:32::-;7021:40;;6870:202;7101:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6621:552;-1:-1:-1;;6621:552:23:o;7920:393::-;8042:14;;8091:17;:8;8104:3;8091:12;:17::i;:::-;8068:40;-1:-1:-1;8118:14:23;8135:31;8068:40;8155:10;8135:19;:31::i;:::-;8118:48;-1:-1:-1;8176:16:23;8195:40;8219:15;8195:19;:9;8209:4;8195:13;:19::i;:40::-;8176:59;-1:-1:-1;8257:23:23;8176:59;8257:9;:23;:::i;:::-;8245:35;7920:393;-1:-1:-1;;;;;;;7920:393:23:o;2755:96:5:-;2813:7;2839:5;2843:1;2839;:5;:::i;1359:130:0:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:0;719:10:4;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;15629:2:28;1414:68:0;;;15611:21:28;;;15648:18;;;15641:30;15707:34;15687:18;;;15680:62;15759:18;;1414:68:0;15427:356:28;2426:187:0;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:0;;;-1:-1:-1;;;;;;2534:17:0;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;14:127:28:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:275;217:2;211:9;282:2;263:13;;-1:-1:-1;;259:27:28;247:40;;317:18;302:34;;338:22;;;299:62;296:88;;;364:18;;:::i;:::-;400:2;393:22;146:275;;-1:-1:-1;146:275:28:o;426:118::-;512:5;505:13;498:21;491:5;488:32;478:60;;534:1;531;524:12;549:679;608:5;656:4;644:9;639:3;635:19;631:30;628:50;;;674:1;671;664:12;628:50;707:2;701:9;749:4;741:6;737:17;820:6;808:10;805:22;784:18;772:10;769:34;766:62;763:88;;;831:18;;:::i;:::-;871:10;867:2;860:22;;900:6;891:15;;943:9;930:23;922:6;915:39;1015:2;1004:9;1000:18;987:32;982:2;974:6;970:15;963:57;1081:2;1070:9;1066:18;1053:32;1048:2;1040:6;1036:15;1029:57;1138:2;1127:9;1123:18;1110:32;1151:30;1173:7;1151:30;:::i;:::-;1209:2;1197:15;;;;1190:32;549:679;;-1:-1:-1;;549:679:28:o;1233:366::-;1363:6;1371;1424:3;1412:9;1403:7;1399:23;1395:33;1392:53;;;1441:1;1438;1431:12;1392:53;1464:50;1506:7;1495:9;1464:50;:::i;:::-;1454:60;;1533;1585:7;1579:3;1568:9;1564:19;1533:60;:::i;:::-;1523:70;;1233:366;;;;;:::o;1786:131::-;-1:-1:-1;;;;;1861:31:28;;1851:42;;1841:70;;1907:1;1904;1897:12;1922:598;2008:6;2016;2024;2032;2085:3;2073:9;2064:7;2060:23;2056:33;2053:53;;;2102:1;2099;2092:12;2053:53;2141:9;2128:23;2160:31;2185:5;2160:31;:::i;:::-;2210:5;-1:-1:-1;2267:2:28;2252:18;;2239:32;2280:33;2239:32;2280:33;:::i;:::-;2332:7;-1:-1:-1;2386:2:28;2371:18;;2358:32;;-1:-1:-1;2442:2:28;2427:18;;2414:32;2455:33;2414:32;2455:33;:::i;:::-;1922:598;;;;-1:-1:-1;1922:598:28;;-1:-1:-1;;1922:598:28:o;2733:530::-;2775:5;2828:3;2821:4;2813:6;2809:17;2805:27;2795:55;;2846:1;2843;2836:12;2795:55;2882:6;2869:20;2908:18;2904:2;2901:26;2898:52;;;2930:18;;:::i;:::-;2974:55;3017:2;2998:13;;-1:-1:-1;;2994:27:28;3023:4;2990:38;2974:55;:::i;:::-;3054:2;3045:7;3038:19;3100:3;3093:4;3088:2;3080:6;3076:15;3072:26;3069:35;3066:55;;;3117:1;3114;3107:12;3066:55;3182:2;3175:4;3167:6;3163:17;3156:4;3147:7;3143:18;3130:55;3230:1;3205:16;;;3223:4;3201:27;3194:38;;;;3209:7;2733:530;-1:-1:-1;;;2733:530:28:o;3268:531::-;3362:6;3370;3378;3431:2;3419:9;3410:7;3406:23;3402:32;3399:52;;;3447:1;3444;3437:12;3399:52;3486:9;3473:23;3505:31;3530:5;3505:31;:::i;:::-;3555:5;-1:-1:-1;3607:2:28;3592:18;;3579:32;;-1:-1:-1;3662:2:28;3647:18;;3634:32;3689:18;3678:30;;3675:50;;;3721:1;3718;3711:12;3675:50;3744:49;3785:7;3776:6;3765:9;3761:22;3744:49;:::i;:::-;3734:59;;;3268:531;;;;;:::o;3804:191::-;3872:4;3905:18;3897:6;3894:30;3891:56;;;3927:18;;:::i;:::-;-1:-1:-1;3972:1:28;3968:14;3984:4;3964:25;;3804:191::o;4000:753::-;4062:5;4115:3;4108:4;4100:6;4096:17;4092:27;4082:55;;4133:1;4130;4123:12;4082:55;4169:6;4156:20;4195:4;4219:68;4235:51;4283:2;4235:51;:::i;:::-;4219:68;:::i;:::-;4321:15;;;4407:1;4403:10;;;;4391:23;;4387:32;;;4352:12;;;;4431:15;;;4428:35;;;4459:1;4456;4449:12;4428:35;4495:2;4487:6;4483:15;4507:217;4523:6;4518:3;4515:15;4507:217;;;4603:3;4590:17;4620:31;4645:5;4620:31;:::i;:::-;4664:18;;4702:12;;;;4540;;4507:217;;;-1:-1:-1;4742:5:28;4000:753;-1:-1:-1;;;;;;4000:753:28:o;4758:670::-;4812:5;4865:3;4858:4;4850:6;4846:17;4842:27;4832:55;;4883:1;4880;4873:12;4832:55;4919:6;4906:20;4945:4;4969:68;4985:51;5033:2;4985:51;:::i;4969:68::-;5071:15;;;5157:1;5153:10;;;;5141:23;;5137:32;;;5102:12;;;;5181:15;;;5178:35;;;5209:1;5206;5199:12;5178:35;5245:2;5237:6;5233:15;5257:142;5273:6;5268:3;5265:15;5257:142;;;5339:17;;5327:30;;5377:12;;;;5290;;5257:142;;5433:815;5583:6;5591;5599;5652:2;5640:9;5631:7;5627:23;5623:32;5620:52;;;5668:1;5665;5658:12;5620:52;5708:9;5695:23;5737:18;5778:2;5770:6;5767:14;5764:34;;;5794:1;5791;5784:12;5764:34;5817:69;5878:7;5869:6;5858:9;5854:22;5817:69;:::i;:::-;5807:79;;5939:2;5928:9;5924:18;5911:32;5895:48;;5968:2;5958:8;5955:16;5952:36;;;5984:1;5981;5974:12;5952:36;6007:63;6062:7;6051:8;6040:9;6036:24;6007:63;:::i;:::-;5997:73;;6123:2;6112:9;6108:18;6095:32;6079:48;;6152:2;6142:8;6139:16;6136:36;;;6168:1;6165;6158:12;6136:36;;6191:51;6234:7;6223:8;6212:9;6208:24;6191:51;:::i;6253:1042::-;6437:6;6445;6453;6461;6514:3;6502:9;6493:7;6489:23;6485:33;6482:53;;;6531:1;6528;6521:12;6482:53;6571:9;6558:23;6600:18;6641:2;6633:6;6630:14;6627:34;;;6657:1;6654;6647:12;6627:34;6680:69;6741:7;6732:6;6721:9;6717:22;6680:69;:::i;:::-;6670:79;;6802:2;6791:9;6787:18;6774:32;6758:48;;6831:2;6821:8;6818:16;6815:36;;;6847:1;6844;6837:12;6815:36;6870:63;6925:7;6914:8;6903:9;6899:24;6870:63;:::i;:::-;6860:73;;6986:2;6975:9;6971:18;6958:32;6942:48;;7015:2;7005:8;7002:16;6999:36;;;7031:1;7028;7021:12;6999:36;7054:63;7109:7;7098:8;7087:9;7083:24;7054:63;:::i;:::-;7044:73;;7170:2;7159:9;7155:18;7142:32;7126:48;;7199:2;7189:8;7186:16;7183:36;;;7215:1;7212;7205:12;7183:36;;7238:51;7281:7;7270:8;7259:9;7255:24;7238:51;:::i;:::-;7228:61;;;6253:1042;;;;;;;:::o;7300:247::-;7359:6;7412:2;7400:9;7391:7;7387:23;7383:32;7380:52;;;7428:1;7425;7418:12;7380:52;7467:9;7454:23;7486:31;7511:5;7486:31;:::i;7552:184::-;7622:6;7675:2;7663:9;7654:7;7650:23;7646:32;7643:52;;;7691:1;7688;7681:12;7643:52;-1:-1:-1;7714:16:28;;7552:184;-1:-1:-1;7552:184:28:o;8020:245::-;8087:6;8140:2;8128:9;8119:7;8115:23;8111:32;8108:52;;;8156:1;8153;8146:12;8108:52;8188:9;8182:16;8207:28;8229:5;8207:28;:::i;8270:533::-;8545:25;;;8601:2;8586:18;;8579:34;;;;-1:-1:-1;;;;;8649:32:28;8644:2;8629:18;;8622:60;8718:3;8713:2;8698:18;;8691:31;;;-1:-1:-1;8738:19:28;;;8731:30;8669:3;8778:19;;8270:533::o;9691:250::-;9776:1;9786:113;9800:6;9797:1;9794:13;9786:113;;;9876:11;;;9870:18;9857:11;;;9850:39;9822:2;9815:10;9786:113;;;-1:-1:-1;;9933:1:28;9915:16;;9908:27;9691:250::o;9946:287::-;10075:3;10113:6;10107:13;10129:66;10188:6;10183:3;10176:4;10168:6;10164:17;10129:66;:::i;:::-;10211:16;;;;;9946:287;-1:-1:-1;;9946:287:28:o;10587:270::-;10628:3;10666:5;10660:12;10693:6;10688:3;10681:19;10709:76;10778:6;10771:4;10766:3;10762:14;10755:4;10748:5;10744:16;10709:76;:::i;:::-;10839:2;10818:15;-1:-1:-1;;10814:29:28;10805:39;;;;10846:4;10801:50;;10587:270;-1:-1:-1;;10587:270:28:o;10862:1448::-;-1:-1:-1;;;;;11311:15:28;;;11293:34;;11242:3;11346:2;11364:18;;;11357:31;;;11437:13;;11227:19;;;11459:22;;;11194:4;;11539:15;;;;11265:19;;11346:2;11273:3;11497:19;;;11194:4;11582:178;11596:6;11593:1;11590:13;11582:178;;;11661:13;;11657:22;;11645:35;;11735:15;;;;11700:12;;;;11618:1;11611:9;11582:178;;;-1:-1:-1;;11796:19:28;;;11791:2;11776:18;;11769:47;11866:13;;11888:21;;;11927:12;;;;-1:-1:-1;11866:13:28;-1:-1:-1;11964:15:28;;;11999:1;12009:189;12025:8;12020:3;12017:17;12009:189;;;12094:15;;12080:30;;12132:14;;;;12171:17;;;;12053:1;12044:11;12009:189;;;12013:3;;;;12245:9;12238:5;12234:21;12229:2;12218:9;12214:18;12207:49;12273:31;12298:5;12290:6;12273:31;:::i;12727:462::-;12831:6;12839;12847;12900:2;12888:9;12879:7;12875:23;12871:32;12868:52;;;12916:1;12913;12906:12;12868:52;12948:9;12942:16;12967:31;12992:5;12967:31;:::i;:::-;13067:2;13052:18;;13046:25;13017:5;;-1:-1:-1;13080:33:28;13046:25;13080:33;:::i;:::-;13132:7;13122:17;;;13179:2;13168:9;13164:18;13158:25;13148:35;;12727:462;;;;;:::o;13194:127::-;13255:10;13250:3;13246:20;13243:1;13236:31;13286:4;13283:1;13276:15;13310:4;13307:1;13300:15;13326:127;13387:10;13382:3;13378:20;13375:1;13368:31;13418:4;13415:1;13408:15;13442:4;13439:1;13432:15;13458:125;13523:9;;;13544:10;;;13541:36;;;13557:18;;:::i;13995:168::-;14068:9;;;14099;;14116:15;;;14110:22;;14096:37;14086:71;;14137:18;;:::i;14168:217::-;14208:1;14234;14224:132;;14278:10;14273:3;14269:20;14266:1;14259:31;14313:4;14310:1;14303:15;14341:4;14338:1;14331:15;14224:132;-1:-1:-1;14370:9:28;;14168:217::o;14390:128::-;14457:9;;;14478:11;;;14475:37;;;14492:18;;:::i;14523:188::-;14602:13;;-1:-1:-1;;;;;14644:42:28;;14634:53;;14624:81;;14701:1;14698;14691:12;14624:81;14523:188;;;:::o;14716:450::-;14803:6;14811;14819;14872:2;14860:9;14851:7;14847:23;14843:32;14840:52;;;14888:1;14885;14878:12;14840:52;14911:40;14941:9;14911:40;:::i;:::-;14901:50;;14970:49;15015:2;15004:9;15000:18;14970:49;:::i;:::-;14960:59;;15062:2;15051:9;15047:18;15041:25;15106:10;15099:5;15095:22;15088:5;15085:33;15075:61;;15132:1;15129;15122:12;15075:61;15155:5;15145:15;;;14716:450;;;;;:::o;15171:251::-;15241:6;15294:2;15282:9;15273:7;15269:23;15265:32;15262:52;;;15310:1;15307;15300:12;15262:52;15342:9;15336:16;15361:31;15386:5;15361:31;:::i\", \"linkReferences\": {}, \"immutableReferences\": { \"31558\": [ { \"start\": 311, \"length\": 32 }, { \"start\": 913, \"length\": 32 }, { \"start\": 1111, \"length\": 32 }, { \"start\": 1752, \"length\": 32 }, { \"start\": 2005, \"length\": 32 }, { \"start\": 2161, \"length\": 32 }, { \"start\": 2900, \"length\": 32 }, { \"start\": 3046, \"length\": 32 }, { \"start\": 3384, \"length\": 32 }, { \"start\": 4053, \"length\": 32 } ] } }, \"methodIdentifiers\": { \"WETH_ADDRESS()\": \"040141e5\", \"call(address,uint256,bytes)\": \"6dbf2fa0\", \"executeArbitrage(address,address,uint256,address)\": \"00fb4304\", \"getAmountIn((uint256,uint256,uint256,bool),(uint256,uint256,uint256,bool))\": \"eb6b2116\", \"getDenominator((uint256,uint256,uint256,bool),(uint256,uint256,uint256,bool))\": \"1fa7d39b\", \"getNumerator((uint256,uint256,uint256,bool),(uint256,uint256,uint256,bool))\": \"00bb7d67\", \"makeFlashLoan(address[],uint256[],bytes)\": \"c9a69562\", \"owner()\": \"8da5cb5b\", \"receiveFlashLoan(address[],uint256[],uint256[],bytes)\": \"f04f2707\", \"renounceOwnership()\": \"715018a6\", \"transferOwnership(address)\": \"f2fde38b\", \"withdrawETHToOwner()\": \"77432b8c\", \"withdrawWETHToOwner()\": \"ea3e506c\" }, \"rawMetadata\": \"{\\\"compiler\\\":{\\\"version\\\":\\\"0.8.19+commit.7dd6d404\\\"},\\\"language\\\":\\\"Solidity\\\",\\\"output\\\":{\\\"abi\\\":[{\\\"inputs\\\":[{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"_wethAddress\\\",\\\"type\\\":\\\"address\\\"}],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"constructor\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"previousOwner\\\",\\\"type\\\":\\\"address\\\"},{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"newOwner\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"OwnershipTransferred\\\",\\\"type\\\":\\\"event\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"WETH_ADDRESS\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"address payable\\\",\\\"name\\\":\\\"_to\\\",\\\"type\\\":\\\"address\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"_value\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"bytes\\\",\\\"name\\\":\\\"_data\\\",\\\"type\\\":\\\"bytes\\\"}],\\\"name\\\":\\\"call\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"firstPairAddress\\\",\\\"type\\\":\\\"address\\\"},{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"secondPairAddress\\\",\\\"type\\\":\\\"address\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"percentageToPayToCoinbase\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"recipient\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"executeArbitrage\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"components\\\":[{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"reserve0\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"reserve1\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"price\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"bool\\\",\\\"name\\\":\\\"isWETHZero\\\",\\\"type\\\":\\\"bool\\\"}],\\\"internalType\\\":\\\"struct IPairReserves.PairReserves\\\",\\\"name\\\":\\\"firstPairData\\\",\\\"type\\\":\\\"tuple\\\"},{\\\"components\\\":[{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"reserve0\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"reserve1\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"price\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"bool\\\",\\\"name\\\":\\\"isWETHZero\\\",\\\"type\\\":\\\"bool\\\"}],\\\"internalType\\\":\\\"struct IPairReserves.PairReserves\\\",\\\"name\\\":\\\"secondPairData\\\",\\\"type\\\":\\\"tuple\\\"}],\\\"name\\\":\\\"getAmountIn\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"uint256\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"components\\\":[{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"reserve0\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"reserve1\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"price\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"bool\\\",\\\"name\\\":\\\"isWETHZero\\\",\\\"type\\\":\\\"bool\\\"}],\\\"internalType\\\":\\\"struct IPairReserves.PairReserves\\\",\\\"name\\\":\\\"firstPairData\\\",\\\"type\\\":\\\"tuple\\\"},{\\\"components\\\":[{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"reserve0\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"reserve1\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"price\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"bool\\\",\\\"name\\\":\\\"isWETHZero\\\",\\\"type\\\":\\\"bool\\\"}],\\\"internalType\\\":\\\"struct IPairReserves.PairReserves\\\",\\\"name\\\":\\\"secondPairData\\\",\\\"type\\\":\\\"tuple\\\"}],\\\"name\\\":\\\"getDenominator\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"uint256\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"components\\\":[{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"reserve0\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"reserve1\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"price\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"bool\\\",\\\"name\\\":\\\"isWETHZero\\\",\\\"type\\\":\\\"bool\\\"}],\\\"internalType\\\":\\\"struct IPairReserves.PairReserves\\\",\\\"name\\\":\\\"firstPairData\\\",\\\"type\\\":\\\"tuple\\\"},{\\\"components\\\":[{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"reserve0\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"reserve1\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"price\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"bool\\\",\\\"name\\\":\\\"isWETHZero\\\",\\\"type\\\":\\\"bool\\\"}],\\\"internalType\\\":\\\"struct IPairReserves.PairReserves\\\",\\\"name\\\":\\\"secondPairData\\\",\\\"type\\\":\\\"tuple\\\"}],\\\"name\\\":\\\"getNumerator\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"uint256\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"contract IERC20[]\\\",\\\"name\\\":\\\"tokens\\\",\\\"type\\\":\\\"address[]\\\"},{\\\"internalType\\\":\\\"uint256[]\\\",\\\"name\\\":\\\"amounts\\\",\\\"type\\\":\\\"uint256[]\\\"},{\\\"internalType\\\":\\\"bytes\\\",\\\"name\\\":\\\"userData\\\",\\\"type\\\":\\\"bytes\\\"}],\\\"name\\\":\\\"makeFlashLoan\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"owner\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"contract IERC20[]\\\",\\\"name\\\":\\\"tokens\\\",\\\"type\\\":\\\"address[]\\\"},{\\\"internalType\\\":\\\"uint256[]\\\",\\\"name\\\":\\\"amounts\\\",\\\"type\\\":\\\"uint256[]\\\"},{\\\"internalType\\\":\\\"uint256[]\\\",\\\"name\\\":\\\"feeAmounts\\\",\\\"type\\\":\\\"uint256[]\\\"},{\\\"internalType\\\":\\\"bytes\\\",\\\"name\\\":\\\"userData\\\",\\\"type\\\":\\\"bytes\\\"}],\\\"name\\\":\\\"receiveFlashLoan\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"renounceOwnership\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"newOwner\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"transferOwnership\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"withdrawETHToOwner\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"withdrawWETHToOwner\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"stateMutability\\\":\\\"payable\\\",\\\"type\\\":\\\"receive\\\"}],\\\"devdoc\\\":{\\\"kind\\\":\\\"dev\\\",\\\"methods\\\":{\\\"call(address,uint256,bytes)\\\":{\\\"details\\\":\\\"Only the contract owner can call this function.Reverted calls will result in a revert.\\\",\\\"params\\\":{\\\"_data\\\":\\\"The calldata to send with the call.\\\",\\\"_to\\\":\\\"The address of the contract to call.\\\",\\\"_value\\\":\\\"The amount of Ether to send with the call.\\\"}},\\\"executeArbitrage(address,address,uint256,address)\\\":{\\\"details\\\":\\\"Only the contract owner can call this function.\\\",\\\"params\\\":{\\\"firstPairAddress\\\":\\\"Address of the first Uniswap V2 pair.\\\",\\\"secondPairAddress\\\":\\\"Address of the second Uniswap V2 pair.\\\"}},\\\"getAmountIn((uint256,uint256,uint256,bool),(uint256,uint256,uint256,bool))\\\":{\\\"params\\\":{\\\"firstPairData\\\":\\\"Struct containing data about the first Uniswap V2 pair.\\\",\\\"secondPairData\\\":\\\"Struct containing data about the second Uniswap V2 pair.\\\"},\\\"returns\\\":{\\\"_0\\\":\\\"amountIn, the optimal amount to trade to arbitrage two v2 pairs.\\\"}},\\\"owner()\\\":{\\\"details\\\":\\\"Returns the address of the current owner.\\\"},\\\"receiveFlashLoan(address[],uint256[],uint256[],bytes)\\\":{\\\"details\\\":\\\"When `flashLoan` is called on the Vault, it invokes the `receiveFlashLoan` hook on the recipient. At the time of the call, the Vault will have transferred `amounts` for `tokens` to the recipient. Before this call returns, the recipient must have transferred `amounts` plus `feeAmounts` for each token back to the Vault, or else the entire flash loan will revert. `userData` is the same value passed in the `IVault.flashLoan` call.\\\"},\\\"renounceOwnership()\\\":{\\\"details\\\":\\\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\\\"},\\\"transferOwnership(address)\\\":{\\\"details\\\":\\\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\\\"},\\\"withdrawETHToOwner()\\\":{\\\"details\\\":\\\"Only the contract owner can call this function.\\\"},\\\"withdrawWETHToOwner()\\\":{\\\"details\\\":\\\"Only the contract owner can call this function.\\\"}},\\\"version\\\":1},\\\"userdoc\\\":{\\\"kind\\\":\\\"user\\\",\\\"methods\\\":{\\\"call(address,uint256,bytes)\\\":{\\\"notice\\\":\\\"Executes a call to another contract with the provided data and value.\\\"},\\\"executeArbitrage(address,address,uint256,address)\\\":{\\\"notice\\\":\\\"Executes an arbitrage transaction between two Uniswap V2 pairs.Pair addresses need to be computed off-chain.\\\"},\\\"getAmountIn((uint256,uint256,uint256,bool),(uint256,uint256,uint256,bool))\\\":{\\\"notice\\\":\\\"Calculates the required input amount for the arbitrage transaction.\\\"},\\\"withdrawETHToOwner()\\\":{\\\"notice\\\":\\\"Transfers all ETH held by the contract to the contract owner.\\\"},\\\"withdrawWETHToOwner()\\\":{\\\"notice\\\":\\\"Transfers all WETH held by the contract to the contract owner.\\\"}},\\\"version\\\":1}},\\\"settings\\\":{\\\"compilationTarget\\\":{\\\"src/blindBackrunFL.sol\\\":\\\"BlindBackrunFL\\\"},\\\"evmVersion\\\":\\\"london\\\",\\\"libraries\\\":{},\\\"metadata\\\":{\\\"bytecodeHash\\\":\\\"ipfs\\\"},\\\"optimizer\\\":{\\\"enabled\\\":true,\\\"runs\\\":200},\\\"remappings\\\":[\\\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\\\",\\\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\\\",\\\":forge-std/=lib/openzeppelin-contracts/lib/forge-std/src/\\\",\\\":openzeppelin-contracts/=lib/openzeppelin-contracts/\\\",\\\":openzeppelin/=lib/openzeppelin-contracts/contracts/\\\"]},\\\"sources\\\":{\\\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\\\":{\\\"keccak256\\\":\\\"0x923b9774b81c1abfb992262ae7763b6e6de77b077a7180d53c6ebb7b1c8bd648\\\",\\\"license\\\":\\\"MIT\\\",\\\"urls\\\":[\\\"bzz-raw://53445dc0431f9b45c06f567c6091da961d4087bec0010cca5bd62100fa624a38\\\",\\\"dweb:/ipfs/QmNvBYpBv183czrAqNXr76E8M3LF93ouAJFeAcHfb59Rcx\\\"]},\\\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\\\":{\\\"keccak256\\\":\\\"0x00c839ff53d07d19db2e7cfa1e5133f9ee90a8d64b0e2e57f50446a2d1a3a0e0\\\",\\\"license\\\":\\\"MIT\\\",\\\"urls\\\":[\\\"bzz-raw://3dac621d015a68a5251b1e5d41dda0faf252699bf6e8bcf46a958b29964d9dd1\\\",\\\"dweb:/ipfs/QmP9axjgZv4cezAhALoTemM62sdLtMDJ9MGTxECnNwHgSJ\\\"]},\\\"lib/openzeppelin-contracts/contracts/utils/Context.sol\\\":{\\\"keccak256\\\":\\\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\\\",\\\"license\\\":\\\"MIT\\\",\\\"urls\\\":[\\\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\\\",\\\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\\\"]},\\\"lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol\\\":{\\\"keccak256\\\":\\\"0xa80cb30fccbba7c8ff72ac82cc898576a78d4c3031e85676840048f3fe195f5d\\\",\\\"license\\\":\\\"MIT\\\",\\\"urls\\\":[\\\"bzz-raw://22fff2b2370631317e0e4bf36eabb136e96f1db5d5993c61e13b27d7615b504f\\\",\\\"dweb:/ipfs/QmfTW395az3LUhe3Gm5BUCwkaj9Sk1fURZKvHL2XzDHYQk\\\"]},\\\"src/BlindBackrun.sol\\\":{\\\"keccak256\\\":\\\"0x94cb76a0a711d8725db99bf728521638548ae444077d4485e3a23fb87f4d87da\\\",\\\"urls\\\":[\\\"bzz-raw://bbe803026bb99cb6f926f19a5d8fa50c8ea7cee30f49fd58df906c8cc91b7aa1\\\",\\\"dweb:/ipfs/QmSynZeD4hv25hH9e5ZgFzB78WbxYjpza3gRPrrPanenAo\\\"]},\\\"src/blindBackrunFL.sol\\\":{\\\"keccak256\\\":\\\"0xd823a06388208db5cfdf08f3d6a87ca26876777317dd721037a845d4e25ffd4f\\\",\\\"urls\\\":[\\\"bzz-raw://9e07a30427d99d1a3dae21d358f49fb1f1eee7bbf217854fa4dd741d595ecd7b\\\",\\\"dweb:/ipfs/Qmd2MVgu5qRd1Yuub2rUdQg1F61MKBX6ZHUCmaGbsDxL97\\\"]}},\\\"version\\\":1}\", \"metadata\": { \"compiler\": { \"version\": \"0.8.19+commit.7dd6d404\" }, \"language\": \"Solidity\", \"output\": { \"abi\": [ { \"inputs\": [ { \"internalType\": \"address\", \"name\": \"_wethAddress\", \"type\": \"address\" } ], \"stateMutability\": \"nonpayable\", \"type\": \"constructor\" }, { \"inputs\": [ { \"internalType\": \"address\", \"name\": \"previousOwner\", \"type\": \"address\", \"indexed\": true }, { \"internalType\": \"address\", \"name\": \"newOwner\", \"type\": \"address\", \"indexed\": true } ], \"type\": \"event\", \"name\": \"OwnershipTransferred\", \"anonymous\": false }, { \"inputs\": [], \"stateMutability\": \"view\", \"type\": \"function\", \"name\": \"WETH_ADDRESS\", \"outputs\": [ { \"internalType\": \"address\", \"name\": \"\", \"type\": \"address\" } ] }, { \"inputs\": [ { \"internalType\": \"address payable\", \"name\": \"_to\", \"type\": \"address\" }, { \"internalType\": \"uint256\", \"name\": \"_value\", \"type\": \"uint256\" }, { \"internalType\": \"bytes\", \"name\": \"_data\", \"type\": \"bytes\" } ], \"stateMutability\": \"nonpayable\", \"type\": \"function\", \"name\": \"call\" }, { \"inputs\": [ { \"internalType\": \"address\", \"name\": \"firstPairAddress\", \"type\": \"address\" }, { \"internalType\": \"address\", \"name\": \"secondPairAddress\", \"type\": \"address\" }, { \"internalType\": \"uint256\", \"name\": \"percentageToPayToCoinbase\", \"type\": \"uint256\" }, { \"internalType\": \"address\", \"name\": \"recipient\", \"type\": \"address\" } ], \"stateMutability\": \"nonpayable\", \"type\": \"function\", \"name\": \"executeArbitrage\" }, { \"inputs\": [ { \"internalType\": \"struct IPairReserves.PairReserves\", \"name\": \"firstPairData\", \"type\": \"tuple\", \"components\": [ { \"internalType\": \"uint256\", \"name\": \"reserve0\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"reserve1\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"price\", \"type\": \"uint256\" }, { \"internalType\": \"bool\", \"name\": \"isWETHZero\", \"type\": \"bool\" } ] }, { \"internalType\": \"struct IPairReserves.PairReserves\", \"name\": \"secondPairData\", \"type\": \"tuple\", \"components\": [ { \"internalType\": \"uint256\", \"name\": \"reserve0\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"reserve1\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"price\", \"type\": \"uint256\" }, { \"internalType\": \"bool\", \"name\": \"isWETHZero\", \"type\": \"bool\" } ] } ], \"stateMutability\": \"view\", \"type\": \"function\", \"name\": \"getAmountIn\", \"outputs\": [ { \"internalType\": \"uint256\", \"name\": \"\", \"type\": \"uint256\" } ] }, { \"inputs\": [ { \"internalType\": \"struct IPairReserves.PairReserves\", \"name\": \"firstPairData\", \"type\": \"tuple\", \"components\": [ { \"internalType\": \"uint256\", \"name\": \"reserve0\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"reserve1\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"price\", \"type\": \"uint256\" }, { \"internalType\": \"bool\", \"name\": \"isWETHZero\", \"type\": \"bool\" } ] }, { \"internalType\": \"struct IPairReserves.PairReserves\", \"name\": \"secondPairData\", \"type\": \"tuple\", \"components\": [ { \"internalType\": \"uint256\", \"name\": \"reserve0\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"reserve1\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"price\", \"type\": \"uint256\" }, { \"internalType\": \"bool\", \"name\": \"isWETHZero\", \"type\": \"bool\" } ] } ], \"stateMutability\": \"view\", \"type\": \"function\", \"name\": \"getDenominator\", \"outputs\": [ { \"internalType\": \"uint256\", \"name\": \"\", \"type\": \"uint256\" } ] }, { \"inputs\": [ { \"internalType\": \"struct IPairReserves.PairReserves\", \"name\": \"firstPairData\", \"type\": \"tuple\", \"components\": [ { \"internalType\": \"uint256\", \"name\": \"reserve0\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"reserve1\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"price\", \"type\": \"uint256\" }, { \"internalType\": \"bool\", \"name\": \"isWETHZero\", \"type\": \"bool\" } ] }, { \"internalType\": \"struct IPairReserves.PairReserves\", \"name\": \"secondPairData\", \"type\": \"tuple\", \"components\": [ { \"internalType\": \"uint256\", \"name\": \"reserve0\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"reserve1\", \"type\": \"uint256\" }, { \"internalType\": \"uint256\", \"name\": \"price\", \"type\": \"uint256\" }, { \"internalType\": \"bool\", \"name\": \"isWETHZero\", \"type\": \"bool\" } ] } ], \"stateMutability\": \"view\", \"type\": \"function\", \"name\": \"getNumerator\", \"outputs\": [ { \"internalType\": \"uint256\", \"name\": \"\", \"type\": \"uint256\" } ] }, { \"inputs\": [ { \"internalType\": \"contract IERC20[]\", \"name\": \"tokens\", \"type\": \"address[]\" }, { \"internalType\": \"uint256[]\", \"name\": \"amounts\", \"type\": \"uint256[]\" }, { \"internalType\": \"bytes\", \"name\": \"userData\", \"type\": \"bytes\" } ], \"stateMutability\": \"nonpayable\", \"type\": \"function\", \"name\": \"makeFlashLoan\" }, { \"inputs\": [], \"stateMutability\": \"view\", \"type\": \"function\", \"name\": \"owner\", \"outputs\": [ { \"internalType\": \"address\", \"name\": \"\", \"type\": \"address\" } ] }, { \"inputs\": [ { \"internalType\": \"contract IERC20[]\", \"name\": \"tokens\", \"type\": \"address[]\" }, { \"internalType\": \"uint256[]\", \"name\": \"amounts\", \"type\": \"uint256[]\" }, { \"internalType\": \"uint256[]\", \"name\": \"feeAmounts\", \"type\": \"uint256[]\" }, { \"internalType\": \"bytes\", \"name\": \"userData\", \"type\": \"bytes\" } ], \"stateMutability\": \"nonpayable\", \"type\": \"function\", \"name\": \"receiveFlashLoan\" }, { \"inputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\", \"name\": \"renounceOwnership\" }, { \"inputs\": [ { \"internalType\": \"address\", \"name\": \"newOwner\", \"type\": \"address\" } ], \"stateMutability\": \"nonpayable\", \"type\": \"function\", \"name\": \"transferOwnership\" }, { \"inputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\", \"name\": \"withdrawETHToOwner\" }, { \"inputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\", \"name\": \"withdrawWETHToOwner\" }, { \"inputs\": [], \"stateMutability\": \"payable\", \"type\": \"receive\" } ], \"devdoc\": { \"kind\": \"dev\", \"methods\": { \"call(address,uint256,bytes)\": { \"details\": \"Only the contract owner can call this function.Reverted calls will result in a revert.\", \"params\": { \"_data\": \"The calldata to send with the call.\", \"_to\": \"The address of the contract to call.\", \"_value\": \"The amount of Ether to send with the call.\" } }, \"executeArbitrage(address,address,uint256,address)\": { \"details\": \"Only the contract owner can call this function.\", \"params\": { \"firstPairAddress\": \"Address of the first Uniswap V2 pair.\", \"secondPairAddress\": \"Address of the second Uniswap V2 pair.\" } }, \"getAmountIn((uint256,uint256,uint256,bool),(uint256,uint256,uint256,bool))\": { \"params\": { \"firstPairData\": \"Struct containing data about the first Uniswap V2 pair.\", \"secondPairData\": \"Struct containing data about the second Uniswap V2 pair.\" }, \"returns\": { \"_0\": \"amountIn, the optimal amount to trade to arbitrage two v2 pairs.\" } }, \"owner()\": { \"details\": \"Returns the address of the current owner.\" }, \"receiveFlashLoan(address[],uint256[],uint256[],bytes)\": { \"details\": \"When `flashLoan` is called on the Vault, it invokes the `receiveFlashLoan` hook on the recipient. At the time of the call, the Vault will have transferred `amounts` for `tokens` to the recipient. Before this call returns, the recipient must have transferred `amounts` plus `feeAmounts` for each token back to the Vault, or else the entire flash loan will revert. `userData` is the same value passed in the `IVault.flashLoan` call.\" }, \"renounceOwnership()\": { \"details\": \"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\" }, \"transferOwnership(address)\": { \"details\": \"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\" }, \"withdrawETHToOwner()\": { \"details\": \"Only the contract owner can call this function.\" }, \"withdrawWETHToOwner()\": { \"details\": \"Only the contract owner can call this function.\" } }, \"version\": 1 }, \"userdoc\": { \"kind\": \"user\", \"methods\": { \"call(address,uint256,bytes)\": { \"notice\": \"Executes a call to another contract with the provided data and value.\" }, \"executeArbitrage(address,address,uint256,address)\": { \"notice\": \"Executes an arbitrage transaction between two Uniswap V2 pairs.Pair addresses need to be computed off-chain.\" }, \"getAmountIn((uint256,uint256,uint256,bool),(uint256,uint256,uint256,bool))\": { \"notice\": \"Calculates the required input amount for the arbitrage transaction.\" }, \"withdrawETHToOwner()\": { \"notice\": \"Transfers all ETH held by the contract to the contract owner.\" }, \"withdrawWETHToOwner()\": { \"notice\": \"Transfers all WETH held by the contract to the contract owner.\" } }, \"version\": 1 } }, \"settings\": { \"remappings\": [ \":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\", \":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\", \":forge-std/=lib/openzeppelin-contracts/lib/forge-std/src/\", \":openzeppelin-contracts/=lib/openzeppelin-contracts/\", \":openzeppelin/=lib/openzeppelin-contracts/contracts/\" ], \"optimizer\": { \"enabled\": true, \"runs\": 200 }, \"metadata\": { \"bytecodeHash\": \"ipfs\" }, \"compilationTarget\": { \"src/blindBackrunFL.sol\": \"BlindBackrunFL\" }, \"libraries\": {} }, \"sources\": { \"lib/openzeppelin-contracts/contracts/access/Ownable.sol\": { \"keccak256\": \"0x923b9774b81c1abfb992262ae7763b6e6de77b077a7180d53c6ebb7b1c8bd648\", \"urls\": [ \"bzz-raw://53445dc0431f9b45c06f567c6091da961d4087bec0010cca5bd62100fa624a38\", \"dweb:/ipfs/QmNvBYpBv183czrAqNXr76E8M3LF93ouAJFeAcHfb59Rcx\" ], \"license\": \"MIT\" }, \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\": { \"keccak256\": \"0x00c839ff53d07d19db2e7cfa1e5133f9ee90a8d64b0e2e57f50446a2d1a3a0e0\", \"urls\": [ \"bzz-raw://3dac621d015a68a5251b1e5d41dda0faf252699bf6e8bcf46a958b29964d9dd1\", \"dweb:/ipfs/QmP9axjgZv4cezAhALoTemM62sdLtMDJ9MGTxECnNwHgSJ\" ], \"license\": \"MIT\" }, \"lib/openzeppelin-contracts/contracts/utils/Context.sol\": { \"keccak256\": \"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\", \"urls\": [ \"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\", \"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\" ], \"license\": \"MIT\" }, \"lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol\": { \"keccak256\": \"0xa80cb30fccbba7c8ff72ac82cc898576a78d4c3031e85676840048f3fe195f5d\", \"urls\": [ \"bzz-raw://22fff2b2370631317e0e4bf36eabb136e96f1db5d5993c61e13b27d7615b504f\", \"dweb:/ipfs/QmfTW395az3LUhe3Gm5BUCwkaj9Sk1fURZKvHL2XzDHYQk\" ], \"license\": \"MIT\" }, \"src/BlindBackrun.sol\": { \"keccak256\": \"0x94cb76a0a711d8725db99bf728521638548ae444077d4485e3a23fb87f4d87da\", \"urls\": [ \"bzz-raw://bbe803026bb99cb6f926f19a5d8fa50c8ea7cee30f49fd58df906c8cc91b7aa1\", \"dweb:/ipfs/QmSynZeD4hv25hH9e5ZgFzB78WbxYjpza3gRPrrPanenAo\" ], \"license\": null }, \"src/blindBackrunFL.sol\": { \"keccak256\": \"0xd823a06388208db5cfdf08f3d6a87ca26876777317dd721037a845d4e25ffd4f\", \"urls\": [ \"bzz-raw://9e07a30427d99d1a3dae21d358f49fb1f1eee7bbf217854fa4dd741d595ecd7b\", \"dweb:/ipfs/Qmd2MVgu5qRd1Yuub2rUdQg1F61MKBX6ZHUCmaGbsDxL97\" ], \"license\": null } }, \"version\": 1 }, \"ast\": { \"absolutePath\": \"src/blindBackrunFL.sol\", \"id\": 30460, \"exportedSymbols\": { \"BlindBackrun\": [ 32259 ], \"BlindBackrunFL\": [ 30459 ], \"Context\": [ 824 ], \"IERC20\": [ 777 ], \"IFlashLoanRecipient\": [ 30342 ], \"IPairReserves\": [ 31548 ], \"IUniswapV2Pair\": [ 31538 ], \"IVault\": [ 30325 ], \"IWETH\": [ 31507 ], \"Ownable\": [ 112 ], \"SafeMath\": [ 1136 ] }, \"nodeType\": \"SourceUnit\", \"src\": \"0:2345:26\", \"nodes\": [ { \"id\": 30305, \"nodeType\": \"PragmaDirective\", \"src\": \"0:23:26\", \"nodes\": [], \"literals\": [ \"solidity\", \"^\", \"0.8\", \".0\" ] }, { \"id\": 30306, \"nodeType\": \"ImportDirective\", \"src\": \"25:45:26\", \"nodes\": [], \"absolutePath\": \"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\", \"file\": \"openzeppelin/token/ERC20/IERC20.sol\", \"nameLocation\": \"-1:-1:-1\", \"scope\": 30460, \"sourceUnit\": 778, \"symbolAliases\": [], \"unitAlias\": \"\" }, { \"id\": 30307, \"nodeType\": \"ImportDirective\", \"src\": \"71:41:26\", \"nodes\": [], \"absolutePath\": \"lib/openzeppelin-contracts/contracts/access/Ownable.sol\", \"file\": \"openzeppelin/access/Ownable.sol\", \"nameLocation\": \"-1:-1:-1\", \"scope\": 30460, \"sourceUnit\": 113, \"symbolAliases\": [], \"unitAlias\": \"\" }, { \"id\": 30308, \"nodeType\": \"ImportDirective\", \"src\": \"113:46:26\", \"nodes\": [], \"absolutePath\": \"lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol\", \"file\": \"openzeppelin/utils/math/SafeMath.sol\", \"nameLocation\": \"-1:-1:-1\", \"scope\": 30460, \"sourceUnit\": 1137, \"symbolAliases\": [], \"unitAlias\": \"\" }, { \"id\": 30309, \"nodeType\": \"ImportDirective\", \"src\": \"160:28:26\", \"nodes\": [], \"absolutePath\": \"src/BlindBackrun.sol\", \"file\": \"./BlindBackrun.sol\", \"nameLocation\": \"-1:-1:-1\", \"scope\": 30460, \"sourceUnit\": 32260, \"symbolAliases\": [], \"unitAlias\": \"\" }, { \"id\": 30325, \"nodeType\": \"ContractDefinition\", \"src\": \"190:195:26\", \"nodes\": [ { \"id\": 30324, \"nodeType\": \"FunctionDefinition\", \"src\": \"213:170:26\", \"nodes\": [], \"functionSelector\": \"5c38449e\", \"implemented\": false, \"kind\": \"function\", \"modifiers\": [], \"name\": \"flashLoan\", \"nameLocation\": \"222:9:26\", \"parameters\": { \"id\": 30322, \"nodeType\": \"ParameterList\", \"parameters\": [ { \"constant\": false, \"id\": 30312, \"mutability\": \"mutable\", \"name\": \"recipient\", \"nameLocation\": \"261:9:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30324, \"src\": \"241:29:26\", \"stateVariable\": false, \"storageLocation\": \"default\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IFlashLoanRecipient_$30342\", \"typeString\": \"contract IFlashLoanRecipient\" }, \"typeName\": { \"id\": 30311, \"nodeType\": \"UserDefinedTypeName\", \"pathNode\": { \"id\": 30310, \"name\": \"IFlashLoanRecipient\", \"nameLocations\": [ \"241:19:26\" ], \"nodeType\": \"IdentifierPath\", \"referencedDeclaration\": 30342, \"src\": \"241:19:26\" }, \"referencedDeclaration\": 30342, \"src\": \"241:19:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IFlashLoanRecipient_$30342\", \"typeString\": \"contract IFlashLoanRecipient\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30316, \"mutability\": \"mutable\", \"name\": \"tokens\", \"nameLocation\": \"296:6:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30324, \"src\": \"280:22:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_contract$_IERC20_$777_$dyn_memory_ptr\", \"typeString\": \"contract IERC20[]\" }, \"typeName\": { \"baseType\": { \"id\": 30314, \"nodeType\": \"UserDefinedTypeName\", \"pathNode\": { \"id\": 30313, \"name\": \"IERC20\", \"nameLocations\": [ \"280:6:26\" ], \"nodeType\": \"IdentifierPath\", \"referencedDeclaration\": 777, \"src\": \"280:6:26\" }, \"referencedDeclaration\": 777, \"src\": \"280:6:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IERC20_$777\", \"typeString\": \"contract IERC20\" } }, \"id\": 30315, \"nodeType\": \"ArrayTypeName\", \"src\": \"280:8:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_contract$_IERC20_$777_$dyn_storage_ptr\", \"typeString\": \"contract IERC20[]\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30319, \"mutability\": \"mutable\", \"name\": \"amounts\", \"nameLocation\": \"329:7:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30324, \"src\": \"312:24:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_memory_ptr\", \"typeString\": \"uint256[]\" }, \"typeName\": { \"baseType\": { \"id\": 30317, \"name\": \"uint256\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"312:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } }, \"id\": 30318, \"nodeType\": \"ArrayTypeName\", \"src\": \"312:9:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_storage_ptr\", \"typeString\": \"uint256[]\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30321, \"mutability\": \"mutable\", \"name\": \"userData\", \"nameLocation\": \"359:8:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30324, \"src\": \"346:21:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_bytes_memory_ptr\", \"typeString\": \"bytes\" }, \"typeName\": { \"id\": 30320, \"name\": \"bytes\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"346:5:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_bytes_storage_ptr\", \"typeString\": \"bytes\" } }, \"visibility\": \"internal\" } ], \"src\": \"231:142:26\" }, \"returnParameters\": { \"id\": 30323, \"nodeType\": \"ParameterList\", \"parameters\": [], \"src\": \"382:0:26\" }, \"scope\": 30325, \"stateMutability\": \"nonpayable\", \"virtual\": false, \"visibility\": \"external\" } ], \"abstract\": false, \"baseContracts\": [], \"canonicalName\": \"IVault\", \"contractDependencies\": [], \"contractKind\": \"interface\", \"fullyImplemented\": false, \"linearizedBaseContracts\": [ 30325 ], \"name\": \"IVault\", \"nameLocation\": \"200:6:26\", \"scope\": 30460, \"usedErrors\": [] }, { \"id\": 30342, \"nodeType\": \"ContractDefinition\", \"src\": \"387:714:26\", \"nodes\": [ { \"id\": 30341, \"nodeType\": \"FunctionDefinition\", \"src\": \"924:175:26\", \"nodes\": [], \"documentation\": { \"id\": 30326, \"nodeType\": \"StructuredDocumentation\", \"src\": \"423:496:26\", \"text\": \" @dev When `flashLoan` is called on the Vault, it invokes the `receiveFlashLoan` hook on the recipient.\\n At the time of the call, the Vault will have transferred `amounts` for `tokens` to the recipient. Before this\\n call returns, the recipient must have transferred `amounts` plus `feeAmounts` for each token back to the\\n Vault, or else the entire flash loan will revert.\\n `userData` is the same value passed in the `IVault.flashLoan` call.\" }, \"functionSelector\": \"f04f2707\", \"implemented\": false, \"kind\": \"function\", \"modifiers\": [], \"name\": \"receiveFlashLoan\", \"nameLocation\": \"933:16:26\", \"parameters\": { \"id\": 30339, \"nodeType\": \"ParameterList\", \"parameters\": [ { \"constant\": false, \"id\": 30330, \"mutability\": \"mutable\", \"name\": \"tokens\", \"nameLocation\": \"975:6:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30341, \"src\": \"959:22:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_contract$_IERC20_$777_$dyn_memory_ptr\", \"typeString\": \"contract IERC20[]\" }, \"typeName\": { \"baseType\": { \"id\": 30328, \"nodeType\": \"UserDefinedTypeName\", \"pathNode\": { \"id\": 30327, \"name\": \"IERC20\", \"nameLocations\": [ \"959:6:26\" ], \"nodeType\": \"IdentifierPath\", \"referencedDeclaration\": 777, \"src\": \"959:6:26\" }, \"referencedDeclaration\": 777, \"src\": \"959:6:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IERC20_$777\", \"typeString\": \"contract IERC20\" } }, \"id\": 30329, \"nodeType\": \"ArrayTypeName\", \"src\": \"959:8:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_contract$_IERC20_$777_$dyn_storage_ptr\", \"typeString\": \"contract IERC20[]\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30333, \"mutability\": \"mutable\", \"name\": \"amounts\", \"nameLocation\": \"1008:7:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30341, \"src\": \"991:24:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_memory_ptr\", \"typeString\": \"uint256[]\" }, \"typeName\": { \"baseType\": { \"id\": 30331, \"name\": \"uint256\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"991:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } }, \"id\": 30332, \"nodeType\": \"ArrayTypeName\", \"src\": \"991:9:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_storage_ptr\", \"typeString\": \"uint256[]\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30336, \"mutability\": \"mutable\", \"name\": \"feeAmounts\", \"nameLocation\": \"1042:10:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30341, \"src\": \"1025:27:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_memory_ptr\", \"typeString\": \"uint256[]\" }, \"typeName\": { \"baseType\": { \"id\": 30334, \"name\": \"uint256\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"1025:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } }, \"id\": 30335, \"nodeType\": \"ArrayTypeName\", \"src\": \"1025:9:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_storage_ptr\", \"typeString\": \"uint256[]\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30338, \"mutability\": \"mutable\", \"name\": \"userData\", \"nameLocation\": \"1075:8:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30341, \"src\": \"1062:21:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_bytes_memory_ptr\", \"typeString\": \"bytes\" }, \"typeName\": { \"id\": 30337, \"name\": \"bytes\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"1062:5:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_bytes_storage_ptr\", \"typeString\": \"bytes\" } }, \"visibility\": \"internal\" } ], \"src\": \"949:140:26\" }, \"returnParameters\": { \"id\": 30340, \"nodeType\": \"ParameterList\", \"parameters\": [], \"src\": \"1098:0:26\" }, \"scope\": 30342, \"stateMutability\": \"nonpayable\", \"virtual\": false, \"visibility\": \"external\" } ], \"abstract\": false, \"baseContracts\": [], \"canonicalName\": \"IFlashLoanRecipient\", \"contractDependencies\": [], \"contractKind\": \"interface\", \"fullyImplemented\": false, \"linearizedBaseContracts\": [ 30342 ], \"name\": \"IFlashLoanRecipient\", \"nameLocation\": \"397:19:26\", \"scope\": 30460, \"usedErrors\": [] }, { \"id\": 30459, \"nodeType\": \"ContractDefinition\", \"src\": \"1103:1241:26\", \"nodes\": [ { \"id\": 30352, \"nodeType\": \"VariableDeclaration\", \"src\": \"1170:90:26\", \"nodes\": [], \"constant\": true, \"mutability\": \"constant\", \"name\": \"vault\", \"nameLocation\": \"1194:5:26\", \"scope\": 30459, \"stateVariable\": true, \"storageLocation\": \"default\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IVault_$30325\", \"typeString\": \"contract IVault\" }, \"typeName\": { \"id\": 30348, \"nodeType\": \"UserDefinedTypeName\", \"pathNode\": { \"id\": 30347, \"name\": \"IVault\", \"nameLocations\": [ \"1170:6:26\" ], \"nodeType\": \"IdentifierPath\", \"referencedDeclaration\": 30325, \"src\": \"1170:6:26\" }, \"referencedDeclaration\": 30325, \"src\": \"1170:6:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IVault_$30325\", \"typeString\": \"contract IVault\" } }, \"value\": { \"arguments\": [ { \"hexValue\": \"307842413132323232323232323238643842613434353935386137356130373034643536364246324338\", \"id\": 30350, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"kind\": \"number\", \"lValueRequested\": false, \"nodeType\": \"Literal\", \"src\": \"1217:42:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" }, \"value\": \"0xBA12222222228d8Ba445958a75a0704d566BF2C8\" } ], \"expression\": { \"argumentTypes\": [ { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } ], \"id\": 30349, \"name\": \"IVault\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30325, \"src\": \"1210:6:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_type$_t_contract$_IVault_$30325_$\", \"typeString\": \"type(contract IVault)\" } }, \"id\": 30351, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"kind\": \"typeConversion\", \"lValueRequested\": false, \"nameLocations\": [], \"names\": [], \"nodeType\": \"FunctionCall\", \"src\": \"1210:50:26\", \"tryCall\": false, \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IVault_$30325\", \"typeString\": \"contract IVault\" } }, \"visibility\": \"private\" }, { \"id\": 30361, \"nodeType\": \"FunctionDefinition\", \"src\": \"1267:63:26\", \"nodes\": [], \"body\": { \"id\": 30360, \"nodeType\": \"Block\", \"src\": \"1328:2:26\", \"nodes\": [], \"statements\": [] }, \"implemented\": true, \"kind\": \"constructor\", \"modifiers\": [ { \"arguments\": [ { \"id\": 30357, \"name\": \"_wethAddress\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30354, \"src\": \"1314:12:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } } ], \"id\": 30358, \"kind\": \"baseConstructorSpecifier\", \"modifierName\": { \"id\": 30356, \"name\": \"BlindBackrun\", \"nameLocations\": [ \"1301:12:26\" ], \"nodeType\": \"IdentifierPath\", \"referencedDeclaration\": 32259, \"src\": \"1301:12:26\" }, \"nodeType\": \"ModifierInvocation\", \"src\": \"1301:26:26\" } ], \"name\": \"\", \"nameLocation\": \"-1:-1:-1\", \"parameters\": { \"id\": 30355, \"nodeType\": \"ParameterList\", \"parameters\": [ { \"constant\": false, \"id\": 30354, \"mutability\": \"mutable\", \"name\": \"_wethAddress\", \"nameLocation\": \"1287:12:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30361, \"src\": \"1279:20:26\", \"stateVariable\": false, \"storageLocation\": \"default\", \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" }, \"typeName\": { \"id\": 30353, \"name\": \"address\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"1279:7:26\", \"stateMutability\": \"nonpayable\", \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } }, \"visibility\": \"internal\" } ], \"src\": \"1278:22:26\" }, \"returnParameters\": { \"id\": 30359, \"nodeType\": \"ParameterList\", \"parameters\": [], \"src\": \"1328:0:26\" }, \"scope\": 30459, \"stateMutability\": \"nonpayable\", \"virtual\": false, \"visibility\": \"public\" }, { \"id\": 30385, \"nodeType\": \"FunctionDefinition\", \"src\": \"1336:210:26\", \"nodes\": [], \"body\": { \"id\": 30384, \"nodeType\": \"Block\", \"src\": \"1481:65:26\", \"nodes\": [], \"statements\": [ { \"expression\": { \"arguments\": [ { \"id\": 30378, \"name\": \"this\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": -28, \"src\": \"1507:4:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_BlindBackrunFL_$30459\", \"typeString\": \"contract BlindBackrunFL\" } }, { \"id\": 30379, \"name\": \"tokens\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30365, \"src\": \"1513:6:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_contract$_IERC20_$777_$dyn_memory_ptr\", \"typeString\": \"contract IERC20[] memory\" } }, { \"id\": 30380, \"name\": \"amounts\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30368, \"src\": \"1521:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_memory_ptr\", \"typeString\": \"uint256[] memory\" } }, { \"id\": 30381, \"name\": \"userData\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30370, \"src\": \"1530:8:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_bytes_memory_ptr\", \"typeString\": \"bytes memory\" } } ], \"expression\": { \"argumentTypes\": [ { \"typeIdentifier\": \"t_contract$_BlindBackrunFL_$30459\", \"typeString\": \"contract BlindBackrunFL\" }, { \"typeIdentifier\": \"t_array$_t_contract$_IERC20_$777_$dyn_memory_ptr\", \"typeString\": \"contract IERC20[] memory\" }, { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_memory_ptr\", \"typeString\": \"uint256[] memory\" }, { \"typeIdentifier\": \"t_bytes_memory_ptr\", \"typeString\": \"bytes memory\" } ], \"expression\": { \"id\": 30375, \"name\": \"vault\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30352, \"src\": \"1491:5:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IVault_$30325\", \"typeString\": \"contract IVault\" } }, \"id\": 30377, \"isConstant\": false, \"isLValue\": false, \"isPure\": false, \"lValueRequested\": false, \"memberLocation\": \"1497:9:26\", \"memberName\": \"flashLoan\", \"nodeType\": \"MemberAccess\", \"referencedDeclaration\": 30324, \"src\": \"1491:15:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_function_external_nonpayable$_t_contract$_IFlashLoanRecipient_$30342_$_t_array$_t_contract$_IERC20_$777_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$\", \"typeString\": \"function (contract IFlashLoanRecipient,contract IERC20[] memory,uint256[] memory,bytes memory) external\" } }, \"id\": 30382, \"isConstant\": false, \"isLValue\": false, \"isPure\": false, \"kind\": \"functionCall\", \"lValueRequested\": false, \"nameLocations\": [], \"names\": [], \"nodeType\": \"FunctionCall\", \"src\": \"1491:48:26\", \"tryCall\": false, \"typeDescriptions\": { \"typeIdentifier\": \"t_tuple$__$\", \"typeString\": \"tuple()\" } }, \"id\": 30383, \"nodeType\": \"ExpressionStatement\", \"src\": \"1491:48:26\" } ] }, \"functionSelector\": \"c9a69562\", \"implemented\": true, \"kind\": \"function\", \"modifiers\": [ { \"id\": 30373, \"kind\": \"modifierInvocation\", \"modifierName\": { \"id\": 30372, \"name\": \"onlyOwner\", \"nameLocations\": [ \"1471:9:26\" ], \"nodeType\": \"IdentifierPath\", \"referencedDeclaration\": 31, \"src\": \"1471:9:26\" }, \"nodeType\": \"ModifierInvocation\", \"src\": \"1471:9:26\" } ], \"name\": \"makeFlashLoan\", \"nameLocation\": \"1345:13:26\", \"parameters\": { \"id\": 30371, \"nodeType\": \"ParameterList\", \"parameters\": [ { \"constant\": false, \"id\": 30365, \"mutability\": \"mutable\", \"name\": \"tokens\", \"nameLocation\": \"1384:6:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30385, \"src\": \"1368:22:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_contract$_IERC20_$777_$dyn_memory_ptr\", \"typeString\": \"contract IERC20[]\" }, \"typeName\": { \"baseType\": { \"id\": 30363, \"nodeType\": \"UserDefinedTypeName\", \"pathNode\": { \"id\": 30362, \"name\": \"IERC20\", \"nameLocations\": [ \"1368:6:26\" ], \"nodeType\": \"IdentifierPath\", \"referencedDeclaration\": 777, \"src\": \"1368:6:26\" }, \"referencedDeclaration\": 777, \"src\": \"1368:6:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IERC20_$777\", \"typeString\": \"contract IERC20\" } }, \"id\": 30364, \"nodeType\": \"ArrayTypeName\", \"src\": \"1368:8:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_contract$_IERC20_$777_$dyn_storage_ptr\", \"typeString\": \"contract IERC20[]\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30368, \"mutability\": \"mutable\", \"name\": \"amounts\", \"nameLocation\": \"1417:7:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30385, \"src\": \"1400:24:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_memory_ptr\", \"typeString\": \"uint256[]\" }, \"typeName\": { \"baseType\": { \"id\": 30366, \"name\": \"uint256\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"1400:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } }, \"id\": 30367, \"nodeType\": \"ArrayTypeName\", \"src\": \"1400:9:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_storage_ptr\", \"typeString\": \"uint256[]\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30370, \"mutability\": \"mutable\", \"name\": \"userData\", \"nameLocation\": \"1447:8:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30385, \"src\": \"1434:21:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_bytes_memory_ptr\", \"typeString\": \"bytes\" }, \"typeName\": { \"id\": 30369, \"name\": \"bytes\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"1434:5:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_bytes_storage_ptr\", \"typeString\": \"bytes\" } }, \"visibility\": \"internal\" } ], \"src\": \"1358:103:26\" }, \"returnParameters\": { \"id\": 30374, \"nodeType\": \"ParameterList\", \"parameters\": [], \"src\": \"1481:0:26\" }, \"scope\": 30459, \"stateMutability\": \"nonpayable\", \"virtual\": false, \"visibility\": \"external\" }, { \"id\": 30458, \"nodeType\": \"FunctionDefinition\", \"src\": \"1552:790:26\", \"nodes\": [], \"body\": { \"id\": 30457, \"nodeType\": \"Block\", \"src\": \"1727:615:26\", \"nodes\": [], \"statements\": [ { \"expression\": { \"arguments\": [ { \"commonType\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" }, \"id\": 30407, \"isConstant\": false, \"isLValue\": false, \"isPure\": false, \"lValueRequested\": false, \"leftExpression\": { \"expression\": { \"id\": 30401, \"name\": \"msg\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": -15, \"src\": \"1758:3:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_magic_message\", \"typeString\": \"msg\" } }, \"id\": 30402, \"isConstant\": false, \"isLValue\": false, \"isPure\": false, \"lValueRequested\": false, \"memberLocation\": \"1762:6:26\", \"memberName\": \"sender\", \"nodeType\": \"MemberAccess\", \"src\": \"1758:10:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } }, \"nodeType\": \"BinaryOperation\", \"operator\": \"==\", \"rightExpression\": { \"arguments\": [ { \"id\": 30405, \"name\": \"vault\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30352, \"src\": \"1780:5:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IVault_$30325\", \"typeString\": \"contract IVault\" } } ], \"expression\": { \"argumentTypes\": [ { \"typeIdentifier\": \"t_contract$_IVault_$30325\", \"typeString\": \"contract IVault\" } ], \"id\": 30404, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"lValueRequested\": false, \"nodeType\": \"ElementaryTypeNameExpression\", \"src\": \"1772:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_type$_t_address_$\", \"typeString\": \"type(address)\" }, \"typeName\": { \"id\": 30403, \"name\": \"address\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"1772:7:26\", \"typeDescriptions\": {} } }, \"id\": 30406, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"kind\": \"typeConversion\", \"lValueRequested\": false, \"nameLocations\": [], \"names\": [], \"nodeType\": \"FunctionCall\", \"src\": \"1772:14:26\", \"tryCall\": false, \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } }, \"src\": \"1758:28:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_bool\", \"typeString\": \"bool\" } }, { \"hexValue\": \"466c6173684c6f616e526563697069656e743a2063616c6c6572206973206e6f7420746865207661756c74\", \"id\": 30408, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"kind\": \"string\", \"lValueRequested\": false, \"nodeType\": \"Literal\", \"src\": \"1800:45:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_stringliteral_0f31b4f6d08b07b44b6c6f09cb866661e71ab79b49d3cbdc3ea1d936d7a195c5\", \"typeString\": \"literal_string \\\"FlashLoanRecipient: caller is not the vault\\\"\" }, \"value\": \"FlashLoanRecipient: caller is not the vault\" } ], \"expression\": { \"argumentTypes\": [ { \"typeIdentifier\": \"t_bool\", \"typeString\": \"bool\" }, { \"typeIdentifier\": \"t_stringliteral_0f31b4f6d08b07b44b6c6f09cb866661e71ab79b49d3cbdc3ea1d936d7a195c5\", \"typeString\": \"literal_string \\\"FlashLoanRecipient: caller is not the vault\\\"\" } ], \"id\": 30400, \"name\": \"require\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [ -18, -18 ], \"referencedDeclaration\": -18, \"src\": \"1737:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$\", \"typeString\": \"function (bool,string memory) pure\" } }, \"id\": 30409, \"isConstant\": false, \"isLValue\": false, \"isPure\": false, \"kind\": \"functionCall\", \"lValueRequested\": false, \"nameLocations\": [], \"names\": [], \"nodeType\": \"FunctionCall\", \"src\": \"1737:118:26\", \"tryCall\": false, \"typeDescriptions\": { \"typeIdentifier\": \"t_tuple$__$\", \"typeString\": \"tuple()\" } }, \"id\": 30410, \"nodeType\": \"ExpressionStatement\", \"src\": \"1737:118:26\" }, { \"assignments\": [ 30412, 30414, 30416 ], \"declarations\": [ { \"constant\": false, \"id\": 30412, \"mutability\": \"mutable\", \"name\": \"firstPairAddress\", \"nameLocation\": \"1888:16:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30457, \"src\": \"1880:24:26\", \"stateVariable\": false, \"storageLocation\": \"default\", \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" }, \"typeName\": { \"id\": 30411, \"name\": \"address\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"1880:7:26\", \"stateMutability\": \"nonpayable\", \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30414, \"mutability\": \"mutable\", \"name\": \"secondPairAddress\", \"nameLocation\": \"1926:17:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30457, \"src\": \"1918:25:26\", \"stateVariable\": false, \"storageLocation\": \"default\", \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" }, \"typeName\": { \"id\": 30413, \"name\": \"address\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"1918:7:26\", \"stateMutability\": \"nonpayable\", \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30416, \"mutability\": \"mutable\", \"name\": \"percentageToPayToCoinbase\", \"nameLocation\": \"1965:25:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30457, \"src\": \"1957:33:26\", \"stateVariable\": false, \"storageLocation\": \"default\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" }, \"typeName\": { \"id\": 30415, \"name\": \"uint256\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"1957:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } }, \"visibility\": \"internal\" } ], \"id\": 30428, \"initialValue\": { \"arguments\": [ { \"id\": 30419, \"name\": \"userData\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30397, \"src\": \"2014:8:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_bytes_memory_ptr\", \"typeString\": \"bytes memory\" } }, { \"components\": [ { \"id\": 30421, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"lValueRequested\": false, \"nodeType\": \"ElementaryTypeNameExpression\", \"src\": \"2025:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_type$_t_address_$\", \"typeString\": \"type(address)\" }, \"typeName\": { \"id\": 30420, \"name\": \"address\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"2025:7:26\", \"typeDescriptions\": {} } }, { \"id\": 30423, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"lValueRequested\": false, \"nodeType\": \"ElementaryTypeNameExpression\", \"src\": \"2034:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_type$_t_address_$\", \"typeString\": \"type(address)\" }, \"typeName\": { \"id\": 30422, \"name\": \"address\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"2034:7:26\", \"typeDescriptions\": {} } }, { \"id\": 30425, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"lValueRequested\": false, \"nodeType\": \"ElementaryTypeNameExpression\", \"src\": \"2043:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_type$_t_uint256_$\", \"typeString\": \"type(uint256)\" }, \"typeName\": { \"id\": 30424, \"name\": \"uint256\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"2043:7:26\", \"typeDescriptions\": {} } } ], \"id\": 30426, \"isConstant\": false, \"isInlineArray\": false, \"isLValue\": false, \"isPure\": true, \"lValueRequested\": false, \"nodeType\": \"TupleExpression\", \"src\": \"2024:27:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_tuple$_t_type$_t_address_$_$_t_type$_t_address_$_$_t_type$_t_uint256_$_$\", \"typeString\": \"tuple(type(address),type(address),type(uint256))\" } } ], \"expression\": { \"argumentTypes\": [ { \"typeIdentifier\": \"t_bytes_memory_ptr\", \"typeString\": \"bytes memory\" }, { \"typeIdentifier\": \"t_tuple$_t_type$_t_address_$_$_t_type$_t_address_$_$_t_type$_t_uint256_$_$\", \"typeString\": \"tuple(type(address),type(address),type(uint256))\" } ], \"expression\": { \"id\": 30417, \"name\": \"abi\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": -1, \"src\": \"2003:3:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_magic_abi\", \"typeString\": \"abi\" } }, \"id\": 30418, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"lValueRequested\": false, \"memberLocation\": \"2007:6:26\", \"memberName\": \"decode\", \"nodeType\": \"MemberAccess\", \"src\": \"2003:10:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_function_abidecode_pure$__$returns$__$\", \"typeString\": \"function () pure\" } }, \"id\": 30427, \"isConstant\": false, \"isLValue\": false, \"isPure\": false, \"kind\": \"functionCall\", \"lValueRequested\": false, \"nameLocations\": [], \"names\": [], \"nodeType\": \"FunctionCall\", \"src\": \"2003:49:26\", \"tryCall\": false, \"typeDescriptions\": { \"typeIdentifier\": \"t_tuple$_t_address_payable_$_t_address_payable_$_t_uint256_$\", \"typeString\": \"tuple(address payable,address payable,uint256)\" } }, \"nodeType\": \"VariableDeclarationStatement\", \"src\": \"1866:186:26\" }, { \"expression\": { \"arguments\": [ { \"id\": 30430, \"name\": \"secondPairAddress\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30414, \"src\": \"2093:17:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } }, { \"id\": 30431, \"name\": \"firstPairAddress\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30412, \"src\": \"2124:16:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } }, { \"id\": 30432, \"name\": \"percentageToPayToCoinbase\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30416, \"src\": \"2154:25:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } }, { \"arguments\": [ { \"id\": 30435, \"name\": \"this\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": -28, \"src\": \"2201:4:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_BlindBackrunFL_$30459\", \"typeString\": \"contract BlindBackrunFL\" } } ], \"expression\": { \"argumentTypes\": [ { \"typeIdentifier\": \"t_contract$_BlindBackrunFL_$30459\", \"typeString\": \"contract BlindBackrunFL\" } ], \"id\": 30434, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"lValueRequested\": false, \"nodeType\": \"ElementaryTypeNameExpression\", \"src\": \"2193:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_type$_t_address_$\", \"typeString\": \"type(address)\" }, \"typeName\": { \"id\": 30433, \"name\": \"address\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"2193:7:26\", \"typeDescriptions\": {} } }, \"id\": 30436, \"isConstant\": false, \"isLValue\": false, \"isPure\": false, \"kind\": \"typeConversion\", \"lValueRequested\": false, \"nameLocations\": [], \"names\": [], \"nodeType\": \"FunctionCall\", \"src\": \"2193:13:26\", \"tryCall\": false, \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } } ], \"expression\": { \"argumentTypes\": [ { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" }, { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" }, { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" }, { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } ], \"id\": 30429, \"name\": \"executeArbitrage\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 31797, \"src\": \"2063:16:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_address_$returns$__$\", \"typeString\": \"function (address,address,uint256,address)\" } }, \"id\": 30437, \"isConstant\": false, \"isLValue\": false, \"isPure\": false, \"kind\": \"functionCall\", \"lValueRequested\": false, \"nameLocations\": [], \"names\": [], \"nodeType\": \"FunctionCall\", \"src\": \"2063:153:26\", \"tryCall\": false, \"typeDescriptions\": { \"typeIdentifier\": \"t_tuple$__$\", \"typeString\": \"tuple()\" } }, \"id\": 30438, \"nodeType\": \"ExpressionStatement\", \"src\": \"2063:153:26\" }, { \"expression\": { \"arguments\": [ { \"arguments\": [ { \"id\": 30445, \"name\": \"vault\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30352, \"src\": \"2277:5:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IVault_$30325\", \"typeString\": \"contract IVault\" } } ], \"expression\": { \"argumentTypes\": [ { \"typeIdentifier\": \"t_contract$_IVault_$30325\", \"typeString\": \"contract IVault\" } ], \"id\": 30444, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"lValueRequested\": false, \"nodeType\": \"ElementaryTypeNameExpression\", \"src\": \"2269:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_type$_t_address_$\", \"typeString\": \"type(address)\" }, \"typeName\": { \"id\": 30443, \"name\": \"address\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"2269:7:26\", \"typeDescriptions\": {} } }, \"id\": 30446, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"kind\": \"typeConversion\", \"lValueRequested\": false, \"nameLocations\": [], \"names\": [], \"nodeType\": \"FunctionCall\", \"src\": \"2269:14:26\", \"tryCall\": false, \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } }, { \"commonType\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" }, \"id\": 30454, \"isConstant\": false, \"isLValue\": false, \"isPure\": false, \"lValueRequested\": false, \"leftExpression\": { \"baseExpression\": { \"id\": 30447, \"name\": \"amounts\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30392, \"src\": \"2297:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_memory_ptr\", \"typeString\": \"uint256[] memory\" } }, \"id\": 30449, \"indexExpression\": { \"hexValue\": \"30\", \"id\": 30448, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"kind\": \"number\", \"lValueRequested\": false, \"nodeType\": \"Literal\", \"src\": \"2305:1:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_rational_0_by_1\", \"typeString\": \"int_const 0\" }, \"value\": \"0\" }, \"isConstant\": false, \"isLValue\": true, \"isPure\": false, \"lValueRequested\": false, \"nodeType\": \"IndexAccess\", \"src\": \"2297:10:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } }, \"nodeType\": \"BinaryOperation\", \"operator\": \"+\", \"rightExpression\": { \"components\": [ { \"baseExpression\": { \"id\": 30450, \"name\": \"feeAmounts\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 30395, \"src\": \"2311:10:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_memory_ptr\", \"typeString\": \"uint256[] memory\" } }, \"id\": 30452, \"indexExpression\": { \"hexValue\": \"30\", \"id\": 30451, \"isConstant\": false, \"isLValue\": false, \"isPure\": true, \"kind\": \"number\", \"lValueRequested\": false, \"nodeType\": \"Literal\", \"src\": \"2322:1:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_rational_0_by_1\", \"typeString\": \"int_const 0\" }, \"value\": \"0\" }, \"isConstant\": false, \"isLValue\": true, \"isPure\": false, \"lValueRequested\": false, \"nodeType\": \"IndexAccess\", \"src\": \"2311:13:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } } ], \"id\": 30453, \"isConstant\": false, \"isInlineArray\": false, \"isLValue\": false, \"isPure\": false, \"lValueRequested\": false, \"nodeType\": \"TupleExpression\", \"src\": \"2310:15:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } }, \"src\": \"2297:28:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } } ], \"expression\": { \"argumentTypes\": [ { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" }, { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } ], \"expression\": { \"arguments\": [ { \"id\": 30440, \"name\": \"WETH_ADDRESS\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 31558, \"src\": \"2233:12:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } } ], \"expression\": { \"argumentTypes\": [ { \"typeIdentifier\": \"t_address\", \"typeString\": \"address\" } ], \"id\": 30439, \"name\": \"IWETH\", \"nodeType\": \"Identifier\", \"overloadedDeclarations\": [], \"referencedDeclaration\": 31507, \"src\": \"2227:5:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_type$_t_contract$_IWETH_$31507_$\", \"typeString\": \"type(contract IWETH)\" } }, \"id\": 30441, \"isConstant\": false, \"isLValue\": false, \"isPure\": false, \"kind\": \"typeConversion\", \"lValueRequested\": false, \"nameLocations\": [], \"names\": [], \"nodeType\": \"FunctionCall\", \"src\": \"2227:19:26\", \"tryCall\": false, \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IWETH_$31507\", \"typeString\": \"contract IWETH\" } }, \"id\": 30442, \"isConstant\": false, \"isLValue\": false, \"isPure\": false, \"lValueRequested\": false, \"memberLocation\": \"2247:8:26\", \"memberName\": \"transfer\", \"nodeType\": \"MemberAccess\", \"referencedDeclaration\": 744, \"src\": \"2227:28:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$\", \"typeString\": \"function (address,uint256) external returns (bool)\" } }, \"id\": 30455, \"isConstant\": false, \"isLValue\": false, \"isPure\": false, \"kind\": \"functionCall\", \"lValueRequested\": false, \"nameLocations\": [], \"names\": [], \"nodeType\": \"FunctionCall\", \"src\": \"2227:108:26\", \"tryCall\": false, \"typeDescriptions\": { \"typeIdentifier\": \"t_bool\", \"typeString\": \"bool\" } }, \"id\": 30456, \"nodeType\": \"ExpressionStatement\", \"src\": \"2227:108:26\" } ] }, \"baseFunctions\": [ 30341 ], \"functionSelector\": \"f04f2707\", \"implemented\": true, \"kind\": \"function\", \"modifiers\": [], \"name\": \"receiveFlashLoan\", \"nameLocation\": \"1561:16:26\", \"parameters\": { \"id\": 30398, \"nodeType\": \"ParameterList\", \"parameters\": [ { \"constant\": false, \"id\": 30389, \"mutability\": \"mutable\", \"name\": \"tokens\", \"nameLocation\": \"1603:6:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30458, \"src\": \"1587:22:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_contract$_IERC20_$777_$dyn_memory_ptr\", \"typeString\": \"contract IERC20[]\" }, \"typeName\": { \"baseType\": { \"id\": 30387, \"nodeType\": \"UserDefinedTypeName\", \"pathNode\": { \"id\": 30386, \"name\": \"IERC20\", \"nameLocations\": [ \"1587:6:26\" ], \"nodeType\": \"IdentifierPath\", \"referencedDeclaration\": 777, \"src\": \"1587:6:26\" }, \"referencedDeclaration\": 777, \"src\": \"1587:6:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_contract$_IERC20_$777\", \"typeString\": \"contract IERC20\" } }, \"id\": 30388, \"nodeType\": \"ArrayTypeName\", \"src\": \"1587:8:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_contract$_IERC20_$777_$dyn_storage_ptr\", \"typeString\": \"contract IERC20[]\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30392, \"mutability\": \"mutable\", \"name\": \"amounts\", \"nameLocation\": \"1636:7:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30458, \"src\": \"1619:24:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_memory_ptr\", \"typeString\": \"uint256[]\" }, \"typeName\": { \"baseType\": { \"id\": 30390, \"name\": \"uint256\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"1619:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } }, \"id\": 30391, \"nodeType\": \"ArrayTypeName\", \"src\": \"1619:9:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_storage_ptr\", \"typeString\": \"uint256[]\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30395, \"mutability\": \"mutable\", \"name\": \"feeAmounts\", \"nameLocation\": \"1670:10:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30458, \"src\": \"1653:27:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_memory_ptr\", \"typeString\": \"uint256[]\" }, \"typeName\": { \"baseType\": { \"id\": 30393, \"name\": \"uint256\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"1653:7:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_uint256\", \"typeString\": \"uint256\" } }, \"id\": 30394, \"nodeType\": \"ArrayTypeName\", \"src\": \"1653:9:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_array$_t_uint256_$dyn_storage_ptr\", \"typeString\": \"uint256[]\" } }, \"visibility\": \"internal\" }, { \"constant\": false, \"id\": 30397, \"mutability\": \"mutable\", \"name\": \"userData\", \"nameLocation\": \"1703:8:26\", \"nodeType\": \"VariableDeclaration\", \"scope\": 30458, \"src\": \"1690:21:26\", \"stateVariable\": false, \"storageLocation\": \"memory\", \"typeDescriptions\": { \"typeIdentifier\": \"t_bytes_memory_ptr\", \"typeString\": \"bytes\" }, \"typeName\": { \"id\": 30396, \"name\": \"bytes\", \"nodeType\": \"ElementaryTypeName\", \"src\": \"1690:5:26\", \"typeDescriptions\": { \"typeIdentifier\": \"t_bytes_storage_ptr\", \"typeString\": \"bytes\" } }, \"visibility\": \"internal\" } ], \"src\": \"1577:140:26\" }, \"returnParameters\": { \"id\": 30399, \"nodeType\": \"ParameterList\", \"parameters\": [], \"src\": \"1727:0:26\" }, \"scope\": 30459, \"stateMutability\": \"nonpayable\", \"virtual\": false, \"visibility\": \"external\" } ], \"abstract\": false, \"baseContracts\": [ { \"baseName\": { \"id\": 30343, \"name\": \"BlindBackrun\", \"nameLocations\": [ \"1130:12:26\" ], \"nodeType\": \"IdentifierPath\", \"referencedDeclaration\": 32259, \"src\": \"1130:12:26\" }, \"id\": 30344, \"nodeType\": \"InheritanceSpecifier\", \"src\": \"1130:12:26\" }, { \"baseName\": { \"id\": 30345, \"name\": \"IFlashLoanRecipient\", \"nameLocations\": [ \"1144:19:26\" ], \"nodeType\": \"IdentifierPath\", \"referencedDeclaration\": 30342, \"src\": \"1144:19:26\" }, \"id\": 30346, \"nodeType\": \"InheritanceSpecifier\", \"src\": \"1144:19:26\" } ], \"canonicalName\": \"BlindBackrunFL\", \"contractDependencies\": [], \"contractKind\": \"contract\", \"fullyImplemented\": true, \"linearizedBaseContracts\": [ 30459, 30342, 32259, 112, 824 ], \"name\": \"BlindBackrunFL\", \"nameLocation\": \"1112:14:26\", \"scope\": 30460, \"usedErrors\": [] } ] }, \"id\": 26}\n```"
  },
  {
    "path": "docs/specs/contracts/abi/_uniswapV2Factory.mdx",
    "content": "```json title=\"abi/uniswapV2Factory.json\"\n[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeToSetter\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token0\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token1\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pair\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"PairCreated\",\"type\":\"event\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"allPairs\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"allPairsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenA\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenB\",\"type\":\"address\"}],\"name\":\"createPair\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"pair\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"feeTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"feeToSetter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"getPair\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeTo\",\"type\":\"address\"}],\"name\":\"setFeeTo\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeToSetter\",\"type\":\"address\"}],\"name\":\"setFeeToSetter\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]\n```\n"
  },
  {
    "path": "docs/specs/mev-share/HintsTable.jsx",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport hints from \"./hints.json\"\n\nexport default function HintsTable() {\n  return (\n    <table>\n      <thead>\n        <tr>\n          <th>Hint</th>\n          <th>Description</th>\n        </tr>\n      </thead>\n      <tbody>\n        {hints.map((hint, index) => (\n          <tr key={index}>\n            <td><code>{hint.name}</code></td>\n            <td>{hint.description}</td>\n          </tr>\n        ))}\n      </tbody>\n    </table>\n  );\n}\n"
  },
  {
    "path": "docs/specs/mev-share/_builders.mdx",
    "content": "import BuildersTable from \"@site/src/components/mev-share/buildersTable.tsx\"\n\n<BuildersTable />\n"
  },
  {
    "path": "docs/specs/mev-share/_mev_sendBundle.mdx",
    "content": "<!-- TODO: get this from https://github.com/flashbots/mev-share/blob/main/specs/mev_sendBundle.md instead of duplicating -->\n\n```typescript\n/*\n    NOTE: optional fields are marked with a ?\n    example: {\n        privacy?: { ... } // privacy is optional\n    }\n */\n{\n    jsonrpc: \"2.0\",\n    id: string | number,\n    method: \"mev_sendBundle\",\n    params: [{ /* MevSendBundleParams */\n        version: \"v0.1\",\n        inclusion: {\n            block: string,     // hex-encoded number\n            maxBlock?: string, // hex-encoded number\n        },\n        body: Array<\n            { hash: string } |\n            { tx: string, canRevert: boolean } |\n            { bundle: MevSendBundleParams }\n        >,\n        validity?: {\n            refund?: Array<{\n                bodyIdx: number,\n                percent: number,\n            }>,\n            refundConfig?: Array<{\n                address: string,\n                percent: number,\n            }>\n        },\n        privacy?: {\n            hints?: Array<\n                \"calldata\" |\n                \"contract_address\" |\n                \"logs\" |\n                \"function_selector\" |\n                \"hash\" |\n                \"tx_hash\" |\n                \"full\"\n            >,\n            builders?: Array<string>,\n        },\n        metadata?: {\n            originId?: string,\n        }\n    }]\n}\n```\n"
  },
  {
    "path": "docs/specs/mev-share/_mev_simBundle.mdx",
    "content": "<!-- TODO: get this from https://github.com/flashbots/mev-share/blob/main/specs/mev_sendBundle.md instead of duplicating -->\n\n```typescript\n{\n    jsonrpc: \"2.0\",\n    id: string | number,\n    method: \"mev_simBundle\",\n    params: [{ /* MevSimBundleParams */\n        version: \"beta-1\",\n        inclusion: {\n            block: string,     // hex-encoded number\n            maxBlock?: string, // hex-encoded number\n        },\n        body: Array<\n            { hash: string } |\n            { tx: string, canRevert: boolean } |\n            { bundle: MevSimBundleParams }\n        >,\n        validity: {\n            refund: Array<{\n                bodyIdx: number,\n                percent: number,\n            }>,\n            refundConfig: Array<{\n                address: string,\n                percent: number,\n            }>\n        },\n        privacy?: {\n            hints?: Array<\n                \"calldata\" |\n                \"contract_address\" |\n                \"logs\" |\n                \"function_selector\" |\n                \"hash\" |\n                \"tx_hash\" |\n                \"full\"\n            >,\n            builders?: Array<string>,\n        },\n        metadata?: {\n            originId?: string,\n        },\n        simOptions?: { /* SimBundleOptions */\n            parentBlock?: number | string, // Block used for simulation state. Defaults to latest block.\n            blockNumber?: number, // default = parentBlock.number + 1\n            coinbase?: string, // default = parentBlock.coinbase\n            timestamp?: number, // default = parentBlock.timestamp + 12\n            gasLimit?: number, // default = parentBlock.gasLimit\n            baseFee?: bigint, // default = parentBlock.baseFeePerGas\n            timeout?: number, // default = 5 (defined in seconds)\n        }\n    }]\n}\n```\n"
  },
  {
    "path": "docs/specs/mev-share/_streamEvent.mdx",
    "content": "\n```typescript\n{\n    hash: string,\n    logs?: LogParams[],\n    txs: Array<{\n        hash?: string,\n        callData?: string,\n        functionSelector?: string,\n        to?: string,\n        from?: string,\n        value?: string,\n        maxFeePerGas?: string,\n        maxPriorityFeePerGas?: string,\n        nonce?: string,\n        chainId?: string,\n        accessList?: Array<{\n            address: string,\n            storageKeys: string[]\n        }>,\n        gas?: string,\n        type?: string\n    }>\n}\n```\n\n| Param | Type Info | Description |\n|-|-|-|\n| `hash` | Hex-string | [Double-hashed](/flashbots-mev-share/searchers/event-stream#understanding-double-hash) transaction hash, or, bundle hash |\n| `logs` | Array of JSON-encoded events | Event logs emitted by executing the transaction. |\n| `txs` | Array of JSON objects | Transactions from the event. Will only be one if event is a transaction, otherwise event is a bundle.\n| `txs.hash` | Hex-string | Transaction hash. |\n| `txs.callData` | Hex-string | Calldata of the transaction. |\n| `txs.functionSelector` | Hex-string | 4-byte function selector. |\n| `txs.to` | Hex-string | Transaction recipient address. |\n| `txs.from` | Hex-string | Transaction sender address. |\n| `txs.value` | Hex-string | Value transferred in the transaction. |\n| `txs.maxFeePerGas` | Hex-string | Maximum fee per gas of the transaction. GasFeeCap |\n| `txs.maxPriorityFeePerGas` | Hex-string | Maximum priority fee per gas of the transaction. GasTipCap |\n| `txs.nonce` | Hex-string | Nonce of the transaction. |\n| `txs.chainId` | Hex-string | Chain ID of the transaction. |\n| `txs.accessList` | Array of JSON objects | Access list of the transaction. |\n| `txs.accessList.address` | Hex-string | Address in the access list. |\n| `txs.accessList.storageKeys` | Array of hex-strings | Storage keys in the access list. |\n| `txs.gas` | Hex-string | Gas limit of the transaction. |\n| `txs.type` | Hex-string | Type of the transaction. |\n"
  },
  {
    "path": "docs/specs/mev-share/blurbs/_builderInheritance.mdx",
    "content": "By default, when a user specifies which builders their transactions should be sent to (by setting `builders`), those settings are inherited by bundles which use those transactions.\n\nSearchers can restrict these settings by specifying `builders` in the bundle's `privacy` parameters. Specifically, by setting `builders`, the bundle is sent to the **intersection** of all builders specified by each of the bundle's transactions, and the builders specified in the bundle's `builders` parameter.\n"
  },
  {
    "path": "docs/specs/mev-share/blurbs/_whatsMevShareAdvanced.mdx",
    "content": "MEV-Share is an open-source protocol for users, wallets, and applications to internalize the MEV that their transactions create (\"orderflow auction\"). It allows users to selectively share data about their transactions with searchers who bid to include the transactions in bundles. Users can choose how the searcher's bid is redistributed -- between themselves, validators, or other parties.\n\nMEV-Share is credibly neutral, permissionless for searchers, and does not enshrine a single block builder. It aims to reduce the centralizing impact of exclusive orderflow on Ethereum while enabling wallets and other sources of order flow to participate in the MEV supply chain.\n"
  },
  {
    "path": "docs/specs/mev-share/blurbs/_whatsMevShareBasic.mdx",
    "content": "[MEV-share](https://collective.flashbots.net/t/mev-share-programmably-private-orderflow-to-share-mev-with-users/1264) is a protocol that lets users, wallets, and dapps to **capture the MEV their transactions create.**\n"
  },
  {
    "path": "docs/specs/mev-share/blurbs/_whatsaMEVShareNode.mdx",
    "content": "A MEV-Share Node is a service that matches user transactions with searcher bundles. Flashbots runs MEV-Share Nodes on Ethereum Mainnet and Goerli. Users submit their transactions to the Node, which shares select information about transactions with searchers. Searchers propose transactions for the Node to bundle with the user transactions (currently we only support backruns). The Node forwards these bundles to a block builder with a requirement that **the user is paid a refund**; a percentage of the winning searcher's bundle profit.\n"
  },
  {
    "path": "docs/specs/mev-share/hints.json",
    "content": "[\n    {\n        \"name\": \"calldata\",\n        \"description\": \"Share data sent to the smart contract (if applicable) by the transaction. The function selector and contract address will also be shared if the calldata is shared.\"\n    },\n    {\n        \"name\": \"logs\",\n        \"description\": \"Share logs emitted by executing the transaction.\"\n    },\n    {\n        \"name\": \"default_logs\",\n        \"description\": \"Share specific subset of logs related to defi swaps. Partial info (the pool id and the fact that a swap was made) for curve, balancer, and uniswapV2/V3-style trades\"\n    },\n    {\n        \"name\": \"function_selector\",\n        \"description\": \"Share the 4-byte identifier of the function being called on the smart contract by the transaction. The contract address will also be shared if the function selector is shared.\"\n    },\n    {\n        \"name\": \"contract_address\",\n        \"description\": \"Share the address of the recipient of the transaction; typically a smart contract.\"\n    },\n    {\n        \"name\": \"hash\",\n        \"description\": \"Share the transaction hash (or bundle hash if sending a bundle). To use full privacy mode, share this hint and this hint alone. The hash will always be shared if other hints are shared.\"\n    },\n    {\n        \"name\": \"tx_hash\",\n        \"description\": \"Share individual tx hashes in the bundle.\"\n    },\n    {\n        \"name\": \"full\",\n        \"description\": \"Share all fields of individual txs except signature. This includes nonce, gas price, gas limit, to, from, value, data, and chainId.\"\n    }\n]\n"
  },
  {
    "path": "docs/specs/protect-rpc/_hints.mdx",
    "content": "```js\nhint:  \"calldata\" |\n       \"contract_address\" |\n       \"function_selector\" |\n       \"logs\" |\n       \"hash\" |\n       undefined\n```\n"
  },
  {
    "path": "docs/welcome.mdx",
    "content": "---\nslug: /\ntitle: Welcome to Flashbots\nhide_title: true\ndescription: The home page of the knowledge base\nkeywords:\n  - flashbots\n  - docs\n---\n\nimport Grid from \"@site/src/components/Grid/Grid.tsx\";\nimport GridBlock from \"@site/src/components/GridBlock/GridBlock.tsx\";\n\n# Welcome to Flashbots\n\nFlashbots is a research and development organization formed to mitigate the negative externalities posed by Maximal Extractable Value (MEV) to stateful blockchains, starting with Ethereum.\n\n## Get started\n\n<Grid>\n<GridBlock symbol=\"I.\" title=\"Searchers\">\n\nDiscover how to capture MEV opportunities on Ethereum responsibly with Flashbots.\n\n- [Understanding Bundles](/flashbots-auction/advanced/understanding-bundles)<br/>\n- [Guide to Sending Transactions and Bundles on Flashbots](/guide-send-tx-bundle)<br/>\n- [Multiplexing](/flashbots-auction/advanced/multiplexing)<br/>\n- [RPC Docs](/flashbots-auction/advanced/rpc-endpoint)<br/>\n- [Client Libs](/flashbots-auction/libraries/ethers-js-provider)<br/>\n- [Help & FAQs](https://collective.flashbots.net/tags/c/searchers/12/question)\n\n</GridBlock>\n<GridBlock symbol=\"II.\" title=\"Eth Users\">\n\nLink your wallet to Flashbots Protect to safeguard against frontrunning, benefit from backrunning MEV through the MEV-Share protocol, and receive assistance in recovering funds from scams.\n\n- [Flashbots Protect](/flashbots-protect/quick-start)\n- [Scam Victims Hotline](https://whitehat.flashbots.net)\n\n</GridBlock>\n<GridBlock symbol=\"III.\" title=\"Validators, Builders & Relayers\">\n\nLeverage MEV-Boost to access a competitive block-building market, fostering greater competition, decentralization, and censorship-resistance for Ethereum.\n\n- [MEV-Boost Docs](/flashbots-mev-boost/introduction)<br/>\n\n</GridBlock>\n</Grid>\n\n## About Flashbots\n\nOur primary focus is to enable a permissionless, transparent, and sustainable ecosystem for MEV, via a three-pronged approach:\n\n- **Illuminate**: bringing transparency to MEV activity, quantifying its impact, and reducing information asymmetry between participants.\n- **Democratize**: democratizing access to MEV via open platforms that maximize competition and are freely available to all.\n- **Distribute**: enabling sustainable distribution of any remaining MEV.\n\nProduct & research are the semi-autonomous dual engines that propel our organization forward:\n\n- [Flashbots Product](/) builds core infrastructure and ecosystem tooling that redefine the block production supply chain across blockchains and protect users.\n- [Flashbots Research](https://github.com/flashbots/mev-research) explores MEV market dynamics and blockchain design challenges at the intersection of economics, security, and cryptography.\n\nYou can interact with Flashbots via our [Forum](https://collective.flashbots.net/) where we have dedicated categories for each of our efforts and welcome your contributions. Our work is open source and you can follow our progress under each [Github](https://github.com/flashbots/pm) repository of the Flashbots organization.\n\n[Mission](https://writings.flashbots.net/frontrunning-mev-crisis) | [Forum](https://collective.flashbots.net/) | [Writings](https://writings.flashbots.net) | [GitHub](https://github.com/flashbots/pm) | [Discord](https://discord.gg/7hvTycdNcK) | [Status](https://status.flashbots.net)\n"
  },
  {
    "path": "docs/whitehat.mdx",
    "content": "---\ntitle: Whitehat Hotline\n---\n\nIf your wallet has been compromised by a malicious third party and you need help recovering remaining funds, we are here to help\n\nPlease go to https://whitehat.flashbots.net (and only to this address) to submit a request for help.\n\nEnsure you only interact with [Flashbots Discord](https://discord.gg/flashbots) members with the \"whitehat\",  \"whitehat-associate\", or \"serv.eth\" role.\n\nWe can only attempt to rescue remaining funds, we won't be able to get back funds that have already been transferred out from the address.\nPlease note that the Whitehat team can only assist if remaining assets in the compromised address exceed the minimum rescue amount of $1000. \n"
  },
  {
    "path": "docusaurus.config.js",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nrequire('dotenv').config()\nconst { themes: { github: lightCodeTheme } } = require('prism-react-renderer');\nconst { themes: { dracula: darkCodeTheme } } = require('prism-react-renderer');\nconst tailwindcss = require('tailwindcss');\nconst autoprefixer = require('autoprefixer');\n\n/** @returns {Promise<import('@docusaurus/types').Config>} */\nmodule.exports = async function createConfigAsync() {\n  return {\n    title: 'Flashbots Docs',\n    tagline: 'Flashbots repository of knowledge',\n    baseUrl: process.env.BASE_URL,\n    onBrokenLinks: 'throw',\n    onBrokenMarkdownLinks: 'warn',\n    favicon: 'img/favicon.ico',\n    organizationName: 'flashbots',\n    projectName: 'docs',\n    trailingSlash: false,\n    url: process.env.TARGET_URL,\n    stylesheets: [\n      {\n        href: 'https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css',\n        type: 'text/css',\n        integrity:\n          'sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM',\n        crossorigin: 'anonymous',\n      },\n    ],\n    themeConfig:\n      /** @type {import('@docusaurus/preset-classic').ThemeConfig} */\n      ({\n        algolia: {\n          apiKey: process.env.ALGOLIA_SEARCH_API_KEY,\n          indexName: process.env.ALGOLIA_INDEX_NAME,\n          appId: process.env.ALGOLIA_APP_ID,\n        },\n        prism: {\n          theme: lightCodeTheme,\n          darkTheme: darkCodeTheme,\n          additionalLanguages: ['solidity', 'uri', 'ini', 'rust']\n        },\n        docs: {\n          sidebar: {\n            hideable: true\n          }\n        },\n        navbar: {\n          title: 'Flashbots',\n          logo: {\n            alt: 'Flashbots Logo',\n            src: 'img/logo.png',\n          },\n          items: [\n            {\n              type: 'docSidebar',\n              label: 'Docs',\n              sidebarId: 'docs',\n              position: 'left',\n            },\n            {\n              type: 'docSidebar',\n              label: 'API',\n              sidebarId: 'api',\n              position: 'left',\n            },\n            {\n              href: 'https://github.com/flashbots/docs',\n              label: 'GitHub',\n              position: 'right',\n            },\n          ],\n        }\n\n      }),\n    presets: [\n      [\n        '@docusaurus/preset-classic',\n        /** @type {import('@docusaurus/preset-classic').Options} */\n        ({\n          debug: true, // force debug plugin usage\n          docs: {\n            sidebarPath: require.resolve('./docs/sidebars.js'),\n            // Please change this to your repo.\n            routeBasePath: '/',\n            editUrl:\n              'https://github.com/flashbots/flashbots-docs/edit/main/',\n            showLastUpdateTime: true,\n            remarkPlugins: [(await import('remark-math')).default],\n            rehypePlugins: [(await import('rehype-katex')).default],\n          },\n          theme: {\n            customCss: require.resolve('./src/css/custom.css'),\n          },\n        }),\n      ],\n    ],\n    plugins: [\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\n      async function tailwindcssSupport(context, options) {\n        return {\n          name: \"docusaurus-tailwindcss\",\n          configurePostCss(postcssOptions) {\n            // Appends TailwindCSS and AutoPrefixer.\n            postcssOptions.plugins.push('tailwindcss/nesting')\n            postcssOptions.plugins.push(tailwindcss);\n            postcssOptions.plugins.push(autoprefixer);\n            return postcssOptions;\n          },\n        };\n      },\n      'docusaurus-plugin-sass'\n    ],\n  }\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"flashbot-docs\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"docusaurus\": \"docusaurus\",\n    \"start\": \"docusaurus start --port 3000 --host 0.0.0.0\",\n    \"build\": \"docusaurus build\",\n    \"swizzle\": \"docusaurus swizzle\",\n    \"clear\": \"docusaurus clear\",\n    \"serve\": \"docusaurus serve\",\n    \"write-translations\": \"docusaurus write-translations\",\n    \"write-heading-ids\": \"docusaurus write-heading-ids\",\n    \"lint\": \"yarn lint:js && yarn lint:style && yarn lint:spelling\",\n    \"lint:ci\": \"yarn lint:js --quiet && yarn lint:style && yarn lint:spelling\",\n    \"lint:js\": \"eslint --cache --report-unused-disable-directives \\\"**/*.{js,jsx,ts,tsx,mjs}\\\"\",\n    \"lint:spelling\": \"cspell \\\"**\\\" --no-progress\",\n    \"lint:style\": \"stylelint \\\"**/*.css\\\"\",\n    \"format\": \"prettier --write .\",\n    \"format:diff\": \"prettier --list-different .\"\n  },\n  \"dependencies\": {\n    \"@algolia/client-search\": \"^4.20.0\",\n    \"@docusaurus/core\": \"^3.0.0\",\n    \"@docusaurus/plugin-content-docs\": \"^3.0.0\",\n    \"@docusaurus/plugin-sitemap\": \"^3.0.0\",\n    \"@docusaurus/preset-classic\": \"^3.0.0\",\n    \"@docusaurus/utils\": \"^3.0.0\",\n    \"@docusaurus/utils-common\": \"^3.0.0\",\n    \"@mdx-js/react\": \"^3.0.0\",\n    \"@radix-ui/react-switch\": \"^1.0.3\",\n    \"@vercel/analytics\": \"^0.1.11\",\n    \"autoprefixer\": \"^10.4.16\",\n    \"axios\": \"^1.6.0\",\n    \"change-case\": \"^5.1.2\",\n    \"clsx\": \"^1.1.1\",\n    \"docusaurus-plugin-sass\": \"^0.2.5\",\n    \"dotenv\": \"^8.2.0\",\n    \"ethers\": \"^6.7.1\",\n    \"postcss\": \"^8.4.31\",\n    \"prism-react-renderer\": \"^2.1.0\",\n    \"prop-types\": \"^15.8.1\",\n    \"protect-button\": \"^0.4.6\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-loadable\": \"^5.5.0\",\n    \"rehype-katex\": \"^7\",\n    \"remark-math\": \"^6\",\n    \"sass\": \"^1.69.5\",\n    \"search-insights\": \"^2.8.3\",\n    \"tailwindcss\": \"^3.3.3\",\n    \"webpack\": \"^5.88.1\"\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.5%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  },\n  \"devDependencies\": {\n    \"@docusaurus/eslint-plugin\": \"^3.0.0\",\n    \"@docusaurus/module-type-aliases\": \"^3.0.0\",\n    \"@docusaurus/tsconfig\": \"^3.0.0\",\n    \"@flashbots/mev-share-client\": \"^0.7.10\",\n    \"@tsconfig/docusaurus\": \"^2.0.2\",\n    \"@types/react\": \"^18.2.23\",\n    \"@types/react-helmet\": \"^6.1.2\",\n    \"@types/react-router-dom\": \"^5.1.8\",\n    \"@typescript-eslint/eslint-plugin\": \"^6.7.3\",\n    \"@typescript-eslint/parser\": \"^6.7.3\",\n    \"cspell\": \"^6.31.2\",\n    \"debug\": \"^4.3.4\",\n    \"eslint\": \"^8.48.0\",\n    \"eslint-config-airbnb\": \"^19.0.4\",\n    \"eslint-config-airbnb-typescript\": \"^17.1.0\",\n    \"eslint-config-prettier\": \"^9.0.0\",\n    \"eslint-import-resolver-typescript\": \"^3.6.1\",\n    \"eslint-plugin-header\": \"^3.1.1\",\n    \"eslint-plugin-import\": \"^2.29.0\",\n    \"eslint-plugin-jest\": \"^27.4.2\",\n    \"eslint-plugin-jsx-a11y\": \"^6.7.1\",\n    \"eslint-plugin-mdx\": \"^2.2.0\",\n    \"eslint-plugin-react\": \"^7.32.2\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"eslint-plugin-regexp\": \"^1.15.0\",\n    \"lint-staged\": \"^13.2.3\",\n    \"markdownlint-cli2\": \"^0.9.2\",\n    \"mocha\": \"^10.2.0\",\n    \"prettier\": \"^3.0.2\",\n    \"prettier-plugin-organize-imports\": \"^3.2.3\",\n    \"prettier-plugin-tailwindcss\": \"^0.5.6\",\n    \"stylelint\": \"^14.16.1\",\n    \"stylelint-config-prettier\": \"^9.0.5\",\n    \"stylelint-config-standard\": \"^29.0.0\",\n    \"typescript\": \"^5.2.2\"\n  },\n  \"engines\": {\n    \"node\": \">=22.18.0\"\n  }\n}\n"
  },
  {
    "path": "project-words.txt",
    "content": "camelcase\ndogfood\nflashbot\nflashbots\nFlashbots\nhideable\nInpage\nkatex\nMMSDK\nrehype\nSEPOLIA\nstylelint\ntailwindcss\n"
  },
  {
    "path": "src/components/Banner/Banner.custom.module.scss",
    "content": "@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 for your banner\nThe .banner class is already provided and apply to the parent element of\nthe banner.\n\nThe '@extend %banner-structure' defines the structural properties for the\nbanner and should not be removed.\n*/\n\n.banner {\n  @extend %banner-structure; // Do not remove\n}\n\n\n[data-theme=dark] .banner {\n  @extend %banner-structure; // Do not remove\n}\n"
  },
  {
    "path": "src/components/Banner/Banner.module.scss",
    "content": "@use 'base';\n\n.banner {\n  @extend %banner-structure;\n\n  background-color: var(--banner-background-color, var(--ifm-navbar-background-color));\n  color: var(--banner-text-color, var(--ifm-font-color-base));\n  \n  a {\n    color: var(--banner-text-color , var(--ifm-font-color-base));\n  }\n}\n"
  },
  {
    "path": "src/components/Banner/Banner.tsx",
    "content": "/* Custom Banner Module\nUse it to quickly deploy a simple banner to the Flashbots homepage\n\nTo add a new banner all you need to do is edit the ./banner.config.tsx\nfile and set the applicable properties. No other work is necessary.\n\nYou'll find more in-depth documentation there.\n*/\n\nimport React from 'react'\nimport clsx from 'clsx'\nimport bannerConfig from './banner.config'\nimport customStyles from './Banner.custom.module.scss'\nimport bannerStyles from './Banner.module.scss'\n\nexport interface BannerOptions {\n  bannerContent?: JSX.Element | string | null\n  backgroundColor: string\n  textColor: string\n  startDate: string | null\n  endDate: string | null\n  customBannerCSS: boolean\n}\n\nclass BannerConfigs {\n  options: BannerOptions\n\n  constructor(options: BannerOptions) {\n    this.options = options\n  }\n\n  // Sets the appropriate CSS rules for the element\n  // based on the `customCSS` option\n  getBannerStyle(): React.CSSProperties | null {\n    return !this.options.customBannerCSS\n      ? {\n          \"--banner-text-color\": this.options.textColor,\n          \"--banner-background-color\": this.options.backgroundColor\n        }\n      : null\n  }\n\n  // Sets the appropriate class name for the element\n  // based on the `customCSS` option\n  getBannerClass(): string {\n    const styles = this.options.customBannerCSS ? customStyles : bannerStyles\n\n    return clsx(styles.banner)\n  }\n\n  // Determines whether the banner should appear based on:\n  // 1. Whether there is content to be shown\n  // 2. The start and end dates exist and are valid\n  shouldShowBanner(): boolean {\n    if (!this.options.bannerContent) {\n      return false\n    }\n\n    const parsedStart = Date.parse(this.options.startDate)\n    const parsedEnd = Date.parse(this.options.endDate)\n    const currentDate = Date.now()\n\n    return (\n      (isNaN(parsedStart) || parsedStart <= currentDate) &&\n      (isNaN(parsedEnd) || parsedEnd >= currentDate)\n    )\n  }\n}\n\nexport default function Banner(): JSX.Element {\n  const configs = new BannerConfigs(bannerConfig)\n\n  if (!configs.shouldShowBanner()) {\n    return null\n  }\n\n  return (\n    <div style={configs.getBannerStyle()} className={configs.getBannerClass()}>\n      {configs.options.bannerContent}\n    </div>\n  )\n}\n"
  },
  {
    "path": "src/components/Banner/_base.scss",
    "content": "%banner-structure {\n  height: fit-content;\n  padding: 0.5rem 2rem;\n  text-align: center;\n  line-height: 1.25;\n\n  a{\n    cursor: pointer;\n    text-decoration: none;\n\n    &:hover {\n      text-decoration: underline;\n    }\n  }\n\n  @media (max-width: 720px){\n      padding: 0.5rem 2rem;\n  }\n}\n"
  },
  {
    "path": "src/components/Banner/banner.config.tsx",
    "content": "/* Custom Banner Module\nUse it to quickly deploy a simple banner to the Flashbots homepage\n\nTo add a new banner all you need to do is edit the properties below and set them\nto your desired values.\n\nFor simple banners with just a couple of colors - for copy and background - you\ncan use the properties here. But if the banner requires more sophisticated styling\nyou can override the color options by setting `customCSS: true` and adding your CSS\nrules to ./Banner.custom.module.scss.\n\nThere are detailed explanations for each property below, but here's a quick guide:\n - bannerContent: What should appear inside the banner\n - backgroundColor: Solid, single color for the banner\n - textColor: Solid, single color for all the copy inside the banner\n - startDate: When should the banner start appearing on the site\n - endDate: When should the banner stop appearing on the site\n - customCSS: Whether the banner should make use of custom CSS rules loaded from ./Banner.custom.module.scss\n*/\n\nimport React from 'react'\nimport BannerOptions from './Banner'\n\nexport const bannerConfig: BannerOptions = {\n  /*\n  bannerContent: The pure text or HTML markup to appear in the banner\n  - Banner won't appear when set to null\n  \n  Examples:\n    - bannerContent: null\n    - bannerContent: \"Banner content!\"\n    - bannerContent: (<span>Banner content! <a href='https://example.com' target='_blank' rel='noreferrer'>Link</a></span>)\n  */\n  bannerContent: null,\n\n  /*\n  backgroundColor: Single, solid background color for the banner\n  - Will default to the site's background when set to null\n  - Has no effect if customCSS is true\n\n  Examples:\n    - backgroundColor: null\n    - backgroundColor: \"#023047\"\n  */\n  backgroundColor: null,\n\n  /*\n  textColor: Single, solid text color for the banner\n  - Will default to the site's text color when set to null\n  - Has no effect if customCSS is true\n\n  Examples:\n    - textColor: null\n    - textColor: \"#ffb703\"\n  */\n  textColor: null,\n\n  /*\n  startDate: Date and time (UTC) when the banner should start appearing on the website\n  - When set to null a banner will always appear, provided there is content to be shown\n    and the endDate, if there is one, hasn't been reached\n  Format: \"YYYY-MM-DD HH:mmZ\"\n\n  Examples:\n    - startDate: null\n    - startDate: \"2001-09-14 16:00Z\"\n  */\n  startDate: null,\n\n  /*\n  endDate: Date and time (UTC) when the banner should stop appearing on the website\n  - When set to null a banner will always appear, provided there is content to be shown\n    and the startDate, if there is one, has been reached\n  Format: \"YYYY-MM-DD HH:mmZ\"\n\n  Examples:\n    - endDate: null\n    - endDate: \"2007-02-01 00:00Z\"\n  */\n  endDate: null,\n\n  /*\n  customCSS: Determines whether to use a custom CSS instead instead of the color options\n  - Custom CSS must be set in ./Banner.custom.module.scss\n  - Will completely bypass backgroundColor and textColor if set to true\n\n  Examples:\n    - customCSS: true\n  */\n  customBannerCSS: false\n}\n\nexport default bannerConfig\n"
  },
  {
    "path": "src/components/BrandAssets/AssetCard.tsx",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport React, { ReactNode } from \"react\"\nimport styles from  './styles.module.css';\nimport Download from \"./Download\";\n\ninterface IAssetCard {\n  title?: string\n  cover?: string\n  svg?: string\n  png?: string\n}\n\nfunction AssetCard({ title, cover, svg, png }: IAssetCard) {\n  return (\n    <div className=\"my-4 w-1/2 w-full\">\n      <img alt=\"\" src={ cover } className=\"w-full h-56 object-cover border border-solid border-slate-500/25 rounded-xl\"/>\n      <div className=\"w-full flex items-center gap-1 bg-gray-50/0 rounded-lg\">\n        <p className=\"px-2 grow m-0\">{ title }</p>\n        <Download file={ svg } type=\"svg\" />\n        <Download file={ png } type=\"png\" />\n      </div>\n    </div>\n  )\n}\n\nexport default AssetCard\n"
  },
  {
    "path": "src/components/BrandAssets/Download.tsx",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport React, { ReactNode } from \"react\"\n\ninterface IDownload {\n  file?: string\n}\n\nfunction Download({ file, type }: IDownload) {\n  return (\n    <a target=\"\\_blank\" href={ file } download className=\"border border-solid py-1 px-3 border-slate-400/50 rounded-lg flex items-center text-sm font-mono font-bold\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"w-4 h-4 pr-1\">\n        <path d=\"M10.75 2.75a.75.75 0 00-1.5 0v8.614L6.295 8.235a.75.75 0 10-1.09 1.03l4.25 4.5a.75.75 0 001.09 0l4.25-4.5a.75.75 0 00-1.09-1.03l-2.955 3.129V2.75z\" />\n        <path d=\"M3.5 12.75a.75.75 0 00-1.5 0v2.5A2.75 2.75 0 004.75 18h10.5A2.75 2.75 0 0018 15.25v-2.5a.75.75 0 00-1.5 0v2.5c0 .69-.56 1.25-1.25 1.25H4.75c-.69 0-1.25-.56-1.25-1.25v-2.5z\" />\n      </svg>\n      { type }\n    </a>\n  )\n}\n\nexport default Download\n"
  },
  {
    "path": "src/components/BrandAssets/index.tsx",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport {useState} from 'react';\nimport AssetCard from './AssetCard';\n\nexport default function BrandAssets() {\n\n  return (\n    <div>\n      <div className='flex max-[768px]:flex-col gap-4'>\n        <AssetCard\n          title=\"Flashbots Logo - Dark\"\n          cover=\"/img/brand-assets/flashbots_logo_dark.jpg\"\n          svg=\"/img/brand-assets/flashbots_logo_dark.svg\"\n          png=\"/img/brand-assets/flashbots_logo_dark.png\"\n        />\n        <AssetCard\n          title=\"Flashbots Logo - Light\"\n          cover=\"/img/brand-assets/flashbots_logo_light.jpg\"\n          svg=\"/img/brand-assets/flashbots_logo_light.svg\"\n          png=\"/img/brand-assets/flashbots_logo_light.png\"\n        />\n      </div>\n\n      <div className='flex max-[768px]:flex-col gap-4'>\n        <AssetCard\n          title=\"Flashbots Icon\"\n          cover=\"/img/brand-assets/flashbots_icon.jpg\"\n          svg=\"/img/brand-assets/flashbots_icon.svg\"\n          png=\"/img/brand-assets/flashbots_icon.png\"\n        />\n        <div className='block my-4 w-1/2 w-full'></div>\n      </div>\n\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/components/BrandAssets/styles.module.css",
    "content": ".root {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(clamp(100px,(1024px - 100vw) *1000, 100%), 1fr));\n  gap: 1rem;\n  margin-bottom: 2rem;\n}\n"
  },
  {
    "path": "src/components/Checkbox/index.tsx",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nfunction Checkbox({\n  label,\n  checked,\n  onChange,\n  disabled = false,\n}: {\n  label: string;\n  checked: boolean;\n  onChange: (val: boolean) => void;\n  disabled: boolean;\n}) {\n  const elements = [\n    <input\n      id={label}\n      type=\"checkbox\"\n      checked={checked}\n      disabled={disabled}\n      key={label}\n      onChange={(e) => {\n        onChange(e.target.checked);\n      }}\n    />,\n    <label\n      htmlFor={label}\n      key={label}\n      className=\"px-1 enabled:cursor-pointer enabled:hover:text-blue-600 \">\n      {label}\n    </label>,\n  ];\n  return (\n    <div className=\"m-1 flex cursor-pointer items-center disabled:pointer-events-none disabled:opacity-50\">\n      {elements}\n    </div>\n  );\n}\n\nexport default Checkbox;\n"
  },
  {
    "path": "src/components/Grid/Grid.tsx",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { ReactNode } from \"react\"\nimport styles from  './styles.module.css';\n\ninterface IGrid {\n  children: ReactNode | ReactNode[]\n}\n\nfunction Grid({ children }: IGrid) {\n\n  return (<section className={styles.root}>\n    { children }\n  </section>)\n}\n\nexport default Grid\n"
  },
  {
    "path": "src/components/Grid/styles.module.css",
    "content": ".root {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(clamp(100px,(1024px - 100vw) *1000, 100%), 1fr));\n  gap: 1rem;\n  margin-bottom: 2rem;\n}\n"
  },
  {
    "path": "src/components/GridBlock/GridBlock.tsx",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { ReactNode } from \"react\"\nimport styles from  './styles.module.css';\n\ninterface IGridBlock {\n  children: ReactNode | ReactNode[]\n  symbol: string\n  title: string\n}\n\nfunction GridBlock({ children, symbol, title }: IGridBlock) {\n  return (<div className={styles.root}>\n    <div className={styles.background}>\n      <div />\n      <div />\n      <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M1.23804 0.5H23.5309L1.23804 22.7929V0.5Z\" fill=\"#CACBCE\" fillOpacity=\"0.15\" stroke=\"#A8ABB2\" strokeOpacity=\"0.3\"/>\n      </svg>\n\n    </div>\n    {\n      title && (\n        <div className={styles.title}>\n          {\n            symbol && <p>{ symbol }</p>\n          }\n          <span>\n            { title }\n          </span>\n          <hr />\n        </div>\n      )\n    }\n    <div className={styles.content}>\n      {children}\n    </div>\n  </div>)\n}\n\nexport default GridBlock\n"
  },
  {
    "path": "src/components/GridBlock/styles.module.css",
    "content": ".root {\n  position: relative;\n  padding: 2rem 1rem 1.5rem;\n}\n\n.background {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  z-index: -1;\n}\n\n.background > *:first-child {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: calc((100% - 25px) + 1px);\n  border-top: 1px solid var(--ifm-color-emphasis-200);\n  border-left: 1px solid var(--ifm-color-emphasis-200);\n  border-right: 1px solid var(--ifm-color-emphasis-200);\n}\n\n.background > *:nth-child(2) {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: calc((100% - 25px) + 1px);\n  height: 25px;\n  border-bottom: 1px solid var(--ifm-color-emphasis-200);\n  border-left: 1px solid var(--ifm-color-emphasis-200);\n}\n\n.background > *:last-child {\n  position: absolute;\n  bottom: 0;\n  right: 0;\n}\n\n.title {\n  text-align: center;\n  height: 7rem;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n}\n\n.title p {\n  margin-bottom: 8px;\n  font-size: 11px;\n  font-weight: 700;\n}\n\n.title span {\n  flex-grow: 2;\n  font-size: 1.2rem;\n  line-height: 1.25;\n  font-weight: 500;\n  font-family: CMU-Serif, 'Times New Roman', Garamond, Georgia, serif;\n}\n\n.title hr {\n  width: 48px;\n  margin: 16px auto;\n}\n\n.content {\n  font-size: .9em;\n  line-height: var(--ifm-line-height-base);\n}\n\n.content ul, .content ol {\n  padding-left: 1ch;\n}\n\n.content ul li {\n  padding-inline-start: 1ch;\n  list-style-type: '•';\n}\n\n.content ul li::marker {\n  color: var(--ifm-color-primary);\n}\n"
  },
  {
    "path": "src/components/ProtectButton/index.tsx",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { useEffect, useState } from 'react';\n\nexport default function ProtectButton() {\n\n  // listen for light/dark theme changes\n  const [theme, setTheme] = useState('light')\n  useEffect(() => {\n    const htmlElement = document.documentElement;\n    const handleThemeChange = () => {\n      const currentTheme = htmlElement.getAttribute('data-theme');\n      setTheme(currentTheme || 'light');\n    };\n    handleThemeChange();\n    const observer = new MutationObserver(handleThemeChange);\n    observer.observe(htmlElement, { attributes: true, attributeFilter: ['data-theme'] });\n  }, [])\n\n  return (\n    <div className='w-full flex flex-row justify-center'>\n      <iframe\n        title='Protect Button'\n        id=\"protect-button\"\n        src={`https://protect.flashbots.net/button?theme=${theme}`}\n        height=\"88\" width=\"348\"\n        className=\"flex dark:dark border-none rounded-lg hover:outline\"\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "src/components/RemoteCodeBlock/index.tsx",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport {useState, useEffect} from \"react\"\nimport CodeBlock, {Props as CodeProps} from \"@theme/CodeBlock\"\n\n/** Code block that fetches its code from a URL. */\ninterface IRemoteCodeBlock extends CodeProps {\n    /** URL of code to be fetched. Must be a raw file.\n     * [Example](https://raw.githubusercontent.com/flashbots/pm/main/README.md) */\n    url: string\n}\n\nfunction RemoteCodeBlock({url, ...props}: IRemoteCodeBlock) {\n    const [content, setContent] = useState<string>()\n    useEffect(() => {\n        fetch(url)\n            .then((response) => response.text())\n            .then((text) => setContent(text))\n    }, [url])\n    return (<CodeBlock {...props}>\n            {content || `// Loading ${url} ...`}\n        </CodeBlock>)\n}\n\nexport default RemoteCodeBlock\n"
  },
  {
    "path": "src/components/SimpleDropdown/index.tsx",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport {Children, PropsWithChildren} from 'react';\nimport styles from './styles.module.css';\n\ntype SimpleDropdownParams = {\n  header: string;\n  italicHeader?: boolean;\n  onClickHeader?: () => void;\n  isOpen: boolean;\n};\n\nfunction SimpleDropdown({\n  children,\n  header,\n  italicHeader,\n  onClickHeader,\n  isOpen,\n}: PropsWithChildren<SimpleDropdownParams>) {\n  const useItalic = italicHeader !== false; // default to true\n  const subComponentList = Object.keys(SimpleDropdown);\n\n  const subComponents = subComponentList.map((key) =>\n    Children.map(children, (child: any) =>\n      child.type({}).key === key ? child : null,\n    ),\n  );\n\n  return (\n    <div className=\"dropdown-container\">\n      {subComponents[0]}\n      <details open={isOpen}>\n        <summary\n          role=\"button\"\n          tabIndex={0}\n          className=\"cursor-pointer pl-1 text-gray-600\"\n          onClick={(event) => {\n            event.preventDefault();\n            onClickHeader();\n          }}\n          onKeyDown={(event) => {\n            // Enter or Space key\n            if (event.keyCode === 13 || event.keyCode === 32) {\n              event.preventDefault();\n              onClickHeader();\n            }\n          }}>\n          {useItalic ? <em>{header}</em> : header}\n        </summary>\n        {subComponents[1]}\n      </details>\n    </div>\n  );\n}\n\nfunction Body(props) {\n  return (\n    <div key=\"Body\" className={styles.dropdownBody}>\n      <div>{props.children}</div>\n    </div>\n  );\n}\nSimpleDropdown.Body = Body;\n\nfunction HiddenBody({children}) {\n  return (\n    <div\n      key=\"HiddenBody\"\n      className=\"rounded-xl border-solid border-slate-200/75 p-2\">\n      {children}\n    </div>\n  );\n}\nSimpleDropdown.HiddenBody = HiddenBody;\n\nexport default SimpleDropdown;\n"
  },
  {
    "path": "src/components/SimpleDropdown/styles.module.css",
    "content": ""
  },
  {
    "path": "src/components/mev-share/buildersTable.tsx",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport {useSupportedBuilders} from './useSupportedBuilders';\n\nexport default function BuildersTable() {\n  const supportedBuilders = useSupportedBuilders();\n\n  return (\n    <table>\n      <thead>\n        <tr>\n          <th>Name</th>\n          <th>RPC</th>\n        </tr>\n      </thead>\n      <tbody>\n        {supportedBuilders.map((builder) => (\n          <tr key={`${builder.name}`}>\n            <td>{builder.name}</td>\n            <td>{builder.rpc}</td>\n          </tr>\n        ))}\n      </tbody>\n    </table>\n  );\n}\n"
  },
  {
    "path": "src/components/mev-share/useSupportedBuilders.tsx",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport {useEffect, useState} from 'react';\nimport axios from 'axios';\n\nexport type Builder = {\n  name: string;\n  rpc: string;\n  'supported-apis': Array<string>; // TODO: can we please change this to camelCase\n};\n\nexport const useSupportedBuilders = () => {\n  const [builders, setBuilders] = useState<Builder[]>([]);\n\n  useEffect(() => {\n    const source = axios.CancelToken.source();\n    const fetchSupportedBuilders = async () => {\n      try {\n        const res = await axios.get(\n          'https://raw.githubusercontent.com/flashbots/dowg/main/builder-registrations.json',\n          {cancelToken: source.token},\n        );\n        setBuilders(res.data);\n      } catch (error) {\n        if (axios.isCancel(error)) {\n          console.log('Request canceled', error.message);\n        } else {\n          throw error;\n        }\n      }\n    };\n\n    fetchSupportedBuilders();\n    return () => {\n      source.cancel('Component unmounted');\n    };\n  }, []);\n\n  return builders;\n};\n"
  },
  {
    "path": "src/css/custom.css",
    "content": "/**\n * Any CSS included here will be global. The classic template\n * bundles Infima by default. Infima is a CSS framework designed to\n * work well for content-centric websites.\n */\n @tailwind base;\n @tailwind components;\n @tailwind utilities;\n\n@font-face {\n  font-family: CMU-Serif;\n  src: url('/fonts/cmunbx.ttf') format('truetype');\n}\n\n@font-face {\n  font-family: CMU-Serif;\n  src: url('/fonts/cmunci.ttf') format('truetype');\n}\n\n@font-face {\n  font-family: CMU-Serif;\n  src: url('/fonts/cmunrm.ttf') format('truetype');\n}\n\n/* You can override the default Infima variables here. */\n:root {\n  --ifm-color-primary: #04F;\n  --ifm-color-content: var(--ifm-color-emphasis-800);\n  --ifm-code-font-size: 95%;\n}\n\n[data-theme='dark'] {\n  --ifm-color-primary: #9AF;\n  --ifm-heading-color: #FFF;\n}\n\n.docusaurus-highlight-code-line {\n  background-color: rgb(72 77 91);\n  display: block;\n  margin: 0 calc(-1 * var(--ifm-pre-padding));\n  padding: 0 var(--ifm-pre-padding);\n}\n\n.med {\n  width: 720px;\n}\n\n.caption-img {\n  text-align: center;\n  font-style: italic;\n  font-size: small;\n  padding-bottom: 16px;\n}\n\n.caption-img>p {\n  padding-top: 0;\n  margin-bottom: 4px;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  font-family: CMU-Serif, 'Times New Roman', Garamond, Georgia, serif;\n}\n\nh1,\nh2,\nh3 {\n  font-weight: 400;\n}\n\nh2 {\n  padding-bottom: 16px;\n  border-bottom: 1px solid var(--ifm-color-emphasis-200);\n}\n\n.menu__link--sublist::after {\n  background: var(--ifm-menu-link-sublist-icon) 50%/1.5rem 1.5rem;\n  opacity: .75;\n}"
  },
  {
    "path": "src/pages/styles.module.css",
    "content": "/* stylelint-disable docusaurus/copyright-header */\n\n/**\n * CSS files with the .module.css suffix will be treated as CSS modules\n * and scoped locally.\n */\n\n.heroBanner {\n  padding: 4rem 0;\n  text-align: center;\n  position: relative;\n  overflow: hidden;\n}\n\n@media screen and (max-width: 966px) {\n  .heroBanner {\n    padding: 2rem;\n  }\n}\n\n.buttons {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.features {\n  display: flex;\n  align-items: center;\n  padding: 2rem 0;\n  width: 100%;\n}\n\n.featureImage {\n  height: 200px;\n  width: 200px;\n}\n"
  },
  {
    "path": "src/theme/Layout/index.tsx",
    "content": "import React from 'react';\nimport Layout from '@theme-original/Layout';\nimport type LayoutType from '@theme/Layout';\nimport type {WrapperProps} from '@docusaurus/types';\nimport { Analytics } from '@vercel/analytics/react';\ntype Props = WrapperProps<typeof LayoutType>;\n\nexport default function LayoutWrapper(props: Props): JSX.Element {\n  return (\n    <>\n      <Layout {...props} />\n      <Analytics />\n    </>\n  );\n}\n"
  },
  {
    "path": "src/theme/Navbar/index.js",
    "content": "import React from 'react';\nimport Navbar from '@theme-original/Navbar';\nimport Banner from '../../components/Banner/Banner'\nimport styles from './navbar.module.css'\n\nexport default function NavbarWrapper(props) {\n  return (\n    <div className={styles.combinedNavigation}>\n      <Banner/>\n      <Navbar {...props} />\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/theme/Navbar/navbar.module.css",
    "content": ".combinedNavigation {\n  position: sticky;\n  top: 0px;\n  z-index: var(--ifm-z-index-fixed);\n}\n"
  },
  {
    "path": "src/types/global.d.ts",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\ndeclare global {\n  interface Window {\n    ethereum: any\n  }\n}\n\nexport {};\n"
  },
  {
    "path": "static/.nojekyll",
    "content": ""
  },
  {
    "path": "static/img/site.webmanifest",
    "content": "{\"name\":\"\",\"short_name\":\"\",\"icons\":[{\"src\":\"/android-chrome-192x192.png\",\"sizes\":\"192x192\",\"type\":\"image/png\"},{\"src\":\"/android-chrome-512x512.png\",\"sizes\":\"512x512\",\"type\":\"image/png\"}],\"theme_color\":\"#ffffff\",\"background_color\":\"#ffffff\",\"display\":\"standalone\"}"
  },
  {
    "path": "static/robots.txt",
    "content": "User-agent: *\nDisallow:\n"
  },
  {
    "path": "tailwind.config.js",
    "content": "/**\n * Copyright (c) Flashbots Ltd. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nmodule.exports = {\n  corePlugins: {\n    preflight: false, // disable Tailwind's reset\n  },\n  content: [\"./src/**/*.{js,jsx,ts,tsx}\", \"../docs/**/*.mdx\"],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  // This file is not used in compilation. It is here just for a nice editor experience.\n  \"extends\": \"@tsconfig/docusaurus/tsconfig.json\",\n  \"compilerOptions\": {\n    \"lib\": [\"DOM\", \"ESNext\"],\n    \"jsx\": \"react-jsx\",\n    \"baseUrl\": \".\",\n    \"resolveJsonModule\": true,\n    \"types\": [\n      \"node\",\n      \"@docusaurus/module-type-aliases\",\n      \"@docusaurus/theme-classic\",\n    ],\n\n    // Duplicated from the root config, because TS does not support extending\n    // multiple configs and we want to dogfood the @docusaurus/tsconfig one\n    \"allowUnreachableCode\": false,\n    \"exactOptionalPropertyTypes\": false,\n    \"noFallthroughCasesInSwitch\": true,\n    \"noImplicitOverride\": true,\n    \"noImplicitReturns\": true,\n    \"noPropertyAccessFromIndexSignature\": false,\n    \"noUncheckedIndexedAccess\": true,\n    \"strict\": true,\n    \"alwaysStrict\": true,\n    \"noImplicitAny\": true,\n    \"noImplicitThis\": true,\n    \"strictBindCallApply\": true,\n    \"strictFunctionTypes\": true,\n    \"strictNullChecks\": true,\n    \"strictPropertyInitialization\": true,\n    \"useUnknownInCatchVariables\": true,\n    \"noUnusedLocals\": false,\n    \"noUnusedParameters\": false,\n    \"importsNotUsedAsValues\": \"remove\",\n\n    // This is important. We run `yarn tsc` in website so we can catch issues\n    // with our declaration files (mostly names that are forgotten to be\n    // imported, invalid semantics...). Because we don't have end-to-end type\n    // tests, removing this would make things much harder to catch.\n    \"skipLibCheck\": false,\n  },\n  \"include\": [\n    \"src/**/*\",\n  ]\n}\n"
  },
  {
    "path": "vercel.json",
    "content": "{\n  \"cleanUrls\": true,\n  \"trailingSlash\": false,\n  \"redirects\": [\n    {\n      \"source\": \"/flashbots-protect/rpc/:path(uncle-bandits|releases)\",\n      \"destination\": \"/flashbots-protect/overview\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/flashbots-protect/rpc/:path(quick-start|mev-share|cancellations)\",\n      \"destination\": \"/flashbots-protect/:path\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/flashbots-protect/rpc/:path(status-api|ratelimiting|bundle-cache)\",\n      \"destination\": \"/flashbots-protect/additional-documentation/:path\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/flashbots-protect/rpc/fast-mode\",\n      \"destination\": \"/flashbots-protect/quick-start#faster-transactions\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/flashbots-protect/api/json-rpc\",\n      \"destination\": \"/flashbots-auction/advanced/rpc-endpoint\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/flashbots-mev-share/overview\",\n      \"destination\": \"/flashbots-mev-share/introduction\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/flashbots-mev-boost/relays\",\n      \"destination\": \"/flashbots-mev-boost/relay\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/flashbots-mev-boost/architecture-overview/MEV-boost-block-proposal\",\n      \"destination\": \"/flashbots-mev-boost/architecture-overview/block-proposal\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/flashbots-auction/searchers/:path*\",\n      \"destination\": \"/flashbots-auction/:path\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/flashbots-protect/mev-share\",\n      \"destination\": \"/flashbots-protect/mev-refunds\",\n      \"permanent\": true\n    }\n  ]\n}\n"
  }
]