aboutsummaryrefslogtreecommitdiffstats
path: root/packages/website/ts/utils
diff options
context:
space:
mode:
Diffstat (limited to 'packages/website/ts/utils')
-rw-r--r--packages/website/ts/utils/analytics.ts89
-rw-r--r--packages/website/ts/utils/backend_client.ts61
-rw-r--r--packages/website/ts/utils/configs.ts49
-rw-r--r--packages/website/ts/utils/constants.ts130
-rw-r--r--packages/website/ts/utils/doc_utils.ts85
-rw-r--r--packages/website/ts/utils/documentation_container.ts35
-rw-r--r--packages/website/ts/utils/error_reporter.ts54
-rw-r--r--packages/website/ts/utils/fake_token_registry.ts879
-rw-r--r--packages/website/ts/utils/fetch_utils.ts48
-rw-r--r--packages/website/ts/utils/mui_theme.ts32
-rw-r--r--packages/website/ts/utils/order_parser.ts50
-rw-r--r--packages/website/ts/utils/token_address_overrides.ts24
-rw-r--r--packages/website/ts/utils/translate.ts101
-rw-r--r--packages/website/ts/utils/utils.ts483
14 files changed, 0 insertions, 2120 deletions
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<string | number>): void;
- resetIdentity(): void;
- addUserProperties(properties: ObjectMap<string | number>): void;
- addEventProperties(properties: ObjectMap<string | number>): 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<string | number>): void {
- this._heapLoadedGuardAsync(() => this._heap.track(eventName, eventProperties));
- }
- public resetIdentity(): void {
- this._heapLoadedGuardAsync(() => this._heap.resetIdentity());
- }
- public addUserProperties(properties: ObjectMap<string | number>): void {
- this._heapLoadedGuardAsync(() => this._heap.addUserProperties(properties));
- }
- public addEventProperties(properties: ObjectMap<string | number>): 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<void> {
- 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<WebsiteBackendGasInfo> {
- const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), ETH_GAS_STATION_ENDPOINT);
- return result;
- },
- async getJobInfosAsync(): Promise<WebsiteBackendJobInfo[]> {
- const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), JOBS_ENDPOINT);
- return result;
- },
- async getPriceInfoAsync(tokenSymbols: string[]): Promise<WebsiteBackendPriceInfo> {
- 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<WebsiteBackendRelayerInfo[]> {
- const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), RELAYERS_ENDPOINT);
- return result;
- },
- async getTokenInfosAsync(): Promise<WebsiteBackendTokenInfo[]> {
- const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), TOKENS_ENDPOINT);
- return result;
- },
- async getWikiArticlesBySectionAsync(): Promise<ArticlesBySection> {
- const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), WIKI_ENDPOINT);
- return result;
- },
- async subscribeToNewsletterAsync(email: string): Promise<Response> {
- 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 03c1a0b83..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',
- 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<VersionToFilePath> {
- 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<string[]> {
- 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:
- * <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
- * <Name>staging-doc-jsons</Name>
- * <Prefix/>
- * <Marker/>
- * <MaxKeys>1000</MaxKeys>
- * <IsTruncated>false</IsTruncated>
- * <Contents>
- * <Key>0xjs/</Key>
- * <LastModified>2018-03-16T13:17:46.000Z</LastModified>
- * <ETag>"d41d8cd98f00b204e9800998ecf8427e"</ETag>
- * <Size>0</Size>
- * <StorageClass>STANDARD</StorageClass>
- * </Contents>
- * <Contents>
- * <Key>0xjs/v0.1.0.json</Key>
- * <LastModified>2018-03-16T13:18:23.000Z</LastModified>
- * <ETag>"b4f7f74913aab4a5ad1e6a58fcb3b274"</ETag>
- * <Size>1039050</Size>
- * <StorageClass>STANDARD</StorageClass>
- * </Contents>
- */
- 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<GeneratedDocJson | DocAgnosticFormat> {
- 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<State>): 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<any> {
- 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<Response> {
- 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<ObjectMap<string>>;
-
-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<NodeJS.Timer> {
- return new Promise<NodeJS.Timer>(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<boolean> {
- 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<void>((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;
- },
-};