💰
Megapot
  • Overview
    • About Megapot
    • How to play
    • How to provide liquidity
    • How to refer users
    • Earn as a liquidity provider
    • About the Team
    • Megapoints
  • Deep dive
    • Components
    • System Diagram
    • Smart Contract
    • Provably Fair
  • Developers
    • Start Here
    • React UI Kit (Beta)
      • MegapotProvider
      • Jackpot
      • useJackpot
    • Standalone Integration
      • Getting Started
      • Contract Functions
      • Jackpot Page
      • LP Deposit Page
      • History Page
    • Custom ERC-20 Jackpot
  • Developer Reference
    • Testnet & Mainnet
    • Contract Overview & Functions
    • Megapot API
    • Megapot Examples
      • Refer Tickets
      • Gifting Tickets
    • Brand Kit
  • Appendix
    • VIP Program
    • FAQ
    • About Megapot
  • Terms of Service
  • Privacy Policy
  • Responsible Gaming
Powered by GitBook
On this page
  • General imports
  • Get Ticket Price
  • Get Jackpot Amount
  • Get Time Remaining
  • Get LpsInfo
  • Get FeeBps
  • Get Jackpot Odds
  • Get Users Info
  • Get Ticket Count For Round
  • Get User Token Balance
  • Get Token Allowance
  • Get Lp Pool Status
  • Get Min Lp Deposit
  • Get Last Jackpot Results
  1. Developers
  2. Standalone Integration

Contract Functions

General imports

import { parseAbi, parseAbiItem } from "viem";
import client from "../app/viem-client";
import { BaseJackpotAbi } from "./abi";
import { CONTRACT_ADDRESS, ERC20_TOKEN_ADDRESS } from "./constants";

Get Ticket Price

// Function to get the ticket price
export async function getTicketPrice(): Promise<number | undefined> {
    try {
        const tickePriceWei = (await client.readContract({
            address: CONTRACT_ADDRESS,
            abi: BaseJackpotAbi,
            functionName: 'ticketPrice',
        })) as bigint;
        return Number(tickePriceWei) / 10 ** 6;
    } catch (error) {
        console.error("Error getting ticket price:", error)
        return undefined
    }
}

Get Jackpot Amount

// Function to get the jackpot amount
export async function getJackpotAmount(): Promise<number | undefined> {
    try {
        const lpPoolTotalWei = (await client.readContract({
            address: CONTRACT_ADDRESS,
            abi: BaseJackpotAbi,
            functionName: 'lpPoolTotal',
        })) as bigint;
        const userPoolTotalWei = (await client.readContract({
            address: CONTRACT_ADDRESS,
            abi: BaseJackpotAbi,
            functionName: 'userPoolTotal',
        })) as bigint;
        const jackpotAmount =
            Number(lpPoolTotalWei) > Number(userPoolTotalWei)
                ? Number(lpPoolTotalWei) / 10 ** 6
                : Number(userPoolTotalWei) / 10 ** 6;
        return jackpotAmount;
    } catch (error) {
        console.error("Error getting jackpot amount:", error)
        return undefined
    }
}

Get Time Remaining

// Function to get the time remaining until the jackpot draw
export async function getTimeRemaining(): Promise<number | undefined> {
    try {
        const lastJackpotEndTime = await client.readContract({
            address: CONTRACT_ADDRESS as `0x${string}`,
            abi: BaseJackpotAbi,
            functionName: "lastJackpotEndTime",
        })
        const roundDuration = await client.readContract({
            address: CONTRACT_ADDRESS as `0x${string}`,
            abi: BaseJackpotAbi,
            functionName: "roundDurationInSeconds",
        })
        const nextJackpotStartTime = Number(lastJackpotEndTime) + Number(roundDuration)
        const timeRemaining = nextJackpotStartTime - (Date.now() / 1000)
        return timeRemaining
    } catch (error) {
        console.error("Error getting time remaining:", error)
        return undefined
    }
}

Get LpsInfo

// Get lpsInfo from contract
export async function getLpsInfo(address: `0x${string}`): Promise<[bigint, bigint, bigint, boolean] | undefined> {
    try {
        const lpsInfo = await client.readContract({
            address: CONTRACT_ADDRESS as `0x${string}`,
            abi: BaseJackpotAbi,
            functionName: "lpsInfo",
            args: [address],
        })
        return lpsInfo as [bigint, bigint, bigint, boolean]
    } catch (error) {
        console.error("Error getting lpsInfo:", error)
        return undefined
    }
}

Get FeeBps

// Function to get the feeBps
export async function getFeeBps(): Promise<number | undefined> {
    try {
        const feeBps = await client.readContract({
            address: CONTRACT_ADDRESS as `0x${string}`,
            abi: BaseJackpotAbi,
            functionName: "feeBps",
        })
        return Number(feeBps)
    } catch (error) {
        console.error("Error getting feeBps:", error)
        return undefined
    }
}

Get Jackpot Odds

// Function to get the jackpot odds per ticket
export async function getJackpotOdds(): Promise<number | undefined> {
    try {
        const jackpotSize = await getJackpotAmount();
        const ticketPrice = await getTicketPrice();
        const feeBps = await getFeeBps();

        if (!jackpotSize || !ticketPrice || !feeBps) {
            return undefined;
        }

        const odds = jackpotSize / (ticketPrice * (1 - feeBps / 10000))
        return odds;
    } catch (error) {
        console.error("Error getting jackpot odds:", error)
        return undefined
    }
}

Get Users Info

// Function to get users info
export async function getUsersInfo(address: `0x${string}`): Promise<{
    ticketsPurchasedTotalBps: bigint;
    winningsClaimable: bigint;
    active: boolean;
} | undefined> {
    try {
        const usersInfo = await client.readContract({
            address: CONTRACT_ADDRESS as `0x${string}`,
            abi: BaseJackpotAbi,
            functionName: "usersInfo",
            args: [address],
        })
        const [ticketsPurchasedTotalBps, winningsClaimable, active] = usersInfo as [bigint, bigint, boolean];
        return { ticketsPurchasedTotalBps, winningsClaimable, active };
    } catch (error) {
        console.error("Error getting users info:", error)
        return undefined
    }
}

Get Ticket Count For Round

// Function to get the total tickets a user has purchased this jackpot
export async function getTicketCountForRound(address: `0x${string}`): Promise<number | undefined> {
    try {
        // get the usersInfo and use their ticketsPurchasedTotalBps
        const usersInfo = await getUsersInfo(address);
        const feeBps = await getFeeBps();

        if (!usersInfo || !feeBps) {
            return undefined;
        }

        const { ticketsPurchasedTotalBps } = usersInfo;

        const ticketCount = Number(ticketsPurchasedTotalBps) / 10000 / ((100 - (Number(feeBps) / 100)) / 100);
        return ticketCount;
    } catch (error) {
        console.error("Error getting ticket count for round:", error)
        return undefined
    }
}

Get User Token Balance

// Function to get the token balance of a user
export async function getTokenBalance(address: `0x${string}`): Promise<number | undefined> {
    try {

        const balanceOfAbi = [
            'function balanceOf(address account) returns (uint256)',
        ];
        const balance = await client.readContract({
            address: ERC20_TOKEN_ADDRESS as `0x${string}`,
            abi: parseAbi(balanceOfAbi),
            functionName: "balanceOf",
            args: [address],
        })
        return Number(balance);
    } catch (error) {
        console.error("Error getting token balance:", error)
        return undefined
    }
}

Get Token Allowance

// Function to get the allowance of a users tokens for the jackpot contract
export async function getTokenAllowance(address: `0x${string}`): Promise<number | undefined> {
    try {
        const allowanceAbi = [
            'function allowance(address owner, address spender) returns (uint256)',
        ];
        const allowance = await client.readContract({
            address: ERC20_TOKEN_ADDRESS as `0x${string}`,
            abi: parseAbi(allowanceAbi),
            functionName: "allowance",
            args: [address, CONTRACT_ADDRESS],
        })
        return Number(allowance);
    } catch (error) {
        console.error("Error getting token allowance:", error)
        return undefined
    }
}

Get Lp Pool Status

// Function to get the lp pool status (open or closed)
export async function getLpPoolStatus(): Promise<boolean | undefined> {
    try {
        const lpPoolCap = await client.readContract({
            address: CONTRACT_ADDRESS as `0x${string}`,
            abi: BaseJackpotAbi,
            functionName: "lpPoolCap",
        })
        const lpPoolTotal = await client.readContract({
            address: CONTRACT_ADDRESS as `0x${string}`,
            abi: BaseJackpotAbi,
            functionName: "lpPoolTotal",
        })
        if (lpPoolCap && lpPoolTotal) {
            if (Number(lpPoolTotal) >= Number(lpPoolCap)) {
                return false;
            }
            return true;
        }
        return undefined;
    } catch (error) {
        console.error("Error getting lp pool status:", error)
        return undefined
    }
}

Get Min Lp Deposit

// Function to get the lp minimum deposit amount
export async function getMinLpDeposit(): Promise<number | undefined> {
    try {
        const minLpDeposit = await client.readContract({
            address: CONTRACT_ADDRESS as `0x${string}`,
            abi: BaseJackpotAbi,
            functionName: "minLpDeposit",
        })
        return Number(minLpDeposit);
    } catch (error) {
        console.error("Error getting lp minimum deposit amount:", error)
        return undefined
    }
}

Get Last Jackpot Results

// Function to get the last jackpot results
interface LastJackpotEvent {
    time: number;
    winner: string;
    winningTicket: number;
    winAmount: number;
    ticketsPurchasedTotalBps: number;
}

// Function to get the last jackpot results
export async function getLastJackpotResults(): Promise<LastJackpotEvent | undefined> {
    try {
        const lastBlock = await client.getBlockNumber();
        // Adjust this for your RPC provider limits
        let fromBlock = lastBlock - BigInt(500);

        let lastJackpotRunEvents: any[] = [];
        while (true) {
            lastJackpotRunEvents = await client.getLogs({
                address: CONTRACT_ADDRESS as `0x${string}`,
                event: parseAbiItem('event JackpotRun(uint256 time, address winner, uint256 winningTicket, uint256 winAmount, uint256 ticketsPurchasedTotalBps)'),
                fromBlock: fromBlock,
                toBlock: lastBlock,
            })
            if (lastJackpotRunEvents.length > 0) {
                return {
                    time: Number(lastJackpotRunEvents[0].args.time),
                    winner: lastJackpotRunEvents[0].args.winner as `0x${string}`,
                    winningTicket: Number(lastJackpotRunEvents[0].args.winningTicket),
                    winAmount: Number(lastJackpotRunEvents[0].args.winAmount),
                    ticketsPurchasedTotalBps: Number(lastJackpotRunEvents[0].args.ticketsPurchasedTotalBps),
                }
            }
            // delay 5 seconds to avoid rate limiting
            // Adjust this for your RPC provider limits
            await new Promise(resolve => setTimeout(resolve, 5000));
            // Adjust this for your RPC provider limits
            fromBlock = fromBlock - BigInt(500);
        }
    } catch (error) {
        console.error("Error getting last jackpot results:", error)
        return undefined
    }
}
PreviousGetting StartedNextJackpot Page

Last updated 1 month ago