Real-world integration examples for different use cases and platforms.
Create an escrow for a freelance project with 90% to freelancer, 10% platform fee.
import { calculateTaskSplits } from '@/lib/blockchain/split-calculator';
import { PublicKey, Keypair } from '@solana/web3.js';
async function createFreelanceEscrow(
client: Keypair,
freelancer: PublicKey,
projectAmount: number
) {
const PLATFORM_ADDRESS = new PublicKey('...');
// Calculate splits (10% platform fee)
const { splits, totalAmount } = calculateTaskSplits(
freelancer,
PLATFORM_ADDRESS,
projectAmount
);
// Create escrow
const escrowId = Date.now();
await program.methods
.createEscrow(
new BN(escrowId),
splits,
new BN(totalAmount)
)
.accounts({
payer: client.publicKey,
// ... other accounts
})
.signers([client])
.rpc();
console.log('Escrow created: ' + escrowId);
console.log('Freelancer receives: ' + (projectAmount / 1e6) + ' USDC');
console.log('Platform fee: ' + ((totalAmount - projectAmount) / 1e6) + ' USDC');
console.log('Client pays: ' + (totalAmount / 1e6) + ' USDC');
return escrowId;
}Full workflow from creation to settlement:
import { Connection, PublicKey, Keypair } from '@solana/web3.js';
import { Program, AnchorProvider, BN } from '@coral-xyz/anchor';
import { getAssociatedTokenAddress, TOKEN_PROGRAM_ID } from '@solana/spl-token';
async function completeEscrowWorkflow() {
// 1. Setup
const connection = new Connection('https://api.devnet.solana.com');
const payer = Keypair.generate();
const worker = Keypair.generate();
const platform = new PublicKey('...');
const PROGRAM_ID = new PublicKey('3iKABSF5zoQjGPykxUQNxbm7eQADqs8DreuGupggc679');
const USDC_MINT = new PublicKey('Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr');
// 2. Calculate splits
const workerAmount = 100_000_000; // 100 USDC
const splits = [
{ recipient: worker.publicKey, bps: 9000 },
{ recipient: platform, bps: 1000 }
];
const totalAmount = 110_000_000; // 110 USDC
// 3. Derive PDAs
const escrowId = new BN(Date.now());
const [escrowPDA] = PublicKey.findProgramAddressSync(
[Buffer.from('escrow'), payer.publicKey.toBuffer(), escrowId.toArrayLike(Buffer, 'le', 8)],
PROGRAM_ID
);
const [vaultPDA] = PublicKey.findProgramAddressSync(
[Buffer.from('vault'), escrowPDA.toBuffer()],
PROGRAM_ID
);
// 4. Create escrow
await program.methods
.createEscrow(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();
console.log('✅ Escrow created');
// 5. Fund escrow
const payerTokenAccount = await getAssociatedTokenAddress(USDC_MINT, payer.publicKey);
await program.methods
.fundEscrow()
.accounts({
payer: payer.publicKey,
escrow: escrowPDA,
payerTokenAccount,
vault: vaultPDA,
tokenProgram: TOKEN_PROGRAM_ID,
})
.signers([payer])
.rpc();
console.log('✅ Escrow funded');
// 6. Approve escrow (optional)
await program.methods
.approveEscrow()
.accounts({
authority: payer.publicKey,
escrow: escrowPDA,
})
.signers([payer])
.rpc();
console.log('✅ Escrow approved');
// 7. Settle escrow
const workerTokenAccount = await getAssociatedTokenAddress(USDC_MINT, worker.publicKey);
const platformTokenAccount = await getAssociatedTokenAddress(USDC_MINT, platform);
await program.methods
.settleEscrow()
.accounts({
authority: payer.publicKey,
escrow: escrowPDA,
vault: vaultPDA,
tokenProgram: TOKEN_PROGRAM_ID,
})
.remainingAccounts([
{ pubkey: workerTokenAccount, isWritable: true, isSigner: false },
{ pubkey: platformTokenAccount, isWritable: true, isSigner: false },
])
.signers([payer])
.rpc();
console.log('✅ Escrow settled');
console.log('Worker received: ' + (workerAmount / 1e6) + ' USDC');
console.log('Platform received: ' + ((totalAmount - workerAmount) / 1e6) + ' USDC');
}