diff options
Diffstat (limited to 'packages/json-schemas')
34 files changed, 704 insertions, 685 deletions
diff --git a/packages/json-schemas/CHANGELOG.json b/packages/json-schemas/CHANGELOG.json index 33cf126e3..6017b2f2b 100644 --- a/packages/json-schemas/CHANGELOG.json +++ b/packages/json-schemas/CHANGELOG.json @@ -5,6 +5,10 @@ { "note": "Change hexSchema to match `0x`", "pr": 937 + }, + { + "note": "Upgrade Relayer API schemas for relayer API V2", + "pr": 916 } ] }, diff --git a/packages/json-schemas/schemas/basic_type_schemas.ts b/packages/json-schemas/schemas/basic_type_schemas.ts index 301f9ec73..a59afaef8 100644 --- a/packages/json-schemas/schemas/basic_type_schemas.ts +++ b/packages/json-schemas/schemas/basic_type_schemas.ts @@ -1,17 +1,17 @@ export const addressSchema = { - id: '/Address', + id: '/addressSchema', type: 'string', pattern: '^0x[0-9a-f]{40}$', }; export const hexSchema = { - id: '/Hex', + id: '/hexSchema', type: 'string', pattern: '^0x(([0-9a-f][0-9a-f])+)?$', }; export const numberSchema = { - id: '/Number', + id: '/numberSchema', type: 'string', pattern: '^\\d+(\\.\\d+)?$', }; diff --git a/packages/json-schemas/schemas/block_range_schema.ts b/packages/json-schemas/schemas/block_range_schema.ts index 1f6a63151..9eb242fc6 100644 --- a/packages/json-schemas/schemas/block_range_schema.ts +++ b/packages/json-schemas/schemas/block_range_schema.ts @@ -1,5 +1,5 @@ export const blockParamSchema = { - id: '/BlockParam', + id: '/blockParamSchema', oneOf: [ { type: 'number', @@ -11,10 +11,10 @@ export const blockParamSchema = { }; export const blockRangeSchema = { - id: '/BlockRange', + id: '/blockRangeSchema', properties: { - fromBlock: { $ref: '/BlockParam' }, - toBlock: { $ref: '/BlockParam' }, + fromBlock: { $ref: '/blockParamSchema' }, + toBlock: { $ref: '/blockParamSchema' }, }, type: 'object', }; diff --git a/packages/json-schemas/schemas/call_data_schema.ts b/packages/json-schemas/schemas/call_data_schema.ts index b9d00ad2a..4c77d9f9d 100644 --- a/packages/json-schemas/schemas/call_data_schema.ts +++ b/packages/json-schemas/schemas/call_data_schema.ts @@ -1,16 +1,16 @@ export const callDataSchema = { - id: '/CallData', + id: '/callDataSchema', properties: { - from: { $ref: '/Address' }, - to: { $ref: '/Address' }, + from: { $ref: '/addressSchema' }, + to: { $ref: '/addressSchema' }, value: { - oneOf: [{ $ref: '/Number' }, { $ref: '/JsNumber' }], + oneOf: [{ $ref: '/numberSchema' }, { $ref: '/jsNumber' }], }, gas: { - oneOf: [{ $ref: '/Number' }, { $ref: '/JsNumber' }], + oneOf: [{ $ref: '/numberSchema' }, { $ref: '/jsNumber' }], }, gasPrice: { - oneOf: [{ $ref: '/Number' }, { $ref: '/JsNumber' }], + oneOf: [{ $ref: '/numberSchema' }, { $ref: '/jsNumber' }], }, data: { type: 'string', diff --git a/packages/json-schemas/schemas/ec_signature_schema.ts b/packages/json-schemas/schemas/ec_signature_schema.ts index 71b840dd8..c59532f09 100644 --- a/packages/json-schemas/schemas/ec_signature_schema.ts +++ b/packages/json-schemas/schemas/ec_signature_schema.ts @@ -1,5 +1,5 @@ export const ecSignatureParameterSchema = { - id: '/ECSignatureParameter', + id: '/ecSignatureParameterSchema', type: 'string', pattern: '^0[xX][0-9A-Fa-f]{64}$', }; @@ -12,8 +12,8 @@ export const ecSignatureSchema = { minimum: 27, maximum: 28, }, - r: { $ref: '/ECSignatureParameter' }, - s: { $ref: '/ECSignatureParameter' }, + r: { $ref: '/ecSignatureParameterSchema' }, + s: { $ref: '/ecSignatureParameterSchema' }, }, required: ['v', 'r', 's'], type: 'object', diff --git a/packages/json-schemas/schemas/index_filter_values_schema.ts b/packages/json-schemas/schemas/index_filter_values_schema.ts index 3374d63e0..f3c8cef68 100644 --- a/packages/json-schemas/schemas/index_filter_values_schema.ts +++ b/packages/json-schemas/schemas/index_filter_values_schema.ts @@ -1,7 +1,7 @@ export const indexFilterValuesSchema = { - id: '/IndexFilterValues', + id: '/indexFilterValuesSchema', additionalProperties: { - oneOf: [{ $ref: '/Number' }, { $ref: '/Address' }, { $ref: '/OrderHashSchema' }], + oneOf: [{ $ref: '/numberSchema' }, { $ref: '/addressSchema' }, { $ref: '/orderHashSchema' }], }, type: 'object', }; diff --git a/packages/json-schemas/schemas/order_cancel_schema.ts b/packages/json-schemas/schemas/order_cancel_schema.ts index ad23d01cc..e4edfbca9 100644 --- a/packages/json-schemas/schemas/order_cancel_schema.ts +++ b/packages/json-schemas/schemas/order_cancel_schema.ts @@ -1,10 +1,10 @@ export const orderCancellationRequestsSchema = { - id: '/OrderCancellationRequests', + id: '/orderCancellationRequestsSchema', type: 'array', items: { properties: { - order: { $ref: '/Order' }, - takerTokenCancelAmount: { $ref: '/Number' }, + order: { $ref: '/orderSchema' }, + takerTokenCancelAmount: { $ref: '/numberSchema' }, }, required: ['order', 'takerTokenCancelAmount'], type: 'object', diff --git a/packages/json-schemas/schemas/order_fill_or_kill_requests_schema.ts b/packages/json-schemas/schemas/order_fill_or_kill_requests_schema.ts index 61f2c8849..e2c18ef0a 100644 --- a/packages/json-schemas/schemas/order_fill_or_kill_requests_schema.ts +++ b/packages/json-schemas/schemas/order_fill_or_kill_requests_schema.ts @@ -1,10 +1,10 @@ export const orderFillOrKillRequestsSchema = { - id: '/OrderFillOrKillRequests', + id: '/orderFillOrKillRequestsSchema', type: 'array', items: { properties: { - signedOrder: { $ref: '/SignedOrder' }, - fillTakerAmount: { $ref: '/Number' }, + signedOrder: { $ref: '/signedOrderSchema' }, + fillTakerAmount: { $ref: '/numberSchema' }, }, required: ['signedOrder', 'fillTakerAmount'], type: 'object', diff --git a/packages/json-schemas/schemas/order_fill_requests_schema.ts b/packages/json-schemas/schemas/order_fill_requests_schema.ts index 419d0670f..ea8b35e54 100644 --- a/packages/json-schemas/schemas/order_fill_requests_schema.ts +++ b/packages/json-schemas/schemas/order_fill_requests_schema.ts @@ -1,10 +1,10 @@ export const orderFillRequestsSchema = { - id: '/OrderFillRequests', + id: '/orderFillRequestsSchema', type: 'array', items: { properties: { - signedOrder: { $ref: '/SignedOrder' }, - takerTokenFillAmount: { $ref: '/Number' }, + signedOrder: { $ref: '/signedOrderSchema' }, + takerTokenFillAmount: { $ref: '/numberSchema' }, }, required: ['signedOrder', 'takerTokenFillAmount'], type: 'object', diff --git a/packages/json-schemas/schemas/order_hash_schema.ts b/packages/json-schemas/schemas/order_hash_schema.ts index 6af06927f..9773a88f9 100644 --- a/packages/json-schemas/schemas/order_hash_schema.ts +++ b/packages/json-schemas/schemas/order_hash_schema.ts @@ -1,5 +1,5 @@ export const orderHashSchema = { - id: '/OrderHashSchema', + id: '/orderHashSchema', type: 'string', pattern: '^0x[0-9a-fA-F]{64}$', }; diff --git a/packages/json-schemas/schemas/order_schemas.ts b/packages/json-schemas/schemas/order_schemas.ts index dcbfde6e0..eb7fdaf5a 100644 --- a/packages/json-schemas/schemas/order_schemas.ts +++ b/packages/json-schemas/schemas/order_schemas.ts @@ -1,19 +1,19 @@ export const orderSchema = { - id: '/Order', + id: '/orderSchema', properties: { - makerAddress: { $ref: '/Address' }, - takerAddress: { $ref: '/Address' }, - makerFee: { $ref: '/Number' }, - takerFee: { $ref: '/Number' }, - senderAddress: { $ref: '/Address' }, - makerAssetAmount: { $ref: '/Number' }, - takerAssetAmount: { $ref: '/Number' }, - makerAssetData: { $ref: '/Hex' }, - takerAssetData: { $ref: '/Hex' }, - salt: { $ref: '/Number' }, - exchangeAddress: { $ref: '/Address' }, - feeRecipientAddress: { $ref: '/Address' }, - expirationTimeSeconds: { $ref: '/Number' }, + makerAddress: { $ref: '/addressSchema' }, + takerAddress: { $ref: '/addressSchema' }, + makerFee: { $ref: '/numberSchema' }, + takerFee: { $ref: '/numberSchema' }, + senderAddress: { $ref: '/addressSchema' }, + makerAssetAmount: { $ref: '/numberSchema' }, + takerAssetAmount: { $ref: '/numberSchema' }, + makerAssetData: { $ref: '/hexSchema' }, + takerAssetData: { $ref: '/hexSchema' }, + salt: { $ref: '/numberSchema' }, + exchangeAddress: { $ref: '/addressSchema' }, + feeRecipientAddress: { $ref: '/addressSchema' }, + expirationTimeSeconds: { $ref: '/numberSchema' }, }, required: [ 'makerAddress', @@ -34,12 +34,12 @@ export const orderSchema = { }; export const signedOrderSchema = { - id: '/SignedOrder', + id: '/signedOrderSchema', allOf: [ - { $ref: '/Order' }, + { $ref: '/orderSchema' }, { properties: { - signature: { $ref: '/Hex' }, + signature: { $ref: '/hexSchema' }, }, required: ['signature'], }, diff --git a/packages/json-schemas/schemas/orders_schema.ts b/packages/json-schemas/schemas/orders_schema.ts index 3ba3291a2..de0abcf00 100644 --- a/packages/json-schemas/schemas/orders_schema.ts +++ b/packages/json-schemas/schemas/orders_schema.ts @@ -1,5 +1,5 @@ export const ordersSchema = { id: '/ordersSchema', type: 'array', - items: { $ref: '/Order' }, + items: { $ref: '/orderSchema' }, }; diff --git a/packages/json-schemas/schemas/paginated_collection_schema.ts b/packages/json-schemas/schemas/paginated_collection_schema.ts new file mode 100644 index 000000000..16044c70a --- /dev/null +++ b/packages/json-schemas/schemas/paginated_collection_schema.ts @@ -0,0 +1,10 @@ +export const paginatedCollectionSchema = { + id: '/paginatedCollectionSchema', + type: 'object', + properties: { + total: { type: 'number' }, + perPage: { type: 'number' }, + page: { type: 'number' }, + }, + required: ['total', 'perPage', 'page'], +}; diff --git a/packages/json-schemas/schemas/relayer_api_asset_pairs_response_schema.ts b/packages/json-schemas/schemas/relayer_api_asset_pairs_response_schema.ts new file mode 100644 index 000000000..c13396d29 --- /dev/null +++ b/packages/json-schemas/schemas/relayer_api_asset_pairs_response_schema.ts @@ -0,0 +1,38 @@ +export const relayerApiAssetDataPairsResponseSchema = { + id: '/relayerApiAssetDataPairsResponseSchema', + type: 'object', + allOf: [ + { $ref: '/paginatedCollectionSchema' }, + { + properties: { + records: { $ref: '/relayerApiAssetDataPairsSchema' }, + }, + required: ['records'], + }, + ], +}; + +export const relayerApiAssetDataPairsSchema = { + id: '/relayerApiAssetDataPairsSchema', + type: 'array', + items: { + properties: { + assetDataA: { $ref: '/relayerApiAssetDataTradeInfoSchema' }, + assetDataB: { $ref: '/relayerApiAssetDataTradeInfoSchema' }, + }, + required: ['assetDataA', 'assetDataB'], + type: 'object', + }, +}; + +export const relayerApiAssetDataTradeInfoSchema = { + id: '/relayerApiAssetDataTradeInfoSchema', + type: 'object', + properties: { + assetData: { $ref: '/hexSchema' }, + minAmount: { $ref: '/numberSchema' }, + maxAmount: { $ref: '/numberSchema' }, + precision: { type: 'number' }, + }, + required: ['assetData'], +}; diff --git a/packages/json-schemas/schemas/relayer_api_error_response_schema.ts b/packages/json-schemas/schemas/relayer_api_error_response_schema.ts index 27fdb166f..05740aa54 100644 --- a/packages/json-schemas/schemas/relayer_api_error_response_schema.ts +++ b/packages/json-schemas/schemas/relayer_api_error_response_schema.ts @@ -1,8 +1,8 @@ export const relayerApiErrorResponseSchema = { - id: '/RelayerApiErrorResponse', + id: '/relayerApiErrorResponseSchema', type: 'object', properties: { - code: { type: 'number' }, + code: { type: 'number', minimum: 100, maximum: 103 }, reason: { type: 'string' }, validationErrors: { type: 'array', @@ -10,7 +10,7 @@ export const relayerApiErrorResponseSchema = { type: 'object', properties: { field: { type: 'string' }, - code: { type: 'number' }, + code: { type: 'number', minimum: 1000, maximum: 1006 }, reason: { type: 'string' }, }, required: ['field', 'code', 'reason'], diff --git a/packages/json-schemas/schemas/relayer_api_fees_payload_schema.ts b/packages/json-schemas/schemas/relayer_api_fees_payload_schema.ts deleted file mode 100644 index eaaf777a1..000000000 --- a/packages/json-schemas/schemas/relayer_api_fees_payload_schema.ts +++ /dev/null @@ -1,24 +0,0 @@ -export const relayerApiFeesPayloadSchema = { - id: '/RelayerApiFeesPayload', - type: 'object', - properties: { - exchangeContractAddress: { $ref: '/Address' }, - maker: { $ref: '/Address' }, - taker: { $ref: '/Address' }, - makerTokenAddress: { $ref: '/Address' }, - takerTokenAddress: { $ref: '/Address' }, - makerTokenAmount: { $ref: '/Number' }, - takerTokenAmount: { $ref: '/Number' }, - expirationUnixTimestampSec: { $ref: '/Number' }, - salt: { $ref: '/Number' }, - }, - required: [ - 'exchangeContractAddress', - 'maker', - 'taker', - 'makerTokenAddress', - 'takerTokenAddress', - 'expirationUnixTimestampSec', - 'salt', - ], -}; diff --git a/packages/json-schemas/schemas/relayer_api_fees_response_schema.ts b/packages/json-schemas/schemas/relayer_api_fees_response_schema.ts deleted file mode 100644 index e7440613f..000000000 --- a/packages/json-schemas/schemas/relayer_api_fees_response_schema.ts +++ /dev/null @@ -1,10 +0,0 @@ -export const relayerApiFeesResponseSchema = { - id: '/RelayerApiFeesResponse', - type: 'object', - properties: { - makerFee: { $ref: '/Number' }, - takerFee: { $ref: '/Number' }, - feeRecipient: { $ref: '/Address' }, - }, - required: ['makerFee', 'takerFee', 'feeRecipient'], -}; diff --git a/packages/json-schemas/schemas/relayer_api_orberbook_channel_subscribe_schema.ts b/packages/json-schemas/schemas/relayer_api_orberbook_channel_subscribe_schema.ts deleted file mode 100644 index d93fa73d6..000000000 --- a/packages/json-schemas/schemas/relayer_api_orberbook_channel_subscribe_schema.ts +++ /dev/null @@ -1,23 +0,0 @@ -export const relayerApiOrderbookChannelSubscribeSchema = { - id: '/RelayerApiOrderbookChannelSubscribe', - type: 'object', - properties: { - type: { enum: ['subscribe'] }, - channel: { enum: ['orderbook'] }, - requestId: { type: 'number' }, - payload: { $ref: '/RelayerApiOrderbookChannelSubscribePayload' }, - }, - required: ['type', 'channel', 'requestId', 'payload'], -}; - -export const relayerApiOrderbookChannelSubscribePayload = { - id: '/RelayerApiOrderbookChannelSubscribePayload', - type: 'object', - properties: { - baseTokenAddress: { $ref: '/Address' }, - quoteTokenAddress: { $ref: '/Address' }, - snapshot: { type: 'boolean' }, - limit: { type: 'number' }, - }, - required: ['baseTokenAddress', 'quoteTokenAddress'], -}; diff --git a/packages/json-schemas/schemas/relayer_api_order_config_payload_schema.ts b/packages/json-schemas/schemas/relayer_api_order_config_payload_schema.ts new file mode 100644 index 000000000..8d1d408d6 --- /dev/null +++ b/packages/json-schemas/schemas/relayer_api_order_config_payload_schema.ts @@ -0,0 +1,24 @@ +export const relayerApiOrderConfigPayloadSchema = { + id: '/relayerApiOrderConfigPayloadSchema', + type: 'object', + properties: { + makerAddress: { $ref: '/addressSchema' }, + takerAddress: { $ref: '/addressSchema' }, + makerAssetAmount: { $ref: '/numberSchema' }, + takerAssetAmount: { $ref: '/numberSchema' }, + makerAssetData: { $ref: '/hexSchema' }, + takerAssetData: { $ref: '/hexSchema' }, + exchangeAddress: { $ref: '/addressSchema' }, + expirationTimeSeconds: { $ref: '/numberSchema' }, + }, + required: [ + 'makerAddress', + 'takerAddress', + 'makerAssetAmount', + 'takerAssetAmount', + 'makerAssetData', + 'takerAssetData', + 'exchangeAddress', + 'expirationTimeSeconds', + ], +}; diff --git a/packages/json-schemas/schemas/relayer_api_order_config_response_schema.ts b/packages/json-schemas/schemas/relayer_api_order_config_response_schema.ts new file mode 100644 index 000000000..390d0b262 --- /dev/null +++ b/packages/json-schemas/schemas/relayer_api_order_config_response_schema.ts @@ -0,0 +1,11 @@ +export const relayerApiOrderConfigResponseSchema = { + id: '/relayerApiOrderConfigResponseSchema', + type: 'object', + properties: { + makerFee: { $ref: '/numberSchema' }, + takerFee: { $ref: '/numberSchema' }, + feeRecipientAddress: { $ref: '/addressSchema' }, + senderAddress: { $ref: '/addressSchema' }, + }, + required: ['makerFee', 'takerFee', 'feeRecipientAddress', 'senderAddress'], +}; diff --git a/packages/json-schemas/schemas/relayer_api_order_schema.ts b/packages/json-schemas/schemas/relayer_api_order_schema.ts new file mode 100644 index 000000000..17fa146c4 --- /dev/null +++ b/packages/json-schemas/schemas/relayer_api_order_schema.ts @@ -0,0 +1,9 @@ +export const relayerApiOrderSchema = { + id: '/relayerApiOrderSchema', + type: 'object', + properties: { + order: { $ref: '/orderSchema' }, + remainingFillableAmount: { $ref: '/numberSchema' }, + }, + required: ['order', 'remainingFillableAmount'], +}; diff --git a/packages/json-schemas/schemas/relayer_api_orderbook_channel_snapshot_schema.ts b/packages/json-schemas/schemas/relayer_api_orderbook_channel_snapshot_schema.ts deleted file mode 100644 index fe1510d5b..000000000 --- a/packages/json-schemas/schemas/relayer_api_orderbook_channel_snapshot_schema.ts +++ /dev/null @@ -1,21 +0,0 @@ -export const relayerApiOrderbookChannelSnapshotSchema = { - id: '/RelayerApiOrderbookChannelSnapshot', - type: 'object', - properties: { - type: { enum: ['snapshot'] }, - channel: { enum: ['orderbook'] }, - requestId: { type: 'number' }, - payload: { $ref: '/RelayerApiOrderbookChannelSnapshotPayload' }, - }, - required: ['type', 'channel', 'requestId', 'payload'], -}; - -export const relayerApiOrderbookChannelSnapshotPayload = { - id: '/RelayerApiOrderbookChannelSnapshotPayload', - type: 'object', - properties: { - bids: { $ref: '/signedOrdersSchema' }, - asks: { $ref: '/signedOrdersSchema' }, - }, - required: ['bids', 'asks'], -}; diff --git a/packages/json-schemas/schemas/relayer_api_orderbook_channel_update_response_schema.ts b/packages/json-schemas/schemas/relayer_api_orderbook_channel_update_response_schema.ts deleted file mode 100644 index 9a6d83d4c..000000000 --- a/packages/json-schemas/schemas/relayer_api_orderbook_channel_update_response_schema.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const relayerApiOrderbookChannelUpdateSchema = { - id: '/RelayerApiOrderbookChannelUpdate', - type: 'object', - properties: { - type: { enum: ['update'] }, - channel: { enum: ['orderbook'] }, - requestId: { type: 'number' }, - payload: { $ref: '/SignedOrder' }, - }, - required: ['type', 'channel', 'requestId', 'payload'], -}; diff --git a/packages/json-schemas/schemas/relayer_api_orderbook_response_schema.ts b/packages/json-schemas/schemas/relayer_api_orderbook_response_schema.ts index 5c409c807..2e5b0c6f2 100644 --- a/packages/json-schemas/schemas/relayer_api_orderbook_response_schema.ts +++ b/packages/json-schemas/schemas/relayer_api_orderbook_response_schema.ts @@ -1,9 +1,9 @@ export const relayerApiOrderBookResponseSchema = { - id: '/RelayerApiOrderBookResponse', + id: '/relayerApiOrderBookResponseSchema', type: 'object', properties: { - bids: { $ref: '/signedOrdersSchema' }, - asks: { $ref: '/signedOrdersSchema' }, + bids: { $ref: '/relayerApiOrdersResponseSchema' }, + asks: { $ref: '/relayerApiOrdersResponseSchema' }, }, required: ['bids', 'asks'], }; diff --git a/packages/json-schemas/schemas/relayer_api_orders_channel_subscribe_schema.ts b/packages/json-schemas/schemas/relayer_api_orders_channel_subscribe_schema.ts new file mode 100644 index 000000000..a3b9b6d95 --- /dev/null +++ b/packages/json-schemas/schemas/relayer_api_orders_channel_subscribe_schema.ts @@ -0,0 +1,26 @@ +export const relayerApiOrdersChannelSubscribeSchema = { + id: '/relayerApiOrdersChannelSubscribeSchema', + type: 'object', + properties: { + type: { enum: ['subscribe'] }, + channel: { enum: ['orders'] }, + requestId: { type: 'string' }, + payload: { $ref: '/relayerApiOrdersChannelSubscribePayload' }, + }, + required: ['type', 'channel', 'requestId'], +}; + +export const relayerApiOrdersChannelSubscribePayload = { + id: '/relayerApiOrdersChannelSubscribePayload', + type: 'object', + properties: { + makerAssetProxyId: { $ref: '/hexSchema' }, + takerAssetProxyId: { $ref: '/hexSchema' }, + networkId: { type: 'number' }, + makerAssetAddress: { $ref: '/addressSchema' }, + takerAssetAddress: { $ref: '/addressSchema' }, + makerAssetData: { $ref: '/hexSchema' }, + takerAssetData: { $ref: '/hexSchema' }, + traderAssetData: { $ref: '/hexSchema' }, + }, +}; diff --git a/packages/json-schemas/schemas/relayer_api_orders_channel_update_response_schema.ts b/packages/json-schemas/schemas/relayer_api_orders_channel_update_response_schema.ts new file mode 100644 index 000000000..800b818e2 --- /dev/null +++ b/packages/json-schemas/schemas/relayer_api_orders_channel_update_response_schema.ts @@ -0,0 +1,11 @@ +export const relayerApiOrdersChannelUpdateSchema = { + id: '/relayerApiOrdersChannelUpdateSchema', + type: 'object', + properties: { + type: { enum: ['update'] }, + channel: { enum: ['orders'] }, + requestId: { type: 'string' }, + payload: { $ref: '/relayerApiOrdersSchema' }, + }, + required: ['type', 'channel', 'requestId'], +}; diff --git a/packages/json-schemas/schemas/relayer_api_orders_response_schema.ts b/packages/json-schemas/schemas/relayer_api_orders_response_schema.ts new file mode 100644 index 000000000..c10d64ca9 --- /dev/null +++ b/packages/json-schemas/schemas/relayer_api_orders_response_schema.ts @@ -0,0 +1,13 @@ +export const relayerApiOrdersResponseSchema = { + id: '/relayerApiOrdersResponseSchema', + type: 'object', + allOf: [ + { $ref: '/paginatedCollectionSchema' }, + { + properties: { + records: { $ref: '/relayerApiOrdersSchema' }, + }, + required: ['records'], + }, + ], +}; diff --git a/packages/json-schemas/schemas/relayer_api_orders_schema.ts b/packages/json-schemas/schemas/relayer_api_orders_schema.ts new file mode 100644 index 000000000..ba8ce4722 --- /dev/null +++ b/packages/json-schemas/schemas/relayer_api_orders_schema.ts @@ -0,0 +1,5 @@ +export const relayerApiOrdersSchema = { + id: '/relayerApiOrdersSchema', + type: 'array', + items: { $ref: '/relayerApiOrderSchema' }, +}; diff --git a/packages/json-schemas/schemas/relayer_api_token_pairs_response_schema.ts b/packages/json-schemas/schemas/relayer_api_token_pairs_response_schema.ts deleted file mode 100644 index 5009c7955..000000000 --- a/packages/json-schemas/schemas/relayer_api_token_pairs_response_schema.ts +++ /dev/null @@ -1,24 +0,0 @@ -export const relayerApiTokenPairsResponseSchema = { - id: '/RelayerApiTokenPairsResponse', - type: 'array', - items: { - properties: { - tokenA: { $ref: '/RelayerApiTokenTradeInfo' }, - tokenB: { $ref: '/RelayerApiTokenTradeInfo' }, - }, - required: ['tokenA', 'tokenB'], - type: 'object', - }, -}; - -export const relayerApiTokenTradeInfoSchema = { - id: '/RelayerApiTokenTradeInfo', - type: 'object', - properties: { - address: { $ref: '/Address' }, - minAmount: { $ref: '/Number' }, - maxAmount: { $ref: '/Number' }, - precision: { type: 'number' }, - }, - required: ['address'], -}; diff --git a/packages/json-schemas/schemas/signed_orders_schema.ts b/packages/json-schemas/schemas/signed_orders_schema.ts index 34d956836..e2a5aeb56 100644 --- a/packages/json-schemas/schemas/signed_orders_schema.ts +++ b/packages/json-schemas/schemas/signed_orders_schema.ts @@ -1,5 +1,5 @@ export const signedOrdersSchema = { id: '/signedOrdersSchema', type: 'array', - items: { $ref: '/SignedOrder' }, + items: { $ref: '/signedOrderSchema' }, }; diff --git a/packages/json-schemas/schemas/token_schema.ts b/packages/json-schemas/schemas/token_schema.ts index e64565c8b..a0b1ae27f 100644 --- a/packages/json-schemas/schemas/token_schema.ts +++ b/packages/json-schemas/schemas/token_schema.ts @@ -1,10 +1,10 @@ export const tokenSchema = { - id: '/Token', + id: '/tokenSchema', properties: { name: { type: 'string' }, symbol: { type: 'string' }, decimals: { type: 'number' }, - address: { $ref: '/Address' }, + address: { $ref: '/addressSchema' }, }, required: ['name', 'symbol', 'decimals', 'address'], type: 'object', diff --git a/packages/json-schemas/schemas/tx_data_schema.ts b/packages/json-schemas/schemas/tx_data_schema.ts index 4274c553f..41a5c708a 100644 --- a/packages/json-schemas/schemas/tx_data_schema.ts +++ b/packages/json-schemas/schemas/tx_data_schema.ts @@ -1,22 +1,22 @@ export const jsNumber = { - id: '/JsNumber', + id: '/jsNumber', type: 'number', minimum: 0, }; export const txDataSchema = { - id: '/TxData', + id: '/txDataSchema', properties: { - from: { $ref: '/Address' }, - to: { $ref: '/Address' }, + from: { $ref: '/addressSchema' }, + to: { $ref: '/addressSchema' }, value: { - oneOf: [{ $ref: '/Number' }, { $ref: '/JsNumber' }], + oneOf: [{ $ref: '/numberSchema' }, { $ref: '/jsNumber' }], }, gas: { - oneOf: [{ $ref: '/Number' }, { $ref: '/JsNumber' }], + oneOf: [{ $ref: '/numberSchema' }, { $ref: '/jsNumber' }], }, gasPrice: { - oneOf: [{ $ref: '/Number' }, { $ref: '/JsNumber' }], + oneOf: [{ $ref: '/numberSchema' }, { $ref: '/jsNumber' }], }, data: { type: 'string', diff --git a/packages/json-schemas/src/schemas.ts b/packages/json-schemas/src/schemas.ts index 8b7c538ed..61614ebde 100644 --- a/packages/json-schemas/src/schemas.ts +++ b/packages/json-schemas/src/schemas.ts @@ -9,23 +9,24 @@ import { orderFillRequestsSchema } from '../schemas/order_fill_requests_schema'; import { orderHashSchema } from '../schemas/order_hash_schema'; import { orderSchema, signedOrderSchema } from '../schemas/order_schemas'; import { ordersSchema } from '../schemas/orders_schema'; -import { relayerApiErrorResponseSchema } from '../schemas/relayer_api_error_response_schema'; -import { relayerApiFeesPayloadSchema } from '../schemas/relayer_api_fees_payload_schema'; -import { relayerApiFeesResponseSchema } from '../schemas/relayer_api_fees_response_schema'; -import { - relayerApiOrderbookChannelSubscribePayload, - relayerApiOrderbookChannelSubscribeSchema, -} from '../schemas/relayer_api_orberbook_channel_subscribe_schema'; +import { paginatedCollectionSchema } from '../schemas/paginated_collection_schema'; import { - relayerApiOrderbookChannelSnapshotPayload, - relayerApiOrderbookChannelSnapshotSchema, -} from '../schemas/relayer_api_orderbook_channel_snapshot_schema'; -import { relayerApiOrderbookChannelUpdateSchema } from '../schemas/relayer_api_orderbook_channel_update_response_schema'; + relayerApiAssetDataPairsResponseSchema, + relayerApiAssetDataPairsSchema, + relayerApiAssetDataTradeInfoSchema, +} from '../schemas/relayer_api_asset_pairs_response_schema'; +import { relayerApiErrorResponseSchema } from '../schemas/relayer_api_error_response_schema'; +import { relayerApiOrderConfigPayloadSchema } from '../schemas/relayer_api_order_config_payload_schema'; +import { relayerApiOrderConfigResponseSchema } from '../schemas/relayer_api_order_config_response_schema'; +import { relayerApiOrderSchema } from '../schemas/relayer_api_order_schema'; import { relayerApiOrderBookResponseSchema } from '../schemas/relayer_api_orderbook_response_schema'; import { - relayerApiTokenPairsResponseSchema, - relayerApiTokenTradeInfoSchema, -} from '../schemas/relayer_api_token_pairs_response_schema'; + relayerApiOrdersChannelSubscribePayload, + relayerApiOrdersChannelSubscribeSchema, +} from '../schemas/relayer_api_orders_channel_subscribe_schema'; +import { relayerApiOrdersChannelUpdateSchema } from '../schemas/relayer_api_orders_channel_update_response_schema'; +import { relayerApiOrdersResponseSchema } from '../schemas/relayer_api_orders_response_schema'; +import { relayerApiOrdersSchema } from '../schemas/relayer_api_orders_schema'; import { signedOrdersSchema } from '../schemas/signed_orders_schema'; import { tokenSchema } from '../schemas/token_schema'; import { jsNumber, txDataSchema } from '../schemas/tx_data_schema'; @@ -51,15 +52,18 @@ export const schemas = { tokenSchema, jsNumber, txDataSchema, + paginatedCollectionSchema, relayerApiErrorResponseSchema, - relayerApiFeesPayloadSchema, - relayerApiFeesResponseSchema, + relayerApiOrderSchema, + relayerApiOrdersSchema, + relayerApiOrderConfigPayloadSchema, + relayerApiOrderConfigResponseSchema, relayerApiOrderBookResponseSchema, - relayerApiTokenPairsResponseSchema, - relayerApiTokenTradeInfoSchema, - relayerApiOrderbookChannelSubscribeSchema, - relayerApiOrderbookChannelSubscribePayload, - relayerApiOrderbookChannelUpdateSchema, - relayerApiOrderbookChannelSnapshotSchema, - relayerApiOrderbookChannelSnapshotPayload, + relayerApiAssetDataPairsResponseSchema, + relayerApiAssetDataTradeInfoSchema, + relayerApiOrdersChannelSubscribeSchema, + relayerApiOrdersChannelSubscribePayload, + relayerApiOrdersChannelUpdateSchema, + relayerApiOrdersResponseSchema, + relayerApiAssetDataPairsSchema, }; diff --git a/packages/json-schemas/test/schema_test.ts b/packages/json-schemas/test/schema_test.ts index f84553df1..01fa53045 100644 --- a/packages/json-schemas/test/schema_test.ts +++ b/packages/json-schemas/test/schema_test.ts @@ -26,14 +26,16 @@ const { tokenSchema, jsNumber, txDataSchema, + paginatedCollectionSchema, relayerApiErrorResponseSchema, relayerApiOrderBookResponseSchema, - relayerApiTokenPairsResponseSchema, - relayerApiFeesPayloadSchema, - relayerApiFeesResponseSchema, - relayerApiOrderbookChannelSubscribeSchema, - relayerApiOrderbookChannelUpdateSchema, - relayerApiOrderbookChannelSnapshotSchema, + relayerApiAssetDataPairsResponseSchema, + relayerApiOrderConfigPayloadSchema, + relayerApiOrderConfigResponseSchema, + relayerApiOrdersChannelSubscribeSchema, + relayerApiOrdersChannelUpdateSchema, + relayerApiOrdersResponseSchema, + relayerApiOrderSchema, } = schemas; describe('Schema', () => { @@ -55,6 +57,11 @@ describe('Schema', () => { } }); }; + const paginatedResponse = { + total: 100, + perPage: 10, + page: 3, + }; describe('#numberSchema', () => { it('should validate valid numbers', () => { const testCases = ['42', '0', '1.3', '0.2', '00.00']; @@ -166,6 +173,29 @@ describe('Schema', () => { validateAgainstSchema(testCases, tokenSchema, shouldFail); }); }); + describe('#paginatedCollectionSchema', () => { + it('should validate valid paginated collections', () => { + const testCases = [paginatedResponse]; + validateAgainstSchema(testCases, paginatedCollectionSchema); + }); + it('should fail for invalid paginated collections', () => { + const paginatedCollectionNoTotal = { + page: 10, + perPage: 2, + }; + const paginatedCollectionNoPerPage = { + page: 10, + total: 100, + }; + const paginatedCollectionNoPage = { + total: 10, + perPage: 20, + }; + const testCases = [{}, paginatedCollectionNoPage, paginatedCollectionNoPerPage, paginatedCollectionNoTotal]; + const shouldFail = true; + validateAgainstSchema(testCases, paginatedCollectionSchema, shouldFail); + }); + }); describe('order including schemas', () => { const order = { makerAddress: NULL_ADDRESS, @@ -182,6 +212,14 @@ describe('Schema', () => { exchangeAddress: NULL_ADDRESS, expirationTimeSeconds: '42', }; + const relayerApiOrder = { + order, + remainingFillableAmount: '50000000000000', + }; + const relayerApiOrdersResponse = { + ...paginatedResponse, + records: [relayerApiOrder, relayerApiOrder], + }; describe('#orderSchema', () => { it('should validate valid order', () => { const testCases = [order]; @@ -308,303 +346,453 @@ describe('Schema', () => { validateAgainstSchema(testCases, orderFillRequestsSchema, shouldFail); }); }); - describe('#relayerApiOrderBookResponseSchema', () => { - it('should validate valid order book responses', () => { - const testCases = [ - { - bids: [], - asks: [], - }, - { - bids: [signedOrder, signedOrder], - asks: [], - }, - { - bids: [], - asks: [signedOrder, signedOrder], - }, - { - bids: [signedOrder], - asks: [signedOrder, signedOrder], - }, - ]; - validateAgainstSchema(testCases, relayerApiOrderBookResponseSchema); + describe('standard relayer api schemas', () => { + describe('#relayerApiOrderSchema', () => { + it('should validate valid relayer api order', () => { + const testCases = [relayerApiOrder]; + validateAgainstSchema(testCases, relayerApiOrderSchema); + }); + it('should fail for invalid relayer api orders', () => { + const testCases = [{}, order, { order }, { order, remainingFillableAmount: 5 }]; + const shouldFail = true; + validateAgainstSchema(testCases, relayerApiOrderSchema, shouldFail); + }); }); - it('should fail for invalid order fill requests', () => { - const testCases = [ - {}, - { - bids: [signedOrder, signedOrder], - }, - { - asks: [signedOrder, signedOrder], - }, - { - bids: signedOrder, - asks: [signedOrder, signedOrder], - }, - { - bids: [signedOrder], - asks: signedOrder, - }, - ]; - const shouldFail = true; - validateAgainstSchema(testCases, relayerApiOrderBookResponseSchema, shouldFail); + describe('#relayerApiErrorResponseSchema', () => { + it('should validate valid errorResponse', () => { + const testCases = [ + { + code: 102, + reason: 'Order submission disabled', + }, + { + code: 101, + reason: 'Validation failed', + validationErrors: [ + { + field: 'maker', + code: 1002, + reason: 'Invalid address', + }, + ], + }, + ]; + validateAgainstSchema(testCases, relayerApiErrorResponseSchema); + }); + it('should fail for invalid error responses', () => { + const testCases = [ + {}, + { + code: 102, + }, + { + code: '102', + reason: 'Order submission disabled', + }, + { + reason: 'Order submission disabled', + }, + { + code: 101, + reason: 'Validation failed', + validationErrors: [ + { + field: 'maker', + reason: 'Invalid address', + }, + ], + }, + { + code: 101, + reason: 'Validation failed', + validationErrors: [ + { + field: 'maker', + code: '1002', + reason: 'Invalid address', + }, + ], + }, + ]; + const shouldFail = true; + validateAgainstSchema(testCases, relayerApiErrorResponseSchema, shouldFail); + }); }); - }); - describe('#relayerApiOrderbookChannelSubscribeSchema', () => { - it('should validate valid orderbook channel websocket subscribe message', () => { - const testCases = [ - { - type: 'subscribe', - channel: 'orderbook', - requestId: 1, - payload: { - baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - snapshot: true, - limit: 100, + describe('#relayerApiOrderConfigPayloadSchema', () => { + it('should validate valid fees payloads', () => { + const testCases = [ + { + exchangeAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + makerAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + takerAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + makerAssetData: NULL_ADDRESS, + takerAssetData: NULL_ADDRESS, + makerAssetAmount: '10000000000000000000', + takerAssetAmount: '30000000000000000000', + expirationTimeSeconds: '42', }, - }, - { - type: 'subscribe', - channel: 'orderbook', - requestId: 1, - payload: { - baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + ]; + validateAgainstSchema(testCases, relayerApiOrderConfigPayloadSchema); + }); + it('should fail for invalid fees payloads', () => { + const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32'; + const testCases = [ + {}, + { + makerAssetAmount: '10000000000000000000', + takerAssetAmount: '30000000000000000000', + makerAssetData: NULL_ADDRESS, + takerAssetData: NULL_ADDRESS, }, - }, - ]; - validateAgainstSchema(testCases, relayerApiOrderbookChannelSubscribeSchema); + { + takerAddress: checksummedAddress, + makerAssetAmount: '10000000000000000000', + takerAssetAmount: '30000000000000000000', + }, + { + makerAssetAmount: 10000000000000000000, + takerAssetAmount: 30000000000000000000, + }, + ]; + const shouldFail = true; + validateAgainstSchema(testCases, relayerApiOrderConfigPayloadSchema, shouldFail); + }); }); - it('should fail for invalid orderbook channel websocket subscribe message', () => { - const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32'; - const testCases = [ - { - type: 'subscribe', - channel: 'orderbook', - payload: { - baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - snapshot: true, - limit: 100, + describe('#relayerApiOrderConfigResponseSchema', () => { + it('should validate valid fees responses', () => { + const testCases = [ + { + makerFee: '10000000000000000', + takerFee: '30000000000000000', + feeRecipientAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + senderAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', }, - }, - { - type: 'foo', - channel: 'orderbook', - requestId: 1, - payload: { - baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + ]; + validateAgainstSchema(testCases, relayerApiOrderConfigResponseSchema); + }); + it('should fail for invalid fees responses', () => { + const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32'; + const testCases = [ + {}, + { + makerFee: 10000000000000000, + takerFee: 30000000000000000, }, - }, - { - type: 'subscribe', - channel: 'bar', - requestId: 1, - payload: { - baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + { + feeRecipient: checksummedAddress, + takerToSpecify: checksummedAddress, + makerFee: '10000000000000000', + takerFee: '30000000000000000', }, - }, - { - type: 'subscribe', - channel: 'orderbook', - requestId: 1, - payload: { - baseTokenAddress: checksummedAddress, - quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + ]; + const shouldFail = true; + validateAgainstSchema(testCases, relayerApiOrderConfigResponseSchema, shouldFail); + }); + }); + describe('#relayerAssetDataPairsResponseSchema', () => { + it('should validate valid assetPairs response', () => { + const testCases = [ + { + ...paginatedResponse, + records: [], }, - }, - { - type: 'subscribe', - channel: 'orderbook', - requestId: 1, - payload: { - baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - quoteTokenAddress: checksummedAddress, + { + ...paginatedResponse, + records: [ + { + assetDataA: { + assetData: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + minAmount: '0', + maxAmount: '10000000000000000000', + precision: 5, + }, + assetDataB: { + assetData: '0xef7fff64389b814a946f3e92105513705ca6b990', + minAmount: '0', + maxAmount: '50000000000000000000', + precision: 5, + }, + }, + ], }, - }, - { - type: 'subscribe', - channel: 'orderbook', - requestId: 1, - payload: { - quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + { + ...paginatedResponse, + records: [ + { + assetDataA: { + assetData: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + }, + assetDataB: { + assetData: '0xef7fff64389b814a946f3e92105513705ca6b990', + }, + }, + ], }, - }, - { - type: 'subscribe', - channel: 'orderbook', - requestId: 1, - payload: { - baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + ]; + validateAgainstSchema(testCases, relayerApiAssetDataPairsResponseSchema); + }); + it('should fail for invalid assetPairs responses', () => { + const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32'; + const testCases = [ + { + ...paginatedResponse, + records: [ + { + assetDataA: { + assetData: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + minAmount: '0', + maxAmount: '10000000000000000000', + precision: 5, + }, + assetDataC: { + assetData: '0xef7fff64389b814a946f3e92105513705ca6b990', + minAmount: '0', + maxAmount: '50000000000000000000', + precision: 5, + }, + }, + ], }, - }, - { - type: 'subscribe', - channel: 'orderbook', - requestId: 1, - payload: { - baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - snapshot: 'true', - limit: 100, + { + records: [ + { + assetDataA: { + assetData: '0x323b5d4c32345ced77393b3530b1eed0f346429d', + minAmount: '0', + maxAmount: '10000000000000000000', + precision: 5, + }, + assetDataB: { + assetData: '0xef7fff64389b814a946f3e92105513705ca6b990', + minAmount: '0', + maxAmount: '50000000000000000000', + precision: 5, + }, + }, + ], }, - }, - { - type: 'subscribe', - channel: 'orderbook', - requestId: 1, - payload: { - baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - snapshot: true, - limit: '100', + { + ...paginatedResponse, + records: [ + { + assetDataA: { + minAmount: '0', + maxAmount: '10000000000000000000', + precision: 5, + }, + assetDataB: { + minAmount: '0', + maxAmount: '50000000000000000000', + precision: 5, + }, + }, + ], }, - }, - ]; - const shouldFail = true; - validateAgainstSchema(testCases, relayerApiOrderbookChannelSubscribeSchema, shouldFail); + ]; + const shouldFail = true; + validateAgainstSchema(testCases, relayerApiAssetDataPairsResponseSchema, shouldFail); + }); }); - }); - describe('#relayerApiOrderbookChannelSnapshotSchema', () => { - it('should validate valid orderbook channel websocket snapshot message', () => { - const testCases = [ - { - type: 'snapshot', - channel: 'orderbook', - requestId: 2, - payload: { - bids: [], - asks: [], + describe('#relayerApiOrdersResponseSchema', () => { + it('should validate valid orders responses', () => { + const testCases = [ + relayerApiOrdersResponse, + { + ...paginatedResponse, + records: [], }, - }, - { - type: 'snapshot', - channel: 'orderbook', - requestId: 2, - payload: { - bids: [signedOrder], - asks: [signedOrder], + ]; + validateAgainstSchema(testCases, relayerApiOrdersResponseSchema); + }); + it('should fail for invalid orders responses', () => { + const testCases = [ + { + records: [relayerApiOrder, relayerApiOrder], }, - }, - ]; - validateAgainstSchema(testCases, relayerApiOrderbookChannelSnapshotSchema); - }); - it('should fail for invalid orderbook channel websocket snapshot message', () => { - const testCases = [ - { - type: 'foo', - channel: 'orderbook', - requestId: 2, - payload: { - bids: [signedOrder], - asks: [signedOrder], + { + ...paginatedResponse, }, - }, - { - type: 'snapshot', - channel: 'bar', - requestId: 2, - payload: { - bids: [signedOrder], - asks: [signedOrder], + { + ...paginatedResponse, + records: [{}, relayerApiOrder], }, - }, - { - type: 'snapshot', - channel: 'orderbook', - payload: { - bids: [signedOrder], - asks: [signedOrder], + ]; + const shouldFail = true; + validateAgainstSchema(testCases, relayerApiOrdersResponseSchema, shouldFail); + }); + }); + describe('#relayerApiOrderBookResponseSchema', () => { + it('should validate valid order book responses', () => { + const testCases = [ + { + bids: { + ...paginatedResponse, + records: [relayerApiOrder], + }, + asks: { + ...paginatedResponse, + records: [], + }, }, - }, - { - type: 'snapshot', - channel: 'orderbook', - requestId: '2', - payload: { - bids: [signedOrder], - asks: [signedOrder], + { + bids: { + ...paginatedResponse, + records: [relayerApiOrder, relayerApiOrder], + }, + asks: { + ...paginatedResponse, + records: [relayerApiOrder, relayerApiOrder], + }, }, - }, - { - type: 'snapshot', - channel: 'orderbook', - requestId: 2, - payload: { - bids: [signedOrder], + { + bids: { + ...paginatedResponse, + records: [], + }, + asks: { + ...paginatedResponse, + records: [relayerApiOrder, relayerApiOrder], + }, }, - }, - { - type: 'snapshot', - channel: 'orderbook', - requestId: 2, - payload: { - asks: [signedOrder], + ]; + validateAgainstSchema(testCases, relayerApiOrderBookResponseSchema); + }); + it('should fail for invalid order fill requests', () => { + const testCases = [ + {}, + { + bids: { + records: [relayerApiOrder], + }, + asks: { + ...paginatedResponse, + records: [], + }, }, - }, - { - type: 'snapshot', - channel: 'orderbook', - requestId: 2, - payload: { - bids: [signedOrder], - asks: [{}], + { + bids: { + ...paginatedResponse, + records: [relayerApiOrder, relayerApiOrder], + }, + asks: {}, }, - }, - { - type: 'snapshot', - channel: 'orderbook', - requestId: 2, - payload: { - bids: [{}], - asks: [signedOrder], + { + bids: { + ...paginatedResponse, + }, + asks: { + ...paginatedResponse, + records: [relayerApiOrder, relayerApiOrder], + }, }, - }, - ]; - const shouldFail = true; - validateAgainstSchema(testCases, relayerApiOrderbookChannelSnapshotSchema, shouldFail); + ]; + const shouldFail = true; + validateAgainstSchema(testCases, relayerApiOrdersResponseSchema, shouldFail); + }); }); - }); - describe('#relayerApiOrderbookChannelUpdateSchema', () => { - it('should validate valid orderbook channel websocket update message', () => { - const testCases = [ - { - type: 'update', - channel: 'orderbook', - requestId: 2, - payload: signedOrder, - }, - ]; - validateAgainstSchema(testCases, relayerApiOrderbookChannelUpdateSchema); + describe('#relayerApiOrdersChannelSubscribeSchema', () => { + it('should validate valid orders channel websocket subscribe message', () => { + const testCases = [ + { + type: 'subscribe', + channel: 'orders', + requestId: 'randomId', + }, + { + type: 'subscribe', + channel: 'orders', + requestId: 'randomId', + payload: { + makerAssetProxyId: '0x02571792', + takerAssetProxyId: '0xf47261b0', + }, + }, + { + type: 'subscribe', + channel: 'orders', + requestId: 'randomId', + payload: {}, + }, + ]; + validateAgainstSchema(testCases, relayerApiOrdersChannelSubscribeSchema); + }); + it('should fail for invalid orders channel websocket subscribe message', () => { + const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32'; + const testCases = [ + { + type: 'subscribe', + channel: 'orders', + }, + { + type: 'subscribe', + channel: 'orders', + requestId: 'randomId', + payload: { + makerAssetProxyId: '0x02571792', + takerAssetProxyId: '0xf47261b0', + makerAssetAddress: checksummedAddress, + }, + }, + { + type: 'subscribe', + channel: 'orders', + requestId: 'randomId', + payload: { + makerAssetProxyId: 'invalidId', + }, + }, + ]; + const shouldFail = true; + validateAgainstSchema(testCases, relayerApiOrdersChannelSubscribeSchema, shouldFail); + }); }); - it('should fail for invalid orderbook channel websocket update message', () => { - const testCases = [ - { - type: 'foo', - channel: 'orderbook', - requestId: 2, - payload: signedOrder, - }, - { - type: 'update', - channel: 'bar', - requestId: 2, - payload: signedOrder, - }, - { - type: 'update', - channel: 'orderbook', - requestId: 2, - payload: {}, - }, - ]; - const shouldFail = true; - validateAgainstSchema(testCases, relayerApiOrderbookChannelUpdateSchema, shouldFail); + describe('#relayerApiOrdersChannelUpdateSchema', () => { + it('should validate valid orders channel websocket update message', () => { + const testCases = [ + { + type: 'update', + channel: 'orders', + requestId: 'randomId', + payload: [relayerApiOrder], + }, + { + type: 'update', + channel: 'orders', + requestId: 'randomId', + payload: [], + }, + ]; + validateAgainstSchema(testCases, relayerApiOrdersChannelUpdateSchema); + }); + it('should fail for invalid orders channel websocket update message', () => { + const testCases = [ + { + type: 'foo', + channel: 'orders', + requestId: 'randomId', + }, + { + type: 'update', + channel: 'bar', + requestId: 2, + payload: [relayerApiOrder], + }, + { + type: 'update', + channel: 'orders', + requestId: 'randomId', + payload: {}, + }, + { + type: 'update', + channel: 'orders', + requestId: 'randomId', + payload: relayerApiErrorResponseSchema, + }, + ]; + const shouldFail = true; + validateAgainstSchema(testCases, relayerApiOrdersChannelUpdateSchema, shouldFail); + }); }); }); }); @@ -624,217 +812,6 @@ describe('Schema', () => { }); }); }); - describe('#relayerApiErrorResponseSchema', () => { - it('should validate valid errorResponse', () => { - const testCases = [ - { - code: 102, - reason: 'Order submission disabled', - }, - { - code: 101, - reason: 'Validation failed', - validationErrors: [ - { - field: 'maker', - code: 1002, - reason: 'Invalid address', - }, - ], - }, - ]; - validateAgainstSchema(testCases, relayerApiErrorResponseSchema); - }); - it('should fail for invalid error responses', () => { - const testCases = [ - {}, - { - code: 102, - }, - { - code: '102', - reason: 'Order submission disabled', - }, - { - reason: 'Order submission disabled', - }, - { - code: 101, - reason: 'Validation failed', - validationErrors: [ - { - field: 'maker', - reason: 'Invalid address', - }, - ], - }, - { - code: 101, - reason: 'Validation failed', - validationErrors: [ - { - field: 'maker', - code: '1002', - reason: 'Invalid address', - }, - ], - }, - ]; - const shouldFail = true; - validateAgainstSchema(testCases, relayerApiErrorResponseSchema, shouldFail); - }); - }); - describe('#relayerApiFeesPayloadSchema', () => { - it('should validate valid fees payloads', () => { - const testCases = [ - { - exchangeContractAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - maker: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - taker: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - makerTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - takerTokenAddress: '0xef7fff64389b814a946f3e92105513705ca6b990', - makerTokenAmount: '10000000000000000000', - takerTokenAmount: '30000000000000000000', - expirationUnixTimestampSec: '42', - salt: '67006738228878699843088602623665307406148487219438534730168799356281242528500', - }, - ]; - validateAgainstSchema(testCases, relayerApiFeesPayloadSchema); - }); - it('should fail for invalid fees payloads', () => { - const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32'; - const testCases = [ - {}, - { - takerTokenAddress: '0xef7fff64389b814a946f3e92105513705ca6b990', - makerTokenAmount: '10000000000000000000', - takerTokenAmount: '30000000000000000000', - }, - { - taker: checksummedAddress, - makerTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - takerTokenAddress: '0xef7fff64389b814a946f3e92105513705ca6b990', - makerTokenAmount: '10000000000000000000', - takerTokenAmount: '30000000000000000000', - }, - { - makerTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - takerTokenAddress: '0xef7fff64389b814a946f3e92105513705ca6b990', - makerTokenAmount: 10000000000000000000, - takerTokenAmount: 30000000000000000000, - }, - ]; - const shouldFail = true; - validateAgainstSchema(testCases, relayerApiFeesPayloadSchema, shouldFail); - }); - }); - describe('#relayerApiFeesResponseSchema', () => { - it('should validate valid fees responses', () => { - const testCases = [ - { - makerFee: '10000000000000000', - takerFee: '30000000000000000', - feeRecipient: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - }, - ]; - validateAgainstSchema(testCases, relayerApiFeesResponseSchema); - }); - it('should fail for invalid fees responses', () => { - const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32'; - const testCases = [ - {}, - { - makerFee: 10000000000000000, - takerFee: 30000000000000000, - }, - { - feeRecipient: checksummedAddress, - takerToSpecify: checksummedAddress, - makerFee: '10000000000000000', - takerFee: '30000000000000000', - }, - ]; - const shouldFail = true; - validateAgainstSchema(testCases, relayerApiFeesResponseSchema, shouldFail); - }); - }); - describe('#relayerApiTokenPairsResponseSchema', () => { - it('should validate valid tokenPairs response', () => { - const testCases = [ - [], - [ - { - tokenA: { - address: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - minAmount: '0', - maxAmount: '10000000000000000000', - precision: 5, - }, - tokenB: { - address: '0xef7fff64389b814a946f3e92105513705ca6b990', - minAmount: '0', - maxAmount: '50000000000000000000', - precision: 5, - }, - }, - ], - [ - { - tokenA: { - address: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - }, - tokenB: { - address: '0xef7fff64389b814a946f3e92105513705ca6b990', - }, - }, - ], - ]; - validateAgainstSchema(testCases, relayerApiTokenPairsResponseSchema); - }); - it('should fail for invalid tokenPairs responses', () => { - const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32'; - const testCases = [ - [ - { - tokenA: { - address: checksummedAddress, - }, - tokenB: { - address: checksummedAddress, - }, - }, - ], - [ - { - tokenA: { - address: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - minAmount: 0, - maxAmount: 10000000000000000000, - }, - tokenB: { - address: '0xef7fff64389b814a946f3e92105513705ca6b990', - minAmount: 0, - maxAmount: 50000000000000000000, - }, - }, - ], - [ - { - tokenA: { - address: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - precision: '5', - }, - tokenB: { - address: '0xef7fff64389b814a946f3e92105513705ca6b990', - precision: '5', - }, - }, - ], - ]; - const shouldFail = true; - validateAgainstSchema(testCases, relayerApiTokenPairsResponseSchema, shouldFail); - }); - }); describe('#jsNumberSchema', () => { it('should validate valid js number', () => { // tslint:disable-next-line:custom-no-magic-numbers |