@metamask/bridge-controller 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/dist/bridge-controller.cjs +4 -3
  3. package/dist/bridge-controller.cjs.map +1 -1
  4. package/dist/bridge-controller.d.cts.map +1 -1
  5. package/dist/bridge-controller.d.mts.map +1 -1
  6. package/dist/bridge-controller.mjs +3 -2
  7. package/dist/bridge-controller.mjs.map +1 -1
  8. package/dist/constants/bridge.cjs +2 -2
  9. package/dist/constants/bridge.cjs.map +1 -1
  10. package/dist/constants/bridge.d.cts.map +1 -1
  11. package/dist/constants/bridge.d.mts.map +1 -1
  12. package/dist/constants/bridge.mjs +2 -2
  13. package/dist/constants/bridge.mjs.map +1 -1
  14. package/dist/types.cjs.map +1 -1
  15. package/dist/types.d.cts +16 -24
  16. package/dist/types.d.cts.map +1 -1
  17. package/dist/types.d.mts +16 -24
  18. package/dist/types.d.mts.map +1 -1
  19. package/dist/types.mjs.map +1 -1
  20. package/dist/utils/balance.cjs +10 -7
  21. package/dist/utils/balance.cjs.map +1 -1
  22. package/dist/utils/balance.d.cts +3 -2
  23. package/dist/utils/balance.d.cts.map +1 -1
  24. package/dist/utils/balance.d.mts +3 -2
  25. package/dist/utils/balance.d.mts.map +1 -1
  26. package/dist/utils/balance.mjs +8 -5
  27. package/dist/utils/balance.mjs.map +1 -1
  28. package/dist/utils/bridge.cjs +2 -2
  29. package/dist/utils/bridge.cjs.map +1 -1
  30. package/dist/utils/bridge.d.cts.map +1 -1
  31. package/dist/utils/bridge.d.mts.map +1 -1
  32. package/dist/utils/bridge.mjs +1 -1
  33. package/dist/utils/bridge.mjs.map +1 -1
  34. package/dist/utils/fetch.cjs +3 -12
  35. package/dist/utils/fetch.cjs.map +1 -1
  36. package/dist/utils/fetch.d.cts.map +1 -1
  37. package/dist/utils/fetch.d.mts.map +1 -1
  38. package/dist/utils/fetch.mjs +5 -14
  39. package/dist/utils/fetch.mjs.map +1 -1
  40. package/dist/utils/validators.cjs +92 -102
  41. package/dist/utils/validators.cjs.map +1 -1
  42. package/dist/utils/validators.d.cts +5 -28
  43. package/dist/utils/validators.d.cts.map +1 -1
  44. package/dist/utils/validators.d.mts +5 -28
  45. package/dist/utils/validators.d.mts.map +1 -1
  46. package/dist/utils/validators.mjs +90 -99
  47. package/dist/utils/validators.mjs.map +1 -1
  48. package/package.json +8 -3
@@ -1,112 +1,102 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TX_DATA_VALIDATORS = exports.FEE_DATA_VALIDATORS = exports.QUOTE_VALIDATORS = exports.QUOTE_RESPONSE_VALIDATORS = exports.TOKEN_VALIDATORS = exports.TOKEN_AGGREGATOR_VALIDATORS = exports.FEATURE_FLAG_VALIDATORS = exports.validateResponse = exports.validateData = exports.isValidNumber = exports.truthyDigitString = exports.truthyString = void 0;
3
+ exports.validateQuoteResponse = exports.validateSwapsTokenObject = exports.validateFeatureFlagsResponse = exports.truthyString = void 0;
4
4
  const controller_utils_1 = require("@metamask/controller-utils");
5
+ const superstruct_1 = require("@metamask/superstruct");
5
6
  const utils_1 = require("@metamask/utils");
6
7
  const types_1 = require("../types.cjs");
7
- const truthyString = (string) => Boolean(string?.length);
8
+ const HexAddressSchema = (0, superstruct_1.define)('HexAddress', (v) => (0, controller_utils_1.isValidHexAddress)(v, { allowNonPrefixed: false }));
9
+ const HexStringSchema = (0, superstruct_1.define)('HexString', (v) => (0, utils_1.isStrictHexString)(v));
10
+ const truthyString = (s) => Boolean(s?.length);
8
11
  exports.truthyString = truthyString;
9
- const truthyDigitString = (string) => (0, exports.truthyString)(string) && Boolean(string.match(/^\d+$/u));
10
- exports.truthyDigitString = truthyDigitString;
11
- const isValidNumber = (v) => typeof v === 'number';
12
- exports.isValidNumber = isValidNumber;
13
- const isValidObject = (v) => typeof v === 'object' && v !== null;
14
- const isValidString = (v) => typeof v === 'string' && v.length > 0;
15
- const isValidHexAddress = (v) => isValidString(v) && (0, controller_utils_1.isValidHexAddress)(v, { allowNonPrefixed: false });
16
- const validateData = (validators, object, urlUsed, logError = true) => {
17
- return validators.every(({ property, type, validator }) => {
18
- const types = type.split('|');
19
- const propertyString = String(property);
20
- const valid = isValidObject(object) &&
21
- types.some((_type) => typeof object[propertyString] === _type) &&
22
- (!validator || validator(object[propertyString]));
23
- if (!valid && logError) {
24
- const value = isValidObject(object)
25
- ? object[propertyString]
26
- : undefined;
27
- const typeString = isValidObject(object)
28
- ? typeof object[propertyString]
29
- : 'undefined';
30
- console.error(`response to GET ${urlUsed} invalid for property ${String(property)}; value was:`, value, '| type was: ', typeString);
31
- }
32
- return valid;
12
+ const TruthyDigitStringSchema = (0, superstruct_1.define)('TruthyDigitString', (v) => (0, exports.truthyString)(v) && Boolean(v.match(/^\d+$/u)));
13
+ const SwapsTokenObjectSchema = (0, superstruct_1.type)({
14
+ decimals: (0, superstruct_1.number)(),
15
+ address: (0, superstruct_1.intersection)([(0, superstruct_1.string)(), HexAddressSchema]),
16
+ symbol: (0, superstruct_1.size)((0, superstruct_1.string)(), 1, 12),
17
+ });
18
+ const validateFeatureFlagsResponse = (data) => {
19
+ const ChainConfigurationSchema = (0, superstruct_1.type)({
20
+ isActiveSrc: (0, superstruct_1.boolean)(),
21
+ isActiveDest: (0, superstruct_1.boolean)(),
33
22
  });
23
+ const ConfigSchema = (0, superstruct_1.type)({
24
+ refreshRate: (0, superstruct_1.number)(),
25
+ maxRefreshCount: (0, superstruct_1.number)(),
26
+ support: (0, superstruct_1.boolean)(),
27
+ chains: (0, superstruct_1.record)((0, superstruct_1.string)(), ChainConfigurationSchema),
28
+ });
29
+ // Create schema for FeatureFlagResponse
30
+ const FeatureFlagResponseSchema = (0, superstruct_1.type)({
31
+ [types_1.BridgeFlag.EXTENSION_CONFIG]: ConfigSchema,
32
+ [types_1.BridgeFlag.MOBILE_CONFIG]: ConfigSchema,
33
+ });
34
+ return (0, superstruct_1.is)(data, FeatureFlagResponseSchema);
35
+ };
36
+ exports.validateFeatureFlagsResponse = validateFeatureFlagsResponse;
37
+ const validateSwapsTokenObject = (data) => {
38
+ return (0, superstruct_1.is)(data, SwapsTokenObjectSchema);
34
39
  };
35
- exports.validateData = validateData;
36
- const validateResponse = (validators, data, urlUsed, logError = true) => {
37
- return (0, exports.validateData)(validators, data, urlUsed, logError);
40
+ exports.validateSwapsTokenObject = validateSwapsTokenObject;
41
+ const validateQuoteResponse = (data) => {
42
+ const ChainIdSchema = (0, superstruct_1.number)();
43
+ const BridgeAssetSchema = (0, superstruct_1.type)({
44
+ chainId: ChainIdSchema,
45
+ address: (0, superstruct_1.string)(),
46
+ symbol: (0, superstruct_1.string)(),
47
+ name: (0, superstruct_1.string)(),
48
+ decimals: (0, superstruct_1.number)(),
49
+ icon: (0, superstruct_1.optional)((0, superstruct_1.string)()),
50
+ });
51
+ const FeeDataSchema = (0, superstruct_1.type)({
52
+ amount: TruthyDigitStringSchema,
53
+ asset: BridgeAssetSchema,
54
+ });
55
+ const ProtocolSchema = (0, superstruct_1.type)({
56
+ name: (0, superstruct_1.string)(),
57
+ displayName: (0, superstruct_1.optional)((0, superstruct_1.string)()),
58
+ icon: (0, superstruct_1.optional)((0, superstruct_1.string)()),
59
+ });
60
+ const StepSchema = (0, superstruct_1.type)({
61
+ action: (0, superstruct_1.enums)(Object.values(types_1.ActionTypes)),
62
+ srcChainId: ChainIdSchema,
63
+ destChainId: (0, superstruct_1.optional)(ChainIdSchema),
64
+ srcAsset: BridgeAssetSchema,
65
+ destAsset: BridgeAssetSchema,
66
+ srcAmount: (0, superstruct_1.string)(),
67
+ destAmount: (0, superstruct_1.string)(),
68
+ protocol: ProtocolSchema,
69
+ });
70
+ const RefuelDataSchema = StepSchema;
71
+ const QuoteSchema = (0, superstruct_1.type)({
72
+ requestId: (0, superstruct_1.string)(),
73
+ srcChainId: ChainIdSchema,
74
+ srcAsset: SwapsTokenObjectSchema,
75
+ srcTokenAmount: (0, superstruct_1.string)(),
76
+ destChainId: ChainIdSchema,
77
+ destAsset: SwapsTokenObjectSchema,
78
+ destTokenAmount: (0, superstruct_1.string)(),
79
+ feeData: (0, superstruct_1.record)((0, superstruct_1.enums)(Object.values(types_1.FeeType)), FeeDataSchema),
80
+ bridgeId: (0, superstruct_1.string)(),
81
+ bridges: (0, superstruct_1.array)((0, superstruct_1.string)()),
82
+ steps: (0, superstruct_1.array)(StepSchema),
83
+ refuel: (0, superstruct_1.optional)(RefuelDataSchema),
84
+ });
85
+ const TxDataSchema = (0, superstruct_1.type)({
86
+ chainId: (0, superstruct_1.number)(),
87
+ to: HexAddressSchema,
88
+ from: HexAddressSchema,
89
+ value: HexStringSchema,
90
+ data: HexStringSchema,
91
+ gasLimit: (0, superstruct_1.nullable)((0, superstruct_1.number)()),
92
+ });
93
+ const QuoteResponseSchema = (0, superstruct_1.type)({
94
+ quote: QuoteSchema,
95
+ approval: (0, superstruct_1.optional)(TxDataSchema),
96
+ trade: TxDataSchema,
97
+ estimatedProcessingTimeInSeconds: (0, superstruct_1.number)(),
98
+ });
99
+ return (0, superstruct_1.is)(data, QuoteResponseSchema);
38
100
  };
39
- exports.validateResponse = validateResponse;
40
- exports.FEATURE_FLAG_VALIDATORS = [
41
- {
42
- property: types_1.BridgeFlag.EXTENSION_CONFIG,
43
- type: 'object',
44
- validator: (v) => isValidObject(v) &&
45
- 'refreshRate' in v &&
46
- (0, exports.isValidNumber)(v.refreshRate) &&
47
- 'maxRefreshCount' in v &&
48
- (0, exports.isValidNumber)(v.maxRefreshCount) &&
49
- 'chains' in v &&
50
- isValidObject(v.chains) &&
51
- Object.values(v.chains).every((chain) => isValidObject(chain)) &&
52
- Object.values(v.chains).every((chain) => 'isActiveSrc' in chain &&
53
- 'isActiveDest' in chain &&
54
- typeof chain.isActiveSrc === 'boolean' &&
55
- typeof chain.isActiveDest === 'boolean'),
56
- },
57
- ];
58
- exports.TOKEN_AGGREGATOR_VALIDATORS = [
59
- {
60
- property: 'aggregators',
61
- type: 'object',
62
- validator: (v) => isValidObject(v) && Object.values(v).every(isValidString),
63
- },
64
- ];
65
- exports.TOKEN_VALIDATORS = [
66
- { property: 'decimals', type: 'number' },
67
- { property: 'address', type: 'string', validator: isValidHexAddress },
68
- {
69
- property: 'symbol',
70
- type: 'string',
71
- validator: (v) => isValidString(v) && v.length <= 12,
72
- },
73
- ];
74
- exports.QUOTE_RESPONSE_VALIDATORS = [
75
- { property: 'quote', type: 'object', validator: isValidObject },
76
- { property: 'estimatedProcessingTimeInSeconds', type: 'number' },
77
- {
78
- property: 'approval',
79
- type: 'object|undefined',
80
- validator: (v) => v === undefined || isValidObject(v),
81
- },
82
- { property: 'trade', type: 'object', validator: isValidObject },
83
- ];
84
- exports.QUOTE_VALIDATORS = [
85
- { property: 'requestId', type: 'string' },
86
- { property: 'srcTokenAmount', type: 'string' },
87
- { property: 'destTokenAmount', type: 'string' },
88
- { property: 'bridgeId', type: 'string' },
89
- { property: 'bridges', type: 'object', validator: isValidObject },
90
- { property: 'srcChainId', type: 'number' },
91
- { property: 'destChainId', type: 'number' },
92
- { property: 'srcAsset', type: 'object', validator: isValidObject },
93
- { property: 'destAsset', type: 'object', validator: isValidObject },
94
- { property: 'feeData', type: 'object', validator: isValidObject },
95
- ];
96
- exports.FEE_DATA_VALIDATORS = [
97
- {
98
- property: 'amount',
99
- type: 'string',
100
- validator: (v) => (0, exports.truthyDigitString)(String(v)),
101
- },
102
- { property: 'asset', type: 'object', validator: isValidObject },
103
- ];
104
- exports.TX_DATA_VALIDATORS = [
105
- { property: 'chainId', type: 'number' },
106
- { property: 'value', type: 'string', validator: utils_1.isStrictHexString },
107
- { property: 'gasLimit', type: 'number' },
108
- { property: 'to', type: 'string', validator: isValidHexAddress },
109
- { property: 'from', type: 'string', validator: isValidHexAddress },
110
- { property: 'data', type: 'string', validator: utils_1.isStrictHexString },
111
- ];
101
+ exports.validateQuoteResponse = validateQuoteResponse;
112
102
  //# sourceMappingURL=validators.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.cjs","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidHexAddress as isValidHexAddress_ } from '@metamask/controller-utils';\nimport { isStrictHexString } from '@metamask/utils';\n\nimport type { SwapsTokenObject } from '../constants/tokens';\nimport type {\n FeatureFlagResponse,\n FeeData,\n Quote,\n QuoteResponse,\n TxData,\n} from '../types';\nimport { BridgeFlag } from '../types';\n\nexport const truthyString = (string: string) => Boolean(string?.length);\nexport const truthyDigitString = (string: string) =>\n truthyString(string) && Boolean(string.match(/^\\d+$/u));\n\nexport const isValidNumber = (v: unknown): v is number => typeof v === 'number';\nconst isValidObject = (v: unknown): v is object =>\n typeof v === 'object' && v !== null;\nconst isValidString = (v: unknown): v is string =>\n typeof v === 'string' && v.length > 0;\nconst isValidHexAddress = (v: unknown) =>\n isValidString(v) && isValidHexAddress_(v, { allowNonPrefixed: false });\n\ntype Validator<ExpectedResponse> = {\n property: keyof ExpectedResponse;\n type: string;\n validator?: (value: unknown) => boolean;\n};\n\nexport const validateData = <ExpectedResponse>(\n validators: Validator<ExpectedResponse>[],\n object: unknown,\n urlUsed: string,\n logError = true,\n): object is ExpectedResponse => {\n return validators.every(({ property, type, validator }) => {\n const types = type.split('|');\n const propertyString = String(property);\n\n const valid =\n isValidObject(object) &&\n types.some(\n (_type) =>\n typeof object[propertyString as keyof typeof object] === _type,\n ) &&\n (!validator || validator(object[propertyString as keyof typeof object]));\n\n if (!valid && logError) {\n const value = isValidObject(object)\n ? object[propertyString as keyof typeof object]\n : undefined;\n const typeString = isValidObject(object)\n ? typeof object[propertyString as keyof typeof object]\n : 'undefined';\n\n console.error(\n `response to GET ${urlUsed} invalid for property ${String(property)}; value was:`,\n value,\n '| type was: ',\n typeString,\n );\n }\n return valid;\n });\n};\n\nexport const validateResponse = <ExpectedResponse>(\n validators: Validator<ExpectedResponse>[],\n data: unknown,\n urlUsed: string,\n logError = true,\n): data is ExpectedResponse => {\n return validateData(validators, data, urlUsed, logError);\n};\n\nexport const FEATURE_FLAG_VALIDATORS = [\n {\n property: BridgeFlag.EXTENSION_CONFIG,\n type: 'object',\n validator: (\n v: unknown,\n ): v is Pick<FeatureFlagResponse, BridgeFlag.EXTENSION_CONFIG> =>\n isValidObject(v) &&\n 'refreshRate' in v &&\n isValidNumber(v.refreshRate) &&\n 'maxRefreshCount' in v &&\n isValidNumber(v.maxRefreshCount) &&\n 'chains' in v &&\n isValidObject(v.chains) &&\n Object.values(v.chains).every((chain) => isValidObject(chain)) &&\n Object.values(v.chains).every(\n (chain) =>\n 'isActiveSrc' in chain &&\n 'isActiveDest' in chain &&\n typeof chain.isActiveSrc === 'boolean' &&\n typeof chain.isActiveDest === 'boolean',\n ),\n },\n];\n\nexport const TOKEN_AGGREGATOR_VALIDATORS = [\n {\n property: 'aggregators',\n type: 'object',\n validator: (v: unknown): v is number[] =>\n isValidObject(v) && Object.values(v).every(isValidString),\n },\n];\n\nexport const TOKEN_VALIDATORS: Validator<SwapsTokenObject>[] = [\n { property: 'decimals', type: 'number' },\n { property: 'address', type: 'string', validator: isValidHexAddress },\n {\n property: 'symbol',\n type: 'string',\n validator: (v: unknown) => isValidString(v) && v.length <= 12,\n },\n];\n\nexport const QUOTE_RESPONSE_VALIDATORS: Validator<QuoteResponse>[] = [\n { property: 'quote', type: 'object', validator: isValidObject },\n { property: 'estimatedProcessingTimeInSeconds', type: 'number' },\n {\n property: 'approval',\n type: 'object|undefined',\n validator: (v: unknown) => v === undefined || isValidObject(v),\n },\n { property: 'trade', type: 'object', validator: isValidObject },\n];\n\nexport const QUOTE_VALIDATORS: Validator<Quote>[] = [\n { property: 'requestId', type: 'string' },\n { property: 'srcTokenAmount', type: 'string' },\n { property: 'destTokenAmount', type: 'string' },\n { property: 'bridgeId', type: 'string' },\n { property: 'bridges', type: 'object', validator: isValidObject },\n { property: 'srcChainId', type: 'number' },\n { property: 'destChainId', type: 'number' },\n { property: 'srcAsset', type: 'object', validator: isValidObject },\n { property: 'destAsset', type: 'object', validator: isValidObject },\n { property: 'feeData', type: 'object', validator: isValidObject },\n];\n\nexport const FEE_DATA_VALIDATORS: Validator<FeeData>[] = [\n {\n property: 'amount',\n type: 'string',\n validator: (v: unknown) => truthyDigitString(String(v)),\n },\n { property: 'asset', type: 'object', validator: isValidObject },\n];\n\nexport const TX_DATA_VALIDATORS: Validator<TxData>[] = [\n { property: 'chainId', type: 'number' },\n { property: 'value', type: 'string', validator: isStrictHexString },\n { property: 'gasLimit', type: 'number' },\n { property: 'to', type: 'string', validator: isValidHexAddress },\n { property: 'from', type: 'string', validator: isValidHexAddress },\n { property: 'data', type: 'string', validator: isStrictHexString },\n];\n"]}
1
+ {"version":3,"file":"validators.cjs","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidHexAddress } from '@metamask/controller-utils';\nimport {\n string,\n boolean,\n number,\n type,\n is,\n record,\n array,\n nullable,\n optional,\n enums,\n define,\n intersection,\n size,\n} from '@metamask/superstruct';\nimport { isStrictHexString } from '@metamask/utils';\n\nimport type { SwapsTokenObject } from '../constants/tokens';\nimport type { FeatureFlagResponse, QuoteResponse } from '../types';\nimport { ActionTypes, BridgeFlag, FeeType } from '../types';\n\nconst HexAddressSchema = define('HexAddress', (v: unknown) =>\n isValidHexAddress(v as string, { allowNonPrefixed: false }),\n);\n\nconst HexStringSchema = define('HexString', (v: unknown) =>\n isStrictHexString(v as string),\n);\n\nexport const truthyString = (s: string) => Boolean(s?.length);\nconst TruthyDigitStringSchema = define(\n 'TruthyDigitString',\n (v: unknown) =>\n truthyString(v as string) && Boolean((v as string).match(/^\\d+$/u)),\n);\n\nconst SwapsTokenObjectSchema = type({\n decimals: number(),\n address: intersection([string(), HexAddressSchema]),\n symbol: size(string(), 1, 12),\n});\n\nexport const validateFeatureFlagsResponse = (\n data: unknown,\n): data is FeatureFlagResponse => {\n const ChainConfigurationSchema = type({\n isActiveSrc: boolean(),\n isActiveDest: boolean(),\n });\n\n const ConfigSchema = type({\n refreshRate: number(),\n maxRefreshCount: number(),\n support: boolean(),\n chains: record(string(), ChainConfigurationSchema),\n });\n\n // Create schema for FeatureFlagResponse\n const FeatureFlagResponseSchema = type({\n [BridgeFlag.EXTENSION_CONFIG]: ConfigSchema,\n [BridgeFlag.MOBILE_CONFIG]: ConfigSchema,\n });\n\n return is(data, FeatureFlagResponseSchema);\n};\n\nexport const validateSwapsTokenObject = (\n data: unknown,\n): data is SwapsTokenObject => {\n return is(data, SwapsTokenObjectSchema);\n};\n\nexport const validateQuoteResponse = (data: unknown): data is QuoteResponse => {\n const ChainIdSchema = number();\n\n const BridgeAssetSchema = type({\n chainId: ChainIdSchema,\n address: string(),\n symbol: string(),\n name: string(),\n decimals: number(),\n icon: optional(string()),\n });\n\n const FeeDataSchema = type({\n amount: TruthyDigitStringSchema,\n asset: BridgeAssetSchema,\n });\n\n const ProtocolSchema = type({\n name: string(),\n displayName: optional(string()),\n icon: optional(string()),\n });\n\n const StepSchema = type({\n action: enums(Object.values(ActionTypes)),\n srcChainId: ChainIdSchema,\n destChainId: optional(ChainIdSchema),\n srcAsset: BridgeAssetSchema,\n destAsset: BridgeAssetSchema,\n srcAmount: string(),\n destAmount: string(),\n protocol: ProtocolSchema,\n });\n\n const RefuelDataSchema = StepSchema;\n\n const QuoteSchema = type({\n requestId: string(),\n srcChainId: ChainIdSchema,\n srcAsset: SwapsTokenObjectSchema,\n srcTokenAmount: string(),\n destChainId: ChainIdSchema,\n destAsset: SwapsTokenObjectSchema,\n destTokenAmount: string(),\n feeData: record(enums(Object.values(FeeType)), FeeDataSchema),\n bridgeId: string(),\n bridges: array(string()),\n steps: array(StepSchema),\n refuel: optional(RefuelDataSchema),\n });\n\n const TxDataSchema = type({\n chainId: number(),\n to: HexAddressSchema,\n from: HexAddressSchema,\n value: HexStringSchema,\n data: HexStringSchema,\n gasLimit: nullable(number()),\n });\n\n const QuoteResponseSchema = type({\n quote: QuoteSchema,\n approval: optional(TxDataSchema),\n trade: TxDataSchema,\n estimatedProcessingTimeInSeconds: number(),\n });\n\n return is(data, QuoteResponseSchema);\n};\n"]}
@@ -1,30 +1,7 @@
1
1
  import type { SwapsTokenObject } from "../constants/tokens.cjs";
2
- import type { FeatureFlagResponse, FeeData, Quote, QuoteResponse, TxData } from "../types.cjs";
3
- import { BridgeFlag } from "../types.cjs";
4
- export declare const truthyString: (string: string) => boolean;
5
- export declare const truthyDigitString: (string: string) => boolean;
6
- export declare const isValidNumber: (v: unknown) => v is number;
7
- type Validator<ExpectedResponse> = {
8
- property: keyof ExpectedResponse;
9
- type: string;
10
- validator?: (value: unknown) => boolean;
11
- };
12
- export declare const validateData: <ExpectedResponse>(validators: Validator<ExpectedResponse>[], object: unknown, urlUsed: string, logError?: boolean) => object is ExpectedResponse;
13
- export declare const validateResponse: <ExpectedResponse>(validators: Validator<ExpectedResponse>[], data: unknown, urlUsed: string, logError?: boolean) => data is ExpectedResponse;
14
- export declare const FEATURE_FLAG_VALIDATORS: {
15
- property: BridgeFlag;
16
- type: string;
17
- validator: (v: unknown) => v is Pick<FeatureFlagResponse, BridgeFlag.EXTENSION_CONFIG>;
18
- }[];
19
- export declare const TOKEN_AGGREGATOR_VALIDATORS: {
20
- property: string;
21
- type: string;
22
- validator: (v: unknown) => v is number[];
23
- }[];
24
- export declare const TOKEN_VALIDATORS: Validator<SwapsTokenObject>[];
25
- export declare const QUOTE_RESPONSE_VALIDATORS: Validator<QuoteResponse>[];
26
- export declare const QUOTE_VALIDATORS: Validator<Quote>[];
27
- export declare const FEE_DATA_VALIDATORS: Validator<FeeData>[];
28
- export declare const TX_DATA_VALIDATORS: Validator<TxData>[];
29
- export {};
2
+ import type { FeatureFlagResponse, QuoteResponse } from "../types.cjs";
3
+ export declare const truthyString: (s: string) => boolean;
4
+ export declare const validateFeatureFlagsResponse: (data: unknown) => data is FeatureFlagResponse;
5
+ export declare const validateSwapsTokenObject: (data: unknown) => data is SwapsTokenObject;
6
+ export declare const validateQuoteResponse: (data: unknown) => data is QuoteResponse;
30
7
  //# sourceMappingURL=validators.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.cts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAC5D,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EACP,KAAK,EACL,aAAa,EACb,MAAM,EACP,qBAAiB;AAClB,OAAO,EAAE,UAAU,EAAE,qBAAiB;AAEtC,eAAO,MAAM,YAAY,WAAY,MAAM,YAA4B,CAAC;AACxE,eAAO,MAAM,iBAAiB,WAAY,MAAM,YACS,CAAC;AAE1D,eAAO,MAAM,aAAa,MAAO,OAAO,gBAAuC,CAAC;AAQhF,KAAK,SAAS,CAAC,gBAAgB,IAAI;IACjC,QAAQ,EAAE,MAAM,gBAAgB,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CACzC,CAAC;AAEF,eAAO,MAAM,YAAY,wEAEf,OAAO,WACN,MAAM,mDAgChB,CAAC;AAEF,eAAO,MAAM,gBAAgB,sEAErB,OAAO,WACJ,MAAM,iDAIhB,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;mBAK3B,OAAO;GAkBf,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;mBAIrB,OAAO;GAGzB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,EAQzD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,SAAS,CAAC,aAAa,CAAC,EAS/D,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,KAAK,CAAC,EAW9C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAAS,CAAC,OAAO,CAAC,EAOnD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,MAAM,CAAC,EAOjD,CAAC"}
1
+ {"version":3,"file":"validators.d.cts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,qBAAiB;AAWnE,eAAO,MAAM,YAAY,MAAO,MAAM,YAAuB,CAAC;AAa9D,eAAO,MAAM,4BAA4B,SACjC,OAAO,gCAqBd,CAAC;AAEF,eAAO,MAAM,wBAAwB,SAC7B,OAAO,6BAGd,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAAU,OAAO,0BAoElD,CAAC"}
@@ -1,30 +1,7 @@
1
1
  import type { SwapsTokenObject } from "../constants/tokens.mjs";
2
- import type { FeatureFlagResponse, FeeData, Quote, QuoteResponse, TxData } from "../types.mjs";
3
- import { BridgeFlag } from "../types.mjs";
4
- export declare const truthyString: (string: string) => boolean;
5
- export declare const truthyDigitString: (string: string) => boolean;
6
- export declare const isValidNumber: (v: unknown) => v is number;
7
- type Validator<ExpectedResponse> = {
8
- property: keyof ExpectedResponse;
9
- type: string;
10
- validator?: (value: unknown) => boolean;
11
- };
12
- export declare const validateData: <ExpectedResponse>(validators: Validator<ExpectedResponse>[], object: unknown, urlUsed: string, logError?: boolean) => object is ExpectedResponse;
13
- export declare const validateResponse: <ExpectedResponse>(validators: Validator<ExpectedResponse>[], data: unknown, urlUsed: string, logError?: boolean) => data is ExpectedResponse;
14
- export declare const FEATURE_FLAG_VALIDATORS: {
15
- property: BridgeFlag;
16
- type: string;
17
- validator: (v: unknown) => v is Pick<FeatureFlagResponse, BridgeFlag.EXTENSION_CONFIG>;
18
- }[];
19
- export declare const TOKEN_AGGREGATOR_VALIDATORS: {
20
- property: string;
21
- type: string;
22
- validator: (v: unknown) => v is number[];
23
- }[];
24
- export declare const TOKEN_VALIDATORS: Validator<SwapsTokenObject>[];
25
- export declare const QUOTE_RESPONSE_VALIDATORS: Validator<QuoteResponse>[];
26
- export declare const QUOTE_VALIDATORS: Validator<Quote>[];
27
- export declare const FEE_DATA_VALIDATORS: Validator<FeeData>[];
28
- export declare const TX_DATA_VALIDATORS: Validator<TxData>[];
29
- export {};
2
+ import type { FeatureFlagResponse, QuoteResponse } from "../types.mjs";
3
+ export declare const truthyString: (s: string) => boolean;
4
+ export declare const validateFeatureFlagsResponse: (data: unknown) => data is FeatureFlagResponse;
5
+ export declare const validateSwapsTokenObject: (data: unknown) => data is SwapsTokenObject;
6
+ export declare const validateQuoteResponse: (data: unknown) => data is QuoteResponse;
30
7
  //# sourceMappingURL=validators.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.mts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAC5D,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EACP,KAAK,EACL,aAAa,EACb,MAAM,EACP,qBAAiB;AAClB,OAAO,EAAE,UAAU,EAAE,qBAAiB;AAEtC,eAAO,MAAM,YAAY,WAAY,MAAM,YAA4B,CAAC;AACxE,eAAO,MAAM,iBAAiB,WAAY,MAAM,YACS,CAAC;AAE1D,eAAO,MAAM,aAAa,MAAO,OAAO,gBAAuC,CAAC;AAQhF,KAAK,SAAS,CAAC,gBAAgB,IAAI;IACjC,QAAQ,EAAE,MAAM,gBAAgB,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CACzC,CAAC;AAEF,eAAO,MAAM,YAAY,wEAEf,OAAO,WACN,MAAM,mDAgChB,CAAC;AAEF,eAAO,MAAM,gBAAgB,sEAErB,OAAO,WACJ,MAAM,iDAIhB,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;mBAK3B,OAAO;GAkBf,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;mBAIrB,OAAO;GAGzB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,EAQzD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,SAAS,CAAC,aAAa,CAAC,EAS/D,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,KAAK,CAAC,EAW9C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAAS,CAAC,OAAO,CAAC,EAOnD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,MAAM,CAAC,EAOjD,CAAC"}
1
+ {"version":3,"file":"validators.d.mts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,qBAAiB;AAWnE,eAAO,MAAM,YAAY,MAAO,MAAM,YAAuB,CAAC;AAa9D,eAAO,MAAM,4BAA4B,SACjC,OAAO,gCAqBd,CAAC;AAEF,eAAO,MAAM,wBAAwB,SAC7B,OAAO,6BAGd,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAAU,OAAO,0BAoElD,CAAC"}
@@ -1,104 +1,95 @@
1
- import { isValidHexAddress as isValidHexAddress_ } from "@metamask/controller-utils";
1
+ import { isValidHexAddress } from "@metamask/controller-utils";
2
+ import { string, boolean, number, type, is, record, array, nullable, optional, enums, define, intersection, size } from "@metamask/superstruct";
2
3
  import { isStrictHexString } from "@metamask/utils";
3
- import { BridgeFlag } from "../types.mjs";
4
- export const truthyString = (string) => Boolean(string?.length);
5
- export const truthyDigitString = (string) => truthyString(string) && Boolean(string.match(/^\d+$/u));
6
- export const isValidNumber = (v) => typeof v === 'number';
7
- const isValidObject = (v) => typeof v === 'object' && v !== null;
8
- const isValidString = (v) => typeof v === 'string' && v.length > 0;
9
- const isValidHexAddress = (v) => isValidString(v) && isValidHexAddress_(v, { allowNonPrefixed: false });
10
- export const validateData = (validators, object, urlUsed, logError = true) => {
11
- return validators.every(({ property, type, validator }) => {
12
- const types = type.split('|');
13
- const propertyString = String(property);
14
- const valid = isValidObject(object) &&
15
- types.some((_type) => typeof object[propertyString] === _type) &&
16
- (!validator || validator(object[propertyString]));
17
- if (!valid && logError) {
18
- const value = isValidObject(object)
19
- ? object[propertyString]
20
- : undefined;
21
- const typeString = isValidObject(object)
22
- ? typeof object[propertyString]
23
- : 'undefined';
24
- console.error(`response to GET ${urlUsed} invalid for property ${String(property)}; value was:`, value, '| type was: ', typeString);
25
- }
26
- return valid;
4
+ import { ActionTypes, BridgeFlag, FeeType } from "../types.mjs";
5
+ const HexAddressSchema = define('HexAddress', (v) => isValidHexAddress(v, { allowNonPrefixed: false }));
6
+ const HexStringSchema = define('HexString', (v) => isStrictHexString(v));
7
+ export const truthyString = (s) => Boolean(s?.length);
8
+ const TruthyDigitStringSchema = define('TruthyDigitString', (v) => truthyString(v) && Boolean(v.match(/^\d+$/u)));
9
+ const SwapsTokenObjectSchema = type({
10
+ decimals: number(),
11
+ address: intersection([string(), HexAddressSchema]),
12
+ symbol: size(string(), 1, 12),
13
+ });
14
+ export const validateFeatureFlagsResponse = (data) => {
15
+ const ChainConfigurationSchema = type({
16
+ isActiveSrc: boolean(),
17
+ isActiveDest: boolean(),
27
18
  });
19
+ const ConfigSchema = type({
20
+ refreshRate: number(),
21
+ maxRefreshCount: number(),
22
+ support: boolean(),
23
+ chains: record(string(), ChainConfigurationSchema),
24
+ });
25
+ // Create schema for FeatureFlagResponse
26
+ const FeatureFlagResponseSchema = type({
27
+ [BridgeFlag.EXTENSION_CONFIG]: ConfigSchema,
28
+ [BridgeFlag.MOBILE_CONFIG]: ConfigSchema,
29
+ });
30
+ return is(data, FeatureFlagResponseSchema);
31
+ };
32
+ export const validateSwapsTokenObject = (data) => {
33
+ return is(data, SwapsTokenObjectSchema);
28
34
  };
29
- export const validateResponse = (validators, data, urlUsed, logError = true) => {
30
- return validateData(validators, data, urlUsed, logError);
35
+ export const validateQuoteResponse = (data) => {
36
+ const ChainIdSchema = number();
37
+ const BridgeAssetSchema = type({
38
+ chainId: ChainIdSchema,
39
+ address: string(),
40
+ symbol: string(),
41
+ name: string(),
42
+ decimals: number(),
43
+ icon: optional(string()),
44
+ });
45
+ const FeeDataSchema = type({
46
+ amount: TruthyDigitStringSchema,
47
+ asset: BridgeAssetSchema,
48
+ });
49
+ const ProtocolSchema = type({
50
+ name: string(),
51
+ displayName: optional(string()),
52
+ icon: optional(string()),
53
+ });
54
+ const StepSchema = type({
55
+ action: enums(Object.values(ActionTypes)),
56
+ srcChainId: ChainIdSchema,
57
+ destChainId: optional(ChainIdSchema),
58
+ srcAsset: BridgeAssetSchema,
59
+ destAsset: BridgeAssetSchema,
60
+ srcAmount: string(),
61
+ destAmount: string(),
62
+ protocol: ProtocolSchema,
63
+ });
64
+ const RefuelDataSchema = StepSchema;
65
+ const QuoteSchema = type({
66
+ requestId: string(),
67
+ srcChainId: ChainIdSchema,
68
+ srcAsset: SwapsTokenObjectSchema,
69
+ srcTokenAmount: string(),
70
+ destChainId: ChainIdSchema,
71
+ destAsset: SwapsTokenObjectSchema,
72
+ destTokenAmount: string(),
73
+ feeData: record(enums(Object.values(FeeType)), FeeDataSchema),
74
+ bridgeId: string(),
75
+ bridges: array(string()),
76
+ steps: array(StepSchema),
77
+ refuel: optional(RefuelDataSchema),
78
+ });
79
+ const TxDataSchema = type({
80
+ chainId: number(),
81
+ to: HexAddressSchema,
82
+ from: HexAddressSchema,
83
+ value: HexStringSchema,
84
+ data: HexStringSchema,
85
+ gasLimit: nullable(number()),
86
+ });
87
+ const QuoteResponseSchema = type({
88
+ quote: QuoteSchema,
89
+ approval: optional(TxDataSchema),
90
+ trade: TxDataSchema,
91
+ estimatedProcessingTimeInSeconds: number(),
92
+ });
93
+ return is(data, QuoteResponseSchema);
31
94
  };
32
- export const FEATURE_FLAG_VALIDATORS = [
33
- {
34
- property: BridgeFlag.EXTENSION_CONFIG,
35
- type: 'object',
36
- validator: (v) => isValidObject(v) &&
37
- 'refreshRate' in v &&
38
- isValidNumber(v.refreshRate) &&
39
- 'maxRefreshCount' in v &&
40
- isValidNumber(v.maxRefreshCount) &&
41
- 'chains' in v &&
42
- isValidObject(v.chains) &&
43
- Object.values(v.chains).every((chain) => isValidObject(chain)) &&
44
- Object.values(v.chains).every((chain) => 'isActiveSrc' in chain &&
45
- 'isActiveDest' in chain &&
46
- typeof chain.isActiveSrc === 'boolean' &&
47
- typeof chain.isActiveDest === 'boolean'),
48
- },
49
- ];
50
- export const TOKEN_AGGREGATOR_VALIDATORS = [
51
- {
52
- property: 'aggregators',
53
- type: 'object',
54
- validator: (v) => isValidObject(v) && Object.values(v).every(isValidString),
55
- },
56
- ];
57
- export const TOKEN_VALIDATORS = [
58
- { property: 'decimals', type: 'number' },
59
- { property: 'address', type: 'string', validator: isValidHexAddress },
60
- {
61
- property: 'symbol',
62
- type: 'string',
63
- validator: (v) => isValidString(v) && v.length <= 12,
64
- },
65
- ];
66
- export const QUOTE_RESPONSE_VALIDATORS = [
67
- { property: 'quote', type: 'object', validator: isValidObject },
68
- { property: 'estimatedProcessingTimeInSeconds', type: 'number' },
69
- {
70
- property: 'approval',
71
- type: 'object|undefined',
72
- validator: (v) => v === undefined || isValidObject(v),
73
- },
74
- { property: 'trade', type: 'object', validator: isValidObject },
75
- ];
76
- export const QUOTE_VALIDATORS = [
77
- { property: 'requestId', type: 'string' },
78
- { property: 'srcTokenAmount', type: 'string' },
79
- { property: 'destTokenAmount', type: 'string' },
80
- { property: 'bridgeId', type: 'string' },
81
- { property: 'bridges', type: 'object', validator: isValidObject },
82
- { property: 'srcChainId', type: 'number' },
83
- { property: 'destChainId', type: 'number' },
84
- { property: 'srcAsset', type: 'object', validator: isValidObject },
85
- { property: 'destAsset', type: 'object', validator: isValidObject },
86
- { property: 'feeData', type: 'object', validator: isValidObject },
87
- ];
88
- export const FEE_DATA_VALIDATORS = [
89
- {
90
- property: 'amount',
91
- type: 'string',
92
- validator: (v) => truthyDigitString(String(v)),
93
- },
94
- { property: 'asset', type: 'object', validator: isValidObject },
95
- ];
96
- export const TX_DATA_VALIDATORS = [
97
- { property: 'chainId', type: 'number' },
98
- { property: 'value', type: 'string', validator: isStrictHexString },
99
- { property: 'gasLimit', type: 'number' },
100
- { property: 'to', type: 'string', validator: isValidHexAddress },
101
- { property: 'from', type: 'string', validator: isValidHexAddress },
102
- { property: 'data', type: 'string', validator: isStrictHexString },
103
- ];
104
95
  //# sourceMappingURL=validators.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.mjs","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidHexAddress as isValidHexAddress_ } from '@metamask/controller-utils';\nimport { isStrictHexString } from '@metamask/utils';\n\nimport type { SwapsTokenObject } from '../constants/tokens';\nimport type {\n FeatureFlagResponse,\n FeeData,\n Quote,\n QuoteResponse,\n TxData,\n} from '../types';\nimport { BridgeFlag } from '../types';\n\nexport const truthyString = (string: string) => Boolean(string?.length);\nexport const truthyDigitString = (string: string) =>\n truthyString(string) && Boolean(string.match(/^\\d+$/u));\n\nexport const isValidNumber = (v: unknown): v is number => typeof v === 'number';\nconst isValidObject = (v: unknown): v is object =>\n typeof v === 'object' && v !== null;\nconst isValidString = (v: unknown): v is string =>\n typeof v === 'string' && v.length > 0;\nconst isValidHexAddress = (v: unknown) =>\n isValidString(v) && isValidHexAddress_(v, { allowNonPrefixed: false });\n\ntype Validator<ExpectedResponse> = {\n property: keyof ExpectedResponse;\n type: string;\n validator?: (value: unknown) => boolean;\n};\n\nexport const validateData = <ExpectedResponse>(\n validators: Validator<ExpectedResponse>[],\n object: unknown,\n urlUsed: string,\n logError = true,\n): object is ExpectedResponse => {\n return validators.every(({ property, type, validator }) => {\n const types = type.split('|');\n const propertyString = String(property);\n\n const valid =\n isValidObject(object) &&\n types.some(\n (_type) =>\n typeof object[propertyString as keyof typeof object] === _type,\n ) &&\n (!validator || validator(object[propertyString as keyof typeof object]));\n\n if (!valid && logError) {\n const value = isValidObject(object)\n ? object[propertyString as keyof typeof object]\n : undefined;\n const typeString = isValidObject(object)\n ? typeof object[propertyString as keyof typeof object]\n : 'undefined';\n\n console.error(\n `response to GET ${urlUsed} invalid for property ${String(property)}; value was:`,\n value,\n '| type was: ',\n typeString,\n );\n }\n return valid;\n });\n};\n\nexport const validateResponse = <ExpectedResponse>(\n validators: Validator<ExpectedResponse>[],\n data: unknown,\n urlUsed: string,\n logError = true,\n): data is ExpectedResponse => {\n return validateData(validators, data, urlUsed, logError);\n};\n\nexport const FEATURE_FLAG_VALIDATORS = [\n {\n property: BridgeFlag.EXTENSION_CONFIG,\n type: 'object',\n validator: (\n v: unknown,\n ): v is Pick<FeatureFlagResponse, BridgeFlag.EXTENSION_CONFIG> =>\n isValidObject(v) &&\n 'refreshRate' in v &&\n isValidNumber(v.refreshRate) &&\n 'maxRefreshCount' in v &&\n isValidNumber(v.maxRefreshCount) &&\n 'chains' in v &&\n isValidObject(v.chains) &&\n Object.values(v.chains).every((chain) => isValidObject(chain)) &&\n Object.values(v.chains).every(\n (chain) =>\n 'isActiveSrc' in chain &&\n 'isActiveDest' in chain &&\n typeof chain.isActiveSrc === 'boolean' &&\n typeof chain.isActiveDest === 'boolean',\n ),\n },\n];\n\nexport const TOKEN_AGGREGATOR_VALIDATORS = [\n {\n property: 'aggregators',\n type: 'object',\n validator: (v: unknown): v is number[] =>\n isValidObject(v) && Object.values(v).every(isValidString),\n },\n];\n\nexport const TOKEN_VALIDATORS: Validator<SwapsTokenObject>[] = [\n { property: 'decimals', type: 'number' },\n { property: 'address', type: 'string', validator: isValidHexAddress },\n {\n property: 'symbol',\n type: 'string',\n validator: (v: unknown) => isValidString(v) && v.length <= 12,\n },\n];\n\nexport const QUOTE_RESPONSE_VALIDATORS: Validator<QuoteResponse>[] = [\n { property: 'quote', type: 'object', validator: isValidObject },\n { property: 'estimatedProcessingTimeInSeconds', type: 'number' },\n {\n property: 'approval',\n type: 'object|undefined',\n validator: (v: unknown) => v === undefined || isValidObject(v),\n },\n { property: 'trade', type: 'object', validator: isValidObject },\n];\n\nexport const QUOTE_VALIDATORS: Validator<Quote>[] = [\n { property: 'requestId', type: 'string' },\n { property: 'srcTokenAmount', type: 'string' },\n { property: 'destTokenAmount', type: 'string' },\n { property: 'bridgeId', type: 'string' },\n { property: 'bridges', type: 'object', validator: isValidObject },\n { property: 'srcChainId', type: 'number' },\n { property: 'destChainId', type: 'number' },\n { property: 'srcAsset', type: 'object', validator: isValidObject },\n { property: 'destAsset', type: 'object', validator: isValidObject },\n { property: 'feeData', type: 'object', validator: isValidObject },\n];\n\nexport const FEE_DATA_VALIDATORS: Validator<FeeData>[] = [\n {\n property: 'amount',\n type: 'string',\n validator: (v: unknown) => truthyDigitString(String(v)),\n },\n { property: 'asset', type: 'object', validator: isValidObject },\n];\n\nexport const TX_DATA_VALIDATORS: Validator<TxData>[] = [\n { property: 'chainId', type: 'number' },\n { property: 'value', type: 'string', validator: isStrictHexString },\n { property: 'gasLimit', type: 'number' },\n { property: 'to', type: 'string', validator: isValidHexAddress },\n { property: 'from', type: 'string', validator: isValidHexAddress },\n { property: 'data', type: 'string', validator: isStrictHexString },\n];\n"]}
1
+ {"version":3,"file":"validators.mjs","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidHexAddress } from '@metamask/controller-utils';\nimport {\n string,\n boolean,\n number,\n type,\n is,\n record,\n array,\n nullable,\n optional,\n enums,\n define,\n intersection,\n size,\n} from '@metamask/superstruct';\nimport { isStrictHexString } from '@metamask/utils';\n\nimport type { SwapsTokenObject } from '../constants/tokens';\nimport type { FeatureFlagResponse, QuoteResponse } from '../types';\nimport { ActionTypes, BridgeFlag, FeeType } from '../types';\n\nconst HexAddressSchema = define('HexAddress', (v: unknown) =>\n isValidHexAddress(v as string, { allowNonPrefixed: false }),\n);\n\nconst HexStringSchema = define('HexString', (v: unknown) =>\n isStrictHexString(v as string),\n);\n\nexport const truthyString = (s: string) => Boolean(s?.length);\nconst TruthyDigitStringSchema = define(\n 'TruthyDigitString',\n (v: unknown) =>\n truthyString(v as string) && Boolean((v as string).match(/^\\d+$/u)),\n);\n\nconst SwapsTokenObjectSchema = type({\n decimals: number(),\n address: intersection([string(), HexAddressSchema]),\n symbol: size(string(), 1, 12),\n});\n\nexport const validateFeatureFlagsResponse = (\n data: unknown,\n): data is FeatureFlagResponse => {\n const ChainConfigurationSchema = type({\n isActiveSrc: boolean(),\n isActiveDest: boolean(),\n });\n\n const ConfigSchema = type({\n refreshRate: number(),\n maxRefreshCount: number(),\n support: boolean(),\n chains: record(string(), ChainConfigurationSchema),\n });\n\n // Create schema for FeatureFlagResponse\n const FeatureFlagResponseSchema = type({\n [BridgeFlag.EXTENSION_CONFIG]: ConfigSchema,\n [BridgeFlag.MOBILE_CONFIG]: ConfigSchema,\n });\n\n return is(data, FeatureFlagResponseSchema);\n};\n\nexport const validateSwapsTokenObject = (\n data: unknown,\n): data is SwapsTokenObject => {\n return is(data, SwapsTokenObjectSchema);\n};\n\nexport const validateQuoteResponse = (data: unknown): data is QuoteResponse => {\n const ChainIdSchema = number();\n\n const BridgeAssetSchema = type({\n chainId: ChainIdSchema,\n address: string(),\n symbol: string(),\n name: string(),\n decimals: number(),\n icon: optional(string()),\n });\n\n const FeeDataSchema = type({\n amount: TruthyDigitStringSchema,\n asset: BridgeAssetSchema,\n });\n\n const ProtocolSchema = type({\n name: string(),\n displayName: optional(string()),\n icon: optional(string()),\n });\n\n const StepSchema = type({\n action: enums(Object.values(ActionTypes)),\n srcChainId: ChainIdSchema,\n destChainId: optional(ChainIdSchema),\n srcAsset: BridgeAssetSchema,\n destAsset: BridgeAssetSchema,\n srcAmount: string(),\n destAmount: string(),\n protocol: ProtocolSchema,\n });\n\n const RefuelDataSchema = StepSchema;\n\n const QuoteSchema = type({\n requestId: string(),\n srcChainId: ChainIdSchema,\n srcAsset: SwapsTokenObjectSchema,\n srcTokenAmount: string(),\n destChainId: ChainIdSchema,\n destAsset: SwapsTokenObjectSchema,\n destTokenAmount: string(),\n feeData: record(enums(Object.values(FeeType)), FeeDataSchema),\n bridgeId: string(),\n bridges: array(string()),\n steps: array(StepSchema),\n refuel: optional(RefuelDataSchema),\n });\n\n const TxDataSchema = type({\n chainId: number(),\n to: HexAddressSchema,\n from: HexAddressSchema,\n value: HexStringSchema,\n data: HexStringSchema,\n gasLimit: nullable(number()),\n });\n\n const QuoteResponseSchema = type({\n quote: QuoteSchema,\n approval: optional(TxDataSchema),\n trade: TxDataSchema,\n estimatedProcessingTimeInSeconds: number(),\n });\n\n return is(data, QuoteResponseSchema);\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/bridge-controller",
3
- "version": "2.0.0",
3
+ "version": "3.0.0",
4
4
  "description": "Manages bridge-related quote fetching functionality for MetaMask",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -47,18 +47,23 @@
47
47
  "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch"
48
48
  },
49
49
  "dependencies": {
50
+ "@ethersproject/address": "^5.7.0",
51
+ "@ethersproject/bignumber": "^5.7.0",
52
+ "@ethersproject/constants": "^5.7.0",
53
+ "@ethersproject/contracts": "^5.7.0",
54
+ "@ethersproject/providers": "^5.7.0",
50
55
  "@metamask/base-controller": "^8.0.0",
51
56
  "@metamask/controller-utils": "^11.5.0",
52
57
  "@metamask/metamask-eth-abis": "^3.1.1",
53
58
  "@metamask/polling-controller": "^12.0.3",
54
- "@metamask/utils": "^11.2.0",
55
- "ethers": "^6.12.0"
59
+ "@metamask/utils": "^11.2.0"
56
60
  },
57
61
  "devDependencies": {
58
62
  "@metamask/accounts-controller": "^24.1.0",
59
63
  "@metamask/auto-changelog": "^3.4.4",
60
64
  "@metamask/eth-json-rpc-provider": "^4.1.8",
61
65
  "@metamask/network-controller": "^22.2.1",
66
+ "@metamask/superstruct": "^3.1.0",
62
67
  "@metamask/transaction-controller": "^46.0.0",
63
68
  "@types/jest": "^27.4.1",
64
69
  "deepmerge": "^4.2.2",