diff --git a/package-lock.json b/package-lock.json index 10d8fe5..6922d82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,22 +1,22 @@ { "name": "@orionprotocol/sdk", - "version": "0.15.21", + "version": "0.15.22", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.15.21", + "version": "0.15.22", "license": "ISC", "dependencies": { - "@ethersproject/abstract-signer": "^5.6.0", - "@ethersproject/providers": "^5.6.2", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/providers": "^5.7.2", "@lukeed/csprng": "^1.0.1", "@orionprotocol/contracts": "0.0.10", "bignumber.js": "^9.0.2", "buffer": "^6.0.3", "crypto-browserify": "^3.12.0", - "ethers": "^5.6.2", + "ethers": "^5.7.2", "isomorphic-unfetch": "^3.1.0", "isomorphic-ws": "^5.0.0", "just-clone": "^5.0.1", @@ -24,11 +24,11 @@ "stream-browserify": "^3.0.0", "tiny-invariant": "^1.2.0", "uuid": "^8.3.2", - "ws": "^8.5.0", - "zod": "^3.17.3" + "ws": "^8.11.0", + "zod": "^3.20.2" }, "devDependencies": { - "@types/node": "^18.11.9", + "@types/node": "^18.11.15", "@types/socket.io-client": "1.4.33", "@types/uuid": "^8.3.4", "@types/ws": "^8.5.3", @@ -2343,9 +2343,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "version": "18.11.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", + "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==", "dev": true }, "node_modules/@types/prettier": { @@ -10694,9 +10694,9 @@ } }, "node_modules/zod": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.19.1.tgz", - "integrity": "sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA==", + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.20.2.tgz", + "integrity": "sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==", "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -12319,9 +12319,9 @@ "dev": true }, "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "version": "18.11.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", + "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==", "dev": true }, "@types/prettier": { @@ -18611,9 +18611,9 @@ "dev": true }, "zod": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.19.1.tgz", - "integrity": "sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA==" + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.20.2.tgz", + "integrity": "sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==" } } } diff --git a/package.json b/package.json index c020847..0eb2a83 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.16.0-rc.10", + "version": "0.16.0-rc.11", "description": "Orion Protocol SDK", "main": "./lib/esm/index.js", "module": "./lib/esm/index.js", diff --git a/src/services/OrionAggregator/schemas/aggregatedOrderbookSchema.ts b/src/services/OrionAggregator/schemas/aggregatedOrderbookSchema.ts index 87861a4..e9a505b 100644 --- a/src/services/OrionAggregator/schemas/aggregatedOrderbookSchema.ts +++ b/src/services/OrionAggregator/schemas/aggregatedOrderbookSchema.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { exchanges } from '../../../constants'; const orderbookElementSchema = z.object({ price: z.number(), @@ -11,7 +12,7 @@ const orderbookElementSchema = z.object({ const aggregatedOrderbookElementSchema = orderbookElementSchema .extend({ - exchanges: z.string().array(), + exchanges: z.enum(exchanges).array(), }); export const aggregatedOrderbookSchema = z.object({ diff --git a/src/services/OrionAggregator/schemas/swapInfoSchema.ts b/src/services/OrionAggregator/schemas/swapInfoSchema.ts index aa0c506..649b57a 100644 --- a/src/services/OrionAggregator/schemas/swapInfoSchema.ts +++ b/src/services/OrionAggregator/schemas/swapInfoSchema.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { exchanges } from '../../../constants'; const swapInfoBase = z.object({ id: z.string(), @@ -15,11 +16,25 @@ const swapInfoBase = z.object({ amount: z.number(), safePrice: z.number(), }).nullable(), - exchanges: z.array(z.string()), + exchanges: z.array(z.enum(exchanges)), price: z.number().nullable(), // spending asset price minAmountOut: z.number(), minAmountIn: z.number(), marketPrice: z.number().nullable(), // spending asset market price + alternatives: z.object({ // execution alternatives + exchanges: z.array(z.enum(exchanges)), + path: z.object({ + units: z.object({ + assetPair: z.string(), + action: z.string(), + }).array(), + }), + marketAmountOut: z.number().optional(), + marketAmountIn: z.number().optional(), + marketPrice: z.number(), + availableAmountIn: z.number().optional(), + availableAmountOut: z.number().optional(), + }).array(), }); const swapInfoByAmountIn = swapInfoBase.extend({ diff --git a/src/services/OrionAggregator/ws/index.ts b/src/services/OrionAggregator/ws/index.ts index ca58f78..8277b02 100644 --- a/src/services/OrionAggregator/ws/index.ts +++ b/src/services/OrionAggregator/ws/index.ts @@ -11,10 +11,11 @@ import { import UnsubscriptionType from './UnsubscriptionType'; import { SwapInfoByAmountIn, SwapInfoByAmountOut, SwapInfoBase, - FullOrder, OrderUpdate, AssetPairUpdate, OrderbookItem, Balance, Exchange, CFDBalance, + AssetPairUpdate, OrderbookItem, Balance, Exchange, CFDBalance, } from '../../../types'; import unsubscriptionDoneSchema from './schemas/unsubscriptionDoneSchema'; import assetPairConfigSchema from './schemas/assetPairConfigSchema'; +import { fullOrderSchema, orderUpdateSchema } from './schemas/addressUpdateSchema'; import cfdAddressUpdateSchema from "./schemas/cfdAddressUpdateSchema"; // import errorSchema from './schemas/errorSchema'; @@ -72,7 +73,7 @@ type AddressUpdateUpdate = { Balance > >, - order?: OrderUpdate | FullOrder + order?: z.infer | z.infer } type AddressUpdateInitial = { @@ -83,7 +84,7 @@ type AddressUpdateInitial = { Balance > >, - orders?: FullOrder[] // The field is not defined if the user has no orders + orders?: z.infer[] // The field is not defined if the user has no orders } type CfdAddressUpdateUpdate = { @@ -337,8 +338,8 @@ class OrionAggregatorWS { amountOut: json.o, price: json.p, marketPrice: json.mp, - minAmounOut: json.mao, - minAmounIn: json.ma, + minAmountOut: json.mao, + minAmountIn: json.ma, path: json.ps, exchanges: json.e, poolOptimal: json.po, @@ -350,6 +351,15 @@ class OrionAggregatorWS { safePrice: json.oi.sp, }, }, + alternatives: json.as.map((item) => ({ + exchanges: item.e, + path: item.ps, + marketAmountOut: item.mo, + marketAmountIn: item.mi, + marketPrice: item.mp, + availableAmountIn: item.aa, + availableAmountOut: item.aao, + })), }; switch (json.k) { // kind @@ -503,7 +513,7 @@ class OrionAggregatorWS { switch (json.k) { // message kind case 'i': { // initial const fullOrders = json.o - ? json.o.reduce((prev, o) => { + ? json.o.reduce[]>((prev, o) => { prev.push(o); return prev; @@ -520,7 +530,7 @@ class OrionAggregatorWS { } break; case 'u': { // update - let orderUpdate: OrderUpdate | FullOrder | undefined; + let orderUpdate: z.infer | z.infer | undefined; if (json.o) { const firstOrder = json.o[0]; orderUpdate = firstOrder; diff --git a/src/services/OrionAggregator/ws/schemas/addressUpdateSchema.ts b/src/services/OrionAggregator/ws/schemas/addressUpdateSchema.ts index 9404c4a..715aeb7 100644 --- a/src/services/OrionAggregator/ws/schemas/addressUpdateSchema.ts +++ b/src/services/OrionAggregator/ws/schemas/addressUpdateSchema.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { exchanges } from '../../../../constants'; import orderStatuses from '../../../../constants/orderStatuses'; import subOrderStatuses from '../../../../constants/subOrderStatuses'; import MessageType from '../MessageType'; @@ -21,7 +22,7 @@ const subOrderSchema = z.object({ a: z.number(), // amount A: z.number(), // settled amount p: z.number(), // avg weighed settlement price - e: z.string(), // exchange + e: z.enum(exchanges), // exchange b: z.string(), // broker address S: z.enum(subOrderStatuses), // status o: z.boolean(), // internal only diff --git a/src/services/OrionAggregator/ws/schemas/swapInfoSchema.ts b/src/services/OrionAggregator/ws/schemas/swapInfoSchema.ts index 488af4c..4a4088f 100644 --- a/src/services/OrionAggregator/ws/schemas/swapInfoSchema.ts +++ b/src/services/OrionAggregator/ws/schemas/swapInfoSchema.ts @@ -23,6 +23,15 @@ const swapInfoSchemaBase = baseMessageSchema.extend({ a: z.number(), // amount sp: z.number(), // safe price (with safe deviation but without slippage) }).optional(), + as: z.object({ // execution alternatives + e: z.enum(exchanges).array(), // exchanges + ps: z.string().array(), // path + mo: z.number().optional(), // market amount out + mi: z.number().optional(), // market amount in + mp: z.number(), // market price + aa: z.number().optional(), // available amount in + aao: z.number().optional(), // available amount out + }).array(), }); const swapInfoSchemaByAmountIn = swapInfoSchemaBase.extend({ diff --git a/src/types.ts b/src/types.ts index 7e29bbe..be9482b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,18 +1,6 @@ import BigNumber from 'bignumber.js'; -import { z } from 'zod'; import exchanges from './constants/exchanges'; import subOrderStatuses from './constants/subOrderStatuses'; -import { fullOrderSchema, orderUpdateSchema } from './services/OrionAggregator/ws/schemas/addressUpdateSchema'; - -export type OrderbookItem = { - price: string, - amount: string, - exchanges: string[], - vob: { - side: 'BUY' | 'SELL', - pairName: string - }[] -} export type AssetPairUpdate = { minQty: number, @@ -29,9 +17,6 @@ export type SubOrder = { side: 'BUY' | 'SELL', subOrdQty: number } -export type FullOrder = z.infer; - -export type OrderUpdate = z.infer; export type Balance = { tradable: string, @@ -114,43 +99,6 @@ export interface Pair { vol24h: string; } -export type SwapInfoBase = { - swapRequestId: string, - assetIn: string, - assetOut: string, - amountIn: number, - amountOut: number, - minAmounIn: number, - minAmounOut: number, - - path: string[], - exchanges?: string[], - poolOptimal: boolean, - - price?: number, - marketPrice?: number, - orderInfo?: { - pair: string, - side: 'BUY' | 'SELL', - amount: number, - safePrice: number, - } -} - -export type SwapInfoByAmountIn = SwapInfoBase & { - kind: 'exactSpend', - availableAmountIn?: number, - marketAmountOut?: number, -} - -export type SwapInfoByAmountOut = SwapInfoBase & { - kind: 'exactReceive', - marketAmountIn?: number, - availableAmountOut?: number, -} - -export type SwapInfo = SwapInfoByAmountIn | SwapInfoByAmountOut; - export enum SupportedChainId { MAINNET = '1', ROPSTEN = '3', @@ -213,6 +161,64 @@ export type BalanceIssue = { export type Exchange = typeof exchanges[number]; +export type OrderbookItem = { + price: string, + amount: string, + exchanges: Exchange[], + vob: { + side: 'BUY' | 'SELL', + pairName: string + }[] +} + +export type SwapInfoAlternative = { + exchanges: Exchange[], + path: string[], + marketAmountOut?: number, + marketAmountIn?: number, + marketPrice: number, + availableAmountIn?: number, + availableAmountOut?: number, +} + +export type SwapInfoBase = { + swapRequestId: string, + assetIn: string, + assetOut: string, + amountIn: number, + amountOut: number, + minAmountIn: number, + minAmountOut: number, + + path: string[], + exchanges?: Exchange[], + poolOptimal: boolean, + + price?: number, + marketPrice?: number, + orderInfo?: { + pair: string, + side: 'BUY' | 'SELL', + amount: number, + safePrice: number, + }, + alternatives: SwapInfoAlternative[], +} + +export type SwapInfoByAmountIn = SwapInfoBase & { + kind: 'exactSpend', + availableAmountIn?: number, + marketAmountOut?: number, +} + +export type SwapInfoByAmountOut = SwapInfoBase & { + kind: 'exactReceive', + marketAmountIn?: number, + availableAmountOut?: number, +} + +export type SwapInfo = SwapInfoByAmountIn | SwapInfoByAmountOut; + export enum HistoryTransactionStatus { PENDING = 'Pending', DONE = 'Done',