diff --git a/web/components/bet-button.tsx b/web/components/bet-button.tsx
index 2aadbc78..0bd3702f 100644
--- a/web/components/bet-button.tsx
+++ b/web/components/bet-button.tsx
@@ -32,17 +32,6 @@ export default function BetButton(props: {
return (
<>
- {user && (
-
- {hasYesShares
- ? `(${Math.floor(yesShares)} ${
- isPseudoNumeric ? 'HIGHER' : 'YES'
- })`
- : hasNoShares
- ? `(${Math.floor(noShares)} ${isPseudoNumeric ? 'LOWER' : 'NO'})`
- : ''}
-
- )}
{user ? (
)}
+
+ {user && (
+
+ {hasYesShares
+ ? `(${Math.floor(yesShares)} ${
+ isPseudoNumeric ? 'HIGHER' : 'YES'
+ })`
+ : hasNoShares
+ ? `(${Math.floor(noShares)} ${isPseudoNumeric ? 'LOWER' : 'NO'})`
+ : ''}
+
+ )}
diff --git a/web/components/contract/contract-card.tsx b/web/components/contract/contract-card.tsx
index b021d660..dab92a7a 100644
--- a/web/components/contract/contract-card.tsx
+++ b/web/components/contract/contract-card.tsx
@@ -25,11 +25,7 @@ import {
} from 'common/calculate'
import { AvatarDetails, MiscDetails, ShowTime } from './contract-details'
import { getExpectedValue, getValueFromBucket } from 'common/calculate-dpm'
-import {
- getColor,
- ProbBar,
- QuickBetArrows,
-} from 'web/components/contract/quick-bet-arrows'
+import { getColor, ProbBar, QuickBet } from './quick-bet'
import { useContractWithPreload } from 'web/hooks/use-contract'
import { useUser } from 'web/hooks/use-user'
import { track } from '@amplitude/analytics-browser'
@@ -105,7 +101,7 @@ export function ContractCard(props: {
))}
{showQuickBet ? (
-
+
) : (
<>
{outcomeType === 'BINARY' && (
diff --git a/web/components/contract/contract-overview.tsx b/web/components/contract/contract-overview.tsx
index 77a9420c..1bfe84de 100644
--- a/web/components/contract/contract-overview.tsx
+++ b/web/components/contract/contract-overview.tsx
@@ -27,44 +27,21 @@ import {
} from 'common/contract'
import { ContractDetails, ExtraMobileContractDetails } from './contract-details'
import { NumericGraph } from './numeric-graph'
-import { QuickBetButtons } from 'web/components/contract/quick-bet-button'
const OverviewQuestion = (props: { text: string }) => (
)
const BetWidget = (props: { contract: CPMMContract }) => {
- const { contract } = props
const user = useUser()
return (
-
-
- {contract.outcomeType === 'BINARY' &&
- user &&
- QuickBetButtons({
- contract: contract as CPMMBinaryContract,
- user: user,
- side: 'NO',
- className: 'self-end min-w-[60px]',
- })}
-
-
- {contract.outcomeType === 'BINARY' &&
- user &&
- QuickBetButtons({
- contract: contract as CPMMBinaryContract,
- user: user,
- side: 'YES',
- className: 'self-end min-w-[60px]',
- })}
-
-
- {!user && (
-
- (with play money!)
-
- )}
-
+
+
+ {!user && (
+
+ (with play money!)
+
+ )}
)
}
@@ -108,13 +85,13 @@ const BinaryOverview = (props: { contract: BinaryContract; bets: Bet[] }) => {
+
{tradingAllowed(contract) && (
)}
-
)
}
@@ -163,11 +140,11 @@ const PseudoNumericOverview = (props: {
+
{tradingAllowed(contract) && }
-
)
}
diff --git a/web/components/contract/quick-bet-button.tsx b/web/components/contract/quick-bet-button.tsx
deleted file mode 100644
index d7d5a3a3..00000000
--- a/web/components/contract/quick-bet-button.tsx
+++ /dev/null
@@ -1,128 +0,0 @@
-import {
- getOutcomeProbability,
- getProbability,
- getTopAnswer,
-} from 'common/calculate'
-import { getExpectedValue } from 'common/calculate-dpm'
-import { User } from 'common/user'
-import { Contract, CPMMBinaryContract, NumericContract } from 'common/contract'
-import { formatMoney } from 'common/util/format'
-import toast from 'react-hot-toast'
-import { useUserContractBets } from 'web/hooks/use-user-bets'
-import { placeBet } from 'web/lib/firebase/api'
-import { useSaveBinaryShares } from '../use-save-binary-shares'
-import { sellShares } from 'web/lib/firebase/api'
-import { calculateCpmmSale } from 'common/calculate-cpmm'
-import { track } from 'web/lib/service/analytics'
-import { useUnfilledBets } from 'web/hooks/use-bets'
-import { getBinaryProb } from 'common/contract-details'
-import { quickOutcome } from 'web/components/contract/quick-bet-arrows'
-import { Button } from 'web/components/button'
-
-const BET_SIZE = 10
-
-export function QuickBetButtons(props: {
- contract: CPMMBinaryContract
- user: User
- side: 'YES' | 'NO'
- className?: string
-}) {
- const { contract, side, user } = props
- let sharesSold: number | undefined
- let sellOutcome: 'YES' | 'NO' | undefined
- let saleAmount: number | undefined
-
- const userBets = useUserContractBets(user.id, contract.id)
- const unfilledBets = useUnfilledBets(contract.id) ?? []
-
- const { yesShares, noShares } = useSaveBinaryShares(contract, userBets)
- const oppositeShares = side === 'YES' ? noShares : yesShares
- if (oppositeShares > 0.01) {
- sellOutcome = side === 'YES' ? 'NO' : 'YES'
-
- const prob = getProb(contract)
- const maxSharesSold =
- (BET_SIZE + 0.05) / (sellOutcome === 'YES' ? prob : 1 - prob)
- sharesSold = Math.min(oppositeShares, maxSharesSold)
-
- const { saleValue } = calculateCpmmSale(
- contract,
- sharesSold,
- sellOutcome,
- unfilledBets
- )
- saleAmount = saleValue
- }
-
- async function placeQuickBet() {
- const betPromise = async () => {
- if (sharesSold && sellOutcome) {
- return await sellShares({
- shares: sharesSold,
- outcome: sellOutcome,
- contractId: contract.id,
- })
- }
-
- const outcome = quickOutcome(contract, side === 'YES' ? 'UP' : 'DOWN')
- return await placeBet({
- amount: BET_SIZE,
- outcome,
- contractId: contract.id,
- })
- }
- const shortQ = contract.question.slice(0, 20)
- const message =
- sellOutcome && saleAmount
- ? `${formatMoney(saleAmount)} sold of "${shortQ}"...`
- : `${formatMoney(BET_SIZE)} on "${shortQ}"...`
-
- toast.promise(betPromise(), {
- loading: message,
- success: message,
- error: (err) => `${err.message}`,
- })
-
- track('quick bet button', {
- slug: contract.slug,
- outcome: side,
- contractId: contract.id,
- })
- }
-
- return (
-
- )
-}
-
-// Return a number from 0 to 1 for this contract
-// Resolved contracts are set to 1, for coloring purposes (even if NO)
-function getProb(contract: Contract) {
- const { outcomeType, resolution, resolutionProbability } = contract
- return resolutionProbability
- ? resolutionProbability
- : resolution
- ? 1
- : outcomeType === 'BINARY'
- ? getBinaryProb(contract)
- : outcomeType === 'PSEUDO_NUMERIC'
- ? getProbability(contract)
- : outcomeType === 'FREE_RESPONSE' || outcomeType === 'MULTIPLE_CHOICE'
- ? getOutcomeProbability(contract, getTopAnswer(contract)?.id || '')
- : outcomeType === 'NUMERIC'
- ? getNumericScale(contract)
- : 1 // Should not happen
-}
-
-function getNumericScale(contract: NumericContract) {
- const { min, max } = contract
- const ev = getExpectedValue(contract)
- return (ev - min) / (max - min)
-}
diff --git a/web/components/contract/quick-bet-arrows.tsx b/web/components/contract/quick-bet.tsx
similarity index 98%
rename from web/components/contract/quick-bet-arrows.tsx
rename to web/components/contract/quick-bet.tsx
index 678963bf..7b19306f 100644
--- a/web/components/contract/quick-bet-arrows.tsx
+++ b/web/components/contract/quick-bet.tsx
@@ -38,7 +38,7 @@ import { getBinaryProb } from 'common/contract-details'
const BET_SIZE = 10
-export function QuickBetArrows(props: {
+export function QuickBet(props: {
contract: BinaryContract | PseudoNumericContract
user: User
className?: string
@@ -243,7 +243,7 @@ export function ProbBar(props: { contract: Contract; previewProb?: number }) {
)
}
-export function quickOutcome(contract: Contract, direction: 'UP' | 'DOWN') {
+function quickOutcome(contract: Contract, direction: 'UP' | 'DOWN') {
const { outcomeType } = contract
if (outcomeType === 'BINARY' || outcomeType === 'PSEUDO_NUMERIC') {