Keep the wallet boundary small
Separate interface state from signing state, and make the irreversible steps easy to review.
A wallet interface has two very different jobs: helping someone understand a transaction, and authorising that transaction. Treat them as separate parts of the application.
Separate the states
A transaction preview should describe what the user is about to do without needing access to secret material. The signing layer should receive a clearly defined request only after confirmation.
// Illustrative UI model; not a QRL signing API.
type TransactionReview = {
recipient: string;
amountDisplay: string;
feeDisplay: string;
};
type ReviewState =
| { status: 'editing' }
| { status: 'reviewing'; transaction: TransactionReview }
| { status: 'submitted'; transactionHash: string };Keep display formatting separate from the integer amounts used by the underlying protocol. A human-readable amount is not a validated transaction value.
Review before signing
Make the recipient, amount, fee, and network visible at the confirmation step. Changing any of those values should invalidate the previous confirmation.
For QRL v1, XMSS signing also requires careful management of one-time signature state. Use the maintained wallet and cryptography libraries, and follow their guidance rather than inventing a new signing flow.
Follow the implementation
Start with the QRL wallet and QRL source repositories. The separate Zond Web3 Wallet belongs to the Zond ecosystem; do not assume that its integration model is interchangeable with v1.