{
  "platform": "Raffler",
  "chain": "Ethereum Mainnet",
  "chain_id": 1,
  "payment_tokens": {
    "USDT": {
      "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
      "decimals": 6
    },
    "USDC": {
      "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
      "decimals": 6
    },
    "WETH": {
      "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
      "decimals": 18
    },
    "WBTC": {
      "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
      "decimals": 8
    }
  },
  "raffle_status_enum": {
    "0": "ACTIVE",
    "1": "ENDED",
    "2": "WINNER_SELECTED",
    "3": "CLAIMED",
    "4": "REFUNDING",
    "5": "REFUNDED",
    "6": "CANCELLED"
  },
  "raffle_type_enum": {
    "0": "USDT",
    "1": "TOKEN",
    "2": "NFT"
  },
  "function_selectors": {
    "buyTickets": "0xfbde47da",
    "claimPrize": "0xe41d24f5",
    "claimRefund": "0x5b4f4e42",
    "raffleCounter": "0x3751ec20",
    "getRaffleInfo": "0xbc36878e",
    "getUserEntries": "0x8d27d0d5",
    "getPrizeInfo": "0x7f0d757e",
    "paused": "0x5c975abb"
  },
  "bot_api": {
    "base_url": "https://emkxjppedtiluiidqcnd.supabase.co/functions/v1",
    "endpoints": {
      "authenticate": {
        "method": "POST",
        "path": "/bot-auth",
        "auth": "X-API-Key header"
      },
      "get_raffles": {
        "method": "GET",
        "path": "/bot-get-raffles",
        "auth": "X-API-Key header",
        "params": [
          "status",
          "limit",
          "network"
        ]
      },
      "register_approval": {
        "method": "POST",
        "path": "/bot-register-approval",
        "auth": "X-API-Key header"
      },
      "purchase_tickets": {
        "method": "POST",
        "path": "/bot-purchase-tickets",
        "auth": "X-API-Key header + signature"
      },
      "create_raffle": {
        "method": "POST",
        "path": "/bot-create-raffle",
        "auth": "X-API-Key header + signature"
      },
      "contract_info": {
        "method": "GET",
        "path": "/bot-contract-info",
        "auth": "none (public)"
      }
    }
  },
  "v3": {
    "contract": {
      "address": "0x19418B70a4BF0DcC1503164aBA2094A623210ca0",
      "chainId": 1,
      "version": "V3",
      "network": "Ethereum Mainnet"
    },
    "abi": [
      "function owner() view returns (address)",
      "function buyTickets(uint256 raffleId, uint256 quantity)",
      "function claimPrize(uint256 raffleId)",
      "function claimRefund(uint256 raffleId)",
      "function raffleCounter() view returns (uint256)",
      "function getUserEntries(uint256 raffleId, address user) view returns (uint256[])",
      "function getRaffleEntries(uint256 raffleId) view returns (uint256[])",
      "function getParticipants(uint256 raffleId) view returns (address[])",
      "function isEligibleForRefund(uint256 raffleId, address user) view returns (bool)",
      "function getRefundAmount(uint256 raffleId, address user) view returns (uint256)",
      "function hasClaimedRefund(uint256 raffleId, address user) view returns (bool)",
      "function getRaffleInfo(uint256 raffleId) view returns (string name, string description, uint256 ticketPrice, uint256 maxTickets, uint256 ticketsSold, uint256 endTime, uint256 feePercent, address ticketToken, uint8 raffleType, uint8 status, address winner, address creator, bool isUserCreated, bool prizeDeposited)",
      "function accumulatedFees(address token) view returns (uint256)",
      "function paymentTokens(address token) view returns (bool isActive, uint8 decimals, string symbol)",
      "event TicketPurchased(uint256 indexed raffleId, address indexed buyer, uint256 quantity, uint256 totalCost, address paymentToken)",
      "event WinnerSelected(uint256 indexed raffleId, address indexed winner, uint256 winningEntry)",
      "event PrizeClaimed(uint256 indexed raffleId, address indexed winner, uint8 prizeType, uint256 amount)",
      "event RefundProcessed(uint256 indexed raffleId, address indexed user, uint256 amount, address token)"
    ],
    "key_functions": {
      "buy_tickets": {
        "signature": "buyTickets(uint256 raffleId, uint256 quantity)",
        "selector": "0xfbde47da",
        "description": "Purchase raffle tickets. Requires prior USDT approval to the contract address.",
        "params": {
          "raffleId": "On-chain raffle ID (use contract_raffle_id from bot-get-raffles)",
          "quantity": "Number of tickets to purchase"
        }
      },
      "get_raffle_info": {
        "signature": "getRaffleInfo(uint256 raffleId)",
        "selector": "0xbc36878e",
        "description": "Returns full raffle details including status, ticket price, and winner."
      }
    }
  },
  "v4": {
    "contract": {
      "address": "0xD1017671340f0751C827ed3EeB7CdbB2b0732E18",
      "chainId": 1,
      "version": "V4",
      "network": "Ethereum Mainnet"
    },
    "abi": [
      "function owner() view returns (address)",
      "function buyTickets(uint256 raffleId, uint256 quantity)",
      "function claimPrize(uint256 raffleId)",
      "function claimRefund(uint256 raffleId)",
      "function raffleCounter() view returns (uint256)",
      "function getUserEntries(uint256 raffleId, address user) view returns (uint256[])",
      "function getRaffleEntries(uint256 raffleId) view returns (uint256[])",
      "function getParticipants(uint256 raffleId) view returns (address[])",
      "function isEligibleForRefund(uint256 raffleId, address user) view returns (bool)",
      "function getRefundAmount(uint256 raffleId, address user) view returns (uint256)",
      "function hasClaimedRefund(uint256 raffleId, address user) view returns (bool)",
      "function getRaffleInfo(uint256 raffleId) view returns (string name, string description, uint256 ticketPrice, uint256 maxTickets, uint256 ticketsSold, uint256 endTime, uint256 feePercent, address ticketToken, uint8 raffleType, uint8 status, address winner, address creator, bool isUserCreated, bool prizeDeposited)",
      "function accumulatedFees(address token) view returns (uint256)",
      "function paymentTokens(address token) view returns (bool isActive, uint8 decimals, string symbol)",
      "function paused() view returns (bool)",
      "function extendRaffle(uint256 raffleId, uint256 additionalSeconds)",
      "function creatorReclaimPrize(uint256 raffleId)",
      "function adminClaimForWinner(uint256 raffleId)",
      "function getPrizeInfo(uint256 raffleId) view returns (uint8 raffleType, uint256 prizeAmount, address prizeTokenAddress, address prizeNftContract, uint256 prizeNftTokenId, bool prizeDeposited)",
      "function getConfig() view returns (tuple(uint256 minTicketPrice, uint256 maxTicketPrice, uint256 minTickets, uint256 maxTickets, uint256 userMaxFeePercent, uint256 minSellThreshold, bool userRafflesEnabled))",
      "function getAllAccumulatedFees() view returns (address[] memory tokens, uint256[] memory amounts)",
      "event TicketsPurchased(uint256 indexed raffleId, address indexed buyer, uint256 quantity, uint256 totalCost, address paymentToken)",
      "event WinnerDrawCompleted(uint256 indexed raffleId, address indexed winner, uint256 winningEntry)",
      "event WinnerClaimedPrize(uint256 indexed raffleId, address indexed winner, uint8 prizeType, uint256 amount)",
      "event AssetRescued(uint256 indexed raffleId, address indexed recipient, uint8 prizeType, address nftContract, uint256 nftTokenId, uint256 erc20Amount)",
      "event RaffleExtended(uint256 indexed raffleId, uint256 newEndTime, uint256 additionalSeconds)",
      "event PrizeReclaimedByCreator(uint256 indexed raffleId, address indexed creator, uint8 prizeType)",
      "event RefundClaimedByUser(uint256 indexed raffleId, address indexed user, uint256 amount, address token)",
      "event RaffleCancelled(uint256 indexed raffleId, string reason)"
    ],
    "key_functions": {
      "buy_tickets": {
        "signature": "buyTickets(uint256 raffleId, uint256 quantity)",
        "selector": "0xfbde47da",
        "description": "Purchase raffle tickets. Requires prior USDT approval to the contract address.",
        "params": {
          "raffleId": "On-chain raffle ID (use contract_raffle_id from bot-get-raffles)",
          "quantity": "Number of tickets to purchase"
        }
      },
      "get_raffle_info": {
        "signature": "getRaffleInfo(uint256 raffleId)",
        "selector": "0xbc36878e",
        "description": "Returns full raffle details."
      },
      "get_prize_info": {
        "signature": "getPrizeInfo(uint256 raffleId)",
        "selector": "0x7f0d757e",
        "description": "Returns prize details for a raffle (V4 only)."
      }
    },
    "v4_additions": [
      "pause/unpause (contract-wide emergency stop)",
      "extendRaffle (extend end time)",
      "creatorReclaimPrize (creators reclaim from failed raffles)",
      "adminClaimForWinner (admin claims on behalf of winner)",
      "rescueEscrowedAsset (emergency asset extraction)",
      "getPrizeInfo (detailed prize inspection)",
      "getAllAccumulatedFees (multi-token fee summary)"
    ]
  }
}