From ca5300d8f354fe3611a09e913390730c4d9a692d Mon Sep 17 00:00:00 2001 From: don mosites Date: Mon, 15 Jan 2024 11:26:02 +0100 Subject: [PATCH] indexing updates to types and server library (#1259) --- source/pool/package.json | 2 +- source/swap-erc20/package.json | 2 +- source/swap/package.json | 2 +- source/wrapper/package.json | 2 +- tools/libraries/package.json | 2 +- tools/libraries/src/Server.ts | 122 ++++++---------------------- tools/libraries/test/Server.test.ts | 102 +++++++---------------- tools/metadata/package.json | 2 +- tools/types/package.json | 2 +- tools/types/src/server.ts | 52 +++++------- tools/utils/package.json | 2 +- 11 files changed, 80 insertions(+), 212 deletions(-) diff --git a/source/pool/package.json b/source/pool/package.json index e2e52b172..c17d636c7 100644 --- a/source/pool/package.json +++ b/source/pool/package.json @@ -33,7 +33,7 @@ "devDependencies": { "@airswap/constants": "4.1.8", "@airswap/metadata": "4.1.15", - "@airswap/types": "4.1.3", + "@airswap/types": "4.1.4", "@airswap/utils": "4.1.12", "prompt-confirm": "^2.0.4" }, diff --git a/source/swap-erc20/package.json b/source/swap-erc20/package.json index 90b6351bd..8c1bac52a 100644 --- a/source/swap-erc20/package.json +++ b/source/swap-erc20/package.json @@ -31,7 +31,7 @@ "devDependencies": { "@airswap/constants": "4.1.8", "@airswap/staking": "4.0.5", - "@airswap/types": "4.1.3", + "@airswap/types": "4.1.4", "@airswap/utils": "4.1.12", "prompt-confirm": "^2.0.4" }, diff --git a/source/swap/package.json b/source/swap/package.json index 53df5f677..47c0fdd5a 100644 --- a/source/swap/package.json +++ b/source/swap/package.json @@ -33,7 +33,7 @@ }, "devDependencies": { "@airswap/constants": "4.1.8", - "@airswap/types": "4.1.3", + "@airswap/types": "4.1.4", "@airswap/utils": "4.1.12", "@nomicfoundation/hardhat-network-helpers": "^1.0.7" }, diff --git a/source/wrapper/package.json b/source/wrapper/package.json index 89ffd21cd..7f168aa0e 100644 --- a/source/wrapper/package.json +++ b/source/wrapper/package.json @@ -34,7 +34,7 @@ "devDependencies": { "@airswap/constants": "4.1.8", "@airswap/utils": "4.1.12", - "@airswap/types": "4.1.3", + "@airswap/types": "4.1.4", "@uniswap/v2-periphery": "^1.1.0-beta.0", "prompt-confirm": "^2.0.4" }, diff --git a/tools/libraries/package.json b/tools/libraries/package.json index 6c5e8fcb6..7879b24cf 100644 --- a/tools/libraries/package.json +++ b/tools/libraries/package.json @@ -34,7 +34,7 @@ "@airswap/staking": "4.0.5", "@airswap/swap": "4.1.2", "@airswap/swap-erc20": "4.1.6", - "@airswap/types": "4.1.3", + "@airswap/types": "4.1.4", "@airswap/utils": "4.1.12", "@airswap/wrapper": "4.1.5", "browser-or-node": "^2.1.1", diff --git a/tools/libraries/src/Server.ts b/tools/libraries/src/Server.ts index 7b6928666..c47e992d9 100644 --- a/tools/libraries/src/Server.ts +++ b/tools/libraries/src/Server.ts @@ -23,11 +23,11 @@ import { OrderERC20, Pricing, ServerOptions, - OrderResponse, SupportedProtocolInfo, OrderFilter, - SortOrder, - SortField, + OrderResponse, + Indexes, + Direction, } from '@airswap/types' import { ChainIds, Protocols, protocolNames } from '@airswap/constants' @@ -40,80 +40,8 @@ if (!isBrowser) { }) } -const REQUEST_TIMEOUT = 4000 - -export function toSortOrder(key: string): SortOrder | undefined { - if (typeof key !== 'string') { - return undefined - } - if (key.toUpperCase() === SortOrder.ASC) { - return SortOrder.ASC - } - if (key.toUpperCase() === SortOrder.DESC) { - return SortOrder.DESC - } - - return undefined -} - -export function toSortField(key: string): SortField | undefined { - if (typeof key !== 'string') { - return undefined - } - key = key.toUpperCase() - if (Object.keys(SortField).includes(key)) { - return key as SortField - } - - return undefined -} - -export abstract class IndexedOrderError extends Error { - public code!: number - public constructor(message: string) { - super(message) - this.message = message - } -} -export class ErrorResponse { - public code: number - public message: string - public constructor(code: number, message: string) { - this.code = code - this.message = message - } -} -export class SuccessResponse { - public message: string - public constructor(message: string) { - this.message = message - } -} -export class JsonRpcResponse { - public id: string - public result: - | OrderResponse - | ErrorResponse - | SuccessResponse - | undefined - private jsonrpc = '2.0' - - public constructor( - id: string, - result: - | OrderResponse - | IndexedOrderError - | SuccessResponse - | undefined - ) { - this.id = id - if (result instanceof Error) { - this.result = new ErrorResponse(result.code, result.message) - } else { - this.result = result - } - } -} +const DEFAULT_LIMIT = 10 +const DEFAULT_TIMEOUT = 4000 export interface ServerEvents { 'pricing-erc20': (pricing: Pricing[]) => void @@ -331,12 +259,10 @@ export class Server extends TypedEmitter { /** * Protocols.IndexingERC20 */ - public async addOrderERC20( - fullOrder: FullOrderERC20 - ): Promise { + public async addOrderERC20(fullOrder: FullOrderERC20): Promise { try { return Promise.resolve( - (await this.httpCall('addOrderERC20', [fullOrder])) as SuccessResponse + (await this.httpCall('addOrderERC20', [fullOrder])) as boolean ) } catch (err) { return Promise.reject(err) @@ -345,10 +271,10 @@ export class Server extends TypedEmitter { public async getOrdersERC20( orderFilter: OrderFilter, - offset: number, - limit: number, - sortField?: SortField, - sortOrder?: SortOrder + offset = 0, + limit = DEFAULT_LIMIT, + by = Indexes.EXPIRY, + direction = Direction.ASC ): Promise> { try { return Promise.resolve( @@ -356,8 +282,8 @@ export class Server extends TypedEmitter { { ...this.toBigIntJson(orderFilter) }, offset, limit, - sortField, - sortOrder, + by, + direction, ])) as OrderResponse ) } catch (err) { @@ -368,10 +294,10 @@ export class Server extends TypedEmitter { /** * Protocols.Indexing */ - public async addOrder(order: FullOrder): Promise { + public async addOrder(order: FullOrder): Promise { try { return Promise.resolve( - (await this.httpCall('addOrder', [order])) as SuccessResponse + (await this.httpCall('addOrder', [order])) as boolean ) } catch (err) { return Promise.reject(err) @@ -380,10 +306,10 @@ export class Server extends TypedEmitter { public async getOrders( orderFilter: OrderFilter, - offset: number, - limit: number, - sortField?: SortField, - sortOrder?: SortOrder + offset = 0, + limit = DEFAULT_LIMIT, + by = Indexes.NONCE, + direction = Direction.ASC ): Promise> { try { return Promise.resolve( @@ -391,8 +317,8 @@ export class Server extends TypedEmitter { { ...this.toBigIntJson(orderFilter) }, offset, limit, - sortField, - sortOrder, + by, + direction, ])) as OrderResponse ) } catch (err) { @@ -419,7 +345,7 @@ export class Server extends TypedEmitter { } } - private _init(initializeTimeout: number = REQUEST_TIMEOUT) { + private _init(initializeTimeout: number = DEFAULT_TIMEOUT) { if (this.transportProtocol === 'http') { return this._initHTTPClient(this.locator) } else { @@ -435,7 +361,7 @@ export class Server extends TypedEmitter { hostname: parsedUrl.hostname, path: parsedUrl.path, port: parsedUrl.port, - timeout: REQUEST_TIMEOUT, + timeout: DEFAULT_TIMEOUT, } if (!clientOnly) { @@ -483,7 +409,7 @@ export class Server extends TypedEmitter { (resolve, reject) => { this.webSocketClient = new JsonRpcWebsocket( url.format(locator), - REQUEST_TIMEOUT, + DEFAULT_TIMEOUT, (error: JsonRpcError) => { if (!this.isInitialized) { reject(error) diff --git a/tools/libraries/test/Server.test.ts b/tools/libraries/test/Server.test.ts index a181e3d6d..24307112e 100644 --- a/tools/libraries/test/Server.test.ts +++ b/tools/libraries/test/Server.test.ts @@ -16,7 +16,6 @@ import { import { ADDRESS_ZERO, ChainIds, Protocols } from '@airswap/constants' import { Server } from '../index' -import { toSortField, toSortOrder } from '../index' import { addJSONRPCAssertions, createRequest, @@ -24,7 +23,7 @@ import { MockSocketServer, nextEvent, } from './test-utils' -import { OrderERC20, SortField, SortOrder, Levels } from '@airswap/types' +import { OrderERC20, Levels } from '@airswap/types' import { JsonRpcErrorCodes } from '@airswap/jsonrpc-client-websocket' addJSONRPCAssertions() @@ -91,10 +90,8 @@ function mockHttpServer(api) { order, wallet.privateKey, params.swapContract, - ChainIds.MAINNET + ChainIds.SEPOLIA )), - chainId: ChainIds.MAINNET, - swapContract: params.swapContract, } break case 'getOrdersERC20': @@ -102,27 +99,36 @@ function mockHttpServer(api) { res = { orders: [ { - order: { - ...order, - ...(await createOrderERC20Signature( - order, - wallet.privateKey, - ADDRESS_ZERO, - ChainIds.MAINNET - )), - chainId: ChainIds.MAINNET, - swapContract: ADDRESS_ZERO, - }, + ...order, + ...(await createOrderERC20Signature( + order, + wallet.privateKey, + ADDRESS_ZERO, + ChainIds.SEPOLIA + )), + chainId: ChainIds.SEPOLIA, + swapContract: ADDRESS_ZERO, }, ], } break case 'getOrders': - if (params[0]['offset']) { - expect(params[0]['page']).to.equal(0) - expect(params[0]['signerAddress']).to.equal(ADDRESS_ZERO) + order = createOrder({}) + res = { + orders: [ + { + ...order, + ...(await createOrderSignature( + order, + wallet.privateKey, + ADDRESS_ZERO, + ChainIds.SEPOLIA + )), + chainId: ChainIds.SEPOLIA, + swapContract: ADDRESS_ZERO, + }, + ], } - res = await forgeFullOrder() break case 'considerOrderERC20': res = true @@ -185,7 +191,7 @@ describe('HTTPServer', () => { 0, 100 ) - expect(isValidFullOrderERC20(result.orders[0].order)).to.be.true + expect(isValidFullOrderERC20(result.orders[0])).to.be.true }) fancy .nock('https://' + URL, mockHttpServer) @@ -198,7 +204,7 @@ describe('HTTPServer', () => { 0, 100 ) - expect(isValidFullOrder(result.orders[0].order)).to.be.true + expect(isValidFullOrder(result.orders[0])).to.be.true }) }) @@ -503,55 +509,3 @@ describe('WebSocketServer', () => { MockSocketServer.stopMockingWebSocket() }) }) - -describe('Indexing', () => { - it('sort field: should match value', () => { - expect(toSortField('SENDER_AMOUNT')).to.equal(SortField.SENDER_AMOUNT) - expect(toSortField('sender_amount')).to.equal(SortField.SENDER_AMOUNT) - expect(toSortField('SIGNER_AMOUNT')).to.equal(SortField.SIGNER_AMOUNT) - expect(toSortField('signer_amount')).to.equal(SortField.SIGNER_AMOUNT) - expect(toSortField('EXPIRY')).to.equal(SortField.EXPIRY) - expect(toSortField('expiry')).to.equal(SortField.EXPIRY) - expect(toSortField('nonce')).to.equal(SortField.NONCE) - expect(toSortField('NONCE')).to.equal(SortField.NONCE) - }) - - it('sort field: should return undefined', () => { - expect(toSortField('')).to.equal(undefined) - expect(toSortField('aze')).to.equal(undefined) - }) - - it('sort order: should match value', () => { - expect(toSortOrder('ASC')).to.equal(SortOrder.ASC) - expect(toSortOrder('asc')).to.equal(SortOrder.ASC) - expect(toSortOrder('DESC')).to.equal(SortOrder.DESC) - expect(toSortOrder('desc')).to.equal(SortOrder.DESC) - }) - - it('sort order: should return undefined', () => { - expect(toSortOrder('')).to.equal(undefined) - expect(toSortOrder('aze')).to.equal(undefined) - }) -}) - -async function forgeFullOrder() { - const unsignedOrder = createOrder({}) - const signature = await createOrderSignature( - unsignedOrder, - wallet.privateKey, - ADDRESS_ZERO, - 1 - ) - return { - orders: [ - { - order: { - ...unsignedOrder, - ...signature, - chainId: ChainIds.MAINNET, - swapContract: ADDRESS_ZERO, - }, - }, - ], - } -} diff --git a/tools/metadata/package.json b/tools/metadata/package.json index c3b903b58..caaa96eff 100644 --- a/tools/metadata/package.json +++ b/tools/metadata/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@airswap/constants": "4.1.8", - "@airswap/types": "4.1.3", + "@airswap/types": "4.1.4", "@airswap/wrapper": "4.1.5", "@openzeppelin/contracts": "^4.8.3", "@uniswap/token-lists": "^1.0.0-beta.24", diff --git a/tools/types/package.json b/tools/types/package.json index f0494a204..886ad8a50 100644 --- a/tools/types/package.json +++ b/tools/types/package.json @@ -1,6 +1,6 @@ { "name": "@airswap/types", - "version": "4.1.3", + "version": "4.1.4", "description": "AirSwap: Types for Developers", "repository": { "type": "git", diff --git a/tools/types/src/server.ts b/tools/types/src/server.ts index 6e9f807a7..57641920c 100644 --- a/tools/types/src/server.ts +++ b/tools/types/src/server.ts @@ -10,27 +10,6 @@ export type SupportedProtocolInfo = { params?: any } -export enum SortField { - SIGNER_AMOUNT = 'SIGNER_AMOUNT', - SENDER_AMOUNT = 'SENDER_AMOUNT', - EXPIRY = 'EXPIRY', - NONCE = 'NONCE', -} - -export enum SortOrder { - ASC = 'ASC', - DESC = 'DESC', -} - -export type OrderFilter = { - chainId?: number - signerWallet?: string - signerToken?: string - signerId?: string - senderWallet?: string - senderToken?: string -} - export type OrderERC20Filter = { chainId?: number signerWallet?: string @@ -39,19 +18,28 @@ export type OrderERC20Filter = { senderToken?: string } -export type IndexedOrder = { - hash?: string | undefined - order: Type - addedOn: number +export type OrderFilter = { + signerId?: string +} & OrderERC20Filter + +export type OrderResponse = { + orders: OrderType[] + offset: number + limit: number } -export type OrderResponse = { - orders: Record> - pagination: Pagination +export enum Indexes { + NONCE = 'nonce', + EXPIRY = 'expiry', + SIGNER_WALLET = 'signerWallet', + SIGNER_TOKEN = 'signerToken', + SIGNER_AMOUNT = 'signerAmount', + SIGNER_ID = 'signerId', + SENDER_TOKEN = 'senderToken', + SENDER_AMOUNT = 'senderAmount', } -export type Pagination = { - limit: number - offset: number - total: number +export enum Direction { + ASC = 'asc', + DESC = 'desc', } diff --git a/tools/utils/package.json b/tools/utils/package.json index 0a88ae5b0..88b50d24e 100644 --- a/tools/utils/package.json +++ b/tools/utils/package.json @@ -22,7 +22,7 @@ }, "dependencies": { "@airswap/constants": "4.1.8", - "@airswap/types": "4.1.3", + "@airswap/types": "4.1.4", "@metamask/eth-sig-util": "^5.0.2", "bignumber.js": "^9.0.1", "ethereumjs-util": "^7.1.5",