Non-custodial payment splitting protocol for Solana
splits is an early-stage TypeScript project in the AI payments / x402 ecosystem, focused on anchor, payment-split, payment-splitter, smart-contracts. It currently has 7 GitHub stars and 1 forks, and sits alongside related tools like covenant, sati, chaingpt-claude-skill.
Non-custodial payment splitting protocol for Solana. Automatically distribute incoming payments to multiple recipients based on pre-configured percentages.
Program ID: SPL1T3rERcu6P6dyBiG7K8LUr21CssZqDAszwANzNMB
Cascade Splits enables trustless payment distribution on Solana:
Payment → Vault (PDA) → execute_split() → Recipients
execute_split() to distribute funds# Clone repository
git clone https://github.com/cascade-protocol/splits.git
cd splits
# Install dependencies
pnpm install
# Build program
anchor build
# Mollusk unit tests (fast)
cargo test -p cascade-splits
# Anchor integration tests
anchor test
cargo bench -p cascade-splits
Creating a split config requires rent-exempt deposits that are fully refundable when closing:
| Account | Size | Rent |
|---|---|---|
| SplitConfig | 1,832 bytes | 0.0136 SOL |
| Vault ATA | 165 bytes | 0.0020 SOL |
| Total | ~0.0157 SOL |
At $150/SOL ≈ $2.35 (refunded on close_split_config)
| Instruction | CUs | Notes |
|---|---|---|
| execute_split (1 recipient) | ~28,505 | Minimal case |
| execute_split (5 recipients) | ~68,573 | Typical case |
| execute_split (10 recipients) | ~109,000 | High activity |
| create_split_config | 36,590 - 40,024 | Includes vault ATA creation |
| update_split_config | 7,424 - 14,032 | Varies by recipient count |
| close_split_config | ~10,168 | Includes vault ATA closure |
| initialize_protocol | ~8,998 | One-time setup |
Scaling: ~8K CU per recipient (6K Token CPI + 2K overhead). Even 10-recipient splits use only 8% of Solana's 1.4M CU budget.
For comparison: typical DEX swaps use 100,000-400,000+ CUs.
See docs/benchmarks/compute_units.md for full benchmark history and additional scenarios (unclaimed flows, protocol admin ops).
import { createSolanaRpc } from "@solana/kit";
import { executeSplit, isCascadeSplit } from "@cascade-fyi/splits-sdk";
const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
// Check if destination is a split vault
if (await isCascadeSplit(rpc, vault)) {
const result = await executeSplit(rpc, vault, executor);
if (result.ok) {
// Build and send transaction using your preferred method
const tx = buildTransaction([result.instruction], signer);
await sendTransaction(tx);
} else {
console.log(`Cannot execute: ${result.reason}`);
}
}
Note: The core module returns instructions — transaction building is your responsibility, enabling compatibility with any @solana/kit version. For high-level convenience with WebSocket confirmation, use
executeAndConfirmSplitfrom@cascade-fyi/splits-sdk.
import { createSplitsClient } from "@cascade-fyi/splits-sdk";
import { createSolanaRpc, createSolanaRpcSubscriptions, createKeyPairSignerFromBytes } from "@solana/kit";
const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
const rpcSubscriptions = createSolanaRpcSubscriptions("wss://api.mainnet-beta.solana.com");
const signer = await createKeyPairSignerFromBytes(secretKey);
const splits = createSplitsClient({ rpc, rpcSubscriptions, signer });
const result = await splits.ensureSplit({
recipients: [
{ address: "Agent111111111111111111111111111111111111111", share: 90 },
{ address: "Marketplace1111111111111111111111111111111", share: 10 },
],
});
// result.vault is your payment address (use as x402 payTo)
See SDK documentation for complete API reference.
ProtocolConfig (global singleton)
[b"protocol_config"]SplitConfig (per-split)
[b"split_config", authority, mint, unique_id]| Instruction | Authorization | Description |
|---|---|---|
initialize_protocol |
Deployer | One-time protocol setup |
update_protocol_config |
Protocol authority | Update fee wallet |
create_split_config |
Anyone | Create new split |
execute_split |
Anyone | Distribute vault funds |
update_split_config |
Config authority | Update recipients |
close_split_config |
Config authority | Delete config, reclaim rent |
If a recipient's ATA is missing during execution:
execute_split, system attempts to clear unclaimedNo separate claim instruction needed - single interface for all operations.
Cascade Splits integrates seamlessly with x402 payment facilitators:
import { isCascadeSplit, executeSplit } from "@cascade-fyi/splits-sdk";
// In your facilitator's settle handler:
if (await isCascadeSplit(rpc, paymentDestination)) {
// It's a split vault - execute distribution after payment
const result = await executeSplit(rpc, paymentDestination, executor);
if (result.ok) {
// Build and send using your kit version
await sendTransaction([result.instruction], signer);
}
}
Use the splitConfig address (PDA) as your payTo destination — facilitators derive the vault ATA automatically. This makes payTo token-agnostic: same address works for USDC, USDT, or any supported token. The SDK caches detection results for high-volume efficiency.
See specification for complete integration guide.
├── programs/cascade-splits/
│ ├── src/
│ │ ├── instructions/ # Instruction handlers
│ │ ├── state.rs # Account structures
│ │ ├── errors.rs # Error codes
│ │ └── events.rs # Event definitions
│ ├── tests/ # Mollusk unit tests
│ └── benches/ # Compute unit benchmarks
├── packages/splits-sdk/ # TypeScript SDK (Solana)
├── packages/splits-sdk-evm/ # TypeScript SDK (EVM)
├── apps/dashboard/ # Dashboard app
├── apps/docs/ # Documentation site
└── docs/
└── specification.md # Full specification
# Build program
anchor build
# Build SDK
pnpm build
checked_*)Coming soon
Apache License 2.0 - see LICENSE file.
Built by Cascade Labs
The payment rail AI agents use to get paid without human approval. Optimistic settlement on @solana. Jobs auto-finalize after a challenge period, disputed jobs escalate to a bonded arbitrator. One protocol, any agent.
Trust infrastructure for million-agent economies on Solana - identity, reputation, and validation designed for continuous feedback at scale.
154 Web3 MCP tools for Claude Code, custody-free. Plus an agent wallet prompt injection can't drain: per-tx, daily, and on-chain (ERC-4337) spending caps the model can't bypass. EVM + Solana + Tron DEX/DeFi, perps, prediction markets, contract deploy + audit.