burneh
Crypto

Signing that a leaked laptop can't drain.

Keys in an .env file are how treasuries disappear. We put signing behind a policy: hard limits, an allowlist, and an approval quorum, with the key itself living in a KMS or HSM where it can't be read out. Every signature is checked before it's made, and logged after.

Start a build
KMS / HSM signingnon-exportable key2-of-3 quorum

Flip the request to over-limit. The same guard that signs the good one refuses the bad one at the policy stage, before a key is ever touched.

Signing request
Send 5 ETH
to treasury-ops · allowlisted
Per-tx limit5 of 20 ETH
Recipient allowlistedtreasury-ops
Approvals2 of 2 signers
Signed · the key never left the vault
signing pathsigned
Request
Policy
key boundaryHSM
Broadcast
The request clears every check, the signature is produced inside the HSM, and only the signed tx leaves. The key never moves.

Where the key lives decides everything.

A private key in an .env file is one leaked laptop from an empty treasury. In an HSM it can't be read out at all. Switch the store and try to take the key.

private keyin the HSM
•••••••••••••••••••••••••••••••• // sealed in hardware
treasury at risk
412 ETH
safe · the key can't leave the vault

The HSM produces signatures on request but never releases the key material. Reading it out simply isn't an operation the hardware offers.

Policy, written down and enforced.

The rules aren't in someone's head. They're a file you can read, review, and change, and the signer refuses anything that breaks them.

signing-policy.toml
1# signing-policy.toml
2[limits]
3per_tx = "20 ETH"
4daily = "50 ETH"
5
6[recipients]
7mode = "allowlist" # deny by default
8allow = ["treasury-ops", "payroll", "market-ops"]
9
10[approvals]
11quorum = 2 # of 3 signers
12window = "10m"
13
14[keys]
15backend = "kms" # key lives in the HSM
16export = false # can never be read out
Hard limits

No single transaction over 20 ETH, no more than 50 in a day. Enforced before signing.

Deny by default

Only named recipients can receive. A new address is refused until it's added.

Two-of-three

Every signature needs a quorum, collected inside a short window or it expires.

Non-exportable

The key backend is set so the raw key can never leave the vault, not even for you.

Every signature, accounted for.

When money moves, you can say exactly what happened, who approved it, and whether policy allowed it. The log is append-only, so it can't be quietly rewritten after the fact.

timeactionpolicyapproverstx
14:02:11Send 5 ETH → treasury-opspass2/20x7a…c4
13:47:55Send 60 ETH → 0x4c…9a1blocked0/2—
11:19:03Approve USDC → routerpass2/20x1f…9d
09:58:40Send 12 ETH → payrollpass2/20xb3…7e

Signing that a leaked laptop can't drain.

Hard limits, an allowlist, and an approval quorum, with the key itself living in a KMS or HSM where it can't be read out. Every signature checked before it's made, and logged after.