Complete reference for all program instructions, account structures, and error codes.
3iKABSF5zoQjGPykxUQNxbm7eQADqs8DreuGupggc679Creates a new escrow with split-based payment distribution.
escrow_id: u64 - Unique identifier for this escrowsplits: Vec<Split> - Payment distribution (must sum to 10000 bps)total_amount: u64 - Total amount to escrow (in lamports)payer - Signer, pays for account creationescrow - PDA, will be createdmint - Token mint (e.g., USDC)vault - PDA, token account for holding fundssystem_programtoken_programawait program.methods
.createEscrow(
new BN(escrowId),
splits,
new BN(totalAmount)
)
.accounts({
payer: payer.publicKey,
escrow: escrowPDA,
mint: USDC_MINT,
vault: vaultPDA,
systemProgram: SystemProgram.programId,
tokenProgram: TOKEN_PROGRAM_ID,
})
.signers([payer])
.rpc();Transfers tokens from payer to escrow vault.
payer - Signerescrow - Must existpayer_token_account - Source of fundsvault - Destinationtoken_programMarks escrow as approved for settlement (optional workflow step).
authority - Signer (must be payer or admin)escrow - Will be marked approvedDistributes funds to all recipients according to splits.
authority - Signerescrowvaulttoken_programMust provide token accounts for all recipients in split order:
.remainingAccounts([
{ pubkey: recipient1TokenAccount, isWritable: true, isSigner: false },
{ pubkey: recipient2TokenAccount, isWritable: true, isSigner: false },
// ... one for each split
])pub struct Split {
pub recipient: Pubkey, // Recipient address
pub bps: u16, // Basis points (0-10000)
}pub struct EscrowAccount {
pub payer: Pubkey,
pub escrow_id: u64,
pub mint: Pubkey,
pub vault: Pubkey,
pub splits: Vec<Split>,
pub total_amount: u64,
pub status: EscrowStatus,
pub created_at: i64,
pub funded_at: Option<i64>,
pub approved_at: Option<i64>,
pub settled_at: Option<i64>,
pub deadline: Option<i64>,
pub version: u8,
pub bump: u8,
pub vault_bump: u8,
}pub enum EscrowStatus {
Created, // Just created
Funded, // Tokens transferred to vault
Approved, // Approved for settlement
Settled, // Funds distributed
Cancelled, // Cancelled and refunded
Disputed, // Under dispute
}| Code | Name | Description |
|---|---|---|
| 6000 | InvalidSplits | Splits validation failed |
| 6001 | InvalidAmount | Amount is zero or invalid |
| 6002 | Unauthorized | Caller not authorized |
| 6003 | InvalidStatus | Escrow in wrong status |
| 6004 | DeadlinePassed | Deadline has passed |
MAX_SPLITS: usize = 8 - Maximum recipients per escrowBPS_DENOMINATOR: u16 = 10000 - Basis points denominator (100%)ESCROW_SEED: &[u8] = b"escrow" - PDA seed for escrow accountsVAULT_SEED: &[u8] = b"vault" - PDA seed for vault accountsThe TypeScript SDK provides helper functions for common operations:
import { calculateTaskSplits, calculateJobSplits } from '@/lib/blockchain/split-calculator';
// Calculate splits for 10% fee
const result = calculateTaskSplits(
workerAddress,
platformAddress,
100_000_000, // 100 USDC
partnerAddress, // optional
300 // 3% partner commission (optional)
);
// result.splits - ready to pass to create_escrow
// result.totalAmount - total including fees
// result.breakdown - human-readable amounts