From 11730e48a2beb12302eac0f316f398be9c929e20 Mon Sep 17 00:00:00 2001 From: Austin Chen Date: Fri, 18 Mar 2022 00:41:37 -0700 Subject: [PATCH] Revert "Fix free response MKT calculation to use probs from resolutions field, client-side." This reverts commit c12063799f5f25ac2a253a3ec4781d92b043f8d7. --- common/calculate-dpm.ts | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/common/calculate-dpm.ts b/common/calculate-dpm.ts index a4730d14..76b464e5 100644 --- a/common/calculate-dpm.ts +++ b/common/calculate-dpm.ts @@ -1,6 +1,6 @@ import * as _ from 'lodash' import { Bet } from './bet' -import { Binary, DPM, FreeResponse, FullContract } from './contract' +import { Binary, DPM, FullContract } from './contract' import { DPM_FEES } from './fees' export function getDpmProbability(totalShares: { [outcome: string]: number }) { @@ -213,27 +213,24 @@ function calculateMktDpmPayout(contract: FullContract, bet: Bet) { if (contract.outcomeType === 'BINARY') return calculateBinaryMktDpmPayout(contract, bet) - const { totalShares, pool, resolutions } = contract as FullContract< - DPM, - FreeResponse - > - - if (!resolutions) - throw new Error( - 'resolutions required for MKT payout of free response market' - ) + const { totalShares, pool } = contract const totalPool = _.sum(Object.values(pool)) - const probTotal = _.sum(Object.values(resolutions)) + const sharesSquareSum = _.sumBy( + Object.values(totalShares) as number[], + (shares) => shares ** 2 + ) - const weightedShareTotal = _.sumBy(Object.keys(resolutions), (outcome) => { - const prob = resolutions[outcome] / probTotal - return prob * totalShares[outcome] + const weightedShareTotal = _.sumBy(Object.keys(totalShares), (outcome) => { + // Avoid O(n^2) by reusing sharesSquareSum for prob. + const shares = totalShares[outcome] + const prob = shares ** 2 / sharesSquareSum + return prob * shares }) const { outcome, amount, shares } = bet - const betP = (resolutions[outcome] ?? 0) / probTotal + const betP = getDpmOutcomeProbability(totalShares, outcome) const winnings = ((betP * shares) / weightedShareTotal) * totalPool return deductDpmFees(amount, winnings)