@ledgerhq/live-common 34.55.0 → 34.55.2
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/lib/wallet-api/helpers.d.ts +3 -3
- package/lib/wallet-api/helpers.d.ts.map +1 -1
- package/lib/wallet-api/helpers.js +37 -10
- package/lib/wallet-api/helpers.js.map +1 -1
- package/lib/wallet-api/manifestDomainUtils.d.ts +18 -0
- package/lib/wallet-api/manifestDomainUtils.d.ts.map +1 -0
- package/lib/wallet-api/manifestDomainUtils.js +77 -0
- package/lib/wallet-api/manifestDomainUtils.js.map +1 -0
- package/lib/wallet-api/useLiveAppManifest.d.ts +2 -0
- package/lib/wallet-api/useLiveAppManifest.d.ts.map +1 -0
- package/lib/wallet-api/useLiveAppManifest.js +18 -0
- package/lib/wallet-api/useLiveAppManifest.js.map +1 -0
- package/lib-es/wallet-api/helpers.d.ts +3 -3
- package/lib-es/wallet-api/helpers.d.ts.map +1 -1
- package/lib-es/wallet-api/helpers.js +37 -10
- package/lib-es/wallet-api/helpers.js.map +1 -1
- package/lib-es/wallet-api/manifestDomainUtils.d.ts +18 -0
- package/lib-es/wallet-api/manifestDomainUtils.d.ts.map +1 -0
- package/lib-es/wallet-api/manifestDomainUtils.js +70 -0
- package/lib-es/wallet-api/manifestDomainUtils.js.map +1 -0
- package/lib-es/wallet-api/useLiveAppManifest.d.ts +2 -0
- package/lib-es/wallet-api/useLiveAppManifest.d.ts.map +1 -0
- package/lib-es/wallet-api/useLiveAppManifest.js +14 -0
- package/lib-es/wallet-api/useLiveAppManifest.js.map +1 -0
- package/package.json +48 -48
- package/src/families/cardano/__snapshots__/bridge.integration.test.ts.snap +33 -2
- package/src/families/cosmos/datasets/__snapshots__/cosmos.integration.test.ts.snap +3 -3
- package/src/families/hedera/__snapshots__/bridge.integration.test.ts.snap +862 -34
- package/src/families/stellar/__snapshots__/bridge.integration.test.ts.snap +588 -57
- package/src/wallet-api/helpers.test.ts +411 -0
- package/src/wallet-api/helpers.ts +53 -18
- package/src/wallet-api/manifestDomainUtils.test.ts +355 -0
- package/src/wallet-api/manifestDomainUtils.ts +81 -0
- package/src/wallet-api/useLiveAppManifest.ts +16 -0
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { Currency } from "@ledgerhq/types-cryptoassets";
|
|
2
|
-
import { WalletAPICurrency, WalletAPISupportedCurrency, WalletAPIERC20TokenCurrency, WalletAPICryptoCurrency } from "./types";
|
|
2
|
+
import type { WalletAPICurrency, WalletAPISupportedCurrency, WalletAPIERC20TokenCurrency, WalletAPICryptoCurrency, AppManifest } from "./types";
|
|
3
3
|
export declare function isWalletAPISupportedCurrency(currency: Currency): currency is WalletAPISupportedCurrency;
|
|
4
4
|
export declare function isWalletAPICryptoCurrency(currency: WalletAPICurrency): currency is WalletAPICryptoCurrency;
|
|
5
5
|
export declare function isWalletAPITokenCurrency(currency: WalletAPICurrency): currency is WalletAPIERC20TokenCurrency;
|
|
6
6
|
export declare function isWalletAPIERC20TokenCurrency(currency: WalletAPICurrency): currency is WalletAPIERC20TokenCurrency;
|
|
7
|
-
export declare function addParamsToURL(url: URL, inputs?: Record<string, string | undefined>): void;
|
|
7
|
+
export declare function addParamsToURL(url: URL, inputs?: Record<string, string | boolean | undefined>): void;
|
|
8
8
|
type getHostHeadersParams = {
|
|
9
9
|
client: string;
|
|
10
10
|
theme: "light" | "dark";
|
|
11
11
|
};
|
|
12
12
|
export declare function getClientHeaders(params: getHostHeadersParams): Record<string, string>;
|
|
13
|
-
export declare const getInitialURL: (inputs:
|
|
13
|
+
export declare const getInitialURL: (inputs: Record<string, string | boolean | undefined> | undefined, manifest: AppManifest) => string;
|
|
14
14
|
export declare const safeUrl: (url: string) => URL | null;
|
|
15
15
|
export declare const isHexPrefixed: (str: string) => boolean;
|
|
16
16
|
export declare const stripHexPrefix: (str: string) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/wallet-api/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/wallet-api/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,2BAA2B,EAC3B,uBAAuB,EACvB,WAAW,EACZ,MAAM,SAAS,CAAC;AAKjB,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,QAAQ,GACjB,QAAQ,IAAI,0BAA0B,CASxC;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,iBAAiB,GAC1B,QAAQ,IAAI,uBAAuB,CAErC;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,iBAAiB,GAC1B,QAAQ,IAAI,2BAA2B,CAEzC;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,iBAAiB,GAC1B,QAAQ,IAAI,2BAA2B,CAEzC;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,GAAG,EACR,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GACpD,IAAI,CAaN;AAED,KAAK,oBAAoB,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKrF;AAoCD,eAAO,MAAM,aAAa,WAChB,OAAO,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,SAAS,YACtD,WAAW,WA4BtB,CAAC;AAEF,eAAO,MAAM,OAAO,QAAS,MAAM,eAMlC,CAAC;AAGF,eAAO,MAAM,aAAa,QAAS,MAAM,KAAG,OAM3C,CAAC;AAGF,eAAO,MAAM,cAAc,QAAS,MAAM,KAAG,MAK5C,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAcrF"}
|
|
@@ -4,6 +4,7 @@ exports.objectToURLSearchParams = exports.stripHexPrefix = exports.isHexPrefixed
|
|
|
4
4
|
const currencies_1 = require("../currencies");
|
|
5
5
|
const constants_1 = require("./constants");
|
|
6
6
|
const helpers_1 = require("../helpers");
|
|
7
|
+
const manifestDomainUtils_1 = require("./manifestDomainUtils");
|
|
7
8
|
function isWalletAPISupportedCurrency(currency) {
|
|
8
9
|
if ((0, currencies_1.isCryptoCurrency)(currency)) {
|
|
9
10
|
return (0, helpers_1.includes)(constants_1.WALLET_API_FAMILIES, currency.family);
|
|
@@ -23,7 +24,7 @@ function isWalletAPITokenCurrency(currency) {
|
|
|
23
24
|
}
|
|
24
25
|
exports.isWalletAPITokenCurrency = isWalletAPITokenCurrency;
|
|
25
26
|
function isWalletAPIERC20TokenCurrency(currency) {
|
|
26
|
-
return currency.standard === "ERC20";
|
|
27
|
+
return currency.type === "TokenCurrency" && currency.standard === "ERC20";
|
|
27
28
|
}
|
|
28
29
|
exports.isWalletAPIERC20TokenCurrency = isWalletAPIERC20TokenCurrency;
|
|
29
30
|
function addParamsToURL(url, inputs) {
|
|
@@ -33,7 +34,7 @@ function addParamsToURL(url, inputs) {
|
|
|
33
34
|
const key = keys[i];
|
|
34
35
|
const value = inputs[key];
|
|
35
36
|
if (value !== undefined) {
|
|
36
|
-
url.searchParams.set(key, value);
|
|
37
|
+
url.searchParams.set(key, String(value));
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
}
|
|
@@ -46,20 +47,46 @@ function getClientHeaders(params) {
|
|
|
46
47
|
};
|
|
47
48
|
}
|
|
48
49
|
exports.getClientHeaders = getClientHeaders;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Validates a URL by checking if it's on the same domain as the manifest URL.
|
|
52
|
+
* Only HTTPS URLs are allowed.
|
|
53
|
+
* @param url - The URL to validate
|
|
54
|
+
* @param manifestUrl - The manifest URL to check same domain against
|
|
55
|
+
* @returns true if the URL is valid and is on the same domain as manifestUrl
|
|
56
|
+
*/
|
|
57
|
+
const isWhitelistedDomain = (url, manifestUrl) => {
|
|
58
|
+
try {
|
|
59
|
+
// Parse the URL
|
|
60
|
+
const parsedUrl = new URL(url);
|
|
61
|
+
// Only allow HTTPS scheme
|
|
62
|
+
if (parsedUrl.protocol !== "https:") {
|
|
63
|
+
console.error(`#isWhitelistedDomain:: invalid URL: non-HTTPS scheme '${parsedUrl.protocol}' is not allowed`);
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
// Check if URL is on the same domain as manifest URL
|
|
67
|
+
if (!(0, manifestDomainUtils_1.isSameDomain)(url, manifestUrl)) {
|
|
68
|
+
console.error(`#isWhitelistedDomain:: invalid URL: not on the same domain as manifest URL`);
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
// Invalid URL format
|
|
75
|
+
console.error(`#isWhitelistedDomain:: invalid URL format: ${error}`);
|
|
76
|
+
return false;
|
|
53
77
|
}
|
|
54
|
-
return isValid;
|
|
55
78
|
};
|
|
56
79
|
const getInitialURL = (inputs, manifest) => {
|
|
57
80
|
try {
|
|
58
|
-
if (inputs?.goToURL
|
|
81
|
+
if (typeof inputs?.goToURL === "string" &&
|
|
82
|
+
isWhitelistedDomain(inputs.goToURL, manifest.url.toString())) {
|
|
59
83
|
return inputs?.goToURL;
|
|
60
84
|
}
|
|
61
|
-
const url = new URL(manifest.url);
|
|
62
|
-
|
|
85
|
+
const url = new URL(manifest.url.toString());
|
|
86
|
+
// Filter out goToURL from inputs to prevent it from being added as a query parameter
|
|
87
|
+
// when validation fails
|
|
88
|
+
const { goToURL, ...filteredInputs } = inputs || {};
|
|
89
|
+
addParamsToURL(url, filteredInputs);
|
|
63
90
|
if (manifest.params) {
|
|
64
91
|
url.searchParams.set("params", JSON.stringify(manifest.params));
|
|
65
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/wallet-api/helpers.ts"],"names":[],"mappings":";;;AAAA,8CAAkE;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/wallet-api/helpers.ts"],"names":[],"mappings":";;;AAAA,8CAAkE;AASlE,2CAAkD;AAClD,wCAAsC;AACtC,+DAAqD;AAErD,SAAgB,4BAA4B,CAC1C,QAAkB;IAElB,IAAI,IAAA,6BAAgB,EAAC,QAAQ,CAAC,EAAE;QAC9B,OAAO,IAAA,kBAAQ,EAAC,+BAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;KACvD;IAED,IAAI,IAAA,4BAAe,EAAC,QAAQ,CAAC,EAAE;QAC7B,OAAO,IAAA,kBAAQ,EAAC,+BAAmB,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;KACtE;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAXD,oEAWC;AAED,SAAgB,yBAAyB,CACvC,QAA2B;IAE3B,OAAO,QAAQ,CAAC,IAAI,KAAK,gBAAgB,CAAC;AAC5C,CAAC;AAJD,8DAIC;AAED,SAAgB,wBAAwB,CACtC,QAA2B;IAE3B,OAAO,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC;AAC3C,CAAC;AAJD,4DAIC;AAED,SAAgB,6BAA6B,CAC3C,QAA2B;IAE3B,OAAO,QAAQ,CAAC,IAAI,KAAK,eAAe,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC;AAC5E,CAAC;AAJD,sEAIC;AAED,SAAgB,cAAc,CAC5B,GAAQ,EACR,MAAqD;IAErD,IAAI,MAAM,EAAE;QACV,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1B,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aAC1C;SACF;KACF;AACH,CAAC;AAhBD,wCAgBC;AAOD,SAAgB,gBAAgB,CAAC,MAA4B;IAC3D,OAAO;QACL,eAAe,EAAE,MAAM,CAAC,MAAM;QAC9B,qBAAqB,EAAE,MAAM,CAAC,KAAK;KACpC,CAAC;AACJ,CAAC;AALD,4CAKC;AAED;;;;;;GAMG;AACH,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,WAAmB,EAAW,EAAE;IACxE,IAAI;QACF,gBAAgB;QAChB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAE/B,0BAA0B;QAC1B,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE;YACnC,OAAO,CAAC,KAAK,CACX,yDAAyD,SAAS,CAAC,QAAQ,kBAAkB,CAC9F,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAED,qDAAqD;QACrD,IAAI,CAAC,IAAA,kCAAY,EAAC,GAAG,EAAE,WAAW,CAAC,EAAE;YACnC,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;YAC5F,OAAO,KAAK,CAAC;SACd;QAED,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,KAAK,EAAE;QACd,qBAAqB;QACrB,OAAO,CAAC,KAAK,CAAC,8CAA8C,KAAK,EAAE,CAAC,CAAC;QACrE,OAAO,KAAK,CAAC;KACd;AACH,CAAC,CAAC;AAEK,MAAM,aAAa,GAAG,CAC3B,MAAgE,EAChE,QAAqB,EACrB,EAAE;IACF,IAAI;QACF,IACE,OAAO,MAAM,EAAE,OAAO,KAAK,QAAQ;YACnC,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,EAC5D;YACA,OAAO,MAAM,EAAE,OAAO,CAAC;SACxB;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE7C,qFAAqF;QACrF,wBAAwB;QACxB,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAEpD,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAEpC,IAAI,QAAQ,CAAC,MAAM,EAAE;YACnB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;SACjE;QAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;KACvB;IAAC,OAAO,CAAC,EAAE;QACV,IAAI,CAAC,YAAY,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAEjD,OAAO,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;KAChC;AACH,CAAC,CAAC;AA9BW,QAAA,aAAa,iBA8BxB;AAEK,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE;IACrC,IAAI;QACF,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;KACrB;IAAC,MAAM;QACN,OAAO,IAAI,CAAC;KACb;AACH,CAAC,CAAC;AANW,QAAA,OAAO,WAMlB;AAEF,4DAA4D;AACrD,MAAM,aAAa,GAAG,CAAC,GAAW,EAAW,EAAE;IACpD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,8DAA8D,OAAO,GAAG,EAAE,CAAC,CAAC;KAC7F;IAED,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;AAC1C,CAAC,CAAC;AANW,QAAA,aAAa,iBAMxB;AAEF,4DAA4D;AACrD,MAAM,cAAc,GAAG,CAAC,GAAW,EAAU,EAAE;IACpD,IAAI,OAAO,GAAG,KAAK,QAAQ;QACzB,MAAM,IAAI,KAAK,CAAC,0DAA0D,OAAO,GAAG,EAAE,CAAC,CAAC;IAE1F,OAAO,IAAA,qBAAa,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACjD,CAAC,CAAC;AALW,QAAA,cAAc,kBAKzB;AAEF,SAAgB,uBAAuB,CAAC,GAA4B;IAClE,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;IAE3C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC3C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;YACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAC7B,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;aACjD;iBAAM;gBACL,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aACzC;SACF;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC;AACtB,CAAC;AAdD,0DAcC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LiveAppManifest } from "../platform/types";
|
|
2
|
+
/**
|
|
3
|
+
* Extracts the domain from a URL string
|
|
4
|
+
*/
|
|
5
|
+
export declare function getDomain(url: string): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Extracts the protocol from a URL string
|
|
8
|
+
*/
|
|
9
|
+
export declare function getProtocol(url: string): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Checks if two URLs are on the same domain and protocol
|
|
12
|
+
*/
|
|
13
|
+
export declare function isSameDomain(url1: string | undefined, url2: string | undefined): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Applies a custom dapp URL to a manifest if it's on the same domain as the original URL
|
|
16
|
+
*/
|
|
17
|
+
export declare function applyCustomDappUrl<T extends LiveAppManifest>(manifest: T | null | undefined, customDappUrl: string | null | undefined): T | null | undefined;
|
|
18
|
+
//# sourceMappingURL=manifestDomainUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifestDomainUtils.d.ts","sourceRoot":"","sources":["../../src/wallet-api/manifestDomainUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOpD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAcxF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,eAAe,EAC1D,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,CAAC,GAAG,IAAI,GAAG,SAAS,CA6BtB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyCustomDappUrl = exports.isSameDomain = exports.getProtocol = exports.getDomain = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Extracts the domain from a URL string
|
|
6
|
+
*/
|
|
7
|
+
function getDomain(url) {
|
|
8
|
+
try {
|
|
9
|
+
const urlObj = new URL(url);
|
|
10
|
+
return urlObj.hostname;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.getDomain = getDomain;
|
|
17
|
+
/**
|
|
18
|
+
* Extracts the protocol from a URL string
|
|
19
|
+
*/
|
|
20
|
+
function getProtocol(url) {
|
|
21
|
+
try {
|
|
22
|
+
const urlObj = new URL(url);
|
|
23
|
+
return urlObj.protocol;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.getProtocol = getProtocol;
|
|
30
|
+
/**
|
|
31
|
+
* Checks if two URLs are on the same domain and protocol
|
|
32
|
+
*/
|
|
33
|
+
function isSameDomain(url1, url2) {
|
|
34
|
+
if (!url1 || !url2)
|
|
35
|
+
return false;
|
|
36
|
+
const domain1 = getDomain(url1);
|
|
37
|
+
const domain2 = getDomain(url2);
|
|
38
|
+
const protocol1 = getProtocol(url1);
|
|
39
|
+
const protocol2 = getProtocol(url2);
|
|
40
|
+
return (domain1 !== null &&
|
|
41
|
+
domain2 !== null &&
|
|
42
|
+
protocol1 !== null &&
|
|
43
|
+
protocol2 !== null &&
|
|
44
|
+
domain1 === domain2 &&
|
|
45
|
+
protocol1 === protocol2);
|
|
46
|
+
}
|
|
47
|
+
exports.isSameDomain = isSameDomain;
|
|
48
|
+
/**
|
|
49
|
+
* Applies a custom dapp URL to a manifest if it's on the same domain as the original URL
|
|
50
|
+
*/
|
|
51
|
+
function applyCustomDappUrl(manifest, customDappUrl) {
|
|
52
|
+
if (!customDappUrl || !manifest) {
|
|
53
|
+
return manifest;
|
|
54
|
+
}
|
|
55
|
+
// Handle manifest with params.dappUrl
|
|
56
|
+
if (manifest.params &&
|
|
57
|
+
"dappUrl" in manifest.params &&
|
|
58
|
+
isSameDomain(customDappUrl, manifest.params.dappUrl)) {
|
|
59
|
+
return {
|
|
60
|
+
...manifest,
|
|
61
|
+
params: {
|
|
62
|
+
...manifest.params,
|
|
63
|
+
dappUrl: customDappUrl,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// Handle manifest.dapp case
|
|
68
|
+
if (manifest.dapp && isSameDomain(customDappUrl, String(manifest.url))) {
|
|
69
|
+
return {
|
|
70
|
+
...manifest,
|
|
71
|
+
url: customDappUrl,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return manifest;
|
|
75
|
+
}
|
|
76
|
+
exports.applyCustomDappUrl = applyCustomDappUrl;
|
|
77
|
+
//# sourceMappingURL=manifestDomainUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifestDomainUtils.js","sourceRoot":"","sources":["../../src/wallet-api/manifestDomainUtils.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,SAAgB,SAAS,CAAC,GAAW;IACnC,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC;KACxB;IAAC,MAAM;QACN,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AAPD,8BAOC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,GAAW;IACrC,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC;KACxB;IAAC,MAAM;QACN,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AAPD,kCAOC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,IAAwB,EAAE,IAAwB;IAC7E,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,CACL,OAAO,KAAK,IAAI;QAChB,OAAO,KAAK,IAAI;QAChB,SAAS,KAAK,IAAI;QAClB,SAAS,KAAK,IAAI;QAClB,OAAO,KAAK,OAAO;QACnB,SAAS,KAAK,SAAS,CACxB,CAAC;AACJ,CAAC;AAdD,oCAcC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAChC,QAA8B,EAC9B,aAAwC;IAExC,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE;QAC/B,OAAO,QAAQ,CAAC;KACjB;IAED,sCAAsC;IACtC,IACE,QAAQ,CAAC,MAAM;QACf,SAAS,IAAI,QAAQ,CAAC,MAAM;QAC5B,YAAY,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EACpD;QACA,OAAO;YACL,GAAG,QAAQ;YACX,MAAM,EAAE;gBACN,GAAG,QAAQ,CAAC,MAAM;gBAClB,OAAO,EAAE,aAAa;aACvB;SACF,CAAC;KACH;IAED,4BAA4B;IAC5B,IAAI,QAAQ,CAAC,IAAI,IAAI,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE;QACtE,OAAO;YACL,GAAG,QAAQ;YACX,GAAG,EAAE,aAAa;SACnB,CAAC;KACH;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAhCD,gDAgCC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLiveAppManifest.d.ts","sourceRoot":"","sources":["../../src/wallet-api/useLiveAppManifest.ts"],"names":[],"mappings":"AAKA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,kEAU1F"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useLiveAppManifest = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const index_1 = require("./LocalLiveAppProvider/index");
|
|
6
|
+
const index_2 = require("../platform/providers/RemoteLiveAppProvider/index");
|
|
7
|
+
const manifestDomainUtils_1 = require("./manifestDomainUtils");
|
|
8
|
+
function useLiveAppManifest(appId, customDappUrl) {
|
|
9
|
+
const localManifest = (0, index_1.useLocalLiveAppManifest)(appId);
|
|
10
|
+
const remoteManifest = (0, index_2.useRemoteLiveAppManifest)(appId);
|
|
11
|
+
const manifest = (0, react_1.useMemo)(() => {
|
|
12
|
+
const baseManifest = localManifest || remoteManifest;
|
|
13
|
+
return (0, manifestDomainUtils_1.applyCustomDappUrl)(baseManifest, customDappUrl);
|
|
14
|
+
}, [localManifest, remoteManifest, customDappUrl]);
|
|
15
|
+
return manifest;
|
|
16
|
+
}
|
|
17
|
+
exports.useLiveAppManifest = useLiveAppManifest;
|
|
18
|
+
//# sourceMappingURL=useLiveAppManifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLiveAppManifest.js","sourceRoot":"","sources":["../../src/wallet-api/useLiveAppManifest.ts"],"names":[],"mappings":";;;AAAA,iCAAgC;AAChC,wDAAuE;AACvE,6EAA6F;AAC7F,+DAA2D;AAE3D,SAAgB,kBAAkB,CAAC,KAAyB,EAAE,aAA6B;IACzF,MAAM,aAAa,GAAG,IAAA,+BAAuB,EAAC,KAAK,CAAC,CAAC;IACrD,MAAM,cAAc,GAAG,IAAA,gCAAwB,EAAC,KAAK,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAC5B,MAAM,YAAY,GAAG,aAAa,IAAI,cAAc,CAAC;QACrD,OAAO,IAAA,wCAAkB,EAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC;IAEnD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAVD,gDAUC"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { Currency } from "@ledgerhq/types-cryptoassets";
|
|
2
|
-
import { WalletAPICurrency, WalletAPISupportedCurrency, WalletAPIERC20TokenCurrency, WalletAPICryptoCurrency } from "./types";
|
|
2
|
+
import type { WalletAPICurrency, WalletAPISupportedCurrency, WalletAPIERC20TokenCurrency, WalletAPICryptoCurrency, AppManifest } from "./types";
|
|
3
3
|
export declare function isWalletAPISupportedCurrency(currency: Currency): currency is WalletAPISupportedCurrency;
|
|
4
4
|
export declare function isWalletAPICryptoCurrency(currency: WalletAPICurrency): currency is WalletAPICryptoCurrency;
|
|
5
5
|
export declare function isWalletAPITokenCurrency(currency: WalletAPICurrency): currency is WalletAPIERC20TokenCurrency;
|
|
6
6
|
export declare function isWalletAPIERC20TokenCurrency(currency: WalletAPICurrency): currency is WalletAPIERC20TokenCurrency;
|
|
7
|
-
export declare function addParamsToURL(url: URL, inputs?: Record<string, string | undefined>): void;
|
|
7
|
+
export declare function addParamsToURL(url: URL, inputs?: Record<string, string | boolean | undefined>): void;
|
|
8
8
|
type getHostHeadersParams = {
|
|
9
9
|
client: string;
|
|
10
10
|
theme: "light" | "dark";
|
|
11
11
|
};
|
|
12
12
|
export declare function getClientHeaders(params: getHostHeadersParams): Record<string, string>;
|
|
13
|
-
export declare const getInitialURL: (inputs:
|
|
13
|
+
export declare const getInitialURL: (inputs: Record<string, string | boolean | undefined> | undefined, manifest: AppManifest) => string;
|
|
14
14
|
export declare const safeUrl: (url: string) => URL | null;
|
|
15
15
|
export declare const isHexPrefixed: (str: string) => boolean;
|
|
16
16
|
export declare const stripHexPrefix: (str: string) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/wallet-api/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/wallet-api/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,2BAA2B,EAC3B,uBAAuB,EACvB,WAAW,EACZ,MAAM,SAAS,CAAC;AAKjB,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,QAAQ,GACjB,QAAQ,IAAI,0BAA0B,CASxC;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,iBAAiB,GAC1B,QAAQ,IAAI,uBAAuB,CAErC;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,iBAAiB,GAC1B,QAAQ,IAAI,2BAA2B,CAEzC;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,iBAAiB,GAC1B,QAAQ,IAAI,2BAA2B,CAEzC;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,GAAG,EACR,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GACpD,IAAI,CAaN;AAED,KAAK,oBAAoB,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKrF;AAoCD,eAAO,MAAM,aAAa,WAChB,OAAO,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,SAAS,YACtD,WAAW,WA4BtB,CAAC;AAEF,eAAO,MAAM,OAAO,QAAS,MAAM,eAMlC,CAAC;AAGF,eAAO,MAAM,aAAa,QAAS,MAAM,KAAG,OAM3C,CAAC;AAGF,eAAO,MAAM,cAAc,QAAS,MAAM,KAAG,MAK5C,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAcrF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isCryptoCurrency, isTokenCurrency } from "../currencies";
|
|
2
2
|
import { WALLET_API_FAMILIES } from "./constants";
|
|
3
3
|
import { includes } from "../helpers";
|
|
4
|
+
import { isSameDomain } from "./manifestDomainUtils";
|
|
4
5
|
export function isWalletAPISupportedCurrency(currency) {
|
|
5
6
|
if (isCryptoCurrency(currency)) {
|
|
6
7
|
return includes(WALLET_API_FAMILIES, currency.family);
|
|
@@ -17,7 +18,7 @@ export function isWalletAPITokenCurrency(currency) {
|
|
|
17
18
|
return currency.type === "TokenCurrency";
|
|
18
19
|
}
|
|
19
20
|
export function isWalletAPIERC20TokenCurrency(currency) {
|
|
20
|
-
return currency.standard === "ERC20";
|
|
21
|
+
return currency.type === "TokenCurrency" && currency.standard === "ERC20";
|
|
21
22
|
}
|
|
22
23
|
export function addParamsToURL(url, inputs) {
|
|
23
24
|
if (inputs) {
|
|
@@ -26,7 +27,7 @@ export function addParamsToURL(url, inputs) {
|
|
|
26
27
|
const key = keys[i];
|
|
27
28
|
const value = inputs[key];
|
|
28
29
|
if (value !== undefined) {
|
|
29
|
-
url.searchParams.set(key, value);
|
|
30
|
+
url.searchParams.set(key, String(value));
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
33
|
}
|
|
@@ -37,20 +38,46 @@ export function getClientHeaders(params) {
|
|
|
37
38
|
"x-ledger-host-theme": params.theme,
|
|
38
39
|
};
|
|
39
40
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Validates a URL by checking if it's on the same domain as the manifest URL.
|
|
43
|
+
* Only HTTPS URLs are allowed.
|
|
44
|
+
* @param url - The URL to validate
|
|
45
|
+
* @param manifestUrl - The manifest URL to check same domain against
|
|
46
|
+
* @returns true if the URL is valid and is on the same domain as manifestUrl
|
|
47
|
+
*/
|
|
48
|
+
const isWhitelistedDomain = (url, manifestUrl) => {
|
|
49
|
+
try {
|
|
50
|
+
// Parse the URL
|
|
51
|
+
const parsedUrl = new URL(url);
|
|
52
|
+
// Only allow HTTPS scheme
|
|
53
|
+
if (parsedUrl.protocol !== "https:") {
|
|
54
|
+
console.error(`#isWhitelistedDomain:: invalid URL: non-HTTPS scheme '${parsedUrl.protocol}' is not allowed`);
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
// Check if URL is on the same domain as manifest URL
|
|
58
|
+
if (!isSameDomain(url, manifestUrl)) {
|
|
59
|
+
console.error(`#isWhitelistedDomain:: invalid URL: not on the same domain as manifest URL`);
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
// Invalid URL format
|
|
66
|
+
console.error(`#isWhitelistedDomain:: invalid URL format: ${error}`);
|
|
67
|
+
return false;
|
|
44
68
|
}
|
|
45
|
-
return isValid;
|
|
46
69
|
};
|
|
47
70
|
export const getInitialURL = (inputs, manifest) => {
|
|
48
71
|
try {
|
|
49
|
-
if (inputs?.goToURL
|
|
72
|
+
if (typeof inputs?.goToURL === "string" &&
|
|
73
|
+
isWhitelistedDomain(inputs.goToURL, manifest.url.toString())) {
|
|
50
74
|
return inputs?.goToURL;
|
|
51
75
|
}
|
|
52
|
-
const url = new URL(manifest.url);
|
|
53
|
-
|
|
76
|
+
const url = new URL(manifest.url.toString());
|
|
77
|
+
// Filter out goToURL from inputs to prevent it from being added as a query parameter
|
|
78
|
+
// when validation fails
|
|
79
|
+
const { goToURL, ...filteredInputs } = inputs || {};
|
|
80
|
+
addParamsToURL(url, filteredInputs);
|
|
54
81
|
if (manifest.params) {
|
|
55
82
|
url.searchParams.set("params", JSON.stringify(manifest.params));
|
|
56
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/wallet-api/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/wallet-api/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LiveAppManifest } from "../platform/types";
|
|
2
|
+
/**
|
|
3
|
+
* Extracts the domain from a URL string
|
|
4
|
+
*/
|
|
5
|
+
export declare function getDomain(url: string): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Extracts the protocol from a URL string
|
|
8
|
+
*/
|
|
9
|
+
export declare function getProtocol(url: string): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Checks if two URLs are on the same domain and protocol
|
|
12
|
+
*/
|
|
13
|
+
export declare function isSameDomain(url1: string | undefined, url2: string | undefined): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Applies a custom dapp URL to a manifest if it's on the same domain as the original URL
|
|
16
|
+
*/
|
|
17
|
+
export declare function applyCustomDappUrl<T extends LiveAppManifest>(manifest: T | null | undefined, customDappUrl: string | null | undefined): T | null | undefined;
|
|
18
|
+
//# sourceMappingURL=manifestDomainUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifestDomainUtils.d.ts","sourceRoot":"","sources":["../../src/wallet-api/manifestDomainUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOpD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAcxF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,eAAe,EAC1D,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,CAAC,GAAG,IAAI,GAAG,SAAS,CA6BtB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts the domain from a URL string
|
|
3
|
+
*/
|
|
4
|
+
export function getDomain(url) {
|
|
5
|
+
try {
|
|
6
|
+
const urlObj = new URL(url);
|
|
7
|
+
return urlObj.hostname;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Extracts the protocol from a URL string
|
|
15
|
+
*/
|
|
16
|
+
export function getProtocol(url) {
|
|
17
|
+
try {
|
|
18
|
+
const urlObj = new URL(url);
|
|
19
|
+
return urlObj.protocol;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Checks if two URLs are on the same domain and protocol
|
|
27
|
+
*/
|
|
28
|
+
export function isSameDomain(url1, url2) {
|
|
29
|
+
if (!url1 || !url2)
|
|
30
|
+
return false;
|
|
31
|
+
const domain1 = getDomain(url1);
|
|
32
|
+
const domain2 = getDomain(url2);
|
|
33
|
+
const protocol1 = getProtocol(url1);
|
|
34
|
+
const protocol2 = getProtocol(url2);
|
|
35
|
+
return (domain1 !== null &&
|
|
36
|
+
domain2 !== null &&
|
|
37
|
+
protocol1 !== null &&
|
|
38
|
+
protocol2 !== null &&
|
|
39
|
+
domain1 === domain2 &&
|
|
40
|
+
protocol1 === protocol2);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Applies a custom dapp URL to a manifest if it's on the same domain as the original URL
|
|
44
|
+
*/
|
|
45
|
+
export function applyCustomDappUrl(manifest, customDappUrl) {
|
|
46
|
+
if (!customDappUrl || !manifest) {
|
|
47
|
+
return manifest;
|
|
48
|
+
}
|
|
49
|
+
// Handle manifest with params.dappUrl
|
|
50
|
+
if (manifest.params &&
|
|
51
|
+
"dappUrl" in manifest.params &&
|
|
52
|
+
isSameDomain(customDappUrl, manifest.params.dappUrl)) {
|
|
53
|
+
return {
|
|
54
|
+
...manifest,
|
|
55
|
+
params: {
|
|
56
|
+
...manifest.params,
|
|
57
|
+
dappUrl: customDappUrl,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Handle manifest.dapp case
|
|
62
|
+
if (manifest.dapp && isSameDomain(customDappUrl, String(manifest.url))) {
|
|
63
|
+
return {
|
|
64
|
+
...manifest,
|
|
65
|
+
url: customDappUrl,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return manifest;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=manifestDomainUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifestDomainUtils.js","sourceRoot":"","sources":["../../src/wallet-api/manifestDomainUtils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC;KACxB;IAAC,MAAM;QACN,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC;KACxB;IAAC,MAAM;QACN,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAwB,EAAE,IAAwB;IAC7E,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,CACL,OAAO,KAAK,IAAI;QAChB,OAAO,KAAK,IAAI;QAChB,SAAS,KAAK,IAAI;QAClB,SAAS,KAAK,IAAI;QAClB,OAAO,KAAK,OAAO;QACnB,SAAS,KAAK,SAAS,CACxB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAA8B,EAC9B,aAAwC;IAExC,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE;QAC/B,OAAO,QAAQ,CAAC;KACjB;IAED,sCAAsC;IACtC,IACE,QAAQ,CAAC,MAAM;QACf,SAAS,IAAI,QAAQ,CAAC,MAAM;QAC5B,YAAY,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EACpD;QACA,OAAO;YACL,GAAG,QAAQ;YACX,MAAM,EAAE;gBACN,GAAG,QAAQ,CAAC,MAAM;gBAClB,OAAO,EAAE,aAAa;aACvB;SACF,CAAC;KACH;IAED,4BAA4B;IAC5B,IAAI,QAAQ,CAAC,IAAI,IAAI,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE;QACtE,OAAO;YACL,GAAG,QAAQ;YACX,GAAG,EAAE,aAAa;SACnB,CAAC;KACH;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLiveAppManifest.d.ts","sourceRoot":"","sources":["../../src/wallet-api/useLiveAppManifest.ts"],"names":[],"mappings":"AAKA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,kEAU1F"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { useLocalLiveAppManifest } from "./LocalLiveAppProvider/index";
|
|
3
|
+
import { useRemoteLiveAppManifest } from "../platform/providers/RemoteLiveAppProvider/index";
|
|
4
|
+
import { applyCustomDappUrl } from "./manifestDomainUtils";
|
|
5
|
+
export function useLiveAppManifest(appId, customDappUrl) {
|
|
6
|
+
const localManifest = useLocalLiveAppManifest(appId);
|
|
7
|
+
const remoteManifest = useRemoteLiveAppManifest(appId);
|
|
8
|
+
const manifest = useMemo(() => {
|
|
9
|
+
const baseManifest = localManifest || remoteManifest;
|
|
10
|
+
return applyCustomDappUrl(baseManifest, customDappUrl);
|
|
11
|
+
}, [localManifest, remoteManifest, customDappUrl]);
|
|
12
|
+
return manifest;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=useLiveAppManifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLiveAppManifest.js","sourceRoot":"","sources":["../../src/wallet-api/useLiveAppManifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mDAAmD,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,KAAyB,EAAE,aAA6B;IACzF,MAAM,aAAa,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,cAAc,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5B,MAAM,YAAY,GAAG,aAAa,IAAI,cAAc,CAAC;QACrD,OAAO,kBAAkB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC;IAEnD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|