VAULT_LOCK
Two-path vault with recovery key and hot key. The recovery key (cold sweep) can sign immediately with no delay. The hot key requires a CSV delay before spending is valid. Combines custody tiering and time-delayed authorization in a single block.
Covenant Non-Invertible| Field | Data Type | Size | Side | Description |
|---|---|---|---|---|
| hot_delay | NUMERIC | 1-4 B | Conditions | Number of blocks the hot key path must wait (passed to CheckSequence as a BIP-68 sequence value, with the same uint32 range guard as CSV). |
| recovery_pubkey | PUBKEY | 32-33 B | Witness | Cold-recovery pubkey (witness PUBKEY at index 0). Must be revealed even if the spend uses the hot key, because both keys are folded into the rung leaf via merkle_pub_key and the leaf reconstruction needs both. |
| hot_pubkey | PUBKEY | 32-33 B | Witness | Hot-spend pubkey (witness PUBKEY at index 1). Always revealed alongside the recovery pubkey. |
| signature | SIGNATURE | 64-65 B | Witness | Single Schnorr signature (size strictly enforced 64-65 B — no SCHEME field, ECDSA/PQ rejected). The evaluator tries it against the recovery key first, then the hot key, and selects the path by which key validates. |
Both pubkeys are revealed in the witness because PubkeyCountForBlock(VAULT_LOCK) = 2 — the rung leaf binds both keys, so spending requires presenting both to satisfy MLSC-proof-level reconstruction. No key fields appear in conditions.
hot_delay). If fewer than 2 PUBKEYs, or SIGNATURE/NUMERIC missing → ERRORhot_delay from the NUMERIC. If undecodable → ERRORhot_delay ∈ [0, 0xFFFFFFFF] — out of range → UNSATISFIED (regression `1a23fa32c8`: silent uint32 truncation). Then call CheckSequence(uint32_t(hot_delay)); fails → UNSATISFIED; passes → SATISFIED| Condition | Result |
|---|---|
| Fewer than 2 PUBKEYs in witness, or SIGNATURE/NUMERIC missing | ERROR |
| SIGNATURE size outside 64-65 B (Schnorr range) | ERROR |
hot_delay NUMERIC undecodable | ERROR |
| Recovery-key sig validates | SATISFIED |
Hot-key sig validates and CheckSequence(hot_delay) passes | SATISFIED |
Hot-key sig validates but hot_delay > 0xFFFFFFFF or negative | UNSATISFIED |
Hot-key sig validates but CheckSequence fails (delay not met) | UNSATISFIED |
| Neither key validates the signature | UNSATISFIED |
{
"type": "VAULT_LOCK",
"inverted": false,
"fields": [
{ "type": "NUMERIC", "value": 144 }
]
}{
"type": "VAULT_LOCK",
"fields": [
{ "type": "PUBKEY", "value": "03aabb... recovery_pubkey ..." },
{ "type": "PUBKEY", "value": "03ccdd... hot_pubkey ..." },
{ "type": "SIGNATURE", "value": "... 64-65 B Schnorr sig ..." }
]
}The witness layout is identical for a recovery-key spend — only the SIGNATURE differs. Both pubkeys must be present so the rung leaf can be reconstructed.
The 144-block delay (~1 day) gives the cold key holder time to detect unauthorized hot key usage and sweep funds using the recovery path before the hot spend confirms.
Vault with 144-block hot delay