Primer x402 TypeScript SDK v1.1.0
Primer ecosystem toolkit for TypeScript. Use with the official x402 SDK packages.
Breaking changes from v0.x. See deprecated TypeScript docs for the old API.
npm @primersystems/x402
Installation
bash
npm install @primersystems/x402
Peer Dependencies
The SDK requires @x402/core as a peer dependency:
bash
# For Express middleware
npm install @x402/core @x402/express
# For Hono middleware
npm install @x402/core @x402/hono
# For Prism (ERC-20 payments)
npm install viem
Facilitator Client
Create a pre-configured client for the Primer facilitator:
typescript
import { primerFacilitator, PRIMER_FACILITATOR_URL } from '@primersystems/x402';
// Create facilitator client
const facilitator = primerFacilitator();
// Use with official x402 middleware
import { paymentMiddleware } from '@x402/express';
const routes = {
'/api/premium': {
price: '$0.01',
network: 'eip155:8453',
payTo: '0xYourWalletAddress'
}
};
app.use(paymentMiddleware(routes, { facilitator }));
With Hono
typescript
import { Hono } from 'hono';
import { paymentMiddleware } from '@x402/hono';
import { primerFacilitator } from '@primersystems/x402';
const app = new Hono();
const facilitator = primerFacilitator();
const routes = {
'/v1/*': {
price: '$0.001',
network: 'eip155:8453',
payTo: '0xYourWalletAddress'
}
};
app.use('/v1/*', paymentMiddleware(routes, { facilitator }));
API Reference
| Export | Type | Description |
|---|---|---|
primerFacilitator(config?) |
Function | Creates an HTTPFacilitatorClient for x402.primer.systems |
PRIMER_FACILITATOR_URL |
string | "https://x402.primer.systems" |
SKALE Networks
Network constants for SKALE chains:
typescript
import { skaleNetworks, skaleRpcUrls } from '@primersystems/x402';
// Network identifiers (CAIP-2 format)
skaleNetworks.base // "eip155:1187947933"
skaleNetworks.baseSepolia // "eip155:324705682"
// RPC endpoints
skaleRpcUrls.base // "https://skale-base.skalenodes.com/v1/base"
skaleRpcUrls.baseSepolia // "https://base-sepolia-testnet.skalenodes.com/v1/..."
Using SKALE Networks
typescript
import { skaleNetworks } from '@primersystems/x402';
const routes = {
'/api/data': {
price: '$0.001',
network: skaleNetworks.base,
payTo: '0xYourWalletAddress'
}
};
Robinhood Chain
Network constants for Robinhood Chain (Arbitrum Orbit L2):
typescript
import { robinhoodNetworks, robinhoodRpcUrls } from '@primersystems/x402';
// Network identifiers (CAIP-2 format)
robinhoodNetworks.mainnet // "eip155:4663"
robinhoodNetworks.testnet // "eip155:46630"
// RPC endpoints
robinhoodRpcUrls.mainnet // "https://rpc.mainnet.chain.robinhood.com"
robinhoodRpcUrls.testnet // "https://rpc.testnet.chain.robinhood.com"
Using Robinhood Chain
typescript
import { robinhoodNetworks } from '@primersystems/x402';
const routes = {
'/api/data': {
price: '$0.001',
network: robinhoodNetworks.mainnet,
payTo: '0xYourWalletAddress'
}
};
Prism Settlement
Prism enables gasless payments for any ERC-20 token via EIP-712 signatures. Use this for tokens that don't support EIP-3009 (like USDC does).
Creating Payment Payloads
typescript
import {
createPrismPayload,
getPrismNonce,
PRISM_CONTRACT_ADDRESS,
type PrismPaymentParams,
} from '@primersystems/x402';
import { createWalletClient, createPublicClient, http } from 'viem';
import { base } from 'viem/chains';
import { privateKeyToAccount } from 'viem/accounts';
// Set up viem clients
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const publicClient = createPublicClient({ chain: base, transport: http() });
const walletClient = createWalletClient({
account,
chain: base,
transport: http()
});
// Create a signed payment payload
const payload = await createPrismPayload(walletClient, publicClient, {
token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC on Base
to: '0xRecipientAddress',
value: 1000000n, // 1 USDC (6 decimals)
}, 'eip155:8453');
console.log(payload);
// {
// x402Version: 2,
// scheme: "exact",
// network: "eip155:8453",
// payload: {
// signature: "0x...",
// authorization: {
// from: "0x...",
// to: "0x...",
// value: "1000000",
// nonce: "0",
// validAfter: 1234567890,
// validBefore: 1234571490
// }
// }
// }
Prism API Reference
| Export | Description |
|---|---|
createPrismPayload(walletClient, publicClient, params, network) |
Create a signed EIP-712 payment payload |
getPrismNonce(publicClient, user, token) |
Get current nonce for a user/token pair |
PRISM_CONTRACT_ADDRESS |
0x402357ff1e18d42d0f14a5d56d6e1ebd741b3a86 |
PRISM_ABI |
Contract ABI for direct interaction |
ERC20_PAYMENT_TYPES |
EIP-712 type definitions |
PrismPaymentParams
| Field | Type | Required | Description |
|---|---|---|---|
token |
Address | Yes | ERC-20 token contract address |
to |
Address | Yes | Recipient address |
value |
bigint | Yes | Amount in smallest unit (e.g., wei) |
validAfter |
number | No | Unix timestamp (default: now - 60s) |
validBefore |
number | No | Unix timestamp (default: now + 1hr) |
CLI
The CLI provides project scaffolding for Bittensor/Chutes AI proxies:
bash
# Create a new Chutes AI proxy
npx @primersystems/x402 create chutes-proxy my-ai-api
# Navigate and install
cd my-ai-api
npm install
# Edit src/worker.ts to set your wallet address
# Set your Chutes API key
wrangler secret put CHUTES_API_KEY
# Run locally
npm run dev
# Deploy to Cloudflare Workers
npm run deploy
Generated Project Structure
text
my-ai-api/
src/
worker.ts # Hono app with x402 middleware
package.json # Dependencies and scripts
wrangler.toml # Cloudflare Workers config
tsconfig.json
README.md
.gitignore
Default Pricing
The generated proxy includes these endpoints:
| Endpoint | Price |
|---|---|
/v1/chat/completions |
$0.001 |
/v1/completions |
$0.001 |
/v1/embeddings |
$0.0001 |
/v1/images/generations |
$0.01 |