Metadata
| Field | Value |
|---|---|
| Name | vault.rotateSigner |
| Category | treasury |
| Required scope | treasury:rotate-signer |
| Idempotency key required | no |
Annotations
| Annotation | Value |
|---|---|
| Title | Rotate Vault Signer |
| Read-only | no |
| Destructive | yes |
| Idempotent | no |
| Open-world | no |
| Requires human approval | yes (step-up) |
Input schema
Output schema
Auth
Caller’s grant must include thetreasury:rotate-signer scope. Grants whose scope set is a superset of the required scope are accepted.
Request examples
Response examples
Step-up required (always on first call)Errors
| Code | reason_id | Meaning |
|---|---|---|
-32000 | unauthenticated | Bearer token missing or expired. |
-32001 | unauthorized | Grant does not include treasury:rotate-signer. |
-32003 | step_up_required | Step-up is always required. data.step_up_url contains the biometric approval URL. |
-32602 | step_up_sigil_invalid | Sigil was already redeemed, expired, or minted for a different action (reason mismatch). |
-32602 | invalid_params | new_signer_public_key is empty or malformed. |
-32603 | internal_error | Transient fault. Retry from step 1 (get a fresh sigil). |
Step-up flow
vault.rotateSigner always requires principal step-up. There is no threshold — every rotation, including scheduled ones, requires biometric approval. The sigil is bound to the reason field, so a sigil minted for grant_issue is rejected here.
- Call
vault.rotateSignerwithnew_signer_public_keyandreason. The server always returns-32003. - Redirect the principal to
data.step_up_url(Privy biometric). On success, Glide mints a one-timesigilbound toreason: "rotate_signer". - Re-submit with
step_up_sigil: "<sigil>". The server verifies the sigil’sexpected_reasonmatches"rotate_signer"and that it was not already redeemed. - On success, a multisig proposal is submitted on-chain.
proposal_idcan be tracked in the Actions inbox.new_policy_versionis the post-rotation policy version.