76f27d1a93
* Numeric contract type * Create market numeric type * Add numeric graph (coded without testing) * Outline of numeric bet panel * Update bet panel logic * create numeric contracts * remove batching for antes for numeric markets * Remove focus * numeric market range [1, 100] * Zoom graph * Hide bet panels * getNumericBets * Add numeric resolution panel * Use getNumericBets in bet panel calc * Switch bucket count to 100 * Parallelize ante creation * placeBet for numeric markets * halve std of numeric bets * Update resolveMarket with numeric type * Set min and max for contract * lower std for numeric bets * calculateNumericDpmShares: use sorted order * Use min and max to map the input * Fix probability calc * normpdf variance mislabeled * range input * merge * change numeric graph color * fix getNewContract params * bet panel labels * validation * number input * fix bucketing * bucket input, numeric resolution panel * outcome label * merge * numeric bet panel on mobile * Make text underneath filled green answer bar selectable * Default to 'all' feed category when loading page. * fix numeric resolution panel * fix numeric bet panel calculations * display numeric resolution * don't render NumericBetPanel for non numeric markets * numeric bets: store shares, bet amounts across buckets in each bet object * restore your bets for numeric markets * numeric pnl calculations * remove hasUserHitManaLimit * contrain contract type * handle undefined allOutcomeShares * numeric ante bet amount * use correct amount for numeric dpm payouts * change numeric graph/outcome color * numeric constants * hack to show correct numeric payout in calculateDpmPayoutAfterCorrectBet * remove comment * fix ante display in bet list * halve bucket count * cast to NumericContract * fix merge imports * OUTCOME_TYPES * typo * lower bucket count to 200 * store raw numeric value with bet * store raw numeric resolution value * number input max length * create page: min, max to undefined if not numeric market * numeric resolution formatting * expected value for numeric markets * expected value for numeric markets * rearrange lines for readability * move normalpdf to util/math * show bets tab * check if outcomeMode is undefined * remove extraneous auto-merge cruft * hide comment status for numeric markets * import Co-authored-by: mantikoros <sgrugett@gmail.com>
166 lines
3.6 KiB
TypeScript
166 lines
3.6 KiB
TypeScript
import * as _ from 'lodash'
|
|
|
|
import { PHANTOM_ANTE } from './antes'
|
|
import {
|
|
Binary,
|
|
Contract,
|
|
CPMM,
|
|
DPM,
|
|
FreeResponse,
|
|
Numeric,
|
|
outcomeType,
|
|
} from './contract'
|
|
import { User } from './user'
|
|
import { parseTags } from './util/parse'
|
|
import { removeUndefinedProps } from './util/object'
|
|
import { calcDpmInitialPool } from './calculate-dpm'
|
|
|
|
export function getNewContract(
|
|
id: string,
|
|
slug: string,
|
|
creator: User,
|
|
question: string,
|
|
outcomeType: outcomeType,
|
|
description: string,
|
|
initialProb: number,
|
|
ante: number,
|
|
closeTime: number,
|
|
extraTags: string[],
|
|
|
|
// used for numeric markets
|
|
bucketCount: number,
|
|
min: number,
|
|
max: number,
|
|
manaLimitPerUser: number
|
|
) {
|
|
const tags = parseTags(
|
|
`${question} ${description} ${extraTags.map((tag) => `#${tag}`).join(' ')}`
|
|
)
|
|
const lowercaseTags = tags.map((tag) => tag.toLowerCase())
|
|
|
|
const propsByOutcomeType =
|
|
outcomeType === 'BINARY'
|
|
? getBinaryCpmmProps(initialProb, ante) // getBinaryDpmProps(initialProb, ante)
|
|
: outcomeType === 'NUMERIC'
|
|
? getNumericProps(ante, bucketCount, min, max)
|
|
: getFreeAnswerProps(ante)
|
|
|
|
const contract: Contract = removeUndefinedProps({
|
|
id,
|
|
slug,
|
|
...propsByOutcomeType,
|
|
|
|
creatorId: creator.id,
|
|
creatorName: creator.name,
|
|
creatorUsername: creator.username,
|
|
creatorAvatarUrl: creator.avatarUrl,
|
|
|
|
question: question.trim(),
|
|
description: description.trim(),
|
|
tags,
|
|
lowercaseTags,
|
|
visibility: 'public',
|
|
isResolved: false,
|
|
createdTime: Date.now(),
|
|
closeTime,
|
|
|
|
volume: 0,
|
|
volume24Hours: 0,
|
|
volume7Days: 0,
|
|
|
|
collectedFees: {
|
|
creatorFee: 0,
|
|
liquidityFee: 0,
|
|
platformFee: 0,
|
|
},
|
|
manaLimitPerUser,
|
|
})
|
|
|
|
return contract as Contract
|
|
}
|
|
|
|
const getBinaryDpmProps = (initialProb: number, ante: number) => {
|
|
const { sharesYes, sharesNo, poolYes, poolNo, phantomYes, phantomNo } =
|
|
calcDpmInitialPool(initialProb, ante, PHANTOM_ANTE)
|
|
|
|
const system: DPM & Binary = {
|
|
mechanism: 'dpm-2',
|
|
outcomeType: 'BINARY',
|
|
initialProbability: initialProb / 100,
|
|
phantomShares: { YES: phantomYes, NO: phantomNo },
|
|
pool: { YES: poolYes, NO: poolNo },
|
|
totalShares: { YES: sharesYes, NO: sharesNo },
|
|
totalBets: { YES: poolYes, NO: poolNo },
|
|
}
|
|
|
|
return system
|
|
}
|
|
|
|
const getBinaryCpmmProps = (initialProb: number, ante: number) => {
|
|
const pool = { YES: ante, NO: ante }
|
|
const p = initialProb / 100
|
|
|
|
const system: CPMM & Binary = {
|
|
mechanism: 'cpmm-1',
|
|
outcomeType: 'BINARY',
|
|
totalLiquidity: ante,
|
|
initialProbability: p,
|
|
p,
|
|
pool: pool,
|
|
}
|
|
|
|
return system
|
|
}
|
|
|
|
const getFreeAnswerProps = (ante: number) => {
|
|
const system: DPM & FreeResponse = {
|
|
mechanism: 'dpm-2',
|
|
outcomeType: 'FREE_RESPONSE',
|
|
pool: { '0': ante },
|
|
totalShares: { '0': ante },
|
|
totalBets: { '0': ante },
|
|
answers: [],
|
|
}
|
|
|
|
return system
|
|
}
|
|
|
|
const getNumericProps = (
|
|
ante: number,
|
|
bucketCount: number,
|
|
min: number,
|
|
max: number
|
|
) => {
|
|
const buckets = _.range(0, bucketCount).map((i) => i.toString())
|
|
|
|
const betAnte = ante / bucketCount
|
|
const pool = Object.fromEntries(buckets.map((answer) => [answer, betAnte]))
|
|
const totalBets = pool
|
|
|
|
const betShares = Math.sqrt(ante ** 2 / bucketCount)
|
|
const totalShares = Object.fromEntries(
|
|
buckets.map((answer) => [answer, betShares])
|
|
)
|
|
|
|
const system: DPM & Numeric = {
|
|
mechanism: 'dpm-2',
|
|
outcomeType: 'NUMERIC',
|
|
pool,
|
|
totalBets,
|
|
totalShares,
|
|
bucketCount,
|
|
min,
|
|
max,
|
|
}
|
|
|
|
return system
|
|
}
|
|
|
|
const getMultiProps = (
|
|
outcomes: string[],
|
|
initialProbs: number[],
|
|
ante: number
|
|
) => {
|
|
// Not implemented.
|
|
}
|