Label: complexity: high
Points: 200
Description
There's no way to swap out a recipient after invoice creation (e.g. a recipient's address was compromised) without co-signer oversight for invoices that have one configured. This issue adds a guarded recipient substitution path.
Technical Context
Involves lib.rs — substitute_recipient(env, invoice_id, old_recipient: Address, new_recipient: Address). If co_signers is non-empty, require the same required_signatures threshold of fresh approvals specifically for this substitution (separate signature set from release approvals); if no co-signers configured, allow the creator alone.
Acceptance Criteria
Label: complexity: high
Points: 200
Description
There's no way to swap out a recipient after invoice creation (e.g. a recipient's address was compromised) without co-signer oversight for invoices that have one configured. This issue adds a guarded recipient substitution path.
Technical Context
Involves
lib.rs—substitute_recipient(env, invoice_id, old_recipient: Address, new_recipient: Address). Ifco_signersis non-empty, require the samerequired_signaturesthreshold of fresh approvals specifically for this substitution (separate signature set from release approvals); if no co-signers configured, allow the creator alone.Acceptance Criteria
required_signaturesapprovals distinct from release-approval signaturesamounts/claimed/tokensentries carry over unchanged to the new address"recipient not found"ifold_recipientisn't currently a recipientcargo clippypasses with zero warnings