Security

What Sayso sees, keeps and never has.

Sayso checks each transaction your agent is about to sign. It never holds your keys or your money. This page puts in one place what it can see, what it keeps, what it cannot stop, and how to tell us about a problem.

At a glance

Three lines to read before you connect a wallet.

Receives
The wallet address, each transaction before signing (to, data, value), the rules the owner signed, and anything the agent’s builder chooses to pass as context. Put no secrets in it.
Keeps
Every decision, in a signed log where each entry links to the one before; the owner’s signed rules; the Telegram chat the owner linked, so that questions can reach them. Log entries are kept for good: they include the rules’ text, the context the agent’s builder passed and the linked chat id (Privacy).
Never has
Any key of yours, or your money. With the SDK your agent signs; with a Safe, Sayso holds one of three keys and can only add its signature.

Outside services see transaction details, never keys: a simulation node (Alchemy), token data services, the decision model (TypeSafe) for unclear cases, and the rule compiler (OpenRouter) for the owner’s rule text, Telegram for the approval messages, Supabase for the dashboard’s copy of the decision log, and Cloudflare, in front of the check server. Details on the privacy page.

Who does what

Sayso checks the transaction. You keep the keys.

Sayso does

Runs the exact transaction on a private copy of Base before it is signed, compares what really leaves and enters the wallet with your rules, signs every verdict and keeps the log.

You control

Your rules: only a new signature from the owner’s wallet replaces them. Shadow or enforce. Turning it off: stop using the wrapped wallet, or remove Sayso from the Safe with your other two keys.

Sayso cannot stop

Anything outside the transaction it was shown: a key stolen and used elsewhere, or an agent server taken over so the SDK is skipped. The Safe cosigner is built to close the second, because the agent’s key alone cannot move the Safe. It also lets through anything your signed rules allow, and it misses some attacks: on the first run of test cases written by someone else, it blocked 33 of 36.

Signatures

Every verdict is signed, and you can check who signed it.

  • Your rules are signed by the owner with their own wallet. The agent can never change them, and nothing the agent says reaches the judge as an instruction.
  • Every verdict is signed for that wallet, that transaction and that chain, with an expiry, and the SDK checks it before signing.
  • Every decision is signed and kept in a log where each entry links to the one before.
  • Sayso’s own keys are held in AWS KMS.

The SDK trusts only these signing addresses, built into it, and refuses a server whose chain is not the wallet’s. You can compare them with GET /health.

ServerSigns verdictsSafe key
Base0x96489eBC8C0ff7FBa482536699B1f78d87f1306d0x7ad359D3E76eCbf460156457cbB61f1643149841
Base Sepolia0x70aA81eB7ED4b1636b50c88E9B0D0CA3107DeE3f0x97d1089DaB43EE469Afd84B0713CdF00FfB08B7d

If something goes wrong

What to do when a key is lost or leaked.

  • The Sayso API key leaks. It can ask checks for that one wallet and read the answers. It cannot change rules, approve, sign or move money. Message @saysoio at once.
  • The agent’s key is stolen. The thief can sign without the SDK. Move the funds to a new wallet and register that one. With a Safe cosigner, the agent’s key alone moves nothing.
  • The owner’s key is lost. The rules in force stay, but nobody can sign new ones for that wallet. Use a new agent wallet with a new owner.
  • Something looks odd. Message @saysoio on X.

Limits of the beta

What is not done yet.

  • Not externally audited yet. Our own reviews are done by separate AI agents, not a security firm. A full outside audit comes after we raise money.
  • The Safe cosigner runs on the Base Sepolia test network today. On Base mainnet it opens first to a few design partners who accept that it is not externally audited.
  • Contracts Sayso cannot read are at best “ask”, never “allow”. For an agent wallet, your rules can name your own contracts and functions; a listed call is then allowed only when the simulation shows nothing at stake.
  • Permits, x402 payments and signed logins are not checked by Sayso’s server yet. In enforce mode they follow your signatures setting.
  • Chain data can be up to 2 minutes old. A transaction that depends on one sent seconds earlier can show as “fails in simulation”.
  • Approvals only on Telegram for now.

Report a vulnerability

Found a problem? Tell us privately.

Message @saysoio on X with what you found and how to reproduce it. Please keep the details private until it is fixed.