@metamask-previews/bridge-status-controller 1.0.0-preview-1b0ea93a → 2.0.0-preview-af470a9
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,11 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## [2.0.0]
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
|
14
|
+
- **BREAKING:** Change `BridgeStatusController` state structure to have all fields at root of state ([#5406](https://github.com/MetaMask/core/pull/5406))
|
15
|
+
- **BREAKING:** Redundant type `BridgeStatusState` removed from exports ([#5406](https://github.com/MetaMask/core/pull/5406))
|
16
|
+
|
10
17
|
## [1.0.0]
|
11
18
|
|
12
19
|
### Added
|
13
20
|
|
14
21
|
- Initial release ([#5317](https://github.com/MetaMask/core/pull/5317))
|
15
22
|
|
16
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@
|
23
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@2.0.0...HEAD
|
24
|
+
[2.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@1.0.0...@metamask/bridge-status-controller@2.0.0
|
17
25
|
[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":"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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.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-previews/bridge-status-controller",
|
3
|
-
"version": "
|
3
|
+
"version": "2.0.0-preview-af470a9",
|
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": "^2.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": "^2.0.0",
|
75
76
|
"@metamask/network-controller": "^22.0.0",
|
76
77
|
"@metamask/transaction-controller": "^46.0.0"
|
77
78
|
},
|