Refunds
Any payment you've received can be returned in full - instantly, on-chain, tied to the original payment.
Rules
| Rule | Enforced by |
|---|---|
| Only the recipient can refund | NotRecipient |
| Full amount only | contract design |
| Once per payment | AlreadyRefunded |
| Goes back to the original sender | contract design |
In the app
- Open Refunds - you'll see every payment you've received
- Click Refund next to the payment
- Sign - if you haven't approved the gateway to move your USDC before, you'll get a one-time approval prompt first
The original payment is marked refunded everywhere: your activity, the sender's activity, and any merchant verification query.
On-chain reference
function refund(bytes32 paymentId) external;
// Check refund status
function refunded(bytes32 paymentId) external view returns (bool);
Emits PaymentRefunded(paymentId, amount).
Why full-amount only?
Refund semantics stay unambiguous: a payment is either settled or returned. For partial reimbursements, just send the amount back with a memo referencing the original payment.