@t402/svm
v2.7.1
Published
t402 Payment Protocol SVM Implementation
Maintainers
Readme
@t402/svm
SVM (Solana Virtual Machine) implementation of the t402 payment protocol using the Exact payment scheme with SPL Token transfers.
Installation
npm install @t402/svmOverview
This package provides three main components for handling t402 payments on Solana:
- Client - For applications that need to make payments (have wallets/signers)
- Facilitator - For payment processors that verify and execute on-chain transactions
- Service - For resource servers that accept payments and build payment requirements
Package Exports
Main Package (@t402/svm)
V2 Protocol Support - Modern t402 protocol with CAIP-2 network identifiers
Client:
ExactSvmClient- V2 client implementation using SPL TokentoClientSvmSigner(keypair)- Converts Solana keypairs to t402 signersClientSvmSigner- TypeScript type for client signersClientSvmConfig- Optional RPC configuration
Facilitator:
ExactSvmFacilitator- V2 facilitator for payment verification and settlementtoFacilitatorSvmSigner(keypair)- Converts Solana keypairs to facilitator signersFacilitatorSvmSigner- TypeScript type for facilitator signersFacilitatorRpcClient- RPC client interface
Service:
ExactEvmServer- V2 service for building payment requirements
Utilities:
- Network validation, asset info lookup, amount formatting, transaction encoding
V1 Package (@t402/svm/v1)
V1 Protocol Support - Legacy t402 protocol with simple network names
Exports:
ExactSvmClientV1- V1 client implementationExactSvmFacilitatorV1- V1 facilitator implementationNETWORKS- Array of all supported V1 network names
Supported V1 Networks:
[
"solana", // Mainnet
"solana-devnet", // Devnet
"solana-testnet" // Testnet
]Client Builder (@t402/svm/client)
Convenience builder for creating fully-configured SVM clients
Exports:
createSvmClient(config)- Creates t402Client with SVM supportSvmClientConfig- Configuration interface
What it does:
- Automatically registers V2 wildcard scheme (
solana:*) - Automatically registers all V1 networks from
NETWORKS - Optionally applies payment policies
- Optionally uses custom payment selector
Example:
import { createSvmClient } from "@t402/svm/client";
import { toClientSvmSigner } from "@t402/svm";
import { createKeyPairSignerFromBytes } from "@solana/kit";
import { base58 } from "@scure/base";
const keypair = await createKeyPairSignerFromBytes(
base58.decode(process.env.SVM_PRIVATE_KEY)
);
const signer = toClientSvmSigner(keypair);
const client = createSvmClient({ signer });
// Ready to use with both V1 and V2!Version Differences
V2 (Main Package)
- Network format: CAIP-2 (
solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp) - Wildcard support: Yes (
solana:*) - Payload structure: Partial (core wraps with metadata)
- Extensions: Full support
- Transaction: Pre-signed by client, completed by facilitator
V1 (V1 Package)
- Network format: Simple names (
solana-devnet) - Wildcard support: No (fixed list)
- Payload structure: Complete
- Extensions: Limited
- Transaction: Pre-signed by client, completed by facilitator
Usage Patterns
1. Using Pre-built Builder (Recommended)
import { createSvmClient } from "@t402/svm/client";
import { wrapFetchWithPayment } from "@t402/fetch";
const client = createSvmClient({ signer: mySvmSigner });
const paidFetch = wrapFetchWithPayment(fetch, client);2. Direct Registration (Full Control)
import { t402Client } from "@t402/core/client";
import { ExactSvmClient } from "@t402/svm";
import { ExactSvmClientV1 } from "@t402/svm/v1";
const client = new t402Client()
.register("solana:*", new ExactSvmClient(signer))
.registerSchemeV1("solana-devnet", new ExactSvmClientV1(signer))
.registerSchemeV1("solana", new ExactSvmClientV1(signer));3. Using Config (Flexible)
import { t402Client } from "@t402/core/client";
import { ExactSvmClient } from "@t402/svm";
const client = t402Client.fromConfig({
schemes: [
{ network: "solana:*", client: new ExactSvmClient(signer) },
{
network: "solana-devnet",
client: new ExactSvmClientV1(signer),
t402Version: 1
}
]
});Supported Networks
V2 Networks (via CAIP-2):
solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp- Mainnet Betasolana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1- Devnetsolana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z- Testnetsolana:*- Wildcard (matches all Solana networks)
V1 Networks (simple names):
solana- Mainnetsolana-devnet- Devnetsolana-testnet- Testnet
Asset Support
Supports SPL Token and Token-2022 program tokens:
- USDC (primary)
- Any SPL token with associated token accounts
- Automatically detects token program (Token vs Token-2022)
Transaction Structure
The exact payment scheme uses SPL Token TransferChecked instruction with:
- Compute budget optimizations (unit limit + price)
- Source/destination ATAs (Associated Token Accounts)
- Partial signing (client signs, facilitator completes and submits)
Development
# Build
pnpm build
# Test
pnpm test
# Integration tests
pnpm test:integration
# Lint & Format
pnpm lint
pnpm formatRelated Packages
@t402/core- Core protocol types and client@t402/fetch- HTTP wrapper with automatic payment handling@t402/evm- EVM implementation@t402/ton- TON implementation@t402/tron- TRON implementation@t402/near- NEAR Protocol implementation@t402/aptos- Aptos implementation@t402/tezos- Tezos implementation@t402/polkadot- Polkadot Asset Hub implementation@t402/stacks- Stacks implementation@t402/cosmos- Cosmos (Noble) implementation
