diff --git a/common/calculate-cpmm.ts b/common/calculate-cpmm.ts index a590a4aa..71eed1b0 100644 --- a/common/calculate-cpmm.ts +++ b/common/calculate-cpmm.ts @@ -12,6 +12,23 @@ export function getCpmmProbability( return (p * NO) / ((1 - p) * YES + p * NO) } +export function getCpmmProbabilityAfterBetBeforeFees( + contract: FullContract, + outcome: string, + bet: number +) { + const { pool, p } = contract + const shares = calculateCpmmShares(pool, p, bet, outcome) + const { YES: y, NO: n } = pool + + const [newY, newN] = + outcome === 'YES' + ? [y - shares + bet, n + bet] + : [y + bet, n - shares + bet] + + return getCpmmProbability({ YES: newY, NO: newN }, p) +} + export function getCpmmOutcomeProbabilityAfterBet( contract: FullContract, outcome: string, @@ -46,6 +63,7 @@ export function getCpmmLiquidityFee( outcome: string ) { const p = getCpmmProbability(contract.pool, contract.p) + // const p = getCpmmProbabilityAfterBetBeforeFees(contract, outcome, bet) const betP = outcome === 'YES' ? 1 - p : p const liquidityFee = LIQUIDITY_FEE * betP * bet @@ -65,9 +83,9 @@ export function calculateCpmmSharesAfterFee( outcome: string ) { const { pool, p } = contract - // const { remainingBet } = getCpmmLiquidityFee(contract, bet, outcome) + const { remainingBet } = getCpmmLiquidityFee(contract, bet, outcome) - return calculateCpmmShares(pool, p, bet, outcome) + return calculateCpmmShares(pool, p, remainingBet, outcome) } export function calculateCpmmPurchase( @@ -90,10 +108,16 @@ export function calculateCpmmPurchase( ? [y - shares + remainingBet + fee, n + remainingBet + fee] : [y + remainingBet + fee, n - shares + remainingBet + fee] - const newPool = { YES: newY, NO: newN } - // console.log(getCpmmLiquidity(pool, p), getCpmmLiquidity(newPool, p)) + const postBetPool = { YES: newY, NO: newN } - return { shares, newPool, fees } + const { newPool, liquidity, newP } = addCpmmLiquidity(postBetPool, p, fee) + const prob = getCpmmProbability(postBetPool, p) + const newProb = getCpmmProbability(newPool, newP) + // console.log(shares) + // console.log(fee, liquidity, newP, newPool) + console.log(pool, postBetPool, shares) + + return { shares, newPool, newP, fees } } export function calculateCpmmShareValue( @@ -156,29 +180,27 @@ export function getCpmmLiquidity( return YES ** (1 - p) * NO ** p } -// TODO: use new pricing equation -// export function addCpmmLiquidity( -// contract: FullContract, -// amount: number -// ) { -// const { YES, NO } = contract.pool -// const p = getCpmmProbability({ YES, NO }, contract.p) +export function addCpmmLiquidity( + pool: { [outcome: string]: number }, + p: number, + amount: number +) { + const prob = getCpmmProbability(pool, p) -// const [newYes, newNo] = -// p >= 0.5 -// ? [amount * (1 / p - 1), amount] -// : [amount, amount * (1 / (1 - p) - 1)] + //https://www.wolframalpha.com/input?i=p%28n%2Bb%29%2F%28%281-p%29%28y%2Bb%29%2Bp%28n%2Bb%29%29%3Dq%2C+solve+p + const { YES: y, NO: n } = pool + const numerator = prob * (amount + y) + const denominator = amount - n * (prob - 1) + prob * y + const newP = numerator / denominator -// const betAmount = Math.abs(newYes - newNo) -// const betOutcome = p >= 0.5 ? 'YES' : 'NO' + const newPool = { YES: y + amount, NO: n + amount } -// const poolLiquidity = getCpmmLiquidity({ YES, NO }) -// const newPool = { YES: YES + newYes, NO: NO + newNo } -// const resultingLiquidity = getCpmmLiquidity(newPool) -// const liquidity = resultingLiquidity - poolLiquidity + const oldLiquidity = getCpmmLiquidity(pool, newP) + const newLiquidity = getCpmmLiquidity(newPool, newP) + const liquidity = newLiquidity - oldLiquidity -// return { newPool, liquidity, betAmount, betOutcome } -// } + return { newPool, liquidity, newP } +} // export function removeCpmmLiquidity( // contract: FullContract, diff --git a/common/new-bet.ts b/common/new-bet.ts index c8a580bd..cc99f5c9 100644 --- a/common/new-bet.ts +++ b/common/new-bet.ts @@ -26,7 +26,7 @@ export const getNewBinaryCpmmBetInfo = ( loanAmount: number, newBetId: string ) => { - const { shares, newPool, fees } = calculateCpmmPurchase( + const { shares, newPool, newP, fees } = calculateCpmmPurchase( contract, amount, outcome @@ -36,7 +36,7 @@ export const getNewBinaryCpmmBetInfo = ( const { pool, p } = contract const probBefore = getCpmmProbability(pool, p) - const probAfter = getCpmmProbability(newPool, p) + const probAfter = getCpmmProbability(newPool, newP) const newBet: Bet = { id: newBetId, @@ -52,7 +52,7 @@ export const getNewBinaryCpmmBetInfo = ( createdTime: Date.now(), } - return { newBet, newPool, newBalance, fees } + return { newBet, newPool, newP, newBalance, fees } } export const getNewBinaryDpmBetInfo = ( diff --git a/functions/src/place-bet.ts b/functions/src/place-bet.ts index 8fa21ced..f1d26028 100644 --- a/functions/src/place-bet.ts +++ b/functions/src/place-bet.ts @@ -81,6 +81,7 @@ export const placeBet = functions.runWith({ minInstances: 1 }).https.onCall( newTotalBets, newBalance, fees, + newP, } = outcomeType === 'BINARY' ? mechanism === 'dpm-2' @@ -115,6 +116,7 @@ export const placeBet = functions.runWith({ minInstances: 1 }).https.onCall( contractDoc, removeUndefinedProps({ pool: newPool, + p: newP, totalShares: newTotalShares, totalBets: newTotalBets, collectedFees: addObjects(fees ?? {}, collectedFees ?? {}),