import { getWalletType } from 'selectors/wallet';
import { AppState } from 'reducers';
import { getTransactionState } from './transaction';
import { getTransactionFields, makeTransaction, IHexStrTransaction } from 'libs/transaction';
import { isEtherTransaction, getUnit, getDecimal } from 'selectors/transaction';
import { Wei, TokenValue, Address } from 'libs/units';
import erc20 from 'libs/erc20';
const getSignState = (state: AppState) => getTransactionState(state).sign;
const signaturePending = (state: AppState) => {
const { isHardwareWallet } = getWalletType(state);
const { pending } = state.transaction.sign;
return { isHardwareWallet, isSignaturePending: pending };
};
const getSignedTx = (state: AppState) => getSignState(state).local.signedTransaction;
const getWeb3Tx = (state: AppState) => getSignState(state).web3.transaction;
const getSerializedTransaction = (state: AppState) =>
getWalletType(state).isWeb3Wallet ? getWeb3Tx(state) : getSignedTx(state);
export interface SerializedTxParams extends IHexStrTransaction {
unit: string;
currentTo: Buffer;
currentValue: Wei | TokenValue;
fee: Wei;
total: Wei;
isToken: boolean;
decimal: number;
}
export const getParamsFromSerializedTx = (state: AppState): SerializedTxParams => {
const tx = getSerializedTransaction(state);
const isEther = isEtherTransaction(state);
const decimal = getDecimal(state);
if (!tx) {
throw Error('Serialized transaction not found');
const fields = getTransactionFields(makeTransaction(tx));
const { value, data, gasLimit, gasPrice, to } = fields;
const currentValue = isEther ? Wei(value) : TokenValue(erc20.transfer.decodeInput(data)._value);
const currentTo = isEther ? Address(to) : Address(erc20.transfer.decodeInput(data)._to);
const unit = getUnit(state);
const fee = Wei(gasLimit).mul(Wei(gasPrice));
const total = fee.add(Wei(value));
return { ...fields, currentValue, currentTo, fee, total, unit, decimal, isToken: !isEther };
export { signaturePending, getSignedTx, getWeb3Tx, getSignState, getSerializedTransaction };