Label: complexity: high
Points: 200
Description
There's no mechanism for a payer and creator to escalate a disagreement to a neutral party. This issue adds an optional arbiter address per invoice who can resolve a disputed invoice by forcing release or refund.
Technical Context
Involves types.rs (arbiter: Option<Address> on InvoiceExt), lib.rs — raise_dispute(env, caller, invoice_id) freezes the invoice for arbitration, resolve_dispute(env, arbiter, invoice_id, action: ResolveAction) requires arbiter auth and executes release or refund regardless of normal guards.
Acceptance Criteria
Label: complexity: high
Points: 200
Description
There's no mechanism for a payer and creator to escalate a disagreement to a neutral party. This issue adds an optional
arbiteraddress per invoice who can resolve a disputed invoice by forcing release or refund.Technical Context
Involves
types.rs(arbiter: Option<Address>onInvoiceExt),lib.rs—raise_dispute(env, caller, invoice_id)freezes the invoice for arbitration,resolve_dispute(env, arbiter, invoice_id, action: ResolveAction)requires arbiter auth and executes release or refund regardless of normal guards.Acceptance Criteria
raise_dispute()callable by creator or any payer; sets adisputedflag, blockspay()/release()/refund()resolve_dispute()requires the configured arbiter's auth; clearsdisputedResolveAction::Releasetriggers normal release flow;Refundtriggers normal refund flow"no arbiter set"ifresolve_disputecalled with none configuredcargo clippypasses with zero warnings