import clsx from 'clsx' import { useState } from 'react' import { Bet } from '../../common/bet' import { getOutcomeProbabilityAfterBet, calculateShares, calculatePayoutAfterCorrectBet, getOutcomeProbability, } from '../../common/calculate' import { getMappedBucket, getNumericBets } from '../../common/calculate-dpm' import { NumericContract } from '../../common/contract' import { formatPercent, formatMoney } from '../../common/util/format' import { useUser } from '../hooks/use-user' import { placeBet } from '../lib/firebase/api-call' import { firebaseLogin, User } from '../lib/firebase/users' import { BucketAmountInput, BuyAmountInput } from './amount-input' import { Col } from './layout/col' import { Row } from './layout/row' import { Spacer } from './layout/spacer' export function NumericBetPanel(props: { contract: NumericContract className?: string }) { const { contract, className } = props const user = useUser() return (
Place your bet
{user === null && ( )} ) } function NumericBuyPanel(props: { contract: NumericContract user: User | null | undefined onBuySuccess?: () => void }) { const { contract, user, onBuySuccess } = props const { min, max } = contract const [bucket, setBucketChoice] = useState(undefined) const bucketChoice = bucket === undefined ? undefined : `${bucket}` const [betAmount, setBetAmount] = useState(undefined) const [valueError, setValueError] = useState() const [error, setError] = useState() const [isSubmitting, setIsSubmitting] = useState(false) const [wasSubmitted, setWasSubmitted] = useState(false) function onBucketChange(newBucket: number | undefined) { setBucketChoice(newBucket) setWasSubmitted(false) } function onBetChange(newAmount: number | undefined) { setWasSubmitted(false) setBetAmount(newAmount) } async function submitBet() { if (!user || !betAmount || bucket === undefined) return const bucketChoice = getMappedBucket(bucket, contract) setError(undefined) setIsSubmitting(true) const result = await placeBet({ amount: betAmount, outcome: bucketChoice, contractId: contract.id, }).then((r) => r.data as any) console.log('placed bet. Result:', result) if (result?.status === 'success') { setIsSubmitting(false) setWasSubmitted(true) setBetAmount(undefined) if (onBuySuccess) onBuySuccess() } else { setError(result?.message || 'Error placing bet') setIsSubmitting(false) } } const betDisabled = isSubmitting || !betAmount || !bucketChoice || error const initialProb = bucketChoice ? getOutcomeProbability(contract, bucketChoice) : 0 const numericBets = bucketChoice && betAmount ? getNumericBets(contract, bucketChoice, betAmount) : [] const outcomeBet = numericBets.find(([choice]) => choice === bucketChoice) const outcomeProb = bucketChoice && outcomeBet ? getOutcomeProbabilityAfterBet(contract, bucketChoice, outcomeBet[1]) : initialProb const shares = bucketChoice ? calculateShares(contract, betAmount ?? 0, bucketChoice) : initialProb const currentPayout = betAmount && bucketChoice ? calculatePayoutAfterCorrectBet(contract, { outcome: bucketChoice, amount: betAmount, shares, } as Bet) : 0 const currentReturn = betAmount && bucketChoice ? (currentPayout - betAmount) / betAmount : 0 const currentReturnPercent = formatPercent(currentReturn) return ( <>
Numeric value
Amount
Probability
{formatPercent(initialProb)}
{formatPercent(outcomeProb)}
Estimated
payout if correct
{formatMoney(currentPayout)} (+{currentReturnPercent})
{user && ( )} {wasSubmitted &&
Bet submitted!
} ) }