ConstOptionalproviderReported?: booleanTrue when the payout rail itself reported the disbursement failed (a verified payoutFailed
webhook). It waives the still-live SUBMITTED refusal: the provider has said it will not
settle this payout, so returning the reserve promptly cannot double-pay. An operator's
manual reverse leaves this unset and stays gated until the payout ages past
maxPayoutAgeMs.
Builds a
reversePayoutoperation: undoes a payout that has not yet disbursed USD. In one transaction it marks the sagaFAILEDand moves the full reserve out ofPAYOUT_RESERVEback to the seller'searnedaccount. It applies to aRESERVEDsaga, or aSUBMITTEDone aged pastmaxPayoutAgeMs— a youngerSUBMITTEDpayout is still in the rail's hands and is refused withSAGA.INVALID_TRANSITION(the verified payout-failed webhook waives that gate viaproviderReported; never set it by hand), as is aSETTLEDpayout, whose USD already left trust. An already-FAILEDsaga returnsduplicatewith no posting, and the guarded state change means two racing attempts can never both return the same reserve. Restricted to anoperatororsystemactor;userIdmust match the saga's own seller, since it names the account the engine locks.