Include antes as bets; more calculations
This commit is contained in:
parent
2fccba1e0f
commit
f4cabf17cb
|
@ -1,3 +1,8 @@
|
||||||
|
import { Bet } from './bet'
|
||||||
|
import { getProbability } from './calculate'
|
||||||
|
import { Contract } from './contract'
|
||||||
|
import { User } from './user'
|
||||||
|
|
||||||
export const PHANTOM_ANTE = 200
|
export const PHANTOM_ANTE = 200
|
||||||
|
|
||||||
export const calcStartPool = (initialProbInt: number, ante = 0) => {
|
export const calcStartPool = (initialProbInt: number, ante = 0) => {
|
||||||
|
@ -15,3 +20,39 @@ export const calcStartPool = (initialProbInt: number, ante = 0) => {
|
||||||
|
|
||||||
return { sharesYes, sharesNo, poolYes, poolNo, startYes, startNo }
|
return { sharesYes, sharesNo, poolYes, poolNo, startYes, startNo }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getAnteBets(
|
||||||
|
creator: User,
|
||||||
|
contract: Contract,
|
||||||
|
yesAnteId: string,
|
||||||
|
noAnteId: string
|
||||||
|
) {
|
||||||
|
const p = getProbability(contract.totalShares)
|
||||||
|
const ante = contract.totalBets.YES + contract.totalBets.NO
|
||||||
|
|
||||||
|
const yesBet: Bet = {
|
||||||
|
id: yesAnteId,
|
||||||
|
userId: creator.id,
|
||||||
|
contractId: contract.id,
|
||||||
|
amount: p * ante,
|
||||||
|
shares: Math.sqrt(p) * ante,
|
||||||
|
outcome: 'YES',
|
||||||
|
probBefore: p,
|
||||||
|
probAfter: p,
|
||||||
|
createdTime: Date.now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
const noBet: Bet = {
|
||||||
|
id: noAnteId,
|
||||||
|
userId: creator.id,
|
||||||
|
contractId: contract.id,
|
||||||
|
amount: (1 - p) * ante,
|
||||||
|
shares: Math.sqrt(1 - p) * ante,
|
||||||
|
outcome: 'NO',
|
||||||
|
probBefore: p,
|
||||||
|
probAfter: p,
|
||||||
|
createdTime: Date.now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
return { yesBet, noBet }
|
||||||
|
}
|
||||||
|
|
|
@ -36,6 +36,22 @@ export function calculateShares(
|
||||||
: Math.sqrt(bet ** 2 + noShares ** 2 + c) - noShares
|
: Math.sqrt(bet ** 2 + noShares ** 2 + c) - noShares
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function calculateEstimatedWinnings(
|
||||||
|
totalShares: { YES: number; NO: number },
|
||||||
|
shares: number,
|
||||||
|
betChoice: 'YES' | 'NO'
|
||||||
|
) {
|
||||||
|
const ind = betChoice === 'YES' ? 1 : 0
|
||||||
|
|
||||||
|
const yesShares = totalShares.YES + ind * shares
|
||||||
|
const noShares = totalShares.NO + (1 - ind) * shares
|
||||||
|
|
||||||
|
const estPool = Math.sqrt(yesShares ** 2 + noShares ** 2)
|
||||||
|
const total = ind * yesShares + (1 - ind) * noShares
|
||||||
|
|
||||||
|
return (shares * estPool) / total
|
||||||
|
}
|
||||||
|
|
||||||
export function calculateRawShareValue(
|
export function calculateRawShareValue(
|
||||||
totalShares: { YES: number; NO: number },
|
totalShares: { YES: number; NO: number },
|
||||||
shares: number,
|
shares: number,
|
||||||
|
@ -112,15 +128,35 @@ export function calculateStandardPayout(
|
||||||
if (totalBets[outcome] >= truePool)
|
if (totalBets[outcome] >= truePool)
|
||||||
return (amount / totalBets[outcome]) * truePool
|
return (amount / totalBets[outcome]) * truePool
|
||||||
|
|
||||||
const startShares = startPool.YES + startPool.NO
|
const total = totalShares[outcome] - startPool[outcome] - totalBets[outcome]
|
||||||
const total = totalShares[outcome] - startShares - totalBets[outcome]
|
|
||||||
const winningsPool = truePool - totalBets[outcome]
|
const winningsPool = truePool - totalBets[outcome]
|
||||||
|
|
||||||
return (1 - FEES) * (amount + ((shares - amount) / total) * winningsPool)
|
return (1 - FEES) * (amount + ((shares - amount) / total) * winningsPool)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function calculatePayoutAfterCorrectBet(contract: Contract, bet: Bet) {
|
export function calculatePayoutAfterCorrectBet(contract: Contract, bet: Bet) {
|
||||||
return calculateStandardPayout(contract, bet, bet.outcome)
|
const { totalShares, pool, totalBets } = contract
|
||||||
|
|
||||||
|
const ind = bet.outcome === 'YES' ? 1 : 0
|
||||||
|
const { shares, amount } = bet
|
||||||
|
|
||||||
|
const newContract = {
|
||||||
|
...contract,
|
||||||
|
totalShares: {
|
||||||
|
YES: totalShares.YES + ind * shares,
|
||||||
|
NO: totalShares.NO + (1 - ind) * shares,
|
||||||
|
},
|
||||||
|
pool: {
|
||||||
|
YES: pool.YES + ind * amount,
|
||||||
|
NO: pool.NO + (1 - ind) * amount,
|
||||||
|
},
|
||||||
|
totalBets: {
|
||||||
|
YES: totalBets.YES + ind * amount,
|
||||||
|
NO: totalBets.NO + (1 - ind) * amount,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return calculateStandardPayout(newContract, bet, bet.outcome)
|
||||||
}
|
}
|
||||||
|
|
||||||
function calculateMktPayout(contract: Contract, bet: Bet) {
|
function calculateMktPayout(contract: Contract, bet: Bet) {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { calcStartPool } from './antes'
|
import { calcStartPool } from './antes'
|
||||||
|
|
||||||
import { Contract } from './contract'
|
import { Contract } from './contract'
|
||||||
import { User } from './user'
|
import { User } from './user'
|
||||||
|
|
||||||
|
@ -45,5 +46,3 @@ export function getNewContract(
|
||||||
|
|
||||||
return contract
|
return contract
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAnteBets() {}
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { Contract } from '../../common/contract'
|
||||||
import { slugify } from '../../common/util/slugify'
|
import { slugify } from '../../common/util/slugify'
|
||||||
import { randomString } from '../../common/util/random-string'
|
import { randomString } from '../../common/util/random-string'
|
||||||
import { getNewContract } from '../../common/new-contract'
|
import { getNewContract } from '../../common/new-contract'
|
||||||
|
import { getAnteBets } from '../../common/antes'
|
||||||
|
|
||||||
export const createContract = functions
|
export const createContract = functions
|
||||||
.runWith({ minInstances: 1 })
|
.runWith({ minInstances: 1 })
|
||||||
|
@ -64,6 +65,26 @@ export const createContract = functions
|
||||||
if (ante) await chargeUser(creator.id, ante)
|
if (ante) await chargeUser(creator.id, ante)
|
||||||
|
|
||||||
await contractRef.create(contract)
|
await contractRef.create(contract)
|
||||||
|
|
||||||
|
if (ante) {
|
||||||
|
const yesBetDoc = firestore
|
||||||
|
.collection(`contracts/${contract.id}/bets`)
|
||||||
|
.doc()
|
||||||
|
|
||||||
|
const noBetDoc = firestore
|
||||||
|
.collection(`contracts/${contract.id}/bets`)
|
||||||
|
.doc()
|
||||||
|
|
||||||
|
const { yesBet, noBet } = getAnteBets(
|
||||||
|
creator,
|
||||||
|
contract,
|
||||||
|
yesBetDoc.id,
|
||||||
|
noBetDoc.id
|
||||||
|
)
|
||||||
|
await yesBetDoc.set(yesBet)
|
||||||
|
await noBetDoc.set(noBet)
|
||||||
|
}
|
||||||
|
|
||||||
return { status: 'success', contract }
|
return { status: 'success', contract }
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -18,6 +18,7 @@ import {
|
||||||
calculateShares,
|
calculateShares,
|
||||||
getProbabilityAfterBet,
|
getProbabilityAfterBet,
|
||||||
calculatePayoutAfterCorrectBet,
|
calculatePayoutAfterCorrectBet,
|
||||||
|
calculateEstimatedWinnings,
|
||||||
} from '../../common/calculate'
|
} from '../../common/calculate'
|
||||||
import { firebaseLogin } from '../lib/firebase/users'
|
import { firebaseLogin } from '../lib/firebase/users'
|
||||||
import { OutcomeLabel } from './outcome-label'
|
import { OutcomeLabel } from './outcome-label'
|
||||||
|
@ -84,18 +85,30 @@ export function BetPanel(props: { contract: Contract; className?: string }) {
|
||||||
|
|
||||||
const betDisabled = isSubmitting || !betAmount || error
|
const betDisabled = isSubmitting || !betAmount || error
|
||||||
|
|
||||||
const initialProb = getProbability(contract.pool)
|
const initialProb = getProbability(contract.totalShares)
|
||||||
|
|
||||||
const resultProb = getProbabilityAfterBet(
|
const resultProb = getProbabilityAfterBet(
|
||||||
contract.totalShares,
|
contract.totalShares,
|
||||||
betChoice,
|
betChoice,
|
||||||
betAmount ?? 0
|
betAmount ?? 0
|
||||||
)
|
)
|
||||||
const shares = calculateShares(contract.pool, betAmount ?? 0, betChoice)
|
|
||||||
|
|
||||||
const estimatedWinnings = Math.floor(shares)
|
const shares = calculateShares(
|
||||||
|
contract.totalShares,
|
||||||
|
betAmount ?? 0,
|
||||||
|
betChoice
|
||||||
|
)
|
||||||
|
|
||||||
|
const estimatedWinnings = calculateEstimatedWinnings(
|
||||||
|
contract.totalShares,
|
||||||
|
shares,
|
||||||
|
betChoice
|
||||||
|
)
|
||||||
|
|
||||||
const estimatedReturn = betAmount
|
const estimatedReturn = betAmount
|
||||||
? (estimatedWinnings - betAmount) / betAmount
|
? (estimatedWinnings - betAmount) / betAmount
|
||||||
: 0
|
: 0
|
||||||
|
|
||||||
const estimatedReturnPercent = (estimatedReturn * 100).toFixed() + '%'
|
const estimatedReturnPercent = (estimatedReturn * 100).toFixed() + '%'
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -2,8 +2,8 @@ import { getFirestore } from '@firebase/firestore'
|
||||||
import { initializeApp } from 'firebase/app'
|
import { initializeApp } from 'firebase/app'
|
||||||
|
|
||||||
// TODO: Reenable this when we have a way to set the Firebase db in dev
|
// TODO: Reenable this when we have a way to set the Firebase db in dev
|
||||||
// export const isProd = process.env.NODE_ENV === 'production'
|
export const isProd = process.env.NODE_ENV === 'production'
|
||||||
export const isProd = true
|
// export const isProd = true
|
||||||
|
|
||||||
const firebaseConfig = isProd
|
const firebaseConfig = isProd
|
||||||
? {
|
? {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user