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.
| Server | Signs verdicts | Safe key |
|---|---|---|
| Base | 0x96489eBC8C0ff7FBa482536699B1f78d87f1306d | 0x7ad359D3E76eCbf460156457cbB61f1643149841 |
| Base Sepolia | 0x70aA81eB7ED4b1636b50c88E9B0D0CA3107DeE3f | 0x97d1089DaB43EE469Afd84B0713CdF00FfB08B7d |
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.