import { Bet } from './bet' import { Contract } from './contract' import { CREATOR_FEE, PLATFORM_FEE } from './fees' import { User } from './user' export const getSellBetInfo = ( user: User, bet: Bet, contract: Contract, newBetId: string ) => { const { id: betId, amount, shares, outcome } = bet const { YES: yesPool, NO: noPool } = contract.pool const { YES: yesStart, NO: noStart } = contract.startPool const { YES: yesShares, NO: noShares } = contract.totalShares const { YES: yesBets, NO: noBets } = contract.totalBets const [y, n, s] = [yesPool, noPool, shares] const shareValue = outcome === 'YES' ? // https://www.wolframalpha.com/input/?i=b+%2B+%28b+n%5E2%29%2F%28y+%28-b+%2B+y%29%29+%3D+c+solve+b (n ** 2 + s * y + y ** 2 - Math.sqrt( n ** 4 + (s - y) ** 2 * y ** 2 + 2 * n ** 2 * y * (s + y) )) / (2 * y) : (y ** 2 + s * n + n ** 2 - Math.sqrt( y ** 4 + (s - n) ** 2 * n ** 2 + 2 * y ** 2 * n * (s + n) )) / (2 * n) const startPool = yesStart + noStart const pool = yesPool + noPool - startPool const probBefore = yesPool ** 2 / (yesPool ** 2 + noPool ** 2) const f = pool / (probBefore * yesShares + (1 - probBefore) * noShares) const myPool = outcome === 'YES' ? yesPool - yesStart : noPool - noStart const adjShareValue = Math.min(Math.min(1, f) * shareValue, myPool) const newPool = outcome === 'YES' ? { YES: yesPool - adjShareValue, NO: noPool } : { YES: yesPool, NO: noPool - adjShareValue } const newTotalShares = outcome === 'YES' ? { YES: yesShares - shares, NO: noShares } : { YES: yesShares, NO: noShares - shares } const newTotalBets = outcome === 'YES' ? { YES: yesBets - amount, NO: noBets } : { YES: yesBets, NO: noBets - amount } const probAfter = newPool.YES ** 2 / (newPool.YES ** 2 + newPool.NO ** 2) const creatorFee = CREATOR_FEE * adjShareValue const saleAmount = (1 - CREATOR_FEE - PLATFORM_FEE) * adjShareValue console.log( 'SELL M$', amount, outcome, 'for M$', saleAmount, 'M$/share:', f, 'creator fee: M$', creatorFee ) const newBet: Bet = { id: newBetId, userId: user.id, contractId: contract.id, amount: -adjShareValue, shares: -shares, outcome, probBefore, probAfter, createdTime: Date.now(), sale: { amount: saleAmount, betId, }, } const newBalance = user.balance + saleAmount return { newBet, newPool, newTotalShares, newTotalBets, newBalance, creatorFee, } }