propose method
Prepare a send from a ZIP-321 payment URI (the §2.4 lossless request token
the host composes via composePaymentUri, or a scanned QR). DETERMINISTIC,
LOCAL: runs the audited note-selection + fee + change over the wallet DB and
returns the numbers the user confirms before signing — no keys, no proofs,
no network, no DB writes, nothing sent. The proposal stays an opaque,
Rust-retained one-shot token; send consumes it by proposalId.
Throws a typed WalletApiError (insufficient funds carrying the figures,
proposal-stale, payment-URI-invalid, network-mismatch, …) the controller
maps to an honest inline fault.
Implementation
@override
Future<SendProposal> propose(String requestUri) async {
proposeCount++;
lastProposeUri = requestUri;
final gate = proposeGate;
if (gate != null) await gate.future;
if (proposeThrows != null) throw proposeThrows!;
return proposeResult ?? sendProposalFixture();
}