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-reactBasic 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