Get started with ZaphWork's escrow protocol in 5 minutes. This guide will walk you through creating your first escrow and settling payments.
solana airdropInstall the required dependencies for your project:
npm install @solana/web3.js @coral-xyz/anchorSet up your connection to Solana devnet and load the program:
import { Connection, PublicKey, Keypair } from '@solana/web3.js';
import { AnchorProvider, Program } from '@coral-xyz/anchor';
// Connect to devnet
const connection = new Connection('https://api.devnet.solana.com', 'confirmed');
// Program ID
const PROGRAM_ID = new PublicKey('3iKABSF5zoQjGPykxUQNxbm7eQADqs8DreuGupggc679');
// Load your wallet (for testing, generate a new one)
const payer = Keypair.generate();
// Create provider
const provider = new AnchorProvider(connection, wallet, {
commitment: 'confirmed',
});Create an escrow with split-based payment distribution:
// Define payment splits (must sum to 10000 basis points = 100%)
const splits = [
{
recipient: workerPublicKey,
bps: 9000, // 90% to worker
},
{
recipient: platformPublicKey,
bps: 1000, // 10% platform fee
},
];
// Create escrow
const escrowId = new BN(Date.now());
const totalAmount = 100_000_000; // 100 USDC (6 decimals)
await program.methods
.createEscrow(escrowId, splits, new BN(totalAmount))
.accounts({
payer: payer.publicKey,
mint: USDC_MINT,
// ... other accounts
})
.signers([payer])
.rpc();
console.log('Escrow created!');Transfer tokens into the escrow vault:
await program.methods
.fundEscrow()
.accounts({
payer: payer.publicKey,
escrow: escrowPDA,
payerTokenAccount: payerTokenAccount,
vault: vaultPDA,
tokenProgram: TOKEN_PROGRAM_ID,
})
.signers([payer])
.rpc();
console.log('Escrow funded!');Distribute funds to all recipients according to the splits:
// Get token accounts for all recipients
const recipientAccounts = [
workerTokenAccount,
platformTokenAccount,
];
await program.methods
.settleEscrow()
.accounts({
authority: payer.publicKey,
escrow: escrowPDA,
vault: vaultPDA,
tokenProgram: TOKEN_PROGRAM_ID,
})
.remainingAccounts(
recipientAccounts.map(account => ({
pubkey: account,
isWritable: true,
isSigner: false,
}))
)
.signers([payer])
.rpc();
console.log('Payment settled!');import { Connection, PublicKey, Keypair } from '@solana/web3.js';
import { Program, AnchorProvider, BN } from '@coral-xyz/anchor';
import { TOKEN_PROGRAM_ID } from '@solana/spl-token';
async function createAndSettleEscrow() {
// Setup
const connection = new Connection('https://api.devnet.solana.com');
const payer = Keypair.generate(); // Load your wallet here
const worker = Keypair.generate();
const PROGRAM_ID = new PublicKey('3iKABSF5zoQjGPykxUQNxbm7eQADqs8DreuGupggc679');
const USDC_MINT = new PublicKey('Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr');
// Define splits
const splits = [
{ recipient: worker.publicKey, bps: 9000 },
{ recipient: platformAddress, bps: 1000 },
];
// Create escrow
const escrowId = new BN(Date.now());
await program.methods
.createEscrow(escrowId, splits, new BN(100_000_000))
.accounts({ /* ... */ })
.rpc();
// Fund escrow
await program.methods
.fundEscrow()
.accounts({ /* ... */ })
.rpc();
// Settle escrow
await program.methods
.settleEscrow()
.accounts({ /* ... */ })
.remainingAccounts(recipientAccounts)
.rpc();
console.log('✅ Escrow created, funded, and settled!');
}
createAndSettleEscrow();