mirror of
https://github.com/trezor/trezor-wallet
synced 2024-12-23 23:48:07 +00:00
Merge branch 'master' of github.com:satoshilabs/trezor-wallet
This commit is contained in:
commit
d1eadc8033
@ -1,9 +1,9 @@
|
||||
{
|
||||
"coins": [
|
||||
"networks": [
|
||||
{
|
||||
"name": "Ethereum",
|
||||
"symbol": "ETH",
|
||||
"network": "eth",
|
||||
"shortcut": "eth",
|
||||
"bip44": "m/44'/60'/0'/0",
|
||||
"chainId": 1,
|
||||
"defaultGasPrice": 64,
|
||||
@ -21,7 +21,7 @@
|
||||
{
|
||||
"name": "Ethereum Classic",
|
||||
"symbol": "ETC",
|
||||
"network": "etc",
|
||||
"shortcut": "etc",
|
||||
"chainId": 61,
|
||||
"bip44": "m/44'/61'/0'/0",
|
||||
"defaultGasPrice": 64,
|
||||
@ -39,7 +39,7 @@
|
||||
{
|
||||
"name": "Ethereum Ropsten",
|
||||
"symbol": "tROP",
|
||||
"network": "trop",
|
||||
"shortcut": "trop",
|
||||
"chainId": 3,
|
||||
"bip44": "m/44'/60'/0'/0",
|
||||
"defaultGasPrice": 64,
|
||||
|
@ -16,5 +16,11 @@
|
||||
"name": "Trezor13",
|
||||
"symbol": "T013",
|
||||
"decimals": 13
|
||||
},
|
||||
{
|
||||
"address": "0x58cda554935e4a1f2acbe15f8757400af275e084",
|
||||
"name": "LahodCoin",
|
||||
"symbol": "LAHOD",
|
||||
"decimals": 13
|
||||
}
|
||||
]
|
@ -92,7 +92,7 @@ const start = (device: TrezorDevice, network: string, ignoreCompleted?: boolean)
|
||||
return;
|
||||
}
|
||||
|
||||
const blockchain = getState().blockchain.find(b => b.name === network);
|
||||
const blockchain = getState().blockchain.find(b => b.shortcut === network);
|
||||
if (blockchain && !blockchain.connected && (!discoveryProcess || !discoveryProcess.completed)) {
|
||||
dispatch({
|
||||
type: DISCOVERY.WAITING_FOR_BLOCKCHAIN,
|
||||
@ -124,8 +124,8 @@ const start = (device: TrezorDevice, network: string, ignoreCompleted?: boolean)
|
||||
// start discovery process
|
||||
const begin = (device: TrezorDevice, network: string): AsyncAction => async (dispatch: Dispatch, getState: GetState): Promise<void> => {
|
||||
const { config } = getState().localStorage;
|
||||
const coinToDiscover = config.coins.find(c => c.network === network);
|
||||
if (!coinToDiscover) return;
|
||||
const networkData = config.networks.find(c => c.shortcut === network);
|
||||
if (!networkData) return;
|
||||
|
||||
dispatch({
|
||||
type: DISCOVERY.WAITING_FOR_DEVICE,
|
||||
@ -140,7 +140,7 @@ const begin = (device: TrezorDevice, network: string): AsyncAction => async (dis
|
||||
instance: device.instance,
|
||||
state: device.state,
|
||||
},
|
||||
path: coinToDiscover.bip44,
|
||||
path: networkData.bip44,
|
||||
keepSession: true, // acquire and hold session
|
||||
//useEmptyPassphrase: !device.instance,
|
||||
useEmptyPassphrase: device.useEmptyPassphrase,
|
||||
@ -179,7 +179,7 @@ const begin = (device: TrezorDevice, network: string): AsyncAction => async (dis
|
||||
// send data to reducer
|
||||
dispatch({
|
||||
type: DISCOVERY.START,
|
||||
network: coinToDiscover.network,
|
||||
network,
|
||||
device,
|
||||
publicKey: response.payload.publicKey,
|
||||
chainCode: response.payload.chainCode,
|
||||
|
@ -13,7 +13,7 @@ import * as buildUtils from 'utils/build';
|
||||
import type {
|
||||
ThunkAction, AsyncAction, /* GetState, */ Dispatch,
|
||||
} from 'flowtype';
|
||||
import type { Config, Coin, TokensCollection } from 'reducers/LocalStorageReducer';
|
||||
import type { Config, Network, TokensCollection } from 'reducers/LocalStorageReducer';
|
||||
|
||||
import Erc20AbiJSON from 'public/data/ERC20Abi.json';
|
||||
import AppConfigJSON from 'public/data/appConfig.json';
|
||||
@ -99,8 +99,8 @@ export function loadTokensFromJSON(): AsyncAction {
|
||||
const config: Config = await httpRequest(AppConfigJSON, 'json');
|
||||
|
||||
if (!buildUtils.isDev()) {
|
||||
const index = config.coins.findIndex(c => c.network === 'trop');
|
||||
delete config.coins[index];
|
||||
const index = config.networks.findIndex(c => c.shortcut === 'trop');
|
||||
delete config.networks[index];
|
||||
}
|
||||
|
||||
const ERC20Abi = await httpRequest(Erc20AbiJSON, 'json');
|
||||
@ -117,10 +117,10 @@ export function loadTokensFromJSON(): AsyncAction {
|
||||
}
|
||||
|
||||
// load tokens
|
||||
const tokens = await config.coins.reduce(async (promise: Promise<TokensCollection>, coin: Coin): Promise<TokensCollection> => {
|
||||
const tokens = await config.networks.reduce(async (promise: Promise<TokensCollection>, network: Network): Promise<TokensCollection> => {
|
||||
const collection: TokensCollection = await promise;
|
||||
const json = await httpRequest(coin.tokens, 'json');
|
||||
collection[coin.network] = json;
|
||||
const json = await httpRequest(network.tokens, 'json');
|
||||
collection[network.shortcut] = json;
|
||||
return collection;
|
||||
}, Promise.resolve({}));
|
||||
|
||||
@ -195,41 +195,6 @@ export const loadData = (): ThunkAction => (dispatch: Dispatch): void => {
|
||||
dispatch(loadTokensFromJSON());
|
||||
};
|
||||
|
||||
// const parseConfig = (json: JSON): Config => {
|
||||
|
||||
// if (json['coins']) {
|
||||
|
||||
// }
|
||||
|
||||
// for (let key in json) {
|
||||
// if (key === 'coins') {
|
||||
|
||||
// }
|
||||
// }
|
||||
|
||||
// const coins: Array<Object> = json.coins || [];
|
||||
|
||||
// if ("coins" in json){
|
||||
// json.coins
|
||||
// }
|
||||
// if (!json.hasOwnProperty("fiatValueTickers")) throw new Error(`Property "fiatValueTickers" is missing in appConfig.json`);
|
||||
// if (json.config && json.hasOwnProperty('coins') && Array.isArray(json.coins)) {
|
||||
// json.coins.map(c => {
|
||||
// return {
|
||||
|
||||
// }
|
||||
// })
|
||||
// } else {
|
||||
// throw new Error(`Property "coins" is missing in appConfig.json`);
|
||||
// }
|
||||
|
||||
|
||||
// return {
|
||||
// coins: [],
|
||||
// fiatValueTickers: []
|
||||
// }
|
||||
// }
|
||||
|
||||
export const save = (key: string, value: string): ThunkAction => (): void => {
|
||||
if (typeof window.localStorage !== 'undefined') {
|
||||
try {
|
||||
|
@ -71,8 +71,8 @@ export const paramsValidation = (params: RouterLocationState): PayloadAction<boo
|
||||
// validate requested network
|
||||
if (params.hasOwnProperty('network')) {
|
||||
const { config } = getState().localStorage;
|
||||
const coin = config.coins.find(c => c.network === params.network);
|
||||
if (!coin) return false;
|
||||
const network = config.networks.find(c => c.shortcut === params.network);
|
||||
if (!network) return false;
|
||||
if (!params.account) return false;
|
||||
}
|
||||
|
||||
|
@ -63,7 +63,7 @@ const getAccountStatus = (state: State, selectedAccount: SelectedAccountState):
|
||||
};
|
||||
}
|
||||
|
||||
const blockchain = state.blockchain.find(b => b.name === network.network);
|
||||
const blockchain = state.blockchain.find(b => b.shortcut === network.shortcut);
|
||||
if (blockchain && !blockchain.connected) {
|
||||
return {
|
||||
type: 'backend',
|
||||
|
@ -130,7 +130,7 @@ export const init = (): AsyncAction => async (dispatch: Dispatch, getState: GetS
|
||||
return;
|
||||
}
|
||||
|
||||
const gasPrice: BigNumber = await dispatch(BlockchainActions.getGasPrice(network.network, network.defaultGasPrice));
|
||||
const gasPrice: BigNumber = await dispatch(BlockchainActions.getGasPrice(network.shortcut, network.defaultGasPrice));
|
||||
const gasLimit = network.defaultGasLimit.toString();
|
||||
const feeLevels = ValidationActions.getFeeLevels(network.symbol, gasPrice, gasLimit);
|
||||
const selectedFeeLevel = ValidationActions.getSelectedFeeLevel(feeLevels, initialState.selectedFeeLevel);
|
||||
@ -139,7 +139,7 @@ export const init = (): AsyncAction => async (dispatch: Dispatch, getState: GetS
|
||||
type: SEND.INIT,
|
||||
state: {
|
||||
...initialState,
|
||||
networkName: network.network,
|
||||
networkName: network.shortcut,
|
||||
networkSymbol: network.symbol,
|
||||
currency: network.symbol,
|
||||
feeLevels,
|
||||
@ -411,7 +411,7 @@ const estimateGasPrice = (): AsyncAction => async (dispatch: Dispatch, getState:
|
||||
return;
|
||||
}
|
||||
|
||||
const gasLimit = await dispatch(BlockchainActions.estimateGasLimit(network.network, state.data, state.amount, state.gasPrice));
|
||||
const gasLimit = await dispatch(BlockchainActions.estimateGasLimit(network.shortcut, state.data, state.amount, state.gasPrice));
|
||||
|
||||
// double check "data" field
|
||||
// possible race condition when data changed before backend respond
|
||||
@ -439,7 +439,7 @@ export const onSend = (): AsyncAction => async (dispatch: Dispatch, getState: Ge
|
||||
const nonce = pendingNonce > 0 && pendingNonce >= account.nonce ? pendingNonce : account.nonce;
|
||||
|
||||
const txData = await dispatch(prepareEthereumTx({
|
||||
network: network.network,
|
||||
network: network.shortcut,
|
||||
token: isToken ? findToken(getState().tokens, account.address, currentState.currency, account.deviceState) : null,
|
||||
from: account.address,
|
||||
to: currentState.address,
|
||||
@ -487,7 +487,7 @@ export const onSend = (): AsyncAction => async (dispatch: Dispatch, getState: Ge
|
||||
const serializedTx: string = await dispatch(serializeEthereumTx(txData));
|
||||
const push = await TrezorConnect.pushTransaction({
|
||||
tx: serializedTx,
|
||||
coin: network.network,
|
||||
coin: network.shortcut,
|
||||
});
|
||||
|
||||
if (!push.success) {
|
||||
|
@ -174,7 +174,7 @@ export const addressLabel = ($state: State): PayloadAction<State> => (dispatch:
|
||||
const savedAccounts = getState().accounts.filter(a => a.address.toLowerCase() === address.toLowerCase());
|
||||
if (savedAccounts.length > 0) {
|
||||
// check if found account belongs to this network
|
||||
const currentNetworkAccount = savedAccounts.find(a => a.network === network.network);
|
||||
const currentNetworkAccount = savedAccounts.find(a => a.network === network.shortcut);
|
||||
if (currentNetworkAccount) {
|
||||
const device = findDevice(getState().devices, currentNetworkAccount.deviceID, currentNetworkAccount.deviceState);
|
||||
if (device) {
|
||||
@ -184,8 +184,8 @@ export const addressLabel = ($state: State): PayloadAction<State> => (dispatch:
|
||||
// corner-case: the same derivation path is used on different networks
|
||||
const otherNetworkAccount = savedAccounts[0];
|
||||
const device = findDevice(getState().devices, otherNetworkAccount.deviceID, otherNetworkAccount.deviceState);
|
||||
const { coins } = getState().localStorage.config;
|
||||
const otherNetwork = coins.find(c => c.network === otherNetworkAccount.network);
|
||||
const { networks } = getState().localStorage.config;
|
||||
const otherNetwork = networks.find(c => c.shortcut === otherNetworkAccount.network);
|
||||
if (device && otherNetwork) {
|
||||
state.warnings.address = `Looks like it's ${device.instanceLabel} Account #${(otherNetworkAccount.index + 1)} address of ${otherNetwork.name} network`;
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ export type TrezorConnectAction = {
|
||||
type: typeof CONNECT.INITIALIZATION_ERROR,
|
||||
error: string
|
||||
} | {
|
||||
type: typeof CONNECT.COIN_CHANGED,
|
||||
type: typeof CONNECT.NETWORK_CHANGED,
|
||||
payload: {
|
||||
network: string
|
||||
}
|
||||
|
@ -57,15 +57,15 @@ export const initWeb3 = (network: string, urlIndex: number = 0): PromiseAction<W
|
||||
// requested web3 wasn't initialized or is disconnected
|
||||
// initialize again
|
||||
const { config, ERC20Abi } = getState().localStorage;
|
||||
const coin = config.coins.find(c => c.network === network);
|
||||
if (!coin) {
|
||||
// coin not found
|
||||
const networkData = config.networks.find(c => c.shortcut === network);
|
||||
if (!networkData) {
|
||||
// network not found
|
||||
reject(new Error(`Network ${network} not found in application config.`));
|
||||
return;
|
||||
}
|
||||
|
||||
// get first url
|
||||
const url = coin.web3[urlIndex];
|
||||
const url = networkData.web3[urlIndex];
|
||||
if (!url) {
|
||||
reject(new Error('Web3 backend is not responding'));
|
||||
return;
|
||||
@ -80,7 +80,7 @@ export const initWeb3 = (network: string, urlIndex: number = 0): PromiseAction<W
|
||||
const newInstance = {
|
||||
network,
|
||||
web3,
|
||||
chainId: coin.chainId,
|
||||
chainId: networkData.chainId,
|
||||
erc20: new web3.eth.Contract(ERC20Abi),
|
||||
latestBlock,
|
||||
gasPrice,
|
||||
|
@ -10,7 +10,7 @@ export const INITIALIZATION_ERROR: 'connect__init_error' = 'connect__init_error'
|
||||
|
||||
export const DEVICE_FROM_STORAGE: 'connect__device_from_storage' = 'connect__device_from_storage';
|
||||
export const AUTH_DEVICE: 'connect__auth_device' = 'connect__auth_device';
|
||||
export const COIN_CHANGED: 'connect__coin_changed' = 'connect__coin_changed';
|
||||
export const NETWORK_CHANGED: 'connect__network_changed' = 'connect__network_changed';
|
||||
|
||||
export const REMEMBER_REQUEST: 'connect__remember_request' = 'connect__remember_request';
|
||||
export const FORGET_REQUEST: 'connect__forget_request' = 'connect__forget_request';
|
||||
|
@ -19,32 +19,21 @@ class CoinLogo extends PureComponent {
|
||||
this.longIcons = ['etc', 'eth', 'trop'];
|
||||
}
|
||||
|
||||
getIcon() {
|
||||
const { coinNetwork, coinId } = this.props;
|
||||
let coinImgName = coinNetwork;
|
||||
if (coinImgName === 'ethereum') {
|
||||
coinImgName = 'eth';
|
||||
} else if (coinImgName === 'ethereum-classic') {
|
||||
coinImgName = 'etc';
|
||||
}
|
||||
return coinImgName || coinId;
|
||||
}
|
||||
|
||||
hasLongIcon(coinImgName) {
|
||||
hasLongIcon(network) {
|
||||
let hasLongIcon = false;
|
||||
if (this.longIcons.includes(coinImgName)) {
|
||||
if (this.longIcons.includes(network)) {
|
||||
hasLongIcon = true;
|
||||
}
|
||||
return hasLongIcon;
|
||||
}
|
||||
|
||||
render() {
|
||||
const iconName = this.getIcon();
|
||||
const { network } = this.props;
|
||||
return (
|
||||
<Wrapper>
|
||||
<Logo
|
||||
hasLongIcon={this.hasLongIcon(iconName)}
|
||||
src={require(`./images/${iconName}.png`)} // eslint-disable-line
|
||||
hasLongIcon={this.hasLongIcon(network)}
|
||||
src={require(`./images/${network}.png`)} // eslint-disable-line
|
||||
/>
|
||||
</Wrapper>
|
||||
);
|
||||
@ -52,8 +41,7 @@ class CoinLogo extends PureComponent {
|
||||
}
|
||||
|
||||
CoinLogo.propTypes = {
|
||||
coinId: PropTypes.string,
|
||||
coinNetwork: PropTypes.string,
|
||||
network: PropTypes.string,
|
||||
};
|
||||
|
||||
export default CoinLogo;
|
||||
|
@ -20,7 +20,7 @@ export default (props: Props) => {
|
||||
[{
|
||||
label: 'Connect',
|
||||
callback: async () => {
|
||||
await props.blockchainReconnect(network.network);
|
||||
await props.blockchainReconnect(network.shortcut);
|
||||
},
|
||||
}]
|
||||
}
|
||||
|
@ -150,7 +150,7 @@ export type Action =
|
||||
export type State = ReducersState;
|
||||
|
||||
// reexport reduces types
|
||||
export type { Coin } from 'reducers/LocalStorageReducer';
|
||||
export type { Network } from 'reducers/LocalStorageReducer';
|
||||
export type { Account } from 'reducers/AccountsReducer';
|
||||
export type { Discovery } from 'reducers/DiscoveryReducer';
|
||||
export type { Token } from 'reducers/TokensReducer';
|
||||
|
@ -5,7 +5,7 @@ import { BLOCKCHAIN } from 'trezor-connect';
|
||||
import type { Action } from 'flowtype';
|
||||
|
||||
export type BlockchainNetwork = {
|
||||
+name: string;
|
||||
+shortcut: string;
|
||||
connected: boolean;
|
||||
}
|
||||
|
||||
@ -13,16 +13,16 @@ export type State = Array<BlockchainNetwork>;
|
||||
|
||||
export const initialState: State = [];
|
||||
|
||||
const find = (state: State, name: string): number => state.findIndex(b => b.name === name);
|
||||
const find = (state: State, shortcut: string): number => state.findIndex(b => b.shortcut === shortcut);
|
||||
|
||||
const connect = (state: State, action: any): State => {
|
||||
const name = action.payload.coin.shortcut.toLowerCase();
|
||||
const shortcut = action.payload.coin.shortcut.toLowerCase();
|
||||
const network: BlockchainNetwork = {
|
||||
name,
|
||||
shortcut,
|
||||
connected: true,
|
||||
};
|
||||
const newState: State = [...state];
|
||||
const index: number = find(newState, name);
|
||||
const index: number = find(newState, shortcut);
|
||||
if (index >= 0) {
|
||||
newState[index] = network;
|
||||
} else {
|
||||
@ -32,13 +32,13 @@ const connect = (state: State, action: any): State => {
|
||||
};
|
||||
|
||||
const disconnect = (state: State, action: any): State => {
|
||||
const name = action.payload.coin.shortcut.toLowerCase();
|
||||
const shortcut = action.payload.coin.shortcut.toLowerCase();
|
||||
const network: BlockchainNetwork = {
|
||||
name,
|
||||
shortcut,
|
||||
connected: false,
|
||||
};
|
||||
const newState: State = [...state];
|
||||
const index: number = find(newState, name);
|
||||
const index: number = find(newState, shortcut);
|
||||
if (index >= 0) {
|
||||
newState[index] = network;
|
||||
} else {
|
||||
|
@ -5,9 +5,9 @@ import * as STORAGE from 'actions/constants/localStorage';
|
||||
|
||||
import type { Action } from 'flowtype';
|
||||
|
||||
export type Coin = {
|
||||
export type Network = {
|
||||
name: string;
|
||||
network: string;
|
||||
shortcut: string;
|
||||
symbol: string;
|
||||
bip44: string;
|
||||
defaultGasLimit: number;
|
||||
@ -57,40 +57,27 @@ export type FiatValueTicker = {
|
||||
}
|
||||
|
||||
export type Config = {
|
||||
coins: Array<Coin>;
|
||||
networks: Array<Network>;
|
||||
fiatValueTickers: Array<FiatValueTicker>;
|
||||
}
|
||||
|
||||
export type CustomBackend = {
|
||||
name: string;
|
||||
url: string;
|
||||
}
|
||||
|
||||
export type State = {
|
||||
initialized: boolean;
|
||||
error: ?string;
|
||||
config: Config;
|
||||
ERC20Abi: Array<Object>;
|
||||
tokens: TokensCollection;
|
||||
customBackend: Array<CustomBackend>;
|
||||
}
|
||||
|
||||
const initialState: State = {
|
||||
initialized: false,
|
||||
error: null,
|
||||
config: {
|
||||
coins: [],
|
||||
networks: [],
|
||||
fiatValueTickers: [],
|
||||
},
|
||||
ERC20Abi: [],
|
||||
tokens: {},
|
||||
customBackend: [
|
||||
{
|
||||
name: 'Custom1',
|
||||
slug: 'custom1',
|
||||
url: 'http://google.com',
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default function localStorage(state: State = initialState, action: Action): State {
|
||||
|
@ -4,7 +4,7 @@ import * as ACCOUNT from 'actions/constants/account';
|
||||
import type {
|
||||
Action,
|
||||
Account,
|
||||
Coin,
|
||||
Network,
|
||||
Token,
|
||||
PendingTx,
|
||||
Discovery,
|
||||
@ -13,7 +13,7 @@ import type {
|
||||
export type State = {
|
||||
location: string;
|
||||
account: ?Account;
|
||||
network: ?Coin;
|
||||
network: ?Network;
|
||||
tokens: Array<Token>,
|
||||
pending: Array<PendingTx>,
|
||||
discovery: ?Discovery,
|
||||
|
@ -6,7 +6,7 @@ import type {
|
||||
Device,
|
||||
TrezorDevice,
|
||||
Account,
|
||||
Coin,
|
||||
Network,
|
||||
Discovery,
|
||||
Token,
|
||||
PendingTx,
|
||||
@ -66,13 +66,13 @@ export const getSelectedAccount = (state: State): ?Account => {
|
||||
return state.accounts.find(a => a.deviceState === device.state && a.index === index && a.network === locationState.network);
|
||||
};
|
||||
|
||||
export const getSelectedNetwork = (state: State): ?Coin => {
|
||||
export const getSelectedNetwork = (state: State): ?Network => {
|
||||
const device = state.wallet.selectedDevice;
|
||||
const { coins } = state.localStorage.config;
|
||||
const { networks } = state.localStorage.config;
|
||||
const locationState = state.router.location.state;
|
||||
if (!device || !locationState.network) return null;
|
||||
|
||||
return coins.find(c => c.network === locationState.network);
|
||||
return networks.find(c => c.shortcut === locationState.network);
|
||||
};
|
||||
|
||||
export const getDiscoveryProcess = (state: State): ?Discovery => {
|
||||
|
@ -70,10 +70,10 @@ const WalletService: Middleware = (api: MiddlewareAPI) => (next: MiddlewareDispa
|
||||
const prevLocation = prevState.router.location;
|
||||
const currentLocation = api.getState().router.location;
|
||||
if (action.type === LOCATION_CHANGE && prevLocation.pathname !== currentLocation.pathname) {
|
||||
// watch for coin change
|
||||
// watch for network change
|
||||
if (prevLocation.state.network !== currentLocation.state.network) {
|
||||
api.dispatch({
|
||||
type: CONNECT.COIN_CHANGED,
|
||||
type: CONNECT.NETWORK_CHANGED,
|
||||
payload: {
|
||||
network: currentLocation.state.network,
|
||||
},
|
||||
|
@ -115,11 +115,11 @@ const AccountMenu = (props: Props) => {
|
||||
const baseUrl: string = urlParams.deviceInstance ? `/device/${urlParams.device}:${urlParams.deviceInstance}` : `/device/${urlParams.device}`;
|
||||
|
||||
const { config } = props.localStorage;
|
||||
const selectedCoin = config.coins.find(c => c.network === location.state.network);
|
||||
const network = config.networks.find(c => c.shortcut === location.state.network);
|
||||
|
||||
if (!selected || !selectedCoin) return null;
|
||||
if (!selected || !network) return null;
|
||||
|
||||
const fiatRate = props.fiat.find(f => f.network === selectedCoin.network);
|
||||
const fiatRate = props.fiat.find(f => f.network === network.shortcut);
|
||||
|
||||
const deviceAccounts: Accounts = findDeviceAccounts(accounts, selected, location.state.network);
|
||||
|
||||
@ -130,14 +130,14 @@ const AccountMenu = (props: Props) => {
|
||||
let balance: string = 'Loading...';
|
||||
if (account.balance !== '') {
|
||||
const pending = stateUtils.getAccountPendingTx(props.pending, account);
|
||||
const pendingAmount: BigNumber = stateUtils.getPendingAmount(pending, selectedCoin.symbol);
|
||||
const pendingAmount: BigNumber = stateUtils.getPendingAmount(pending, network.symbol);
|
||||
const availableBalance: string = new BigNumber(account.balance).minus(pendingAmount).toString(10);
|
||||
|
||||
balance = `${availableBalance} ${selectedCoin.symbol}`;
|
||||
balance = `${availableBalance} ${network.symbol}`;
|
||||
if (fiatRate) {
|
||||
const accountBalance = new BigNumber(availableBalance);
|
||||
const fiat = accountBalance.times(fiatRate.value).toFixed(2);
|
||||
balance = `${availableBalance} ${selectedCoin.symbol} / $${fiat}`;
|
||||
balance = `${availableBalance} ${network.symbol} / $${fiat}`;
|
||||
}
|
||||
}
|
||||
|
||||
@ -233,21 +233,19 @@ const AccountMenu = (props: Props) => {
|
||||
|
||||
return (
|
||||
<Wrapper>
|
||||
{selectedCoin && (
|
||||
<NavLink to={baseUrl}>
|
||||
<RowCoin
|
||||
coin={{
|
||||
name: selectedCoin.name,
|
||||
network: selectedCoin.network,
|
||||
}}
|
||||
iconLeft={{
|
||||
type: ICONS.ARROW_LEFT,
|
||||
color: colors.TEXT_PRIMARY,
|
||||
size: 20,
|
||||
}}
|
||||
/>
|
||||
</NavLink>
|
||||
)}
|
||||
<NavLink to={baseUrl}>
|
||||
<RowCoin
|
||||
network={{
|
||||
name: network.name,
|
||||
shortcut: network.shortcut,
|
||||
}}
|
||||
iconLeft={{
|
||||
type: ICONS.ARROW_LEFT,
|
||||
color: colors.TEXT_PRIMARY,
|
||||
size: 20,
|
||||
}}
|
||||
/>
|
||||
</NavLink>
|
||||
<Wrapper>
|
||||
{selectedAccounts}
|
||||
</Wrapper>
|
||||
|
@ -37,9 +37,9 @@ class CoinMenu extends PureComponent<Props> {
|
||||
return coins.map((coin) => {
|
||||
const row = (
|
||||
<RowCoin
|
||||
coin={{
|
||||
network={{
|
||||
name: coin.coinName,
|
||||
id: coin.id,
|
||||
shortcut: coin.id,
|
||||
}}
|
||||
iconRight={{
|
||||
type: ICONS.SKIP,
|
||||
@ -58,15 +58,15 @@ class CoinMenu extends PureComponent<Props> {
|
||||
const { config } = this.props.localStorage;
|
||||
return (
|
||||
<Wrapper>
|
||||
{config.coins.map(item => (
|
||||
{config.networks.map(item => (
|
||||
<NavLink
|
||||
key={item.network}
|
||||
to={`${this.getBaseUrl()}/network/${item.network}/account/0`}
|
||||
key={item.shortcut}
|
||||
to={`${this.getBaseUrl()}/network/${item.shortcut}/account/0`}
|
||||
>
|
||||
<RowCoin
|
||||
coin={{
|
||||
network={{
|
||||
name: item.name,
|
||||
network: item.network,
|
||||
shortcut: item.shortcut,
|
||||
}}
|
||||
/>
|
||||
</NavLink>
|
||||
|
@ -38,7 +38,7 @@ const IconWrapper = styled.div`
|
||||
`;
|
||||
|
||||
const RowCoin = ({
|
||||
coin, iconLeft, iconRight,
|
||||
network, iconLeft, iconRight,
|
||||
}) => (
|
||||
<RowCoinWrapper>
|
||||
<Row>
|
||||
@ -53,11 +53,8 @@ const RowCoin = ({
|
||||
</IconWrapper>
|
||||
)}
|
||||
<CoinNameWrapper>
|
||||
<CoinLogo
|
||||
coinNetwork={coin.network}
|
||||
coinId={coin.id}
|
||||
/>
|
||||
<p>{coin.name}</p>
|
||||
<CoinLogo network={network.shortcut} />
|
||||
<p>{network.name}</p>
|
||||
</CoinNameWrapper>
|
||||
</Left>
|
||||
{iconRight && (
|
||||
@ -77,10 +74,9 @@ const iconShape = {
|
||||
size: PropTypes.number.isRequired,
|
||||
};
|
||||
RowCoin.propTypes = {
|
||||
coin: PropTypes.shape({
|
||||
network: PropTypes.shape({
|
||||
name: PropTypes.string.isRequired,
|
||||
network: PropTypes.string,
|
||||
id: PropTypes.string,
|
||||
shortcut: PropTypes.string,
|
||||
}).isRequired,
|
||||
iconLeft: PropTypes.shape(iconShape),
|
||||
iconRight: PropTypes.shape(iconShape),
|
||||
|
@ -7,14 +7,14 @@ import { H2 } from 'components/Heading';
|
||||
import Link from 'components/Link';
|
||||
import ScaleText from 'react-scale-text';
|
||||
|
||||
import type { Coin } from 'reducers/LocalStorageReducer';
|
||||
import type { Network } from 'reducers/LocalStorageReducer';
|
||||
import type { Token } from 'reducers/TokensReducer';
|
||||
import type { Props as BaseProps } from '../../Container';
|
||||
|
||||
type Props = {
|
||||
pending: $PropertyType<$ElementType<BaseProps, 'selectedAccount'>, 'pending'>,
|
||||
tokens: $PropertyType<$ElementType<BaseProps, 'selectedAccount'>, 'tokens'>,
|
||||
network: Coin
|
||||
network: Network
|
||||
}
|
||||
|
||||
const Wrapper = styled.div`
|
||||
|
@ -7,11 +7,11 @@ import colors from 'config/colors';
|
||||
import ICONS from 'config/icons';
|
||||
import { FONT_SIZE, FONT_WEIGHT } from 'config/variables';
|
||||
|
||||
import type { Coin } from 'reducers/LocalStorageReducer';
|
||||
import type { Network } from 'flowtype';
|
||||
import type { Props as BaseProps } from '../../Container';
|
||||
|
||||
type Props = {
|
||||
coin: Coin,
|
||||
network: Network,
|
||||
balance: string,
|
||||
fiat: $ElementType<BaseProps, 'fiat'>,
|
||||
}
|
||||
@ -77,7 +77,7 @@ const BalanceRateWrapper = styled(BalanceWrapper)`
|
||||
padding-left: 50px;
|
||||
`;
|
||||
|
||||
const CoinBalace = styled.div`
|
||||
const CoinBalance = styled.div`
|
||||
font-size: ${FONT_SIZE.SMALLER};
|
||||
color: ${colors.TEXT_SECONDARY};
|
||||
`;
|
||||
@ -97,7 +97,7 @@ class AccountBalance extends PureComponent<Props, State> {
|
||||
};
|
||||
}
|
||||
|
||||
handleHideBallanceIconClick() {
|
||||
handleHideBalanceIconClick() {
|
||||
this.setState(previousState => ({
|
||||
isHidden: !previousState.isHidden,
|
||||
canAnimateHideBalanceIcon: true,
|
||||
@ -105,8 +105,8 @@ class AccountBalance extends PureComponent<Props, State> {
|
||||
}
|
||||
|
||||
render() {
|
||||
const selectedCoin = this.props.coin;
|
||||
const fiatRate: any = this.props.fiat.find(f => f.network === selectedCoin.network);
|
||||
const { network } = this.props;
|
||||
const fiatRate: any = this.props.fiat.find(f => f.network === network.shortcut);
|
||||
|
||||
let accountBalance = '';
|
||||
let fiatRateValue = '';
|
||||
@ -121,7 +121,7 @@ class AccountBalance extends PureComponent<Props, State> {
|
||||
return (
|
||||
<Wrapper>
|
||||
<HideBalanceIconWrapper
|
||||
onClick={() => this.handleHideBallanceIconClick()}
|
||||
onClick={() => this.handleHideBalanceIconClick()}
|
||||
>
|
||||
<Icon
|
||||
canAnimate={this.state.canAnimateHideBalanceIcon}
|
||||
@ -138,13 +138,13 @@ class AccountBalance extends PureComponent<Props, State> {
|
||||
{fiatRate && (
|
||||
<FiatValue>${fiat}</FiatValue>
|
||||
)}
|
||||
<CoinBalace>{this.props.balance} {selectedCoin.symbol}</CoinBalace>
|
||||
<CoinBalance>{this.props.balance} {network.symbol}</CoinBalance>
|
||||
</BalanceWrapper>
|
||||
{fiatRate && (
|
||||
<BalanceRateWrapper>
|
||||
<Label>Rate</Label>
|
||||
<FiatValueRate>${fiatRateValue}</FiatValueRate>
|
||||
<CoinBalace>1.00 {selectedCoin.symbol}</CoinBalace>
|
||||
<CoinBalance>1.00 {network.symbol}</CoinBalance>
|
||||
</BalanceRateWrapper>
|
||||
)}
|
||||
</React.Fragment>
|
||||
|
@ -81,18 +81,15 @@ const AccountSummary = (props: Props) => {
|
||||
<React.Fragment>
|
||||
<AccountHeading>
|
||||
<AccountName>
|
||||
<StyledCoinLogo coinNetwork={account.network} />
|
||||
<StyledCoinLogo network={account.network} />
|
||||
<H2>Account #{parseInt(account.index, 10) + 1}</H2>
|
||||
</AccountName>
|
||||
<Link href={explorerLink} isGray>See full transaction history</Link>
|
||||
</AccountHeading>
|
||||
<AccountBalance
|
||||
coin={network}
|
||||
summary={props.summary}
|
||||
network={network}
|
||||
balance={balance}
|
||||
network={network.network}
|
||||
fiat={props.fiat}
|
||||
localStorage={props.localStorage}
|
||||
/>
|
||||
<H2Wrapper>
|
||||
<H2>Tokens</H2>
|
||||
@ -108,11 +105,6 @@ const AccountSummary = (props: Props) => {
|
||||
/>
|
||||
</StyledTooltip>
|
||||
</H2Wrapper>
|
||||
{/* 0x58cda554935e4a1f2acbe15f8757400af275e084 Lahod */}
|
||||
{/* 0x58cda554935e4a1f2acbe15f8757400af275e084 T01 */}
|
||||
|
||||
{/* TOOO: AsyncSelect is lagging when dropdown menu must show more than 200 items */}
|
||||
{/* TODO: Input's box-shadow */}
|
||||
<AsyncSelectWrapper>
|
||||
<AsyncSelect
|
||||
isSearchable
|
||||
|
Loading…
Reference in New Issue
Block a user