diff --git a/packages/database/scripts/rerun-market-resolution.ts b/packages/database/scripts/rerun-market-resolution.ts index 651443b6..b10d9a35 100644 --- a/packages/database/scripts/rerun-market-resolution.ts +++ b/packages/database/scripts/rerun-market-resolution.ts @@ -4,7 +4,7 @@ import { createMarketResolveWinTransactions } from '@play-money/markets/lib/crea import { getMarket } from '@play-money/markets/lib/getMarket' import db from '../prisma' -const marketId = 'cm0amvq8v001910v7iq2mvf4m' +const marketId = 'cm5od3mim075xt20i1ummyi2u' async function main() { try { @@ -32,7 +32,7 @@ async function main() { const liquidityTransactions = await createMarketExcessLiquidityTransactions({ marketId, initiatorId: '' }) console.log( - `Market ${marketId} resolution re-run. ${lossTransactions.flat().length} losses, ${winTransactions.length} wins. ${liquidityTransactions.length} liquidity accounts returned.` + `Market ${marketId} resolution re-run. ${lossTransactions.length} losses, ${winTransactions.length} wins. ${liquidityTransactions.length} liquidity accounts returned.` ) return } diff --git a/packages/markets/lib/createMarketResolveLossTransactions.test.ts b/packages/markets/lib/createMarketResolveLossTransactions.test.ts index 88fc0e47..ad996010 100644 --- a/packages/markets/lib/createMarketResolveLossTransactions.test.ts +++ b/packages/markets/lib/createMarketResolveLossTransactions.test.ts @@ -85,15 +85,6 @@ describe('createMarketResolveLossTransactions', () => { assetId: 'option-2', amount: new Decimal(60), }, - ], - }) - ) - - expect(executeTransaction).toHaveBeenCalledWith( - expect.objectContaining({ - type: 'TRADE_LOSS', - marketId: 'market-1', - entries: [ { fromAccountId: 'user-2', toAccountId: 'amm-account-id', diff --git a/packages/markets/lib/createMarketResolveLossTransactions.ts b/packages/markets/lib/createMarketResolveLossTransactions.ts index 6894cd37..b8065c5b 100644 --- a/packages/markets/lib/createMarketResolveLossTransactions.ts +++ b/packages/markets/lib/createMarketResolveLossTransactions.ts @@ -44,55 +44,53 @@ export async function createMarketResolveLossTransactions({ {} as Record> ) - const transactions: Array> = [] - - // Transfer all losing shares back to the AMM - for (const [accountId, optionQuantity] of Object.entries(summedLosingQuantities)) { - const entries = [] - - for (const [optionId, quantity] of Object.entries(optionQuantity)) { - if (quantity.toDecimalPlaces(0).gt(0)) { - entries.push({ - fromAccountId: accountId, - toAccountId: ammAccount.id, - assetType: 'MARKET_OPTION', - assetId: optionId, - amount: quantity, - } as const) - } - } + const entries = Object.entries(summedLosingQuantities).flatMap(([accountId, optionQuantity]) => + Object.entries(optionQuantity) + .filter(([_, quantity]) => quantity.toDecimalPlaces(0).gt(0)) + .map(([optionId, quantity]) => ({ + fromAccountId: accountId, + toAccountId: ammAccount.id, + assetType: 'MARKET_OPTION' as const, + assetId: optionId, + amount: quantity, + })) + ) - entries.length && - transactions.push( - executeTransaction({ - type: 'TRADE_LOSS', - entries, - marketId, - additionalLogic: async (txParams) => { - return Promise.all([ - ...Object.entries(optionQuantity).map(([optionId, quantity]) => { - return txParams.tx.marketOptionPosition.update({ - where: { - accountId_optionId: { - accountId, - optionId, - }, - }, - data: { - quantity: { - decrement: quantity.toNumber(), - }, - value: 0, - updatedAt: new Date(), - }, - }) - }), - updateMarketBalances({ ...txParams, marketId }), - ]) - }, - }) - ) + // Short circuit if no entries + if (entries.length === 0) { + return [] } - return Promise.all(transactions) + await executeTransaction({ + type: 'TRADE_LOSS', + entries, + marketId, + additionalLogic: async (txParams) => { + return Promise.all([ + // Batch update all positions in a single transaction + ...Object.entries(summedLosingQuantities).flatMap(([accountId, optionQuantity]) => + Object.entries(optionQuantity).map(([optionId, quantity]) => + txParams.tx.marketOptionPosition.update({ + where: { + accountId_optionId: { + accountId, + optionId, + }, + }, + data: { + quantity: { + decrement: quantity.toNumber(), + }, + value: 0, + updatedAt: new Date(), + }, + }) + ) + ), + updateMarketBalances({ ...txParams, marketId }), + ]) + }, + }) + + return entries }