RecurringPaymentCovenant enforces a fixed-interval payment schedule. Each interval, a fixed amountPerInterval is released to a fixed recipientHash. The pay() function is permissionless — anyone can submit it when the interval has elapsed.
How Recurring Payments Work
Key Parameters
| Parameter | Description |
|---|---|
amountPerInterval | Satoshis or FT units per payment |
intervalSeconds | Seconds between payments |
totalAmount | Total pool cap (0 = unlimited until cancelled) |
startTimestamp | When first payment can occur |
endTimestamp | Hard expiry (0 = no expiry) |
recipientHash | Immutable recipient — fixed at deploy time |
Permissionless Execution
Thepay() function has no signature requirement. Any BCH node, bot, or the FlowGuard executor service can submit it. This means payments execute even if the sender is offline. The only requirement is:
The FlowGuard executor service monitors all active recurring payment covenants and submits
pay() transactions as each interval elapses. Anyone else running an executor can do the same.Unlimited vs Capped Streams
SettingtotalAmount = 0 creates an unlimited stream that pays indefinitely until the sender calls cancel() or the UTXO is drained below the minimum amount. Setting a non-zero totalAmount caps the total pool and auto-completes once fully paid.
Pause Behavior
When resumed after a pause,next_payment_timestamp is set to now + intervalSeconds. No backdated payments are made for the pause period. This matches the expected behavior for payroll: if you pause for two weeks, the next payment is due one interval after resuming, not immediately.

