use new calculations

This commit is contained in:
mantikoros 2022-03-03 00:32:33 -05:00
parent fdea1d5ba6
commit 89f020ffcc
9 changed files with 72 additions and 35 deletions

View File

@ -88,6 +88,14 @@ export function calculateCpmmSale(
return { saleValue, newPool } return { saleValue, newPool }
} }
export function getCpmmProbabilityAfterSale(
contract: FullContract<CPMM, Binary>,
bet: Bet
) {
const { newPool } = calculateCpmmSale(contract, bet)
return getCpmmProbability(newPool)
}
export function calculateFixedPayout( export function calculateFixedPayout(
contract: FullContract<CPMM, Binary>, contract: FullContract<CPMM, Binary>,
bet: Bet, bet: Bet,

View File

@ -3,6 +3,7 @@ import {
calculateCpmmShares, calculateCpmmShares,
getCpmmProbability, getCpmmProbability,
getCpmmProbabilityAfterBet, getCpmmProbabilityAfterBet,
getCpmmProbabilityAfterSale,
} from './calculate-cpmm' } from './calculate-cpmm'
import { import {
calculateDpmPayoutAfterCorrectBet, calculateDpmPayoutAfterCorrectBet,
@ -10,6 +11,7 @@ import {
getDpmOutcomeProbability, getDpmOutcomeProbability,
getDpmProbability, getDpmProbability,
getDpmProbabilityAfterBet, getDpmProbabilityAfterBet,
getDpmProbabilityAfterSale,
} from './calculate-dpm' } from './calculate-dpm'
import { Binary, Contract, CPMM, DPM, FullContract } from './contract' import { Binary, Contract, CPMM, DPM, FullContract } from './contract'
import { FEES } from './fees' import { FEES } from './fees'
@ -20,6 +22,14 @@ export function getProbability(contract: FullContract<DPM | CPMM, Binary>) {
: getDpmProbability(contract.totalShares) : getDpmProbability(contract.totalShares)
} }
export function getInitialProbability(
contract: FullContract<DPM | CPMM, Binary>
) {
return contract.mechanism === 'cpmm-1'
? getCpmmProbability(contract.liquidity[contract.creatorId])
: getDpmProbability(contract.phantomShares ?? contract.totalShares)
}
export function getOutcomeProbability(contract: Contract, outcome: string) { export function getOutcomeProbability(contract: Contract, outcome: string) {
return contract.mechanism === 'cpmm-1' return contract.mechanism === 'cpmm-1'
? getCpmmProbability(contract.pool) ? getCpmmProbability(contract.pool)
@ -56,6 +66,19 @@ export function calculatePayoutAfterCorrectBet(contract: Contract, bet: Bet) {
: calculateDpmPayoutAfterCorrectBet(contract, bet) : calculateDpmPayoutAfterCorrectBet(contract, bet)
} }
export function getProbabilityAfterSale(
contract: Contract,
outcome: string,
shares: number
) {
return contract.mechanism === 'cpmm-1'
? getCpmmProbabilityAfterSale(
contract as FullContract<CPMM, Binary>,
{ shares, outcome } as Bet
)
: getDpmProbabilityAfterSale(contract.totalShares, outcome, shares)
}
export const deductFees = (betAmount: number, winnings: number) => { export const deductFees = (betAmount: number, winnings: number) => {
return winnings > betAmount return winnings > betAmount
? betAmount + (1 - FEES) * (winnings - betAmount) ? betAmount + (1 - FEES) * (winnings - betAmount)

View File

@ -1,14 +1,15 @@
import clsx from 'clsx' import clsx from 'clsx'
import { Fragment, useState } from 'react' import { Fragment, useState } from 'react'
import { Dialog, Transition } from '@headlessui/react' import { Dialog, Transition } from '@headlessui/react'
import { Contract } from '../lib/firebase/contracts'
import { BetPanel } from './bet-panel' import { BetPanel } from './bet-panel'
import { Row } from './layout/row' import { Row } from './layout/row'
import { YesNoSelector } from './yes-no-selector' import { YesNoSelector } from './yes-no-selector'
import { Binary, CPMM, DPM, FullContract } from '../../common/contract'
// Inline version of a bet panel. Opens BetPanel in a new modal. // Inline version of a bet panel. Opens BetPanel in a new modal.
export default function BetRow(props: { export default function BetRow(props: {
contract: Contract contract: FullContract<DPM | CPMM, Binary>
className?: string className?: string
labelClassName?: string labelClassName?: string
}) { }) {

View File

@ -25,9 +25,6 @@ import { UserLink } from './user-page'
import { import {
calculateDpmPayout, calculateDpmPayout,
calculateDpmSaleAmount, calculateDpmSaleAmount,
getDpmOutcomeProbability,
getDpmProbability,
getDpmProbabilityAfterSale,
resolvedDpmPayout, resolvedDpmPayout,
} from '../../common/calculate-dpm' } from '../../common/calculate-dpm'
import { sellBet } from '../lib/firebase/api-call' import { sellBet } from '../lib/firebase/api-call'
@ -36,6 +33,11 @@ import { OutcomeLabel, YesLabel, NoLabel } from './outcome-label'
import { filterDefined } from '../../common/util/array' import { filterDefined } from '../../common/util/array'
import { LoadingIndicator } from './loading-indicator' import { LoadingIndicator } from './loading-indicator'
import { SiteLink } from './site-link' import { SiteLink } from './site-link'
import {
getOutcomeProbability,
getProbability,
getProbabilityAfterSale,
} from '../../common/calculate'
type BetSort = 'newest' | 'profit' | 'settled' | 'value' type BetSort = 'newest' | 'profit' | 'settled' | 'value'
@ -385,7 +387,7 @@ export function MyBetsSummary(props: {
<> <>
Payout at{' '} Payout at{' '}
<span className="text-blue-400"> <span className="text-blue-400">
{formatPercent(getDpmProbability(contract.totalShares))} {formatPercent(getProbability(contract))}
</span> </span>
</> </>
) : ( ) : (
@ -519,16 +521,12 @@ function SellButton(props: { contract: Contract; bet: Bet }) {
const [isSubmitting, setIsSubmitting] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false)
const initialProb = getDpmOutcomeProbability( const initialProb = getOutcomeProbability(
contract.totalShares, contract,
outcome === 'NO' ? 'YES' : outcome outcome === 'NO' ? 'YES' : outcome
) )
const outcomeProb = getDpmProbabilityAfterSale( const outcomeProb = getProbabilityAfterSale(contract, outcome, shares)
contract.totalShares,
outcome,
shares
)
const saleAmount = calculateDpmSaleAmount(contract, bet) const saleAmount = calculateDpmSaleAmount(contract, bet)

View File

@ -2,20 +2,21 @@ import { DatumValue } from '@nivo/core'
import { ResponsiveLine } from '@nivo/line' import { ResponsiveLine } from '@nivo/line'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { Bet } from '../../common/bet' import { Bet } from '../../common/bet'
import { getDpmProbability } from '../../common/calculate-dpm' import { getInitialProbability } from '../../common/calculate'
import { Binary, CPMM, DPM, FullContract } from '../../common/contract'
import { useBetsWithoutAntes } from '../hooks/use-bets' import { useBetsWithoutAntes } from '../hooks/use-bets'
import { useWindowSize } from '../hooks/use-window-size' import { useWindowSize } from '../hooks/use-window-size'
import { Contract } from '../lib/firebase/contracts'
export function ContractProbGraph(props: { contract: Contract; bets: Bet[] }) { export function ContractProbGraph(props: {
contract: FullContract<DPM | CPMM, Binary>
bets: Bet[]
}) {
const { contract } = props const { contract } = props
const { phantomShares, resolutionTime, closeTime } = contract const { resolutionTime, closeTime } = contract
const bets = useBetsWithoutAntes(contract, props.bets) const bets = useBetsWithoutAntes(contract, props.bets)
const startProb = getDpmProbability( const startProb = getInitialProbability(contract)
phantomShares as { [outcome: string]: number }
)
const times = bets const times = bets
? [contract.createdTime, ...bets.map((bet) => bet.createdTime)].map( ? [contract.createdTime, ...bets.map((bet) => bet.createdTime)].map(

View File

@ -13,6 +13,7 @@ import { Col } from './layout/col'
import { SiteLink } from './site-link' import { SiteLink } from './site-link'
import { ContractCard } from './contract-card' import { ContractCard } from './contract-card'
import { Sort, useQueryAndSortParams } from '../hooks/use-sort-and-query-params' import { Sort, useQueryAndSortParams } from '../hooks/use-sort-and-query-params'
import { Answer } from '../../common/answer'
export function ContractsGrid(props: { export function ContractsGrid(props: {
contracts: Contract[] contracts: Contract[]
@ -217,7 +218,11 @@ export function SearchableGrid(props: {
check(c.creatorName) || check(c.creatorName) ||
check(c.creatorUsername) || check(c.creatorUsername) ||
check(c.lowercaseTags.map((tag) => `#${tag}`).join(' ')) || check(c.lowercaseTags.map((tag) => `#${tag}`).join(' ')) ||
check((c.answers ?? []).map((answer) => answer.text).join(' ')) check(
((c as any).answers ?? [])
.map((answer: Answer) => answer.text)
.join(' ')
)
) )
if (sort === 'newest' || sort === 'all') { if (sort === 'newest' || sort === 'all') {

View File

@ -1,7 +1,6 @@
import clsx from 'clsx' import clsx from 'clsx'
import React, { useEffect, useState } from 'react' import React, { useEffect, useState } from 'react'
import { Contract } from '../lib/firebase/contracts'
import { Col } from './layout/col' import { Col } from './layout/col'
import { Title } from './title' import { Title } from './title'
import { User } from '../lib/firebase/users' import { User } from '../lib/firebase/users'
@ -10,12 +9,13 @@ import { Spacer } from './layout/spacer'
import { ResolveConfirmationButton } from './confirmation-button' import { ResolveConfirmationButton } from './confirmation-button'
import { resolveMarket } from '../lib/firebase/api-call' import { resolveMarket } from '../lib/firebase/api-call'
import { ProbabilitySelector } from './probability-selector' import { ProbabilitySelector } from './probability-selector'
import { getDpmProbability } from '../../common/calculate-dpm'
import { CREATOR_FEE } from '../../common/fees' import { CREATOR_FEE } from '../../common/fees'
import { getProbability } from '../../common/calculate'
import { Binary, CPMM, DPM, FullContract } from '../../common/contract'
export function ResolutionPanel(props: { export function ResolutionPanel(props: {
creator: User creator: User
contract: Contract contract: FullContract<DPM | CPMM, Binary>
className?: string className?: string
}) { }) {
useEffect(() => { useEffect(() => {
@ -29,9 +29,7 @@ export function ResolutionPanel(props: {
'YES' | 'NO' | 'MKT' | 'CANCEL' | undefined 'YES' | 'NO' | 'MKT' | 'CANCEL' | undefined
>() >()
const [prob, setProb] = useState( const [prob, setProb] = useState(getProbability(contract) * 100)
getDpmProbability(contract.totalShares) * 100
)
const [isSubmitting, setIsSubmitting] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false)
const [error, setError] = useState<string | undefined>(undefined) const [error, setError] = useState<string | undefined>(undefined)

View File

@ -1,7 +1,7 @@
import { Bet } from '../../../../common/bet' import { Bet } from '../../../../common/bet'
import { getDpmProbability } from '../../../../common/calculate-dpm' import { getDpmProbability } from '../../../../common/calculate-dpm'
import { Comment } from '../../../../common/comment' import { Comment } from '../../../../common/comment'
import { Contract } from '../../../../common/contract' import { DPM, FullContract } from '../../../../common/contract'
export type LiteMarket = { export type LiteMarket = {
// Unique identifer for this market // Unique identifer for this market
@ -56,7 +56,7 @@ export function toLiteMarket({
isResolved, isResolved,
resolution, resolution,
resolutionTime, resolutionTime,
}: Contract): LiteMarket { }: FullContract<DPM, any>): LiteMarket {
return { return {
id, id,
creatorUsername, creatorUsername,

View File

@ -3,11 +3,12 @@ import dayjs from 'dayjs'
import Link from 'next/link' import Link from 'next/link'
import { useState } from 'react' import { useState } from 'react'
import Textarea from 'react-expanding-textarea' import Textarea from 'react-expanding-textarea'
import { getDpmProbability } from '../../common/calculate-dpm'
import { getProbability } from '../../common/calculate'
import { Binary, CPMM, DPM, FullContract } from '../../common/contract'
import { parseWordsAsTags } from '../../common/util/parse' import { parseWordsAsTags } from '../../common/util/parse'
import { AmountInput } from '../components/amount-input' import { AmountInput } from '../components/amount-input'
import { InfoTooltip } from '../components/info-tooltip' import { InfoTooltip } from '../components/info-tooltip'
import { Col } from '../components/layout/col' import { Col } from '../components/layout/col'
import { Row } from '../components/layout/row' import { Row } from '../components/layout/row'
import { Spacer } from '../components/layout/spacer' import { Spacer } from '../components/layout/spacer'
@ -16,7 +17,7 @@ import { Page } from '../components/page'
import { Title } from '../components/title' import { Title } from '../components/title'
import { useUser } from '../hooks/use-user' import { useUser } from '../hooks/use-user'
import { createContract } from '../lib/firebase/api-call' import { createContract } from '../lib/firebase/api-call'
import { Contract, contractPath } from '../lib/firebase/contracts' import { contractPath } from '../lib/firebase/contracts'
type Prediction = { type Prediction = {
question: string question: string
@ -25,8 +26,8 @@ type Prediction = {
createdUrl?: string createdUrl?: string
} }
function toPrediction(contract: Contract): Prediction { function toPrediction(contract: FullContract<DPM | CPMM, Binary>): Prediction {
const startProb = getDpmProbability(contract.totalShares) const startProb = getProbability(contract)
return { return {
question: contract.question, question: contract.question,
description: contract.description, description: contract.description,
@ -101,7 +102,9 @@ export default function MakePredictions() {
const [description, setDescription] = useState('') const [description, setDescription] = useState('')
const [tags, setTags] = useState('') const [tags, setTags] = useState('')
const [isSubmitting, setIsSubmitting] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false)
const [createdContracts, setCreatedContracts] = useState<Contract[]>([]) const [createdContracts, setCreatedContracts] = useState<
FullContract<DPM | CPMM, Binary>[]
>([])
const [ante, setAnte] = useState<number | undefined>(100) const [ante, setAnte] = useState<number | undefined>(100)
const [anteError, setAnteError] = useState<string | undefined>() const [anteError, setAnteError] = useState<string | undefined>()