From d5f5e7966180022c5fa5b1ce14ea8c7d0ab78346 Mon Sep 17 00:00:00 2001 From: fragosti Date: Tue, 12 Feb 2019 10:41:47 -0800 Subject: [PATCH 01/27] Add radar data source --- .../pipeline/src/data_sources/radar/index.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 packages/pipeline/src/data_sources/radar/index.ts diff --git a/packages/pipeline/src/data_sources/radar/index.ts b/packages/pipeline/src/data_sources/radar/index.ts new file mode 100644 index 0000000000..7f7abb3334 --- /dev/null +++ b/packages/pipeline/src/data_sources/radar/index.ts @@ -0,0 +1,34 @@ +import { fetchAsync, logUtils } from '@0x/utils'; +import { RadarBook, RadarMarket } from '@radarrelay/types'; + +const RADAR_BASE_URL = 'https://api.radarrelay.com/v2/'; +const ACTIVE_MARKETS_URL = `${RADAR_BASE_URL}/markets`; +const MAX_PER_PAGE = 1000; + +export const RADAR_SOURCE = 'radar'; + +// tslint:disable:prefer-function-over-method +// ^ Keep consistency with other sources and help logical organization +export class RadarSource { + /** + * Call Radar API to find out which markets they are maintaining orderbooks for. + */ + public async getActiveMarketsAsync(): Promise { + logUtils.log('Getting all active Radar markets'); + const resp = await fetchAsync(`${ACTIVE_MARKETS_URL}?perPage=${MAX_PER_PAGE}`); + const markets: RadarMarket[] = await resp.json(); + logUtils.log(`Got ${markets.length} markets.`); + return markets; + } + + /** + * Retrieve orderbook from Radar API for a given market. + * @param marketId String identifying the market we want data for. Eg. 'REP/AUG' + */ + public async getMarketOrderbookAsync(marketId: string): Promise { + logUtils.log(`${marketId}: Retrieving orderbook.`); + const marketOrderbookUrl = `${ACTIVE_MARKETS_URL}/${marketId}/book`; + const resp = await fetchAsync(marketOrderbookUrl); + return resp.json(); + } +} From f3a537d5c24759f2ae772f7bd838adb47967556e Mon Sep 17 00:00:00 2001 From: fragosti Date: Tue, 12 Feb 2019 14:35:50 -0800 Subject: [PATCH 02/27] Add radar parser --- .../src/parsers/radar_orders/index.ts | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 packages/pipeline/src/parsers/radar_orders/index.ts diff --git a/packages/pipeline/src/parsers/radar_orders/index.ts b/packages/pipeline/src/parsers/radar_orders/index.ts new file mode 100644 index 0000000000..b4f7e47688 --- /dev/null +++ b/packages/pipeline/src/parsers/radar_orders/index.ts @@ -0,0 +1,89 @@ +import { BigNumber } from '@0x/utils'; +import { Web3Wrapper } from '@0x/web3-wrapper'; +import { RadarBook, RadarMarket, RadarOrderType, RadarSignedOrder } from '@radarrelay/types'; +import * as R from 'ramda'; + +import { aggregateOrders, GenericRawOrder } from '../utils'; + +import { TokenOrderbookSnapshot as TokenOrder } from '../../entities'; +import { OrderType } from '../../types'; + +/** + * Marque function of this file. + * 1) Takes in orders from an orderbook, + * other information attached. + * @param radarOrderbook A raw orderbook that we pull from the radar API. + * @param radarMarket An object containing market data also directly from the API. + * @param observedTimestamp Time at which the orders for the market were pulled. + * @param source The exchange where these orders are placed. In this case 'radar'. + */ +export function parseRadarOrders( + radarOrderbook: RadarBook, + radarMarket: RadarMarket, + observedTimestamp: number, + source: string, +): TokenOrder[] { + const transformToGeneric = (radarOrder: RadarSignedOrder) => _toGeneric(radarMarket, radarOrder); + const aggregatedBids = aggregateOrders(_removeUndefined(R.map(transformToGeneric, radarOrderbook.bids))); + const aggregatedAsks = aggregateOrders(_removeUndefined(R.map(transformToGeneric, radarOrderbook.asks))); + const parsedBids = aggregatedBids.map(order => + parseRadarOrder(radarMarket, observedTimestamp, OrderType.Bid, source, order), + ); + const parsedAsks = aggregatedAsks.map(order => + parseRadarOrder(radarMarket, observedTimestamp, OrderType.Ask, source, order), + ); + return parsedBids.concat(parsedAsks); +} + +/** + * Parse a single aggregated radar order in order to form a tokenOrder entity + * which can be saved into the database. + * @param radarMarket An object containing information about the market where these + * trades have been placed. + * @param observedTimestamp The time when the API response returned back to us. + * @param orderType 'bid' or 'ask' enum. + * @param source Exchange where these orders were placed. + * @param radarOrder A tuple which we will convert to volume-basis. + */ +export function parseRadarOrder( + radarMarket: RadarMarket, + observedTimestamp: number, + orderType: OrderType, + source: string, + radarOrder: [string, BigNumber], +): TokenOrder { + const tokenOrder = new TokenOrder(); + const price = new BigNumber(radarOrder[0]); + const amount = radarOrder[1]; + const splitId = radarMarket.id.split('-'); + + tokenOrder.source = source; + tokenOrder.observedTimestamp = observedTimestamp; + tokenOrder.orderType = orderType; + tokenOrder.price = price; + + tokenOrder.baseAssetSymbol = splitId[0]; + tokenOrder.baseAssetAddress = radarMarket.baseTokenAddress || null; + tokenOrder.baseVolume = amount; + + tokenOrder.quoteAssetSymbol = splitId[1]; + tokenOrder.quoteAssetAddress = radarMarket.quoteTokenAddress || null; + tokenOrder.quoteVolume = price.times(amount); + return tokenOrder; +} + +function _toGeneric(radarMarket: RadarMarket, radarOrder: RadarSignedOrder): GenericRawOrder | undefined { + if (radarMarket.baseTokenDecimals === undefined) { + return undefined; + } + const rawAmount = + radarOrder.type === RadarOrderType.ASK + ? radarOrder.signedOrder.makerAssetAmount + : radarOrder.signedOrder.takerAssetAmount; + return { + price: radarOrder.price.toString(), + amount: Web3Wrapper.toUnitAmount(new BigNumber(rawAmount.toString()), radarMarket.baseTokenDecimals).toString(), + }; +} + +const _removeUndefined = R.reject(R.isNil); From 4db9b8b0e34e6eec7ec445ebd93bbf8fff3a3bbd Mon Sep 17 00:00:00 2001 From: fragosti Date: Tue, 12 Feb 2019 14:49:32 -0800 Subject: [PATCH 03/27] Add script for pulling radar orderbook --- packages/pipeline/package.json | 1 + .../pipeline/src/data_sources/radar/index.ts | 2 +- .../scripts/pull_radar_orderbook_snapshots.ts | 56 ++++++++++++++++++ yarn.lock | 57 +++++++++++++++---- 4 files changed, 105 insertions(+), 11 deletions(-) create mode 100644 packages/pipeline/src/scripts/pull_radar_orderbook_snapshots.ts diff --git a/packages/pipeline/package.json b/packages/pipeline/package.json index b2ad39a5f2..ecb53e5da3 100644 --- a/packages/pipeline/package.json +++ b/packages/pipeline/package.json @@ -49,6 +49,7 @@ "@0x/types": "^2.0.2", "@0x/utils": "^4.0.3", "@0x/web3-wrapper": "^4.0.2", + "@radarrelay/types": "^1.2.1", "@types/dockerode": "^2.5.9", "@types/p-limit": "^2.0.0", "async-parallel": "^1.2.3", diff --git a/packages/pipeline/src/data_sources/radar/index.ts b/packages/pipeline/src/data_sources/radar/index.ts index 7f7abb3334..bbc55eef99 100644 --- a/packages/pipeline/src/data_sources/radar/index.ts +++ b/packages/pipeline/src/data_sources/radar/index.ts @@ -27,7 +27,7 @@ export class RadarSource { */ public async getMarketOrderbookAsync(marketId: string): Promise { logUtils.log(`${marketId}: Retrieving orderbook.`); - const marketOrderbookUrl = `${ACTIVE_MARKETS_URL}/${marketId}/book`; + const marketOrderbookUrl = `${ACTIVE_MARKETS_URL}/${marketId}/book?perPage=${MAX_PER_PAGE}`; const resp = await fetchAsync(marketOrderbookUrl); return resp.json(); } diff --git a/packages/pipeline/src/scripts/pull_radar_orderbook_snapshots.ts b/packages/pipeline/src/scripts/pull_radar_orderbook_snapshots.ts new file mode 100644 index 0000000000..91d33d2cc9 --- /dev/null +++ b/packages/pipeline/src/scripts/pull_radar_orderbook_snapshots.ts @@ -0,0 +1,56 @@ +import { logUtils } from '@0x/utils'; +import { RadarMarket } from '@radarrelay/types'; +import * as R from 'ramda'; +import { Connection, ConnectionOptions, createConnection } from 'typeorm'; + +import { RADAR_SOURCE, RadarSource } from '../data_sources/radar'; +import { TokenOrderbookSnapshot as TokenOrder } from '../entities'; +import * as ormConfig from '../ormconfig'; +import { parseRadarOrders } from '../parsers/radar_orders'; +import { handleError } from '../utils'; + +// Number of orders to save at once. +const BATCH_SAVE_SIZE = 1000; + +// Number of markets to retrieve orderbooks for at once. +const MARKET_ORDERBOOK_REQUEST_BATCH_SIZE = 50; + +// Delay between market orderbook requests. +const MILLISEC_MARKET_ORDERBOOK_REQUEST_DELAY = 5000; + +let connection: Connection; + +(async () => { + connection = await createConnection(ormConfig as ConnectionOptions); + const radarSource = new RadarSource(); + const markets = await radarSource.getActiveMarketsAsync(); + for (const marketsChunk of R.splitEvery(MARKET_ORDERBOOK_REQUEST_BATCH_SIZE, markets)) { + await Promise.all( + marketsChunk.map(async (market: RadarMarket) => getAndSaveMarketOrderbookAsync(radarSource, market)), + ); + await new Promise(resolve => setTimeout(resolve, MILLISEC_MARKET_ORDERBOOK_REQUEST_DELAY)); + } + process.exit(0); +})().catch(handleError); + +/** + * Retrieve orderbook from radar API for a given market. Parse orders and insert + * them into our database. + * @param radarSource Data source which can query radar API. + * @param market Object from radar API containing market data. + */ +async function getAndSaveMarketOrderbookAsync(radarSource: RadarSource, market: RadarMarket): Promise { + const orderBook = await radarSource.getMarketOrderbookAsync(market.id); + const observedTimestamp = Date.now(); + + logUtils.log(`${market.id}: Parsing orders.`); + const orders = parseRadarOrders(orderBook, market, observedTimestamp, RADAR_SOURCE); + + if (orders.length > 0) { + logUtils.log(`${market.id}: Saving ${orders.length} orders.`); + const TokenOrderRepository = connection.getRepository(TokenOrder); + await TokenOrderRepository.save(orders, { chunk: Math.ceil(orders.length / BATCH_SAVE_SIZE) }); + } else { + logUtils.log(`${market.id}: 0 orders to save.`); + } +} diff --git a/yarn.lock b/yarn.lock index fae178e3e4..444b5eeed7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -593,6 +593,14 @@ dependencies: npm-registry-client "7.0.9" +"@0xproject/types@^1.0.1-rc.3": + version "1.1.4" + resolved "https://registry.npmjs.org/@0xproject/types/-/types-1.1.4.tgz#3ffd65e670d6a21dab19ee0ffd5fad0056291b8e" + dependencies: + "@types/node" "*" + bignumber.js "~4.1.0" + ethereum-types "^1.0.11" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": version "7.0.0" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" @@ -1267,6 +1275,13 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@radarrelay/types@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@radarrelay/types/-/types-1.2.1.tgz#d16edb43d0735a31c887b9e79ff6e53924ac8cc5" + dependencies: + "@0xproject/types" "^1.0.1-rc.3" + bignumber.js "^5.0.0" + "@reach/component-component@^0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@reach/component-component/-/component-component-0.1.1.tgz#62ea2ec290da32f5e3a9872fb51f9a3ae4370cc4" @@ -3432,6 +3447,10 @@ bignumber.js@7.2.1: version "7.2.1" resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" +bignumber.js@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-5.0.0.tgz#fbce63f09776b3000a83185badcde525daf34833" + "bignumber.js@git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2": version "2.0.7" resolved "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" @@ -6404,6 +6423,13 @@ ethereum-common@^0.0.18: version "0.0.18" resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" +ethereum-types@^1.0.11: + version "1.1.6" + resolved "https://registry.npmjs.org/ethereum-types/-/ethereum-types-1.1.6.tgz#14437dbf401de361e70dac6358e5f2915ad3c35d" + dependencies: + "@types/node" "*" + bignumber.js "~4.1.0" + ethereumjs-abi@0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" @@ -7910,9 +7936,19 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@4.1.15, graceful-fs@^3.0.0, graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~1.2.0: +graceful-fs@^3.0.0: + version "3.0.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -11343,6 +11379,10 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +natives@^1.1.0: + version "1.1.6" + resolved "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -13463,8 +13503,7 @@ react-dom@^16.3.2: react-dom@^16.4.2: version "16.8.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.1.tgz#ec860f98853d09d39bafd3a6f1e12389d283dbb4" - integrity sha512-N74IZUrPt6UiDjXaO7UbDDFXeUXnVhZzeRLy/6iqqN1ipfjrhR60Bp5NuBK+rv3GMdqdIuwIl22u1SYwf330bg== + resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.8.1.tgz#ec860f98853d09d39bafd3a6f1e12389d283dbb4" dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -13528,8 +13567,8 @@ react-highlight@0xproject/react-highlight#react-peer-deps: dependencies: highlight.js "^9.11.0" highlightjs-solidity "^1.0.5" - react "^16.5.2" - react-dom "^16.5.2" + react "^16.4.2" + react-dom "^16.4.2" react-hot-loader@^4.3.3: version "4.3.4" @@ -13776,8 +13815,7 @@ react@^16.3.2: react@^16.4.2: version "16.8.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.8.1.tgz#ae11831f6cb2a05d58603a976afc8a558e852c4a" - integrity sha512-wLw5CFGPdo7p/AgteFz7GblI2JPOos0+biSoxf1FPsGxWQZdN/pj6oToJs1crn61DL3Ln7mN86uZ4j74p31ELQ== + resolved "https://registry.npmjs.org/react/-/react-16.8.1.tgz#ae11831f6cb2a05d58603a976afc8a558e852c4a" dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -14657,8 +14695,7 @@ schedule@^0.5.0: scheduler@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.1.tgz#1a217df1bfaabaf4f1b92a9127d5d732d85a9591" - integrity sha512-VJKOkiKIN2/6NOoexuypwSrybx13MY7NSy9RNt8wPvZDMRT1CW6qlpF5jXRToXNHz3uWzbm2elNpZfXfGPqP9A== + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.13.1.tgz#1a217df1bfaabaf4f1b92a9127d5d732d85a9591" dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" From d79c7f70be33334d45a3ad6664d773188c60646d Mon Sep 17 00:00:00 2001 From: fragosti Date: Tue, 12 Feb 2019 14:58:05 -0800 Subject: [PATCH 04/27] fix linting error --- packages/pipeline/src/parsers/radar_orders/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/pipeline/src/parsers/radar_orders/index.ts b/packages/pipeline/src/parsers/radar_orders/index.ts index b4f7e47688..eec67fe5e4 100644 --- a/packages/pipeline/src/parsers/radar_orders/index.ts +++ b/packages/pipeline/src/parsers/radar_orders/index.ts @@ -83,7 +83,9 @@ function _toGeneric(radarMarket: RadarMarket, radarOrder: RadarSignedOrder): Gen return { price: radarOrder.price.toString(), amount: Web3Wrapper.toUnitAmount(new BigNumber(rawAmount.toString()), radarMarket.baseTokenDecimals).toString(), + // TODO: Add remainingFillableAmount since its available }; } +// tslint:disable-next-line:no-unbound-method const _removeUndefined = R.reject(R.isNil); From d1cc08f1d90cbeb7a2bb2861e4c2b012c36b6509 Mon Sep 17 00:00:00 2001 From: fragosti Date: Wed, 13 Feb 2019 11:03:40 -0800 Subject: [PATCH 05/27] Attempt to add maker_address token_orderbook_snapshots --- ...-TokenOrderBookSnapshotsAddMakerAddress.ts | 27 ++++++++++ packages/pipeline/src/entities/token_order.ts | 2 + .../src/parsers/radar_orders/index.ts | 50 ++++++++++++++++--- .../test/entities/token_order_test.ts | 1 + 4 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 packages/pipeline/migrations/1550017139695-TokenOrderBookSnapshotsAddMakerAddress.ts diff --git a/packages/pipeline/migrations/1550017139695-TokenOrderBookSnapshotsAddMakerAddress.ts b/packages/pipeline/migrations/1550017139695-TokenOrderBookSnapshotsAddMakerAddress.ts new file mode 100644 index 0000000000..fb13c91f28 --- /dev/null +++ b/packages/pipeline/migrations/1550017139695-TokenOrderBookSnapshotsAddMakerAddress.ts @@ -0,0 +1,27 @@ +import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; + +const TOKEN_ORDERBOOK_SNAPSHOT_TABLE = 'raw.token_orderbook_snapshots'; +const NEW_COLUMN_NAME = 'maker_address'; + +export class TokenOrderBookSnapshotsAddMakerAddress1550017139695 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + const snapshotTable = await queryRunner.getTable(TOKEN_ORDERBOOK_SNAPSHOT_TABLE); + if (snapshotTable) { + await queryRunner.addColumn( + TOKEN_ORDERBOOK_SNAPSHOT_TABLE, + new TableColumn({ + name: NEW_COLUMN_NAME, + type: 'varchar', + isPrimary: true, + }), + ); + } + } + + public async down(queryRunner: QueryRunner): Promise { + const snapshotTable = await queryRunner.getTable(TOKEN_ORDERBOOK_SNAPSHOT_TABLE); + if (snapshotTable) { + await queryRunner.dropColumn(snapshotTable, NEW_COLUMN_NAME); + } + } +} diff --git a/packages/pipeline/src/entities/token_order.ts b/packages/pipeline/src/entities/token_order.ts index 2709747cb3..25baca407d 100644 --- a/packages/pipeline/src/entities/token_order.ts +++ b/packages/pipeline/src/entities/token_order.ts @@ -15,6 +15,8 @@ export class TokenOrderbookSnapshot { public price!: BigNumber; @PrimaryColumn({ name: 'base_asset_symbol' }) public baseAssetSymbol!: string; + @PrimaryColumn({ type: String, name: 'maker_address', default: 'unknown' }) + public makerAddress!: string | null; @Column({ nullable: true, type: String, name: 'base_asset_address' }) public baseAssetAddress!: string | null; @Column({ name: 'base_volume', type: 'numeric', transformer: bigNumberTransformer }) diff --git a/packages/pipeline/src/parsers/radar_orders/index.ts b/packages/pipeline/src/parsers/radar_orders/index.ts index eec67fe5e4..47d704a737 100644 --- a/packages/pipeline/src/parsers/radar_orders/index.ts +++ b/packages/pipeline/src/parsers/radar_orders/index.ts @@ -1,3 +1,4 @@ +import { ObjectMap } from '@0x/types'; import { BigNumber } from '@0x/utils'; import { Web3Wrapper } from '@0x/web3-wrapper'; import { RadarBook, RadarMarket, RadarOrderType, RadarSignedOrder } from '@radarrelay/types'; @@ -8,6 +9,12 @@ import { aggregateOrders, GenericRawOrder } from '../utils'; import { TokenOrderbookSnapshot as TokenOrder } from '../../entities'; import { OrderType } from '../../types'; +export interface AggregateOrdersByMaker { + makerAddress: string; + price: string; + amount: BigNumber; +} + /** * Marque function of this file. * 1) Takes in orders from an orderbook, @@ -23,9 +30,8 @@ export function parseRadarOrders( observedTimestamp: number, source: string, ): TokenOrder[] { - const transformToGeneric = (radarOrder: RadarSignedOrder) => _toGeneric(radarMarket, radarOrder); - const aggregatedBids = aggregateOrders(_removeUndefined(R.map(transformToGeneric, radarOrderbook.bids))); - const aggregatedAsks = aggregateOrders(_removeUndefined(R.map(transformToGeneric, radarOrderbook.asks))); + const aggregatedBids = _aggregateOrdersByMaker(radarMarket, radarOrderbook.bids); + const aggregatedAsks = _aggregateOrdersByMaker(radarMarket, radarOrderbook.asks); const parsedBids = aggregatedBids.map(order => parseRadarOrder(radarMarket, observedTimestamp, OrderType.Bid, source, order), ); @@ -43,18 +49,18 @@ export function parseRadarOrders( * @param observedTimestamp The time when the API response returned back to us. * @param orderType 'bid' or 'ask' enum. * @param source Exchange where these orders were placed. - * @param radarOrder A tuple which we will convert to volume-basis. + * @param aggregateOrder An AggregateOrdersByMaker instance which we will convert to volume-basis. */ export function parseRadarOrder( radarMarket: RadarMarket, observedTimestamp: number, orderType: OrderType, source: string, - radarOrder: [string, BigNumber], + aggregateOrder: AggregateOrdersByMaker, ): TokenOrder { const tokenOrder = new TokenOrder(); - const price = new BigNumber(radarOrder[0]); - const amount = radarOrder[1]; + const price = new BigNumber(aggregateOrder.price); + const amount = aggregateOrder.amount; const splitId = radarMarket.id.split('-'); tokenOrder.source = source; @@ -69,6 +75,8 @@ export function parseRadarOrder( tokenOrder.quoteAssetSymbol = splitId[1]; tokenOrder.quoteAssetAddress = radarMarket.quoteTokenAddress || null; tokenOrder.quoteVolume = price.times(amount); + + tokenOrder.makerAddress = aggregateOrder.makerAddress; return tokenOrder; } @@ -83,9 +91,35 @@ function _toGeneric(radarMarket: RadarMarket, radarOrder: RadarSignedOrder): Gen return { price: radarOrder.price.toString(), amount: Web3Wrapper.toUnitAmount(new BigNumber(rawAmount.toString()), radarMarket.baseTokenDecimals).toString(), - // TODO: Add remainingFillableAmount since its available }; } +function _aggregateOrdersByMaker(radarMarket: RadarMarket, radarOrders: RadarSignedOrder[]): AggregateOrdersByMaker[] { + // group all orders by their maker + const ordersByMaker: ObjectMap = radarOrders.reduce( + (acc: ObjectMap, val: RadarSignedOrder) => { + const makerAddress = val.signedOrder.makerAddress; + if (acc[makerAddress]) { + acc[makerAddress].push(val); + } else { + acc[makerAddress] = []; + } + return acc; + }, + {}, + ); + const transformToGeneric = (radarOrder: RadarSignedOrder) => _toGeneric(radarMarket, radarOrder); + const aggregationTuples: AggregateOrdersByMaker[][] = (R.keys(ordersByMaker) as string[]).map((maker: string) => { + const generalizedOrders = _removeUndefined(R.map(transformToGeneric, ordersByMaker[maker])); + const aggregatedOrders = aggregateOrders(generalizedOrders); + return aggregatedOrders.map((order: [string, BigNumber]) => ({ + makerAddress: maker, + price: order[0], + amount: order[1], + })); + }); + return R.unnest(aggregationTuples); +} + // tslint:disable-next-line:no-unbound-method const _removeUndefined = R.reject(R.isNil); diff --git a/packages/pipeline/test/entities/token_order_test.ts b/packages/pipeline/test/entities/token_order_test.ts index c6057f5aae..2101436575 100644 --- a/packages/pipeline/test/entities/token_order_test.ts +++ b/packages/pipeline/test/entities/token_order_test.ts @@ -20,6 +20,7 @@ const tokenOrderbookSnapshot: TokenOrderbookSnapshot = { quoteAssetSymbol: 'ABC', quoteAssetAddress: '0x00923b9a074762b93650716333b3e1473a15048e', quoteVolume: new BigNumber(12.3234234), + makerAddress: null, }; describe('TokenOrderbookSnapshot entity', () => { From 1cb7e70b420934f617810bad2523b25ffd2b50f9 Mon Sep 17 00:00:00 2001 From: fragosti Date: Wed, 13 Feb 2019 13:31:45 -0800 Subject: [PATCH 06/27] increment MAX_PER_PAGE to 10000 --- .../pipeline/src/data_sources/radar/index.ts | 2 +- yarn.lock | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/pipeline/src/data_sources/radar/index.ts b/packages/pipeline/src/data_sources/radar/index.ts index bbc55eef99..d6907a2d24 100644 --- a/packages/pipeline/src/data_sources/radar/index.ts +++ b/packages/pipeline/src/data_sources/radar/index.ts @@ -3,7 +3,7 @@ import { RadarBook, RadarMarket } from '@radarrelay/types'; const RADAR_BASE_URL = 'https://api.radarrelay.com/v2/'; const ACTIVE_MARKETS_URL = `${RADAR_BASE_URL}/markets`; -const MAX_PER_PAGE = 1000; +const MAX_PER_PAGE = 10000; export const RADAR_SOURCE = 'radar'; diff --git a/yarn.lock b/yarn.lock index b33ea8a8cf..b596cab7a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13500,6 +13500,15 @@ react-dom@^16.3.2: object-assign "^4.1.1" prop-types "^15.6.0" +react-dom@^16.4.2: + version "16.8.1" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.8.1.tgz#ec860f98853d09d39bafd3a6f1e12389d283dbb4" + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.1" + react-dom@^16.5.2: version "16.5.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.5.2.tgz#b69ee47aa20bab5327b2b9d7c1fe2a30f2cfa9d7" @@ -13803,6 +13812,15 @@ react@^16.3.2: object-assign "^4.1.1" prop-types "^15.6.0" +react@^16.4.2: + version "16.8.1" + resolved "https://registry.npmjs.org/react/-/react-16.8.1.tgz#ae11831f6cb2a05d58603a976afc8a558e852c4a" + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.1" + react@^16.5.2: version "16.5.2" resolved "https://registry.yarnpkg.com/react/-/react-16.5.2.tgz#19f6b444ed139baa45609eee6dc3d318b3895d42" @@ -14674,6 +14692,13 @@ schedule@^0.5.0: dependencies: object-assign "^4.1.1" +scheduler@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.13.1.tgz#1a217df1bfaabaf4f1b92a9127d5d732d85a9591" + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^0.4.4: version "0.4.7" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" From e8b60ab2926e68033100cd4253630138127490dd Mon Sep 17 00:00:00 2001 From: fragosti Date: Wed, 13 Feb 2019 13:41:20 -0800 Subject: [PATCH 07/27] Use remainingFillableAmount instead of maker/takerAssetAmount for amount field for Radar orders --- packages/pipeline/src/parsers/radar_orders/index.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/pipeline/src/parsers/radar_orders/index.ts b/packages/pipeline/src/parsers/radar_orders/index.ts index 47d704a737..c62a1f3819 100644 --- a/packages/pipeline/src/parsers/radar_orders/index.ts +++ b/packages/pipeline/src/parsers/radar_orders/index.ts @@ -84,13 +84,10 @@ function _toGeneric(radarMarket: RadarMarket, radarOrder: RadarSignedOrder): Gen if (radarMarket.baseTokenDecimals === undefined) { return undefined; } - const rawAmount = - radarOrder.type === RadarOrderType.ASK - ? radarOrder.signedOrder.makerAssetAmount - : radarOrder.signedOrder.takerAssetAmount; return { price: radarOrder.price.toString(), - amount: Web3Wrapper.toUnitAmount(new BigNumber(rawAmount.toString()), radarMarket.baseTokenDecimals).toString(), + // Use the remaining fillable amount + amount: radarOrder.remainingQuoteTokenAmount.toString(), }; } From 87da6a947d4892d100be6cef28c8920be13b8a65 Mon Sep 17 00:00:00 2001 From: fragosti Date: Thu, 14 Feb 2019 09:22:50 -0800 Subject: [PATCH 08/27] Have migration to maker_address column working --- ...-TokenOrderBookSnapshotsAddMakerAddress.ts | 27 -------------- ...-TokenOrderBookSnapshotsAddMakerAddress.ts | 36 +++++++++++++++++++ packages/pipeline/src/entities/token_order.ts | 6 ++-- .../test/entities/token_order_test.ts | 2 +- 4 files changed, 40 insertions(+), 31 deletions(-) delete mode 100644 packages/pipeline/migrations/1550017139695-TokenOrderBookSnapshotsAddMakerAddress.ts create mode 100644 packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts diff --git a/packages/pipeline/migrations/1550017139695-TokenOrderBookSnapshotsAddMakerAddress.ts b/packages/pipeline/migrations/1550017139695-TokenOrderBookSnapshotsAddMakerAddress.ts deleted file mode 100644 index fb13c91f28..0000000000 --- a/packages/pipeline/migrations/1550017139695-TokenOrderBookSnapshotsAddMakerAddress.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -const TOKEN_ORDERBOOK_SNAPSHOT_TABLE = 'raw.token_orderbook_snapshots'; -const NEW_COLUMN_NAME = 'maker_address'; - -export class TokenOrderBookSnapshotsAddMakerAddress1550017139695 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - const snapshotTable = await queryRunner.getTable(TOKEN_ORDERBOOK_SNAPSHOT_TABLE); - if (snapshotTable) { - await queryRunner.addColumn( - TOKEN_ORDERBOOK_SNAPSHOT_TABLE, - new TableColumn({ - name: NEW_COLUMN_NAME, - type: 'varchar', - isPrimary: true, - }), - ); - } - } - - public async down(queryRunner: QueryRunner): Promise { - const snapshotTable = await queryRunner.getTable(TOKEN_ORDERBOOK_SNAPSHOT_TABLE); - if (snapshotTable) { - await queryRunner.dropColumn(snapshotTable, NEW_COLUMN_NAME); - } - } -} diff --git a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts new file mode 100644 index 0000000000..01fb7b0cec --- /dev/null +++ b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts @@ -0,0 +1,36 @@ +import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; + +const TOKEN_ORDERBOOK_SNAPSHOT_TABLE = 'raw.token_orderbook_snapshots'; +const NEW_COLUMN_NAME = 'maker_address'; + +export class TokenOrderBookSnapshotsAddMakerAddress1550163069315 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + const snapshotTable = await queryRunner.getTable(TOKEN_ORDERBOOK_SNAPSHOT_TABLE); + if (snapshotTable) { + const newColumn = new TableColumn({ + name: NEW_COLUMN_NAME, + type: 'varchar', + isNullable: true, + }); + await queryRunner.addColumn(TOKEN_ORDERBOOK_SNAPSHOT_TABLE, newColumn); + // backfill null values + await queryRunner.query(` + UPDATE ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE} + SET ${NEW_COLUMN_NAME}='unknown' + WHERE ${NEW_COLUMN_NAME} is NULL; + `); + await queryRunner.query(` + ALTER TABLE ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE} + DROP CONSTRAINT "token_orderbook_snapshots_pkey", + ADD PRIMARY KEY (observed_timestamp, source, order_type, price, base_asset_symbol, quote_asset_symbol, maker_address); + `); + } + } + + public async down(queryRunner: QueryRunner): Promise { + const snapshotTable = await queryRunner.getTable(TOKEN_ORDERBOOK_SNAPSHOT_TABLE); + if (snapshotTable) { + await queryRunner.dropColumn(snapshotTable, NEW_COLUMN_NAME); + } + } +} diff --git a/packages/pipeline/src/entities/token_order.ts b/packages/pipeline/src/entities/token_order.ts index 25baca407d..a1f0006d6e 100644 --- a/packages/pipeline/src/entities/token_order.ts +++ b/packages/pipeline/src/entities/token_order.ts @@ -15,14 +15,14 @@ export class TokenOrderbookSnapshot { public price!: BigNumber; @PrimaryColumn({ name: 'base_asset_symbol' }) public baseAssetSymbol!: string; + @PrimaryColumn({ name: 'quote_asset_symbol' }) + public quoteAssetSymbol!: string; @PrimaryColumn({ type: String, name: 'maker_address', default: 'unknown' }) - public makerAddress!: string | null; + public makerAddress!: string; @Column({ nullable: true, type: String, name: 'base_asset_address' }) public baseAssetAddress!: string | null; @Column({ name: 'base_volume', type: 'numeric', transformer: bigNumberTransformer }) public baseVolume!: BigNumber; - @PrimaryColumn({ name: 'quote_asset_symbol' }) - public quoteAssetSymbol!: string; @Column({ nullable: true, type: String, name: 'quote_asset_address' }) public quoteAssetAddress!: string | null; @Column({ name: 'quote_volume', type: 'numeric', transformer: bigNumberTransformer }) diff --git a/packages/pipeline/test/entities/token_order_test.ts b/packages/pipeline/test/entities/token_order_test.ts index 2101436575..8f2df569b0 100644 --- a/packages/pipeline/test/entities/token_order_test.ts +++ b/packages/pipeline/test/entities/token_order_test.ts @@ -20,7 +20,7 @@ const tokenOrderbookSnapshot: TokenOrderbookSnapshot = { quoteAssetSymbol: 'ABC', quoteAssetAddress: '0x00923b9a074762b93650716333b3e1473a15048e', quoteVolume: new BigNumber(12.3234234), - makerAddress: null, + makerAddress: 'unknown', }; describe('TokenOrderbookSnapshot entity', () => { From 7d68378c3c1c353ec36af95401a4b0df26f206de Mon Sep 17 00:00:00 2001 From: fragosti Date: Thu, 14 Feb 2019 09:40:38 -0800 Subject: [PATCH 09/27] Fix volume calculation bug --- packages/pipeline/src/parsers/radar_orders/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pipeline/src/parsers/radar_orders/index.ts b/packages/pipeline/src/parsers/radar_orders/index.ts index c62a1f3819..4a0a33579e 100644 --- a/packages/pipeline/src/parsers/radar_orders/index.ts +++ b/packages/pipeline/src/parsers/radar_orders/index.ts @@ -87,7 +87,7 @@ function _toGeneric(radarMarket: RadarMarket, radarOrder: RadarSignedOrder): Gen return { price: radarOrder.price.toString(), // Use the remaining fillable amount - amount: radarOrder.remainingQuoteTokenAmount.toString(), + amount: radarOrder.remainingBaseTokenAmount.toString(), }; } From cb5b5167fc6de477d22596073a51ec2a536b1ea0 Mon Sep 17 00:00:00 2001 From: fragosti Date: Thu, 14 Feb 2019 10:40:10 -0800 Subject: [PATCH 10/27] Fix type bug around Radar response --- .../pipeline/src/data_sources/radar/index.ts | 23 +++++++++++++++++-- .../src/parsers/radar_orders/index.ts | 3 +-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/pipeline/src/data_sources/radar/index.ts b/packages/pipeline/src/data_sources/radar/index.ts index d6907a2d24..434d2e4631 100644 --- a/packages/pipeline/src/data_sources/radar/index.ts +++ b/packages/pipeline/src/data_sources/radar/index.ts @@ -1,5 +1,6 @@ +import { orderParsingUtils } from '@0x/order-utils'; import { fetchAsync, logUtils } from '@0x/utils'; -import { RadarBook, RadarMarket } from '@radarrelay/types'; +import { RadarBook, RadarMarket, RadarSignedOrder } from '@radarrelay/types'; const RADAR_BASE_URL = 'https://api.radarrelay.com/v2/'; const ACTIVE_MARKETS_URL = `${RADAR_BASE_URL}/markets`; @@ -10,6 +11,17 @@ export const RADAR_SOURCE = 'radar'; // tslint:disable:prefer-function-over-method // ^ Keep consistency with other sources and help logical organization export class RadarSource { + private static _parseRadarOrderResponse(radarOrderResponse: any): RadarSignedOrder { + return { + ...radarOrderResponse, + ...orderParsingUtils.convertStringsFieldsToBigNumbers(radarOrderResponse, [ + 'remainingBaseTokenAmount', + 'remainingQuoteTokenAmount', + 'price', + ]), + signedOrder: orderParsingUtils.convertOrderStringFieldsToBigNumber(radarOrderResponse.signedOrder), + }; + } /** * Call Radar API to find out which markets they are maintaining orderbooks for. */ @@ -29,6 +41,13 @@ export class RadarSource { logUtils.log(`${marketId}: Retrieving orderbook.`); const marketOrderbookUrl = `${ACTIVE_MARKETS_URL}/${marketId}/book?perPage=${MAX_PER_PAGE}`; const resp = await fetchAsync(marketOrderbookUrl); - return resp.json(); + const jsonResp = await resp.json(); + return { + ...jsonResp, + // tslint:disable-next-line:no-unbound-method + bids: jsonResp.bids.map(RadarSource._parseRadarOrderResponse), + // tslint:disable-next-line:no-unbound-method + asks: jsonResp.asks.map(RadarSource._parseRadarOrderResponse), + }; } } diff --git a/packages/pipeline/src/parsers/radar_orders/index.ts b/packages/pipeline/src/parsers/radar_orders/index.ts index 4a0a33579e..48b16fe3fd 100644 --- a/packages/pipeline/src/parsers/radar_orders/index.ts +++ b/packages/pipeline/src/parsers/radar_orders/index.ts @@ -1,7 +1,6 @@ import { ObjectMap } from '@0x/types'; import { BigNumber } from '@0x/utils'; -import { Web3Wrapper } from '@0x/web3-wrapper'; -import { RadarBook, RadarMarket, RadarOrderType, RadarSignedOrder } from '@radarrelay/types'; +import { RadarBook, RadarMarket, RadarSignedOrder } from '@radarrelay/types'; import * as R from 'ramda'; import { aggregateOrders, GenericRawOrder } from '../utils'; From 58d51e039ceba8449e3c5cba7a45f4547870b264 Mon Sep 17 00:00:00 2001 From: fragosti Date: Thu, 14 Feb 2019 10:45:48 -0800 Subject: [PATCH 11/27] Rename migration to what it is called on prod and qa --- .../1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts index 01fb7b0cec..38c764b46c 100644 --- a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts +++ b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts @@ -21,7 +21,7 @@ export class TokenOrderBookSnapshotsAddMakerAddress1550163069315 implements Migr `); await queryRunner.query(` ALTER TABLE ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE} - DROP CONSTRAINT "token_orderbook_snapshots_pkey", + DROP CONSTRAINT "token_orderbook_snapshots_pkey1", ADD PRIMARY KEY (observed_timestamp, source, order_type, price, base_asset_symbol, quote_asset_symbol, maker_address); `); } From 8f7145f80ae8a7b97aaeaedde05fa826c099f83f Mon Sep 17 00:00:00 2001 From: fragosti Date: Thu, 14 Feb 2019 15:07:09 -0800 Subject: [PATCH 12/27] Add parsing radar order test --- .../pipeline/src/data_sources/radar/index.ts | 6 +- .../test/data_sources/radar/index_test.ts | 77 +++++++++++++++++++ 2 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 packages/pipeline/test/data_sources/radar/index_test.ts diff --git a/packages/pipeline/src/data_sources/radar/index.ts b/packages/pipeline/src/data_sources/radar/index.ts index 434d2e4631..873b0fefe2 100644 --- a/packages/pipeline/src/data_sources/radar/index.ts +++ b/packages/pipeline/src/data_sources/radar/index.ts @@ -11,7 +11,7 @@ export const RADAR_SOURCE = 'radar'; // tslint:disable:prefer-function-over-method // ^ Keep consistency with other sources and help logical organization export class RadarSource { - private static _parseRadarOrderResponse(radarOrderResponse: any): RadarSignedOrder { + public static parseRadarOrderResponse(radarOrderResponse: any): RadarSignedOrder { return { ...radarOrderResponse, ...orderParsingUtils.convertStringsFieldsToBigNumbers(radarOrderResponse, [ @@ -45,9 +45,9 @@ export class RadarSource { return { ...jsonResp, // tslint:disable-next-line:no-unbound-method - bids: jsonResp.bids.map(RadarSource._parseRadarOrderResponse), + bids: jsonResp.bids.map(RadarSource.parseRadarOrderResponse), // tslint:disable-next-line:no-unbound-method - asks: jsonResp.asks.map(RadarSource._parseRadarOrderResponse), + asks: jsonResp.asks.map(RadarSource.parseRadarOrderResponse), }; } } diff --git a/packages/pipeline/test/data_sources/radar/index_test.ts b/packages/pipeline/test/data_sources/radar/index_test.ts new file mode 100644 index 0000000000..9a1eacb164 --- /dev/null +++ b/packages/pipeline/test/data_sources/radar/index_test.ts @@ -0,0 +1,77 @@ +import { BigNumber } from '@0x/utils'; +import { RadarOrderState, RadarOrderType } from '@radarrelay/types'; +import * as chai from 'chai'; +import 'mocha'; +import * as R from 'ramda'; + +import { RadarSource } from '../../../src/data_sources/radar'; +import { chaiSetup } from '../../utils/chai_setup'; + +chaiSetup.configure(); +const expect = chai.expect; + +const rawResponse = { + orderHash: '0x60bc235f7887a50801c8fc1fc18fb0625ac5f3962cdc1bd59567a6929db8b2ec', + type: 'BID', + state: 'OPEN', + baseTokenAddress: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + quoteTokenAddress: '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359', + remainingBaseTokenAmount: '9.079731811797989766', + remainingQuoteTokenAmount: '1099.999999999999999889', + price: '121.14895272244560081697', + createdDate: '2019-02-13 21:35:53', + signedOrder: { + exchangeAddress: '0x4f833a24e1f95d70f028921e27040ca56e09ab0b', + senderAddress: '0x0000000000000000000000000000000000000000', + makerAddress: '0x56178a0d5f301baf6cf3e1cd53d9863437345bf9', + takerAddress: '0x0000000000000000000000000000000000000000', + makerAssetData: '0xf47261b000000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359', + takerAssetData: '0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + feeRecipientAddress: '0xa258b39954cef5cb142fd567a46cddb31a670124', + makerAssetAmount: '1099999999999999999889', + takerAssetAmount: '9079731811797989766', + makerFee: '0', + takerFee: '0', + expirationTimeSeconds: '1550094353', + signature: + '0x1ce161d02ad63fe7308e9cd5e97583a8873331d1b72d90e9f3863d9fcba2518cb91ab2fe7de94e4afb39742acdc820abbff2dc0622c8d3865917fade62f16322ae03', + salt: '1550093753237', + }, +}; + +const parsedResponse = { + orderHash: '0x60bc235f7887a50801c8fc1fc18fb0625ac5f3962cdc1bd59567a6929db8b2ec', + type: 'BID' as RadarOrderType, + state: 'OPEN' as RadarOrderState, + baseTokenAddress: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + quoteTokenAddress: '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359', + remainingBaseTokenAmount: new BigNumber('9.079731811797989766'), + remainingQuoteTokenAmount: new BigNumber('1099.999999999999999889'), + price: new BigNumber('121.14895272244560081697'), + createdDate: '2019-02-13 21:35:53', + signedOrder: { + exchangeAddress: '0x4f833a24e1f95d70f028921e27040ca56e09ab0b', + senderAddress: '0x0000000000000000000000000000000000000000', + makerAddress: '0x56178a0d5f301baf6cf3e1cd53d9863437345bf9', + takerAddress: '0x0000000000000000000000000000000000000000', + makerAssetData: '0xf47261b000000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359', + takerAssetData: '0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + feeRecipientAddress: '0xa258b39954cef5cb142fd567a46cddb31a670124', + makerAssetAmount: new BigNumber('1099999999999999999889'), + takerAssetAmount: new BigNumber('9079731811797989766'), + makerFee: new BigNumber('0'), + takerFee: new BigNumber('0'), + expirationTimeSeconds: new BigNumber('1550094353'), + signature: + '0x1ce161d02ad63fe7308e9cd5e97583a8873331d1b72d90e9f3863d9fcba2518cb91ab2fe7de94e4afb39742acdc820abbff2dc0622c8d3865917fade62f16322ae03', + salt: new BigNumber('1550093753237'), + }, +}; + +describe('RadarSource', () => { + describe('parseRadarOrderResponse', () => { + it('Correctly parses a Radar orderbook response to a RadarBook', () => { + expect(RadarSource.parseRadarOrderResponse(rawResponse)).deep.equal(parsedResponse); + }); + }); +}); From f33f808dc79672f00b336164274e03d9f837d4e0 Mon Sep 17 00:00:00 2001 From: fragosti Date: Thu, 14 Feb 2019 17:17:35 -0800 Subject: [PATCH 13/27] fix null column constraint issue --- packages/pipeline/src/parsers/ddex_orders/index.ts | 2 ++ packages/pipeline/src/parsers/idex_orders/index.ts | 1 + packages/pipeline/src/parsers/oasis_orders/index.ts | 1 + packages/pipeline/src/parsers/paradex_orders/index.ts | 1 + 4 files changed, 5 insertions(+) diff --git a/packages/pipeline/src/parsers/ddex_orders/index.ts b/packages/pipeline/src/parsers/ddex_orders/index.ts index 562f894ab6..7e9bbb18aa 100644 --- a/packages/pipeline/src/parsers/ddex_orders/index.ts +++ b/packages/pipeline/src/parsers/ddex_orders/index.ts @@ -65,5 +65,7 @@ export function parseDdexOrder( tokenOrder.quoteAssetSymbol = ddexMarket.quoteToken; tokenOrder.quoteAssetAddress = ddexMarket.quoteTokenAddress; tokenOrder.quoteVolume = price.times(amount); + + tokenOrder.makerAddress = 'unknown'; return tokenOrder; } diff --git a/packages/pipeline/src/parsers/idex_orders/index.ts b/packages/pipeline/src/parsers/idex_orders/index.ts index 14b8711958..8620236b89 100644 --- a/packages/pipeline/src/parsers/idex_orders/index.ts +++ b/packages/pipeline/src/parsers/idex_orders/index.ts @@ -65,6 +65,7 @@ export function parseIdexOrder( tokenOrder.price = price; tokenOrder.baseVolume = amount; tokenOrder.quoteVolume = price.times(amount); + tokenOrder.makerAddress = 'unknown'; if (orderType === OrderType.Bid) { tokenOrder.baseAssetSymbol = idexOrderParam.buySymbol; diff --git a/packages/pipeline/src/parsers/oasis_orders/index.ts b/packages/pipeline/src/parsers/oasis_orders/index.ts index b71fb65b90..145a547c0b 100644 --- a/packages/pipeline/src/parsers/oasis_orders/index.ts +++ b/packages/pipeline/src/parsers/oasis_orders/index.ts @@ -67,5 +67,6 @@ export function parseOasisOrder( tokenOrder.quoteAssetSymbol = oasisMarket.quote; tokenOrder.quoteAssetAddress = null; // Oasis doesn't provide address information tokenOrder.quoteVolume = price.times(amount); + tokenOrder.makerAddress = 'unknown'; return tokenOrder; } diff --git a/packages/pipeline/src/parsers/paradex_orders/index.ts b/packages/pipeline/src/parsers/paradex_orders/index.ts index 85990dae4f..5f41d9676c 100644 --- a/packages/pipeline/src/parsers/paradex_orders/index.ts +++ b/packages/pipeline/src/parsers/paradex_orders/index.ts @@ -62,5 +62,6 @@ export function parseParadexOrder( tokenOrder.quoteAssetSymbol = paradexMarket.quoteToken; tokenOrder.quoteAssetAddress = paradexMarket.quoteTokenAddress as string; tokenOrder.quoteVolume = price.times(amount); + tokenOrder.makerAddress = 'unknown'; return tokenOrder; } From 169b8807f72f144d6b481e03233e48203dc2dac4 Mon Sep 17 00:00:00 2001 From: David Sun Date: Tue, 19 Feb 2019 16:10:35 -0500 Subject: [PATCH 14/27] removed react-document-title in favor of using react-helmet for consistency and bug fix --- packages/website/package.json | 1 - packages/website/ts/components/documentTitle.tsx | 12 ++++++++++++ packages/website/ts/components/meta_tags.tsx | 2 +- packages/website/ts/components/portal/portal.tsx | 2 +- packages/website/ts/index.tsx | 1 - packages/website/ts/pages/about/jobs.tsx | 2 +- packages/website/ts/pages/about/mission.tsx | 2 +- packages/website/ts/pages/about/press.tsx | 2 +- packages/website/ts/pages/about/team.tsx | 2 +- packages/website/ts/pages/credits.tsx | 2 ++ .../ts/pages/documentation/developers_page.tsx | 2 +- packages/website/ts/pages/ecosystem.tsx | 2 +- packages/website/ts/pages/faq/faq.tsx | 2 +- packages/website/ts/pages/governance/governance.tsx | 2 +- packages/website/ts/pages/instant.tsx | 2 +- packages/website/ts/pages/landing.tsx | 2 +- packages/website/ts/pages/launch_kit.tsx | 3 ++- packages/website/ts/pages/market_maker.tsx | 2 ++ packages/website/ts/pages/vote_placeholder.tsx | 2 +- packages/website/ts/pages/why.tsx | 2 +- 20 files changed, 32 insertions(+), 17 deletions(-) create mode 100644 packages/website/ts/components/documentTitle.tsx diff --git a/packages/website/package.json b/packages/website/package.json index 5dff93c957..e5c5e97b6e 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -57,7 +57,6 @@ "rc-slider": "^8.6.3", "react": "^16.5.2", "react-copy-to-clipboard": "^5.0.0", - "react-document-title": "^2.0.3", "react-dom": "^16.5.2", "react-flickity-component": "^3.1.0", "react-headroom": "2.2.2", diff --git a/packages/website/ts/components/documentTitle.tsx b/packages/website/ts/components/documentTitle.tsx new file mode 100644 index 0000000000..5b19fe5f72 --- /dev/null +++ b/packages/website/ts/components/documentTitle.tsx @@ -0,0 +1,12 @@ +import * as React from 'react'; +import { Helmet } from 'react-helmet'; + +export interface DocumentTitleProps { + title: string; +} + +export const DocumentTitle: React.StatelessComponent = ({ title }) => ( + + {title} + +); diff --git a/packages/website/ts/components/meta_tags.tsx b/packages/website/ts/components/meta_tags.tsx index f6c43d23f6..a191b45c68 100644 --- a/packages/website/ts/components/meta_tags.tsx +++ b/packages/website/ts/components/meta_tags.tsx @@ -9,7 +9,7 @@ export interface MetaTagsProps { export const MetaTags: React.StatelessComponent = ({ title, description, imgSrc }) => ( - {title} + {/* {title} */} diff --git a/packages/website/ts/components/portal/portal.tsx b/packages/website/ts/components/portal/portal.tsx index 6ebbf8d1fb..e57eec11ac 100644 --- a/packages/website/ts/components/portal/portal.tsx +++ b/packages/website/ts/components/portal/portal.tsx @@ -2,13 +2,13 @@ import { colors, Link } from '@0x/react-shared'; import { BigNumber } from '@0x/utils'; import * as _ from 'lodash'; import * as React from 'react'; -import * as DocumentTitle from 'react-document-title'; import { Route, RouteComponentProps, Switch } from 'react-router-dom'; import { Blockchain } from 'ts/blockchain'; import { BlockchainErrDialog } from 'ts/components/dialogs/blockchain_err_dialog'; import { LedgerConfigDialog } from 'ts/components/dialogs/ledger_config_dialog'; import { PortalDisclaimerDialog } from 'ts/components/dialogs/portal_disclaimer_dialog'; +import { DocumentTitle } from 'ts/components/documentTitle'; import { EthWrappers } from 'ts/components/eth_wrappers'; import { FillOrder } from 'ts/components/fill_order'; import { AssetPicker } from 'ts/components/generate_order/asset_picker'; diff --git a/packages/website/ts/index.tsx b/packages/website/ts/index.tsx index 403db1dc22..bd80e4a21e 100644 --- a/packages/website/ts/index.tsx +++ b/packages/website/ts/index.tsx @@ -133,7 +133,6 @@ render( - { public render(): React.ReactNode { return ( + { public render(): React.ReactNode { return ( + Date: Tue, 19 Feb 2019 16:13:26 -0500 Subject: [PATCH 15/27] fixed title comment-out --- packages/website/ts/components/meta_tags.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/website/ts/components/meta_tags.tsx b/packages/website/ts/components/meta_tags.tsx index a191b45c68..f6c43d23f6 100644 --- a/packages/website/ts/components/meta_tags.tsx +++ b/packages/website/ts/components/meta_tags.tsx @@ -9,7 +9,7 @@ export interface MetaTagsProps { export const MetaTags: React.StatelessComponent = ({ title, description, imgSrc }) => ( - {/* {title} */} + {title} From 0c871b67cad84a73c461eec51c4fb24fecd87293 Mon Sep 17 00:00:00 2001 From: fragosti Date: Tue, 19 Feb 2019 16:58:11 -0800 Subject: [PATCH 16/27] Add parser test for Radar orderbook parsing --- packages/pipeline/test/parsers/ddex_orders/index_test.ts | 2 +- packages/pipeline/test/parsers/idex_orders/index_test.ts | 4 ++-- packages/pipeline/test/parsers/oasis_orders/index_test.ts | 2 +- packages/pipeline/test/parsers/paradex_orders/index_test.ts | 2 +- packages/pipeline/test/parsers/radar_orders/index_test.ts | 0 5 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 packages/pipeline/test/parsers/radar_orders/index_test.ts diff --git a/packages/pipeline/test/parsers/ddex_orders/index_test.ts b/packages/pipeline/test/parsers/ddex_orders/index_test.ts index d6f69e090e..7eb74ed09e 100644 --- a/packages/pipeline/test/parsers/ddex_orders/index_test.ts +++ b/packages/pipeline/test/parsers/ddex_orders/index_test.ts @@ -44,7 +44,7 @@ describe('ddex_orders', () => { expected.baseAssetSymbol = 'DEF'; expected.baseAssetAddress = '0xb45df06e38540a675fdb5b598abf2c0dbe9d6b81'; expected.baseVolume = new BigNumber(10); - + expected.makerAddress = 'unknown'; const actual = parseDdexOrder(ddexMarket, observedTimestamp, orderType, source, ddexOrder); expect(actual).deep.equal(expected); }); diff --git a/packages/pipeline/test/parsers/idex_orders/index_test.ts b/packages/pipeline/test/parsers/idex_orders/index_test.ts index 48b019732a..0c7c642ce2 100644 --- a/packages/pipeline/test/parsers/idex_orders/index_test.ts +++ b/packages/pipeline/test/parsers/idex_orders/index_test.ts @@ -45,7 +45,7 @@ describe('idex_orders', () => { expected.quoteAssetSymbol = 'DEF'; expected.quoteAssetAddress = '0xb45df06e38540a675fdb5b598abf2c0dbe9d6b81'; expected.quoteVolume = new BigNumber(5); - + expected.makerAddress = 'unknown'; const actual = parseIdexOrder(idexOrderParam, observedTimestamp, orderType, source, idexOrder); expect(actual).deep.equal(expected); }); @@ -79,7 +79,7 @@ describe('idex_orders', () => { expected.quoteAssetSymbol = 'DEF'; expected.quoteAssetAddress = '0xb45df06e38540a675fdb5b598abf2c0dbe9d6b81'; expected.quoteVolume = new BigNumber(5); - + expected.makerAddress = 'unknown'; const actual = parseIdexOrder(idexOrderParam, observedTimestamp, orderType, source, idexOrder); expect(actual).deep.equal(expected); }); diff --git a/packages/pipeline/test/parsers/oasis_orders/index_test.ts b/packages/pipeline/test/parsers/oasis_orders/index_test.ts index 401fedff87..7ef86ee10c 100644 --- a/packages/pipeline/test/parsers/oasis_orders/index_test.ts +++ b/packages/pipeline/test/parsers/oasis_orders/index_test.ts @@ -41,7 +41,7 @@ describe('oasis_orders', () => { expected.quoteAssetSymbol = 'ABC'; expected.quoteAssetAddress = null; expected.quoteVolume = new BigNumber(5); - + expected.makerAddress = 'unknown'; const actual = parseOasisOrder(oasisMarket, observedTimestamp, orderType, source, oasisOrder); expect(actual).deep.equal(expected); }); diff --git a/packages/pipeline/test/parsers/paradex_orders/index_test.ts b/packages/pipeline/test/parsers/paradex_orders/index_test.ts index c5dd8751b2..10ac1ecdc9 100644 --- a/packages/pipeline/test/parsers/paradex_orders/index_test.ts +++ b/packages/pipeline/test/parsers/paradex_orders/index_test.ts @@ -46,7 +46,7 @@ describe('paradex_orders', () => { expected.quoteAssetSymbol = 'ABC'; expected.quoteAssetAddress = '0x0000000000000000000000000000000000000000'; expected.quoteVolume = new BigNumber(412 * 0.1245); - + expected.makerAddress = 'unknown'; const actual = parseParadexOrder(paradexMarket, observedTimestamp, orderType, source, paradexOrder); expect(actual).deep.equal(expected); }); diff --git a/packages/pipeline/test/parsers/radar_orders/index_test.ts b/packages/pipeline/test/parsers/radar_orders/index_test.ts new file mode 100644 index 0000000000..e69de29bb2 From 12fd9c29f0c843746f0e6e979feee8bf21bde764 Mon Sep 17 00:00:00 2001 From: fragosti Date: Tue, 19 Feb 2019 17:19:12 -0800 Subject: [PATCH 17/27] Add radar_orders parseRadarOrder test --- .../test/parsers/radar_orders/index_test.ts | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/packages/pipeline/test/parsers/radar_orders/index_test.ts b/packages/pipeline/test/parsers/radar_orders/index_test.ts index e69de29bb2..e3004d7c2a 100644 --- a/packages/pipeline/test/parsers/radar_orders/index_test.ts +++ b/packages/pipeline/test/parsers/radar_orders/index_test.ts @@ -0,0 +1,56 @@ +import { BigNumber } from '@0x/utils'; +import { RadarBook, RadarMarket, RadarSignedOrder } from '@radarrelay/types'; +import * as chai from 'chai'; +import 'mocha'; + +import { TokenOrderbookSnapshot as TokenOrder } from '../../../src/entities'; +import { AggregateOrdersByMaker, parseRadarOrder } from '../../../src/parsers/radar_orders'; +import { OrderType } from '../../../src/types'; +import { chaiSetup } from '../../utils/chai_setup'; + +chaiSetup.configure(); +const expect = chai.expect; + +// tslint:disable:custom-no-magic-numbers +describe('radar_orders', () => { + describe('parseRadarOrder', () => { + it('converts radarOrder to TokenOrder entity', () => { + const radarOrder: AggregateOrdersByMaker = { + makerAddress: '0x6eC92694ea172ebC430C30fa31De87620967A082', + price: '0.01', + amount: new BigNumber(10000000000), + }; + const radarMarket = ({ + id: 'WETH-DAI', + displayName: 'WETH/DAI', + baseTokenAddress: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + quoteTokenAddress: '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359', + baseTokenDecimals: 18, + quoteTokenDecimals: 18, + quoteIncrement: 8, + minOrderSize: new BigNumber('0.00692535'), + maxOrderSize: new BigNumber('1000000000'), + score: 99.66, + // Radar types are defined using an older version of BigNumber, so need to be force cast. + } as any) as RadarMarket; + const observedTimestamp: number = Date.now(); + const orderType: OrderType = OrderType.Bid; + const source: string = 'radar'; + + const expected = new TokenOrder(); + expected.source = 'radar'; + expected.observedTimestamp = observedTimestamp; + expected.orderType = OrderType.Bid; + expected.price = new BigNumber(0.01); + expected.quoteAssetSymbol = 'DAI'; + expected.quoteAssetAddress = '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359'; + expected.quoteVolume = new BigNumber(100000000); + expected.baseAssetSymbol = 'WETH'; + expected.baseAssetAddress = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'; + expected.baseVolume = new BigNumber(10000000000); + expected.makerAddress = '0x6eC92694ea172ebC430C30fa31De87620967A082'; + const actual = parseRadarOrder(radarMarket, observedTimestamp, orderType, source, radarOrder); + expect(actual).deep.equal(expected); + }); + }); +}); From 426190181b322baf566a8c525399dad35294a3a8 Mon Sep 17 00:00:00 2001 From: David Sun Date: Tue, 19 Feb 2019 23:33:48 -0500 Subject: [PATCH 18/27] added metadata for pages (incomplete) --- .../website/ts/document_meta_constants.tsx | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 packages/website/ts/document_meta_constants.tsx diff --git a/packages/website/ts/document_meta_constants.tsx b/packages/website/ts/document_meta_constants.tsx new file mode 100644 index 0000000000..db48fad191 --- /dev/null +++ b/packages/website/ts/document_meta_constants.tsx @@ -0,0 +1,63 @@ +export interface DocumentMetadata { + title: string; + description: string; + keywords: string; +} + +export const documentConstants: { [s: string]: DocumentMetadata } = { + LANDING: { + title: '0x: Powering the decentralized exchange of tokens on Ethereum', + description: '0x is an open protocol that enables the peer-to-peer exchange of assets on the Ethereum blockchain.', + keywords: 'DEX, Decentralized Exchange, Ethereum, 0x, 0x Protocol, Tokens, ZRX, Crypto Exchange, Cryptocurrency, Crypto, DeFi, Decentralized Finance, Open Finance, NFTs, Non Fungible Tokens, Exchange Protocol, Relayer, Exchange Functionality, Crypto Developers, 0x Instant, Crypto Market Maker, Networked Liquidity, 0x Home, Crypto Infrastructure, Build on 0x, Crypto', + }, + WHY: { + title: '0x: Features and Benefits', + description: '0x Protocol is free, open-source infrastructure that developers and businesses utilize to build products that enable the purchasing and trading of crypto tokens.', + keywords: '', + }, + INSTANT: { + title: '0x Instant: Quick and secure crypto purchasing', + description: 'A free and flexible way to offer simple crypto purchasing in any app or website.', + keywords: '', + }, + LAUNCH_KIT: { + title: '0x Launch Kit: Launch a relayer in under a minute', + description: 'Launch Kit includes a set of tools and documentation to build a relayer on 0x.', + keywords: '', + }, + ABOUT: { + title: '0x: Our Mission and Values', + description: 'As more assets become tokenized, 0x provides the critical exchange layer in a new financial stack that is more efficient, transparent, and equitable than any system in the past.', + keywords: '', + }, + TEAM: { + title: '0x: Our Team', + description: 'The 0x Core Team is passionate about accelerating the adoption decentralized technology and believe in its potential to be an equalizing force in the world. Join us and do the most impactful work of your life.', + keywords: '', + }, + PRESS: { + title: '0x: Press Highlights', + description: '0x has been featured in major publications such as Forbes, Fortune, VentureBeat, and TechCrunch.', + keywords: '', + }, + JOBS: { + title: 'Jobs at 0x', + description: 'Join us in building infrastructure upon which the exchange of all tokenized assets will take place.', + keywords: '', + }, + ECOSYSTEM_PROGRAM: { + title: '0x Ecosystem Acceleration Program: Jumpstart your Business on 0x', + description: 'The Ecosystem Acceleration Program gives teams access to a variety of services including funding, dedicated technical support, and recruiting assistance.', + keywords: '', + }, + MARKET_MAKER_PROGRAM: { + title: '0x Market Maker Program: Bring liquidity to the markets of the future', + description: 'The Market Making Program provides a set of resources that help onboard MMs to bring liquidity to the 0x network. The Program includes tutorials, monetary incentives, and 1:1 support from the 0x team.', + keywords: '', + }, + INFRASTRUCTURE_CREDITS: { + title: 'Free Credits - 0x', + description: '', + keywords: '', + }, +}; From bc7e62db9f4dd3f70d6f8cbb9cdecd01a5b4d278 Mon Sep 17 00:00:00 2001 From: fragosti Date: Wed, 20 Feb 2019 11:40:49 -0800 Subject: [PATCH 19/27] Throw error if cannot find error in table --- .../1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts index 38c764b46c..1d3b3c3ab5 100644 --- a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts +++ b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts @@ -24,6 +24,8 @@ export class TokenOrderBookSnapshotsAddMakerAddress1550163069315 implements Migr DROP CONSTRAINT "token_orderbook_snapshots_pkey1", ADD PRIMARY KEY (observed_timestamp, source, order_type, price, base_asset_symbol, quote_asset_symbol, maker_address); `); + } else { + throw new Error(`Could not find table with name ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE}`); } } @@ -31,6 +33,8 @@ export class TokenOrderBookSnapshotsAddMakerAddress1550163069315 implements Migr const snapshotTable = await queryRunner.getTable(TOKEN_ORDERBOOK_SNAPSHOT_TABLE); if (snapshotTable) { await queryRunner.dropColumn(snapshotTable, NEW_COLUMN_NAME); + } else { + throw new Error(`Could not find table with name ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE}`); } } } From ef5195db901a5ba2546c98f08d26200c8cb0d5b6 Mon Sep 17 00:00:00 2001 From: fragosti Date: Wed, 20 Feb 2019 11:43:32 -0800 Subject: [PATCH 20/27] Fix marquee typo --- packages/pipeline/src/parsers/ddex_orders/index.ts | 2 +- packages/pipeline/src/parsers/idex_orders/index.ts | 2 +- packages/pipeline/src/parsers/oasis_orders/index.ts | 2 +- packages/pipeline/src/parsers/paradex_orders/index.ts | 2 +- packages/pipeline/src/parsers/radar_orders/index.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/pipeline/src/parsers/ddex_orders/index.ts b/packages/pipeline/src/parsers/ddex_orders/index.ts index 7e9bbb18aa..8fe3c32bfd 100644 --- a/packages/pipeline/src/parsers/ddex_orders/index.ts +++ b/packages/pipeline/src/parsers/ddex_orders/index.ts @@ -7,7 +7,7 @@ import { TokenOrderbookSnapshot as TokenOrder } from '../../entities'; import { OrderType } from '../../types'; /** - * Marque function of this file. + * Marquee function of this file. * 1) Takes in orders from an orderbook, * other information attached. * @param ddexOrderbook A raw orderbook that we pull from the Ddex API. diff --git a/packages/pipeline/src/parsers/idex_orders/index.ts b/packages/pipeline/src/parsers/idex_orders/index.ts index 8620236b89..da66d7c13d 100644 --- a/packages/pipeline/src/parsers/idex_orders/index.ts +++ b/packages/pipeline/src/parsers/idex_orders/index.ts @@ -7,7 +7,7 @@ import { TokenOrderbookSnapshot as TokenOrder } from '../../entities'; import { OrderType } from '../../types'; /** - * Marque function of this file. + * Marquee function of this file. * 1) Takes in orders from an orderbook, * 2) Aggregates them by price point, * 3) Parses them into entities which are then saved into the database. diff --git a/packages/pipeline/src/parsers/oasis_orders/index.ts b/packages/pipeline/src/parsers/oasis_orders/index.ts index 145a547c0b..bb3ca97fa6 100644 --- a/packages/pipeline/src/parsers/oasis_orders/index.ts +++ b/packages/pipeline/src/parsers/oasis_orders/index.ts @@ -8,7 +8,7 @@ import { TokenOrderbookSnapshot as TokenOrder } from '../../entities'; import { OrderType } from '../../types'; /** - * Marque function of this file. + * Marquee function of this file. * 1) Takes in orders from an orderbook, * 2) Aggregates them according to price point, * 3) Builds TokenOrder entity with other information attached. diff --git a/packages/pipeline/src/parsers/paradex_orders/index.ts b/packages/pipeline/src/parsers/paradex_orders/index.ts index 5f41d9676c..20e442d5a9 100644 --- a/packages/pipeline/src/parsers/paradex_orders/index.ts +++ b/packages/pipeline/src/parsers/paradex_orders/index.ts @@ -5,7 +5,7 @@ import { TokenOrderbookSnapshot as TokenOrder } from '../../entities'; import { OrderType } from '../../types'; /** - * Marque function of this file. + * Marquee function of this file. * 1) Takes in orders from an orderbook (orders are already aggregated by price point), * 2) For each aggregated order, forms a TokenOrder entity with market data and * other information attached. diff --git a/packages/pipeline/src/parsers/radar_orders/index.ts b/packages/pipeline/src/parsers/radar_orders/index.ts index 48b16fe3fd..20472766d1 100644 --- a/packages/pipeline/src/parsers/radar_orders/index.ts +++ b/packages/pipeline/src/parsers/radar_orders/index.ts @@ -15,7 +15,7 @@ export interface AggregateOrdersByMaker { } /** - * Marque function of this file. + * Marquee function of this file. * 1) Takes in orders from an orderbook, * other information attached. * @param radarOrderbook A raw orderbook that we pull from the radar API. From 4952cd5afb0505e5b3f73ba373372cf941c04e19 Mon Sep 17 00:00:00 2001 From: fragosti Date: Wed, 20 Feb 2019 13:45:14 -0800 Subject: [PATCH 21/27] Factor out redundant source param in parse order functions --- .../pipeline/src/parsers/ddex_orders/index.ts | 15 ++++----------- .../pipeline/src/parsers/idex_orders/index.ts | 17 +++++------------ .../pipeline/src/parsers/oasis_orders/index.ts | 11 ++++------- .../src/parsers/paradex_orders/index.ts | 12 ++++-------- .../pipeline/src/parsers/radar_orders/index.ts | 11 ++++------- .../scripts/pull_ddex_orderbook_snapshots.ts | 4 ++-- .../scripts/pull_idex_orderbook_snapshots.ts | 4 ++-- .../scripts/pull_oasis_orderbook_snapshots.ts | 4 ++-- .../scripts/pull_paradex_orderbook_snapshots.ts | 3 +-- .../scripts/pull_radar_orderbook_snapshots.ts | 4 ++-- .../test/data_sources/radar/index_test.ts | 1 - .../test/parsers/ddex_orders/index_test.ts | 3 +-- .../test/parsers/idex_orders/index_test.ts | 6 ++---- .../test/parsers/oasis_orders/index_test.ts | 3 +-- .../test/parsers/paradex_orders/index_test.ts | 3 +-- .../test/parsers/radar_orders/index_test.ts | 5 ++--- 16 files changed, 37 insertions(+), 69 deletions(-) diff --git a/packages/pipeline/src/parsers/ddex_orders/index.ts b/packages/pipeline/src/parsers/ddex_orders/index.ts index 8fe3c32bfd..6c98c32254 100644 --- a/packages/pipeline/src/parsers/ddex_orders/index.ts +++ b/packages/pipeline/src/parsers/ddex_orders/index.ts @@ -2,7 +2,7 @@ import { BigNumber } from '@0x/utils'; import { aggregateOrders } from '../utils'; -import { DdexMarket, DdexOrderbook } from '../../data_sources/ddex'; +import { DDEX_SOURCE, DdexMarket, DdexOrderbook } from '../../data_sources/ddex'; import { TokenOrderbookSnapshot as TokenOrder } from '../../entities'; import { OrderType } from '../../types'; @@ -13,22 +13,16 @@ import { OrderType } from '../../types'; * @param ddexOrderbook A raw orderbook that we pull from the Ddex API. * @param ddexMarket An object containing market data also directly from the API. * @param observedTimestamp Time at which the orders for the market were pulled. - * @param source The exchange where these orders are placed. In this case 'ddex'. */ export function parseDdexOrders( ddexOrderbook: DdexOrderbook, ddexMarket: DdexMarket, observedTimestamp: number, - source: string, ): TokenOrder[] { const aggregatedBids = aggregateOrders(ddexOrderbook.bids); const aggregatedAsks = aggregateOrders(ddexOrderbook.asks); - const parsedBids = aggregatedBids.map(order => - parseDdexOrder(ddexMarket, observedTimestamp, OrderType.Bid, source, order), - ); - const parsedAsks = aggregatedAsks.map(order => - parseDdexOrder(ddexMarket, observedTimestamp, OrderType.Ask, source, order), - ); + const parsedBids = aggregatedBids.map(order => parseDdexOrder(ddexMarket, observedTimestamp, OrderType.Bid, order)); + const parsedAsks = aggregatedAsks.map(order => parseDdexOrder(ddexMarket, observedTimestamp, OrderType.Ask, order)); return parsedBids.concat(parsedAsks); } @@ -46,14 +40,13 @@ export function parseDdexOrder( ddexMarket: DdexMarket, observedTimestamp: number, orderType: OrderType, - source: string, ddexOrder: [string, BigNumber], ): TokenOrder { const tokenOrder = new TokenOrder(); const price = new BigNumber(ddexOrder[0]); const amount = ddexOrder[1]; - tokenOrder.source = source; + tokenOrder.source = DDEX_SOURCE; tokenOrder.observedTimestamp = observedTimestamp; tokenOrder.orderType = orderType; tokenOrder.price = price; diff --git a/packages/pipeline/src/parsers/idex_orders/index.ts b/packages/pipeline/src/parsers/idex_orders/index.ts index da66d7c13d..b151fda59d 100644 --- a/packages/pipeline/src/parsers/idex_orders/index.ts +++ b/packages/pipeline/src/parsers/idex_orders/index.ts @@ -2,7 +2,7 @@ import { BigNumber } from '@0x/utils'; import { aggregateOrders } from '../utils'; -import { IdexOrderbook, IdexOrderParam } from '../../data_sources/idex'; +import { IDEX_SOURCE, IdexOrderbook, IdexOrderParam } from '../../data_sources/idex'; import { TokenOrderbookSnapshot as TokenOrder } from '../../entities'; import { OrderType } from '../../types'; @@ -13,17 +13,14 @@ import { OrderType } from '../../types'; * 3) Parses them into entities which are then saved into the database. * @param idexOrderbook raw orderbook that we pull from the Idex API. * @param observedTimestamp Time at which the orders for the market were pulled. - * @param source The exchange where these orders are placed. In this case 'idex'. */ -export function parseIdexOrders(idexOrderbook: IdexOrderbook, observedTimestamp: number, source: string): TokenOrder[] { +export function parseIdexOrders(idexOrderbook: IdexOrderbook, observedTimestamp: number): TokenOrder[] { const aggregatedBids = aggregateOrders(idexOrderbook.bids); // Any of the bid orders' params will work const idexBidOrder = idexOrderbook.bids[0]; const parsedBids = aggregatedBids.length > 0 - ? aggregatedBids.map(order => - parseIdexOrder(idexBidOrder.params, observedTimestamp, OrderType.Bid, source, order), - ) + ? aggregatedBids.map(order => parseIdexOrder(idexBidOrder.params, observedTimestamp, OrderType.Bid, order)) : []; const aggregatedAsks = aggregateOrders(idexOrderbook.asks); @@ -31,9 +28,7 @@ export function parseIdexOrders(idexOrderbook: IdexOrderbook, observedTimestamp: const idexAskOrder = idexOrderbook.asks[0]; const parsedAsks = aggregatedAsks.length > 0 - ? aggregatedAsks.map(order => - parseIdexOrder(idexAskOrder.params, observedTimestamp, OrderType.Ask, source, order), - ) + ? aggregatedAsks.map(order => parseIdexOrder(idexAskOrder.params, observedTimestamp, OrderType.Ask, order)) : []; return parsedBids.concat(parsedAsks); } @@ -45,21 +40,19 @@ export function parseIdexOrders(idexOrderbook: IdexOrderbook, observedTimestamp: * trades have been placed. * @param observedTimestamp The time when the API response returned back to us. * @param orderType 'bid' or 'ask' enum. - * @param source Exchange where these orders were placed. * @param idexOrder A tuple which we will convert to volume-basis. */ export function parseIdexOrder( idexOrderParam: IdexOrderParam, observedTimestamp: number, orderType: OrderType, - source: string, idexOrder: [string, BigNumber], ): TokenOrder { const tokenOrder = new TokenOrder(); const price = new BigNumber(idexOrder[0]); const amount = idexOrder[1]; - tokenOrder.source = source; + tokenOrder.source = IDEX_SOURCE; tokenOrder.observedTimestamp = observedTimestamp; tokenOrder.orderType = orderType; tokenOrder.price = price; diff --git a/packages/pipeline/src/parsers/oasis_orders/index.ts b/packages/pipeline/src/parsers/oasis_orders/index.ts index bb3ca97fa6..25ec002d34 100644 --- a/packages/pipeline/src/parsers/oasis_orders/index.ts +++ b/packages/pipeline/src/parsers/oasis_orders/index.ts @@ -3,7 +3,7 @@ import * as R from 'ramda'; import { aggregateOrders } from '../utils'; -import { OasisMarket, OasisOrder } from '../../data_sources/oasis'; +import { OASIS_SOURCE, OasisMarket, OasisOrder } from '../../data_sources/oasis'; import { TokenOrderbookSnapshot as TokenOrder } from '../../entities'; import { OrderType } from '../../types'; @@ -15,21 +15,19 @@ import { OrderType } from '../../types'; * @param oasisOrderbook A raw orderbook that we pull from the Oasis API. * @param oasisMarket An object containing market data also directly from the API. * @param observedTimestamp Time at which the orders for the market were pulled. - * @param source The exchange where these orders are placed. In this case 'oasis'. */ export function parseOasisOrders( oasisOrderbook: OasisOrder[], oasisMarket: OasisMarket, observedTimestamp: number, - source: string, ): TokenOrder[] { const aggregatedBids = aggregateOrders(R.filter(R.propEq('act', OrderType.Bid), oasisOrderbook)); const aggregatedAsks = aggregateOrders(R.filter(R.propEq('act', OrderType.Ask), oasisOrderbook)); const parsedBids = aggregatedBids.map(order => - parseOasisOrder(oasisMarket, observedTimestamp, OrderType.Bid, source, order), + parseOasisOrder(oasisMarket, observedTimestamp, OrderType.Bid, order), ); const parsedAsks = aggregatedAsks.map(order => - parseOasisOrder(oasisMarket, observedTimestamp, OrderType.Ask, source, order), + parseOasisOrder(oasisMarket, observedTimestamp, OrderType.Ask, order), ); return parsedBids.concat(parsedAsks); } @@ -48,14 +46,13 @@ export function parseOasisOrder( oasisMarket: OasisMarket, observedTimestamp: number, orderType: OrderType, - source: string, oasisOrder: [string, BigNumber], ): TokenOrder { const tokenOrder = new TokenOrder(); const price = new BigNumber(oasisOrder[0]); const amount = oasisOrder[1]; - tokenOrder.source = source; + tokenOrder.source = OASIS_SOURCE; tokenOrder.observedTimestamp = observedTimestamp; tokenOrder.orderType = orderType; tokenOrder.price = price; diff --git a/packages/pipeline/src/parsers/paradex_orders/index.ts b/packages/pipeline/src/parsers/paradex_orders/index.ts index 20e442d5a9..756bb353f1 100644 --- a/packages/pipeline/src/parsers/paradex_orders/index.ts +++ b/packages/pipeline/src/parsers/paradex_orders/index.ts @@ -1,6 +1,6 @@ import { BigNumber } from '@0x/utils'; -import { ParadexMarket, ParadexOrder, ParadexOrderbookResponse } from '../../data_sources/paradex'; +import { PARADEX_SOURCE, ParadexMarket, ParadexOrder, ParadexOrderbookResponse } from '../../data_sources/paradex'; import { TokenOrderbookSnapshot as TokenOrder } from '../../entities'; import { OrderType } from '../../types'; @@ -12,19 +12,17 @@ import { OrderType } from '../../types'; * @param paradexOrderbookResponse An orderbook response from the Paradex API. * @param paradexMarket An object containing market data also directly from the API. * @param observedTimestamp Time at which the orders for the market were pulled. - * @param source The exchange where these orders are placed. In this case 'paradex'. */ export function parseParadexOrders( paradexOrderbookResponse: ParadexOrderbookResponse, paradexMarket: ParadexMarket, observedTimestamp: number, - source: string, ): TokenOrder[] { const parsedBids = paradexOrderbookResponse.bids.map(order => - parseParadexOrder(paradexMarket, observedTimestamp, OrderType.Bid, source, order), + parseParadexOrder(paradexMarket, observedTimestamp, OrderType.Bid, order), ); const parsedAsks = paradexOrderbookResponse.asks.map(order => - parseParadexOrder(paradexMarket, observedTimestamp, OrderType.Ask, source, order), + parseParadexOrder(paradexMarket, observedTimestamp, OrderType.Ask, order), ); return parsedBids.concat(parsedAsks); } @@ -36,21 +34,19 @@ export function parseParadexOrders( * orders have been placed. * @param observedTimestamp The time when the API response returned back to us. * @param orderType 'bid' or 'ask' enum. - * @param source Exchange where these orders were placed. * @param paradexOrder A ParadexOrder object; basically price, amount tuple. */ export function parseParadexOrder( paradexMarket: ParadexMarket, observedTimestamp: number, orderType: OrderType, - source: string, paradexOrder: ParadexOrder, ): TokenOrder { const tokenOrder = new TokenOrder(); const price = new BigNumber(paradexOrder.price); const amount = new BigNumber(paradexOrder.amount); - tokenOrder.source = source; + tokenOrder.source = PARADEX_SOURCE; tokenOrder.observedTimestamp = observedTimestamp; tokenOrder.orderType = orderType; tokenOrder.price = price; diff --git a/packages/pipeline/src/parsers/radar_orders/index.ts b/packages/pipeline/src/parsers/radar_orders/index.ts index 20472766d1..6ecedc0c36 100644 --- a/packages/pipeline/src/parsers/radar_orders/index.ts +++ b/packages/pipeline/src/parsers/radar_orders/index.ts @@ -5,6 +5,7 @@ import * as R from 'ramda'; import { aggregateOrders, GenericRawOrder } from '../utils'; +import { RADAR_SOURCE } from '../../data_sources/radar'; import { TokenOrderbookSnapshot as TokenOrder } from '../../entities'; import { OrderType } from '../../types'; @@ -21,21 +22,19 @@ export interface AggregateOrdersByMaker { * @param radarOrderbook A raw orderbook that we pull from the radar API. * @param radarMarket An object containing market data also directly from the API. * @param observedTimestamp Time at which the orders for the market were pulled. - * @param source The exchange where these orders are placed. In this case 'radar'. */ export function parseRadarOrders( radarOrderbook: RadarBook, radarMarket: RadarMarket, observedTimestamp: number, - source: string, ): TokenOrder[] { const aggregatedBids = _aggregateOrdersByMaker(radarMarket, radarOrderbook.bids); const aggregatedAsks = _aggregateOrdersByMaker(radarMarket, radarOrderbook.asks); const parsedBids = aggregatedBids.map(order => - parseRadarOrder(radarMarket, observedTimestamp, OrderType.Bid, source, order), + parseRadarOrder(radarMarket, observedTimestamp, OrderType.Bid, order), ); const parsedAsks = aggregatedAsks.map(order => - parseRadarOrder(radarMarket, observedTimestamp, OrderType.Ask, source, order), + parseRadarOrder(radarMarket, observedTimestamp, OrderType.Ask, order), ); return parsedBids.concat(parsedAsks); } @@ -47,14 +46,12 @@ export function parseRadarOrders( * trades have been placed. * @param observedTimestamp The time when the API response returned back to us. * @param orderType 'bid' or 'ask' enum. - * @param source Exchange where these orders were placed. * @param aggregateOrder An AggregateOrdersByMaker instance which we will convert to volume-basis. */ export function parseRadarOrder( radarMarket: RadarMarket, observedTimestamp: number, orderType: OrderType, - source: string, aggregateOrder: AggregateOrdersByMaker, ): TokenOrder { const tokenOrder = new TokenOrder(); @@ -62,7 +59,7 @@ export function parseRadarOrder( const amount = aggregateOrder.amount; const splitId = radarMarket.id.split('-'); - tokenOrder.source = source; + tokenOrder.source = RADAR_SOURCE; tokenOrder.observedTimestamp = observedTimestamp; tokenOrder.orderType = orderType; tokenOrder.price = price; diff --git a/packages/pipeline/src/scripts/pull_ddex_orderbook_snapshots.ts b/packages/pipeline/src/scripts/pull_ddex_orderbook_snapshots.ts index 4e00f258f3..96d82be5a2 100644 --- a/packages/pipeline/src/scripts/pull_ddex_orderbook_snapshots.ts +++ b/packages/pipeline/src/scripts/pull_ddex_orderbook_snapshots.ts @@ -2,7 +2,7 @@ import { logUtils } from '@0x/utils'; import * as R from 'ramda'; import { Connection, ConnectionOptions, createConnection } from 'typeorm'; -import { DDEX_SOURCE, DdexMarket, DdexSource } from '../data_sources/ddex'; +import { DdexMarket, DdexSource } from '../data_sources/ddex'; import { TokenOrderbookSnapshot as TokenOrder } from '../entities'; import * as ormConfig from '../ormconfig'; import { parseDdexOrders } from '../parsers/ddex_orders'; @@ -43,7 +43,7 @@ async function getAndSaveMarketOrderbookAsync(ddexSource: DdexSource, market: Dd const observedTimestamp = Date.now(); logUtils.log(`${market.id}: Parsing orders.`); - const orders = parseDdexOrders(orderBook, market, observedTimestamp, DDEX_SOURCE); + const orders = parseDdexOrders(orderBook, market, observedTimestamp); if (orders.length > 0) { logUtils.log(`${market.id}: Saving ${orders.length} orders.`); diff --git a/packages/pipeline/src/scripts/pull_idex_orderbook_snapshots.ts b/packages/pipeline/src/scripts/pull_idex_orderbook_snapshots.ts index 490b17766c..42e9fa5f09 100644 --- a/packages/pipeline/src/scripts/pull_idex_orderbook_snapshots.ts +++ b/packages/pipeline/src/scripts/pull_idex_orderbook_snapshots.ts @@ -2,7 +2,7 @@ import { logUtils } from '@0x/utils'; import * as R from 'ramda'; import { Connection, ConnectionOptions, createConnection } from 'typeorm'; -import { IDEX_SOURCE, IdexSource } from '../data_sources/idex'; +import { IdexSource } from '../data_sources/idex'; import { TokenOrderbookSnapshot as TokenOrder } from '../entities'; import * as ormConfig from '../ormconfig'; import { parseIdexOrders } from '../parsers/idex_orders'; @@ -51,7 +51,7 @@ async function getAndSaveMarketOrderbookAsync(idexSource: IdexSource, marketId: } logUtils.log(`${marketId}: Parsing orders.`); - const orders = parseIdexOrders(orderBook, observedTimestamp, IDEX_SOURCE); + const orders = parseIdexOrders(orderBook, observedTimestamp); if (orders.length > 0) { logUtils.log(`${marketId}: Saving ${orders.length} orders.`); diff --git a/packages/pipeline/src/scripts/pull_oasis_orderbook_snapshots.ts b/packages/pipeline/src/scripts/pull_oasis_orderbook_snapshots.ts index c4dcf6c83d..c3c286a0f9 100644 --- a/packages/pipeline/src/scripts/pull_oasis_orderbook_snapshots.ts +++ b/packages/pipeline/src/scripts/pull_oasis_orderbook_snapshots.ts @@ -2,7 +2,7 @@ import { logUtils } from '@0x/utils'; import * as R from 'ramda'; import { Connection, ConnectionOptions, createConnection } from 'typeorm'; -import { OASIS_SOURCE, OasisMarket, OasisSource } from '../data_sources/oasis'; +import { OasisMarket, OasisSource } from '../data_sources/oasis'; import { TokenOrderbookSnapshot as TokenOrder } from '../entities'; import * as ormConfig from '../ormconfig'; import { parseOasisOrders } from '../parsers/oasis_orders'; @@ -46,7 +46,7 @@ async function getAndSaveMarketOrderbookAsync(oasisSource: OasisSource, market: const observedTimestamp = Date.now(); logUtils.log(`${market.id}: Parsing orders.`); - const orders = parseOasisOrders(orderBook, market, observedTimestamp, OASIS_SOURCE); + const orders = parseOasisOrders(orderBook, market, observedTimestamp); if (orders.length > 0) { logUtils.log(`${market.id}: Saving ${orders.length} orders.`); diff --git a/packages/pipeline/src/scripts/pull_paradex_orderbook_snapshots.ts b/packages/pipeline/src/scripts/pull_paradex_orderbook_snapshots.ts index 34345f3557..7fc565ca04 100644 --- a/packages/pipeline/src/scripts/pull_paradex_orderbook_snapshots.ts +++ b/packages/pipeline/src/scripts/pull_paradex_orderbook_snapshots.ts @@ -2,7 +2,6 @@ import { logUtils } from '@0x/utils'; import { Connection, ConnectionOptions, createConnection } from 'typeorm'; import { - PARADEX_SOURCE, ParadexActiveMarketsResponse, ParadexMarket, ParadexSource, @@ -75,7 +74,7 @@ async function getAndSaveMarketOrderbookAsync(paradexSource: ParadexSource, mark const observedTimestamp = Date.now(); logUtils.log(`${market.symbol}: Parsing orders.`); - const orders = parseParadexOrders(paradexOrderbookResponse, market, observedTimestamp, PARADEX_SOURCE); + const orders = parseParadexOrders(paradexOrderbookResponse, market, observedTimestamp); if (orders.length > 0) { logUtils.log(`${market.symbol}: Saving ${orders.length} orders.`); diff --git a/packages/pipeline/src/scripts/pull_radar_orderbook_snapshots.ts b/packages/pipeline/src/scripts/pull_radar_orderbook_snapshots.ts index 91d33d2cc9..18f5a54b20 100644 --- a/packages/pipeline/src/scripts/pull_radar_orderbook_snapshots.ts +++ b/packages/pipeline/src/scripts/pull_radar_orderbook_snapshots.ts @@ -3,7 +3,7 @@ import { RadarMarket } from '@radarrelay/types'; import * as R from 'ramda'; import { Connection, ConnectionOptions, createConnection } from 'typeorm'; -import { RADAR_SOURCE, RadarSource } from '../data_sources/radar'; +import { RadarSource } from '../data_sources/radar'; import { TokenOrderbookSnapshot as TokenOrder } from '../entities'; import * as ormConfig from '../ormconfig'; import { parseRadarOrders } from '../parsers/radar_orders'; @@ -44,7 +44,7 @@ async function getAndSaveMarketOrderbookAsync(radarSource: RadarSource, market: const observedTimestamp = Date.now(); logUtils.log(`${market.id}: Parsing orders.`); - const orders = parseRadarOrders(orderBook, market, observedTimestamp, RADAR_SOURCE); + const orders = parseRadarOrders(orderBook, market, observedTimestamp); if (orders.length > 0) { logUtils.log(`${market.id}: Saving ${orders.length} orders.`); diff --git a/packages/pipeline/test/data_sources/radar/index_test.ts b/packages/pipeline/test/data_sources/radar/index_test.ts index 9a1eacb164..8d82ff6bf5 100644 --- a/packages/pipeline/test/data_sources/radar/index_test.ts +++ b/packages/pipeline/test/data_sources/radar/index_test.ts @@ -2,7 +2,6 @@ import { BigNumber } from '@0x/utils'; import { RadarOrderState, RadarOrderType } from '@radarrelay/types'; import * as chai from 'chai'; import 'mocha'; -import * as R from 'ramda'; import { RadarSource } from '../../../src/data_sources/radar'; import { chaiSetup } from '../../utils/chai_setup'; diff --git a/packages/pipeline/test/parsers/ddex_orders/index_test.ts b/packages/pipeline/test/parsers/ddex_orders/index_test.ts index 7eb74ed09e..de71c9c26f 100644 --- a/packages/pipeline/test/parsers/ddex_orders/index_test.ts +++ b/packages/pipeline/test/parsers/ddex_orders/index_test.ts @@ -31,7 +31,6 @@ describe('ddex_orders', () => { }; const observedTimestamp: number = Date.now(); const orderType: OrderType = OrderType.Bid; - const source: string = 'ddex'; const expected = new TokenOrder(); expected.source = 'ddex'; @@ -45,7 +44,7 @@ describe('ddex_orders', () => { expected.baseAssetAddress = '0xb45df06e38540a675fdb5b598abf2c0dbe9d6b81'; expected.baseVolume = new BigNumber(10); expected.makerAddress = 'unknown'; - const actual = parseDdexOrder(ddexMarket, observedTimestamp, orderType, source, ddexOrder); + const actual = parseDdexOrder(ddexMarket, observedTimestamp, orderType, ddexOrder); expect(actual).deep.equal(expected); }); }); diff --git a/packages/pipeline/test/parsers/idex_orders/index_test.ts b/packages/pipeline/test/parsers/idex_orders/index_test.ts index 0c7c642ce2..7ba3adbaea 100644 --- a/packages/pipeline/test/parsers/idex_orders/index_test.ts +++ b/packages/pipeline/test/parsers/idex_orders/index_test.ts @@ -32,7 +32,6 @@ describe('idex_orders', () => { }; const observedTimestamp: number = Date.now(); const orderType: OrderType = OrderType.Bid; - const source: string = 'idex'; const expected = new TokenOrder(); expected.source = 'idex'; @@ -46,7 +45,7 @@ describe('idex_orders', () => { expected.quoteAssetAddress = '0xb45df06e38540a675fdb5b598abf2c0dbe9d6b81'; expected.quoteVolume = new BigNumber(5); expected.makerAddress = 'unknown'; - const actual = parseIdexOrder(idexOrderParam, observedTimestamp, orderType, source, idexOrder); + const actual = parseIdexOrder(idexOrderParam, observedTimestamp, orderType, idexOrder); expect(actual).deep.equal(expected); }); it('correctly converts ask type idexOrder to TokenOrder entity', () => { @@ -66,7 +65,6 @@ describe('idex_orders', () => { }; const observedTimestamp: number = Date.now(); const orderType: OrderType = OrderType.Ask; - const source: string = 'idex'; const expected = new TokenOrder(); expected.source = 'idex'; @@ -80,7 +78,7 @@ describe('idex_orders', () => { expected.quoteAssetAddress = '0xb45df06e38540a675fdb5b598abf2c0dbe9d6b81'; expected.quoteVolume = new BigNumber(5); expected.makerAddress = 'unknown'; - const actual = parseIdexOrder(idexOrderParam, observedTimestamp, orderType, source, idexOrder); + const actual = parseIdexOrder(idexOrderParam, observedTimestamp, orderType, idexOrder); expect(actual).deep.equal(expected); }); }); diff --git a/packages/pipeline/test/parsers/oasis_orders/index_test.ts b/packages/pipeline/test/parsers/oasis_orders/index_test.ts index 7ef86ee10c..08ff1ef450 100644 --- a/packages/pipeline/test/parsers/oasis_orders/index_test.ts +++ b/packages/pipeline/test/parsers/oasis_orders/index_test.ts @@ -28,7 +28,6 @@ describe('oasis_orders', () => { }; const observedTimestamp: number = Date.now(); const orderType: OrderType = OrderType.Bid; - const source: string = 'oasis'; const expected = new TokenOrder(); expected.source = 'oasis'; @@ -42,7 +41,7 @@ describe('oasis_orders', () => { expected.quoteAssetAddress = null; expected.quoteVolume = new BigNumber(5); expected.makerAddress = 'unknown'; - const actual = parseOasisOrder(oasisMarket, observedTimestamp, orderType, source, oasisOrder); + const actual = parseOasisOrder(oasisMarket, observedTimestamp, orderType, oasisOrder); expect(actual).deep.equal(expected); }); }); diff --git a/packages/pipeline/test/parsers/paradex_orders/index_test.ts b/packages/pipeline/test/parsers/paradex_orders/index_test.ts index 10ac1ecdc9..5379153387 100644 --- a/packages/pipeline/test/parsers/paradex_orders/index_test.ts +++ b/packages/pipeline/test/parsers/paradex_orders/index_test.ts @@ -33,7 +33,6 @@ describe('paradex_orders', () => { }; const observedTimestamp: number = Date.now(); const orderType: OrderType = OrderType.Bid; - const source: string = 'paradex'; const expected = new TokenOrder(); expected.source = 'paradex'; @@ -47,7 +46,7 @@ describe('paradex_orders', () => { expected.quoteAssetAddress = '0x0000000000000000000000000000000000000000'; expected.quoteVolume = new BigNumber(412 * 0.1245); expected.makerAddress = 'unknown'; - const actual = parseParadexOrder(paradexMarket, observedTimestamp, orderType, source, paradexOrder); + const actual = parseParadexOrder(paradexMarket, observedTimestamp, orderType, paradexOrder); expect(actual).deep.equal(expected); }); }); diff --git a/packages/pipeline/test/parsers/radar_orders/index_test.ts b/packages/pipeline/test/parsers/radar_orders/index_test.ts index e3004d7c2a..29ae41a00d 100644 --- a/packages/pipeline/test/parsers/radar_orders/index_test.ts +++ b/packages/pipeline/test/parsers/radar_orders/index_test.ts @@ -1,5 +1,5 @@ import { BigNumber } from '@0x/utils'; -import { RadarBook, RadarMarket, RadarSignedOrder } from '@radarrelay/types'; +import { RadarMarket } from '@radarrelay/types'; import * as chai from 'chai'; import 'mocha'; @@ -35,7 +35,6 @@ describe('radar_orders', () => { } as any) as RadarMarket; const observedTimestamp: number = Date.now(); const orderType: OrderType = OrderType.Bid; - const source: string = 'radar'; const expected = new TokenOrder(); expected.source = 'radar'; @@ -49,7 +48,7 @@ describe('radar_orders', () => { expected.baseAssetAddress = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'; expected.baseVolume = new BigNumber(10000000000); expected.makerAddress = '0x6eC92694ea172ebC430C30fa31De87620967A082'; - const actual = parseRadarOrder(radarMarket, observedTimestamp, orderType, source, radarOrder); + const actual = parseRadarOrder(radarMarket, observedTimestamp, orderType, radarOrder); expect(actual).deep.equal(expected); }); }); From 871e81bd71625d6048253963d42442c8fa9a9cc4 Mon Sep 17 00:00:00 2001 From: fragosti Date: Wed, 20 Feb 2019 16:03:29 -0800 Subject: [PATCH 22/27] Fix inconsistently named constraint --- ...63069315-TokenOrderBookSnapshotsAddMakerAddress.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts index 1d3b3c3ab5..695c17a587 100644 --- a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts +++ b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts @@ -21,7 +21,7 @@ export class TokenOrderBookSnapshotsAddMakerAddress1550163069315 implements Migr `); await queryRunner.query(` ALTER TABLE ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE} - DROP CONSTRAINT "token_orderbook_snapshots_pkey1", + DROP CONSTRAINT "token_orderbook_snapshots_pkey", ADD PRIMARY KEY (observed_timestamp, source, order_type, price, base_asset_symbol, quote_asset_symbol, maker_address); `); } else { @@ -32,7 +32,14 @@ export class TokenOrderBookSnapshotsAddMakerAddress1550163069315 implements Migr public async down(queryRunner: QueryRunner): Promise { const snapshotTable = await queryRunner.getTable(TOKEN_ORDERBOOK_SNAPSHOT_TABLE); if (snapshotTable) { - await queryRunner.dropColumn(snapshotTable, NEW_COLUMN_NAME); + // await queryRunner.dropIndex(snapshotTable, 'token_orderbook_snapshots_pkey'); + // await queryRunner.dropColumn(snapshotTable, NEW_COLUMN_NAME); + await queryRunner.query(` + ALTER TABLE ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE} + DROP CONSTRAINT "token_orderbook_snapshots_pkey", + DROP COLUMN ${NEW_COLUMN_NAME}, + ADD PRIMARY KEY (observed_timestamp, source, order_type, price, base_asset_symbol, quote_asset_symbol); + `); } else { throw new Error(`Could not find table with name ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE}`); } From 998dac44ee76ae60acb69a5c40f8538beae06f31 Mon Sep 17 00:00:00 2001 From: fragosti Date: Wed, 20 Feb 2019 16:09:33 -0800 Subject: [PATCH 23/27] Remove comments --- .../1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts index 695c17a587..581fd92e5c 100644 --- a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts +++ b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts @@ -32,8 +32,6 @@ export class TokenOrderBookSnapshotsAddMakerAddress1550163069315 implements Migr public async down(queryRunner: QueryRunner): Promise { const snapshotTable = await queryRunner.getTable(TOKEN_ORDERBOOK_SNAPSHOT_TABLE); if (snapshotTable) { - // await queryRunner.dropIndex(snapshotTable, 'token_orderbook_snapshots_pkey'); - // await queryRunner.dropColumn(snapshotTable, NEW_COLUMN_NAME); await queryRunner.query(` ALTER TABLE ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE} DROP CONSTRAINT "token_orderbook_snapshots_pkey", From a076278026fe4f65ce8f30f7db5e50c365747e1c Mon Sep 17 00:00:00 2001 From: fragosti Date: Wed, 20 Feb 2019 16:37:44 -0800 Subject: [PATCH 24/27] Give the constraint an explicit name of token_orderbook_snapshots_pkey --- .../1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts index 581fd92e5c..56738ed884 100644 --- a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts +++ b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts @@ -22,7 +22,7 @@ export class TokenOrderBookSnapshotsAddMakerAddress1550163069315 implements Migr await queryRunner.query(` ALTER TABLE ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE} DROP CONSTRAINT "token_orderbook_snapshots_pkey", - ADD PRIMARY KEY (observed_timestamp, source, order_type, price, base_asset_symbol, quote_asset_symbol, maker_address); + ADD CONSTRAINT "token_orderbook_snapshots_pkey" PRIMARY KEY (observed_timestamp, source, order_type, price, base_asset_symbol, quote_asset_symbol, maker_address); `); } else { throw new Error(`Could not find table with name ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE}`); From 8d9a55010722bf35efcc20dc8a0f79483b7c0913 Mon Sep 17 00:00:00 2001 From: fragosti Date: Wed, 20 Feb 2019 17:01:02 -0800 Subject: [PATCH 25/27] Add constraint name to down phase as well --- .../1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts index 56738ed884..7eba2fab6f 100644 --- a/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts +++ b/packages/pipeline/migrations/1550163069315-TokenOrderBookSnapshotsAddMakerAddress.ts @@ -36,7 +36,7 @@ export class TokenOrderBookSnapshotsAddMakerAddress1550163069315 implements Migr ALTER TABLE ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE} DROP CONSTRAINT "token_orderbook_snapshots_pkey", DROP COLUMN ${NEW_COLUMN_NAME}, - ADD PRIMARY KEY (observed_timestamp, source, order_type, price, base_asset_symbol, quote_asset_symbol); + ADD CONSTRAINT "token_orderbook_snapshots_pkey" PRIMARY KEY (observed_timestamp, source, order_type, price, base_asset_symbol, quote_asset_symbol); `); } else { throw new Error(`Could not find table with name ${TOKEN_ORDERBOOK_SNAPSHOT_TABLE}`); From 0ddec99704036afe0d20a29da621b3336298507e Mon Sep 17 00:00:00 2001 From: David Sun Date: Tue, 19 Feb 2019 23:57:34 -0500 Subject: [PATCH 26/27] updated documentTitle component --- .../website/ts/components/documentTitle.tsx | 12 --- .../website/ts/components/document_title.tsx | 15 ++++ .../website/ts/components/portal/portal.tsx | 2 - .../website/ts/document_meta_constants.tsx | 63 ------------- packages/website/ts/pages/about/jobs.tsx | 5 +- packages/website/ts/pages/about/mission.tsx | 5 +- packages/website/ts/pages/about/press.tsx | 5 +- packages/website/ts/pages/about/team.tsx | 5 +- packages/website/ts/pages/credits.tsx | 5 +- .../pages/documentation/developers_page.tsx | 5 +- packages/website/ts/pages/ecosystem.tsx | 5 +- packages/website/ts/pages/faq/faq.tsx | 5 +- .../ts/pages/governance/governance.tsx | 5 +- packages/website/ts/pages/instant.tsx | 5 +- packages/website/ts/pages/landing.tsx | 5 +- packages/website/ts/pages/launch_kit.tsx | 13 ++- packages/website/ts/pages/market_maker.tsx | 5 +- .../website/ts/pages/vote_placeholder.tsx | 5 +- packages/website/ts/pages/why.tsx | 5 +- .../ts/utils/document_meta_constants.tsx | 89 +++++++++++++++++++ 20 files changed, 151 insertions(+), 113 deletions(-) delete mode 100644 packages/website/ts/components/documentTitle.tsx create mode 100644 packages/website/ts/components/document_title.tsx delete mode 100644 packages/website/ts/document_meta_constants.tsx create mode 100644 packages/website/ts/utils/document_meta_constants.tsx diff --git a/packages/website/ts/components/documentTitle.tsx b/packages/website/ts/components/documentTitle.tsx deleted file mode 100644 index 5b19fe5f72..0000000000 --- a/packages/website/ts/components/documentTitle.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import * as React from 'react'; -import { Helmet } from 'react-helmet'; - -export interface DocumentTitleProps { - title: string; -} - -export const DocumentTitle: React.StatelessComponent = ({ title }) => ( - - {title} - -); diff --git a/packages/website/ts/components/document_title.tsx b/packages/website/ts/components/document_title.tsx new file mode 100644 index 0000000000..81fb021a5f --- /dev/null +++ b/packages/website/ts/components/document_title.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; +import { Helmet } from 'react-helmet'; + +import { DocumentMetadata } from '../utils/document_meta_constants'; + +export interface DocumentTitleProps extends DocumentMetadata {} + +export const DocumentTitle: React.StatelessComponent = ({ title, description }) => ( + + {title} + + + + +); diff --git a/packages/website/ts/components/portal/portal.tsx b/packages/website/ts/components/portal/portal.tsx index e57eec11ac..3d7c672583 100644 --- a/packages/website/ts/components/portal/portal.tsx +++ b/packages/website/ts/components/portal/portal.tsx @@ -8,7 +8,6 @@ import { Blockchain } from 'ts/blockchain'; import { BlockchainErrDialog } from 'ts/components/dialogs/blockchain_err_dialog'; import { LedgerConfigDialog } from 'ts/components/dialogs/ledger_config_dialog'; import { PortalDisclaimerDialog } from 'ts/components/dialogs/portal_disclaimer_dialog'; -import { DocumentTitle } from 'ts/components/documentTitle'; import { EthWrappers } from 'ts/components/eth_wrappers'; import { FillOrder } from 'ts/components/fill_order'; import { AssetPicker } from 'ts/components/generate_order/asset_picker'; @@ -234,7 +233,6 @@ export class Portal extends React.Component { return ( - - +
diff --git a/packages/website/ts/pages/about/mission.tsx b/packages/website/ts/pages/about/mission.tsx index 2b7d9a3c33..69fe07f15b 100644 --- a/packages/website/ts/pages/about/mission.tsx +++ b/packages/website/ts/pages/about/mission.tsx @@ -4,11 +4,12 @@ import styled from 'styled-components'; import { AboutPageLayout } from 'ts/components/aboutPageLayout'; import { Definition } from 'ts/components/definition'; -import { DocumentTitle } from 'ts/components/documentTitle'; +import { DocumentTitle } from 'ts/components/document_title'; import { Image } from 'ts/components/image'; import { Column, Section } from 'ts/components/newLayout'; import { Heading } from 'ts/components/text'; import { constants } from 'ts/utils/constants'; +import { documentConstants } from 'ts/utils/document_meta_constants'; const values = [ { @@ -38,7 +39,7 @@ export const NextAboutMission = () => ( linkLabel="Our mission and values" href={constants.URL_MISSION_AND_VALUES_BLOG_POST} > - +
0x Offices diff --git a/packages/website/ts/pages/about/press.tsx b/packages/website/ts/pages/about/press.tsx index 1a757b2792..1ffa11d1fb 100644 --- a/packages/website/ts/pages/about/press.tsx +++ b/packages/website/ts/pages/about/press.tsx @@ -4,9 +4,10 @@ import styled from 'styled-components'; import { AboutPageLayout } from 'ts/components/aboutPageLayout'; import { Button } from 'ts/components/button'; -import { DocumentTitle } from 'ts/components/documentTitle'; +import { DocumentTitle } from 'ts/components/document_title'; import { Column, FlexWrap } from 'ts/components/newLayout'; import { Paragraph } from 'ts/components/text'; +import { documentConstants } from 'ts/utils/document_meta_constants'; interface HighlightProps { logo: string; @@ -66,7 +67,7 @@ export const NextAboutPress = () => ( } > - + ); diff --git a/packages/website/ts/pages/about/team.tsx b/packages/website/ts/pages/about/team.tsx index 072bbffa0c..82506a3cf0 100644 --- a/packages/website/ts/pages/about/team.tsx +++ b/packages/website/ts/pages/about/team.tsx @@ -5,10 +5,11 @@ import styled from 'styled-components'; import { colors } from 'ts/style/colors'; import { AboutPageLayout } from 'ts/components/aboutPageLayout'; -import { DocumentTitle } from 'ts/components/documentTitle'; +import { DocumentTitle } from 'ts/components/document_title'; import { Column, Section } from 'ts/components/newLayout'; import { Heading, Paragraph } from 'ts/components/text'; import { WebsitePaths } from 'ts/types'; +import { documentConstants } from 'ts/utils/document_meta_constants'; interface TeamMember { name: string; @@ -194,7 +195,7 @@ export const NextAboutTeam = () => ( linkLabel="Join the team" to={WebsitePaths.AboutJobs} > - +
0x Team diff --git a/packages/website/ts/pages/credits.tsx b/packages/website/ts/pages/credits.tsx index 6c24a40490..50dc185fc3 100644 --- a/packages/website/ts/pages/credits.tsx +++ b/packages/website/ts/pages/credits.tsx @@ -4,12 +4,13 @@ import * as React from 'react'; import { Banner } from 'ts/components/banner'; import { Button } from 'ts/components/button'; import { CenteredDefinition } from 'ts/components/centeredDefinition'; -import { DocumentTitle } from 'ts/components/documentTitle'; +import { DocumentTitle } from 'ts/components/document_title'; import { Hero } from 'ts/components/hero'; import { ModalContact, ModalContactType } from 'ts/components/modals/modal_contact'; import { FlexWrap, Section } from 'ts/components/newLayout'; import { SiteWrap } from 'ts/components/siteWrap'; import { Heading } from 'ts/components/text'; +import { documentConstants } from 'ts/utils/document_meta_constants'; export interface CreditsProps {} @@ -25,7 +26,7 @@ export class Credits extends React.Component { public render(): React.ReactNode { return ( - + - + diff --git a/packages/website/ts/pages/ecosystem.tsx b/packages/website/ts/pages/ecosystem.tsx index 3f71efa6a3..455fc3a099 100644 --- a/packages/website/ts/pages/ecosystem.tsx +++ b/packages/website/ts/pages/ecosystem.tsx @@ -5,12 +5,13 @@ import styled from 'styled-components'; import { colors } from 'ts/style/colors'; import { Button } from 'ts/components/button'; -import { DocumentTitle } from 'ts/components/documentTitle'; +import { DocumentTitle } from 'ts/components/document_title'; import { Icon } from 'ts/components/icon'; import { Column, Section, WrapGrid } from 'ts/components/newLayout'; import { SiteWrap } from 'ts/components/siteWrap'; import { Heading, Paragraph } from 'ts/components/text'; import { constants } from 'ts/utils/constants'; +import { documentConstants } from 'ts/utils/document_meta_constants'; interface BenefitProps { title: string; @@ -55,7 +56,7 @@ const benefits: BenefitProps[] = [ export const NextEcosystem = () => ( - +
diff --git a/packages/website/ts/pages/faq/faq.tsx b/packages/website/ts/pages/faq/faq.tsx index a318cdafd0..b86a1ca322 100644 --- a/packages/website/ts/pages/faq/faq.tsx +++ b/packages/website/ts/pages/faq/faq.tsx @@ -1,7 +1,7 @@ import { colors, Styles } from '@0x/react-shared'; import * as _ from 'lodash'; import * as React from 'react'; -import { DocumentTitle } from 'ts/components/documentTitle'; +import { DocumentTitle } from 'ts/components/document_title'; import { Footer } from 'ts/components/old_footer'; import { TopBar } from 'ts/components/top_bar/top_bar'; import { Question } from 'ts/pages/faq/question'; @@ -9,6 +9,7 @@ import { Dispatcher } from 'ts/redux/dispatcher'; import { FAQQuestion, FAQSection, WebsitePaths } from 'ts/types'; import { configs } from 'ts/utils/configs'; import { constants } from 'ts/utils/constants'; +import { documentConstants } from 'ts/utils/document_meta_constants'; import { Translate } from 'ts/utils/translate'; export interface FAQProps { @@ -412,7 +413,7 @@ export class FAQ extends React.Component { public render(): React.ReactNode { return (
- +

diff --git a/packages/website/ts/pages/governance/governance.tsx b/packages/website/ts/pages/governance/governance.tsx index 474a7686d2..28604b2ba6 100644 --- a/packages/website/ts/pages/governance/governance.tsx +++ b/packages/website/ts/pages/governance/governance.tsx @@ -5,7 +5,7 @@ import styled from 'styled-components'; import { Banner } from 'ts/components/banner'; import { Button } from 'ts/components/button'; -import { DocumentTitle } from 'ts/components/documentTitle'; +import { DocumentTitle } from 'ts/components/document_title'; import { ModalContact } from 'ts/components/modals/modal_contact'; import { Column, FlexWrap, Section } from 'ts/components/newLayout'; import { SiteWrap } from 'ts/components/siteWrap'; @@ -17,6 +17,7 @@ import { VoteInfo, VoteValue } from 'ts/pages/governance/vote_form'; import { VoteStats } from 'ts/pages/governance/vote_stats'; import { colors } from 'ts/style/colors'; import { configs } from 'ts/utils/configs'; +import { documentConstants } from 'ts/utils/document_meta_constants'; import { utils } from 'ts/utils/utils'; interface LabelInterface { @@ -109,7 +110,7 @@ export class Governance extends React.Component { const { isVoteReceived, tally } = this.state; return ( - +
diff --git a/packages/website/ts/pages/instant.tsx b/packages/website/ts/pages/instant.tsx index d406b48baf..81785e59ca 100644 --- a/packages/website/ts/pages/instant.tsx +++ b/packages/website/ts/pages/instant.tsx @@ -6,7 +6,7 @@ import styled, { keyframes } from 'styled-components'; import { Banner } from 'ts/components/banner'; import { Button } from 'ts/components/button'; import { Definition } from 'ts/components/definition'; -import { DocumentTitle } from 'ts/components/documentTitle'; +import { DocumentTitle } from 'ts/components/document_title'; import { Hero } from 'ts/components/hero'; import { Section, SectionProps } from 'ts/components/newLayout'; import { SiteWrap } from 'ts/components/siteWrap'; @@ -14,6 +14,7 @@ import { Heading, Paragraph } from 'ts/components/text'; import { Configurator } from 'ts/pages/instant/configurator'; import { colors } from 'ts/style/colors'; import { WebsitePaths } from 'ts/types'; +import { documentConstants } from 'ts/utils/document_meta_constants'; import { utils } from 'ts/utils/utils'; import { ModalContact } from '../components/modals/modal_contact'; @@ -88,7 +89,7 @@ export class Next0xInstant extends React.Component { public render(): React.ReactNode { return ( - + { public render(): React.ReactNode { return ( - + diff --git a/packages/website/ts/pages/launch_kit.tsx b/packages/website/ts/pages/launch_kit.tsx index 719124c79c..b3f09e6d2a 100644 --- a/packages/website/ts/pages/launch_kit.tsx +++ b/packages/website/ts/pages/launch_kit.tsx @@ -1,18 +1,15 @@ import * as _ from 'lodash'; import * as React from 'react'; - -import { DocumentTitle } from 'ts/components/documentTitle'; - -import { Hero } from 'ts/components/hero'; - import { Banner } from 'ts/components/banner'; import { Button } from 'ts/components/button'; import { Definition } from 'ts/components/definition'; +import { DocumentTitle } from 'ts/components/document_title'; +import { Hero } from 'ts/components/hero'; import { Icon } from 'ts/components/icon'; -import { SiteWrap } from 'ts/components/siteWrap'; - import { Section } from 'ts/components/newLayout'; +import { SiteWrap } from 'ts/components/siteWrap'; import { constants } from 'ts/utils/constants'; +import { documentConstants } from 'ts/utils/document_meta_constants'; import { ModalContact } from '../components/modals/modal_contact'; @@ -37,7 +34,7 @@ export class NextLaunchKit extends React.Component { public render(): React.ReactNode { return ( - + { public render(): React.ReactNode { return ( - + ( - +
diff --git a/packages/website/ts/pages/why.tsx b/packages/website/ts/pages/why.tsx index 25cc92207f..784d42bd8e 100644 --- a/packages/website/ts/pages/why.tsx +++ b/packages/website/ts/pages/why.tsx @@ -6,12 +6,13 @@ import styled from 'styled-components'; import { Banner } from 'ts/components/banner'; import { Button } from 'ts/components/button'; import { Definition } from 'ts/components/definition'; -import { DocumentTitle } from 'ts/components/documentTitle'; +import { DocumentTitle } from 'ts/components/document_title'; import { Hero } from 'ts/components/hero'; import { Column, Section, WrapSticky } from 'ts/components/newLayout'; import { SiteWrap } from 'ts/components/siteWrap'; import { Slide, Slider } from 'ts/components/slider/slider'; import { Heading } from 'ts/components/text'; +import { documentConstants } from 'ts/utils/document_meta_constants'; import { ModalContact } from '../components/modals/modal_contact'; @@ -99,7 +100,7 @@ export class NextWhy extends React.Component { ); return ( - + Date: Wed, 20 Feb 2019 23:24:05 -0500 Subject: [PATCH 27/27] fixed linting issue --- packages/website/ts/pages/documentation/developers_page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/website/ts/pages/documentation/developers_page.tsx b/packages/website/ts/pages/documentation/developers_page.tsx index 59cf00db14..006010a0ce 100644 --- a/packages/website/ts/pages/documentation/developers_page.tsx +++ b/packages/website/ts/pages/documentation/developers_page.tsx @@ -2,9 +2,9 @@ import { colors, constants as sharedConstants, utils as sharedUtils } from '@0x/ import * as _ from 'lodash'; import * as React from 'react'; import { Helmet } from 'react-helmet'; +import { DocumentTitle } from 'ts/components/document_title'; import { DocsLogo } from 'ts/components/documentation/docs_logo'; import { DocsTopBar } from 'ts/components/documentation/docs_top_bar'; -import { DocumentTitle } from 'ts/components/document_title'; import { Container } from 'ts/components/ui/container'; import { Dispatcher } from 'ts/redux/dispatcher'; import { media } from 'ts/style/media';