Settle a Bet
Distribute winnings to the winners after resolution.
What You'll Do
Settle a resolved bet and distribute USDC to the winning participants.
Prerequisites
- Bet has been resolved (voting complete)
- Bet status is
Resolved
Settle the Bet
Use the settleBetBatchV2 method to settle wagers in batches:
typescript
import { SDK } from "@solworks/poll-sdk";
// Settle bet in batches (handles many participants efficiently)
const txHash = await sdk.settleBetBatchV2({
bet: betPublicKey,
batchNumber: 0, // Start with batch 0
usersPerBatch: 10, // Process 10 users per batch
signers: [wallet],
});
console.log("Bet batch settled:", txHash);Check Settlement Status
Verify the bet has been settled:
typescript
import { MarketStatus } from "@solworks/poll-sdk";
const bet = await sdk.accounts.betV2.single(betPublicKey);
console.log("Status:", bet.status);
console.log("Distributed At:", new Date(bet.distributedAt.toNumber() * 1000));
if (bet.status === MarketStatus.Distributed) {
console.log("Settlement complete!");
}Settlement Batching
For bets with many participants, settlement happens in batches:
typescript
const bet = await sdk.accounts.betV2.single(betPublicKey);
if (bet.totalBatchesRequired > 1) {
console.log("Total Batches:", bet.totalBatchesRequired);
console.log("Settled Users:", bet.settledUserCount);
// Settle each batch
for (let batch = 0; batch < bet.totalBatchesRequired; batch++) {
await sdk.settleBetBatchV2({
bet: betPublicKey,
batchNumber: batch,
usersPerBatch: 10,
signers: [wallet],
});
console.log(`Batch ${batch + 1} settled`);
}
}Payout Calculation
Winners receive proportional payouts:
typescript
function calculatePayout(
bet: BetAccount,
wager: Wager
): { gross: number; fee: number; net: number } {
const totalPool = bet.totalOiFor.toNumber() + bet.totalOiAgainst.toNumber();
const winningSideTotal =
bet.resolvedOutcome === 1
? bet.totalOiFor.toNumber()
: bet.totalOiAgainst.toNumber();
const wagerAmount = wager.amount.toNumber();
const shareOfPool = (wagerAmount / winningSideTotal) * totalPool;
const feeRate = 0.00; // disabled for now
const fee = shareOfPool * feeRate;
const netPayout = shareOfPool - fee;
return {
gross: shareOfPool / 1e6,
fee: fee / 1e6,
net: netPayout / 1e6,
};
}Check Wager Outcomes
After settlement, check each wager's final status:
typescript
const bet = await sdk.accounts.betV2.single(betPublicKey);
bet.wagers.forEach((wager, i) => {
console.log(`Wager ${i + 1}:`);
console.log(" User:", wager.user.toBase58());
console.log(" Amount:", wager.amount.toNumber() / 1e6, "USDC");
console.log(" Side:", wager.outcome === 1 ? "For" : "Against");
console.log(" Status:", wager.status); // SettledWin or SettledLoss
});State After Settlement
text
Resolved → Distributed
↑
settleBetBatchV2()After settlement:
1. Bet status is Distributed
2. All winning wagers are marked SettledWin
3. All losing wagers are marked SettledLoss
4. USDC has been transferred to winners
5. Protocol fees have been collected
Who Can Settle
- Anyone can call settle after resolution
- Typically automated by a cron job or triggered by UI
- No special permissions required
Error Handling
typescript
try {
await sdk.settleBetBatchV2({
bet: betPublicKey,
batchNumber: 0,
usersPerBatch: 10,
signers: [wallet],
});
} catch (error) {
if (error.message.includes("not resolved")) {
console.log("Bet hasn't been resolved yet");
} else if (error.message.includes("already distributed")) {
console.log("Bet has already been settled");
} else {
throw error;
}
}Complete Flow Recap
text
1. Create Wallet → Generate keypair
2. Fund Wallet → Add SOL + USDC
3. Create User → On-chain account
4. Create Bet → Prediction market
5. Place Wager → Bet on outcome
6. Initiate Vote → Start resolution
7. Cast Vote → Submit your vote
8. Settle Bet → Distribute winnings ✓Congratulations! You've completed the full betting lifecycle. Check out the API Reference for detailed method documentation.