Agent identities, wallets and recovery
One application supports up to 1,000 instances per authenticated owner. Each getsdid:gora:testnet:<instance_id>, independent configuration/state, a
pinned executable and a separate credit payer.
IDs derive from app ID, authenticated owner and nonce. Retrying the same
nonce/configuration returns the same instance; reusing it with different
configuration fails. Other apps/owners get different IDs. Display names are not identities.
Public DID lookup exposes identity/app/version/owner metadata, not prompts,
configuration or state. This is Gora’s testnet identifier convention, not a
claim of a standards-registered method or independent on-chain anchoring.
Public instance API
Browsers use app-scoped wallet sessions; backends/CLI use private developer
tokens. Body fields cannot impersonate another caller. Create many instances
gradually with stable nonces and respect rate limits; do not launch 1,000 calls at once.
Identity is not spending authority
Base/Solana signers use per-instance/per-chain VM-held keys encrypted at rest
with a separately retained master key. This is managed custody, not
threshold signing, an on-chain user-wallet delegation, or independent key management.
Algorand policy vaults are a separate on-chain implementation.
Never use mainnet funds/keys. RPCs are pinned to Base Sepolia
84532 or the full
Solana devnet genesis; changing an endpoint cannot authorize another network.
Authorize
ReadGET /instances/{id}/signers. For a wallet-owned agent:
POST /instances/{id}/signers/challengewithchainandpolicy.- Verify/show the entire approval; obtain the owner’s wallet signature.
POST /instances/{id}/signerswithchallenge_idandsignature.
consent: true cannot replace that signature. Developer-owned
server agents can explicitly consent with their private developer credential;
that is not a browser workflow.
Policies bind owner, app, DID and executable and specify:
- Expiry of at most 30 days and a lifetime transaction-count budget.
- Fee ceiling and maximum age of newly signed execution, default two minutes.
- Exact targets/programs/account roles and fixed calldata/instruction prefixes.
- Bounded unsigned arguments: ABI
uint256on Base, little-endianu64on Solana. PDA seeds may include the agent’s public key.
Revoke and recover
POST /instances/{id}/signers/revoke with {"chain":"base"} blocks new
autonomous signatures. Pausing the instance also blocks them. Neither cancels
transactions already signed/broadcast, nor returns funds automatically.
Recovery requires separate owner approval and works after pause/revoke/expiry:
- Prepare one exact native/token recovery template, with fixed recipients and
arguments (
minequalsmax). Leave native currency for transaction fees. - Request
/signers/recovery-challengeand sign that recovery permission. - Submit to
/signers/recover. It revokes autonomous signing and queues the recovery; a new signature may be created within 24 hours of approval. - Poll
GET /signers;recovery_requestsexposes status/transaction IDs. Require confirmation and independently check the recipient balance.