Murmur

Dark pool for autonomous agents. Private quotes over Gensyn AXL, atomic on-chain settlement.

Murmur

Created At

Open Agents

Project Description

Murmur is a dark pool for autonomous on-chain agents. Agents sign EIP-712 limit orders locally and route them over Gensyn AXL'''s encrypted peer-to-peer mesh — order intent never hits the public mempool. The broker matches mirror-image quotes in memory and hands every match to a KeeperHub workflow, whose Turnkey-managed wallet submits a single atomic settle() on Base. Both legs settle, or neither does. No MEV, no leaked strategy.', 'Murmur is an MEV-resistant dark pool for autonomous agents. Agents sign EIP-712 orders locally and ship them over Gensyn AXL'''s encrypted peer mesh; the broker matches in memory and never broadcasts intent. Matched pairs are handed to a KeeperHub workflow whose Turnkey-managed wallet submits an atomic on-chain settle() — both legs trade or neither does. The matcher itself never holds a settlement key.

How it's Made

The product is one Solidity contract plus a Python codebase split into a broker daemon and an SDK that traders embed.

Smart contract (Foundry, Solidity 0.8.24). DarkPoolSettlement.settle(orderA, sigA, orderB, sigB) is a single atomic swap of two ERC-20 transfers, gated on EIP-712 signatures. We use OpenZeppelin's SignatureChecker so smart-contract agents (Safe / 4337 wallets) work via EIP-1271 with zero extra code. Replay protection is per-(maker, nonce), expiry is enforced on-chain, and orders are bound to a specific broker — a stolen signature can't be replayed against a different venue. 15 Foundry tests cover the happy path, every revert, and EIP-1271 paths.

Broker (Python). An in-memory FIFO order book that matches exact mirror-image quotes — the simplest matching policy that's MEV-correct, since neither side reveals price preference until the cross. A ThreadPoolExecutor runs settlement off the request thread so the MCP handler never blocks. Matching has zero on-chain calls; the contract is the only authority on validity.

Gensyn AXL is the entire transport layer, used in three modes: (1) MCP request/response for the broker's six-tool service (submit_order, cancel_order, get_order_status, subscribe_ioi, unsubscribe_ioi, get_broker_info); (2) send/recv for asynchronous fill notifications and bucketed indication-of-interest fan-out — the broker pushes, traders pop; (3) A2A skill discovery so any agent on the mesh finds the dark-pool tools without darkpool-specific code. None of these are decorative; remove any one and the protocol breaks. To run a multi-process demo on one laptop without forcing every developer to build the Go axl-node, we wrote scripts/axl_bridge.py — ~150 lines of Flask that speaks the exact same HTTP contract as the real AXL daemon (/send, /recv, /mcp/<peer>/<service>, /router/register). Swapping it for a real AXL node is a config change, not a code change.

KeeperHub is the execution layer. When the broker matches, it POSTs the matched pair to a KeeperHub webhook (keeperhub/workflows/settlement-relay.json) instead of submitting settle() itself. KeeperHub's Turnkey-managed wallet handles signing, gas, nonce, retries, and posts a Discord embed on every fill. A second workflow (audit-anchor.json) runs daily, queries Settled events, builds a Merkle root, and anchors the digest on-chain — anyone can verify the broker isn't dropping fills. The broker process never holds a settlement key. A local stand-in (scripts/mock_keeperhub.py) replays the same wire contract for offline development.

SDK + CLI. DarkPoolClient wraps EIP-712 signing, AXL submission, and a background recv listener that dispatches FILL and IOI callbacks. The darkpool agent buy/sell CLI auto-approves the settlement contract on first use — agents bootstrap their own allowance the same way they place an order — so a single command is enough to onboard a fresh wallet.

Notable hacky bits. (1) EIP-712 digest is cross-verified between the Python SDK and the contract on every demo settle (pool.hashOrder(o) == sdk.order_id()) so signature drift is caught at the door. (2) Gas-fee math is tuned for Base Sepolia's sub-gwei base fees (1 gwei priority would trip priority > maxFeePerGas); we scale priority as gas_price/10. (3) The two local stand-ins (AXL bridge, mock KeeperHub) are wire-compatible with the real services, so the live demo is bit-identical to a multi-machine production deployment — only URLs change.

Stack: Foundry + OpenZeppelin (Ownable2Step, SignatureChecker, SafeERC20); Python 3.10 with web3.py, eth-account, flask, httpx, pydantic, click, rich; Gensyn AXL for transport; KeeperHub for execution; deployed on Base Sepolia.

background image mobile

Join the mailing list

Get the latest news and updates