Back to Docs

Getting Started

What is Prediction Anime Markets?

Prediction Anime Markets is a decentralized prediction market platform built on Solana where users can bet on outcomes related to their favorite anime series. From plot predictions to award ceremonies, you can put your anime knowledge to the test and earn rewards.

Bet on anime plot outcomes, awards, and more
Built on Solana for lightning-fast transactions
Ultra-low fees (less than $0.01 per transaction)

Prerequisites

  • A Solana wallet (Phantom, Solflare, Backpack, etc.)
  • SOL for transaction fees and betting
  • Node.js 18+ (for SDK development)
  • Basic knowledge of TypeScript/JavaScript

Installation

Terminal
# Using npm
npm install @anime-markets/sdk @solana/web3.js @solana/wallet-adapter-react

# Using yarn
yarn add @anime-markets/sdk @solana/web3.js @solana/wallet-adapter-react

# Using pnpm
pnpm add @anime-markets/sdk @solana/web3.js @solana/wallet-adapter-react

# Using bun
bun add @anime-markets/sdk @solana/web3.js @solana/wallet-adapter-react

Basic Usage

index.ts
import { AnimeMarkets, Market, MarketStatus } from '@anime-markets/sdk';
import { Connection, PublicKey } from '@solana/web3.js';

async function main() {
  // Connect to Phantom wallet
  const phantom = (window as any).solana;
  
  if (!phantom?.isPhantom) {
    throw new Error('Phantom wallet not found');
  }
  
  const response = await phantom.connect();
  console.log('Connected wallet:', response.publicKey.toString());

  // Initialize Solana connection
  const connection = new Connection('https://api.mainnet-beta.solana.com');

  // Initialize the SDK client
  const client = new AnimeMarkets({
    connection,
    wallet: phantom,
    network: 'mainnet-beta', // or 'devnet' for testing
  });

  // Fetch all active markets
  const markets: Market[] = await client.getMarkets({
    status: MarketStatus.ACTIVE,
  });
  
  console.log(`Found ${markets.length} active markets`);

  // Filter by category
  const onePieceMarkets = markets.filter(
    m => m.category === 'One Piece'
  );

  console.log('One Piece Markets:', onePieceMarkets.map(m => m.title));
}

main().catch(console.error);

Placing a Bet

place-bet.ts
import { AnimeMarkets, BetOutcome, MarketStatus } from '@anime-markets/sdk';
import { LAMPORTS_PER_SOL } from '@solana/web3.js';

async function placeBet(client: AnimeMarkets) {
  const marketId = 'luffy-vs-blackbeard';
  const betAmount = 0.5 * LAMPORTS_PER_SOL; // 0.5 SOL in lamports
  const outcome = BetOutcome.YES;

  // Step 1: Fetch and validate market
  const market = await client.getMarket(marketId);
  
  if (market.status !== MarketStatus.ACTIVE) {
    throw new Error(`Market is ${market.status}, cannot place bet`);
  }
  
  if (new Date() > market.endsAt) {
    throw new Error('Market has ended');
  }

  console.log(`Betting ${betAmount / LAMPORTS_PER_SOL} SOL on "${market.title}"`);
  console.log(`Current odds - YES: ${market.yesPercentage}%, NO: ${market.noPercentage}%`);

  // Step 2: Estimate potential payout
  const estimate = await client.estimatePayout({
    marketId,
    amount: betAmount,
    outcome,
  });
  
  console.log(`Estimated payout if you win: ${estimate.payout / LAMPORTS_PER_SOL} SOL`);
  console.log(`Estimated shares: ${estimate.shares}`);

  // Step 3: Place the bet (creates and signs Solana transaction)
  const signature = await client.placeBet({
    marketId,
    amount: betAmount,
    outcome,
    slippage: 0.02, // 2% slippage tolerance
  });

  console.log('Transaction signature:', signature);
  console.log('View on Solscan: https://solscan.io/tx/' + signature);
  
  // Step 4: Confirm transaction
  const confirmation = await client.connection.confirmTransaction(signature);
  
  if (confirmation.value.err) {
    throw new Error('Transaction failed');
  }
  
  console.log('Bet confirmed!');

  // Step 5: Verify bet was recorded
  const myBets = await client.getUserBets(client.wallet.publicKey);
  const newBet = myBets.find(b => b.signature === signature);
  
  if (newBet) {
    console.log('Bet recorded successfully!');
    console.log(`  Shares received: ${newBet.shares}`);
    console.log(`  Outcome: ${newBet.outcome}`);
  }
}

placeBet(client).catch(console.error);

Claiming Winnings

claim-winnings.ts
import { AnimeMarkets, MarketStatus } from '@anime-markets/sdk';
import { LAMPORTS_PER_SOL } from '@solana/web3.js';

async function claimWinnings(client: AnimeMarkets) {
  const userPublicKey = client.wallet.publicKey;
  
  // Get all user bets
  const bets = await client.getUserBets(userPublicKey);
  
  // Find unclaimed winning bets
  const unclaimedWinners = bets.filter(bet => {
    return !bet.claimed && bet.payout && bet.payout > 0;
  });

  if (unclaimedWinners.length === 0) {
    console.log('No winnings to claim');
    return;
  }

  console.log(`Found ${unclaimedWinners.length} unclaimed winning bets`);

  for (const bet of unclaimedWinners) {
    const market = await client.getMarket(bet.marketId);
    
    if (market.status !== MarketStatus.RESOLVED) {
      console.log(`Market ${market.title} not yet resolved`);
      continue;
    }

    console.log(`Claiming ${bet.payout! / LAMPORTS_PER_SOL} SOL from "${market.title}"`);
    
    const signature = await client.claimWinnings(bet.marketId);
    await client.connection.confirmTransaction(signature);
    
    console.log('Claimed successfully!');
    console.log('View on Solscan: https://solscan.io/tx/' + signature);
  }
}

claimWinnings(client).catch(console.error);

Environment Setup

.env.local
# Required
NEXT_PUBLIC_SOLANA_NETWORK=mainnet-beta

# Optional - for higher rate limits
ANIME_MARKETS_API_KEY=your_api_key_here

# Optional - custom RPC endpoint (recommended for production)
NEXT_PUBLIC_SOLANA_RPC_URL=https://your-rpc-provider.com