From d99443f4ba96f010ff66623035e27b8638d25f5e Mon Sep 17 00:00:00 2001 From: mantikoros Date: Mon, 10 Oct 2022 18:15:11 -0500 Subject: [PATCH] house liquidity subsidy --- common/economy.ts | 2 ++ functions/src/helpers/add-house-subsidy.ts | 42 ++++++++++++++++++++++ functions/src/on-create-bet.ts | 15 ++++++-- 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 functions/src/helpers/add-house-subsidy.ts diff --git a/common/economy.ts b/common/economy.ts index d9a9433a..c828b0d3 100644 --- a/common/economy.ts +++ b/common/economy.ts @@ -16,3 +16,5 @@ export const BETTING_STREAK_BONUS_MAX = econ?.BETTING_STREAK_BONUS_MAX ?? 25 export const BETTING_STREAK_RESET_HOUR = econ?.BETTING_STREAK_RESET_HOUR ?? 7 export const FREE_MARKETS_PER_USER_MAX = econ?.FREE_MARKETS_PER_USER_MAX ?? 5 export const COMMENT_BOUNTY_AMOUNT = econ?.COMMENT_BOUNTY_AMOUNT ?? 250 + +export const UNIQUE_BETTOR_LIQUIDITY = 20 diff --git a/functions/src/helpers/add-house-subsidy.ts b/functions/src/helpers/add-house-subsidy.ts new file mode 100644 index 00000000..afba8bcf --- /dev/null +++ b/functions/src/helpers/add-house-subsidy.ts @@ -0,0 +1,42 @@ +import * as admin from 'firebase-admin' + +import { CPMMContract } from '../../../common/contract' +import { isProd } from '../utils' +import { + DEV_HOUSE_LIQUIDITY_PROVIDER_ID, + HOUSE_LIQUIDITY_PROVIDER_ID, +} from '../../../common/antes' +import { getNewLiquidityProvision } from '../../../common/add-liquidity' + +const firestore = admin.firestore() + +export const addHouseSubsidy = (contractId: string, amount: number) => { + return firestore.runTransaction(async (transaction) => { + const newLiquidityProvisionDoc = firestore + .collection(`contracts/${contractId}/liquidity`) + .doc() + + const providerId = isProd() + ? HOUSE_LIQUIDITY_PROVIDER_ID + : DEV_HOUSE_LIQUIDITY_PROVIDER_ID + + const contractDoc = firestore.doc(`contracts/${contractId}`) + const snap = await contractDoc.get() + const contract = snap.data() as CPMMContract + + const { newLiquidityProvision, newTotalLiquidity, newSubsidyPool } = + getNewLiquidityProvision( + providerId, + amount, + contract, + newLiquidityProvisionDoc.id + ) + + transaction.update(contractDoc, { + subsidyPool: newSubsidyPool, + totalLiquidity: newTotalLiquidity, + } as Partial) + + transaction.create(newLiquidityProvisionDoc, newLiquidityProvision) + }) +} diff --git a/functions/src/on-create-bet.ts b/functions/src/on-create-bet.ts index b2451c62..37214704 100644 --- a/functions/src/on-create-bet.ts +++ b/functions/src/on-create-bet.ts @@ -24,6 +24,7 @@ import { BETTING_STREAK_BONUS_MAX, BETTING_STREAK_RESET_HOUR, UNIQUE_BETTOR_BONUS_AMOUNT, + UNIQUE_BETTOR_LIQUIDITY, } from '../../common/economy' import { DEV_HOUSE_LIQUIDITY_PROVIDER_ID, @@ -33,6 +34,7 @@ import { APIError } from '../../common/api' import { User } from '../../common/user' import { DAY_MS } from '../../common/util/time' import { BettingStreakBonusTxn, UniqueBettorBonusTxn } from '../../common/txn' +import { addHouseSubsidy } from './helpers/add-house-subsidy' const firestore = admin.firestore() const BONUS_START_DATE = new Date('2022-07-13T15:30:00.000Z').getTime() @@ -103,7 +105,7 @@ const updateBettingStreak = async ( const newBettingStreak = (bettor?.currentBettingStreak ?? 0) + 1 // Otherwise, add 1 to their betting streak - await trans.update(userDoc, { + trans.update(userDoc, { currentBettingStreak: newBettingStreak, lastBetTime: bet.createdTime, }) @@ -191,7 +193,7 @@ const updateUniqueBettorsAndGiveCreatorBonus = async ( log(`Got ${previousUniqueBettorIds} unique bettors`) isNewUniqueBettor && log(`And a new unique bettor ${bettor.id}`) - await trans.update(contractDoc, { + trans.update(contractDoc, { uniqueBettorIds: newUniqueBettorIds, uniqueBettorCount: newUniqueBettorIds.length, }) @@ -204,8 +206,13 @@ const updateUniqueBettorsAndGiveCreatorBonus = async ( return { newUniqueBettorIds } } ) + if (!newUniqueBettorIds) return + if (oldContract.mechanism === 'cpmm-1') { + await addHouseSubsidy(oldContract.id, UNIQUE_BETTOR_LIQUIDITY) + } + const bonusTxnDetails = { contractId: oldContract.id, uniqueNewBettorId: bettor.id, @@ -215,7 +222,9 @@ const updateUniqueBettorsAndGiveCreatorBonus = async ( : DEV_HOUSE_LIQUIDITY_PROVIDER_ID const fromSnap = await firestore.doc(`users/${fromUserId}`).get() if (!fromSnap.exists) throw new APIError(400, 'From user not found.') + const fromUser = fromSnap.data() as User + const result = await firestore.runTransaction(async (trans) => { const bonusTxn: TxnData = { fromId: fromUser.id, @@ -228,7 +237,9 @@ const updateUniqueBettorsAndGiveCreatorBonus = async ( description: JSON.stringify(bonusTxnDetails), data: bonusTxnDetails, } as Omit + const { status, message, txn } = await runTxn(trans, bonusTxn) + return { status, newUniqueBettorIds, message, txn } })