MPP payment method plugin for the Abstract blockchain. Enables paid API access via two settlement mechanisms: one-time ERC-3009 charges and ERC-20 payment channel sessions.
npm install @abstract-foundation/mpp mppx viem zodBoth payment methods follow the same HTTP protocol:
- Client requests a resource
- Server responds
402 Payment RequiredwithWWW-Authenticate: Payment method="abstract" - Client signs and retries with
Authorization: Payment <credential> - Server verifies, settles on-chain, responds
200 OKwithPayment-Receipt
The mppx framework handles the 402 negotiation loop. This package implements the Abstract-specific signing and settlement logic on top.
One-time payments. The client signs ERC-3009 TransferWithAuthorization typed data — no transaction from the client side. The server broadcasts transferWithAuthorization() on USDC.e, paying gas (optionally via an Abstract paymaster).
Streaming payments via AbstractStreamChannel.sol. The client opens a channel once (approve + open()), depositing USDC.e into escrow. Each subsequent request exchanges a signed EIP-712 voucher with a cumulative amount. The server accumulates the highest voucher and calls settle() or close() to finalize.
import { Mppx } from 'mppx/server'
import { abstract } from '@abstract-foundation/mpp/server'
import { privateKeyToAccount } from 'viem/accounts'
const mppx = Mppx.create({
methods: [
abstract.charge({
account: privateKeyToAccount(process.env.SERVER_PRIVATE_KEY),
recipient: '0xYourRecipientAddress',
amount: '0.01',
testnet: true,
}),
abstract.session({
account: privateKeyToAccount(process.env.SERVER_PRIVATE_KEY),
recipient: '0xYourRecipientAddress',
amount: '0.001',
suggestedDeposit: '1',
testnet: true,
}),
],
secretKey: process.env.MPP_SECRET_KEY,
})import { abstractCharge, abstractSession } from '@abstract-foundation/mpp/client'
import { privateKeyToAccount } from 'viem/accounts'
const account = privateKeyToAccount('0x...')
const charge = abstractCharge({ account })
const session = abstractSession({ account, deposit: '10' })Both return mppx method objects that plug directly into the mppx client.
| Entry point | Description |
|---|---|
@abstract-foundation/mpp |
All exports (client + server + constants) |
@abstract-foundation/mpp/client |
Client-side charge and session methods |
@abstract-foundation/mpp/server |
Server-side charge and session handlers |
| Testnet (11124) | Mainnet (2741) | |
|---|---|---|
| USDC.e | 0xbd28...008C61 |
0x84A7...987e1 |
| AbstractStreamChannel | 0x2963...0923c |
0x2963...0923c |
The plugin defaults to mainnet. Pass testnet: true on the server or let the server challenge dictate the chain on the client.
Abstract uses ZKsync-native paymasters. Pass paymasterAddress to sponsor gas:
abstract.charge({
account,
recipient: '0x...',
amount: '0.01',
paymasterAddress: '0xYourPaymasterContract',
})Client-side signing supports both EOA and ERC-1271 smart wallets via viem's typed data signing.