Help
10. Mandates
On this page
What is a mandate?
A mandate is a capped permission you sign on-chain. It lets one merchant collect USDC from your wallet, up to a set amount per month, for a set number of months. You stay in control: you can pause or revoke it at any time, and the merchant can never collect more than the cap.
- The menu entry is Mandates ("Caps, merchants, pause or cancel").
- Mandates are paid in USDC.
- Platform note: on iOS, Mandates are coming soon. On the extension, you can create a mandate, revoke one by ID, or Stop all.
"I pay" and "I get paid" (direction icons)
At the top of Mandates, switch between I pay and I get paid.
| Icon | Meaning |
|---|---|
| ↗ arrow up-right (grey) | Outgoing, you pay. You approved a merchant to collect from you. |
| ↙ arrow down-left (green) | Incoming, you get paid. Someone approved you to collect from them. A mandate counts as incoming when the payee is one of your own addresses. |
The detail sheet also says You pay or You get paid.
Tabs, search and filters
- Tabs:
- Requests: waiting for your review
- Active
- Paused
- History: revoked and expired items
- Badges and pills: tab badges show the exact count up to 99, then 99+. Status pills are Review, Active, Paused, Revoked and Expired. New requests that are under 10 minutes old get a New pill.
- Rows: each row reads like "1 USDC / month · 3 months", followed by the merchant name and a short ID, for example "Acme Coffee · #1fa7…47d9".
- Search: "Search merchant, address or ID".
- Filter and sort:
- Sort by Newest, Oldest, Amount: high to low, or Amount: low to high
- Any time or Custom dates
- Minimum and maximum Amount per month
- Rows per page
- Group by merchant
- Then tap Show results. Clear filters resets everything.
- Live updates: with Live updates on, new items appear as "↑ N new · tap to show".
Empty states:
| Tab | What you'll see |
|---|---|
| Requests | No requests waiting: "When a merchant asks you to approve a spending cap, it appears here." |
| Active | No active mandates: "Approved spending caps show up here." |
| Paused | Nothing paused: "Paused mandates can't be charged until you resume them." |
| History | No history yet: "Revoked and expired mandates and requests end up here." |
Review and approve a merchant's request
A merchant usually sends you a link (t.me/PortaWallet_bot?startapp=mr_…) or shows a QR code. Opening it takes you straight to Review request.
If the request doesn't open automatically, open it yourself:
- Go to Mandates, tap ⋯ (More actions), then Paste request link or ID ("Open a merchant's request").
- Paste the link or the request ID into Request link or ID.
- Tap Review request.
The review shows:
- Amount (X USDC / month)
- Duration
- On-chain cap (X USDC per month)
- Payee
"Terms are set by the request and can't be changed."
Your choices:
- Approve: "Then Confirm with your wallet". You'll sign on the Confirm screen.
- Reject: "Nothing is signed".
On Confirm:
- For a request that came from a link, enter your wallet password. You'll be asked: "Enter your wallet password to confirm this request."
- After you confirm, you'll see "Submitted. Statuses update once the network confirms." The merchant is notified when the mandate is approved on-chain.
If a request won't open:
- Can't open · expired or already used. Requests expire 24 hours after the merchant creates them. Ask for a new link.
- Can't open · request not found
- Can't open · sign in again
- Too many tries · wait a minute
- Can't open right now · try again
Create a mandate yourself
Go to ⋯ → New mandate and choose Recurring pay (one merchant, a cap and an expiry). Trading bot is marked Coming later.
- Period: Hourly, Daily or Monthly. The amount label changes to match (Amount / hour, Amount / day or Amount / month (USDC)). See Open questions.
- Amount / month (USDC): a number greater than 0, up to 10,000, with no more than 6 decimals.
- Months: 1–12. The error is "Months must be 1 to 12".
- Payee: a 0x address. It can't be the zero address or the USDC token address.
- The summary ends with "on-chain cap = one month". Tap Continue, then sign on Confirm.
Validation messages:
- "Amount must be greater than 0"
- "Amount too large"
- "Amount must be a plain number with at most 6 decimals"
- "Payee is required"
- "Payee must be 0x + 40 hex"
- "Payee cannot be zero"
- "Payee cannot be the cap token"
Before you can confirm:
- If your wallet doesn't have mandates switched on yet, you'll see Enable mandates. Tap it first, because Confirm stays disabled until you do ("Enable mandates first.").
- If you're asked to switch network first, switch to the network the mandate is on.
Pause or revoke a mandate
Open a mandate from I pay, then tap Pause or revoke.
- Pause: the merchant can't charge you while the mandate is paused. It moves to the Paused tab.
- Revoke: permanently ends the mandate. "Revoking stops future pulls right away." It moves to History.
- Proof: View approval on Etherscan ↗ (Android: View on explorer ↗) opens the on-chain record.
Stop all mandates at once
Go to ⋯ → Stop all… ("Pause every mandate on this wallet at once"). This pauses every mandate on the wallet in one on-chain transaction. "No merchant can charge you until you resume." The network fee is shown before you sign.
- To confirm, press and hold Stop all. If you prefer, type STOP instead.
- If there's nothing to pause, the menu says "Nothing to stop right now".
- To stop just one merchant, open it and choose Pause or revoke instead.
Approve or pause several at once
- Approve in bulk: on I pay › Requests, select up to 5 requests and tap Approve N · sign once. "One signature approves all N. Each merchant can pull at most its own cap per month."
- Pause in bulk: on I pay › Active, select up to 20 mandates and tap Pause N · sign once.
Collect (when you get paid)
If you're the payee on an incoming mandate, you can collect what's due.
- Android: the incoming mandate detail (You get paid) shows Collect amount · Due now, or Next pull in Nd. When nothing is due, the button is disabled and gives a reason:
- "Nothing is due yet"
- "Paused. Nothing is due until this resumes."
- "Nothing is due. This term has ended."
- Platform note: in the Telegram and web apps, collect from the Incoming mandate screen using Fulfill → Collect. The list's detail sheet doesn't have a Collect button yet.
- Limits: you can collect up to the remaining amount ("Amount (USDC)" is capped to what's left).
- Payee address: the payee must be a regular wallet address (EOA). Contract payees can't collect yet.
- Who controls the mandate: only the payer can pause or revoke it.
Usage-based (metered) mandates
Some merchants bill by usage. On review, you'll see "Usage-based billing · Porta settles to this payee." The Confirm screen then shows:
- Billing: Usage-based · you pay only for what you use
- Monthly cap: the most you can be charged per month, and for how many months
- Settles: when your usage reaches a threshold, or every 24 h
- Credit limit: the most unsettled usage allowed. After that, usage pauses until it settles.
- Collected by: Porta billing 0x…· verified
PortaWallet checks that the billing address in the request matches Porta's own settlement address. If it doesn't, you'll see:
This request's billing address doesn't match Porta's. Don't approve it — ask the merchant for a new link.
Other messages:
- "Usage billing isn't available on this network right now. Try again later."
- "This request uses a token Porta can't bill. Ask the merchant for a new link."
- "Couldn't verify the billing address. Check your connection and try again."