{"id":19252100,"url":"https://github.com/optimism-java/mev-share-java","last_synced_at":"2026-01-15T23:09:31.929Z","repository":{"id":190556443,"uuid":"682887593","full_name":"optimism-java/mev-share-java","owner":"optimism-java","description":"Client library for Flashbots MEV-share Matchmaker.","archived":false,"fork":false,"pushed_at":"2023-09-21T08:22:14.000Z","size":132,"stargazers_count":7,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-21T13:38:23.514Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/optimism-java.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","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":"2023-08-25T05:29:51.000Z","updated_at":"2024-08-28T08:21:53.000Z","dependencies_parsed_at":"2024-11-09T18:27:01.409Z","dependency_job_id":"8842f79e-f4a5-4afa-97ab-e9009829208f","html_url":"https://github.com/optimism-java/mev-share-java","commit_stats":null,"previous_names":["optimism-java/mev-share-java"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/optimism-java/mev-share-java","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimism-java%2Fmev-share-java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimism-java%2Fmev-share-java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimism-java%2Fmev-share-java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimism-java%2Fmev-share-java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/optimism-java","download_url":"https://codeload.github.com/optimism-java/mev-share-java/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimism-java%2Fmev-share-java/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28473974,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T22:27:41.514Z","status":"ssl_error","status_checked_at":"2026-01-15T21:54:47.910Z","response_time":62,"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-09T18:25:29.066Z","updated_at":"2026-01-15T23:09:31.913Z","avatar_url":"https://github.com/optimism-java.png","language":"Java","readme":"[![mev-share-java CI](https://github.com/optimism-java/mev-share-java/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/optimism-java/mev-share-java/actions/workflows/build.yml)\n[![License](https://img.shields.io/badge/license-MIT-blue)](https://opensource.org/licenses/MIT)\n![Coverage](.github/badges/jacoco.svg)\n![Branches](.github/badges/branches.svg)\n\n# mev-share-java\n\nMev-share-java is a Java library for working with MEV-share.\n\nBased on [Specs](https://github.com/flashbots/mev-share)\n\n## Using\n\n### Maven\n\n```xml\n\u003cdependency\u003e\n\u003cgroupId\u003eme.grapebaba\u003c/groupId\u003e\n\u003cartifactId\u003emev-share-java\u003c/artifactId\u003e\n\u003cversion\u003e0.1.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### Gradle\n\n```groovy\nimplementation 'me.grapebaba:mev-share-java:0.1.1'\n```\n\n## Building Locally\n\nTo get started you need to install JDK17+, then run the following command:\n\n```bash\n./gradlew clean build -x test\n```\n\n## Javadoc\n\nFor the latest javadocs for the `main` branch, run `./gradlew javadoc` and open\nthe document under the `build/docs/javadoc/index.html` in your browser.\n\n## Testing\n\n### To run unit tests\n\n```\nGOERLI_RPC_URL=\u003cGOERLI_RPC_URL\u003e SIGNER_PRIVATE_KEY=\u003cSIGNER_PRIVATE_KEY\u003e ./gradlew test\n```\n\n## How to use it\n\n### Create a MEVShare instance\n\n```java\n// Create a credential instance for authentication using Web3j\nCredentials authSigner = Credentials.create(\"\u003chex string of privateKey\u003e\");\n\n// Create an ethereum provider instance using Web3j\nWeb3j web3j = Web3j.build(new HttpService(\"\u003cethereum network rpc url\u003e\"));\n\n// Create a Mev share network options instance or use built-in options\nNetwork network = new Network()\n\t\t.setName(\"\u003cnetwork name\u003e\")\n\t\t.setChainId(\"\u003cchain id\u003e\")\n\t\t.setRpcUrl(\"\u003cmev share network rpc url\u003e\")\n\t\t.setStreamUrl(\"\u003cmev share network stream url\u003e\");\n\nNetwork network = Network.GOERLI;\nNetwork network = Network.MAINNET;\n\n// Create a Mev share instance\nMevShareClient mevShareClient = new MevShareClient(network, authSigner, web3j);\n```\n\n### History events Query\n\n```java\n// Query the Event info\nCompletableFuture\u003cEventHistoryInfo\u003e historyInfoFuture = mevShareClient.getEventHistoryInfo();\n\n// Query the Event List by params\nEventHistoryParams historyParams = new EventHistoryParams().setLimit(20).setBlockStart(BigInteger.valueOf(1_000_000L));\nCompletableFuture\u003cList\u003cEventHistoryEntry\u003e\u003e eventHistory = mevShareClient.getEventHistory(historyParams);\n```\n\n### Subscribe to events stream\n\n```java\n// Create an event listener which handles the event\nConsumer\u003cMevShareEvent\u003e eventListener = mevShareEvent -\u003e {\n\t\t\t// do something and do not block here...\n\t};\n\n// Subscribe to events stream\nDisposable disposable = mevShareClient.subscribe(eventListener);\n\n// remember to release when no longer to subscribe events\ndisposable.dispose();\n```\n\n### Send bundle\n\n#### Send a bundle including a hash item\n\n```java\n\n// Listen to the event stream and capture the bundle hash\nCompletableFuture\u003cMevShareEvent\u003e future = new CompletableFuture\u003c\u003e();\nDisposable eventSource = mevShareClient.subscribe(mevShareEvent -\u003e {\n\tif (mevShareEvent.getHash() != null) {\n\t\tfuture.complete(mevShareEvent);\n\t}\n});\nMevShareEvent mevShareEvent = future.get();\neventSource.dispose();\n\nBigInteger number = web3j.ethGetBlockByNumber(DefaultBlockParameterName.LATEST, false)\n\t\t.send()\n\t\t.getBlock()\n\t\t.getNumber();\n\nInclusion inclusion =\n\t\tnew Inclusion().setBlock(number.add(BigInteger.ONE)).setMaxBlock(number.add(BigInteger.valueOf(4)));\n\nBundleItemType.HashItem bundleItem = new BundleItemType.HashItem().setHash(mevShareEvent.getHash());\n\n// Create a backrun transaction\nCredentials signer = Credentials.create(\"\u003cprivate key\u003e\");\nBigInteger nonce = web3j.ethGetTransactionCount(signer.getAddress(), DefaultBlockParameterName.PENDING)\n.send()\n.getTransactionCount();\nBigInteger gasPrice = web3j.ethGasPrice().send().getGasPrice();\nBigInteger gasLimit = DefaultGasProvider.GAS_LIMIT;\nfinal String to = \"\u003cto address\u003e\";\nfinal String amount = \"\u003cether amount\u003e\";\nRawTransaction rawTransaction = RawTransaction.createEtherTransaction(\nnonce,\ngasPrice,\ngasLimit,\nto,\nConvert.toWei(amount, Convert.Unit.ETHER).toBigInteger());\nbyte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, Network.GOERLI.chainId(), signer);\nString hexValue = Numeric.toHexString(signedMessage);\n\nBundleItemType.TxItem txItem =\nnew BundleItemType.TxItem().setTx(hexValue).setCanRevert(true);\n\n// Construct the bundle with bundle hash item and backrun transaction item\nBundleParams bundleParams = new BundleParams().setInclusion(inclusion).setBody(List.of(bundleItem, txItem));\n\n// Send the bundle\nCompletableFuture\u003cSendBundleResponse\u003e res = mevShareClient.sendBundle(bundleParams);\n```\n\n#### Send a bundle with privacy\nBundles that only contain signed transactions can share hints about the transactions in their bundle by setting the privacy parameter\n```java\n// Create a transaction\nCredentials signer = Credentials.create(\"\u003cprivate key\u003e\");\nBigInteger nonce = web3j.ethGetTransactionCount(signer.getAddress(), DefaultBlockParameterName.PENDING)\n.send()\n.getTransactionCount();\nBigInteger gasPrice = web3j.ethGasPrice().send().getGasPrice();\nBigInteger gasLimit = DefaultGasProvider.GAS_LIMIT;\nfinal String to = \"\u003cto address\u003e\";\nfinal String amount = \"\u003cether amount\u003e\";\nRawTransaction rawTransaction = RawTransaction.createEtherTransaction(\nnonce,\ngasPrice,\ngasLimit,\nto,\nConvert.toWei(amount, Convert.Unit.ETHER).toBigInteger());\nbyte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, Network.GOERLI.chainId(), signer);\nString hexValue = Numeric.toHexString(signedMessage);\n\nBundleItemType.TxItem txItem =\nnew BundleItemType.TxItem().setTx(hexValue).setCanRevert(true);\n\n// Set privacy parameter\nHintPreferences hintPreferences = new HintPreferences()\n.setCalldata(true)\n.setContractAddress(true)\n.setFunctionSelector(true)\n.setLogs(true)\n.setTxHash(true);\nList\u003cString\u003e builders = new ArrayList\u003c\u003e();\nbuilders.add(\"flashbots\");\n\nBundlePrivacy bundlePrivacy =\nnew BundlePrivacy().setHints(hintPreferences).setBuilders(builders);\n\n// Construct the bundle with transaction item\nBundleParams bundleParams = new BundleParams()\n.setInclusion(inclusion)\n.setBody(List.of(txItem))\n.setPrivacy(bundlePrivacy);\n\n// Send the bundle\nCompletableFuture\u003cSendBundleResponse\u003e res = MEV_SHARE_CLIENT.sendBundle(bundleParams);\n```\n\n### Simulate bundle\n\n```java\n// Create a transaction\nvar latestBlock = web3j.ethGetBlockByNumber(DefaultBlockParameterName.LATEST, false)\n\t\t.send()\n\t\t.getBlock();\nvar parentBlock = web3j.ethGetBlockByNumber(\n\t\t\t\tDefaultBlockParameter.valueOf(latestBlock.getNumber().subtract(BigInteger.ONE)), false)\n\t\t.send()\n\t\t.getBlock();\n\nInclusion inclusion = new Inclusion()\n\t\t.setBlock(latestBlock.getNumber().subtract(BigInteger.ONE))\n\t\t.setMaxBlock(latestBlock.getNumber().add(BigInteger.valueOf(10)));\n\nCredentials signer = Credentials.create(\"\u003cprivate key\u003e\");\nBigInteger nonce = web3j.ethGetTransactionCount(signer.getAddress(), DefaultBlockParameterName.PENDING)\n\t\t.send()\n\t\t.getTransactionCount();\nfinal String to = \"\u003cto address\u003e\";\nRawTransaction rawTransaction = RawTransaction.createEtherTransaction(\n\t\tnonce,\n\t\tweb3j.ethGasPrice().send().getGasPrice(),\n\t\tDefaultGasProvider.GAS_LIMIT,\n\t\tto,\n\t\tConvert.toWei(\"0\", Convert.Unit.ETHER).toBigInteger());\nbyte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, Network.GOERLI.chainId(), signer);\nString hexValue = Numeric.toHexString(signedMessage);\n\n// Construct the bundle params with transaction item\nBundleItemType.TxItem bundleItem =\n\t\tnew BundleItemType.TxItem().setTx(hexValue).setCanRevert(true);\n\nBundleParams bundleParams = new BundleParams().setInclusion(inclusion).setBody(List.of(bundleItem));\n\n// Create a simbundle options\nSimBundleOptions options = new SimBundleOptions()\n\t\t.setParentBlock(latestBlock.getNumber().subtract(BigInteger.ONE))\n\t\t.setBlockNumber(latestBlock.getNumber())\n\t\t.setTimestamp(parentBlock.getTimestamp().add(BigInteger.valueOf(12)))\n\t\t.setGasLimit(parentBlock.getGasLimit())\n\t\t.setBaseFee(parentBlock.getBaseFeePerGas())\n\t\t.setTimeout(30);\n\n// Simulate the bundle\nCompletableFuture\u003cSimBundleResponse\u003e res = mevShareClient.simBundle(bundleParams, options);\n```\n\n### Send private transaction\n\n```java\n// Create a transaction\nEthBlock.Block latest = web3j.ethGetBlockByNumber(DefaultBlockParameterName.LATEST, false)\n\t\t.send()\n\t\t.getBlock();\n\nBigInteger maxPriorityFeePerGas = BigInteger.valueOf(1_000_000_000L);\n\nCredentials signer = Credentials.create(\"\u003cprivate key\u003e\");\nBigInteger nonce = web3j.ethGetTransactionCount(signer.getAddress(), DefaultBlockParameterName.PENDING)\n\t\t.send()\n\t\t.getTransactionCount();\nfinal String to = \"\u003cto address\u003e\";\n\nRawTransaction rawTransaction = RawTransaction.createTransaction(\n\t\t5L,\n\t\tnonce,\n\t\tlatest.getGasLimit(),\n\t\tto,\n\t\tConvert.toWei(\"0\", Convert.Unit.ETHER).toBigInteger(),\n\t\tNumeric.toHexString(\"\u003cdata\u003e\".getBytes(StandardCharsets.UTF_8)),\n\t\tmaxPriorityFeePerGas,\n\t\tlatest.getBaseFeePerGas().multiply(BigInteger.TWO).add(maxPriorityFeePerGas));\nbyte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, Network.GOERLI.chainId(), signer);\nString signRawTx = Numeric.toHexString(signedMessage);\n\n// Create a private transaction options\nPrivateTxOptions txOptions = new PrivateTxOptions()\n\t\t.setHints(new HintPreferences()\n\t\t\t\t.setCalldata(true)\n\t\t\t\t.setContractAddress(true)\n\t\t\t\t.setFunctionSelector(true)\n\t\t\t\t.setLogs(true));\n\n// Send the private transaction\nCompletableFuture\u003cString\u003e res = mevShareClient.sendPrivateTransaction(signRawTx, txOptions);\n```\n\n## Examples\nFor more examples, you can see [example](https://github.com/optimism-java/mev-share-java/tree/main/example)\n\nExamples can be run with the following commands:\n```shell\n./gradlew execute -PmainClassName=bundle.RpcSendPrivateTx\n\n./gradlew execute -PmainClassName=event.SseHistorical\n```\n\n\u003e Examples require a `.env` file (or that you populate your environment directly with the appropriate variables).\n\n```sh\ncd src/examples\ncp .env.example .env\nvim .env\n```\n\n## Contribution\nTo help mev-share-java grow, follow [Contributing to mev-share-java](CONTRIBUTING.md).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foptimism-java%2Fmev-share-java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foptimism-java%2Fmev-share-java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foptimism-java%2Fmev-share-java/lists"}