diff --git a/functions/src/place-bet.ts b/functions/src/place-bet.ts index 41ad8141..4a1e04f8 100644 --- a/functions/src/place-bet.ts +++ b/functions/src/place-bet.ts @@ -40,9 +40,6 @@ export const placeBet = functions.runWith({ minInstances: 1 }).https.onCall( return { status: 'error', message: 'User not found' } const user = userSnap.data() as User - if (user.balance < amount) - return { status: 'error', message: 'Insufficient balance' } - const contractDoc = firestore.doc(`contracts/${contractId}`) const contractSnap = await transaction.get(contractDoc) if (!contractSnap.exists) @@ -58,6 +55,10 @@ export const placeBet = functions.runWith({ minInstances: 1 }).https.onCall( ) const yourBets = yourBetsSnap.docs.map((doc) => doc.data() as Bet) + const loanAmount = getLoanAmount(yourBets, amount) + if (user.balance < amount - loanAmount) + return { status: 'error', message: 'Insufficient balance' } + if (outcomeType === 'FREE_RESPONSE') { const answerSnap = await transaction.get( contractDoc.collection('answers').doc(outcome) @@ -70,8 +71,6 @@ export const placeBet = functions.runWith({ minInstances: 1 }).https.onCall( .collection(`contracts/${contractId}/bets`) .doc() - const loanAmount = getLoanAmount(yourBets, amount) - const { newBet, newPool, newTotalShares, newTotalBets, newBalance } = outcomeType === 'BINARY' ? mechanism === 'dpm-2' diff --git a/functions/src/utils.ts b/functions/src/utils.ts index 0e87538a..f34db1c8 100644 --- a/functions/src/utils.ts +++ b/functions/src/utils.ts @@ -68,8 +68,7 @@ const updateUserBalance = ( } export const payUser = (userId: string, payout: number, isDeposit = false) => { - if (!isFinite(payout) || payout <= 0) - throw new Error('Payout is not positive: ' + payout) + if (!isFinite(payout)) throw new Error('Payout is not finite: ' + payout) return updateUserBalance(userId, payout, isDeposit) } diff --git a/web/pages/activity.tsx b/web/components/activity-feed.tsx similarity index 74% rename from web/pages/activity.tsx rename to web/components/activity-feed.tsx index bab58328..bfd4cc1c 100644 --- a/web/pages/activity.tsx +++ b/web/components/activity-feed.tsx @@ -1,9 +1,12 @@ import _ from 'lodash' -import { ContractFeed, ContractSummaryFeed } from '../components/contract-feed' -import { Page } from '../components/page' +import { + ContractActivityFeed, + ContractFeed, + ContractSummaryFeed, +} from './contract-feed' import { Contract } from '../lib/firebase/contracts' import { Comment } from '../lib/firebase/comments' -import { Col } from '../components/layout/col' +import { Col } from './layout/col' import { Bet } from '../../common/bet' const MAX_ACTIVE_CONTRACTS = 75 @@ -72,30 +75,44 @@ export function findActiveContracts( export function ActivityFeed(props: { contracts: Contract[] - contractBets: Bet[][] - contractComments: Comment[][] + recentBets: Bet[] + recentComments: Comment[] + loadBetAndCommentHistory?: boolean }) { - const { contracts, contractBets, contractComments } = props + const { contracts, recentBets, recentComments, loadBetAndCommentHistory } = + props - return contracts.length > 0 ? ( + const groupedBets = _.groupBy(recentBets, (bet) => bet.contractId) + const groupedComments = _.groupBy( + recentComments, + (comment) => comment.contractId + ) + + return (
Ask a question...
-
bets.length)
+ const dailyContractCounts = dailyContracts.map(
+ (contracts) => contracts.length
+ )
+ const dailyCommentCounts = dailyComments.map((comments) => comments.length)
+
+ const dailyActiveUsers = _.zip(dailyContracts, dailyBets, dailyComments).map(
+ ([contracts, bets, comments]) => {
+ const creatorIds = (contracts ?? []).map((c) => c.creatorId)
+ const betUserIds = (bets ?? []).map((bet) => bet.userId)
+ const commentUserIds = (comments ?? []).map((comment) => comment.userId)
+ return _.uniq([...creatorIds, ...betUserIds, commentUserIds]).length
+ }
+ )
+
+ return {
+ props: {
+ startDate: startDate.valueOf(),
+ dailyActiveUsers,
+ dailyBetCounts,
+ dailyContractCounts,
+ dailyCommentCounts,
+ },
+ revalidate: 12 * 60 * 60, // regenerate after half a day
+ }
+}
+
+export default function Analytics(props: {
+ startDate: number
+ dailyActiveUsers: number[]
+ dailyBetCounts: number[]
+ dailyContractCounts: number[]
+ dailyCommentCounts: number[]
+}) {
return (