-
Notifications
You must be signed in to change notification settings - Fork 5.1k
/
Copy pathvalidators.ts
109 lines (99 loc) · 3.78 KB
/
validators.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import { isStrictHexString } from '@metamask/utils';
import { isValidHexAddress as isValidHexAddress_ } from '@metamask/controller-utils';
import { truthyDigitString, validateData } from '../../lib/swaps-utils';
import { BridgeFlag, FeatureFlagResponse } from '../../types/bridge';
type Validator<ExpectedResponse> = {
property: keyof ExpectedResponse | string;
type: string;
validator?: (value: unknown) => boolean;
};
export const validateResponse = <ExpectedResponse>(
validators: Validator<ExpectedResponse>[],
data: unknown,
urlUsed: string,
logError = true,
): data is ExpectedResponse => {
return validateData(validators, data, urlUsed, logError);
};
export const isValidNumber = (v: unknown): v is number => typeof v === 'number';
const isValidObject = (v: unknown): v is object =>
typeof v === 'object' && v !== null;
const isValidString = (v: unknown): v is string =>
typeof v === 'string' && v.length > 0;
const isValidHexAddress = (v: unknown) =>
isValidString(v) && isValidHexAddress_(v, { allowNonPrefixed: false });
export const FEATURE_FLAG_VALIDATORS = [
{
property: BridgeFlag.EXTENSION_CONFIG,
type: 'object',
validator: (
v: unknown,
): v is Pick<FeatureFlagResponse, BridgeFlag.EXTENSION_CONFIG> =>
isValidObject(v) &&
'refreshRate' in v &&
isValidNumber(v.refreshRate) &&
'maxRefreshCount' in v &&
isValidNumber(v.maxRefreshCount) &&
'chains' in v &&
isValidObject(v.chains) &&
Object.values(v.chains).every((chain) => isValidObject(chain)) &&
Object.values(v.chains).every(
(chain) =>
'isActiveSrc' in chain &&
'isActiveDest' in chain &&
typeof chain.isActiveSrc === 'boolean' &&
typeof chain.isActiveDest === 'boolean',
),
},
];
export const TOKEN_AGGREGATOR_VALIDATORS = [
{
property: 'aggregators',
type: 'object',
validator: (v: unknown): v is number[] =>
isValidObject(v) && Object.values(v).every(isValidString),
},
];
export const TOKEN_VALIDATORS = [
{ property: 'decimals', type: 'number' },
{ property: 'address', type: 'string', validator: isValidHexAddress },
{
property: 'symbol',
type: 'string',
validator: (v: unknown) => isValidString(v) && v.length <= 12,
},
];
export const QUOTE_RESPONSE_VALIDATORS = [
{ property: 'quote', type: 'object', validator: isValidObject },
{ property: 'estimatedProcessingTimeInSeconds', type: 'number' },
{
property: 'approval',
type: 'object|undefined',
validator: (v: unknown) => v === undefined || isValidObject(v),
},
{ property: 'trade', type: 'object', validator: isValidObject },
];
export const QUOTE_VALIDATORS = [
{ property: 'requestId', type: 'string' },
{ property: 'srcTokenAmount', type: 'string' },
{ property: 'destTokenAmount', type: 'string' },
{ property: 'bridgeId', type: 'string' },
{ property: 'bridges', type: 'object', validator: isValidObject },
{ property: 'srcChainId', type: 'number' },
{ property: 'destChainId', type: 'number' },
{ property: 'srcAsset', type: 'object', validator: isValidObject },
{ property: 'destAsset', type: 'object', validator: isValidObject },
{ property: 'feeData', type: 'object', validator: isValidObject },
];
export const FEE_DATA_VALIDATORS = [
{ property: 'amount', type: 'string', validator: truthyDigitString },
{ property: 'asset', type: 'object', validator: isValidObject },
];
export const TX_DATA_VALIDATORS = [
{ property: 'chainId', type: 'number' },
{ property: 'value', type: 'string', validator: isStrictHexString },
{ property: 'gasLimit', type: 'number' },
{ property: 'to', type: 'string', validator: isValidHexAddress },
{ property: 'from', type: 'string', validator: isValidHexAddress },
{ property: 'data', type: 'string', validator: isStrictHexString },
];