Description
The contract lacks explicit validation of which status transitions are permissible, allowing operations to succeed in logically invalid states. A state-machine guard should enforce that transitions only follow the defined flow: Open → PartiallyFunded → Funded → Finalised (with Cancelled and Disputed as side exits).
Technical Context
Add a valid_transition(from: InvoiceStatus, to: InvoiceStatus) -> bool function in contracts/split/src/lib.rs. Call it before every status write using the stored current status. Transition table lives as a match block returning bool. Return InvalidStateTransition { from, to } error (defined in types.rs) on invalid attempts.
Acceptance Criteria
Description
The contract lacks explicit validation of which status transitions are permissible, allowing operations to succeed in logically invalid states. A state-machine guard should enforce that transitions only follow the defined flow:
Open → PartiallyFunded → Funded → Finalised(withCancelledandDisputedas side exits).Technical Context
Add a
valid_transition(from: InvoiceStatus, to: InvoiceStatus) -> boolfunction incontracts/split/src/lib.rs. Call it before every status write using the stored current status. Transition table lives as amatchblock returningbool. ReturnInvalidStateTransition { from, to }error (defined intypes.rs) on invalid attempts.Acceptance Criteria
Finalisedto any other state is rejectedCancelledto any state is rejectedOpen → Fundedwithout passing throughPartiallyFundedis permitted (edge: single contribution)InvalidStateTransitionerror carries bothfromandtostatus values