Key Custody

Create a 2-of-3 Safe on EVM (client_multisig)

Changed on

Beta (same rollout flags as self-custody creation; see GET /v1/keys/tss/chains multisig_safe_chains). A Safe v1.4.1 with owners V (the vault's key, generated here and escrowed), D (the device key, wrapped under the customer's passkey) and R (the recovery kit's key), in that order, threshold 2: Safe.setup with no module or signer configuration and the pinned fallback handler. The page generates D and R and proves possession of each: a 65-byte recoverable ECDSA signature (r ‖ s ‖ v, low-S) over sha256("1claw-multisig-pop-v1" ‖ user_id (16 bytes) ‖ chain ‖ 0x00 ‖ role ‖ 0x00 ‖ public key bytes), role device or recovery, chain the EVM chain. The vault records the counterfactual (CREATE2) address, salt keccak256("1claw-multisig-safe-v1" ‖ user_id ‖ safe_id)[0..8] (big-endian, top bit clear); the Safe is deployed with the first send. The page re-derives the address from the three owners and the ids and refuses a mismatch, then wraps D (PUT /v1/keys/{safe_id}/client-share), seals the recovery kit and confirms it (POST /v1/keys/{safe_id}/kit). One Safe per chain per user. Needs a passkey with PRF. Owner only. Audited multisig_safe.created.

post/v1/treasury/multisig-safes

Request

  • Base URL: https://api.1claw.co
  • URL: https://api.1claw.co/v1/treasury/multisig-safes
  • Auth: HTTP bearer

Request body

chain'base' | 'optimism' | 'arbitrum' | 'polygon' | 'ethereum' | 'base-sepolia' | 'sepolia' required
device_public_keystring required

Hex SEC1 public key of D (wrapped under the passkey).

recovery_public_keystring required

Hex SEC1 public key of R (kit only).

device_proofstring required

Hex 65-byte signature by D over its proof-of-possession digest (chain = this EVM chain).

recovery_proofstring required

Hex 65-byte signature by R over its proof-of-possession digest.

Response

The Safe (counterfactual until the first send)

idstring uuid required
chainstring required
chain_idinteger required
safe_addressstring required

Lowercase 0x counterfactual (CREATE2) address.

custody'client_multisig' required
deploy_statusstring required

pending until the first send deploys the Safe and contract code is seen at the address, then deployed.

thresholdinteger required

Always 2.

Changes