Security
How Tarmac keeps simulation simulated.
Last updated 12 November 2026
Nothing reaches a live network
Every run executes on a deterministic fixture market or on an isolated Anvil fork that runs on a loopback port, starts for one run and stops when it ends. Transactions are never broadcast to Robinhood Chain.
- The upstream Robinhood Chain connection is read-only. Its transport refuses
eth_sendRawTransaction,eth_sendTransaction, every signing method and everyanvil_*,hardhat_*andevm_*method. - The signing transport accepts only the loopback port of the fork spawned for that run and refuses the upstream URL outright.
- Before sending anything, the worker confirms the fork reports chain ID 4663 and identifies as Anvil. A mismatch fails the run with nothing sent.
No user keys, ever
Tarmac never asks for or accepts a seed phrase or private key. Each run gets an ephemeral simulation key generated in the worker’s memory. It is never written to disk, returned by the API, or included in traces or shares. Signing in with Privy does not create a wallet for you; Tarmac never needs one.
Agents are outside the boundary
Agents act only through five typed tools. Every swap request passes the same eleven policy checks — tokens, router, recipient, amount, spend cap, balance, quote match, quote freshness, slippage and an enforced minimum output — regardless of the explanation the agent gives. Third-party agent code runs on its developer’s machine, never on Tarmac’s servers.
Access and sharing
- Runs are private to the browser (or signed-in account) that created them. Anyone else gets the same response as for a run that doesn’t exist.
- External agents use a run credential valid for one run only, stored as a hash. In links it travels in the URL fragment, which browsers do not send to servers.
- Sharing is opt-in. A share link uses a random identifier unrelated to the run ID and serves a sanitized snapshot without ownership data, credentials, private endpoints or key-like text. You can revoke it at any time.
Limits
- Runtime: 60 seconds for demo runs, 10 minutes for external agents.
- 24 tool calls and 3 swap requests per run; 8 tool calls per second.
- 30 new runs per 10 minutes per browser or account; a bounded run queue.
Reporting an issue
If you find a way for a run to reach a live network, read another user’s run, or expose a credential, please report it privately through the project’s GitHub repository rather than in public.