Tempo
Stablecoin payments on the Tempo blockchain
The Tempo payment method enables payments using TIP-20 stablecoins on the Tempo blockchain. Tempo supports multiple intents—charge for one-time payments and session for pay-as-you-go payment channels—covering everything from simple API access to high-frequency metered billing.
Payments on Tempo
Tempo is purpose-built for the payment patterns MPP enables:
- Instant finality—Transactions settle in ~500ms with deterministic confirmation, no probabilistic waiting
- Sub-cent fees—Transaction costs low enough for micropayments and per-request billing
- Fee sponsorship—Servers can pay gas fees on behalf of clients, removing wallet UX friction entirely
- 2D nonces—Parallel nonce lanes let clients submit payment transactions without blocking other account activity
- Payment lane—Dedicated transaction ordering for payment channel operations, providing reliable channel management UX
- High throughput—Tempo's throughput handles the on-chain settlement and channel management volume that payment sessions generate at scale
Choosing a payment method
| Charge | Session Recommended | |
|---|---|---|
| Pattern | One-time payment per request | Continuous pay-as-you-go |
| Latency overhead | ~500ms (on-chain confirmation) | Near-zero |
| Throughput | One transaction per request | Hundreds of vouchers per second per channel |
| Best for | Single API calls, content access, one-off purchases | LLM APIs, metered services, usage-based billing |
| On-chain cost | Per request (0.001 USD per request) | Amortized across many requests (0.001 USD total) |
| Settlement | Immediate on-chain transaction | Off-chain vouchers, periodic on-chain settlement |
Intents
Fee sponsorship
Tempo supports server-paid transaction fees for both charge and session intents. When enabled, the client signs only the payment authorization and the server covers gas costs. The client doesn't need to hold gas tokens or understand fee mechanics.
Pass a feePayer account to tempo() to enable this:
import { , } from 'mppx/server'
import { } from 'viem/accounts'
const = .({
: [({
: ('0x…'),
})],
})It is also possible to point the feePayer to a fee service that supports the Handler.feePayer endpoint:
import { Mppx, tempo } from 'mppx/server'
const mppx = Mppx.create({
methods: [tempo({
feePayer: 'https://sponsor.example.com',
})],
})