MyCrypto/common/selectors/transaction/meta.ts

88 lines
3.0 KiB
TypeScript

import { AppState } from 'reducers';
import { getTransactionState } from './transaction';
import { getToken } from 'selectors/wallet';
import { isNetworkUnit } from 'selectors/config/wallet';
import { getDecimalFromEtherUnit } from 'libs/units';
import { getSerializedTransaction } from 'selectors/transaction';
import EthTx from 'ethereumjs-tx';
import { getCustomTokens } from 'selectors/customTokens';
import { getNetworkConfig } from 'selectors/config';
import { Token } from '../../../shared/types/network';
import { stripHexPrefixAndLower } from 'libs/values';
import { toChecksumAddress } from 'ethereumjs-util';
const getMetaState = (state: AppState) => getTransactionState(state).meta;
const getFrom = (state: AppState) => {
const serializedTransaction = getSerializedTransaction(state);
// attempt to get the from address from the transaction
if (serializedTransaction) {
const transactionInstance = new EthTx(serializedTransaction);
try {
const from = transactionInstance.from;
if (from) {
return toChecksumAddress(from.toString('hex'));
}
} catch (e) {
console.warn(e);
}
}
return getMetaState(state).from;
};
const getDecimal = (state: AppState) => getMetaState(state).decimal;
const getTokenTo = (state: AppState) => getMetaState(state).tokenTo;
const getTokenValue = (state: AppState) => getMetaState(state).tokenValue;
const isContractInteraction = (state: AppState) => getMetaState(state).isContractInteraction;
const getUnit = (state: AppState) => {
const serializedTransaction = getSerializedTransaction(state);
const contractInteraction = isContractInteraction(state);
// attempt to get the to address from the transaction
if (serializedTransaction && !contractInteraction) {
const transactionInstance = new EthTx(serializedTransaction);
const { to } = transactionInstance;
if (to) {
// see if any tokens match
let networkTokens: null | Token[] = null;
const customTokens = getCustomTokens(state);
const networkConfig = getNetworkConfig(state);
if (!networkConfig.isCustom) {
networkTokens = networkConfig.tokens;
}
const mergedTokens = networkTokens ? [...networkTokens, ...customTokens] : customTokens;
const stringTo = toChecksumAddress(stripHexPrefixAndLower(to.toString('hex')));
const result = mergedTokens.find(t => t.address === stringTo);
if (result) {
return result.symbol;
}
}
}
return getMetaState(state).unit;
};
const getPreviousUnit = (state: AppState) => getMetaState(state).previousUnit;
const getDecimalFromUnit = (state: AppState, unit: string) => {
if (isNetworkUnit(state, unit)) {
return getDecimalFromEtherUnit('ether');
} else {
const token = getToken(state, unit);
if (!token) {
throw Error(`Token ${unit} not found`);
}
return token.decimal;
}
};
export {
getFrom,
getDecimal,
getTokenValue,
getTokenTo,
getUnit,
getPreviousUnit,
getDecimalFromUnit,
isContractInteraction
};