2022-02-17 23:00:19 +00:00
|
|
|
import { Answer } from './answer'
|
2022-03-15 22:27:51 +00:00
|
|
|
import { Fees } from './fees'
|
Rich content (#620)
* Add TipTap editor and renderer components
* Change market description editor to rich text
* Type description as JSON, fix string-based logic
- Delete make-predictions.tsx
- Delete feed logic that showed descriptions
* wip Fix API validation
* fix type error
* fix extension import (backend)
In firebase, typescript compiles imports into common js imports
like `const StarterKit = require("@tiptap/starter-kit")`
Even though StarterKit is exported from the cjs file, it gets imported
as undefined. But it magically works if we import *
If you're reading this in the future, consider replacing StarterKit with
the entire list of extensions.
* Stop load on fail create market, improve warning
* Refactor editor as hook / fix infinite submit bug
Move state of editor back up to parent
We have to do this later anyways to allow parent to edit
* Add images - display, paste + uploading
* add uploading state of image
* Fix placeholder, misc styling
min height, quote
* Fix appending to description
* code review fixes: rename, refactor, chop carets
* Add hint & upload button on new lines
- bump to Tailwind 3.1 for arbitrary variants
* clean up, run prettier
* rename FileButton to FileUploadButton
* add image extension as functions dependency
2022-07-13 18:58:22 +00:00
|
|
|
import { JSONContent } from '@tiptap/core'
|
2022-07-22 22:28:53 +00:00
|
|
|
import { GroupLink } from 'common/group'
|
2022-02-17 23:00:19 +00:00
|
|
|
|
2022-06-01 02:42:35 +00:00
|
|
|
export type AnyMechanism = DPM | CPMM
|
2022-07-28 02:40:33 +00:00
|
|
|
export type AnyOutcomeType =
|
|
|
|
| Binary
|
|
|
|
| MultipleChoice
|
|
|
|
| PseudoNumeric
|
|
|
|
| FreeResponse
|
|
|
|
| Numeric
|
2022-10-14 12:05:07 +00:00
|
|
|
|
2022-06-01 02:42:35 +00:00
|
|
|
export type AnyContractType =
|
|
|
|
| (CPMM & Binary)
|
2022-07-02 19:37:59 +00:00
|
|
|
| (CPMM & PseudoNumeric)
|
2022-06-01 02:42:35 +00:00
|
|
|
| (DPM & Binary)
|
2022-06-01 03:40:08 +00:00
|
|
|
| (DPM & FreeResponse)
|
2022-06-01 02:42:35 +00:00
|
|
|
| (DPM & Numeric)
|
2022-07-28 02:40:33 +00:00
|
|
|
| (DPM & MultipleChoice)
|
2022-06-01 02:42:35 +00:00
|
|
|
|
|
|
|
export type Contract<T extends AnyContractType = AnyContractType> = {
|
2022-01-10 23:52:03 +00:00
|
|
|
id: string
|
|
|
|
slug: string // auto-generated; must be unique
|
2022-01-10 21:07:57 +00:00
|
|
|
|
2022-01-10 23:52:03 +00:00
|
|
|
creatorId: string
|
|
|
|
creatorName: string
|
|
|
|
creatorUsername: string
|
2022-05-19 17:42:03 +00:00
|
|
|
creatorAvatarUrl?: string
|
2022-01-10 21:07:57 +00:00
|
|
|
|
2022-01-10 23:52:03 +00:00
|
|
|
question: string
|
Rich content (#620)
* Add TipTap editor and renderer components
* Change market description editor to rich text
* Type description as JSON, fix string-based logic
- Delete make-predictions.tsx
- Delete feed logic that showed descriptions
* wip Fix API validation
* fix type error
* fix extension import (backend)
In firebase, typescript compiles imports into common js imports
like `const StarterKit = require("@tiptap/starter-kit")`
Even though StarterKit is exported from the cjs file, it gets imported
as undefined. But it magically works if we import *
If you're reading this in the future, consider replacing StarterKit with
the entire list of extensions.
* Stop load on fail create market, improve warning
* Refactor editor as hook / fix infinite submit bug
Move state of editor back up to parent
We have to do this later anyways to allow parent to edit
* Add images - display, paste + uploading
* add uploading state of image
* Fix placeholder, misc styling
min height, quote
* Fix appending to description
* code review fixes: rename, refactor, chop carets
* Add hint & upload button on new lines
- bump to Tailwind 3.1 for arbitrary variants
* clean up, run prettier
* rename FileButton to FileUploadButton
* add image extension as functions dependency
2022-07-13 18:58:22 +00:00
|
|
|
description: string | JSONContent // More info about what the contract is about
|
2022-01-21 23:21:46 +00:00
|
|
|
tags: string[]
|
2022-01-24 22:33:02 +00:00
|
|
|
lowercaseTags: string[]
|
2022-08-20 19:31:32 +00:00
|
|
|
visibility: visibility
|
2022-01-10 21:07:57 +00:00
|
|
|
|
2022-01-10 23:52:03 +00:00
|
|
|
createdTime: number // Milliseconds since epoch
|
2022-05-01 16:36:54 +00:00
|
|
|
lastUpdatedTime?: number // Updated on new bet or comment
|
|
|
|
lastBetTime?: number
|
|
|
|
lastCommentTime?: number
|
2022-01-10 23:52:03 +00:00
|
|
|
closeTime?: number // When no more trading is allowed
|
2022-01-10 21:07:57 +00:00
|
|
|
|
2022-01-10 23:52:03 +00:00
|
|
|
isResolved: boolean
|
2022-06-15 04:31:20 +00:00
|
|
|
resolutionTime?: number // When the contract creator resolved the market
|
2022-02-17 23:00:19 +00:00
|
|
|
resolution?: string
|
2022-07-02 19:37:59 +00:00
|
|
|
resolutionProbability?: number
|
2022-06-15 04:31:20 +00:00
|
|
|
|
2022-02-17 18:18:02 +00:00
|
|
|
closeEmailsSent?: number
|
2022-01-10 21:07:57 +00:00
|
|
|
|
2022-03-23 05:09:47 +00:00
|
|
|
volume: number
|
2022-01-10 23:52:03 +00:00
|
|
|
volume24Hours: number
|
|
|
|
volume7Days: number
|
2022-10-06 21:36:16 +00:00
|
|
|
elasticity: number
|
2022-03-15 22:27:51 +00:00
|
|
|
|
|
|
|
collectedFees: Fees
|
2022-07-13 21:11:22 +00:00
|
|
|
|
|
|
|
groupSlugs?: string[]
|
2022-07-22 22:28:53 +00:00
|
|
|
groupLinks?: GroupLink[]
|
2022-07-13 21:11:22 +00:00
|
|
|
uniqueBettorIds?: string[]
|
|
|
|
uniqueBettorCount?: number
|
2022-07-19 22:29:41 +00:00
|
|
|
popularityScore?: number
|
2022-09-22 21:57:48 +00:00
|
|
|
dailyScore?: number
|
2022-08-24 16:49:53 +00:00
|
|
|
followerCount?: number
|
2022-08-25 13:05:26 +00:00
|
|
|
featuredOnHomeRank?: number
|
2022-08-30 15:38:59 +00:00
|
|
|
likedByUserIds?: string[]
|
|
|
|
likedByUserCount?: number
|
2022-10-03 09:49:19 +00:00
|
|
|
flaggedByUsernames?: string[]
|
2022-09-30 15:27:42 +00:00
|
|
|
openCommentBounties?: number
|
2022-10-03 15:26:39 +00:00
|
|
|
unlistedById?: string
|
2022-06-01 02:42:35 +00:00
|
|
|
} & T
|
2022-03-15 22:27:51 +00:00
|
|
|
|
2022-07-13 21:11:22 +00:00
|
|
|
export type BinaryContract = Contract & Binary
|
|
|
|
export type PseudoNumericContract = Contract & PseudoNumeric
|
2022-06-01 02:42:35 +00:00
|
|
|
export type NumericContract = Contract & Numeric
|
|
|
|
export type FreeResponseContract = Contract & FreeResponse
|
2022-07-28 02:40:33 +00:00
|
|
|
export type MultipleChoiceContract = Contract & MultipleChoice
|
2022-06-01 02:42:35 +00:00
|
|
|
export type DPMContract = Contract & DPM
|
|
|
|
export type CPMMContract = Contract & CPMM
|
|
|
|
export type DPMBinaryContract = BinaryContract & DPM
|
|
|
|
export type CPMMBinaryContract = BinaryContract & CPMM
|
2022-03-15 22:27:51 +00:00
|
|
|
|
|
|
|
export type DPM = {
|
|
|
|
mechanism: 'dpm-2'
|
|
|
|
|
|
|
|
pool: { [outcome: string]: number }
|
|
|
|
phantomShares?: { [outcome: string]: number }
|
|
|
|
totalShares: { [outcome: string]: number }
|
|
|
|
totalBets: { [outcome: string]: number }
|
|
|
|
}
|
|
|
|
|
|
|
|
export type CPMM = {
|
|
|
|
mechanism: 'cpmm-1'
|
|
|
|
pool: { [outcome: string]: number }
|
|
|
|
p: number // probability constant in y^p * n^(1-p) = k
|
2022-10-11 02:56:16 +00:00
|
|
|
totalLiquidity: number // for historical reasons, this the total subsidy amount added in M$
|
|
|
|
subsidyPool: number // current value of subsidy pool in M$
|
2022-09-03 20:06:41 +00:00
|
|
|
prob: number
|
|
|
|
probChanges: {
|
|
|
|
day: number
|
|
|
|
week: number
|
|
|
|
month: number
|
|
|
|
}
|
2022-03-15 22:27:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export type Binary = {
|
|
|
|
outcomeType: 'BINARY'
|
|
|
|
initialProbability: number
|
|
|
|
resolutionProbability?: number // Used for BINARY markets resolved to MKT
|
2022-06-03 00:30:34 +00:00
|
|
|
resolution?: resolution
|
2022-03-15 22:27:51 +00:00
|
|
|
}
|
|
|
|
|
2022-07-02 19:37:59 +00:00
|
|
|
export type PseudoNumeric = {
|
|
|
|
outcomeType: 'PSEUDO_NUMERIC'
|
|
|
|
min: number
|
|
|
|
max: number
|
|
|
|
isLogScale: boolean
|
|
|
|
resolutionValue?: number
|
|
|
|
|
|
|
|
// same as binary market; map everything to probability
|
|
|
|
initialProbability: number
|
|
|
|
resolutionProbability?: number
|
|
|
|
}
|
|
|
|
|
2022-03-15 22:27:51 +00:00
|
|
|
export type FreeResponse = {
|
|
|
|
outcomeType: 'FREE_RESPONSE'
|
|
|
|
answers: Answer[] // Used for outcomeType 'FREE_RESPONSE'.
|
2022-04-18 23:02:40 +00:00
|
|
|
resolution?: string | 'MKT' | 'CANCEL'
|
|
|
|
resolutions?: { [outcome: string]: number } // Used for MKT resolution.
|
2022-01-10 23:52:03 +00:00
|
|
|
}
|
2022-01-22 23:59:50 +00:00
|
|
|
|
2022-07-28 02:40:33 +00:00
|
|
|
export type MultipleChoice = {
|
|
|
|
outcomeType: 'MULTIPLE_CHOICE'
|
|
|
|
answers: Answer[]
|
|
|
|
resolution?: string | 'MKT' | 'CANCEL'
|
|
|
|
resolutions?: { [outcome: string]: number } // Used for MKT resolution.
|
|
|
|
}
|
|
|
|
|
2022-05-19 17:42:03 +00:00
|
|
|
export type Numeric = {
|
|
|
|
outcomeType: 'NUMERIC'
|
|
|
|
bucketCount: number
|
|
|
|
min: number
|
|
|
|
max: number
|
|
|
|
resolutions?: { [outcome: string]: number } // Used for MKT resolution.
|
|
|
|
resolutionValue?: number
|
|
|
|
}
|
|
|
|
|
2022-06-01 02:42:35 +00:00
|
|
|
export type outcomeType = AnyOutcomeType['outcomeType']
|
2022-06-03 00:30:34 +00:00
|
|
|
export type resolution = 'YES' | 'NO' | 'MKT' | 'CANCEL'
|
|
|
|
export const RESOLUTIONS = ['YES', 'NO', 'MKT', 'CANCEL'] as const
|
2022-07-13 21:11:22 +00:00
|
|
|
export const OUTCOME_TYPES = [
|
|
|
|
'BINARY',
|
2022-07-28 02:40:33 +00:00
|
|
|
'MULTIPLE_CHOICE',
|
2022-07-13 21:11:22 +00:00
|
|
|
'FREE_RESPONSE',
|
|
|
|
'PSEUDO_NUMERIC',
|
|
|
|
'NUMERIC',
|
|
|
|
] as const
|
2022-06-10 01:25:05 +00:00
|
|
|
|
2022-09-17 19:35:49 +00:00
|
|
|
export const MAX_QUESTION_LENGTH = 240
|
2022-08-10 17:31:28 +00:00
|
|
|
export const MAX_DESCRIPTION_LENGTH = 16000
|
2022-03-09 17:08:57 +00:00
|
|
|
export const MAX_TAG_LENGTH = 60
|
2022-06-10 01:25:05 +00:00
|
|
|
|
|
|
|
export const CPMM_MIN_POOL_QTY = 0.01
|
2022-08-20 19:31:32 +00:00
|
|
|
|
|
|
|
export type visibility = 'public' | 'unlisted'
|
|
|
|
export const VISIBILITIES = ['public', 'unlisted'] as const
|