Every 15 minutes, compute contract volume in last 24 hours and 7 days
This commit is contained in:
parent
6d4554e9ef
commit
6b4417d8b8
|
@ -114,6 +114,9 @@ function getNewContract(
|
||||||
|
|
||||||
createdTime: Date.now(),
|
createdTime: Date.now(),
|
||||||
lastUpdatedTime: Date.now(),
|
lastUpdatedTime: Date.now(),
|
||||||
|
|
||||||
|
volume24Hours: 0,
|
||||||
|
volume7Days: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (closeTime) contract.closeTime = closeTime
|
if (closeTime) contract.closeTime = closeTime
|
||||||
|
|
|
@ -8,3 +8,4 @@ export * from './resolve-market'
|
||||||
export * from './stripe'
|
export * from './stripe'
|
||||||
export * from './sell-bet'
|
export * from './sell-bet'
|
||||||
export * from './create-contract'
|
export * from './create-contract'
|
||||||
|
export * from './update-contract-metrics'
|
||||||
|
|
|
@ -23,4 +23,7 @@ export type Contract = {
|
||||||
isResolved: boolean
|
isResolved: boolean
|
||||||
resolutionTime?: number // When the contract creator resolved the market
|
resolutionTime?: number // When the contract creator resolved the market
|
||||||
resolution?: 'YES' | 'NO' | 'CANCEL' // Chosen by creator; must be one of outcomes
|
resolution?: 'YES' | 'NO' | 'CANCEL' // Chosen by creator; must be one of outcomes
|
||||||
|
|
||||||
|
volume24Hours: number
|
||||||
|
volume7Days: number
|
||||||
}
|
}
|
||||||
|
|
40
functions/src/update-contract-metrics.ts
Normal file
40
functions/src/update-contract-metrics.ts
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
import * as functions from 'firebase-functions'
|
||||||
|
import * as admin from 'firebase-admin'
|
||||||
|
import * as _ from 'lodash'
|
||||||
|
import { Contract } from './types/contract'
|
||||||
|
import { getValues } from './utils'
|
||||||
|
import { Bet } from './types/bet'
|
||||||
|
|
||||||
|
const firestore = admin.firestore()
|
||||||
|
|
||||||
|
const oneDay = 1000 * 60 * 60 * 24
|
||||||
|
|
||||||
|
export const updateContractMetrics = functions.pubsub
|
||||||
|
.schedule('every 15 minutes')
|
||||||
|
.onRun(async () => {
|
||||||
|
const contracts = await getValues<Contract>(
|
||||||
|
firestore.collection('contracts')
|
||||||
|
)
|
||||||
|
await Promise.all(
|
||||||
|
contracts.map(async (contract) => {
|
||||||
|
const volume24Hours = await computeVolumeFrom(contract, oneDay)
|
||||||
|
const volume7Days = await computeVolumeFrom(contract, oneDay * 7)
|
||||||
|
|
||||||
|
const contractRef = firestore.doc(`contracts/${contract.id}`)
|
||||||
|
return contractRef.update({
|
||||||
|
volume24Hours,
|
||||||
|
volume7Days,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
const computeVolumeFrom = async (contract: Contract, timeAgoMs: number) => {
|
||||||
|
const bets = await getValues<Bet>(
|
||||||
|
firestore
|
||||||
|
.collection(`contracts/${contract.id}/bets`)
|
||||||
|
.where('createdTime', '>', Date.now() - timeAgoMs)
|
||||||
|
)
|
||||||
|
|
||||||
|
return _.sumBy(bets, (bet) => Math.abs(bet.amount))
|
||||||
|
}
|
|
@ -42,6 +42,9 @@ export type Contract = {
|
||||||
isResolved: boolean
|
isResolved: boolean
|
||||||
resolutionTime?: number // When the contract creator resolved the market
|
resolutionTime?: number // When the contract creator resolved the market
|
||||||
resolution?: 'YES' | 'NO' | 'CANCEL' // Chosen by creator; must be one of outcomes
|
resolution?: 'YES' | 'NO' | 'CANCEL' // Chosen by creator; must be one of outcomes
|
||||||
|
|
||||||
|
volume24Hours: number
|
||||||
|
volume7Days: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export function path(contract: Contract) {
|
export function path(contract: Contract) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user