- Thank you for testing out the new MyCrypto desktop app. This is an early release to be
- tested by the community before a full launch. We recommend continuing to use the
- production site for large or otherwise important transactions.
-
-
- Because this is for testing purposes only,{' '}
- this build of the app will only be accessible until {expDate}. You’ll
- then be required to update the application to continue using it.
-
-
- Feedback and bug reports are greatly appreciated. You can file issues on our{' '}
-
- GitHub repository
- {' '}
- or join our Discord server to discuss the
- app.
-
- To ensure the safety of your funds, we are expiring alpha builds one month after release and
- requiring users to update. All you have to do is download a new build from our GitHub, and
- you can continue to use the app. Sorry for the hassle!
-
diff --git a/common/components/TXMetaDataPanel/components/SimpleGas.tsx b/common/components/TXMetaDataPanel/components/SimpleGas.tsx
index 02b407ac107..79fa10bbca7 100644
--- a/common/components/TXMetaDataPanel/components/SimpleGas.tsx
+++ b/common/components/TXMetaDataPanel/components/SimpleGas.tsx
@@ -76,6 +76,16 @@ class SimpleGas extends React.Component {
min: gasEstimates ? gasEstimates.safeLow : gasPriceDefaults.min
};
+ /**
+ * @desc On retrieval of gas estimates,
+ * the current gas price may be lower than the lowest recommended price.
+ * `rc-slider` will force the onChange if the value is too low, so we
+ * ensure it at least passes the lower boundary.
+ * When this occurs, the logic in `UNSAFE_componentWillReceiveProps` fires,
+ * and it cannot happen again from that point forward.
+ */
+ const actualGasPrice = Math.max(this.getGasPriceGwei(gasPrice.value), bounds.min);
+
return (
@@ -103,7 +113,7 @@ class SimpleGas extends React.Component {
min={bounds.min}
max={bounds.max}
step={bounds.min < 1 ? 0.1 : 1}
- value={this.getGasPriceGwei(gasPrice.value)}
+ value={actualGasPrice}
tipFormatter={this.formatTooltip}
disabled={isGasEstimating}
/>
diff --git a/common/components/index.ts b/common/components/index.ts
index 013e66452bd..688f845f1fb 100644
--- a/common/components/index.ts
+++ b/common/components/index.ts
@@ -24,4 +24,3 @@ export { default as ParityQrSigner } from './ParityQrSigner';
export { default as ElectronNav } from './ElectronNav';
export { default as AddressBookTable } from './AddressBookTable';
export { default as Errorable } from './Errorable';
-export { default as AppAlphaNotice } from './AppAlphaNotice';
diff --git a/common/components/ui/Dropdown.tsx b/common/components/ui/Dropdown.tsx
index b68774de4aa..825116caec6 100644
--- a/common/components/ui/Dropdown.tsx
+++ b/common/components/ui/Dropdown.tsx
@@ -9,7 +9,7 @@ interface Props extends ReactSelectProps {
export default class Dropdown extends React.Component {
public state = {
- selectedOption: { value: '', label: '' },
+ selectedOption: { value: undefined, label: '' },
hasBlurred: false
};
@@ -43,13 +43,13 @@ export default class Dropdown extends React.Component {
});
}
}}
+ {...this.props}
className={`${this.props.className} ${this.state.hasBlurred ? 'has-blurred' : ''}`}
value={value}
onChange={obj => {
this.handleChange(obj as any);
- onChange();
+ onChange(obj as any);
}}
- {...this.props}
onBlur={e => {
this.setState({ hasBlurred: true });
if (this.props && this.props.onBlur) {
diff --git a/common/components/ui/SwapDropdown.tsx b/common/components/ui/SwapDropdown.tsx
index b044ac658ec..94aa1b8ee69 100644
--- a/common/components/ui/SwapDropdown.tsx
+++ b/common/components/ui/SwapDropdown.tsx
@@ -87,7 +87,7 @@ class SwapDropdown extends PureComponent {
key={opt.name}
option={opt}
isMain={false}
- isDisabled={opt.name === disabledOption}
+ isDisabled={opt.name === disabledOption || opt.status === 'unavailable'}
onChange={this.handleChange}
/>
))}
@@ -140,6 +140,23 @@ class SwapDropdown extends PureComponent {
(opt1, opt2) => (opt1.id.toLowerCase() > opt2.id.toLowerCase() ? 1 : -1)
);
+ // Sort unavailable options last
+ otherOptions = otherOptions.sort((opt1, opt2) => {
+ if (opt1.status === 'available' && opt2.status === 'unavailable') {
+ return -1;
+ }
+
+ if (opt1.status === 'available' && opt2.status === 'available') {
+ return 0;
+ }
+
+ if (opt1.status === 'unavailable' && opt2.status === 'available') {
+ return 1;
+ }
+
+ return 0;
+ });
+
this.setState({ mainOptions, otherOptions });
}
}
diff --git a/common/components/ui/Warning.scss b/common/components/ui/Warning.scss
new file mode 100644
index 00000000000..83f6a420c90
--- /dev/null
+++ b/common/components/ui/Warning.scss
@@ -0,0 +1,35 @@
+@import 'common/sass/variables';
+@import 'common/sass/mixins';
+
+.Warning {
+ display: flex;
+ align-items: center;
+ border-top: 2px solid $brand-danger;
+ padding: $space-sm;
+ font-size: $font-size-base;
+ line-height: 1.5;
+ font-weight: 500;
+ box-shadow: 0 1px 1px 1px rgba(#000, 0.12);
+ margin-bottom: $space;
+
+ &.highlighted {
+ background-color: lighten($brand-danger, 30%);
+ }
+
+ &-icon {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ width: 32px;
+ margin-left: $space * 0.4;
+ margin-right: $space * 0.8;
+ text-align: center;
+ font-size: 32px;
+ color: $brand-danger;
+ }
+ &-content {
+ display: flex;
+ flex-direction: column;
+ padding: 0 $space;
+ }
+}
diff --git a/common/components/ui/Warning.tsx b/common/components/ui/Warning.tsx
new file mode 100644
index 00000000000..c0c0c10c8dc
--- /dev/null
+++ b/common/components/ui/Warning.tsx
@@ -0,0 +1,22 @@
+import React from 'react';
+
+import './Warning.scss';
+
+interface WarningProps {
+ highlighted?: boolean;
+}
+
+const Warning: React.SFC = ({ highlighted, children }) => {
+ const className = `Warning ${highlighted ? 'highlighted' : ''}`;
+
+ return (
+
+
+
+
+ {children}
+
+ );
+};
+
+export default Warning;
diff --git a/common/components/ui/index.ts b/common/components/ui/index.ts
index 602e8cb50c0..8f0a4ce5dc2 100644
--- a/common/components/ui/index.ts
+++ b/common/components/ui/index.ts
@@ -16,5 +16,6 @@ export { default as TextArea } from './TextArea';
export { default as Address } from './Address';
export { default as CodeBlock } from './CodeBlock';
export { default as Toggle } from './Toggle';
+export { default as Warning } from './Warning';
export * from './Expandable';
export * from './InlineSpinner';
diff --git a/common/config/bity.ts b/common/config/bity.ts
index cdb9ce2192c..1ff1e6e4740 100644
--- a/common/config/bity.ts
+++ b/common/config/bity.ts
@@ -1,6 +1,6 @@
import { BTCTxExplorer, ETHTxExplorer } from './data';
-export type WhitelistedCoins = 'BTC' | 'REP' | 'ETH';
+export type WhitelistedCoins = 'BTC' | 'REP' | 'ETH' | 'XMR';
const serverURL = 'https://bity.myetherapi.com';
const bityURL = 'https://bity.com/api';
const BTCMin = 0.01;
@@ -11,7 +11,8 @@ const BTCMax = 3;
// value = percent higher/lower than 0.01 BTC worth
const buffers = {
ETH: 0.1,
- REP: 0.2
+ REP: 0.2,
+ XMR: 0.3
};
// rate must be BTC[KIND]
diff --git a/common/config/data.tsx b/common/config/data.tsx
index 01fa50aea43..aa9820feb5b 100644
--- a/common/config/data.tsx
+++ b/common/config/data.tsx
@@ -12,12 +12,6 @@ export const discordURL = 'https://discord.gg/VSaTXEA';
export const VERSION = packageJson.version;
export const N_FACTOR = 8192;
-// Bricks the app once this date has been exceeded. Remember to update these 2
-// whenever making a new app release.
-// It is currently set to: Wednesday, July 25, 2018 12:00:00 AM (GMT)
-// TODO: Remove me once app alpha / release candidates are done
-export const APP_ALPHA_EXPIRATION = 1532476800000;
-
// Displays at the top of the site, make message empty string to remove.
// Type can be primary, warning, danger, success, info, or blank for grey.
// Message must be a JSX element if you want to use HTML.
@@ -44,7 +38,9 @@ export const etherChainExplorerInst = makeExplorer({
export const donationAddressMap = {
BTC: '32oirLEzZRhi33RCXDF9WHJjEb8RsrSss3',
ETH: '0x4bbeEB066eD09B7AEd07bF39EEe0460DFa261520',
- REP: '0x4bbeEB066eD09B7AEd07bF39EEe0460DFa261520'
+ REP: '0x4bbeEB066eD09B7AEd07bF39EEe0460DFa261520',
+ XMR:
+ '4GdoN7NCTi8a5gZug7PrwZNKjvHFmKeV11L6pNJPgj5QNEHsN6eeX3DaAQFwZ1ufD4LYCZKArktt113W7QjWvQ7CW7F7tDFvS511SNfZV7'
};
export const gasEstimateCacheTime = 60000;
diff --git a/common/config/tokens/eth.json b/common/config/tokens/eth.json
index fda4da48003..c486f72a845 100644
--- a/common/config/tokens/eth.json
+++ b/common/config/tokens/eth.json
@@ -3328,5 +3328,32 @@
"address": "0xAc709FcB44a43c35F0DA4e3163b117A17F3770f5",
"symbol": "ARC",
"decimal": 18
+ },
+
+
+ {
+ "address": "0xDF2C7238198Ad8B389666574f2d8bc411A4b7428",
+ "symbol": "MFT",
+ "decimal": 18
+ },
+ {
+ "address": "0xc92d6e3e64302c59d734f3292e2a13a13d7e1817",
+ "symbol": "FXC",
+ "decimal": 8
+ },
+ {
+ "address": "0x4f3afec4e5a3f2a6a1a411def7d7dfe50ee057bf",
+ "symbol": "DGX 2.0",
+ "decimal": 9
+ },
+ {
+ "address": "0xd9a12cde03a86e800496469858de8581d3a5353d",
+ "symbol": "YUP",
+ "decimal": 18
+ },
+ {
+ "address": "0x6aEDbF8dFF31437220dF351950Ba2a3362168d1b",
+ "symbol": "DGS",
+ "decimal": 8
}
-]
\ No newline at end of file
+]
diff --git a/common/containers/OnboardModal/components/WelcomeSlide.scss b/common/containers/OnboardModal/components/WelcomeSlide.scss
deleted file mode 100644
index 724c01cd177..00000000000
--- a/common/containers/OnboardModal/components/WelcomeSlide.scss
+++ /dev/null
@@ -1,27 +0,0 @@
-@import 'common/sass/variables';
-@import 'common/sass/mixins';
-
-.WelcomeSlide {
- &-alert {
- display: flex;
- border-top: 2px solid color(brand-danger);
- padding: $space-sm;
- font-size: $font-size-base;
- line-height: 1.5;
- font-weight: 500;
- box-shadow: 0 1px 1px 1px rgba(#000, 0.12);
- margin-bottom: $space;
-
- &-icon {
- display: flex;
- flex-direction: column;
- justify-content: center;
- width: 32px;
- margin-left: $space * 0.4;
- margin-right: $space * 0.8;
- text-align: center;
- font-size: 32px;
- color: color(brand-danger);
- }
- }
-}
diff --git a/common/containers/OnboardModal/components/WelcomeSlide.tsx b/common/containers/OnboardModal/components/WelcomeSlide.tsx
index 31df841b174..cd2afd33792 100644
--- a/common/containers/OnboardModal/components/WelcomeSlide.tsx
+++ b/common/containers/OnboardModal/components/WelcomeSlide.tsx
@@ -2,31 +2,20 @@ import React from 'react';
import translate from 'translations';
import onboardIconOne from 'assets/images/onboarding/slide-01.svg';
+import { Warning } from 'components/ui';
import OnboardSlide from './OnboardSlide';
-import './WelcomeSlide.scss';
-
const WelcomeSlide = () => {
const header = translate('ONBOARD_WELCOME_TITLE');
const subheader = {translate('ONBOARD_WELCOME_CONTENT__3')};
const content = (