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.