mirror of
https://github.com/trezor/trezor-wallet
synced 2024-11-27 02:38:18 +00:00
extract xrp regexps, cleanup
This commit is contained in:
parent
17c0f77e16
commit
39ff483387
@ -136,6 +136,10 @@ export const update = (event: StorageEvent): ThunkAction => (dispatch: Dispatch)
|
||||
}
|
||||
|
||||
if (event.key === KEY_ACCOUNTS) {
|
||||
console.log('omg');
|
||||
console.log(event);
|
||||
console.log(JSON.parse(event.newValue));
|
||||
console.log(event.oldValue);
|
||||
dispatch({
|
||||
type: ACCOUNT.FROM_STORAGE,
|
||||
payload: JSON.parse(event.newValue),
|
||||
|
@ -7,6 +7,7 @@ import { findDevice, getPendingAmount, findToken } from 'reducers/utils';
|
||||
import { toFiatCurrency } from 'utils/fiatConverter';
|
||||
import * as SEND from 'actions/constants/send';
|
||||
import * as ethUtils from 'utils/ethUtils';
|
||||
import * as validators from 'utils/validators';
|
||||
|
||||
import type { Dispatch, GetState, PayloadAction } from 'flowtype';
|
||||
import type { State, FeeLevel } from 'reducers/SendFormEthereumReducer';
|
||||
@ -152,7 +153,10 @@ export const addressValidation = ($state: State): PayloadAction<State> => (): St
|
||||
state.errors.address = 'Address is not set';
|
||||
} else if (!EthereumjsUtil.isValidAddress(address)) {
|
||||
state.errors.address = 'Address is not valid';
|
||||
} else if (ethUtils.hasUppercase(address) && !EthereumjsUtil.isValidChecksumAddress(address)) {
|
||||
} else if (
|
||||
validators.hasUppercase(address) &&
|
||||
!EthereumjsUtil.isValidChecksumAddress(address)
|
||||
) {
|
||||
state.errors.address = 'Address is not a valid checksum';
|
||||
}
|
||||
return state;
|
||||
@ -228,7 +232,7 @@ export const amountValidation = ($state: State): PayloadAction<State> => (
|
||||
const { amount } = state;
|
||||
if (amount.length < 1) {
|
||||
state.errors.amount = 'Amount is not set';
|
||||
} else if (amount.length > 0 && !ethUtils.isEthereumNumber(amount)) {
|
||||
} else if (amount.length > 0 && !validators.isEthereumNumber(amount)) {
|
||||
state.errors.amount = 'Amount is not a number';
|
||||
} else {
|
||||
const isToken: boolean = state.currency !== state.networkSymbol;
|
||||
@ -243,7 +247,7 @@ export const amountValidation = ($state: State): PayloadAction<State> => (
|
||||
);
|
||||
if (!token) return state;
|
||||
|
||||
if (!ethUtils.isEthereumNumber(state.amount, parseInt(token.decimals, 0))) {
|
||||
if (!validators.isNumber(state.amount, parseInt(token.decimals, 0))) {
|
||||
state.errors.amount = `Maximum ${token.decimals} decimals allowed`;
|
||||
} else if (new BigNumber(state.total).isGreaterThan(account.balance)) {
|
||||
state.errors.amount = `Not enough ${state.networkSymbol} to cover transaction fee`;
|
||||
@ -256,7 +260,7 @@ export const amountValidation = ($state: State): PayloadAction<State> => (
|
||||
} else if (new BigNumber(state.amount).isLessThanOrEqualTo('0')) {
|
||||
state.errors.amount = 'Amount is too low';
|
||||
}
|
||||
} else if (!ethUtils.isEthereumNumber(state.amount, 18)) {
|
||||
} else if (!validators.isEthereumNumber(state.amount)) {
|
||||
state.errors.amount = 'Maximum 18 decimals allowed';
|
||||
} else if (
|
||||
new BigNumber(state.total).isGreaterThan(
|
||||
@ -285,7 +289,7 @@ export const gasLimitValidation = ($state: State): PayloadAction<State> => (
|
||||
const { gasLimit } = state;
|
||||
if (gasLimit.length < 1) {
|
||||
state.errors.gasLimit = 'Gas limit is not set';
|
||||
} else if (gasLimit.length > 0 && !ethUtils.isEthereumNumber(gasLimit)) {
|
||||
} else if (gasLimit.length > 0 && !validators.isEthereumNumber(gasLimit)) {
|
||||
state.errors.gasLimit = 'Gas limit is not a number';
|
||||
} else {
|
||||
const gl: BigNumber = new BigNumber(gasLimit);
|
||||
@ -314,7 +318,7 @@ export const gasPriceValidation = ($state: State): PayloadAction<State> => (): S
|
||||
const { gasPrice } = state;
|
||||
if (gasPrice.length < 1) {
|
||||
state.errors.gasPrice = 'Gas price is not set';
|
||||
} else if (gasPrice.length > 0 && !ethUtils.isEthereumNumber(gasPrice)) {
|
||||
} else if (gasPrice.length > 0 && !validators.isEthereumNumber(gasPrice)) {
|
||||
state.errors.gasPrice = 'Gas price is not a number';
|
||||
} else {
|
||||
const gp: BigNumber = new BigNumber(gasPrice);
|
||||
@ -343,7 +347,7 @@ export const nonceValidation = ($state: State): PayloadAction<State> => (
|
||||
const { nonce } = state;
|
||||
if (nonce.length < 1) {
|
||||
state.errors.nonce = 'Nonce is not set';
|
||||
} else if (!nonce.match(ABS_RE)) {
|
||||
} else if (!validators.isAbs(nonce)) {
|
||||
state.errors.nonce = 'Nonce is not a valid number';
|
||||
} else {
|
||||
const n: BigNumber = new BigNumber(nonce);
|
||||
|
@ -5,6 +5,7 @@ import * as SEND from 'actions/constants/send';
|
||||
import { findDevice, getPendingAmount } from 'reducers/utils';
|
||||
import { toDecimalAmount } from 'utils/formatUtils';
|
||||
import { toFiatCurrency } from 'utils/fiatConverter';
|
||||
import * as validators from 'utils/validators';
|
||||
|
||||
import type {
|
||||
Dispatch,
|
||||
@ -16,10 +17,8 @@ import type {
|
||||
import type { State, FeeLevel } from 'reducers/SendFormRippleReducer';
|
||||
|
||||
import AddressValidator from 'wallet-address-validator';
|
||||
|
||||
// general regular expressions
|
||||
const ABS_RE = new RegExp('^[0-9]+$');
|
||||
const NUMBER_RE: RegExp = new RegExp('^(0|0\\.([0-9]+)?|[1-9][0-9]*\\.?([0-9]+)?|\\.[0-9]+)$');
|
||||
const XRP_6_RE = new RegExp('^(0|0\\.([0-9]{0,6})?|[1-9][0-9]*\\.?([0-9]{0,6})?|\\.[0-9]{0,6})$');
|
||||
const U_INT_32 = 0xffffffff;
|
||||
|
||||
/*
|
||||
@ -270,11 +269,11 @@ const amountValidation = ($state: State): PayloadAction<State> => (
|
||||
const { amount } = state;
|
||||
if (amount.length < 1) {
|
||||
state.errors.amount = 'Amount is not set';
|
||||
} else if (amount.length > 0 && !amount.match(NUMBER_RE)) {
|
||||
} else if (amount.length > 0 && !validators.isRippleNumber(amount)) {
|
||||
state.errors.amount = 'Amount is not a number';
|
||||
} else {
|
||||
const pendingAmount: BigNumber = getPendingAmount(pending, state.networkSymbol);
|
||||
if (!state.amount.match(XRP_6_RE)) {
|
||||
if (!validators.isRippleNumber(state.amount)) {
|
||||
state.errors.amount = 'Maximum 6 decimals allowed';
|
||||
} else if (
|
||||
new BigNumber(state.total).isGreaterThan(
|
||||
@ -319,7 +318,7 @@ export const feeValidation = ($state: State): PayloadAction<State> => (
|
||||
const { fee } = state;
|
||||
if (fee.length < 1) {
|
||||
state.errors.fee = 'Fee is not set';
|
||||
} else if (fee.length > 0 && !fee.match(ABS_RE)) {
|
||||
} else if (fee.length > 0 && !validators.isAbs(fee)) {
|
||||
state.errors.fee = 'Fee must be an absolute number';
|
||||
} else {
|
||||
const gl: BigNumber = new BigNumber(fee);
|
||||
@ -340,7 +339,7 @@ export const destinationTagValidation = ($state: State): PayloadAction<State> =>
|
||||
|
||||
const { destinationTag } = state;
|
||||
|
||||
if (destinationTag.length > 0 && !destinationTag.match(ABS_RE)) {
|
||||
if (destinationTag.length > 0 && !validators.isAbs(destinationTag)) {
|
||||
state.errors.destinationTag = 'Destination tag must be an absolute number';
|
||||
}
|
||||
|
||||
|
@ -52,64 +52,4 @@ describe('eth utils', () => {
|
||||
'Address is not valid'
|
||||
);
|
||||
});
|
||||
|
||||
it('isEthereumNumber', () => {
|
||||
expect(utils.isEthereumNumber('0')).toBe(true);
|
||||
expect(utils.isEthereumNumber('0.0')).toBe(true);
|
||||
expect(utils.isEthereumNumber('0.00000000')).toBe(true);
|
||||
expect(utils.isEthereumNumber('0.00000001')).toBe(true);
|
||||
expect(utils.isEthereumNumber('+0.0')).toBe(false);
|
||||
expect(utils.isEthereumNumber('-0.0')).toBe(false);
|
||||
expect(utils.isEthereumNumber('1')).toBe(true);
|
||||
expect(utils.isEthereumNumber('+1')).toBe(false);
|
||||
expect(utils.isEthereumNumber('+100000')).toBe(false);
|
||||
expect(utils.isEthereumNumber('.')).toBe(false);
|
||||
expect(utils.isEthereumNumber('-.1')).toBe(false);
|
||||
expect(utils.isEthereumNumber('0.1')).toBe(true);
|
||||
expect(utils.isEthereumNumber('0.12314841')).toBe(true);
|
||||
expect(utils.isEthereumNumber('0.1381841848184814818391931933')).toBe(false); //28 decimals
|
||||
expect(utils.isEthereumNumber('0.100000000000000000')).toBe(true); //18s decimals
|
||||
|
||||
expect(utils.isEthereumNumber('100.')).toBe(true);
|
||||
expect(utils.isEthereumNumber('.1')).toBe(false);
|
||||
expect(utils.isEthereumNumber('.000000001')).toBe(false);
|
||||
expect(utils.isEthereumNumber('.13134818481481841')).toBe(false);
|
||||
|
||||
expect(utils.isEthereumNumber('001.12314841')).toBe(false);
|
||||
expect(utils.isEthereumNumber('83819319391491949941')).toBe(true);
|
||||
expect(utils.isEthereumNumber('-83819319391491949941')).toBe(false);
|
||||
expect(utils.isEthereumNumber('+0.131831848184')).toBe(false);
|
||||
expect(utils.isEthereumNumber('0.127373193981774718318371831731761626162613')).toBe(false);
|
||||
|
||||
expect(utils.isEthereumNumber('0.131831848184a')).toBe(false);
|
||||
expect(utils.isEthereumNumber('100a')).toBe(false);
|
||||
expect(utils.isEthereumNumber('.100a')).toBe(false);
|
||||
expect(utils.isEthereumNumber('a.100')).toBe(false);
|
||||
expect(utils.isEthereumNumber('abc')).toBe(false);
|
||||
expect(utils.isEthereumNumber('1abc0')).toBe(false);
|
||||
});
|
||||
|
||||
it('hasUppercase', () => {
|
||||
expect(utils.hasUppercase('0')).toBe(false);
|
||||
expect(utils.hasUppercase('abc')).toBe(false);
|
||||
expect(utils.hasUppercase('abcD')).toBe(true);
|
||||
expect(utils.hasUppercase('Abcd')).toBe(true);
|
||||
expect(utils.hasUppercase('aBcd')).toBe(true);
|
||||
expect(utils.hasUppercase('123abc123')).toBe(false);
|
||||
expect(utils.hasUppercase('0x123abc456')).toBe(false);
|
||||
expect(utils.hasUppercase('0x123aBc456')).toBe(true);
|
||||
});
|
||||
|
||||
it('isEthereumNumber decimals=0', () => {
|
||||
expect(utils.isEthereumNumber('0', 0)).toBe(true);
|
||||
expect(utils.isEthereumNumber('0.1', 0)).toBe(false);
|
||||
expect(utils.isEthereumNumber('0.12345', 0)).toBe(false);
|
||||
expect(utils.isEthereumNumber('1', 0)).toBe(true);
|
||||
expect(utils.isEthereumNumber('1.1', 0)).toBe(false);
|
||||
expect(utils.isEthereumNumber('1000000', 0)).toBe(true);
|
||||
expect(utils.isEthereumNumber('-1000000', 0)).toBe(false);
|
||||
expect(utils.isEthereumNumber('.0', 0)).toBe(false);
|
||||
expect(utils.isEthereumNumber('0.', 0)).toBe(true);
|
||||
expect(utils.isEthereumNumber('.', 0)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
63
src/utils/__tests__/validators.test.js
Normal file
63
src/utils/__tests__/validators.test.js
Normal file
@ -0,0 +1,63 @@
|
||||
import * as utils from '../validators';
|
||||
|
||||
describe('validators utils', () => {
|
||||
it('isEthereumNumber', () => {
|
||||
expect(utils.isEthereumNumber('0')).toBe(true);
|
||||
expect(utils.isEthereumNumber('0.0')).toBe(true);
|
||||
expect(utils.isEthereumNumber('0.00000000')).toBe(true);
|
||||
expect(utils.isEthereumNumber('0.00000001')).toBe(true);
|
||||
expect(utils.isEthereumNumber('+0.0')).toBe(false);
|
||||
expect(utils.isEthereumNumber('-0.0')).toBe(false);
|
||||
expect(utils.isEthereumNumber('1')).toBe(true);
|
||||
expect(utils.isEthereumNumber('+1')).toBe(false);
|
||||
expect(utils.isEthereumNumber('+100000')).toBe(false);
|
||||
expect(utils.isEthereumNumber('.')).toBe(false);
|
||||
expect(utils.isEthereumNumber('-.1')).toBe(false);
|
||||
expect(utils.isEthereumNumber('0.1')).toBe(true);
|
||||
expect(utils.isEthereumNumber('0.12314841')).toBe(true);
|
||||
expect(utils.isEthereumNumber('0.1381841848184814818391931933')).toBe(false); //28 decimals
|
||||
expect(utils.isEthereumNumber('0.100000000000000000')).toBe(true); //18s decimals
|
||||
|
||||
expect(utils.isEthereumNumber('100.')).toBe(true);
|
||||
expect(utils.isEthereumNumber('.1')).toBe(false);
|
||||
expect(utils.isEthereumNumber('.000000001')).toBe(false);
|
||||
expect(utils.isEthereumNumber('.13134818481481841')).toBe(false);
|
||||
|
||||
expect(utils.isEthereumNumber('001.12314841')).toBe(false);
|
||||
expect(utils.isEthereumNumber('83819319391491949941')).toBe(true);
|
||||
expect(utils.isEthereumNumber('-83819319391491949941')).toBe(false);
|
||||
expect(utils.isEthereumNumber('+0.131831848184')).toBe(false);
|
||||
expect(utils.isEthereumNumber('0.127373193981774718318371831731761626162613')).toBe(false);
|
||||
|
||||
expect(utils.isEthereumNumber('0.131831848184a')).toBe(false);
|
||||
expect(utils.isEthereumNumber('100a')).toBe(false);
|
||||
expect(utils.isEthereumNumber('.100a')).toBe(false);
|
||||
expect(utils.isEthereumNumber('a.100')).toBe(false);
|
||||
expect(utils.isEthereumNumber('abc')).toBe(false);
|
||||
expect(utils.isEthereumNumber('1abc0')).toBe(false);
|
||||
});
|
||||
|
||||
it('hasUppercase', () => {
|
||||
expect(utils.hasUppercase('0')).toBe(false);
|
||||
expect(utils.hasUppercase('abc')).toBe(false);
|
||||
expect(utils.hasUppercase('abcD')).toBe(true);
|
||||
expect(utils.hasUppercase('Abcd')).toBe(true);
|
||||
expect(utils.hasUppercase('aBcd')).toBe(true);
|
||||
expect(utils.hasUppercase('123abc123')).toBe(false);
|
||||
expect(utils.hasUppercase('0x123abc456')).toBe(false);
|
||||
expect(utils.hasUppercase('0x123aBc456')).toBe(true);
|
||||
});
|
||||
|
||||
it('isNumber decimals=0', () => {
|
||||
expect(utils.isNumber('0', 0)).toBe(true);
|
||||
expect(utils.isNumber('0.1', 0)).toBe(false);
|
||||
expect(utils.isNumber('0.12345', 0)).toBe(false);
|
||||
expect(utils.isNumber('1', 0)).toBe(true);
|
||||
expect(utils.isNumber('1.1', 0)).toBe(false);
|
||||
expect(utils.isNumber('1000000', 0)).toBe(true);
|
||||
expect(utils.isNumber('-1000000', 0)).toBe(false);
|
||||
expect(utils.isNumber('.0', 0)).toBe(false);
|
||||
expect(utils.isNumber('0.', 0)).toBe(false);
|
||||
expect(utils.isNumber('.', 0)).toBe(false);
|
||||
});
|
||||
});
|
@ -46,15 +46,3 @@ export const isHex = (str: string): boolean => {
|
||||
const regExp = /^(0x|0X)?[0-9A-Fa-f]+$/g;
|
||||
return regExp.test(str);
|
||||
};
|
||||
|
||||
export const hasUppercase = (value: string) => {
|
||||
const UPPERCASE_RE = new RegExp('^(.*[A-Z].*)$');
|
||||
return UPPERCASE_RE.test(value);
|
||||
};
|
||||
|
||||
export const isEthereumNumber = (value: string, decimals: number = 18) => {
|
||||
const ETH_18_RE = new RegExp(
|
||||
`^(0|0\\.([0-9]{0,${decimals}})?|[1-9][0-9]*\\.?([0-9]{0,${decimals}})?)$`
|
||||
);
|
||||
return ETH_18_RE.test(value);
|
||||
};
|
||||
|
30
src/utils/validators.js
Normal file
30
src/utils/validators.js
Normal file
@ -0,0 +1,30 @@
|
||||
/* @flow */
|
||||
|
||||
export const hasUppercase = (value: string) => {
|
||||
const UPPERCASE_RE = new RegExp('^(.*[A-Z].*)$');
|
||||
return UPPERCASE_RE.test(value);
|
||||
};
|
||||
|
||||
export const isNumber = (value: string, decimals: number = 18) => {
|
||||
if (decimals === 0) {
|
||||
return isAbs(value);
|
||||
}
|
||||
|
||||
const ETH_18_RE = new RegExp(
|
||||
`^(0|0\\.([0-9]{0,${decimals}})?|[1-9][0-9]*\\.?([0-9]{0,${decimals}})?)$`
|
||||
);
|
||||
return ETH_18_RE.test(value);
|
||||
};
|
||||
|
||||
export const isAbs = (value: string) => {
|
||||
const ABS_RE = new RegExp('^[0-9]+$');
|
||||
return ABS_RE.test(value);
|
||||
};
|
||||
|
||||
export const isEthereumNumber = (value: string) => {
|
||||
return isNumber(value, 18);
|
||||
};
|
||||
|
||||
export const isRippleNumber = (value: string) => {
|
||||
return isNumber(value, 6);
|
||||
};
|
Loading…
Reference in New Issue
Block a user