Repository navigation
[evm, sdk, simplex, indexer]: EntryPoint v0.9 end to end with userOpHash solver selection - #1375
Merged
Merged
Conversation
5 tasks
royvardhan
marked this pull request as ready for review
October 8, 2026 18:00
Alchemy, the run's RPC provider, does not serve EntryPoint v0.9 as a bundler, so every scenario timed out without a fill. The workflow now passes E2E_BSC_TESTNET_BUNDLER_URL and E2E_POLYGON_AMOY_BUNDLER_URL, and the run requires them instead of defaulting to the RPC URLs.
…ionGas Pimlico simulates an estimate with paymasterPostOpGasLimit at 2,000,000, which SimplexPaymaster refuses with InvalidPostOpGasLimit. estimateBidPreVerificationGas then failed for every sponsored bid, simplex signed the fill estimate's smaller preVerificationGas, and Pimlico rejected the bid on submission as "preVerificationGas is not enough". The estimate now overrides the paymaster's code, as it already does the solver account's, with a stub that accepts every operation with an empty context.
bidValidUntilBlock converted bidValiditySeconds to blocks with viem's Chain.blockTime, or 2 seconds for a chain that declares none. BSC Chapel and Polygon Amoy declare none and BSC declares 0.75s against a real 0.45s, so bids there reverted FillExpired early: after about 142 of 600 configured seconds on Chapel. The block time is now measured over the last 1,000 blocks and reused per chain for 10 minutes. Where the chain declares a figure the faster of the two is used, and unreadable blocks fall back to the declared figure, then to 2 seconds.
Wizdave97
force-pushed
the
roy/entrypoint-v09-end-to-end
branch
from
October 9, 2026 14:18
89c4f2a to
57975ee
Compare
The bid validity conversion re-measured each chain's block time every 10 minutes. A chain's block time only moves at a hard fork, so each configured chain is now measured once in the startup warm-up and the figure is kept until simplex stops. A chain that could not be measured then, or was added later, is measured at its first bid.
The simplex guides and the example config showed Alchemy's RPC endpoint as each chain's bundlerUrl. They now use the Hyperbridge bundler at https://bundler.polytope.technology/<chain>, listed for Ethereum, Base, Arbitrum, Polygon and BNB Chain in a new Bundler section of the configuration page.
The setup wizard and the operator's Chains panel no longer show a bundler field or an Alchemy key prefill. Ethereum, Base, Arbitrum, Polygon and BNB Chain are saved with Hyperbridge's bundler, https://bundler.polytope.technology/<chain>, named in the chain catalog as hyperbridgeBundlerUrl. The Chains panel writes it over a different bundler the config held, keeps the config's bundler for a chain outside the catalog, and will not enable a chain that has neither. simplex init sets it without asking and only asks on chains with none. Both UIs verify RPC endpoints only. bundlerUrl is still required in filler-config.toml and PUT /api/chains, where any bundler serving the chain's EntryPoint is accepted.
Wizdave97
approved these changes
Oct 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Depends on #1371; until it merges, this diff includes its commits. Closes #816, #1367 and #1368. Part of #1363.
Contracts (#816)
SelectSolver(bytes32 commitment, bytes32 userOpHash).SolverAccountpasses its userOpHash toselectduring validation, and the gateway keeps the selection in a transient slot keyed by commitment, userOpHash and session key.fillOrderonly succeeds while EntryPoint v0.9 executes the selected UserOperation (getCurrentUserOpHash). It no longer checksmsg.sender.VERSIONstays 3 with no storage change, so the upgrade has empty init data.selectis now0x81b06069.SDK, simplex, indexer (#1367, #1368)
addresses.EntryPointandgetEntryPointAddressreplace the v0.8 names. Each bid's EntryPoint comes from its signature and must pair with the gateway's selection format, which the SDK reads on chain, so old and upgraded gateways both work.simulateis oneeth_callwith selection turned off through a state override. Bundlers other than Pimlico and Alchemy get rundler's priority fee floor. Breaking:getEntryPointV08Address,signSolverSelectionand the oldSelectOptionsare gone (core 2.4.0).UserOperationEvents and lists the new testnet SolverAccount next to the old one.Testnet
Deployed on Chapel and Amoy: SolverAccount
0x7484C6Ff790b898bf7e6960Ffc82f63330445Dc2, gateway implementation0x38a82f8283a0fAdB763888707aD18fCd34AF719D, and funded paymaster proxies0x9f4a6F1254f27373C2aca5bDd0e48FbA45EA3aeC(Chapel) and0x6085a14078B7d26259145a894140f7C8361e02ae(Amoy). The SDK and indexer testnet config point at them.Before merge, Gargantua sudo must send, for
Evm(97)andEvm(80002):intentsCoprocessor.addPaymasterDeployment(chain, proxy), which registers each paymasterintentsCoprocessor.executeOnGateway(chain, upgradeToAndCall(0x38a82f8283a0fAdB763888707aD18fCd34AF719D, "")), which upgrades the gatewayUntil the gateway upgrade lands, testnet fills with this branch fail, because the new SolverAccount calls the new
select.Mainnet rollout
Validated: Foundry unit and fork tests, including a real v0.9
handleOpsfill, and the SDK, simplex and indexer offline suites. An end-to-end run on an anvil fork of Chapel upgraded the gateway and set the bundler list through the host, ran our rundler, and filled a sponsored v0.9 bid executed by the SDK with userOpHash selection. The indexer picked up its hash, and a bundler off the list was refused.Follow-ups:
Bid.executereports a reverted bundle only as "Receipt not available yet"; older simplex races remain inreconcile's underfunded write andretire.