From d5800dfe87b02eff8847ba8d7d105dbb9de1d479 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Mon, 27 Jun 2022 07:05:15 -0700 Subject: [PATCH] Fix logic bug in FR market validation --- functions/src/resolve-market.ts | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/functions/src/resolve-market.ts b/functions/src/resolve-market.ts index dbb4df8f..9beb71c7 100644 --- a/functions/src/resolve-market.ts +++ b/functions/src/resolve-market.ts @@ -26,10 +26,15 @@ const binarySchema = z.object({ probabilityInt: z.number().gte(0).lt(100).optional(), }) -const freeResponseSchema = z.object({ - outcome: z.union([z.enum(['MKT', 'CANCEL']), z.string()]), - resolutions: z.map(z.string(), z.number()).optional(), -}) +const freeResponseSchema = z.union([ + z.object({ + outcome: z.union([z.enum(['CANCEL']), z.number()]), + }), + z.object({ + outcome: z.enum(['MKT']), + resolutions: z.map(z.string(), z.number()), + }), +]) const numericSchema = z.object({ outcome: z.union([z.enum(['CANCEL']), z.string()]), @@ -209,14 +214,16 @@ function getResolutionParams(outcomeType: string, body: string) { probabilityInt: undefined, } } else if (outcomeType === 'FREE_RESPONSE') { - const { outcome, resolutions } = validate(freeResponseSchema, body) - if (!(outcome === 'MKT' && resolutions)) - throw new APIError( - 400, - 'Resolutions cannot be specified with MKT outcome' - ) + const freeResponseParams = validate(freeResponseSchema, body) + const { outcome } = freeResponseParams + const resolutions = + 'resolutions' in freeResponseParams + ? freeResponseParams.resolutions + : undefined return { - outcome, + // Free Response outcome IDs are numbers by convention, + // but treated as strings everywhere else. + outcome: outcome.toString(), resolutions, value: undefined, probabilityInt: undefined,