{"id":20433836,"url":"https://github.com/flashbots/ethers-provider-flashbots-bundle","last_synced_at":"2026-01-25T00:03:04.097Z","repository":{"id":38321919,"uuid":"318432859","full_name":"flashbots/ethers-provider-flashbots-bundle","owner":"flashbots","description":"Flashbots provider for ethers.js","archived":false,"fork":false,"pushed_at":"2024-03-27T01:17:30.000Z","size":336,"stargazers_count":568,"open_issues_count":41,"forks_count":222,"subscribers_count":23,"default_branch":"master","last_synced_at":"2025-11-15T00:05:36.219Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flashbots.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-12-04T07:06:23.000Z","updated_at":"2025-11-11T06:47:20.000Z","dependencies_parsed_at":"2024-02-20T16:28:14.775Z","dependency_job_id":"01f0f7c0-9b25-4f2f-8eb0-6df2ef2c3903","html_url":"https://github.com/flashbots/ethers-provider-flashbots-bundle","commit_stats":{"total_commits":136,"total_committers":15,"mean_commits":9.066666666666666,"dds":0.5,"last_synced_commit":"aa5e48ee9b9610ed778ba477bb981490f5ce1769"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/flashbots/ethers-provider-flashbots-bundle","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flashbots%2Fethers-provider-flashbots-bundle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flashbots%2Fethers-provider-flashbots-bundle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flashbots%2Fethers-provider-flashbots-bundle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flashbots%2Fethers-provider-flashbots-bundle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flashbots","download_url":"https://codeload.github.com/flashbots/ethers-provider-flashbots-bundle/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flashbots%2Fethers-provider-flashbots-bundle/sbom","scorecard":{"id":402660,"data":{"date":"2025-08-11","repo":{"name":"github.com/flashbots/ethers-provider-flashbots-bundle","commit":"7ddaf2c9d7662bef400151e0bfc89f5b13e72b4c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":8,"reason":"Found 8/10 approved changesets -- score normalized to 8","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/lint.yml:1","Warn: no topLevel permission defined: .github/workflows/nodejs.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":1,"reason":"dependency not pinned by hash detected -- score normalized to 1","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/lint.yml:8: update your workflow using https://app.stepsecurity.io/secureworkflow/flashbots/ethers-provider-flashbots-bundle/lint.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/lint.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/flashbots/ethers-provider-flashbots-bundle/lint.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nodejs.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/flashbots/ethers-provider-flashbots-bundle/nodejs.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nodejs.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/flashbots/ethers-provider-flashbots-bundle/nodejs.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/nodejs.yml:22","Warn: npmCommand not pinned by hash: .github/workflows/nodejs.yml:23","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of   3 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"13 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T20:26:07.820Z","repository_id":38321919,"created_at":"2025-08-18T20:26:07.820Z","updated_at":"2025-08-18T20:26:07.820Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28739321,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T22:12:27.248Z","status":"ssl_error","status_checked_at":"2026-01-24T22:12:10.529Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-15T08:21:41.128Z","updated_at":"2026-01-25T00:03:04.081Z","avatar_url":"https://github.com/flashbots.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ethers-provider-flashbots-bundle\n\nThis repository contains the `FlashbotsBundleProvider` ethers.js provider, an additional `Provider` to `ethers.js` to enable high-level access to `eth_sendBundle` and `eth_callBundle` rpc endpoint on [mev-relay](https://github.com/flashbots/mev-relay-js). **`mev-relay` is a hosted service; it is not necessary to run `mev-relay` or `mev-geth` to proceed with this example.**\n\nFlashbots-enabled relays and miners expose two new jsonrpc endpoints: `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 need access to another full-featured (non-Flashbots) endpoint for nonce-calculation, gas estimation, and transaction status.\n\nOne key feature this library provides is **payload signing**, a requirement to submit Flashbot bundles to the `mev-relay` service. This library takes care of the signing process via the `authSigner` passed into the constructor. [Read more about relay signatures here](https://github.com/flashbots/mev-relay-js#authentication)\n\nThis library is not a fully functional ethers.js implementation, just a simple provider class, designed to interact with an existing [ethers.js v5 installation](https://github.com/ethers-io/ethers.js/).\n\n## Example\n\nInstall ethers.js and the Flashbots ethers bundle provider.\n\n```bash\nnpm install --save ethers\nnpm install --save @flashbots/ethers-provider-bundle\n```\n\nOpen up a new TypeScript file (this also works with JavaScript if you prefer)\n\n```ts\nimport { providers, Wallet } from \"ethers\";\nimport { FlashbotsBundleProvider } from \"@flashbots/ethers-provider-bundle\";\n\n// Standard json rpc provider directly from ethers.js (NOT Flashbots)\nconst provider = new providers.JsonRpcProvider({ url: ETHEREUM_RPC_URL }, 1)\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\n// In production, this should be used across multiple bundles to build relationship. In this example, we generate a new wallet each time\nconst authSigner = Wallet.createRandom();\n\n// Flashbots provider requires passing in a standard provider\nconst flashbotsProvider = await FlashbotsBundleProvider.create(\n  provider, // a normal ethers.js provider, to perform gas estimiations and nonce lookups\n  authSigner // ethers.js signer wallet, only for signing request payloads, not transactions\n)\n```\n\nFrom here, you have a `flashbotsProvider` object setup which can now perform either an `eth_callBundle` (via `simulate()`) or `eth_sendBundle` (via `sendBundle`). Each of these functions act on an array of `Bundle Transactions`\n\n## Bundle Transactions\n\nBoth `simulate` and `sendBundle` operate on a bundle of strictly-ordered transactions. While the miner requires signed transactions, the provider library will accept a mix of pre-signed transaction and `TransactionRequest + Signer` transactions (which it will estimate, nonce-calculate, and sign before sending to the `mev-relay`)\n\n```ts\nconst wallet = new Wallet(PRIVATE_KEY)\nconst transaction = {\n  to: CONTRACT_ADDRESS,\n  data: CALL_DATA\n}\nconst transactionBundle = [\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  ]\n```\n\n## Block Targeting\n\nThe last thing required for `sendBundle()` is block targeting. Every bundle specifically references a single block. If your bundle is valid for multiple blocks (including all blocks until it is mined), `sendBundle()` must be called for every block, ideally on one of the blocks immediately prior. This gives you a chance to re-evaluate the opportunity you are capturing and re-sign your transactions with a higher nonce, if necessary.\n\nThe block should always be a _future_ block, never the current one.\n\n```ts\nconst targetBlockNumber = (await provider.getBlockNumber()) + 1\n```\n\n## Gas Prices and EIP-1559\n\nBefore EIP-1559 was activated, the most common way for searchers to submit transactions is with `gasPrice=0`, with an on-chain payment to `block.coinbase` conditional on the transaction's success. All transactions must pay `baseFee` now, an attribute of a block. For an example of how to ensure you are using this `baseFee`, see `demo.ts` in this repository.\n\n```js\nconst block = await provider.getBlock(blockNumber)\nconst maxBaseFeeInFutureBlock = FlashbotsBundleProvider.getMaxBaseFeeInFutureBlock(block.baseFeePerGas, BLOCKS_IN_THE_FUTURE)\nconst eip1559Transaction = {\n    to: wallet.address,\n    type: 2,\n    maxFeePerGas: PRIORITY_FEE.add(maxBaseFeeInFutureBlock),\n    maxPriorityFeePerGas: PRIORITY_FEE,\n    gasLimit: 21000,\n    data: '0x',\n    chainId: CHAIN_ID\n}\n```\n\n`FlashbotsBundleProvider.getMaxBaseFeeInFutureBlock` calculates the maximum baseFee that is possible `BLOCKS_IN_THE_FUTURE` blocks, given maximum expansion on each block. You won't pay this fee, so long as it is specified as `maxFeePerGas`, you will only pay the block's `baseFee`.\n\nAdditionally if you have the `baseFeePerGas`, `gasUsed`, and `gasLimit` from the current block and are only targeting one block in the future you can get the exact base fee for the next block using `FlashbotsBundleProvider.getBaseFeeInNextBlock`. This method implements the math based on the [EIP1559 definition](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md)\n\n## Simulate and Send\n\nNow that we have:\n\n1. Flashbots Provider `flashbotsProvider`\n2. Bundle of transactions `transactionBundle`\n3. Block Number `targetBlockNumber`\n\nWe can run simulations and submit directly to miners, via the `mev-relay`.\n\nSimulate:\n\n```ts\n  const signedTransactions = await flashbotsProvider.signBundle(transactionBundle)\n  const simulation = await flashbotsProvider.simulate(signedTransactions, targetBlockNumber)\n  console.log(JSON.stringify(simulation, null, 2))\n```\n\nSend:\n\n```ts\nconst flashbotsTransactionResponse = await flashbotsProvider.sendBundle(\n  transactionBundle,\n  targetBlockNumber,\n  )\n```\n\n## FlashbotsTransactionResponse\n\nAfter calling `sendBundle`, this provider will return a Promise of an object with helper functions related to the bundle you submitted.\n\nThese functions return metadata available at transaction submission time, as well as the following functions which can wait, track, and simulate the bundle's behavior.\n\n- `bundleTransactions()` - An array of transaction descriptions sent to the relay, including hash, nonce, and the raw transaction.\n- `receipts()` - Returns promise of an array of transaction receipts corresponding to the transaction hashes that were relayed as part of the bundle. Will not wait for block to be mined; could return incomplete information\n- `wait()` - Returns a promise which will wait for target block number to be reached _OR_ one of the transactions to become invalid due to nonce-issues (including, but not limited to, one of the transactions from your bundle being included too early). Returns the wait resolution as a status enum\n- `simulate()` - Returns a promise of the transaction simulation, once the proper block height has been reached. Use this function to troubleshoot failing bundles and verify miner profitability\n\n## Optional eth_sendBundle arguments\n\nBeyond target block number, an object can be passed in with optional attributes:\n\n```ts\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\n### minTimestamp / maxTimestamp\n\nWhile each bundle targets only a single block, you can add a filter for validity based on the block's timestamp. This does _not_ allow for targeting any block number based on a timestamp or instruct miners on what timestamp to use, it merely serves as a secondary filter.\n\nIf your bundle is not valid before a certain time or includes an expiring opportunity, setting these values allows the miner to skip bundle processing earlier in the phase.\n\nAdditionally, you could target several blocks in the future, but with a strict maxTimestamp, to ensure your bundle is considered for inclusion up to a specific time, regardless of how quickly blocks are mined in that timeframe.\n\n### Reverting Transaction Hashes\n\nTransaction bundles will not be considered for inclusion if they include _any_ transactions that revert or fail. While this is normally desirable, there are some advanced use-cases where a searcher might WANT to bring a failing transaction to the chain. This is normally desirable for nonce management. Consider:\n\nTransaction Nonce #1 = Failed (unrelated) token transfer\nTransaction Nonce #2 = DEX trade\n\nIf a searcher wants to bring #2 to the chain, #1 must be included first, and its failure is not related to the desired transaction #2. This is especially common during high gas times.\n\nOptional parameter `revertingTxHashes` allows a searcher to specify an array of transactions that can (but are not required to) revert.\n\n## Paying for your bundle\n\nIn addition to paying for a bundle with gas price, bundles can also conditionally pay a miner via:\n`block.coinbase.transfer(_minerReward)`\nor\n`block.coinbase.call{value: _minerReward}(\"\");`\n\n(assuming _minerReward is a solidity `uint256` with the wei-value to be transferred directly to the miner)\n\nThe entire value of the bundle is added up at the end, so not every transaction needs to have a gas price or `block.coinbase` payment, so long as at least one does, and pays enough to support the gas used in non-paying transactions.\n\nNote: Gas-fees will ONLY benefit your bundle if the transaction is not already present in the mempool. When including a pending transaction in your bundle, it is similar to that transaction having a gas price of `0`; other transactions in your bundle will need to pay more for the gas it uses.\n\n## Bundle and User Statistics\n\nThe Flashbots relay can also return statistics about you as a user (identified solely by your signing address) and any bundle previously submitted.\n\n- `getUserStats()` returns aggregate metrics about past performance, including if your signing key is currently eligible for the \"high priority\" queue. [Read more about searcher reputation here](https://docs.flashbots.net/flashbots-auction/searchers/advanced/reputation)\n- `getBundleStats(bundleHash, targetBlockNumber)` returns data specific to a single bundle submission, including detailed timestamps for the various phases a bundle goes before reaching miners. You can get the bundleHash from the simulation:\n\n  ```js\n  const simulation = await flashbotsProvider.simulate(signedTransactions, targetBlockNumber)\n  console.log(simulation.bundleHash)\n  ```\n\n## Investigating Losses\n\nWhen your bundle fails to land in the specified block, there are many reasons why this could have occurred. For a list of reasons, check out [Flashbots Docs : Why didn't my transaction get included?](https://docs.flashbots.net/flashbots-auction/searchers/faq/#why-didnt-my-transaction-get-included). To aid in troubleshooting, this library offers a method that will simulate a bundle in multiple positions to identify the competing bundle that landed on chain (if there was one) and calculate the relevant pricing.\n\nFor usage instructions, check out the `demo-research.ts`.\n\n## How to run demo.ts\n\nIncluded is a simple demo of how to construct the FlashbotsProvider with auth signer authentication and submit a [non-functional] bundle. This will not yield any mev, but serves as a sample initialization to help integrate into your own functional searcher.\n\n## Sending a Private Transaction\n\nTo send a _single_ transaction without having to send it as a bundle, use the `sendPrivateTransaction` function. This method allows us to process transactions faster and more efficiently than regular bundles. When you send a transaction using this method, we will try to send it to miners over the next 25 blocks (up to, but not past the target block number).\n\n```js\nconst tx = {\n    from: wallet.address,\n    to: wallet.address,\n    value: \"0x42\",\n    gasPrice: BigNumber.from(99).mul(1e9), // 99 gwei\n    gasLimit: BigNumber.from(21000),\n}\nconst privateTx = {\n    transaction: tx,\n    signer: wallet,\n}\n\nconst res = await flashbotsProvider.sendPrivateTransaction(privateTx)\n```\n\nOptionally, you can set the following parameters to fine-tune your submission:\n\n```js\n// highest block number your tx can be included in\nconst maxBlockNumber = (await provider.getBlockNumber()) + 10;\n// timestamp for simulations\nconst minTimestamp = 1645753192;\n\nconst res = await flashbotsProvider.sendPrivateTransaction(\n  privateTx, \n  {maxBlockNumber, minTimestamp}\n)\n```\n\n## Flashbots on Goerli\n\nTo test Flashbots before going to mainnet, you can use the Goerli Flashbots relay, which works in conjunction with a Flashbots-enabled Goerli validator. Flashbots on Goerli requires two simple changes:\n\n1. Ensure your genericProvider passed in to the FlashbotsBundleProvider constructor is connected to Goerli (gas estimates and nonce requests need to correspond to the correct chain):\n\n```ts\nimport { providers } from 'ethers'\nconst provider = providers.getDefaultProvider('goerli')\n```\n\n2. Set the relay endpoint to `https://relay-goerli.flashbots.net/`\n\n```ts\nconst flashbotsProvider = await FlashbotsBundleProvider.create(\n  provider,\n  authSigner,\n  'https://relay-goerli.flashbots.net/',\n  'goerli')\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflashbots%2Fethers-provider-flashbots-bundle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflashbots%2Fethers-provider-flashbots-bundle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflashbots%2Fethers-provider-flashbots-bundle/lists"}