diff --git a/package.json b/package.json index a1b0ed3..f9bbd06 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.17.12", + "version": "0.17.13", "description": "Orion Protocol SDK", "main": "./lib/esm/index.js", "module": "./lib/esm/index.js", diff --git a/src/services/OrionAggregator/schemas/orderSchema.ts b/src/services/OrionAggregator/schemas/orderSchema.ts index e8f0a6a..0601051 100644 --- a/src/services/OrionAggregator/schemas/orderSchema.ts +++ b/src/services/OrionAggregator/schemas/orderSchema.ts @@ -29,7 +29,7 @@ const blockchainOrderSchema = z.object({ buySide: z.union([z.literal(1), z.literal(0)]), signature: z.string().refine(ethers.utils.isHexString, (value) => ({ message: `blockchainOrder.signature must be a hex string, got ${value}`, - })), + })).nullable(), isPersonalSign: z.boolean(), needWithdraw: z.boolean(), }); @@ -41,8 +41,8 @@ const tradeInfoSchema = z.object({ price: z.number().nonnegative(), creationTime: z.number(), updateTime: z.number(), - matchedBlockchainOrder: blockchainOrderSchema, - matchedSubOrderId: z.number().int().nonnegative(), + matchedBlockchainOrder: blockchainOrderSchema.optional(), + matchedSubOrderId: z.number().int().nonnegative().optional(), exchangeTradeInfo: z.boolean(), poolTradeInfo: z.boolean(), }); @@ -60,6 +60,9 @@ const baseOrderSchema = z.object({ internalOnly: z.boolean(), }) +const selfBrokers = exchanges.map((exchange) => `SELF_BROKER_${exchange}` as const); +type SelfBroker = typeof selfBrokers[number]; +const isSelfBroker = (value: string): value is SelfBroker => selfBrokers.some((broker) => broker === value); const subOrderSchema = baseOrderSchema.extend({ price: z.number(), id: z.number(), @@ -68,9 +71,17 @@ const subOrderSchema = baseOrderSchema.extend({ })), exchange: z.enum(exchanges), brokerAddress: - z.literal('ORION_BROKER').or(z.string().refine(ethers.utils.isAddress, (value) => ({ - message: `subOrder.subOrders.[n].brokerAddress must be an address, got ${value}`, - }))), + // https://github.com/orionprotocol/orion-aggregator/blob/98f543e59b7bbf14d8db0417c6af5cf7575f3956/src/main/java/io/orionprotocol/aggregator/model/Exchange.java#L116 + z.enum(['ORION_BROKER', 'SELF_BROKER']) + .or(z.custom((value) => { + if (typeof value === 'string' && isSelfBroker(value)) { + return true; + } + return false; + })) + .or(z.string().refine(ethers.utils.isAddress, (value) => ({ + message: `subOrder.subOrders.[n].brokerAddress must be an address, got ${value}`, + }))), tradesInfo: z.record( z.string().uuid(), tradeInfoSchema