Skip to content

Policies

Automate transaction governance with Tholos policies — spending limits, whitelists, cooldowns, and more.

Policies add automated governance rules to Flex vaults. They enforce constraints on transactions before they can be approved — like spending limits, destination whitelists, and cooldown periods.

When a transaction is created in a Flex vault, it is evaluated against all active policies. Policies can:

  • Block a transaction that violates a rule
  • Require additional approvals beyond the vault threshold
  • Enforce cooldown periods between transactions

Policies are additive — if multiple policies apply to a transaction, all of them must pass.

Set maximum amounts that can be transferred in a single transaction or over a time window:

  • Per-transaction limits
  • Daily/weekly/monthly cumulative limits
  • Limits by token or across all tokens

Restrict transactions to a set of pre-approved destination addresses. Transactions to addresses not on the whitelist are blocked.

Enforce a mandatory waiting period between when a transaction is approved and when it can be signed. This gives team members time to review and flag suspicious activity.

Require a higher number of approvals for transactions that exceed certain thresholds, beyond the vault’s default approval threshold.

Policies follow an approval-based lifecycle:

PENDING → ACTIVE → DEACTIVATED
→ REJECTED
StateDescription
PendingPolicy has been proposed and is awaiting signer approvals
ActivePolicy is enforced on all transactions in the vault
DeactivatedPolicy is temporarily disabled but can be reactivated
RejectedPolicy was rejected by vault signers

An Initiator (or higher role) proposes a new policy. It enters the PENDING state and requires approval from vault signers (same threshold as the vault):

Terminal window
curl -X POST https://api.tholos.app/vault/{vaultId}/policies \
-H "Authorization: Bearer $THOLOS_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Daily spending limit",
"conditions": [...],
"authorizedSigners": [1, 2, 3]
}'

Vault signers approve or reject the policy using an MPC challenge-response flow:

  1. Get challengeGET /policy/{id}/challenge
  2. ApprovePOST /policy/{id}/approve
  3. Or RejectPOST /policy/{id}/reject

Once the threshold number of approvals is met, the policy becomes Active.

Active policies can be edited without downtime. An edit creates a pending proposal while the current policy remains enforced:

  1. Submit editPOST /policy/{id}/edit
  2. Approve edit — signers approve via POST /policy/{id}/edit/{editId}/approve
  3. When the threshold is met, the edit is applied atomically
  • DeactivatePOST /policy/{id}/deactivate (requires Initiator role, then signer approvals)
  • ReactivatePOST /policy/{id}/reactivate (same approval flow)
OperationMethodEndpoint
Get policyGET/policy/{id}
Get approvalsGET/policy/{id}/approvals
Get challengeGET/policy/{id}/challenge
Approve policyPOST/policy/{id}/approve
Reject policyPOST/policy/{id}/reject
Deactivate policyPOST/policy/{id}/deactivate
Reactivate policyPOST/policy/{id}/reactivate
Delete policyDELETE/policy/{id}
Submit editPOST/policy/{id}/edit
Get pending editGET/policy/{id}/edit
Approve editPOST/policy/{id}/edit/{editId}/approve
Reject editPOST/policy/{id}/edit/{editId}/reject
Cancel editDELETE/policy/{id}/edit/{editId}