@metamask/bridge-status-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.
- package/CHANGELOG.md +9 -1
- package/dist/utils/bridge-status.cjs +1 -4
- package/dist/utils/bridge-status.cjs.map +1 -1
- package/dist/utils/bridge-status.d.cts.map +1 -1
- package/dist/utils/bridge-status.d.mts.map +1 -1
- package/dist/utils/bridge-status.mjs +2 -5
- package/dist/utils/bridge-status.mjs.map +1 -1
- package/dist/utils/validators.cjs +36 -155
- package/dist/utils/validators.cjs.map +1 -1
- package/dist/utils/validators.d.cts +1 -14
- package/dist/utils/validators.d.cts.map +1 -1
- package/dist/utils/validators.d.mts +1 -14
- package/dist/utils/validators.d.mts.map +1 -1
- package/dist/utils/validators.mjs +34 -151
- package/dist/utils/validators.mjs.map +1 -1
- package/package.json +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [3.0.0]
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **BREAKING:** Bump `@metamask/bridge-controller` to v3.0.0
|
|
15
|
+
- Improve `BridgeStatusController` API response validation readability by using `@metamask/superstruct` ([#5408](https://github.com/MetaMask/core/pull/5408))
|
|
16
|
+
|
|
10
17
|
## [2.0.0]
|
|
11
18
|
|
|
12
19
|
### Changed
|
|
@@ -20,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
20
27
|
|
|
21
28
|
- Initial release ([#5317](https://github.com/MetaMask/core/pull/5317))
|
|
22
29
|
|
|
23
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@
|
|
30
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@3.0.0...HEAD
|
|
31
|
+
[3.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@2.0.0...@metamask/bridge-status-controller@3.0.0
|
|
24
32
|
[2.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@1.0.0...@metamask/bridge-status-controller@2.0.0
|
|
25
33
|
[1.0.0]: https://github.com/MetaMask/core/releases/tag/@metamask/bridge-status-controller@1.0.0
|
|
@@ -30,10 +30,7 @@ const fetchBridgeTxStatus = async (statusRequest, clientId, fetchFn) => {
|
|
|
30
30
|
headers: (0, exports.getClientIdHeader)(clientId),
|
|
31
31
|
});
|
|
32
32
|
// Validate
|
|
33
|
-
|
|
34
|
-
if (!isValid) {
|
|
35
|
-
throw new Error('Invalid response from bridge');
|
|
36
|
-
}
|
|
33
|
+
(0, validators_1.validateBridgeStatusResponse)(rawTxStatus);
|
|
37
34
|
// Return
|
|
38
35
|
return rawTxStatus;
|
|
39
36
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-status.cjs","sourceRoot":"","sources":["../../src/utils/bridge-status.ts"],"names":[],"mappings":";;;AACA,mEAAkE;AAElE,iDAA4D;AAQrD,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC;IACtD,aAAa,EAAE,QAAQ;CACxB,CAAC,CAAC;AAFU,QAAA,iBAAiB,qBAE3B;AAEU,QAAA,sBAAsB,GAAG,GAAG,IAAA,uCAAmB,GAAE,cAAc,CAAC;AAEtE,MAAM,mBAAmB,GAAG,CACjC,aAAyC,EACvB,EAAE;IACpB,MAAM,EAAE,KAAK,EAAE,GAAG,oBAAoB,EAAE,GAAG,aAAa,CAAC;IAEzD,MAAM,6BAA6B,GAAG,MAAM,CAAC,WAAW,CACtD,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QACzD,GAAG;QACH,KAAK,CAAC,QAAQ,EAAE;KACjB,CAAC,CAC+C,CAAC;IAEpD,MAAM,SAAS,GACb,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzD,OAAO;QACL,GAAG,6BAA6B;QAChC,GAAG,SAAS;KACb,CAAC;AACJ,CAAC,CAAC;AAnBW,QAAA,mBAAmB,uBAmB9B;AAEK,MAAM,mBAAmB,GAAG,KAAK,EACtC,aAAyC,EACzC,QAAgB,EAChB,OAAsB,
|
|
1
|
+
{"version":3,"file":"bridge-status.cjs","sourceRoot":"","sources":["../../src/utils/bridge-status.ts"],"names":[],"mappings":";;;AACA,mEAAkE;AAElE,iDAA4D;AAQrD,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC;IACtD,aAAa,EAAE,QAAQ;CACxB,CAAC,CAAC;AAFU,QAAA,iBAAiB,qBAE3B;AAEU,QAAA,sBAAsB,GAAG,GAAG,IAAA,uCAAmB,GAAE,cAAc,CAAC;AAEtE,MAAM,mBAAmB,GAAG,CACjC,aAAyC,EACvB,EAAE;IACpB,MAAM,EAAE,KAAK,EAAE,GAAG,oBAAoB,EAAE,GAAG,aAAa,CAAC;IAEzD,MAAM,6BAA6B,GAAG,MAAM,CAAC,WAAW,CACtD,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QACzD,GAAG;QACH,KAAK,CAAC,QAAQ,EAAE;KACjB,CAAC,CAC+C,CAAC;IAEpD,MAAM,SAAS,GACb,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzD,OAAO;QACL,GAAG,6BAA6B;QAChC,GAAG,SAAS;KACb,CAAC;AACJ,CAAC,CAAC;AAnBW,QAAA,mBAAmB,uBAmB9B;AAEK,MAAM,mBAAmB,GAAG,KAAK,EACtC,aAAyC,EACzC,QAAgB,EAChB,OAAsB,EACG,EAAE;IAC3B,MAAM,gBAAgB,GAAG,IAAA,2BAAmB,EAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAErD,QAAQ;IACR,MAAM,GAAG,GAAG,GAAG,8BAAsB,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAE7D,MAAM,WAAW,GAAY,MAAM,OAAO,CAAC,GAAG,EAAE;QAC9C,OAAO,EAAE,IAAA,yBAAiB,EAAC,QAAQ,CAAC;KACrC,CAAC,CAAC;IAEH,WAAW;IACX,IAAA,yCAA4B,EAAC,WAAW,CAAC,CAAC;IAE1C,SAAS;IACT,OAAO,WAA6B,CAAC;AACvC,CAAC,CAAC;AApBW,QAAA,mBAAmB,uBAoB9B;AAEK,MAAM,6BAA6B,GAAG,CAC3C,KAAY,EACZ,SAAiB,EACW,EAAE;IAC9B,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS;QACT,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;KAC9B,CAAC;AACJ,CAAC,CAAC;AAbW,QAAA,6BAA6B,iCAaxC","sourcesContent":["import type { Quote } from '@metamask/bridge-controller';\nimport { getBridgeApiBaseUrl } from '@metamask/bridge-controller';\n\nimport { validateBridgeStatusResponse } from './validators';\nimport type {\n StatusResponse,\n StatusRequestWithSrcTxHash,\n StatusRequestDto,\n FetchFunction,\n} from '../types';\n\nexport const getClientIdHeader = (clientId: string) => ({\n 'X-Client-Id': clientId,\n});\n\nexport const BRIDGE_STATUS_BASE_URL = `${getBridgeApiBaseUrl()}/getTxStatus`;\n\nexport const getStatusRequestDto = (\n statusRequest: StatusRequestWithSrcTxHash,\n): StatusRequestDto => {\n const { quote, ...statusRequestNoQuote } = statusRequest;\n\n const statusRequestNoQuoteFormatted = Object.fromEntries(\n Object.entries(statusRequestNoQuote).map(([key, value]) => [\n key,\n value.toString(),\n ]),\n ) as unknown as Omit<StatusRequestDto, 'requestId'>;\n\n const requestId: { requestId: string } | Record<string, never> =\n quote?.requestId ? { requestId: quote.requestId } : {};\n\n return {\n ...statusRequestNoQuoteFormatted,\n ...requestId,\n };\n};\n\nexport const fetchBridgeTxStatus = async (\n statusRequest: StatusRequestWithSrcTxHash,\n clientId: string,\n fetchFn: FetchFunction,\n): Promise<StatusResponse> => {\n const statusRequestDto = getStatusRequestDto(statusRequest);\n const params = new URLSearchParams(statusRequestDto);\n\n // Fetch\n const url = `${BRIDGE_STATUS_BASE_URL}?${params.toString()}`;\n\n const rawTxStatus: unknown = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n });\n\n // Validate\n validateBridgeStatusResponse(rawTxStatus);\n\n // Return\n return rawTxStatus as StatusResponse;\n};\n\nexport const getStatusRequestWithSrcTxHash = (\n quote: Quote,\n srcTxHash: string,\n): StatusRequestWithSrcTxHash => {\n return {\n bridgeId: quote.bridgeId,\n srcTxHash,\n bridge: quote.bridges[0],\n srcChainId: quote.srcChainId,\n destChainId: quote.destChainId,\n quote,\n refuel: Boolean(quote.refuel),\n };\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-status.d.cts","sourceRoot":"","sources":["../../src/utils/bridge-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,oCAAoC;AAIzD,OAAO,KAAK,EACV,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,EAChB,aAAa,EACd,qBAAiB;AAElB,eAAO,MAAM,iBAAiB,aAAc,MAAM;;CAEhD,CAAC;AAEH,eAAO,MAAM,sBAAsB,QAAyC,CAAC;AAE7E,eAAO,MAAM,mBAAmB,kBACf,0BAA0B,KACxC,gBAiBF,CAAC;AAEF,eAAO,MAAM,mBAAmB,kBACf,0BAA0B,YAC/B,MAAM,WACP,aAAa,
|
|
1
|
+
{"version":3,"file":"bridge-status.d.cts","sourceRoot":"","sources":["../../src/utils/bridge-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,oCAAoC;AAIzD,OAAO,KAAK,EACV,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,EAChB,aAAa,EACd,qBAAiB;AAElB,eAAO,MAAM,iBAAiB,aAAc,MAAM;;CAEhD,CAAC;AAEH,eAAO,MAAM,sBAAsB,QAAyC,CAAC;AAE7E,eAAO,MAAM,mBAAmB,kBACf,0BAA0B,KACxC,gBAiBF,CAAC;AAEF,eAAO,MAAM,mBAAmB,kBACf,0BAA0B,YAC/B,MAAM,WACP,aAAa,KACrB,QAAQ,cAAc,CAgBxB,CAAC;AAEF,eAAO,MAAM,6BAA6B,UACjC,KAAK,aACD,MAAM,KAChB,0BAUF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-status.d.mts","sourceRoot":"","sources":["../../src/utils/bridge-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,oCAAoC;AAIzD,OAAO,KAAK,EACV,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,EAChB,aAAa,EACd,qBAAiB;AAElB,eAAO,MAAM,iBAAiB,aAAc,MAAM;;CAEhD,CAAC;AAEH,eAAO,MAAM,sBAAsB,QAAyC,CAAC;AAE7E,eAAO,MAAM,mBAAmB,kBACf,0BAA0B,KACxC,gBAiBF,CAAC;AAEF,eAAO,MAAM,mBAAmB,kBACf,0BAA0B,YAC/B,MAAM,WACP,aAAa,
|
|
1
|
+
{"version":3,"file":"bridge-status.d.mts","sourceRoot":"","sources":["../../src/utils/bridge-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,oCAAoC;AAIzD,OAAO,KAAK,EACV,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,EAChB,aAAa,EACd,qBAAiB;AAElB,eAAO,MAAM,iBAAiB,aAAc,MAAM;;CAEhD,CAAC;AAEH,eAAO,MAAM,sBAAsB,QAAyC,CAAC;AAE7E,eAAO,MAAM,mBAAmB,kBACf,0BAA0B,KACxC,gBAiBF,CAAC;AAEF,eAAO,MAAM,mBAAmB,kBACf,0BAA0B,YAC/B,MAAM,WACP,aAAa,KACrB,QAAQ,cAAc,CAgBxB,CAAC;AAEF,eAAO,MAAM,6BAA6B,UACjC,KAAK,aACD,MAAM,KAChB,0BAUF,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getBridgeApiBaseUrl } from "@metamask/bridge-controller";
|
|
2
|
-
import {
|
|
2
|
+
import { validateBridgeStatusResponse } from "./validators.mjs";
|
|
3
3
|
export const getClientIdHeader = (clientId) => ({
|
|
4
4
|
'X-Client-Id': clientId,
|
|
5
5
|
});
|
|
@@ -25,10 +25,7 @@ export const fetchBridgeTxStatus = async (statusRequest, clientId, fetchFn) => {
|
|
|
25
25
|
headers: getClientIdHeader(clientId),
|
|
26
26
|
});
|
|
27
27
|
// Validate
|
|
28
|
-
|
|
29
|
-
if (!isValid) {
|
|
30
|
-
throw new Error('Invalid response from bridge');
|
|
31
|
-
}
|
|
28
|
+
validateBridgeStatusResponse(rawTxStatus);
|
|
32
29
|
// Return
|
|
33
30
|
return rawTxStatus;
|
|
34
31
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-status.mjs","sourceRoot":"","sources":["../../src/utils/bridge-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,oCAAoC;AAElE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"bridge-status.mjs","sourceRoot":"","sources":["../../src/utils/bridge-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,oCAAoC;AAElE,OAAO,EAAE,4BAA4B,EAAE,yBAAqB;AAQ5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC;IACtD,aAAa,EAAE,QAAQ;CACxB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,mBAAmB,EAAE,cAAc,CAAC;AAE7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,aAAyC,EACvB,EAAE;IACpB,MAAM,EAAE,KAAK,EAAE,GAAG,oBAAoB,EAAE,GAAG,aAAa,CAAC;IAEzD,MAAM,6BAA6B,GAAG,MAAM,CAAC,WAAW,CACtD,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QACzD,GAAG;QACH,KAAK,CAAC,QAAQ,EAAE;KACjB,CAAC,CAC+C,CAAC;IAEpD,MAAM,SAAS,GACb,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzD,OAAO;QACL,GAAG,6BAA6B;QAChC,GAAG,SAAS;KACb,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,aAAyC,EACzC,QAAgB,EAChB,OAAsB,EACG,EAAE;IAC3B,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAErD,QAAQ;IACR,MAAM,GAAG,GAAG,GAAG,sBAAsB,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAE7D,MAAM,WAAW,GAAY,MAAM,OAAO,CAAC,GAAG,EAAE;QAC9C,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC;KACrC,CAAC,CAAC;IAEH,WAAW;IACX,4BAA4B,CAAC,WAAW,CAAC,CAAC;IAE1C,SAAS;IACT,OAAO,WAA6B,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,KAAY,EACZ,SAAiB,EACW,EAAE;IAC9B,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS;QACT,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;KAC9B,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { Quote } from '@metamask/bridge-controller';\nimport { getBridgeApiBaseUrl } from '@metamask/bridge-controller';\n\nimport { validateBridgeStatusResponse } from './validators';\nimport type {\n StatusResponse,\n StatusRequestWithSrcTxHash,\n StatusRequestDto,\n FetchFunction,\n} from '../types';\n\nexport const getClientIdHeader = (clientId: string) => ({\n 'X-Client-Id': clientId,\n});\n\nexport const BRIDGE_STATUS_BASE_URL = `${getBridgeApiBaseUrl()}/getTxStatus`;\n\nexport const getStatusRequestDto = (\n statusRequest: StatusRequestWithSrcTxHash,\n): StatusRequestDto => {\n const { quote, ...statusRequestNoQuote } = statusRequest;\n\n const statusRequestNoQuoteFormatted = Object.fromEntries(\n Object.entries(statusRequestNoQuote).map(([key, value]) => [\n key,\n value.toString(),\n ]),\n ) as unknown as Omit<StatusRequestDto, 'requestId'>;\n\n const requestId: { requestId: string } | Record<string, never> =\n quote?.requestId ? { requestId: quote.requestId } : {};\n\n return {\n ...statusRequestNoQuoteFormatted,\n ...requestId,\n };\n};\n\nexport const fetchBridgeTxStatus = async (\n statusRequest: StatusRequestWithSrcTxHash,\n clientId: string,\n fetchFn: FetchFunction,\n): Promise<StatusResponse> => {\n const statusRequestDto = getStatusRequestDto(statusRequest);\n const params = new URLSearchParams(statusRequestDto);\n\n // Fetch\n const url = `${BRIDGE_STATUS_BASE_URL}?${params.toString()}`;\n\n const rawTxStatus: unknown = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n });\n\n // Validate\n validateBridgeStatusResponse(rawTxStatus);\n\n // Return\n return rawTxStatus as StatusResponse;\n};\n\nexport const getStatusRequestWithSrcTxHash = (\n quote: Quote,\n srcTxHash: string,\n): StatusRequestWithSrcTxHash => {\n return {\n bridgeId: quote.bridgeId,\n srcTxHash,\n bridge: quote.bridges[0],\n srcChainId: quote.srcChainId,\n destChainId: quote.destChainId,\n quote,\n refuel: Boolean(quote.refuel),\n };\n};\n"]}
|
|
@@ -1,161 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const
|
|
5
|
-
const bridge_status_1 = require("./bridge-status.cjs");
|
|
3
|
+
exports.validateBridgeStatusResponse = void 0;
|
|
4
|
+
const superstruct_1 = require("@metamask/superstruct");
|
|
6
5
|
const types_1 = require("../types.cjs");
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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;
|
|
6
|
+
const validateBridgeStatusResponse = (data) => {
|
|
7
|
+
const ChainIdSchema = (0, superstruct_1.union)([(0, superstruct_1.number)(), (0, superstruct_1.string)()]);
|
|
8
|
+
const AssetSchema = (0, superstruct_1.type)({
|
|
9
|
+
chainId: ChainIdSchema,
|
|
10
|
+
address: (0, superstruct_1.string)(),
|
|
11
|
+
symbol: (0, superstruct_1.string)(),
|
|
12
|
+
name: (0, superstruct_1.string)(),
|
|
13
|
+
decimals: (0, superstruct_1.number)(),
|
|
14
|
+
icon: (0, superstruct_1.optional)((0, superstruct_1.nullable)((0, superstruct_1.string)())),
|
|
27
15
|
});
|
|
16
|
+
const EmptyObjectSchema = (0, superstruct_1.object)({});
|
|
17
|
+
const SrcChainStatusSchema = (0, superstruct_1.type)({
|
|
18
|
+
chainId: ChainIdSchema,
|
|
19
|
+
txHash: (0, superstruct_1.optional)((0, superstruct_1.string)()),
|
|
20
|
+
amount: (0, superstruct_1.optional)((0, superstruct_1.string)()),
|
|
21
|
+
token: (0, superstruct_1.optional)((0, superstruct_1.union)([EmptyObjectSchema, AssetSchema])),
|
|
22
|
+
});
|
|
23
|
+
const DestChainStatusSchema = (0, superstruct_1.type)({
|
|
24
|
+
chainId: ChainIdSchema,
|
|
25
|
+
txHash: (0, superstruct_1.optional)((0, superstruct_1.string)()),
|
|
26
|
+
amount: (0, superstruct_1.optional)((0, superstruct_1.string)()),
|
|
27
|
+
token: (0, superstruct_1.optional)((0, superstruct_1.union)([EmptyObjectSchema, AssetSchema])),
|
|
28
|
+
});
|
|
29
|
+
const RefuelStatusResponseSchema = (0, superstruct_1.object)();
|
|
30
|
+
const StatusResponseSchema = (0, superstruct_1.type)({
|
|
31
|
+
status: (0, superstruct_1.enums)(Object.values(types_1.StatusTypes)),
|
|
32
|
+
srcChain: SrcChainStatusSchema,
|
|
33
|
+
destChain: (0, superstruct_1.optional)(DestChainStatusSchema),
|
|
34
|
+
bridge: (0, superstruct_1.optional)((0, superstruct_1.enums)(Object.values(types_1.BridgeId))),
|
|
35
|
+
isExpectedToken: (0, superstruct_1.optional)((0, superstruct_1.boolean)()),
|
|
36
|
+
isUnrecognizedRouterAddress: (0, superstruct_1.optional)((0, superstruct_1.boolean)()),
|
|
37
|
+
refuel: (0, superstruct_1.optional)(RefuelStatusResponseSchema),
|
|
38
|
+
});
|
|
39
|
+
(0, superstruct_1.assert)(data, StatusResponseSchema);
|
|
28
40
|
};
|
|
29
|
-
exports.
|
|
30
|
-
const validateResponse = (validators, data, urlUsed) => {
|
|
31
|
-
if (data === null || data === undefined) {
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
return (0, exports.validateData)(validators, data, urlUsed);
|
|
35
|
-
};
|
|
36
|
-
exports.validateResponse = validateResponse;
|
|
37
|
-
const assetValidators = [
|
|
38
|
-
{
|
|
39
|
-
property: 'chainId',
|
|
40
|
-
type: 'number',
|
|
41
|
-
validator: (v) => typeof v === 'number',
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
property: 'address',
|
|
45
|
-
type: 'string',
|
|
46
|
-
validator: (v) => (0, controller_utils_1.isValidHexAddress)(v),
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
property: 'symbol',
|
|
50
|
-
type: 'string',
|
|
51
|
-
validator: (v) => typeof v === 'string',
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
property: 'name',
|
|
55
|
-
type: 'string',
|
|
56
|
-
validator: (v) => typeof v === 'string',
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
property: 'decimals',
|
|
60
|
-
type: 'number',
|
|
61
|
-
validator: (v) => typeof v === 'number',
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
property: 'icon',
|
|
65
|
-
// typeof null === 'object'
|
|
66
|
-
type: 'string|undefined|object',
|
|
67
|
-
validator: (v) => v === undefined || v === null || typeof v === 'string',
|
|
68
|
-
},
|
|
69
|
-
];
|
|
70
|
-
const assetValidator = (v) => (0, exports.validateResponse)(assetValidators, v, bridge_status_1.BRIDGE_STATUS_BASE_URL);
|
|
71
|
-
const srcChainStatusValidators = [
|
|
72
|
-
{
|
|
73
|
-
property: 'chainId',
|
|
74
|
-
// For some reason, API returns destChain.chainId as a string, it's a number everywhere else
|
|
75
|
-
type: 'number|string',
|
|
76
|
-
validator: (v) => typeof v === 'number' || typeof v === 'string',
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
property: 'txHash',
|
|
80
|
-
type: 'string',
|
|
81
|
-
validator: exports.validHex,
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
property: 'amount',
|
|
85
|
-
type: 'string|undefined',
|
|
86
|
-
validator: (v) => v === undefined || typeof v === 'string',
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
property: 'token',
|
|
90
|
-
type: 'object|undefined',
|
|
91
|
-
validator: (v) => v === undefined ||
|
|
92
|
-
(v && typeof v === 'object' && Object.keys(v).length === 0) ||
|
|
93
|
-
assetValidator(v),
|
|
94
|
-
},
|
|
95
|
-
];
|
|
96
|
-
const srcChainStatusValidator = (v) => (0, exports.validateResponse)(srcChainStatusValidators, v, bridge_status_1.BRIDGE_STATUS_BASE_URL);
|
|
97
|
-
const destChainStatusValidators = [
|
|
98
|
-
{
|
|
99
|
-
property: 'chainId',
|
|
100
|
-
// For some reason, API returns destChain.chainId as a string, it's a number everywhere else
|
|
101
|
-
type: 'number|string',
|
|
102
|
-
validator: (v) => typeof v === 'number' || typeof v === 'string',
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
property: 'amount',
|
|
106
|
-
type: 'string|undefined',
|
|
107
|
-
validator: (v) => v === undefined || typeof v === 'string',
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
property: 'txHash',
|
|
111
|
-
type: 'string|undefined',
|
|
112
|
-
validator: (v) => v === undefined || typeof v === 'string',
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
property: 'token',
|
|
116
|
-
type: 'object|undefined',
|
|
117
|
-
validator: (v) => v === undefined ||
|
|
118
|
-
(v && typeof v === 'object' && Object.keys(v).length === 0) ||
|
|
119
|
-
assetValidator(v),
|
|
120
|
-
},
|
|
121
|
-
];
|
|
122
|
-
const destChainStatusValidator = (v) => (0, exports.validateResponse)(destChainStatusValidators, v, bridge_status_1.BRIDGE_STATUS_BASE_URL);
|
|
123
|
-
exports.validators = [
|
|
124
|
-
{
|
|
125
|
-
property: 'status',
|
|
126
|
-
type: 'string',
|
|
127
|
-
validator: (v) => Object.values(types_1.StatusTypes).includes(v),
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
property: 'srcChain',
|
|
131
|
-
type: 'object',
|
|
132
|
-
validator: srcChainStatusValidator,
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
property: 'destChain',
|
|
136
|
-
type: 'object|undefined',
|
|
137
|
-
validator: (v) => v === undefined || destChainStatusValidator(v),
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
property: 'bridge',
|
|
141
|
-
type: 'string|undefined',
|
|
142
|
-
validator: (v) => v === undefined || Object.values(types_1.BridgeId).includes(v),
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
property: 'isExpectedToken',
|
|
146
|
-
type: 'boolean|undefined',
|
|
147
|
-
validator: (v) => v === undefined || typeof v === 'boolean',
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
property: 'isUnrecognizedRouterAddress',
|
|
151
|
-
type: 'boolean|undefined',
|
|
152
|
-
validator: (v) => v === undefined || typeof v === 'boolean',
|
|
153
|
-
},
|
|
154
|
-
// TODO: add refuel validator
|
|
155
|
-
// {
|
|
156
|
-
// property: 'refuel',
|
|
157
|
-
// type: 'object',
|
|
158
|
-
// validator: (v: unknown) => Object.values(RefuelStatusResponse).includes(v),
|
|
159
|
-
// },
|
|
160
|
-
];
|
|
41
|
+
exports.validateBridgeStatusResponse = validateBridgeStatusResponse;
|
|
161
42
|
//# sourceMappingURL=validators.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.cjs","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":";;;AAAA,iEAA+D;AAE/D,uDAAyD;AAEzD,wCAAiD;AAQ1C,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAE,EAAE,CACzC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;AADzD,QAAA,QAAQ,YACiD;AACtE,MAAM,aAAa,GAAG,CAAC,CAAU,EAAe,EAAE,CAChD,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC;AAE/B,MAAM,YAAY,GAAG,CAC1B,UAAyD,EACzD,MAAe,EACf,OAAe,EACf,QAAQ,GAAG,IAAI,EACa,EAAE;IAC9B,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAExC,MAAM,KAAK,GACT,aAAa,CAAC,MAAM,CAAC;YACrB,KAAK,CAAC,IAAI,CACR,CAAC,KAAK,EAAE,EAAE,CACR,OAAO,MAAM,CAAC,cAAqC,CAAC,KAAK,KAAK,CACjE;YACD,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC,cAAqC,CAAC,CAAC,CAAC,CAAC;QAE3E,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE;YACtB,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC;gBACjC,CAAC,CAAC,MAAM,CAAC,cAAqC,CAAC;gBAC/C,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC;gBACtC,CAAC,CAAC,OAAO,MAAM,CAAC,cAAqC,CAAC;gBACtD,CAAC,CAAC,WAAW,CAAC;YAEhB,OAAO,CAAC,KAAK,CACX,mBAAmB,OAAO,yBAAyB,MAAM,CAAC,QAAQ,CAAC,cAAc,EACjF,KAAK,EACL,cAAc,EACd,UAAU,CACX,CAAC;SACH;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAnCW,QAAA,YAAY,gBAmCvB;AAEK,MAAM,gBAAgB,GAAG,CAC9B,UAAyD,EACzD,IAAa,EACb,OAAe,EACW,EAAE;IAC5B,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE;QACvC,OAAO,KAAK,CAAC;KACd;IACD,OAAO,IAAA,oBAAY,EAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC,CAAC;AATW,QAAA,gBAAgB,oBAS3B;AAEF,MAAM,eAAe,GAAG;IACtB;QACE,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ;KAC9D;IACD;QACE,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,CAAC,CAAU,EAAe,EAAE,CAAC,IAAA,oCAAiB,EAAC,CAAW,CAAC;KACvE;IACD;QACE,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ;KAC9D;IACD;QACE,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ;KAC9D;IACD;QACE,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ;KAC9D;IACD;QACE,QAAQ,EAAE,MAAM;QAChB,2BAA2B;QAC3B,IAAI,EAAE,yBAAyB;QAC/B,SAAS,EAAE,CAAC,CAAU,EAAoC,EAAE,CAC1D,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;KACzD;CACF,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,CAAU,EAAc,EAAE,CAChD,IAAA,wBAAgB,EAAiB,eAAe,EAAE,CAAC,EAAE,sCAAsB,CAAC,CAAC;AAE/E,MAAM,wBAAwB,GAAG;IAC/B;QACE,QAAQ,EAAE,SAAS;QACnB,4FAA4F;QAC5F,IAAI,EAAE,eAAe;QACrB,SAAS,EAAE,CAAC,CAAU,EAAwB,EAAE,CAC9C,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;KACjD;IACD;QACE,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,gBAAQ;KACpB;IACD;QACE,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,CAAC,CAAU,EAA2B,EAAE,CACjD,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,QAAQ;KAC3C;IACD;QACE,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,CAAC,CAAU,EAA2B,EAAE,CACjD,CAAC,KAAK,SAAS;YACf,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;YAC3D,cAAc,CAAC,CAAC,CAAC;KACpB;CACF,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,CAAU,EAAuB,EAAE,CAClE,IAAA,wBAAgB,EACd,wBAAwB,EACxB,CAAC,EACD,sCAAsB,CACvB,CAAC;AAEJ,MAAM,yBAAyB,GAAG;IAChC;QACE,QAAQ,EAAE,SAAS;QACnB,4FAA4F;QAC5F,IAAI,EAAE,eAAe;QACrB,SAAS,EAAE,CAAC,CAAU,EAAwB,EAAE,CAC9C,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;KACjD;IACD;QACE,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,CAAC,CAAU,EAA2B,EAAE,CACjD,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,QAAQ;KAC3C;IACD;QACE,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,CAAC,CAAU,EAA2B,EAAE,CACjD,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,QAAQ;KAC3C;IACD;QACE,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,CAAC,CAAU,EAA0B,EAAE,CAChD,CAAC,KAAK,SAAS;YACf,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;YAC3D,cAAc,CAAC,CAAC,CAAC;KACpB;CACF,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,CAAU,EAAwB,EAAE,CACpE,IAAA,wBAAgB,EACd,yBAAyB,EACzB,CAAC,EACD,sCAAsB,CACvB,CAAC;AAES,QAAA,UAAU,GAAG;IACxB;QACE,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,CAAC,CAAU,EAAoB,EAAE,CAC1C,MAAM,CAAC,MAAM,CAAC,mBAAW,CAAC,CAAC,QAAQ,CAAC,CAAgB,CAAC;KACxD;IACD;QACE,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,uBAAuB;KACnC;IACD;QACE,QAAQ,EAAE,WAAW;QACrB,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,CAAC,CAAU,EAAyB,EAAE,CAC/C,CAAC,KAAK,SAAS,IAAI,wBAAwB,CAAC,CAAC,CAAC;KACjD;IACD;QACE,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,CAAC,CAAU,EAA6B,EAAE,CACnD,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,QAAQ,CAAC,CAAa,CAAC;KACrE;IACD;QACE,QAAQ,EAAE,iBAAiB;QAC3B,IAAI,EAAE,mBAAmB;QACzB,SAAS,EAAE,CAAC,CAAU,EAA4B,EAAE,CAClD,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,SAAS;KAC5C;IACD;QACE,QAAQ,EAAE,6BAA6B;QACvC,IAAI,EAAE,mBAAmB;QACzB,SAAS,EAAE,CAAC,CAAU,EAA4B,EAAE,CAClD,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,SAAS;KAC5C;IACD,6BAA6B;IAC7B,IAAI;IACJ,wBAAwB;IACxB,oBAAoB;IACpB,gFAAgF;IAChF,KAAK;CACN,CAAC","sourcesContent":["import { isValidHexAddress } from '@metamask/controller-utils';\n\nimport { BRIDGE_STATUS_BASE_URL } from './bridge-status';\nimport type { DestChainStatus, SrcChainStatus, Asset } from '../types';\nimport { BridgeId, StatusTypes } from '../types';\n\ntype Validator<ExpectedResponse, DataToValidate> = {\n property: keyof ExpectedResponse | string;\n type: string;\n validator: (value: DataToValidate) => boolean;\n};\n\nexport const validHex = (value: unknown) =>\n typeof value === 'string' && Boolean(value.match(/^0x[a-f0-9]+$/u));\nconst isValidObject = (v: unknown): v is object =>\n typeof v === 'object' && v !== null;\n\nexport const validateData = <ExpectedResponse, DataToValidate>(\n validators: Validator<ExpectedResponse, DataToValidate>[],\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, DataToValidate>(\n validators: Validator<ExpectedResponse, DataToValidate>[],\n data: unknown,\n urlUsed: string,\n): data is ExpectedResponse => {\n if (data === null || data === undefined) {\n return false;\n }\n return validateData(validators, data, urlUsed);\n};\n\nconst assetValidators = [\n {\n property: 'chainId',\n type: 'number',\n validator: (v: unknown): v is number => typeof v === 'number',\n },\n {\n property: 'address',\n type: 'string',\n validator: (v: unknown): v is string => isValidHexAddress(v as string),\n },\n {\n property: 'symbol',\n type: 'string',\n validator: (v: unknown): v is string => typeof v === 'string',\n },\n {\n property: 'name',\n type: 'string',\n validator: (v: unknown): v is string => typeof v === 'string',\n },\n {\n property: 'decimals',\n type: 'number',\n validator: (v: unknown): v is number => typeof v === 'number',\n },\n {\n property: 'icon',\n // typeof null === 'object'\n type: 'string|undefined|object',\n validator: (v: unknown): v is string | undefined | object =>\n v === undefined || v === null || typeof v === 'string',\n },\n];\n\nconst assetValidator = (v: unknown): v is Asset =>\n validateResponse<Asset, unknown>(assetValidators, v, BRIDGE_STATUS_BASE_URL);\n\nconst srcChainStatusValidators = [\n {\n property: 'chainId',\n // For some reason, API returns destChain.chainId as a string, it's a number everywhere else\n type: 'number|string',\n validator: (v: unknown): v is number | string =>\n typeof v === 'number' || typeof v === 'string',\n },\n {\n property: 'txHash',\n type: 'string',\n validator: validHex,\n },\n {\n property: 'amount',\n type: 'string|undefined',\n validator: (v: unknown): v is string | undefined =>\n v === undefined || typeof v === 'string',\n },\n {\n property: 'token',\n type: 'object|undefined',\n validator: (v: unknown): v is object | undefined =>\n v === undefined ||\n (v && typeof v === 'object' && Object.keys(v).length === 0) ||\n assetValidator(v),\n },\n];\n\nconst srcChainStatusValidator = (v: unknown): v is SrcChainStatus =>\n validateResponse<SrcChainStatus, unknown>(\n srcChainStatusValidators,\n v,\n BRIDGE_STATUS_BASE_URL,\n );\n\nconst destChainStatusValidators = [\n {\n property: 'chainId',\n // For some reason, API returns destChain.chainId as a string, it's a number everywhere else\n type: 'number|string',\n validator: (v: unknown): v is number | string =>\n typeof v === 'number' || typeof v === 'string',\n },\n {\n property: 'amount',\n type: 'string|undefined',\n validator: (v: unknown): v is string | undefined =>\n v === undefined || typeof v === 'string',\n },\n {\n property: 'txHash',\n type: 'string|undefined',\n validator: (v: unknown): v is string | undefined =>\n v === undefined || typeof v === 'string',\n },\n {\n property: 'token',\n type: 'object|undefined',\n validator: (v: unknown): v is Asset | undefined =>\n v === undefined ||\n (v && typeof v === 'object' && Object.keys(v).length === 0) ||\n assetValidator(v),\n },\n];\n\nconst destChainStatusValidator = (v: unknown): v is DestChainStatus =>\n validateResponse<DestChainStatus, unknown>(\n destChainStatusValidators,\n v,\n BRIDGE_STATUS_BASE_URL,\n );\n\nexport const validators = [\n {\n property: 'status',\n type: 'string',\n validator: (v: unknown): v is StatusTypes =>\n Object.values(StatusTypes).includes(v as StatusTypes),\n },\n {\n property: 'srcChain',\n type: 'object',\n validator: srcChainStatusValidator,\n },\n {\n property: 'destChain',\n type: 'object|undefined',\n validator: (v: unknown): v is object | unknown =>\n v === undefined || destChainStatusValidator(v),\n },\n {\n property: 'bridge',\n type: 'string|undefined',\n validator: (v: unknown): v is BridgeId | undefined =>\n v === undefined || Object.values(BridgeId).includes(v as BridgeId),\n },\n {\n property: 'isExpectedToken',\n type: 'boolean|undefined',\n validator: (v: unknown): v is boolean | undefined =>\n v === undefined || typeof v === 'boolean',\n },\n {\n property: 'isUnrecognizedRouterAddress',\n type: 'boolean|undefined',\n validator: (v: unknown): v is boolean | undefined =>\n v === undefined || typeof v === 'boolean',\n },\n // TODO: add refuel validator\n // {\n // property: 'refuel',\n // type: 'object',\n // validator: (v: unknown) => Object.values(RefuelStatusResponse).includes(v),\n // },\n];\n"]}
|
|
1
|
+
{"version":3,"file":"validators.cjs","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":";;;AAAA,uDAW+B;AAE/B,wCAAiD;AAE1C,MAAM,4BAA4B,GAAG,CAAC,IAAa,EAAE,EAAE;IAC5D,MAAM,aAAa,GAAG,IAAA,mBAAK,EAAC,CAAC,IAAA,oBAAM,GAAE,EAAE,IAAA,oBAAM,GAAE,CAAC,CAAC,CAAC;IAElD,MAAM,WAAW,GAAG,IAAA,kBAAI,EAAC;QACvB,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,IAAA,oBAAM,GAAE;QACjB,MAAM,EAAE,IAAA,oBAAM,GAAE;QAChB,IAAI,EAAE,IAAA,oBAAM,GAAE;QACd,QAAQ,EAAE,IAAA,oBAAM,GAAE;QAClB,IAAI,EAAE,IAAA,sBAAQ,EAAC,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC,CAAC;KACnC,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,IAAA,oBAAM,EAAC,EAAE,CAAC,CAAC;IAErC,MAAM,oBAAoB,GAAG,IAAA,kBAAI,EAAC;QAChC,OAAO,EAAE,aAAa;QACtB,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;QAC1B,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;QAC1B,KAAK,EAAE,IAAA,sBAAQ,EAAC,IAAA,mBAAK,EAAC,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC;KACzD,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,IAAA,kBAAI,EAAC;QACjC,OAAO,EAAE,aAAa;QACtB,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;QAC1B,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;QAC1B,KAAK,EAAE,IAAA,sBAAQ,EAAC,IAAA,mBAAK,EAAC,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC;KACzD,CAAC,CAAC;IAEH,MAAM,0BAA0B,GAAG,IAAA,oBAAM,GAAE,CAAC;IAE5C,MAAM,oBAAoB,GAAG,IAAA,kBAAI,EAAC;QAChC,MAAM,EAAE,IAAA,mBAAK,EAAC,MAAM,CAAC,MAAM,CAAC,mBAAW,CAAC,CAAC;QACzC,QAAQ,EAAE,oBAAoB;QAC9B,SAAS,EAAE,IAAA,sBAAQ,EAAC,qBAAqB,CAAC;QAC1C,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,mBAAK,EAAC,MAAM,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,CAAC;QAChD,eAAe,EAAE,IAAA,sBAAQ,EAAC,IAAA,qBAAO,GAAE,CAAC;QACpC,2BAA2B,EAAE,IAAA,sBAAQ,EAAC,IAAA,qBAAO,GAAE,CAAC;QAChD,MAAM,EAAE,IAAA,sBAAQ,EAAC,0BAA0B,CAAC;KAC7C,CAAC,CAAC;IAEH,IAAA,oBAAM,EAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;AACrC,CAAC,CAAC;AAzCW,QAAA,4BAA4B,gCAyCvC","sourcesContent":["import {\n object,\n string,\n boolean,\n number,\n optional,\n enums,\n union,\n type,\n nullable,\n assert,\n} from '@metamask/superstruct';\n\nimport { BridgeId, StatusTypes } from '../types';\n\nexport const validateBridgeStatusResponse = (data: unknown) => {\n const ChainIdSchema = union([number(), string()]);\n\n const AssetSchema = type({\n chainId: ChainIdSchema,\n address: string(),\n symbol: string(),\n name: string(),\n decimals: number(),\n icon: optional(nullable(string())),\n });\n\n const EmptyObjectSchema = object({});\n\n const SrcChainStatusSchema = type({\n chainId: ChainIdSchema,\n txHash: optional(string()),\n amount: optional(string()),\n token: optional(union([EmptyObjectSchema, AssetSchema])),\n });\n\n const DestChainStatusSchema = type({\n chainId: ChainIdSchema,\n txHash: optional(string()),\n amount: optional(string()),\n token: optional(union([EmptyObjectSchema, AssetSchema])),\n });\n\n const RefuelStatusResponseSchema = object();\n\n const StatusResponseSchema = type({\n status: enums(Object.values(StatusTypes)),\n srcChain: SrcChainStatusSchema,\n destChain: optional(DestChainStatusSchema),\n bridge: optional(enums(Object.values(BridgeId))),\n isExpectedToken: optional(boolean()),\n isUnrecognizedRouterAddress: optional(boolean()),\n refuel: optional(RefuelStatusResponseSchema),\n });\n\n assert(data, StatusResponseSchema);\n};\n"]}
|
|
@@ -1,15 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
property: keyof ExpectedResponse | string;
|
|
3
|
-
type: string;
|
|
4
|
-
validator: (value: DataToValidate) => boolean;
|
|
5
|
-
};
|
|
6
|
-
export declare const validHex: (value: unknown) => boolean;
|
|
7
|
-
export declare const validateData: <ExpectedResponse, DataToValidate>(validators: Validator<ExpectedResponse, DataToValidate>[], object: unknown, urlUsed: string, logError?: boolean) => object is ExpectedResponse;
|
|
8
|
-
export declare const validateResponse: <ExpectedResponse, DataToValidate>(validators: Validator<ExpectedResponse, DataToValidate>[], data: unknown, urlUsed: string) => data is ExpectedResponse;
|
|
9
|
-
export declare const validators: {
|
|
10
|
-
property: string;
|
|
11
|
-
type: string;
|
|
12
|
-
validator: (v: unknown) => v is unknown;
|
|
13
|
-
}[];
|
|
14
|
-
export {};
|
|
1
|
+
export declare const validateBridgeStatusResponse: (data: unknown) => void;
|
|
15
2
|
//# sourceMappingURL=validators.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.cts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validators.d.cts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,4BAA4B,SAAU,OAAO,SAyCzD,CAAC"}
|
|
@@ -1,15 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
property: keyof ExpectedResponse | string;
|
|
3
|
-
type: string;
|
|
4
|
-
validator: (value: DataToValidate) => boolean;
|
|
5
|
-
};
|
|
6
|
-
export declare const validHex: (value: unknown) => boolean;
|
|
7
|
-
export declare const validateData: <ExpectedResponse, DataToValidate>(validators: Validator<ExpectedResponse, DataToValidate>[], object: unknown, urlUsed: string, logError?: boolean) => object is ExpectedResponse;
|
|
8
|
-
export declare const validateResponse: <ExpectedResponse, DataToValidate>(validators: Validator<ExpectedResponse, DataToValidate>[], data: unknown, urlUsed: string) => data is ExpectedResponse;
|
|
9
|
-
export declare const validators: {
|
|
10
|
-
property: string;
|
|
11
|
-
type: string;
|
|
12
|
-
validator: (v: unknown) => v is unknown;
|
|
13
|
-
}[];
|
|
14
|
-
export {};
|
|
1
|
+
export declare const validateBridgeStatusResponse: (data: unknown) => void;
|
|
15
2
|
//# sourceMappingURL=validators.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.mts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validators.d.mts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,4BAA4B,SAAU,OAAO,SAyCzD,CAAC"}
|
|
@@ -1,155 +1,38 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BRIDGE_STATUS_BASE_URL } from "./bridge-status.mjs";
|
|
1
|
+
import { object, string, boolean, number, optional, enums, union, type, nullable, assert } from "@metamask/superstruct";
|
|
3
2
|
import { BridgeId, StatusTypes } from "../types.mjs";
|
|
4
|
-
export const
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
if (!valid && logError) {
|
|
14
|
-
const value = isValidObject(object)
|
|
15
|
-
? object[propertyString]
|
|
16
|
-
: undefined;
|
|
17
|
-
const typeString = isValidObject(object)
|
|
18
|
-
? typeof object[propertyString]
|
|
19
|
-
: 'undefined';
|
|
20
|
-
console.error(`response to GET ${urlUsed} invalid for property ${String(property)}; value was:`, value, '| type was: ', typeString);
|
|
21
|
-
}
|
|
22
|
-
return valid;
|
|
3
|
+
export const validateBridgeStatusResponse = (data) => {
|
|
4
|
+
const ChainIdSchema = union([number(), string()]);
|
|
5
|
+
const AssetSchema = type({
|
|
6
|
+
chainId: ChainIdSchema,
|
|
7
|
+
address: string(),
|
|
8
|
+
symbol: string(),
|
|
9
|
+
name: string(),
|
|
10
|
+
decimals: number(),
|
|
11
|
+
icon: optional(nullable(string())),
|
|
23
12
|
});
|
|
13
|
+
const EmptyObjectSchema = object({});
|
|
14
|
+
const SrcChainStatusSchema = type({
|
|
15
|
+
chainId: ChainIdSchema,
|
|
16
|
+
txHash: optional(string()),
|
|
17
|
+
amount: optional(string()),
|
|
18
|
+
token: optional(union([EmptyObjectSchema, AssetSchema])),
|
|
19
|
+
});
|
|
20
|
+
const DestChainStatusSchema = type({
|
|
21
|
+
chainId: ChainIdSchema,
|
|
22
|
+
txHash: optional(string()),
|
|
23
|
+
amount: optional(string()),
|
|
24
|
+
token: optional(union([EmptyObjectSchema, AssetSchema])),
|
|
25
|
+
});
|
|
26
|
+
const RefuelStatusResponseSchema = object();
|
|
27
|
+
const StatusResponseSchema = type({
|
|
28
|
+
status: enums(Object.values(StatusTypes)),
|
|
29
|
+
srcChain: SrcChainStatusSchema,
|
|
30
|
+
destChain: optional(DestChainStatusSchema),
|
|
31
|
+
bridge: optional(enums(Object.values(BridgeId))),
|
|
32
|
+
isExpectedToken: optional(boolean()),
|
|
33
|
+
isUnrecognizedRouterAddress: optional(boolean()),
|
|
34
|
+
refuel: optional(RefuelStatusResponseSchema),
|
|
35
|
+
});
|
|
36
|
+
assert(data, StatusResponseSchema);
|
|
24
37
|
};
|
|
25
|
-
export const validateResponse = (validators, data, urlUsed) => {
|
|
26
|
-
if (data === null || data === undefined) {
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
return validateData(validators, data, urlUsed);
|
|
30
|
-
};
|
|
31
|
-
const assetValidators = [
|
|
32
|
-
{
|
|
33
|
-
property: 'chainId',
|
|
34
|
-
type: 'number',
|
|
35
|
-
validator: (v) => typeof v === 'number',
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
property: 'address',
|
|
39
|
-
type: 'string',
|
|
40
|
-
validator: (v) => isValidHexAddress(v),
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
property: 'symbol',
|
|
44
|
-
type: 'string',
|
|
45
|
-
validator: (v) => typeof v === 'string',
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
property: 'name',
|
|
49
|
-
type: 'string',
|
|
50
|
-
validator: (v) => typeof v === 'string',
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
property: 'decimals',
|
|
54
|
-
type: 'number',
|
|
55
|
-
validator: (v) => typeof v === 'number',
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
property: 'icon',
|
|
59
|
-
// typeof null === 'object'
|
|
60
|
-
type: 'string|undefined|object',
|
|
61
|
-
validator: (v) => v === undefined || v === null || typeof v === 'string',
|
|
62
|
-
},
|
|
63
|
-
];
|
|
64
|
-
const assetValidator = (v) => validateResponse(assetValidators, v, BRIDGE_STATUS_BASE_URL);
|
|
65
|
-
const srcChainStatusValidators = [
|
|
66
|
-
{
|
|
67
|
-
property: 'chainId',
|
|
68
|
-
// For some reason, API returns destChain.chainId as a string, it's a number everywhere else
|
|
69
|
-
type: 'number|string',
|
|
70
|
-
validator: (v) => typeof v === 'number' || typeof v === 'string',
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
property: 'txHash',
|
|
74
|
-
type: 'string',
|
|
75
|
-
validator: validHex,
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
property: 'amount',
|
|
79
|
-
type: 'string|undefined',
|
|
80
|
-
validator: (v) => v === undefined || typeof v === 'string',
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
property: 'token',
|
|
84
|
-
type: 'object|undefined',
|
|
85
|
-
validator: (v) => v === undefined ||
|
|
86
|
-
(v && typeof v === 'object' && Object.keys(v).length === 0) ||
|
|
87
|
-
assetValidator(v),
|
|
88
|
-
},
|
|
89
|
-
];
|
|
90
|
-
const srcChainStatusValidator = (v) => validateResponse(srcChainStatusValidators, v, BRIDGE_STATUS_BASE_URL);
|
|
91
|
-
const destChainStatusValidators = [
|
|
92
|
-
{
|
|
93
|
-
property: 'chainId',
|
|
94
|
-
// For some reason, API returns destChain.chainId as a string, it's a number everywhere else
|
|
95
|
-
type: 'number|string',
|
|
96
|
-
validator: (v) => typeof v === 'number' || typeof v === 'string',
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
property: 'amount',
|
|
100
|
-
type: 'string|undefined',
|
|
101
|
-
validator: (v) => v === undefined || typeof v === 'string',
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
property: 'txHash',
|
|
105
|
-
type: 'string|undefined',
|
|
106
|
-
validator: (v) => v === undefined || typeof v === 'string',
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
property: 'token',
|
|
110
|
-
type: 'object|undefined',
|
|
111
|
-
validator: (v) => v === undefined ||
|
|
112
|
-
(v && typeof v === 'object' && Object.keys(v).length === 0) ||
|
|
113
|
-
assetValidator(v),
|
|
114
|
-
},
|
|
115
|
-
];
|
|
116
|
-
const destChainStatusValidator = (v) => validateResponse(destChainStatusValidators, v, BRIDGE_STATUS_BASE_URL);
|
|
117
|
-
export const validators = [
|
|
118
|
-
{
|
|
119
|
-
property: 'status',
|
|
120
|
-
type: 'string',
|
|
121
|
-
validator: (v) => Object.values(StatusTypes).includes(v),
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
property: 'srcChain',
|
|
125
|
-
type: 'object',
|
|
126
|
-
validator: srcChainStatusValidator,
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
property: 'destChain',
|
|
130
|
-
type: 'object|undefined',
|
|
131
|
-
validator: (v) => v === undefined || destChainStatusValidator(v),
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
property: 'bridge',
|
|
135
|
-
type: 'string|undefined',
|
|
136
|
-
validator: (v) => v === undefined || Object.values(BridgeId).includes(v),
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
property: 'isExpectedToken',
|
|
140
|
-
type: 'boolean|undefined',
|
|
141
|
-
validator: (v) => v === undefined || typeof v === 'boolean',
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
property: 'isUnrecognizedRouterAddress',
|
|
145
|
-
type: 'boolean|undefined',
|
|
146
|
-
validator: (v) => v === undefined || typeof v === 'boolean',
|
|
147
|
-
},
|
|
148
|
-
// TODO: add refuel validator
|
|
149
|
-
// {
|
|
150
|
-
// property: 'refuel',
|
|
151
|
-
// type: 'object',
|
|
152
|
-
// validator: (v: unknown) => Object.values(RefuelStatusResponse).includes(v),
|
|
153
|
-
// },
|
|
154
|
-
];
|
|
155
38
|
//# 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 } from '@metamask/controller-utils';\n\nimport { BRIDGE_STATUS_BASE_URL } from './bridge-status';\nimport type { DestChainStatus, SrcChainStatus, Asset } from '../types';\nimport { BridgeId, StatusTypes } from '../types';\n\ntype Validator<ExpectedResponse, DataToValidate> = {\n property: keyof ExpectedResponse | string;\n type: string;\n validator: (value: DataToValidate) => boolean;\n};\n\nexport const validHex = (value: unknown) =>\n typeof value === 'string' && Boolean(value.match(/^0x[a-f0-9]+$/u));\nconst isValidObject = (v: unknown): v is object =>\n typeof v === 'object' && v !== null;\n\nexport const validateData = <ExpectedResponse, DataToValidate>(\n validators: Validator<ExpectedResponse, DataToValidate>[],\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, DataToValidate>(\n validators: Validator<ExpectedResponse, DataToValidate>[],\n data: unknown,\n urlUsed: string,\n): data is ExpectedResponse => {\n if (data === null || data === undefined) {\n return false;\n }\n return validateData(validators, data, urlUsed);\n};\n\nconst assetValidators = [\n {\n property: 'chainId',\n type: 'number',\n validator: (v: unknown): v is number => typeof v === 'number',\n },\n {\n property: 'address',\n type: 'string',\n validator: (v: unknown): v is string => isValidHexAddress(v as string),\n },\n {\n property: 'symbol',\n type: 'string',\n validator: (v: unknown): v is string => typeof v === 'string',\n },\n {\n property: 'name',\n type: 'string',\n validator: (v: unknown): v is string => typeof v === 'string',\n },\n {\n property: 'decimals',\n type: 'number',\n validator: (v: unknown): v is number => typeof v === 'number',\n },\n {\n property: 'icon',\n // typeof null === 'object'\n type: 'string|undefined|object',\n validator: (v: unknown): v is string | undefined | object =>\n v === undefined || v === null || typeof v === 'string',\n },\n];\n\nconst assetValidator = (v: unknown): v is Asset =>\n validateResponse<Asset, unknown>(assetValidators, v, BRIDGE_STATUS_BASE_URL);\n\nconst srcChainStatusValidators = [\n {\n property: 'chainId',\n // For some reason, API returns destChain.chainId as a string, it's a number everywhere else\n type: 'number|string',\n validator: (v: unknown): v is number | string =>\n typeof v === 'number' || typeof v === 'string',\n },\n {\n property: 'txHash',\n type: 'string',\n validator: validHex,\n },\n {\n property: 'amount',\n type: 'string|undefined',\n validator: (v: unknown): v is string | undefined =>\n v === undefined || typeof v === 'string',\n },\n {\n property: 'token',\n type: 'object|undefined',\n validator: (v: unknown): v is object | undefined =>\n v === undefined ||\n (v && typeof v === 'object' && Object.keys(v).length === 0) ||\n assetValidator(v),\n },\n];\n\nconst srcChainStatusValidator = (v: unknown): v is SrcChainStatus =>\n validateResponse<SrcChainStatus, unknown>(\n srcChainStatusValidators,\n v,\n BRIDGE_STATUS_BASE_URL,\n );\n\nconst destChainStatusValidators = [\n {\n property: 'chainId',\n // For some reason, API returns destChain.chainId as a string, it's a number everywhere else\n type: 'number|string',\n validator: (v: unknown): v is number | string =>\n typeof v === 'number' || typeof v === 'string',\n },\n {\n property: 'amount',\n type: 'string|undefined',\n validator: (v: unknown): v is string | undefined =>\n v === undefined || typeof v === 'string',\n },\n {\n property: 'txHash',\n type: 'string|undefined',\n validator: (v: unknown): v is string | undefined =>\n v === undefined || typeof v === 'string',\n },\n {\n property: 'token',\n type: 'object|undefined',\n validator: (v: unknown): v is Asset | undefined =>\n v === undefined ||\n (v && typeof v === 'object' && Object.keys(v).length === 0) ||\n assetValidator(v),\n },\n];\n\nconst destChainStatusValidator = (v: unknown): v is DestChainStatus =>\n validateResponse<DestChainStatus, unknown>(\n destChainStatusValidators,\n v,\n BRIDGE_STATUS_BASE_URL,\n );\n\nexport const validators = [\n {\n property: 'status',\n type: 'string',\n validator: (v: unknown): v is StatusTypes =>\n Object.values(StatusTypes).includes(v as StatusTypes),\n },\n {\n property: 'srcChain',\n type: 'object',\n validator: srcChainStatusValidator,\n },\n {\n property: 'destChain',\n type: 'object|undefined',\n validator: (v: unknown): v is object | unknown =>\n v === undefined || destChainStatusValidator(v),\n },\n {\n property: 'bridge',\n type: 'string|undefined',\n validator: (v: unknown): v is BridgeId | undefined =>\n v === undefined || Object.values(BridgeId).includes(v as BridgeId),\n },\n {\n property: 'isExpectedToken',\n type: 'boolean|undefined',\n validator: (v: unknown): v is boolean | undefined =>\n v === undefined || typeof v === 'boolean',\n },\n {\n property: 'isUnrecognizedRouterAddress',\n type: 'boolean|undefined',\n validator: (v: unknown): v is boolean | undefined =>\n v === undefined || typeof v === 'boolean',\n },\n // TODO: add refuel validator\n // {\n // property: 'refuel',\n // type: 'object',\n // validator: (v: unknown) => Object.values(RefuelStatusResponse).includes(v),\n // },\n];\n"]}
|
|
1
|
+
{"version":3,"file":"validators.mjs","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,EACR,KAAK,EACL,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,MAAM,EACP,8BAA8B;AAE/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAiB;AAEjD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,IAAa,EAAE,EAAE;IAC5D,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAElD,MAAM,WAAW,GAAG,IAAI,CAAC;QACvB,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,MAAM,EAAE;QACjB,MAAM,EAAE,MAAM,EAAE;QAChB,IAAI,EAAE,MAAM,EAAE;QACd,QAAQ,EAAE,MAAM,EAAE;QAClB,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;KACnC,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAErC,MAAM,oBAAoB,GAAG,IAAI,CAAC;QAChC,OAAO,EAAE,aAAa;QACtB,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC;KACzD,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,IAAI,CAAC;QACjC,OAAO,EAAE,aAAa;QACtB,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC;KACzD,CAAC,CAAC;IAEH,MAAM,0BAA0B,GAAG,MAAM,EAAE,CAAC;IAE5C,MAAM,oBAAoB,GAAG,IAAI,CAAC;QAChC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACzC,QAAQ,EAAE,oBAAoB;QAC9B,SAAS,EAAE,QAAQ,CAAC,qBAAqB,CAAC;QAC1C,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChD,eAAe,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;QACpC,2BAA2B,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;QAChD,MAAM,EAAE,QAAQ,CAAC,0BAA0B,CAAC;KAC7C,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;AACrC,CAAC,CAAC","sourcesContent":["import {\n object,\n string,\n boolean,\n number,\n optional,\n enums,\n union,\n type,\n nullable,\n assert,\n} from '@metamask/superstruct';\n\nimport { BridgeId, StatusTypes } from '../types';\n\nexport const validateBridgeStatusResponse = (data: unknown) => {\n const ChainIdSchema = union([number(), string()]);\n\n const AssetSchema = type({\n chainId: ChainIdSchema,\n address: string(),\n symbol: string(),\n name: string(),\n decimals: number(),\n icon: optional(nullable(string())),\n });\n\n const EmptyObjectSchema = object({});\n\n const SrcChainStatusSchema = type({\n chainId: ChainIdSchema,\n txHash: optional(string()),\n amount: optional(string()),\n token: optional(union([EmptyObjectSchema, AssetSchema])),\n });\n\n const DestChainStatusSchema = type({\n chainId: ChainIdSchema,\n txHash: optional(string()),\n amount: optional(string()),\n token: optional(union([EmptyObjectSchema, AssetSchema])),\n });\n\n const RefuelStatusResponseSchema = object();\n\n const StatusResponseSchema = type({\n status: enums(Object.values(StatusTypes)),\n srcChain: SrcChainStatusSchema,\n destChain: optional(DestChainStatusSchema),\n bridge: optional(enums(Object.values(BridgeId))),\n isExpectedToken: optional(boolean()),\n isUnrecognizedRouterAddress: optional(boolean()),\n refuel: optional(RefuelStatusResponseSchema),\n });\n\n assert(data, StatusResponseSchema);\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask/bridge-status-controller",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Manages bridge-related status fetching functionality for MetaMask",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -48,9 +48,10 @@
|
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"@metamask/base-controller": "^8.0.0",
|
|
51
|
-
"@metamask/bridge-controller": "^
|
|
51
|
+
"@metamask/bridge-controller": "^3.0.0",
|
|
52
52
|
"@metamask/controller-utils": "^11.5.0",
|
|
53
53
|
"@metamask/polling-controller": "^12.0.3",
|
|
54
|
+
"@metamask/superstruct": "^3.1.0",
|
|
54
55
|
"@metamask/utils": "^11.2.0"
|
|
55
56
|
},
|
|
56
57
|
"devDependencies": {
|
|
@@ -71,7 +72,7 @@
|
|
|
71
72
|
},
|
|
72
73
|
"peerDependencies": {
|
|
73
74
|
"@metamask/accounts-controller": "^24.0.0",
|
|
74
|
-
"@metamask/bridge-controller": "^
|
|
75
|
+
"@metamask/bridge-controller": "^3.0.0",
|
|
75
76
|
"@metamask/network-controller": "^22.0.0",
|
|
76
77
|
"@metamask/transaction-controller": "^46.0.0"
|
|
77
78
|
},
|