Subscriptions
On-chain recurring payments: authorize once, charge on schedule.
How they work
A subscription records four things on-chain: subscriber, recipient, amount per charge, and interval (minimum 1 day). When a charge is due:
- the recipient can pull it (typical merchant billing), or
- the subscriber can push it (e.g. paying rent proactively)
The first charge is executable immediately after creation. After each charge, the next one unlocks interval seconds later. The contract refuses early charges (SubscriptionNotDue) and charges by anyone other than the two parties (NotSubscriptionParty).
A smart contract cannot run itself on a timer, so today each due charge has to be executed by hand - the recipient pulls or the subscriber pushes with the Charge now button. The contract still enforces the amount and schedule; it just needs one transaction to fire each cycle. Fully automatic billing, where due charges run on their own, arrives with Arc mainnet. See the Mainnet Roadmap for how the keeper works.
Creating one (subscriber)
- Open Subscriptions → New Subscription
- Enter the recipient, the amount per charge, and pick daily / weekly / monthly
- Confirm - this also sets the USDC allowance so future charges don't need extra signatures
Subscriptions settle in USDC today. EURC subscriptions arrive with the mainnet gateway, alongside automatic billing.
Charges pull from your wallet at execution time. If your balance or allowance is too low when a charge is due, the charge fails until topped up - nothing is queued or owed automatically.
Cancelling
Either side can cancel at any time - subscriber (stop paying) or recipient (stop service). Cancellation takes effect immediately; no further charges can execute.
On-chain reference
function createSubscription(
address recipient,
uint256 amount, // per charge, 6 decimals
uint256 interval // seconds, min 86400 (1 day)
) external returns (bytes32 subscriptionId);
function executeSubscription(bytes32 subscriptionId) external returns (bytes32 paymentId);
function cancelSubscription(bytes32 subscriptionId) external;
Every executed charge emits both SubscriptionPaid and a regular PaymentSent, so charges appear in normal payment history and are individually refundable.