Skip to content

Keys & custody

Sailor operates the Protocol’s three roles. Each maps to a key Sailor handles differently — and the differences are the heart of the safety model.

RoleKeyWhere it livesWho signs with it
OwnerYour wallet (MetaMask, Rabby, …)Your browser wallet — never read by SailorYou, in the browser signing server
Permission SignerSame as owner, or a separate signerYour wallet / signerYou, authorizing mandate operations
Manager (agent)The agent wallet.sail/keys/manager.json, encrypted (geth keystore v3)Sailor, automatically, per dispatch

Owner and permission-signer signatures (creating the SMA, registering or revoking permissions) are deliberate, custody-affecting actions. Sailor routes them through a local signing server — an HTTP + WebSocket daemon that serves a browser UI:

Terminal window
sailor signer start & # the signing daemon
sailor owner connect # connect your wallet in the browser, persist it as owner

The agent (and any coding assistant operating Sailor) never holds the owner key. It pushes signing requests to the signing server; you approve them in the browser; then the agent submits the transactions it’s allowed to. This is why a coding agent can drive setup without ever being trusted with custody.

The manager (agent) key is generated with sailor keys generate and stored encrypted at .sail/keys/manager.json (scrypt + aes-128-ctr). It signs dispatches — and only dispatches. By the signer-separation guarantee, the manager cannot register or revoke permissions and cannot exceed any registered permission’s bounds. Unlock it non-interactively (CI, headless runs) by setting SAIL_PASSPHRASE; never commit it.

Addresses passed to the CLI are normalized to EIP-55 checksum before any on-chain call or state write.

Capital is held in the owner’s Safe. Sailor cannot move it except through a manager dispatch that satisfies a registered permission — and even then the funds move via the Safe’s own module path, not through Sailor. You can sever the agent instantly without touching custody:

Terminal window
sailor session pause # revoke dispatch rights; sailor session resume to restore

Pausing the session blocks every dispatch while leaving the Safe, its balances, and the mandate intact. Rotating the agent key (sailor account rotate-signer) clears the mandate and re-approves it for the new key — see CLI → SMA lifecycle.