From 7ae38906926dc09bc10670c361af0d2bf0050426 Mon Sep 17 00:00:00 2001 From: Hsuan Lee Date: Sat, 19 Jan 2019 18:42:04 +0800 Subject: Update dependency packages --- packages/website/ts/utils/analytics.ts | 89 --- packages/website/ts/utils/backend_client.ts | 61 -- packages/website/ts/utils/configs.ts | 49 -- packages/website/ts/utils/constants.ts | 130 --- packages/website/ts/utils/doc_utils.ts | 85 -- .../website/ts/utils/documentation_container.ts | 35 - packages/website/ts/utils/error_reporter.ts | 54 -- packages/website/ts/utils/fake_token_registry.ts | 879 --------------------- packages/website/ts/utils/fetch_utils.ts | 48 -- packages/website/ts/utils/mui_theme.ts | 32 - packages/website/ts/utils/order_parser.ts | 50 -- .../website/ts/utils/token_address_overrides.ts | 24 - packages/website/ts/utils/translate.ts | 101 --- packages/website/ts/utils/utils.ts | 483 ----------- 14 files changed, 2120 deletions(-) delete mode 100644 packages/website/ts/utils/analytics.ts delete mode 100644 packages/website/ts/utils/backend_client.ts delete mode 100644 packages/website/ts/utils/configs.ts delete mode 100644 packages/website/ts/utils/constants.ts delete mode 100644 packages/website/ts/utils/doc_utils.ts delete mode 100644 packages/website/ts/utils/documentation_container.ts delete mode 100644 packages/website/ts/utils/error_reporter.ts delete mode 100644 packages/website/ts/utils/fake_token_registry.ts delete mode 100644 packages/website/ts/utils/fetch_utils.ts delete mode 100644 packages/website/ts/utils/mui_theme.ts delete mode 100644 packages/website/ts/utils/order_parser.ts delete mode 100644 packages/website/ts/utils/token_address_overrides.ts delete mode 100644 packages/website/ts/utils/translate.ts delete mode 100644 packages/website/ts/utils/utils.ts (limited to 'packages/website/ts/utils') diff --git a/packages/website/ts/utils/analytics.ts b/packages/website/ts/utils/analytics.ts deleted file mode 100644 index e990b4fc7..000000000 --- a/packages/website/ts/utils/analytics.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { assetDataUtils } from '@0x/order-utils'; -import { ObjectMap } from '@0x/types'; -import * as _ from 'lodash'; -import { PortalOrder } from 'ts/types'; -import { utils } from 'ts/utils/utils'; - -export interface HeapAnalytics { - loaded: boolean; - identify(id: string, idType: string): void; - track(eventName: string, eventProperties?: ObjectMap): void; - resetIdentity(): void; - addUserProperties(properties: ObjectMap): void; - addEventProperties(properties: ObjectMap): void; - removeEventProperty(property: string): void; - clearEventProperties(): void; -} -export class Analytics { - private _heap: HeapAnalytics; - public static init(): Analytics { - return new Analytics(Analytics.getHeap()); - } - public static getHeap(): HeapAnalytics { - const heap = (window as any).heap; - if (!_.isUndefined(heap)) { - return heap; - } else { - throw new Error('Could not find the Heap SDK on the page.'); - } - } - constructor(heap: HeapAnalytics) { - this._heap = heap; - } - // tslint:disable:no-floating-promises - // HeapAnalytics Wrappers - public identify(id: string, idType: string): void { - this._heapLoadedGuardAsync(() => this._heap.identify(id, idType)); - } - public track(eventName: string, eventProperties?: ObjectMap): void { - this._heapLoadedGuardAsync(() => this._heap.track(eventName, eventProperties)); - } - public resetIdentity(): void { - this._heapLoadedGuardAsync(() => this._heap.resetIdentity()); - } - public addUserProperties(properties: ObjectMap): void { - this._heapLoadedGuardAsync(() => this._heap.addUserProperties(properties)); - } - public addEventProperties(properties: ObjectMap): void { - this._heapLoadedGuardAsync(() => this._heap.addEventProperties(properties)); - } - public removeEventProperty(property: string): void { - this._heapLoadedGuardAsync(() => this._heap.removeEventProperty(property)); - } - public clearEventProperties(): void { - this._heapLoadedGuardAsync(() => this._heap.clearEventProperties()); - } - // tslint:enable:no-floating-promises - // Custom methods - public trackOrderEvent(eventName: string, order: PortalOrder): void { - const takerTokenAmount = order.signedOrder.takerAssetAmount.toString(); - const makerTokenAmount = order.signedOrder.makerAssetAmount.toString(); - const takerToken = assetDataUtils.decodeERC20AssetData(order.signedOrder.takerAssetData).tokenAddress; - const makerToken = assetDataUtils.decodeERC20AssetData(order.signedOrder.makerAssetData).tokenAddress; - const orderLoggingData = { - takerTokenAmount, - makerTokenAmount, - takerToken, - makerToken, - }; - this.track(eventName, orderLoggingData); - } - /** - * Heap is not available as a UMD module, and additionally has the strange property of replacing itself with - * a different object once it's loaded. - * Instead of having an await call before every analytics use, we opt to have the awaiting logic in here by - * guarding every API call with the guard below. - */ - private async _heapLoadedGuardAsync(callback: () => void): Promise { - if (this._heap.loaded) { - callback(); - return undefined; - } - await utils.onPageLoadPromise; - // HACK: Reset heap to loaded heap - this._heap = (window as any).heap; - callback(); - } -} - -export const analytics = Analytics.init(); diff --git a/packages/website/ts/utils/backend_client.ts b/packages/website/ts/utils/backend_client.ts deleted file mode 100644 index 5164211df..000000000 --- a/packages/website/ts/utils/backend_client.ts +++ /dev/null @@ -1,61 +0,0 @@ -import * as _ from 'lodash'; - -import { - ArticlesBySection, - WebsiteBackendGasInfo, - WebsiteBackendJobInfo, - WebsiteBackendPriceInfo, - WebsiteBackendRelayerInfo, - WebsiteBackendTokenInfo, -} from 'ts/types'; -import { fetchUtils } from 'ts/utils/fetch_utils'; -import { utils } from 'ts/utils/utils'; - -const ETH_GAS_STATION_ENDPOINT = '/eth_gas_station'; -const JOBS_ENDPOINT = '/jobs'; -const PRICES_ENDPOINT = '/prices'; -const RELAYERS_ENDPOINT = '/relayers'; -const TOKENS_ENDPOINT = '/tokens'; -const WIKI_ENDPOINT = '/wiki'; -const SUBSCRIBE_SUBSTACK_NEWSLETTER_ENDPOINT = '/newsletter_subscriber/substack'; - -export const backendClient = { - async getGasInfoAsync(): Promise { - const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), ETH_GAS_STATION_ENDPOINT); - return result; - }, - async getJobInfosAsync(): Promise { - const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), JOBS_ENDPOINT); - return result; - }, - async getPriceInfoAsync(tokenSymbols: string[]): Promise { - if (_.isEmpty(tokenSymbols)) { - return {}; - } - const joinedTokenSymbols = tokenSymbols.join(','); - const queryParams = { - tokens: joinedTokenSymbols, - }; - const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), PRICES_ENDPOINT, queryParams); - return result; - }, - async getRelayerInfosAsync(): Promise { - const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), RELAYERS_ENDPOINT); - return result; - }, - async getTokenInfosAsync(): Promise { - const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), TOKENS_ENDPOINT); - return result; - }, - async getWikiArticlesBySectionAsync(): Promise { - const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), WIKI_ENDPOINT); - return result; - }, - async subscribeToNewsletterAsync(email: string): Promise { - const result = await fetchUtils.postAsync(utils.getBackendBaseUrl(), SUBSCRIBE_SUBSTACK_NEWSLETTER_ENDPOINT, { - email, - referrer: window.location.href, - }); - return result; - }, -}; diff --git a/packages/website/ts/utils/configs.ts b/packages/website/ts/utils/configs.ts deleted file mode 100644 index 7cc854ca0..000000000 --- a/packages/website/ts/utils/configs.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { OutdatedWrappedEtherByNetworkId, PublicNodeUrlsByNetworkId } from 'ts/types'; - -const BASE_URL = window.location.origin; -const INFURA_API_KEY = 'T5WSC8cautR4KXyYgsRs'; - -export const configs = { - AMOUNT_DISPLAY_PRECSION: 5, - BACKEND_BASE_PROD_URL: 'https://website-api.0x.org', - BACKEND_BASE_STAGING_URL: 'https://staging-website-api.0x.org', - BASE_URL, - BITLY_ACCESS_TOKEN: 'ffc4c1a31e5143848fb7c523b39f91b9b213d208', - DEFAULT_DERIVATION_PATH: `44'/60'/0'`, - // WARNING: ZRX & WETH MUST always be default trackedTokens - DEFAULT_TRACKED_TOKEN_SYMBOLS: ['WETH', 'ZRX'], - DOMAIN_STAGING: 'staging-0xproject.s3-website-us-east-1.amazonaws.com', - DOMAIN_DOGFOOD: 'dogfood.0x.org', - DOMAINS_DEVELOPMENT: ['0xproject.localhost:3572', 'localhost:3572', '127.0.0.1'], - DOMAIN_PRODUCTION: '0x.org', - GOOGLE_ANALYTICS_ID: 'UA-98720122-1', - LAST_LOCAL_STORAGE_FILL_CLEARANCE_DATE: '2017-11-22', - LAST_LOCAL_STORAGE_TRACKED_TOKEN_CLEARANCE_DATE: '2018-9-7', - OUTDATED_WRAPPED_ETHERS: [ - { - 42: { - address: '0x05d090b51c40b020eab3bfcb6a2dff130df22e9c', - timestampMsRange: { - startTimestampMs: 1502455607000, - endTimestampMs: 1513790926000, - }, - }, - 1: { - address: '0x2956356cd2a2bf3202f771f50d3d14a367b48070', - timestampMsRange: { - startTimestampMs: 1502455607000, - endTimestampMs: 1513790926000, - }, - }, - }, - ] as OutdatedWrappedEtherByNetworkId[], - // The order matters. We first try first node and only then fall back to others. - PUBLIC_NODE_URLS_BY_NETWORK_ID: { - [1]: [`https://mainnet.infura.io/${INFURA_API_KEY}`, 'https://mainnet.0x.org'], - [42]: [`https://kovan.infura.io/${INFURA_API_KEY}`, 'https://kovan.0x.org'], - [3]: [`https://ropsten.infura.io/${INFURA_API_KEY}`], - [4]: [`https://rinkeby.infura.io/${INFURA_API_KEY}`], - } as PublicNodeUrlsByNetworkId, - SYMBOLS_OF_MINTABLE_KOVAN_TOKENS: ['ZRX', 'MKR', 'MLN', 'GNT', 'DGD', 'REP'], - SYMBOLS_OF_MINTABLE_ROPSTEN_TOKENS: ['ZRX', 'MKR', 'MLN', 'GNT', 'DGD', 'REP'], -}; diff --git a/packages/website/ts/utils/constants.ts b/packages/website/ts/utils/constants.ts deleted file mode 100644 index ada8de549..000000000 --- a/packages/website/ts/utils/constants.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { ALink } from '@0x/react-shared'; -import { BigNumber } from '@0x/utils'; -import { Key, WebsitePaths } from 'ts/types'; - -const URL_FORUM = 'https://forum.0x.org'; -const URL_ZEROEX_CHAT = 'https://discord.gg/d3FTX3M'; - -export const constants = { - DECIMAL_PLACES_ETH: 18, - DECIMAL_PLACES_ZRX: 18, - ETHER_TOKEN_SYMBOL: 'WETH', - ZRX_TOKEN_SYMBOL: 'ZRX', - ETHER_SYMBOL: 'ETH', - TOKEN_AMOUNT_DISPLAY_PRECISION: 4, - GENESIS_ORDER_BLOCK_BY_NETWORK_ID: { - 1: 4145578, - 42: 3117574, - 50: 0, - 3: 1719261, - 4: 1570919, - } as { [networkId: number]: number }, - HOME_SCROLL_DURATION_MS: 500, - HTTP_NO_CONTENT_STATUS_CODE: 204, - LOCAL_STORAGE_KEY_ACCEPT_DISCLAIMER: 'didAcceptPortalDisclaimer', - LOCAL_STORAGE_KEY_DISMISS_WETH_NOTICE: 'hasDismissedWethNotice', - MAKER_FEE: new BigNumber(0), - MAINNET_NAME: 'Main network', - MINT_AMOUNT: new BigNumber('100000000000000000000'), - NETWORK_ID_MAINNET: 1, - NETWORK_ID_KOVAN: 42, - NETWORK_ID_TESTRPC: 50, - NETWORK_ID_ROPSTEN: 3, - NULL_ADDRESS: '0x0000000000000000000000000000000000000000', - PROVIDER_NAME_LEDGER: 'Ledger', - PROVIDER_NAME_METAMASK: 'MetaMask', - PROVIDER_NAME_PARITY_SIGNER: 'Parity Signer', - PROVIDER_NAME_MIST: 'Mist', - PROVIDER_NAME_CIPHER: 'Cipher Browser', - PROVIDER_NAME_COINBASE_WALLET: 'Coinbase Wallet', - PROVIDER_NAME_GENERIC: 'Injected Web3', - PROVIDER_NAME_PUBLIC: '0x Public', - ROLLBAR_ACCESS_TOKEN: '32c39bfa4bb6440faedc1612a9c13d28', - S3_DOC_BUCKET_ROOT: 'https://s3.amazonaws.com/doc-jsons', - S3_STAGING_DOC_BUCKET_ROOT: 'https://s3.amazonaws.com/staging-doc-jsons', - SUCCESS_STATUS: 200, - UNAVAILABLE_STATUS: 503, - TAKER_FEE: new BigNumber(0), - TESTNET_NAME: 'Kovan', - NUMERAL_USD_FORMAT: '$0,0.00', - EMAIL_JOBS: 'jobs@0x.org', - PROJECT_URL_ETHFINEX: 'https://www.ethfinex.com/', - PROJECT_URL_AMADEUS: 'http://amadeusrelay.org', - PROJECT_URL_DDEX: 'https://ddex.io', - PROJECT_URL_DECENT_EX: 'https://decent.exchange', - PROJECT_URL_DEXTROID: 'https://www.dextroid.io', - PROJECT_URL_ERC_DEX: 'https://ercdex.com', - PROJECT_URL_OPEN_RELAY: 'https://openrelay.xyz', - PROJECT_URL_RADAR_RELAY: 'https://radarrelay.com', - PROJECT_URL_PARADEX: 'https://paradex.io', - PROJECT_URL_DYDX: 'https://dydx.exchange', - PROJECT_URL_MELONPORT: 'https://melonport.com', - PROJECT_URL_DISTRICT_0X: 'https://district0x.io', - PROJECT_URL_DHARMA: 'https://dharma.io', - PROJECT_URL_LENDROID: 'https://lendroid.com', - PROJECT_URL_MAKER: 'https://makerdao.com', - PROJECT_URL_ARAGON: 'https://aragon.one', - PROJECT_URL_BLOCKNET: 'https://blocknet.co', - PROJECT_URL_0CEAN: 'https://theocean.trade', - PROJECT_URL_IMTOKEN: 'https://tokenlon.token.im/', - PROJECT_URL_AUGUR: 'https://augur.net', - PROJECT_URL_AUCTUS: 'https://auctus.org', - PROJECT_URL_OPEN_ANX: 'https://www.openanx.org', - PROJECT_URL_IDT: 'https://kinalpha.com', - URL_ANGELLIST: 'https://angel.co/0xproject/jobs', - URL_APACHE_LICENSE: 'http://www.apache.org/licenses/LICENSE-2.0', - URL_BITLY_API: 'https://api-ssl.bitly.com', - URL_BLOG: 'https://blog.0xproject.com/latest', - URL_DISCOURSE_FORUM: 'https://forum.0x.org', - URL_ECOSYSTEM_APPLY: 'https://0x.smapply.io/', - URL_ECOSYSTEM_BLOG_POST: 'https://blog.0xproject.com/announcing-the-0x-ecosystem-acceleration-program-89d1cb89d565', - URL_FIREFOX_U2F_ADDON: 'https://addons.mozilla.org/en-US/firefox/addon/u2f-support-add-on/', - URL_TESTNET_FAUCET: 'https://faucet.0x.org', - URL_GITHUB_ORG: 'https://github.com/0xProject', - URL_GITHUB_WIKI: 'https://github.com/0xProject/wiki', - URL_FORUM, - URL_PROTOCOL_SPECIFICATION: - 'https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md', - URL_METAMASK_CHROME_STORE: 'https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn', - URL_METAMASK_FIREFOX_STORE: 'https://addons.mozilla.org/en-US/firefox/addon/ether-metamask/', - URL_COINBASE_WALLET_IOS_APP_STORE: 'https://itunes.apple.com/us/app/coinbase-wallet/id1278383455?mt=8', - URL_COINBASE_WALLET_ANDROID_APP_STORE: 'https://play.google.com/store/apps/details?id=org.toshi&hl=en', - URL_METAMASK_HOMEPAGE: 'https://metamask.io/', - URL_METAMASK_OPERA_STORE: 'https://addons.opera.com/en/extensions/details/metamask/', - URL_MIST_DOWNLOAD: 'https://github.com/ethereum/mist/releases', - URL_PARITY_CHROME_STORE: - 'https://chrome.google.com/webstore/detail/parity-ethereum-integrati/himekenlppkgeaoeddcliojfddemadig', - URL_REDDIT: 'https://reddit.com/r/0xproject', - URL_SANDBOX: 'https://codesandbox.io/s/1qmjyp7p5j', - URL_STANDARD_RELAYER_API_GITHUB: 'https://github.com/0xProject/standard-relayer-api/blob/master/README.md', - URL_TWITTER: 'https://twitter.com/0xproject', - URL_FACEBOOK: 'https://www.facebook.com/0xProject/', - URL_WETH_IO: 'https://weth.io/', - URL_CANONICAL_WETH_POST: 'https://blog.0xproject.com/canonical-weth-a9aa7d0279dd', - URL_ZEROEX_CHAT, - URL_LAUNCH_KIT: 'https://github.com/0xProject/0x-launch-kit', - URL_LAUNCH_KIT_BLOG_POST: 'https://blog.0xproject.com/introducing-the-0x-launch-kit-4acdc3453585', - URL_WEB3_DOCS: 'https://github.com/ethereum/wiki/wiki/JavaScript-API', - URL_WEB3_DECODED_LOG_ENTRY_EVENT: - 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L123', - URL_WEB3_LOG_ENTRY_EVENT: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L127', - URL_WEB3_PROVIDER_DOCS: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L150', - URL_BIGNUMBERJS_GITHUB: 'http://mikemcl.github.io/bignumber.js', - URL_MISSION_AND_VALUES_BLOG_POST: 'https://blog.0xproject.com/the-0x-mission-and-values-181a58706f9f', - DEVELOPER_TOPBAR_LINKS: [ - { - title: Key.Wiki, - to: WebsitePaths.Wiki, - }, - { - title: Key.Forum, - to: URL_FORUM, - shouldOpenInNewTab: true, - }, - { - title: Key.LiveChat, - to: URL_ZEROEX_CHAT, - shouldOpenInNewTab: true, - }, - ] as ALink[], -}; diff --git a/packages/website/ts/utils/doc_utils.ts b/packages/website/ts/utils/doc_utils.ts deleted file mode 100644 index 6be164e6e..000000000 --- a/packages/website/ts/utils/doc_utils.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { DocAgnosticFormat, GeneratedDocJson } from '@0x/react-docs'; -import { fetchAsync, logUtils } from '@0x/utils'; -import * as _ from 'lodash'; -import { S3FileObject, VersionToFilePath } from 'ts/types'; -import convert from 'xml-js'; - -export const docUtils = { - async getVersionToFilePathAsync(s3DocJsonRoot: string, folderName: string): Promise { - const versionFilePaths = await docUtils.getVersionFileNamesAsync(s3DocJsonRoot, folderName); - const versionToFilePath: VersionToFilePath = {}; - _.each(versionFilePaths, filePath => { - const version = filePath.split('/v')[1].replace('.json', ''); - versionToFilePath[version] = filePath; - }); - return versionToFilePath; - }, - async getVersionFileNamesAsync(s3DocJsonRoot: string, folderName: string): Promise { - const response = await fetchAsync(s3DocJsonRoot); - if (response.status !== 200) { - // TODO: Show the user an error message when the docs fail to load - const errMsg = await response.text(); - logUtils.log(`Failed to load JSON file list: ${response.status} ${errMsg}`); - throw new Error(errMsg); - } - const responseXML = await response.text(); - const responseJSONString = convert.xml2json(responseXML, { - compact: true, - }); - const responseObj = JSON.parse(responseJSONString); - const fileObjs: S3FileObject[] = _.isArray(responseObj.ListBucketResult.Contents) - ? (responseObj.ListBucketResult.Contents as S3FileObject[]) - : [responseObj.ListBucketResult.Contents]; - - /* - * S3 simply pre-fixes files in "folders" with the folder name. Thus, since we - * store docJSONs for multiple packages in a single S3 bucket, we must filter out - * the versionFileNames for a given folder here (ignoring folder entries) - * - * Example S3 response: - * - * staging-doc-jsons - * - * - * 1000 - * false - * - * 0xjs/ - * 2018-03-16T13:17:46.000Z - * "d41d8cd98f00b204e9800998ecf8427e" - * 0 - * STANDARD - * - * - * 0xjs/v0.1.0.json - * 2018-03-16T13:18:23.000Z - * "b4f7f74913aab4a5ad1e6a58fcb3b274" - * 1039050 - * STANDARD - * - */ - const relevantObjs = _.filter(fileObjs, fileObj => { - const key = fileObj.Key._text; - const isInFolderOfInterest = _.includes(key, folderName); - const isFileEntry = !_.endsWith(key, '/'); - return isInFolderOfInterest && isFileEntry; - }); - - const versionFilePaths = _.map(relevantObjs, fileObj => { - return fileObj.Key._text; - }); - return versionFilePaths; - }, - async getJSONDocFileAsync(filePath: string, s3DocJsonRoot: string): Promise { - const endpoint = `${s3DocJsonRoot}/${filePath}`; - const response = await fetchAsync(endpoint); - if (response.status !== 200) { - // TODO: Show the user an error message when the docs fail to load - const errMsg = await response.text(); - logUtils.log(`Failed to load Doc JSON: ${response.status} ${errMsg}`); - throw new Error(errMsg); - } - const jsonDocObj = await response.json(); - return jsonDocObj; - }, -}; diff --git a/packages/website/ts/utils/documentation_container.ts b/packages/website/ts/utils/documentation_container.ts deleted file mode 100644 index 54e8a2c1a..000000000 --- a/packages/website/ts/utils/documentation_container.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { DocsInfo, DocsInfoConfig } from '@0x/react-docs'; -import { Dispatch } from 'redux'; -import { DocPageProps } from 'ts/pages/documentation/doc_page'; -import { Dispatcher } from 'ts/redux/dispatcher'; -import { State } from 'ts/redux/reducer'; -import { ScreenWidths } from 'ts/types'; -import { Translate } from 'ts/utils/translate'; - -export interface ConnectedState { - docsVersion: string; - availableDocVersions: string[]; - docsInfo: DocsInfo; - translate: Translate; - screenWidth: ScreenWidths; -} - -export interface ConnectedDispatch { - dispatcher: Dispatcher; -} - -export const mapDispatchToProps = (dispatch: Dispatch): ConnectedDispatch => ({ - dispatcher: new Dispatcher(dispatch), -}); - -export const getMapStateToProps = (docsInfoConfig: DocsInfoConfig) => { - const docsInfo = new DocsInfo(docsInfoConfig); - const mapStateToProps = (state: State, _ownProps: DocPageProps): ConnectedState => ({ - docsVersion: state.docsVersion, - availableDocVersions: state.availableDocVersions, - translate: state.translate, - docsInfo, - screenWidth: state.screenWidth, - }); - return mapStateToProps; -}; diff --git a/packages/website/ts/utils/error_reporter.ts b/packages/website/ts/utils/error_reporter.ts deleted file mode 100644 index 8e24060ac..000000000 --- a/packages/website/ts/utils/error_reporter.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { logUtils } from '@0x/utils'; -import Rollbar from 'rollbar'; -import { configs } from 'ts/utils/configs'; -import { constants } from 'ts/utils/constants'; -import { utils } from 'ts/utils/utils'; - -// Suggested way to include Rollbar with Webpack -// https://github.com/rollbar/rollbar.js/tree/master/examples/webpack -const rollbarConfig = { - accessToken: constants.ROLLBAR_ACCESS_TOKEN, - captureUncaught: true, - captureUnhandledRejections: true, - itemsPerMinute: 10, - maxItems: 500, - payload: { - environment: utils.getEnvironment(), - client: { - javascript: { - source_map_enabled: true, - // This is only defined in production environments. - code_version: process.env.GIT_SHA, - guess_uncaught_frames: true, - }, - }, - }, - uncaughtErrorLevel: 'error', - hostWhiteList: [configs.DOMAIN_PRODUCTION, configs.DOMAIN_STAGING], - ignoredMessages: [ - // Errors from the third-party scripts - 'Script error', - // Network errors or ad-blockers - 'TypeError: Failed to fetch', - 'Exchange has not been deployed to detected network (network/artifact mismatch)', - // Source: https://groups.google.com/a/chromium.org/forum/#!topic/chromium-discuss/7VU0_VvC7mE - "undefined is not an object (evaluating '__gCrWeb.autofill.extractForms')", - // Source: http://stackoverflow.com/questions/43399818/securityerror-from-facebook-and-cross-domain-messaging - 'SecurityError (DOM Exception 18)', - ], -}; - -const rollbar = new Rollbar(rollbarConfig); - -export const errorReporter = { - report(err: Error): void { - if (utils.isDevelopment()) { - return; // Let's not log development errors to rollbar - } - rollbar.error(err, (rollbarErr: Error) => { - if (rollbarErr) { - logUtils.log(`Error reporting to rollbar, ignoring: ${rollbarErr}`); - } - }); - }, -}; diff --git a/packages/website/ts/utils/fake_token_registry.ts b/packages/website/ts/utils/fake_token_registry.ts deleted file mode 100644 index 607dd2553..000000000 --- a/packages/website/ts/utils/fake_token_registry.ts +++ /dev/null @@ -1,879 +0,0 @@ -export interface FakeTokenRegistryEntry { - address: string; - name: string; - symbol: string; - decimals: number; -} - -export const fakeTokenRegistry: { [networkId: string]: FakeTokenRegistryEntry[] } = { - '1': [ - { - address: '0xe41d2489571d322189246dafa5ebde1f4699f498', - name: '0x Protocol Token', - symbol: 'ZRX', - decimals: 18, - }, - { - address: '0x4156d3342d5c385a87d264f90653733592000581', - name: 'Salt', - symbol: 'SALT', - decimals: 8, - }, - { - address: '0x05f4a42e251f2d52b8ed15e9fedaacfcef1fad27', - name: 'Zilliqa', - symbol: 'ZIL', - decimals: 12, - }, - { - address: '0xe0b7927c4af23765cb51314a0e0521a9645f0e2a', - name: 'Digix DAO Token', - symbol: 'DGD', - decimals: 9, - }, - { - address: '0xfa05a73ffe78ef8f1a739473e462c54bae6567d9', - name: 'Lunyr', - symbol: 'LUN', - decimals: 18, - }, - { - address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', - name: 'Wrapped Ether', - symbol: 'WETH', - decimals: 18, - }, - { - address: '0xbeb9ef514a379b997e0798fdcc901ee474b6d9a1', - name: 'Melon Token', - symbol: 'MLN', - decimals: 18, - }, - { - address: '0x9a642d6b3368ddc662ca244badf32cda716005bc', - name: 'Qtum', - symbol: 'QTUM', - decimals: 18, - }, - { - address: '0xd26114cd6ee289accf82350c8d8487fedb8a0c07', - name: 'OmiseGO', - symbol: 'OMG', - decimals: 18, - }, - { - address: '0xb97048628db6b661d4c2aa833e95dbe1a905b280', - name: 'TenXPay', - symbol: 'PAY', - decimals: 18, - }, - { - address: '0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0', - name: 'Eos', - symbol: 'EOS', - decimals: 18, - }, - { - address: '0x888666ca69e0f178ded6d75b5726cee99a87d698', - name: 'Iconomi', - symbol: 'ICN', - decimals: 18, - }, - { - address: '0x744d70fdbe2ba4cf95131626614a1763df805b9e', - name: 'StatusNetwork', - symbol: 'SNT', - decimals: 18, - }, - { - address: '0x6810e776880c02933d47db1b9fc05908e5386b96', - name: 'Gnosis', - symbol: 'GNO', - decimals: 18, - }, - { - address: '0x0d8775f648430679a709e98d2b0cb6250d2887ef', - name: 'Basic Attention Token', - symbol: 'BAT', - decimals: 18, - }, - { - address: '0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac', - name: 'Storj', - symbol: 'STORJ', - decimals: 8, - }, - { - address: '0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c', - name: 'Bancor', - symbol: 'BNT', - decimals: 18, - }, - { - address: '0x960b236a07cf122663c4303350609a66a7b288c0', - name: 'Aragon', - symbol: 'ANT', - decimals: 18, - }, - { - address: '0x0abdace70d3790235af448c88547603b945604ea', - name: 'district0x', - symbol: 'DNT', - decimals: 18, - }, - { - address: '0xaec2e87e0a235266d9c5adc9deb4b2e29b54d009', - name: 'SingularDTV', - symbol: 'SNGLS', - decimals: 0, - }, - { - address: '0x419d0d8bdd9af5e606ae2232ed285aff190e711b', - name: 'FunFair', - symbol: 'FUN', - decimals: 8, - }, - { - address: '0xaf30d2a7e90d7dc361c8c4585e9bb7d2f6f15bc7', - name: 'FirstBlood', - symbol: '1ST', - decimals: 18, - }, - { - address: '0x08711d3b02c8758f2fb3ab4e80228418a7f8e39c', - name: 'Edgeless', - symbol: 'EDG', - decimals: 0, - }, - { - address: '0x9992ec3cf6a55b00978cddf2b27bc6882d88d1ec', - name: 'Polymath', - symbol: 'POLY', - decimals: 18, - }, - { - address: '0x607f4c5bb672230e8672085532f7e901544a7375', - name: 'iExec', - symbol: 'RLC', - decimals: 9, - }, - { - address: '0x667088b212ce3d06a1b553a7221e1fd19000d9af', - name: 'Wings', - symbol: 'WINGS', - decimals: 18, - }, - { - address: '0x41e5560054824ea6b0732e656e3ad64e20e94e45', - name: 'Civic', - symbol: 'CVC', - decimals: 8, - }, - { - address: '0xb63b606ac810a52cca15e44bb630fd42d8d1d83d', - name: 'Monaco', - symbol: 'MCO', - decimals: 8, - }, - { - address: '0xf433089366899d83a9f26a773d59ec7ecf30355e', - name: 'Metal', - symbol: 'MTL', - decimals: 8, - }, - { - address: '0x12fef5e57bf45873cd9b62e9dbd7bfb99e32d73e', - name: 'Cofoundit', - symbol: 'CFI', - decimals: 18, - }, - { - address: '0xaaaf91d9b90df800df4f55c205fd6989c977e73a', - name: 'Monolith TKN', - symbol: 'TKN', - decimals: 8, - }, - { - address: '0xe7775a6e9bcf904eb39da2b68c5efb4f9360e08c', - name: 'Token-as-a-Service', - symbol: 'TAAS', - decimals: 6, - }, - { - address: '0x2e071d2966aa7d8decb1005885ba1977d6038a65', - name: 'DICE', - symbol: 'ROL', - decimals: 16, - }, - { - address: '0xcb94be6f13a1182e4a4b6140cb7bf2025d28e41b', - name: 'Trustcoin', - symbol: 'TRST', - decimals: 6, - }, - { - address: '0x1776e1f26f98b1a5df9cd347953a26dd3cb46671', - name: 'Numeraire', - symbol: 'NMR', - decimals: 18, - }, - { - address: '0x7c5a0ce9267ed19b22f8cae653f198e3e8daf098', - name: 'Santiment Network Token', - symbol: 'SAN', - decimals: 18, - }, - { - address: '0xdd974d5c2e2928dea5f71b9825b8b646686bd200', - name: 'Kyber Network Crystal', - symbol: 'KNC', - decimals: 18, - }, - { - address: '0xb7cb1c96db6b22b0d3d9536e0108d062bd488f74', - name: 'Walton', - symbol: 'WTC', - decimals: 18, - }, - { - address: '0xd0d6d6c5fe4a677d343cc433536bb717bae167dd', - name: 'adToken', - symbol: 'ADT', - decimals: 9, - }, - { - address: '0x42d6622dece394b54999fbd73d108123806f6a18', - name: 'SpankChain', - symbol: 'SPANK', - decimals: 18, - }, - { - address: '0x701c244b988a513c945973defa05de933b23fe1d', - name: 'openANX', - symbol: 'OAX', - decimals: 18, - }, - { - address: '0x514910771af9ca656af840dff83e8264ecf986ca', - name: 'ChainLink', - symbol: 'LINK', - decimals: 18, - }, - { - address: '0x8f8221afbb33998d8584a2b05749ba73c37a938a', - name: 'Request Network', - symbol: 'REQ', - decimals: 18, - }, - { - address: '0x27054b13b1b798b345b591a4d22e6562d47ea75a', - name: 'AirSwap', - symbol: 'AST', - decimals: 4, - }, - { - address: '0xf0ee6b27b759c9893ce4f094b49ad28fd15a23e4', - name: 'Enigma', - symbol: 'ENG', - decimals: 8, - }, - { - address: '0x818fc6c2ec5986bc6e2cbf00939d90556ab12ce5', - name: 'Kin', - symbol: 'KIN', - decimals: 18, - }, - { - address: '0x27dce1ec4d3f72c3e457cc50354f1f975ddef488', - name: 'AirToken', - symbol: 'AIR', - decimals: 8, - }, - { - address: '0x12480e24eb5bec1a9d4369cab6a80cad3c0a377a', - name: 'Substratum', - symbol: 'SUB', - decimals: 2, - }, - { - address: '0x0e8d6b471e332f140e7d9dbb99e5e3822f728da6', - name: 'ABYSS', - symbol: 'ABYSS', - decimals: 18, - }, - { - address: '0x4ceda7906a5ed2179785cd3a40a69ee8bc99c466', - name: 'AION', - symbol: 'AION', - decimals: 8, - }, - { - address: '0xd8912c10681d8b21fd3742244f44658dba12264e', - name: 'Pluton', - symbol: 'PLU', - decimals: 18, - }, - { - address: '0x1a7a8bd9106f2b8d977e08582dc7d24c723ab0db', - name: 'AppCoins', - symbol: 'APPC', - decimals: 18, - }, - { - address: '0xba5f11b16b155792cf3b2e6880e8706859a8aeb6', - name: 'Aeron', - symbol: 'ARN', - decimals: 8, - }, - { - address: '0xfec0cf7fe078a500abf15f1284958f22049c2c7e', - name: 'Maecenas ART Token', - symbol: 'ART', - decimals: 18, - }, - { - address: '0x0f5d2fb29fb7d3cfee444a200298f468908cc942', - name: 'Decentraland', - symbol: 'MANA', - decimals: 18, - }, - { - address: '0x1c4481750daa5ff521a2a7490d9981ed46465dbd', - name: 'BlockMason Credit Protocol Token', - symbol: 'BCPT', - decimals: 18, - }, - { - address: '0x55296f69f40ea6d20e478533c15a6b08b654e758', - name: 'XY Oracle', - symbol: 'XYO', - decimals: 18, - }, - { - address: '0xd7732e3783b0047aa251928960063f863ad022d8', - name: 'BrahmaOS', - symbol: 'BRM', - decimals: 18, - }, - { - address: '0x7d4b8cce0591c9044a22ee543533b72e976e36c3', - name: 'Change Coin', - symbol: 'CAG', - decimals: 18, - }, - { - address: '0x1d462414fe14cf489c7a21cac78509f4bf8cd7c0', - name: 'CanYaCoin', - symbol: 'CAN', - decimals: 6, - }, - { - address: '0x1234567461d3f8db7496581774bd869c83d51c93', - name: 'BitClave', - symbol: 'CAT', - decimals: 18, - }, - { - address: '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359', - name: 'Dai Stablecoin v1.0', - symbol: 'DAI', - decimals: 18, - }, - { - address: '0x0cf0ee63788a0849fe5297f3407f701e122cc023', - name: 'Streamr DATAcoin', - symbol: 'DATA', - decimals: 18, - }, - { - address: '0x151202c9c18e495656f372281f493eb7698961d5', - name: 'DEBITUM', - symbol: 'DEB', - decimals: 18, - }, - { - address: '0xba2184520a1cc49a6159c57e61e1844e085615b6', - name: 'HelloGold Token', - symbol: 'HGT', - decimals: 8, - }, - { - address: '0x13f11c9905a08ca76e3e853be63d4f0944326c72', - name: 'Divi Exchange Token', - symbol: 'DIVX', - decimals: 18, - }, - { - address: '0x5b26c5d0772e5bbac8b3182ae9a13f9bb2d03765', - name: 'EDU Token', - symbol: 'EDU', - decimals: 8, - }, - { - address: '0xd49ff13661451313ca1553fd6954bd1d9b6e02b9', - name: 'ElectrifyAsia', - symbol: 'ELEC', - decimals: 18, - }, - { - address: '0x95daaab98046846bf4b2853e23cba236fa394a31', - name: 'EtheremonToken', - symbol: 'EMONT', - decimals: 8, - }, - { - address: '0x5bc7e5f0ab8b2e10d2d0a3f21739fce62459aef3', - name: 'Hut34 Entropy Token', - symbol: 'ENTR', - decimals: 18, - }, - { - address: '0x923108a439c4e8c2315c4f6521e5ce95b44e9b4c', - name: 'Devery.io', - symbol: 'EVE', - decimals: 18, - }, - { - address: '0xf8e386eda857484f5a12e4b5daa9984e06e73705', - name: 'Indorse Token', - symbol: 'IND', - decimals: 18, - }, - { - address: '0x4f4f0db4de903b88f2b1a2847971e231d54f8fd3', - name: 'Geens Platform Token', - symbol: 'GEE', - decimals: 8, - }, - { - address: '0x543ff227f64aa17ea132bf9886cab5db55dcaddf', - name: 'DAOstack', - symbol: 'GEN', - decimals: 18, - }, - { - address: '0x8a854288a5976036a725879164ca3e91d30c6a1b', - name: 'Guaranteed Entrance Token', - symbol: 'GET', - decimals: 18, - }, - { - address: '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2', - name: 'Maker', - symbol: 'MKR', - decimals: 18, - }, - { - address: '0x9af839687f6c94542ac5ece2e317daae355493a1', - name: 'Hydro Protocol Token', - symbol: 'HOT', - decimals: 18, - }, - { - address: '0x0d262e5dc4a06a0f1c90ce79c7a60c09dfc884e4', - name: 'JET8 Token', - symbol: 'J8T', - decimals: 8, - }, - { - address: '0x8727c112c712c4a03371ac87a74dd6ab104af768', - name: 'Jetcoin Institute Token', - symbol: 'JET', - decimals: 18, - }, - { - address: '0xa4e8c3ec456107ea67d3075bf9e3df3a75823db0', - name: 'Loom Network Token', - symbol: 'LOOM', - decimals: 18, - }, - { - address: '0x957c30ab0426e0c93cd8241e2c60392d08c6ac8e', - name: 'Modum Token', - symbol: 'MOD', - decimals: 0, - }, - { - address: '0x2ef27bf41236bd859a95209e17a43fbd26851f92', - name: 'MORPH', - symbol: 'MORPH', - decimals: 4, - }, - { - address: '0x263c618480dbe35c300d8d5ecda19bbb986acaed', - name: 'MOT', - symbol: 'MOT', - decimals: 18, - }, - { - address: '0xffe02ee4c69edf1b340fcad64fbd6b37a7b9e265', - name: 'NANJCOIN', - symbol: 'NANJ', - decimals: 8, - }, - { - address: '0xc15a399c4ea7815fe36857c9e290ee452a5d6b21', - name: 'BoatPilot Token', - symbol: 'NAVI', - decimals: 18, - }, - { - address: '0x9e46a38f5daabe8683e10793b06749eef7d733d1', - name: 'PolySwarm Nectar', - symbol: 'NCT', - decimals: 18, - }, - { - address: '0xa54ddc7b3cce7fc8b1e3fa0256d0db80d2c10970', - name: 'NEVERDIE Coin', - symbol: 'NDC', - decimals: 18, - }, - { - address: '0xb62132e35a6c13ee1ee0f84dc5d40bad8d815206', - name: 'Nexo', - symbol: 'NEXO', - decimals: 18, - }, - { - address: '0x0235fe624e044a05eed7a43e16e3083bc8a4287a', - name: 'Original Crypto Coin', - symbol: 'OCC', - decimals: 18, - }, - { - address: '0xb5dbc6d3cf380079df3b27135664b6bcf45d1869', - name: 'Omix', - symbol: 'OMX', - decimals: 8, - }, - { - address: '0xfedae5642668f8636a11987ff386bfd215f942ee', - name: 'PolicyPal Network Token', - symbol: 'PAL', - decimals: 18, - }, - { - address: '0x2604fa406be957e542beb89e6754fcde6815e83f', - name: 'Playkey Token', - symbol: 'PKT', - decimals: 18, - }, - { - address: '0xe477292f1b3268687a29376116b0ed27a9c76170', - name: 'Herocoin', - symbol: 'PLAY', - decimals: 18, - }, - { - address: '0x1985365e9f78359a9b6ad760e32412f4a445e862', - name: 'Augur', - symbol: 'REP', - decimals: 18, - }, - { - address: '0x408e41876cccdc0f92210600ef50372656052a38', - name: 'Republic Protocol', - symbol: 'REN', - decimals: 18, - }, - { - address: '0xd0929d411954c47438dc1d871dd6081f5c5e149c', - name: 'Refereum', - symbol: 'RFR', - decimals: 4, - }, - { - address: '0x3d1ba9be9f66b8ee101911bc36d3fb562eac2244', - name: 'Rivetz', - symbol: 'RVT', - decimals: 18, - }, - { - address: '0x6888a16ea9792c15a4dcf2f6c623d055c8ede792', - name: 'Spectiv Signal Token', - symbol: 'SIG', - decimals: 18, - }, - { - address: '0x20f7a3ddf244dc9299975b4da1c39f8d5d75f05a', - name: 'Sapien Network Token', - symbol: 'SPN', - decimals: 6, - }, - { - address: '0xbbff862d906e348e9946bfb2132ecb157da3d4b4', - name: 'Sharder', - symbol: 'SS', - decimals: 18, - }, - { - address: '0x12b306fa98f4cbb8d4457fdff3a0a0a56f07ccdf', - name: 'Spectre.ai D-Token', - symbol: 'SXDT', - decimals: 18, - }, - { - address: '0xff3519eeeea3e76f1f699ccce5e23ee0bdda41ac', - name: 'Blockchain Capital', - symbol: 'BCAP', - decimals: 0, - }, - { - address: '0xced1a8529125d1bd06b54a7b01210df357d00885', - name: 'Too Real Badge', - symbol: 'TRL', - decimals: 0, - }, - { - address: '0xc86d054809623432210c107af2e3f619dcfbf652', - name: 'SENTINEL PROTOCOL', - symbol: 'UPP', - decimals: 18, - }, - { - address: '0x27f610bf36eca0939093343ac28b1534a721dbb4', - name: 'Wand Token', - symbol: 'WAND', - decimals: 18, - }, - { - address: '0x056017c55ae7ae32d12aef7c679df83a85ca75ff', - name: 'WyvernToken', - symbol: 'WYV', - decimals: 18, - }, - { - address: '0x5ca9a71b1d01849c0a95490cc00559717fcf0d1d', - name: 'Aeternity', - symbol: 'AE', - decimals: 18, - }, - { - address: '0xbc86727e770de68b1060c91f6bb6945c73e10388', - name: 'Ink Protocol', - symbol: 'XNK', - decimals: 18, - }, - { - address: '0x0f513ffb4926ff82d7f60a05069047aca295c413', - name: 'CrowdstartCoin', - symbol: 'XSC', - decimals: 18, - }, - { - address: '0xb9e7f8568e08d5659f5d29c4997173d84cdf2607', - name: 'Swarm City Token', - symbol: 'SWT', - decimals: 18, - }, - { - address: '0x6531f133e6deebe7f2dce5a0441aa7ef330b4e53', - name: 'Chronobank TIME', - symbol: 'TIME', - decimals: 8, - }, - { - address: '0xf230b790e05390fc8295f4d3f60332c93bed42e2', - name: 'Tronix', - symbol: 'TRX', - decimals: 6, - }, - { - address: '0x5c543e7ae0a1104f78406c340e9c64fd9fce5170', - name: 'vSlice', - symbol: 'VSL', - decimals: 0, - }, - { - address: '0x4df812f6064def1e5e029f1ca858777cc98d2d81', - name: 'Xaurum', - symbol: 'XAUR', - decimals: 8, - }, - ], - '42': [ - { - address: '0x6ff6c0ff1d68b964901f986d4c9fa3ac68346570', - name: '0x Protocol Token', - symbol: 'ZRX', - decimals: 18, - }, - { - address: '0x323b5d4c32345ced77393b3530b1eed0f346429d', - name: 'Melon Token', - symbol: 'MLN', - decimals: 18, - }, - { - address: '0x1dad4783cf3fe3085c1426157ab175a6119a04ba', - name: 'Maker DAO', - symbol: 'MKR', - decimals: 18, - }, - { - address: '0xeee3870657e4716670f185df08652dd848fe8f7e', - name: 'Digix DAO Token', - symbol: 'DGD', - decimals: 18, - }, - { - address: '0xb18845c260f680d5b9d84649638813e342e4f8c9', - name: 'Augur Reputation Token', - symbol: 'REP', - decimals: 18, - }, - { - address: '0xef7fff64389b814a946f3e92105513705ca6b990', - name: 'Golem Network Token', - symbol: 'GNT', - decimals: 18, - }, - { - address: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', - name: 'Wrapped Ether', - symbol: 'WETH', - decimals: 18, - }, - ], - '3': [ - { - address: '0xdf18648f5b4357d6cc1e27f7699af4f77ff44558', - name: 'token0', - symbol: 'TKN0', - decimals: 0, - }, - { - address: '0xd7cdcde4302a60c4d74a11eee21fbf455f476021', - name: 'token1', - symbol: 'TKN1', - decimals: 1, - }, - { - address: '0xf080f68c2113d40ff6a8528863f431908680900a', - name: 'token2', - symbol: 'TKN2', - decimals: 2, - }, - { - address: '0xe982b5c62434c98e27d15fed40447dda6b75c4eb', - name: 'token3', - symbol: 'TKN3', - decimals: 3, - }, - { - address: '0x2427d136751c1ca70480d3b2091261d639090a50', - name: 'token4', - symbol: 'TKN4', - decimals: 4, - }, - { - address: '0x7d3eca8ec55bb32bd0056edb9485b07a53d3fbfd', - name: 'token5', - symbol: 'TKN5', - decimals: 5, - }, - { - address: '0xff3c22e0a9014e9b4b1cf7a54bf39ab3107f6123', - name: 'token6', - symbol: 'TKN6', - decimals: 6, - }, - { - address: '0xdec283d9e188397c841ab59d9d9160fd47bc56f8', - name: 'token7', - symbol: 'TKN7', - decimals: 7, - }, - { - address: '0xedf5fd2f60d8fefbfa8011f2769b39657c54c3fd', - name: 'token8', - symbol: 'TKN8', - decimals: 8, - }, - { - address: '0xcd59fe7fa1a1a0ff536966a599b631d9cd5f2914', - name: 'token9', - symbol: 'TKN9', - decimals: 9, - }, - { - address: '0xaece1ee1813d56a5897f19ad50164565203b459f', - name: 'token10', - symbol: 'TKN10', - decimals: 10, - }, - { - address: '0xaab3f0619e529b1f1823be291daa7fcd38a15927', - name: 'token11', - symbol: 'TKN11', - decimals: 11, - }, - { - address: '0x2c46ad0b19cb1c1f3e51ae90d80654a227b08d30', - name: 'token12', - symbol: 'TKN12', - decimals: 12, - }, - { - address: '0x68977f3286a503f2b3930506f1b3a17dafbd9524', - name: 'token13', - symbol: 'TKN13', - decimals: 13, - }, - { - address: '0xe5c400b9ee56b823c6193a662041389624609db6', - name: 'token14', - symbol: 'TKN14', - decimals: 14, - }, - { - address: '0xf16ea9b23ddbeb6b16d253edf6b595da4009bb8b', - name: 'token16', - symbol: 'TKN16', - decimals: 16, - }, - { - address: '0x739a83860971e900c4bbbb92be6cfb9d459ef94a', - name: 'token15', - symbol: 'TKN15', - decimals: 15, - }, - { - address: '0x5eba21470cf683fe91b594afe7106039e38f3312', - name: 'token17', - symbol: 'TKN17', - decimals: 17, - }, - { - address: '0xc0ddd5df448907bb3f50350f3fe7a1da3fb2a2ee', - name: 'token18', - symbol: 'TKN18', - decimals: 18, - }, - { - address: '0x30fa25e53f8031014166fbd5e4bbeac0cd25df74', - name: 'token19', - symbol: 'TKN19', - decimals: 19, - }, - { - address: '0xa8e9fa8f91e5ae138c74648c9c304f1c75003a8d', - name: '0x Protocol Token', - symbol: 'ZRX', - decimals: 18, - }, - { - address: '0xc778417e063141139fce010982780140aa0cd5ab', - name: 'Ether Token', - symbol: 'WETH', - decimals: 18, - }, - { - address: '0x14823db576c11e4a54ca9e01ca0b28b18d3d1187', - name: 'b0x Protocol Token', - symbol: 'B0X', - decimals: 18, - }, - ], -}; // tslint:disable:max-file-line-count diff --git a/packages/website/ts/utils/fetch_utils.ts b/packages/website/ts/utils/fetch_utils.ts deleted file mode 100644 index 9afc5904d..000000000 --- a/packages/website/ts/utils/fetch_utils.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { fetchAsync, logUtils } from '@0x/utils'; -import * as _ from 'lodash'; -import * as queryString from 'query-string'; - -import { errorReporter } from 'ts/utils/error_reporter'; - -const logErrorIfPresent = (response: Response, requestedURL: string) => { - if (response.status !== 200) { - const errorText = `Error requesting url: ${requestedURL}, ${response.status}: ${response.statusText}`; - logUtils.log(errorText); - const error = Error(errorText); - errorReporter.report(error); - throw error; - } -}; - -export const fetchUtils = { - async requestAsync(baseUrl: string, path: string, queryParams?: object): Promise { - const query = queryStringFromQueryParams(queryParams); - const url = `${baseUrl}${path}${query}`; - const response = await fetchAsync(url); - logErrorIfPresent(response, url); - const result = await response.json(); - return result; - }, - async postAsync(baseUrl: string, path: string, body: object): Promise { - const url = `${baseUrl}${path}`; - const response = await fetchAsync(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(body), - }); - logErrorIfPresent(response, url); - return response; - }, -}; - -function queryStringFromQueryParams(queryParams?: object): string { - // if params are undefined or empty, return an empty string - if (_.isUndefined(queryParams) || _.isEmpty(queryParams)) { - return ''; - } - // stringify the formatted object - const stringifiedParams = queryString.stringify(queryParams); - return `?${stringifiedParams}`; -} diff --git a/packages/website/ts/utils/mui_theme.ts b/packages/website/ts/utils/mui_theme.ts deleted file mode 100644 index 3f32254de..000000000 --- a/packages/website/ts/utils/mui_theme.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { colors } from '@0x/react-shared'; -import { getMuiTheme } from 'material-ui/styles'; - -export const muiTheme = getMuiTheme({ - appBar: { - height: 45, - color: colors.white, - textColor: colors.black, - }, - palette: { - accent1Color: colors.lightBlueA700, - pickerHeaderColor: colors.mediumBlue, - primary1Color: colors.mediumBlue, - primary2Color: colors.mediumBlue, - textColor: colors.grey700, - }, - datePicker: { - color: colors.grey700, - textColor: colors.white, - calendarTextColor: colors.grey, - selectColor: colors.darkestGrey, - selectTextColor: colors.white, - }, - timePicker: { - color: colors.grey700, - textColor: colors.white, - accentColor: colors.white, - headerColor: colors.darkestGrey, - selectColor: colors.darkestGrey, - selectTextColor: colors.darkestGrey, - }, -}); diff --git a/packages/website/ts/utils/order_parser.ts b/packages/website/ts/utils/order_parser.ts deleted file mode 100644 index 8938fbc53..000000000 --- a/packages/website/ts/utils/order_parser.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { orderParsingUtils } from '@0x/order-utils'; -import { logUtils } from '@0x/utils'; -import * as _ from 'lodash'; - -import { portalOrderSchema } from 'ts/schemas/portal_order_schema'; -import { validator } from 'ts/schemas/validator'; -import { PortalOrder } from 'ts/types'; - -export const orderParser = { - parseQueryString(queryString: string): PortalOrder | undefined { - if (queryString.length === 0) { - return undefined; - } - const queryParams = queryString.substring(1).split('&'); - const orderQueryParam = _.find(queryParams, queryParam => { - const queryPair = queryParam.split('='); - return queryPair[0] === 'order'; - }); - if (_.isUndefined(orderQueryParam)) { - return undefined; - } - const orderPair = orderQueryParam.split('='); - if (orderPair.length !== 2) { - return undefined; - } - const order = JSON.parse(decodeURIComponent(orderPair[1])); - const validationResult = validator.validate(order, portalOrderSchema); - if (validationResult.errors.length > 0) { - logUtils.log(`Invalid shared order: ${validationResult.errors}`); - return undefined; - } - const signedOrder = _.get(order, 'signedOrder'); - const convertedSignedOrder = orderParsingUtils.convertOrderStringFieldsToBigNumber(signedOrder); - const result = { - ...order, - signedOrder: convertedSignedOrder, - }; - return result; - }, - parseJsonString(orderJson: string): PortalOrder { - const order = JSON.parse(orderJson); - const signedOrder = _.get(order, 'signedOrder'); - const convertedSignedOrder = orderParsingUtils.convertOrderStringFieldsToBigNumber(signedOrder); - const result = { - ...order, - signedOrder: convertedSignedOrder, - }; - return result; - }, -}; diff --git a/packages/website/ts/utils/token_address_overrides.ts b/packages/website/ts/utils/token_address_overrides.ts deleted file mode 100644 index 5e7275964..000000000 --- a/packages/website/ts/utils/token_address_overrides.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ObjectMap } from '@0x/types'; -import { constants } from 'ts/utils/constants'; - -// Map of networkId -> tokenSymbol -> tokenAddress -export type TokenOverrides = ObjectMap>; - -export const tokenAddressOverrides: TokenOverrides = { - [constants.NETWORK_ID_KOVAN]: { - ZRX: '0x2002d3812f58e35f0ea1ffbf80a75a38c32175fa', - REP: '0x8cb3971b8eb709c14616bd556ff6683019e90d9c', - DGD: '0xa4f468c9c692eb6b4b8b06270dae7a2cfeedcde9', - GNT: '0x31fb614e223706f15d0d3c5f4b08bdf0d5c78623', - MKR: '0x7b6b10caa9e8e9552ba72638ea5b47c25afea1f3', - MLN: '0x17e394d1df6ce29d042195ea38411a98ff3ead94', - }, - [constants.NETWORK_ID_ROPSTEN]: { - ZRX: '0xff67881f8d12f372d91baae9752eb3631ff0ed00', - REP: '0xb0b443fe0e8a04c4c85e8fda9c5c1ccc057d6653', - DGD: '0xc4895a5aafa2708d6bc1294e20ec839aad156b1d', - GNT: '0x7f8acc55a359ca4517c30510566ac35b800f7cac', - MKR: '0x06732516acd125b6e83c127752ed5f027e1b276e', - MLN: '0x823ebe83d39115536274a8617e00a1ff3544fd63', - }, -}; diff --git a/packages/website/ts/utils/translate.ts b/packages/website/ts/utils/translate.ts deleted file mode 100644 index af5c766a9..000000000 --- a/packages/website/ts/utils/translate.ts +++ /dev/null @@ -1,101 +0,0 @@ -import * as _ from 'lodash'; -import { Deco, Key, Language } from 'ts/types'; - -import chinese from '../../translations/chinese.json'; -import english from '../../translations/english.json'; -import korean from '../../translations/korean.json'; -import russian from '../../translations/russian.json'; -import spanish from '../../translations/spanish.json'; - -const languageToTranslations = { - [Language.English]: english, - [Language.Spanish]: spanish, - [Language.Chinese]: chinese, - [Language.Korean]: korean, - [Language.Russian]: russian, -}; - -const languagesWithoutCaps = [Language.Chinese, Language.Korean]; - -interface Translation { - [key: string]: string; -} - -export class Translate { - private _selectedLanguage: Language; - private _translation: Translation; - constructor(desiredLanguage?: Language) { - if (!_.isUndefined(desiredLanguage)) { - this.setLanguage(desiredLanguage); - return; - } - const browserLanguage = (window.navigator as any).userLanguage || window.navigator.language || 'en-US'; - let language = Language.English; - if (_.includes(browserLanguage, 'es-')) { - language = Language.Spanish; - } else if (_.includes(browserLanguage, 'zh-')) { - language = Language.Chinese; - } else if (_.includes(browserLanguage, 'ko-')) { - language = Language.Korean; - } else if (_.includes(browserLanguage, 'ru-')) { - language = Language.Russian; - } - this.setLanguage(language); - } - public getLanguage(): Language { - return this._selectedLanguage; - } - public setLanguage(language: Language): void { - const isLanguageSupported = !_.isUndefined(languageToTranslations[language]); - if (!isLanguageSupported) { - throw new Error(`${language} not supported`); - } - this._selectedLanguage = language; - this._translation = languageToTranslations[language]; - } - public get(key: Key, decoration?: Deco): string { - let text = this._translation[key]; - // if a translation does not exist for a certain language, fallback to english - // if it still doesn't exist in english, throw an error - if (_.isUndefined(text)) { - const englishTranslation: Translation = languageToTranslations[Language.English]; - const englishText = englishTranslation[key]; - if (!_.isUndefined(englishText)) { - text = englishText; - } else { - throw new Error( - `Translation key not available in ${this._selectedLanguage} or ${Language.English}: ${key}`, - ); - } - } - if (!_.isUndefined(decoration) && !_.includes(languagesWithoutCaps, this._selectedLanguage)) { - switch (decoration) { - case Deco.Cap: - text = this._capitalize(text); - break; - - case Deco.Upper: - text = text.toUpperCase(); - break; - - case Deco.CapWords: - const words = text.split(' '); - const capitalizedWords = _.map(words, (w: string, i: number) => { - if (w.length === 1) { - return w; - } - return this._capitalize(w); - }); - text = capitalizedWords.join(' '); - break; - - default: - throw new Error(`Unrecognized decoration: ${decoration}`); - } - } - return text; - } - private _capitalize(text: string): string { - return `${text.charAt(0).toUpperCase()}${text.slice(1)}`; - } -} diff --git a/packages/website/ts/utils/utils.ts b/packages/website/ts/utils/utils.ts deleted file mode 100644 index e84f9d0cc..000000000 --- a/packages/website/ts/utils/utils.ts +++ /dev/null @@ -1,483 +0,0 @@ -import { ContractWrappersError } from '@0x/contract-wrappers'; -import { assetDataUtils, OrderError } from '@0x/order-utils'; -import { constants as sharedConstants, Networks } from '@0x/react-shared'; -import { ExchangeContractErrs } from '@0x/types'; -import { BigNumber } from '@0x/utils'; -import { Web3Wrapper } from '@0x/web3-wrapper'; -import * as bowser from 'bowser'; -import deepEqual from 'deep-equal'; -import * as _ from 'lodash'; -import * as moment from 'moment'; -import * as numeral from 'numeral'; - -import { Provider } from 'ethereum-types'; -import { - AccountState, - BlockchainCallErrs, - BrowserType, - Environments, - OperatingSystemType, - PortalOrder, - Providers, - ProviderType, - ScreenWidths, - Side, - SideToAssetToken, - Token, - TokenByAddress, - TokenState, -} from 'ts/types'; -import { configs } from 'ts/utils/configs'; -import { constants } from 'ts/utils/constants'; -import * as u2f from 'ts/vendor/u2f_api'; - -export const utils = { - assert(condition: boolean, message: string): void { - if (!condition) { - throw new Error(message); - } - }, - isNumeric(n: string): boolean { - return !isNaN(parseFloat(n)) && isFinite(Number(n)); - }, - // This default unix timestamp is used for orders where the user does not specify an expiry date. - // It is a fixed constant so that both the redux store's INITIAL_STATE and components can check for - // whether a user has set an expiry date or not. It is set unrealistically high so as not to collide - // with actual values a user would select. - initialOrderExpiryUnixTimestampSec(): BigNumber { - const m = moment('2050-01-01'); - return new BigNumber(m.unix()); - }, - convertToUnixTimestampSeconds(date: moment.Moment, time?: moment.Moment): BigNumber { - const finalMoment = date; - if (!_.isUndefined(time)) { - finalMoment.hours(time.hours()); - finalMoment.minutes(time.minutes()); - } - return new BigNumber(finalMoment.unix()); - }, - convertToMomentFromUnixTimestamp(unixTimestampSec: BigNumber): moment.Moment { - return moment.unix(unixTimestampSec.toNumber()); - }, - convertToReadableDateTimeFromUnixTimestamp(unixTimestampSec: BigNumber): string { - const m = utils.convertToMomentFromUnixTimestamp(unixTimestampSec); - const formattedDate: string = m.format('h:MMa MMMM D YYYY'); - return formattedDate; - }, - generateOrder( - exchangeAddress: string, - sideToAssetToken: SideToAssetToken, - expirationTimeSeconds: BigNumber, - orderTakerAddress: string, - orderMakerAddress: string, - makerFee: BigNumber, - takerFee: BigNumber, - feeRecipientAddress: string, - signature: string, - tokenByAddress: TokenByAddress, - orderSalt: BigNumber, - ): PortalOrder { - const makerToken = tokenByAddress[sideToAssetToken[Side.Deposit].address]; - const takerToken = tokenByAddress[sideToAssetToken[Side.Receive].address]; - const order = { - signedOrder: { - senderAddress: constants.NULL_ADDRESS, - makerAddress: orderMakerAddress, - takerAddress: orderTakerAddress, - makerFee, - takerFee, - makerAssetAmount: sideToAssetToken[Side.Deposit].amount, - takerAssetAmount: sideToAssetToken[Side.Receive].amount, - makerAssetData: assetDataUtils.encodeERC20AssetData(makerToken.address), - takerAssetData: assetDataUtils.encodeERC20AssetData(takerToken.address), - expirationTimeSeconds, - feeRecipientAddress, - salt: orderSalt, - signature, - exchangeAddress, - }, - metadata: { - makerToken: { - name: makerToken.name, - symbol: makerToken.symbol, - decimals: makerToken.decimals, - }, - takerToken: { - name: takerToken.name, - symbol: takerToken.symbol, - decimals: takerToken.decimals, - }, - }, - }; - return order; - }, - async sleepAsync(ms: number): Promise { - return new Promise(resolve => setTimeout(resolve, ms)); - }, - deepEqual(actual: any, expected: any, opts?: { strict: boolean }): boolean { - return deepEqual(actual, expected, opts); - }, - getColSize(items: number): number { - const bassCssGridSize = 12; // Source: http://basscss.com/#basscss-grid - const colSize = bassCssGridSize / items; - if (!_.isInteger(colSize)) { - throw new Error(`Number of cols must be divisible by ${bassCssGridSize}`); - } - return colSize; - }, - getScreenWidth(): ScreenWidths { - const documentEl = document.documentElement; - const body = document.getElementsByTagName('body')[0]; - const widthInPx = window.innerWidth || documentEl.clientWidth || body.clientWidth; - const bodyStyles: any = window.getComputedStyle(document.querySelector('body')); - const widthInEm = widthInPx / parseFloat(bodyStyles['font-size']); - - // This logic mirrors the CSS media queries in BassCSS for the `lg-`, `md-` and `sm-` CSS - // class prefixes. Do not edit these. - if (widthInEm > ScreenWidths.Lg) { - return ScreenWidths.Lg; - } else if (widthInEm > ScreenWidths.Md) { - return ScreenWidths.Md; - } else { - return ScreenWidths.Sm; - } - }, - async isU2FSupportedAsync(): Promise { - const w = window as any; - return new Promise((resolve: (isSupported: boolean) => void) => { - if (w.u2f && !w.u2f.getApiVersion) { - // u2f object was found (Firefox with extension) - resolve(true); - } else { - // u2f object was not found. Using Google polyfill - // HACK: u2f.getApiVersion will simply not return a version if the - // U2F call fails for any reason. Because of this, we set a hard 3sec - // timeout to the request on our end. - const getApiVersionTimeoutMs = 3000; - const intervalId = setTimeout(() => { - resolve(false); - }, getApiVersionTimeoutMs); - u2f.getApiVersion((_version: number) => { - clearTimeout(intervalId); - resolve(true); - }); - } - }); - }, - // This checks the error message returned from an injected Web3 instance on the page - // after a user was prompted to sign a message or send a transaction and decided to - // reject the request. - didUserDenyWeb3Request(errMsg: string): boolean { - const metamaskDenialErrMsg = 'User denied'; - const paritySignerDenialErrMsg = 'Request has been rejected'; - const ledgerDenialErrMsg = 'Invalid status 6985'; - const isUserDeniedErrMsg = - _.includes(errMsg, metamaskDenialErrMsg) || - _.includes(errMsg, paritySignerDenialErrMsg) || - _.includes(errMsg, ledgerDenialErrMsg); - return isUserDeniedErrMsg; - }, - getAddressBeginAndEnd(address: string): string { - const truncatedAddress = `${address.substring(0, 6)}...${address.substr(-4)}`; // 0x3d5a...b287 - return truncatedAddress; - }, - getReadableAccountState(accountState: AccountState, userAddress: string): string { - switch (accountState) { - case AccountState.Loading: - return 'Loading...'; - case AccountState.Ready: - return utils.getAddressBeginAndEnd(userAddress); - case AccountState.Locked: - return 'Please Unlock'; - case AccountState.Disconnected: - return 'Connect a Wallet'; - default: - return ''; - } - }, - getAccountState( - isBlockchainReady: boolean, - providerType: ProviderType, - injectedProviderName: string, - userAddress?: string, - ): AccountState { - const isAddressAvailable = !_.isUndefined(userAddress) && !_.isEmpty(userAddress); - const isExternallyInjectedProvider = utils.isExternallyInjected(providerType, injectedProviderName); - if (!isBlockchainReady) { - return AccountState.Loading; - } else if (isAddressAvailable) { - return AccountState.Ready; - // tslint:disable-next-line: prefer-conditional-expression - } else if (isExternallyInjectedProvider) { - return AccountState.Locked; - } else { - return AccountState.Disconnected; - } - }, - hasUniqueNameAndSymbol(tokens: Token[], token: Token): boolean { - if (token.isRegistered) { - return true; // Since it's registered, it is the canonical token - } - const registeredTokens = _.filter(tokens, t => t.isRegistered); - const tokenWithSameNameIfExists = _.find(registeredTokens, { - name: token.name, - }); - const isUniqueName = _.isUndefined(tokenWithSameNameIfExists); - const tokenWithSameSymbolIfExists = _.find(registeredTokens, { - name: token.symbol, - }); - const isUniqueSymbol = _.isUndefined(tokenWithSameSymbolIfExists); - return isUniqueName && isUniqueSymbol; - }, - zeroExErrToHumanReadableErrMsg(error: ContractWrappersError | ExchangeContractErrs, takerAddress: string): string { - const ContractWrappersErrorToHumanReadableError: { [error: string]: string } = { - [BlockchainCallErrs.UserHasNoAssociatedAddresses]: 'User has no addresses available', - [OrderError.InvalidSignature]: 'Order signature is not valid', - [ContractWrappersError.ContractNotDeployedOnNetwork]: 'Contract is not deployed on the detected network', - [ContractWrappersError.InvalidJump]: 'Invalid jump occured while executing the transaction', - [ContractWrappersError.OutOfGas]: 'Transaction ran out of gas', - }; - const exchangeContractErrorToHumanReadableError: { - [error: string]: string; - } = { - [ExchangeContractErrs.OrderFillExpired]: 'This order has expired', - [ExchangeContractErrs.OrderCancelExpired]: 'This order has expired', - [ExchangeContractErrs.OrderCancelled]: 'This order has been cancelled', - [ExchangeContractErrs.OrderFillAmountZero]: "Order fill amount can't be 0", - [ExchangeContractErrs.OrderRemainingFillAmountZero]: 'This order has already been completely filled', - [ExchangeContractErrs.OrderFillRoundingError]: - 'Rounding error will occur when filling this order. Please try filling a different amount.', - [ExchangeContractErrs.InsufficientTakerBalance]: - 'Taker no longer has a sufficient balance to complete this order', - [ExchangeContractErrs.InsufficientTakerAllowance]: - 'Taker no longer has a sufficient allowance to complete this order', - [ExchangeContractErrs.InsufficientMakerBalance]: - 'Maker no longer has a sufficient balance to complete this order', - [ExchangeContractErrs.InsufficientMakerAllowance]: - 'Maker no longer has a sufficient allowance to complete this order', - [ExchangeContractErrs.InsufficientTakerFeeBalance]: 'Taker no longer has a sufficient balance to pay fees', - [ExchangeContractErrs.InsufficientTakerFeeAllowance]: - 'Taker no longer has a sufficient allowance to pay fees', - [ExchangeContractErrs.InsufficientMakerFeeBalance]: 'Maker no longer has a sufficient balance to pay fees', - [ExchangeContractErrs.InsufficientMakerFeeAllowance]: - 'Maker no longer has a sufficient allowance to pay fees', - [ExchangeContractErrs.TransactionSenderIsNotFillOrderTaker]: `This order can only be filled by ${takerAddress}`, - [ExchangeContractErrs.InsufficientRemainingFillAmount]: 'Insufficient remaining fill amount', - }; - const humanReadableErrorMsg = - exchangeContractErrorToHumanReadableError[error] || ContractWrappersErrorToHumanReadableError[error]; - return humanReadableErrorMsg; - }, - isParityNode(nodeVersion: string): boolean { - return _.includes(nodeVersion, 'Parity'); - }, - isTestRpc(nodeVersion: string): boolean { - return _.includes(nodeVersion, 'TestRPC'); - }, - isTestNetwork(networkId: number): boolean { - const isTestNetwork = _.includes( - [ - sharedConstants.NETWORK_ID_BY_NAME[Networks.Kovan], - sharedConstants.NETWORK_ID_BY_NAME[Networks.Rinkeby], - sharedConstants.NETWORK_ID_BY_NAME[Networks.Ropsten], - ], - networkId, - ); - return isTestNetwork; - }, - getCurrentBaseUrl(): string { - const port = window.location.port; - const hasPort = !_.isUndefined(port); - const baseUrl = `https://${window.location.hostname}${hasPort ? `:${port}` : ''}`; - return baseUrl; - }, - onPageLoadPromise: new Promise((resolve, _reject) => { - if (document.readyState === 'complete') { - resolve(); - return; - } - window.onload = () => resolve(); - }), - getProviderType(provider: Provider): Providers | string { - const constructorName = provider.constructor.name; - let parsedProviderName = constructorName; - // https://ethereum.stackexchange.com/questions/24266/elegant-way-to-detect-current-provider-int-web3-js - switch (constructorName) { - case 'EthereumProvider': - parsedProviderName = Providers.Mist; - break; - - default: - parsedProviderName = constructorName; - break; - } - if ((provider as any).isParity) { - parsedProviderName = Providers.Parity; - } else if ((provider as any).isMetaMask) { - parsedProviderName = Providers.Metamask; - } else if (!_.isUndefined(_.get(window, 'SOFA'))) { - parsedProviderName = Providers.CoinbaseWallet; - } else if (!_.isUndefined(_.get(window, '__CIPHER__'))) { - parsedProviderName = Providers.Cipher; - } - return parsedProviderName; - }, - getBackendBaseUrl(): string { - return utils.isDogfood() ? configs.BACKEND_BASE_STAGING_URL : configs.BACKEND_BASE_PROD_URL; - }, - isDevelopment(): boolean { - return _.includes(configs.DOMAINS_DEVELOPMENT, window.location.host); - }, - isStaging(): boolean { - return _.includes(window.location.href, configs.DOMAIN_STAGING); - }, - isExternallyInjected(providerType: ProviderType, injectedProviderName: string): boolean { - return providerType === ProviderType.Injected && injectedProviderName !== constants.PROVIDER_NAME_PUBLIC; - }, - isDogfood(): boolean { - return _.includes(window.location.href, configs.DOMAIN_DOGFOOD); - }, - isProduction(): boolean { - return _.includes(window.location.href, configs.DOMAIN_PRODUCTION); - }, - getEnvironment(): Environments { - if (utils.isDogfood()) { - return Environments.Dogfood; - } - if (utils.isDevelopment()) { - return Environments.Development; - } - if (utils.isStaging()) { - return Environments.Staging; - } - if (utils.isProduction()) { - return Environments.Production; - } - return Environments.Unknown; - }, - getEthToken(tokenByAddress: TokenByAddress): Token { - return utils.getTokenBySymbol(constants.ETHER_TOKEN_SYMBOL, tokenByAddress); - }, - getZrxToken(tokenByAddress: TokenByAddress): Token { - return utils.getTokenBySymbol(constants.ZRX_TOKEN_SYMBOL, tokenByAddress); - }, - getTokenBySymbol(symbol: string, tokenByAddress: TokenByAddress): Token { - const tokens = _.values(tokenByAddress); - const token = _.find(tokens, { symbol }); - return token; - }, - getTrackedTokens(tokenByAddress: TokenByAddress): Token[] { - const allTokens = _.values(tokenByAddress); - const trackedTokens = _.filter(allTokens, t => utils.isTokenTracked(t)); - return trackedTokens; - }, - getFormattedAmountFromToken(token: Token, tokenState: TokenState): string { - return utils.getFormattedAmount(tokenState.balance, token.decimals); - }, - format(value: BigNumber, format: string): string { - const formattedAmount = numeral(value).format(format); - if (_.isNaN(formattedAmount)) { - // https://github.com/adamwdraper/Numeral-js/issues/596 - return numeral(new BigNumber(0)).format(format); - } - return formattedAmount; - }, - getFormattedAmount(amount: BigNumber, decimals: number): string { - const unitAmount = Web3Wrapper.toUnitAmount(amount, decimals); - // if the unit amount is less than 1, show the natural number of decimal places with a max of 4 - // if the unit amount is greater than or equal to 1, show only 2 decimal places - const lessThanOnePrecision = Math.min(constants.TOKEN_AMOUNT_DISPLAY_PRECISION, unitAmount.decimalPlaces()); - const greaterThanOnePrecision = 2; - const precision = unitAmount.lt(1) ? lessThanOnePrecision : greaterThanOnePrecision; - const format = `0,0.${_.repeat('0', precision)}`; - return utils.format(unitAmount, format); - }, - getUsdValueFormattedAmount(amount: BigNumber, decimals: number, price: BigNumber): string { - const unitAmount = Web3Wrapper.toUnitAmount(amount, decimals); - const value = unitAmount.multipliedBy(price); - return utils.format(value, constants.NUMERAL_USD_FORMAT); - }, - openUrl(url: string): void { - window.open(url, '_blank'); - }, - isMobileWidth(screenWidth: ScreenWidths): boolean { - return screenWidth === ScreenWidths.Sm; - }, - isMobileOperatingSystem(): boolean { - return bowser.mobile; - }, - getBrowserType(): BrowserType { - if (bowser.chrome) { - return BrowserType.Chrome; - } else if (bowser.firefox) { - return BrowserType.Firefox; - } else if (bowser.opera) { - return BrowserType.Opera; - } else if (bowser.msedge) { - return BrowserType.Edge; - } else if (bowser.safari) { - return BrowserType.Safari; - } else { - return BrowserType.Other; - } - }, - getOperatingSystem(): OperatingSystemType { - if (bowser.android) { - return OperatingSystemType.Android; - } else if (bowser.ios) { - return OperatingSystemType.iOS; - } else if (bowser.mac) { - return OperatingSystemType.Mac; - } else if (bowser.windows) { - return OperatingSystemType.Windows; - } else if (bowser.windowsphone) { - return OperatingSystemType.WindowsPhone; - } else if (bowser.linux) { - return OperatingSystemType.Linux; - } else { - return OperatingSystemType.Other; - } - }, - isTokenTracked(token: Token): boolean { - return !_.isUndefined(token.trackedTimestamp); - }, - // Returns a [downloadLink, isOnMobile] tuple. - getBestWalletDownloadLinkAndIsMobile(): [string, boolean] { - const browserType = utils.getBrowserType(); - const isOnMobile = utils.isMobileOperatingSystem(); - const operatingSystem = utils.getOperatingSystem(); - let downloadLink; - if (isOnMobile) { - switch (operatingSystem) { - case OperatingSystemType.Android: - downloadLink = constants.URL_COINBASE_WALLET_ANDROID_APP_STORE; - break; - case OperatingSystemType.iOS: - downloadLink = constants.URL_COINBASE_WALLET_IOS_APP_STORE; - break; - default: - // Coinbase wallet is only supported on these mobile OSes - just default to iOS - downloadLink = constants.URL_COINBASE_WALLET_IOS_APP_STORE; - } - } else { - switch (browserType) { - case BrowserType.Chrome: - downloadLink = constants.URL_METAMASK_CHROME_STORE; - break; - case BrowserType.Firefox: - downloadLink = constants.URL_METAMASK_FIREFOX_STORE; - break; - case BrowserType.Opera: - downloadLink = constants.URL_METAMASK_OPERA_STORE; - break; - default: - downloadLink = constants.URL_METAMASK_HOMEPAGE; - } - } - return [downloadLink, isOnMobile]; - }, - getTokenIconUrl(symbol: string): string { - const result = `/images/token_icons/${symbol}.png`; - return result; - }, -}; -- cgit v1.2.3