flashbots / web3-flashbots

Web3.py plugin for using Flashbots' bundle APIs
https://pypi.org/project/flashbots/
MIT License
405 stars 213 forks source link

Add new simple examples for Sepolia testnet #89

Closed jasonthewhale closed 3 months ago

jasonthewhale commented 8 months ago

Since Goerli gonna sunset, it makes sense to add new example based on Sepolia testnet.

Changes:

odysseus0 commented 3 months ago

Thanks a lot

odysseus0 commented 3 months ago

Suggested edit:

diff --git a/examples/simple_new.py b/examples/simple_new.py
index 7beb020..ed11117 100644
--- a/examples/simple_new.py
+++ b/examples/simple_new.py
@@ -2,26 +2,57 @@
 Minimal viable example of flashbots usage with dynamic fee transactions.
 Sends a bundle of two transactions which transfer some ETH into a random account.

+"eth_sendBundle" is a generic method that can be used to send a bundle to any relay.
+For instance, you can use the following relay URLs:
+    titan: 'https://rpc.titanbuilder.xyz/'
+    beaver: 'https://rpc.beaverbuild.org/'
+    builder69: 'https://builder0x69.io/'
+    rsync: 'https://rsync-builder.xyz/'
+    flashbots: 'https://relay.flashbots.net'
+
+You can simply replace the URL in the flashbot method to use a different relay like:
+    flashbot(w3, signer, YOUR_CHOSEN_RELAY_URL)
+
 Environment Variables:
 - ETH_SENDER_KEY: Private key of account which will send the ETH.
 - ETH_SIGNER_KEY: Private key of account which will sign the bundle. 
     - This account is only used for reputation on flashbots and should be empty.
-- PROVIDER_URL: HTTP JSON-RPC Ethereum provider URL.
+- PROVIDER_URL: (Optional) HTTP JSON-RPC Ethereum provider URL. If not set, Flashbots Protect RPC will be used.
 """

 import os
 import secrets
 from uuid import uuid4
+
 from eth_account.account import Account
 from eth_account.signers.local import LocalAccount
-from flashbots import flashbot
-from web3 import Web3, HTTPProvider
+from web3 import HTTPProvider, Web3
 from web3.exceptions import TransactionNotFound
 from web3.types import TxParams

-# change this to `False` if you want to use mainnet
-USE_SEPOLIA = True
-CHAIN_ID = 11155111 if USE_SEPOLIA else 1
+from flashbots import flashbot
+
+# Define the network to use
+NETWORK = "holesky"  # Options: "sepolia", "holesky", "mainnet"
+
+# Define chain IDs and Flashbots Protect RPC URLs
+NETWORK_CONFIG = {
+    "sepolia": {
+        "chain_id": 11155111,
+        "provider_url": "https://rpc-sepolia.flashbots.net",
+        "relay_url": "https://relay-sepolia.flashbots.net",
+    },
+    "holesky": {
+        "chain_id": 17000,
+        "provider_url": "https://rpc-holesky.flashbots.net",
+        "relay_url": "https://relay-holesky.flashbots.net",
+    },
+    "mainnet": {
+        "chain_id": 1,
+        "provider_url": "https://rpc.flashbots.net",
+        "relay_url": None,  # Mainnet uses default Flashbots relay
+    },
+}

 def env(key: str) -> str:
@@ -42,22 +73,20 @@ def main() -> None:
     # NOTE: this account should not store funds
     signer: LocalAccount = Account.from_key(env("ETH_SIGNER_KEY"))

-    w3 = Web3(HTTPProvider(env("PROVIDER_URL")))
-
-    """
-        "eth_sendBundle" is a generic method that can be used to send a bundle to any relay.
-        For instance, you can use the following relay URLs:
-            titan: 'https://rpc.titanbuilder.xyz/'
-            beaver: 'https://rpc.beaverbuild.org/'
-            builder69: 'https://builder0x69.io/'
-            rsync: 'https://rsync-builder.xyz/'
-            flashbots: 'https://relay.flashbots.net'
-        
-        You can simply replace the URL in the flashbot method to use a different relay like:
-            flashbot(w3, signer, "https://rpc.titanbuilder.xyz/")
-    """
-    if USE_SEPOLIA:
-        flashbot(w3, signer, "https://relay-sepolia.flashbots.net")
+    # Use user-provided RPC URL if available, otherwise use Flashbots Protect RPC
+    user_provider_url = env("PROVIDER_URL")
+    if user_provider_url:
+        provider_url = user_provider_url
+        print(f"Using user-provided RPC: {provider_url}")
+    else:
+        provider_url = NETWORK_CONFIG[NETWORK]["provider_url"]
+        print(f"Using Flashbots Protect RPC: {provider_url}")
+
+    w3 = Web3(HTTPProvider(provider_url))
+
+    relay_url = NETWORK_CONFIG[NETWORK]["relay_url"]
+    if relay_url:
+        flashbot(w3, signer, relay_url)
     else:
         flashbot(w3, signer)

@@ -82,7 +111,7 @@ def main() -> None:
         "maxFeePerGas": Web3.toWei(200, "gwei"),
         "maxPriorityFeePerGas": Web3.toWei(50, "gwei"),
         "nonce": nonce,
-        "chainId": CHAIN_ID,
+        "chainId": NETWORK_CONFIG[NETWORK]["chain_id"],
         "type": 2,
     }
     tx1_signed = sender.sign_transaction(tx1)
@@ -94,7 +123,7 @@ def main() -> None:
         "maxFeePerGas": Web3.toWei(200, "gwei"),
         "maxPriorityFeePerGas": Web3.toWei(50, "gwei"),
         "nonce": nonce + 1,
-        "chainId": CHAIN_ID,
+        "chainId": NETWORK_CONFIG[NETWORK]["chain_id"],
         "type": 2,
     }

@@ -108,7 +137,7 @@ def main() -> None:
         block = w3.eth.block_number

         # Simulation is only supported on mainnet
-        if not USE_SEPOLIA:
+        if NETWORK == "mainnet":
             print(f"Simulating on block {block}")
             # Simulate bundle on current block.
             # If your RPC provider is not fast enough, you may get "block extrapolation negative"