What KasWare signs

Exactly what happens when KasWare produces a signature for PolicyVault, and why the wallet's own display matters.

KasWare is the trust anchor for what actually gets signed. Understanding exactly what it does — and does not do — is central to PolicyVault's security model.

Transaction signing

For a spend, an owner operation, or an approval, PolicyVault hands KasWare an unsigned transaction (as a "Safe JSON" structure) and a list of which specific inputs to sign, with the required signature-hash type. KasWare signs exactly those inputs. Critically, KasWare renders its signing popup from the actual transaction bytes it was given — independent of the web page's DOM. A malicious or compromised web page cannot make KasWare display a different recipient, amount, or fee than what is actually about to be signed; KasWare's popup is extension-owned UI, not something the page controls.

This is why reading the wallet popup matters: it is the one place where what you see is guaranteed to be what you're signing, regardless of whether the PolicyVault frontend itself can be trusted at that moment. PolicyVault's own pre-sign review (see Local intent verification) is a second, independent check on top of this — but the wallet's own display is the irreducible anchor.

Approval signing

An external approver is not a transaction input signer in the ordinary sense — the covenant instead checks each approval as a signature over the transaction's committed content. KasWare can produce exactly this kind of signature by signing a specific named input with the appropriate signature-hash type, over the same frozen transaction the spending agent is trying to submit. No generic wallet "message signature" is used or accepted for approvals — a plain message signature would not commit to the exact transaction and would be structurally unusable as covenant approval.

What KasWare never does for PolicyVault

Public key and address handling

Wallet providers return public keys in different wire formats; PolicyVault normalizes whatever a provider returns to the canonical form the covenant requires (or refuses closed if the value can't be safely interpreted — for example, an uncompressed key format is never accepted). You interact with ordinary Kaspa addresses in the PolicyVault UI; the exact cryptographic key representation is derived internally, at one single boundary, using the same authoritative parser Kaspa itself uses.

See also: What wallets and signers do, Covenant enforcement.