From f38c00b90d96268b4e80432e5307436d68354194 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Thu, 19 Sep 2024 17:31:20 +0300 Subject: [PATCH 01/13] feat: tma deeplink compatibility --- packages/sign-client/src/controllers/engine.ts | 7 ++----- packages/utils/src/misc.ts | 11 ++++------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/packages/sign-client/src/controllers/engine.ts b/packages/sign-client/src/controllers/engine.ts index fc84f6072..168c29310 100644 --- a/packages/sign-client/src/controllers/engine.ts +++ b/packages/sign-client/src/controllers/engine.ts @@ -615,11 +615,8 @@ export class Engine extends IEngine { new Promise(async (resolve) => { // only attempt to handle deeplinks if they are not explicitly disabled in the session config if (!session.sessionConfig?.disableDeepLink) { - const wcDeepLink = await getDeepLink( - this.client.core.storage, - WALLETCONNECT_DEEPLINK_CHOICE, - ); - handleDeeplinkRedirect({ id: clientRpcId, topic, wcDeepLink }); + const wcDeepLink = (await getDeepLink(WALLETCONNECT_DEEPLINK_CHOICE)) as string; + await handleDeeplinkRedirect({ id: clientRpcId, topic, wcDeepLink }); } resolve(); }), diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index 77e0f96e8..1e7414ba4 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -9,7 +9,6 @@ import { import { getDocument, getLocation, getNavigator } from "@walletconnect/window-getters"; import { getWindowMetadata } from "@walletconnect/window-metadata"; import { ErrorResponse } from "@walletconnect/jsonrpc-utils"; -import { IKeyValueStorage } from "@walletconnect/keyvaluestorage"; import * as qs from "query-string"; // -- constants -----------------------------------------// @@ -383,11 +382,11 @@ export async function handleDeeplinkRedirect({ console.warn("Document does not have focus, skipping deeplink."); return; } - + console.log("Opening deeplink", link); if (link.startsWith("https://") || link.startsWith("http://")) { window.open(link, "_blank", "noreferrer noopener"); } else { - window.open(link, "_self", "noreferrer noopener"); + window.open(link, "_blank", "noreferrer noopener"); } } else if (env === ENV_MAP.reactNative) { // global.Linking is set by react-native-compat @@ -402,11 +401,9 @@ export async function handleDeeplinkRedirect({ } } -export async function getDeepLink(store: IKeyValueStorage, key: string) { +//@ts-ignore +export async function getDeepLink(key: string) { try { - const deepLink = await store.getItem(key); - if (deepLink) return deepLink; - // check localStorage as fallback if (!isBrowser()) return; return localStorage.getItem(key) as string; From 6d58bab5797dcace2c375b28e9f5d8d6abd454e2 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Wed, 25 Sep 2024 10:12:35 +0300 Subject: [PATCH 02/13] fix: deeplink target for tma --- packages/utils/src/misc.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index 1e7414ba4..1da5c8e6b 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -386,7 +386,7 @@ export async function handleDeeplinkRedirect({ if (link.startsWith("https://") || link.startsWith("http://")) { window.open(link, "_blank", "noreferrer noopener"); } else { - window.open(link, "_blank", "noreferrer noopener"); + window.open(link, isTelegram() ? "_blank" : "_self", "noreferrer noopener"); } } else if (env === ENV_MAP.reactNative) { // global.Linking is set by react-native-compat @@ -442,3 +442,14 @@ export function uuidv4() { export function isTestRun() { return typeof process !== "undefined" && process.env.IS_VITEST === "true"; } + +export function isTelegram() { + return ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Boolean((window as any).TelegramWebviewProxy) || + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Boolean((window as any).Telegram) || + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Boolean((window as any).TelegramWebviewProxyProto) + ); +} From 0aaa416bceb7024766d03a59920b9acadcdea4da Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Wed, 25 Sep 2024 10:25:44 +0300 Subject: [PATCH 03/13] chore: updates modal --- package-lock.json | 116 +++++++++++------------ packages/utils/src/misc.ts | 1 + providers/ethereum-provider/package.json | 2 +- 3 files changed, 60 insertions(+), 59 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a6f7d03e..13f5f3e7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7987,34 +7987,6 @@ "pino": "7.11.0" } }, - "node_modules/@walletconnect/modal": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.6.2.tgz", - "integrity": "sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==", - "dependencies": { - "@walletconnect/modal-core": "2.6.2", - "@walletconnect/modal-ui": "2.6.2" - } - }, - "node_modules/@walletconnect/modal-core": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.6.2.tgz", - "integrity": "sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==", - "dependencies": { - "valtio": "1.11.2" - } - }, - "node_modules/@walletconnect/modal-ui": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.6.2.tgz", - "integrity": "sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==", - "dependencies": { - "@walletconnect/modal-core": "2.6.2", - "lit": "2.8.0", - "motion": "10.16.2", - "qrcode": "1.5.3" - } - }, "node_modules/@walletconnect/react-native-compat": { "resolved": "packages/react-native-compat", "link": true @@ -27668,7 +27640,7 @@ "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/modal": "2.6.2", + "@walletconnect/modal": "2.6.2-canary-tma-3", "@walletconnect/sign-client": "2.16.2", "@walletconnect/types": "2.16.2", "@walletconnect/universal-provider": "2.16.2", @@ -27682,6 +27654,34 @@ "web3": "1.7.5" } }, + "providers/ethereum-provider/node_modules/@walletconnect/modal": { + "version": "2.6.2-canary-tma-3", + "resolved": "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.6.2-canary-tma-3.tgz", + "integrity": "sha512-J5pvJEWOVxQ4KZR3V6WsvlSXWt5qqtn+XB7KCxDNUrXwAjp4QUQBl5HMpGUjEsz4m2L/daoFlN7jdq7/cx/HDA==", + "dependencies": { + "@walletconnect/modal-core": "2.6.2-canary-tma-3", + "@walletconnect/modal-ui": "2.6.2-canary-tma-3" + } + }, + "providers/ethereum-provider/node_modules/@walletconnect/modal-core": { + "version": "2.6.2-canary-tma-3", + "resolved": "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.6.2-canary-tma-3.tgz", + "integrity": "sha512-iB2uMBcpJH5/XEFv37d9vACuoD13T2ciLCOVKmuLbtUZZcya3E6hsYpDubOTz9l25A0iPurjcMkOik99Mj1aJA==", + "dependencies": { + "valtio": "1.11.2" + } + }, + "providers/ethereum-provider/node_modules/@walletconnect/modal-ui": { + "version": "2.6.2-canary-tma-3", + "resolved": "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.6.2-canary-tma-3.tgz", + "integrity": "sha512-cpIFtKgySySk+wqLxdU7tWEZ9dEA+yOJiSL6OWFpUU/7RvnT4Mm64VNU5FZwK1LxnaVnpBlETAjn2IiahJWMvw==", + "dependencies": { + "@walletconnect/modal-core": "2.6.2-canary-tma-3", + "lit": "2.8.0", + "motion": "10.16.2", + "qrcode": "1.5.3" + } + }, "providers/ethereum-provider/node_modules/uint8arrays": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", @@ -33767,7 +33767,7 @@ "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/modal": "2.6.2", + "@walletconnect/modal": "2.6.2-canary-tma-3", "@walletconnect/sign-client": "2.16.2", "@walletconnect/types": "2.16.2", "@walletconnect/universal-provider": "2.16.2", @@ -33779,6 +33779,34 @@ "web3": "1.7.5" }, "dependencies": { + "@walletconnect/modal": { + "version": "2.6.2-canary-tma-3", + "resolved": "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.6.2-canary-tma-3.tgz", + "integrity": "sha512-J5pvJEWOVxQ4KZR3V6WsvlSXWt5qqtn+XB7KCxDNUrXwAjp4QUQBl5HMpGUjEsz4m2L/daoFlN7jdq7/cx/HDA==", + "requires": { + "@walletconnect/modal-core": "2.6.2-canary-tma-3", + "@walletconnect/modal-ui": "2.6.2-canary-tma-3" + } + }, + "@walletconnect/modal-core": { + "version": "2.6.2-canary-tma-3", + "resolved": "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.6.2-canary-tma-3.tgz", + "integrity": "sha512-iB2uMBcpJH5/XEFv37d9vACuoD13T2ciLCOVKmuLbtUZZcya3E6hsYpDubOTz9l25A0iPurjcMkOik99Mj1aJA==", + "requires": { + "valtio": "1.11.2" + } + }, + "@walletconnect/modal-ui": { + "version": "2.6.2-canary-tma-3", + "resolved": "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.6.2-canary-tma-3.tgz", + "integrity": "sha512-cpIFtKgySySk+wqLxdU7tWEZ9dEA+yOJiSL6OWFpUU/7RvnT4Mm64VNU5FZwK1LxnaVnpBlETAjn2IiahJWMvw==", + "requires": { + "@walletconnect/modal-core": "2.6.2-canary-tma-3", + "lit": "2.8.0", + "motion": "10.16.2", + "qrcode": "1.5.3" + } + }, "uint8arrays": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", @@ -33885,34 +33913,6 @@ "pino": "7.11.0" } }, - "@walletconnect/modal": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.6.2.tgz", - "integrity": "sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==", - "requires": { - "@walletconnect/modal-core": "2.6.2", - "@walletconnect/modal-ui": "2.6.2" - } - }, - "@walletconnect/modal-core": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.6.2.tgz", - "integrity": "sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==", - "requires": { - "valtio": "1.11.2" - } - }, - "@walletconnect/modal-ui": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.6.2.tgz", - "integrity": "sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==", - "requires": { - "@walletconnect/modal-core": "2.6.2", - "lit": "2.8.0", - "motion": "10.16.2", - "qrcode": "1.5.3" - } - }, "@walletconnect/react-native-compat": { "version": "file:packages/react-native-compat", "requires": { diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index 1da5c8e6b..0e76dd47f 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -382,6 +382,7 @@ export async function handleDeeplinkRedirect({ console.warn("Document does not have focus, skipping deeplink."); return; } + // eslint-disable-next-line no-console console.log("Opening deeplink", link); if (link.startsWith("https://") || link.startsWith("http://")) { window.open(link, "_blank", "noreferrer noopener"); diff --git a/providers/ethereum-provider/package.json b/providers/ethereum-provider/package.json index 1f40fc866..875cc4576 100644 --- a/providers/ethereum-provider/package.json +++ b/providers/ethereum-provider/package.json @@ -47,7 +47,7 @@ "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/modal": "2.6.2", + "@walletconnect/modal": "2.6.2-canary-tma-3", "@walletconnect/sign-client": "2.16.2", "@walletconnect/types": "2.16.2", "@walletconnect/universal-provider": "2.16.2", From 91688a07a92dafd8ffede99c4b14a1bd4d954d36 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Wed, 25 Sep 2024 11:31:17 +0300 Subject: [PATCH 04/13] feat: adds `formatUriFromPairing` --- packages/core/src/controllers/pairing.ts | 18 +++++++++++++++++- packages/core/test/pairing.spec.ts | 16 ++++++++++++++++ packages/types/src/core/pairing.ts | 2 ++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/core/src/controllers/pairing.ts b/packages/core/src/controllers/pairing.ts index 2253a62e6..e1a81fbe9 100644 --- a/packages/core/src/controllers/pairing.ts +++ b/packages/core/src/controllers/pairing.ts @@ -96,7 +96,7 @@ export class Pairing implements IPairing { const topic = await this.core.crypto.setSymKey(symKey); const expiry = calcExpiry(FIVE_MINUTES); const relay = { protocol: RELAYER_DEFAULT_PROTOCOL }; - const pairing = { topic, expiry, relay, active: false }; + const pairing = { topic, expiry, relay, active: false, methods: params?.methods }; const uri = formatUri({ protocol: this.core.protocol, version: this.core.version, @@ -106,6 +106,7 @@ export class Pairing implements IPairing { expiryTimestamp: expiry, methods: params?.methods, }); + this.events.emit(PAIRING_EVENTS.create, pairing); this.core.expirer.set(topic, expiry); await this.pairings.set(topic, pairing); await this.core.relayer.subscribe(topic, { transportType: params?.transportType }); @@ -231,6 +232,21 @@ export class Pairing implements IPairing { } }; + public formatUriFromPairing: IPairing["formatUriFromPairing"] = (pairing) => { + this.isInitialized(); + const { topic, relay, expiry, methods } = pairing; + const symKey = this.core.crypto.keychain.get(topic); + return formatUri({ + protocol: this.core.protocol, + version: this.core.version, + topic, + symKey, + relay, + expiryTimestamp: expiry, + methods, + }); + }; + // ---------- Private Helpers ----------------------------------------------- // private sendRequest: IPairingPrivate["sendRequest"] = async (topic, method, params) => { diff --git a/packages/core/test/pairing.spec.ts b/packages/core/test/pairing.spec.ts index 3f0014504..12ffc3651 100644 --- a/packages/core/test/pairing.spec.ts +++ b/packages/core/test/pairing.spec.ts @@ -141,6 +141,22 @@ describe("Pairing", () => { }); }); + describe("formatUriFromPairing", () => { + it("should generate pairing uri from pairing", async () => { + let generatedUri = ""; + coreA.pairing.events.once("pairing_create", (payload) => { + generatedUri = coreA.pairing.formatUriFromPairing(payload); + }); + const { uri } = await coreA.pairing.create({ + methods: ["eth_sendTransaction", "personal_sign"], + }); + expect(generatedUri).to.be.eq(uri); + const parsedUri = parseUri(uri); + const parsedGeneratedUri = parseUri(generatedUri); + expect(parsedGeneratedUri).to.deep.equal(parsedUri); + }); + }); + describe("ping", () => { it("clients can ping each other", async () => { const { uri, topic } = await coreA.pairing.create(); diff --git a/packages/types/src/core/pairing.ts b/packages/types/src/core/pairing.ts index b3d2486de..318cda026 100644 --- a/packages/types/src/core/pairing.ts +++ b/packages/types/src/core/pairing.ts @@ -101,6 +101,8 @@ export abstract class IPairing { // for either peer to disconnect a pairing public abstract disconnect(params: { topic: string }): Promise; + + public abstract formatUriFromPairing(pairing: PairingTypes.Struct): string; } export interface IPairingPrivate { From 22970023fc14348559d2a6143f9fda8100f2f43b Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Mon, 30 Sep 2024 12:52:11 +0300 Subject: [PATCH 05/13] fix: session request deeplink payload encoding when targeting t.me links --- packages/utils/src/misc.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index 0e76dd47f..efa16d5a9 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -368,12 +368,17 @@ export async function handleDeeplinkRedirect({ const json = typeof wcDeepLink === "string" ? JSON.parse(wcDeepLink) : wcDeepLink; let deeplink = json?.href; - if (typeof deeplink !== "string") return; + const payload = `requestId=${id}&sessionTopic=${topic}`; if (deeplink.endsWith("/")) deeplink = deeplink.slice(0, -1); - - const link = `${deeplink}/wc?requestId=${id}&sessionTopic=${topic}`; + let link = `${deeplink}`; + if (deeplink.startsWith("https://t.me")) { + const startApp = deeplink.includes("?") ? "&startapp=" : "?startapp="; + link = `${link}${startApp}${toBase64(payload, true)}`; + } else { + link = `${link}/wc?${payload}`; + } const env = getEnvironment(); @@ -454,3 +459,12 @@ export function isTelegram() { Boolean((window as any).TelegramWebviewProxyProto) ); } + +export function toBase64(input: string, removePadding = false): string { + const encoded = Buffer.from(input).toString("base64"); + return removePadding ? encoded.replace(/[=]/g, "") : encoded; +} + +export function fromBase64(encodedString: string): string { + return Buffer.from(encodedString, "base64").toString("utf-8"); +} From 52e0bfd1946fedd61a7716f877a57d0b439b6cd5 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Mon, 30 Sep 2024 13:58:09 +0300 Subject: [PATCH 06/13] fix: isTelegram check --- packages/utils/src/misc.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index efa16d5a9..6998507a7 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -451,12 +451,13 @@ export function isTestRun() { export function isTelegram() { return ( + typeof window !== "undefined" && // eslint-disable-next-line @typescript-eslint/no-explicit-any - Boolean((window as any).TelegramWebviewProxy) || - // eslint-disable-next-line @typescript-eslint/no-explicit-any - Boolean((window as any).Telegram) || - // eslint-disable-next-line @typescript-eslint/no-explicit-any - Boolean((window as any).TelegramWebviewProxyProto) + (Boolean((window as any).TelegramWebviewProxy) || + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Boolean((window as any).Telegram) || + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Boolean((window as any).TelegramWebviewProxyProto)) ); } From 334e478975187d9c28ebf7cd2baedff314ff50b3 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Mon, 30 Sep 2024 13:59:15 +0300 Subject: [PATCH 07/13] chore: adds base64 decoding of pairing uri --- packages/utils/src/uri.ts | 8 ++++++++ packages/utils/test/uri.spec.ts | 12 +++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/utils/src/uri.ts b/packages/utils/src/uri.ts index d2ca8427e..a1d450e8e 100644 --- a/packages/utils/src/uri.ts +++ b/packages/utils/src/uri.ts @@ -1,5 +1,6 @@ import * as qs from "query-string"; import { EngineTypes, RelayerTypes } from "@walletconnect/types"; +import { fromBase64 } from "./misc"; // -- uri -------------------------------------------------- // @@ -17,6 +18,13 @@ export function parseRelayParams(params: any, delimiter = "-"): RelayerTypes.Pro } export function parseUri(str: string): EngineTypes.UriParameters { + if (!str.includes("wc:")) { + const parsed = fromBase64(str); + if (parsed?.includes("wc:")) { + str = parsed; + } + } + // remove android schema prefix str = str.includes("wc://") ? str.replace("wc://", "") : str; // remove ios schema prefix diff --git a/packages/utils/test/uri.spec.ts b/packages/utils/test/uri.spec.ts index 10e7365a3..226976a17 100644 --- a/packages/utils/test/uri.spec.ts +++ b/packages/utils/test/uri.spec.ts @@ -1,6 +1,6 @@ import { EngineTypes } from "@walletconnect/types"; import { expect, describe, it } from "vitest"; -import { formatUri, generateRandomBytes32, parseUri } from "../src"; +import { formatUri, generateRandomBytes32, parseUri, toBase64 } from "../src"; import { TEST_PAIRING_TOPIC, TEST_RELAY_OPTIONS, TEST_SYM_KEY } from "./shared"; const TEST_URI_PARAMS: EngineTypes.UriParameters = { @@ -34,4 +34,14 @@ describe("URI", () => { expect(parseUri(formatUri(TEST_URI_PARAMS)).topic).to.eql(topic); expect(parseUri(formatUri(TEST_URI_PARAMS)).topic.startsWith("//")).to.be.false; }); + it("should parse base64 uri", () => { + const encodedUri = toBase64(TEST_URI_STRING); + const uriParams = parseUri(TEST_URI_STRING); + const encodedUriParams = parseUri(encodedUri); + expect(uriParams).to.eql(encodedUriParams); + expect(uriParams.version).to.eql(encodedUriParams.version); + expect(uriParams.topic).to.eql(encodedUriParams.topic); + expect(uriParams.symKey).to.eql(encodedUriParams.symKey); + expect(uriParams.relay.data).to.eql(encodedUriParams.relay.data); + }); }); From bb03dfd9f5e61b1576f7926aedf6b80b727fbfe4 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Mon, 30 Sep 2024 14:00:37 +0300 Subject: [PATCH 08/13] chore: updates modal to latest --- package-lock.json | 249 ++++++++++++----------- providers/ethereum-provider/package.json | 2 +- 2 files changed, 126 insertions(+), 125 deletions(-) diff --git a/package-lock.json b/package-lock.json index 082737305..87ea4fb19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4164,9 +4164,9 @@ } }, "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.2.tgz", - "integrity": "sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", + "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==" }, "node_modules/@lit/reactive-element": { "version": "1.6.3", @@ -4177,45 +4177,45 @@ } }, "node_modules/@motionone/animation": { - "version": "10.16.3", - "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.16.3.tgz", - "integrity": "sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g==", + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", + "integrity": "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==", "dependencies": { - "@motionone/easing": "^10.16.3", - "@motionone/types": "^10.16.3", - "@motionone/utils": "^10.16.3", + "@motionone/easing": "^10.18.0", + "@motionone/types": "^10.17.1", + "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" } }, "node_modules/@motionone/dom": { - "version": "10.16.4", - "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.4.tgz", - "integrity": "sha512-HPHlVo/030qpRj9R8fgY50KTN4Ko30moWRTA3L3imrsRBmob93cTYmodln49HYFbQm01lFF7X523OkKY0DX6UA==", - "dependencies": { - "@motionone/animation": "^10.16.3", - "@motionone/generators": "^10.16.4", - "@motionone/types": "^10.16.3", - "@motionone/utils": "^10.16.3", + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.18.0.tgz", + "integrity": "sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==", + "dependencies": { + "@motionone/animation": "^10.18.0", + "@motionone/generators": "^10.18.0", + "@motionone/types": "^10.17.1", + "@motionone/utils": "^10.18.0", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } }, "node_modules/@motionone/easing": { - "version": "10.16.3", - "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.16.3.tgz", - "integrity": "sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w==", + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz", + "integrity": "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==", "dependencies": { - "@motionone/utils": "^10.16.3", + "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" } }, "node_modules/@motionone/generators": { - "version": "10.16.4", - "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.16.4.tgz", - "integrity": "sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg==", + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz", + "integrity": "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==", "dependencies": { - "@motionone/types": "^10.16.3", - "@motionone/utils": "^10.16.3", + "@motionone/types": "^10.17.1", + "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" } }, @@ -4229,16 +4229,16 @@ } }, "node_modules/@motionone/types": { - "version": "10.16.3", - "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.16.3.tgz", - "integrity": "sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg==" + "version": "10.17.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", + "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==" }, "node_modules/@motionone/utils": { - "version": "10.16.3", - "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.16.3.tgz", - "integrity": "sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA==", + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz", + "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==", "dependencies": { - "@motionone/types": "^10.16.3", + "@motionone/types": "^10.17.1", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } @@ -4247,6 +4247,7 @@ "version": "10.16.4", "resolved": "https://registry.npmjs.org/@motionone/vue/-/vue-10.16.4.tgz", "integrity": "sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==", + "deprecated": "Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion", "dependencies": { "@motionone/dom": "^10.16.4", "tslib": "^2.3.1" @@ -7987,6 +7988,34 @@ "pino": "7.11.0" } }, + "node_modules/@walletconnect/modal": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.7.0.tgz", + "integrity": "sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==", + "dependencies": { + "@walletconnect/modal-core": "2.7.0", + "@walletconnect/modal-ui": "2.7.0" + } + }, + "node_modules/@walletconnect/modal-core": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.7.0.tgz", + "integrity": "sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==", + "dependencies": { + "valtio": "1.11.2" + } + }, + "node_modules/@walletconnect/modal-ui": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.7.0.tgz", + "integrity": "sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==", + "dependencies": { + "@walletconnect/modal-core": "2.7.0", + "lit": "2.8.0", + "motion": "10.16.2", + "qrcode": "1.5.3" + } + }, "node_modules/@walletconnect/react-native-compat": { "resolved": "packages/react-native-compat", "link": true @@ -27641,7 +27670,7 @@ "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/modal": "2.6.2-canary-tma-3", + "@walletconnect/modal": "2.7.0", "@walletconnect/sign-client": "2.16.3", "@walletconnect/types": "2.16.3", "@walletconnect/universal-provider": "2.16.3", @@ -27655,34 +27684,6 @@ "web3": "1.7.5" } }, - "providers/ethereum-provider/node_modules/@walletconnect/modal": { - "version": "2.6.2-canary-tma-3", - "resolved": "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.6.2-canary-tma-3.tgz", - "integrity": "sha512-J5pvJEWOVxQ4KZR3V6WsvlSXWt5qqtn+XB7KCxDNUrXwAjp4QUQBl5HMpGUjEsz4m2L/daoFlN7jdq7/cx/HDA==", - "dependencies": { - "@walletconnect/modal-core": "2.6.2-canary-tma-3", - "@walletconnect/modal-ui": "2.6.2-canary-tma-3" - } - }, - "providers/ethereum-provider/node_modules/@walletconnect/modal-core": { - "version": "2.6.2-canary-tma-3", - "resolved": "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.6.2-canary-tma-3.tgz", - "integrity": "sha512-iB2uMBcpJH5/XEFv37d9vACuoD13T2ciLCOVKmuLbtUZZcya3E6hsYpDubOTz9l25A0iPurjcMkOik99Mj1aJA==", - "dependencies": { - "valtio": "1.11.2" - } - }, - "providers/ethereum-provider/node_modules/@walletconnect/modal-ui": { - "version": "2.6.2-canary-tma-3", - "resolved": "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.6.2-canary-tma-3.tgz", - "integrity": "sha512-cpIFtKgySySk+wqLxdU7tWEZ9dEA+yOJiSL6OWFpUU/7RvnT4Mm64VNU5FZwK1LxnaVnpBlETAjn2IiahJWMvw==", - "dependencies": { - "@walletconnect/modal-core": "2.6.2-canary-tma-3", - "lit": "2.8.0", - "motion": "10.16.2", - "qrcode": "1.5.3" - } - }, "providers/ethereum-provider/node_modules/uint8arrays": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", @@ -30956,9 +30957,9 @@ } }, "@lit-labs/ssr-dom-shim": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.2.tgz", - "integrity": "sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", + "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==" }, "@lit/reactive-element": { "version": "1.6.3", @@ -30969,45 +30970,45 @@ } }, "@motionone/animation": { - "version": "10.16.3", - "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.16.3.tgz", - "integrity": "sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g==", + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", + "integrity": "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==", "requires": { - "@motionone/easing": "^10.16.3", - "@motionone/types": "^10.16.3", - "@motionone/utils": "^10.16.3", + "@motionone/easing": "^10.18.0", + "@motionone/types": "^10.17.1", + "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" } }, "@motionone/dom": { - "version": "10.16.4", - "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.4.tgz", - "integrity": "sha512-HPHlVo/030qpRj9R8fgY50KTN4Ko30moWRTA3L3imrsRBmob93cTYmodln49HYFbQm01lFF7X523OkKY0DX6UA==", - "requires": { - "@motionone/animation": "^10.16.3", - "@motionone/generators": "^10.16.4", - "@motionone/types": "^10.16.3", - "@motionone/utils": "^10.16.3", + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.18.0.tgz", + "integrity": "sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==", + "requires": { + "@motionone/animation": "^10.18.0", + "@motionone/generators": "^10.18.0", + "@motionone/types": "^10.17.1", + "@motionone/utils": "^10.18.0", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } }, "@motionone/easing": { - "version": "10.16.3", - "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.16.3.tgz", - "integrity": "sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w==", + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz", + "integrity": "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==", "requires": { - "@motionone/utils": "^10.16.3", + "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" } }, "@motionone/generators": { - "version": "10.16.4", - "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.16.4.tgz", - "integrity": "sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg==", + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz", + "integrity": "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==", "requires": { - "@motionone/types": "^10.16.3", - "@motionone/utils": "^10.16.3", + "@motionone/types": "^10.17.1", + "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" } }, @@ -31021,16 +31022,16 @@ } }, "@motionone/types": { - "version": "10.16.3", - "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.16.3.tgz", - "integrity": "sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg==" + "version": "10.17.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", + "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==" }, "@motionone/utils": { - "version": "10.16.3", - "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.16.3.tgz", - "integrity": "sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA==", + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz", + "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==", "requires": { - "@motionone/types": "^10.16.3", + "@motionone/types": "^10.17.1", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } @@ -33768,7 +33769,7 @@ "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/modal": "2.6.2-canary-tma-3", + "@walletconnect/modal": "2.7.0", "@walletconnect/sign-client": "2.16.3", "@walletconnect/types": "2.16.3", "@walletconnect/universal-provider": "2.16.3", @@ -33780,34 +33781,6 @@ "web3": "1.7.5" }, "dependencies": { - "@walletconnect/modal": { - "version": "2.6.2-canary-tma-3", - "resolved": "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.6.2-canary-tma-3.tgz", - "integrity": "sha512-J5pvJEWOVxQ4KZR3V6WsvlSXWt5qqtn+XB7KCxDNUrXwAjp4QUQBl5HMpGUjEsz4m2L/daoFlN7jdq7/cx/HDA==", - "requires": { - "@walletconnect/modal-core": "2.6.2-canary-tma-3", - "@walletconnect/modal-ui": "2.6.2-canary-tma-3" - } - }, - "@walletconnect/modal-core": { - "version": "2.6.2-canary-tma-3", - "resolved": "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.6.2-canary-tma-3.tgz", - "integrity": "sha512-iB2uMBcpJH5/XEFv37d9vACuoD13T2ciLCOVKmuLbtUZZcya3E6hsYpDubOTz9l25A0iPurjcMkOik99Mj1aJA==", - "requires": { - "valtio": "1.11.2" - } - }, - "@walletconnect/modal-ui": { - "version": "2.6.2-canary-tma-3", - "resolved": "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.6.2-canary-tma-3.tgz", - "integrity": "sha512-cpIFtKgySySk+wqLxdU7tWEZ9dEA+yOJiSL6OWFpUU/7RvnT4Mm64VNU5FZwK1LxnaVnpBlETAjn2IiahJWMvw==", - "requires": { - "@walletconnect/modal-core": "2.6.2-canary-tma-3", - "lit": "2.8.0", - "motion": "10.16.2", - "qrcode": "1.5.3" - } - }, "uint8arrays": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", @@ -33914,6 +33887,34 @@ "pino": "7.11.0" } }, + "@walletconnect/modal": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.7.0.tgz", + "integrity": "sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==", + "requires": { + "@walletconnect/modal-core": "2.7.0", + "@walletconnect/modal-ui": "2.7.0" + } + }, + "@walletconnect/modal-core": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.7.0.tgz", + "integrity": "sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==", + "requires": { + "valtio": "1.11.2" + } + }, + "@walletconnect/modal-ui": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.7.0.tgz", + "integrity": "sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==", + "requires": { + "@walletconnect/modal-core": "2.7.0", + "lit": "2.8.0", + "motion": "10.16.2", + "qrcode": "1.5.3" + } + }, "@walletconnect/react-native-compat": { "version": "file:packages/react-native-compat", "requires": { diff --git a/providers/ethereum-provider/package.json b/providers/ethereum-provider/package.json index b8a37176b..effd9056a 100644 --- a/providers/ethereum-provider/package.json +++ b/providers/ethereum-provider/package.json @@ -47,7 +47,7 @@ "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/modal": "2.6.2-canary-tma-3", + "@walletconnect/modal": "2.7.0", "@walletconnect/sign-client": "2.16.3", "@walletconnect/types": "2.16.3", "@walletconnect/universal-provider": "2.16.3", From bfa4aadae8e969b1569b497cc76181eb30a0bb50 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Mon, 30 Sep 2024 14:02:28 +0300 Subject: [PATCH 09/13] chore: rm logs --- packages/utils/src/misc.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index 6998507a7..890868c84 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -387,8 +387,7 @@ export async function handleDeeplinkRedirect({ console.warn("Document does not have focus, skipping deeplink."); return; } - // eslint-disable-next-line no-console - console.log("Opening deeplink", link); + if (link.startsWith("https://") || link.startsWith("http://")) { window.open(link, "_blank", "noreferrer noopener"); } else { From cc4b3ceeff7cc732ed6d108893d334d9c0617910 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Mon, 30 Sep 2024 14:17:14 +0300 Subject: [PATCH 10/13] chore: reenable store deeplink check --- packages/sign-client/src/controllers/engine.ts | 5 ++++- packages/utils/src/misc.ts | 12 ++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/sign-client/src/controllers/engine.ts b/packages/sign-client/src/controllers/engine.ts index 168c29310..0daa3a982 100644 --- a/packages/sign-client/src/controllers/engine.ts +++ b/packages/sign-client/src/controllers/engine.ts @@ -615,7 +615,10 @@ export class Engine extends IEngine { new Promise(async (resolve) => { // only attempt to handle deeplinks if they are not explicitly disabled in the session config if (!session.sessionConfig?.disableDeepLink) { - const wcDeepLink = (await getDeepLink(WALLETCONNECT_DEEPLINK_CHOICE)) as string; + const wcDeepLink = (await getDeepLink( + this.client.core.storage, + WALLETCONNECT_DEEPLINK_CHOICE, + )) as string; await handleDeeplinkRedirect({ id: clientRpcId, topic, wcDeepLink }); } resolve(); diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index 890868c84..2a716eeaa 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -9,6 +9,7 @@ import { import { getDocument, getLocation, getNavigator } from "@walletconnect/window-getters"; import { getWindowMetadata } from "@walletconnect/window-metadata"; import { ErrorResponse } from "@walletconnect/jsonrpc-utils"; +import { IKeyValueStorage } from "@walletconnect/keyvaluestorage"; import * as qs from "query-string"; // -- constants -----------------------------------------// @@ -407,11 +408,14 @@ export async function handleDeeplinkRedirect({ } //@ts-ignore -export async function getDeepLink(key: string) { +export async function getDeepLink(storage: IKeyValueStorage, key: string) { try { - // check localStorage as fallback - if (!isBrowser()) return; - return localStorage.getItem(key) as string; + let link: string | undefined = ""; + if (isBrowser()) { + link = localStorage.getItem(key) as string; + } + link = await storage.getItem(key); + return link; } catch (err) { // eslint-disable-next-line no-console console.error(err); From d929b1c0cd0c3cf741763b7a9ff153e38e943647 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Mon, 30 Sep 2024 14:18:40 +0300 Subject: [PATCH 11/13] chore: lint --- packages/utils/src/misc.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index 2a716eeaa..b33f4d3fa 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -407,19 +407,18 @@ export async function handleDeeplinkRedirect({ } } -//@ts-ignore export async function getDeepLink(storage: IKeyValueStorage, key: string) { + let link: string | undefined = ""; try { - let link: string | undefined = ""; if (isBrowser()) { link = localStorage.getItem(key) as string; } link = await storage.getItem(key); - return link; } catch (err) { // eslint-disable-next-line no-console console.error(err); } + return link; } export function getCommonValuesInArrays(arr1: T[], arr2: T[]): T[] { From c728abfef8b42c729b1927d7d1c8dbd66607a8e4 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Mon, 30 Sep 2024 15:05:31 +0300 Subject: [PATCH 12/13] fix: returns localStorage contains deeplink --- packages/utils/src/misc.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index b33f4d3fa..f3865b514 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -412,6 +412,7 @@ export async function getDeepLink(storage: IKeyValueStorage, key: string) { try { if (isBrowser()) { link = localStorage.getItem(key) as string; + if (link) return link; } link = await storage.getItem(key); } catch (err) { From f0b91c5e90bc1d6922162095fc5aa83b6384159a Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Mon, 30 Sep 2024 19:16:49 +0300 Subject: [PATCH 13/13] refactor: adds tests to deeplink builder --- packages/utils/src/misc.ts | 27 +++++++++++++++------------ packages/utils/test/misc.spec.ts | 31 +++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index f3865b514..11940c7f3 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -368,19 +368,9 @@ export async function handleDeeplinkRedirect({ if (!wcDeepLink) return; const json = typeof wcDeepLink === "string" ? JSON.parse(wcDeepLink) : wcDeepLink; - let deeplink = json?.href; + const deeplink = json?.href; if (typeof deeplink !== "string") return; - - const payload = `requestId=${id}&sessionTopic=${topic}`; - if (deeplink.endsWith("/")) deeplink = deeplink.slice(0, -1); - let link = `${deeplink}`; - if (deeplink.startsWith("https://t.me")) { - const startApp = deeplink.includes("?") ? "&startapp=" : "?startapp="; - link = `${link}${startApp}${toBase64(payload, true)}`; - } else { - link = `${link}/wc?${payload}`; - } - + const link = formatDeeplinkUrl(deeplink, id, topic); const env = getEnvironment(); if (env === ENV_MAP.browser) { @@ -407,6 +397,19 @@ export async function handleDeeplinkRedirect({ } } +export function formatDeeplinkUrl(deeplink: string, requestId: number, sessionTopic: string) { + const payload = `requestId=${requestId}&sessionTopic=${sessionTopic}`; + if (deeplink.endsWith("/")) deeplink = deeplink.slice(0, -1); + let link = `${deeplink}`; + if (deeplink.startsWith("https://t.me")) { + const startApp = deeplink.includes("?") ? "&startapp=" : "?startapp="; + link = `${link}${startApp}${toBase64(payload, true)}`; + } else { + link = `${link}/wc?${payload}`; + } + return link; +} + export async function getDeepLink(storage: IKeyValueStorage, key: string) { let link: string | undefined = ""; try { diff --git a/packages/utils/test/misc.spec.ts b/packages/utils/test/misc.spec.ts index 84d88792b..a388fd9bb 100644 --- a/packages/utils/test/misc.spec.ts +++ b/packages/utils/test/misc.spec.ts @@ -1,11 +1,13 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { calcExpiry, + formatDeeplinkUrl, formatRelayRpcUrl, formatUA, getSearchParamFromURL, hasOverlap, isExpired, + toBase64, } from "../src"; const RELAY_URL = "wss://relay.walletconnect.org"; @@ -121,4 +123,33 @@ describe("Misc", () => { }); }); }); + describe("deep links", () => { + it("should format universal link", () => { + const deepLink = "https://example.com"; + const requestId = 123; + const sessionTopic = "randomSessionTopic"; + const expectedDeepLink = `${deepLink}/wc?requestId=${requestId}&sessionTopic=${sessionTopic}`; + const formatted = formatDeeplinkUrl(deepLink, requestId, sessionTopic); + expect(formatted).to.eql(expectedDeepLink); + }); + it("should format deep link", () => { + const deepLink = "trust://"; + const requestId = 123; + const sessionTopic = "randomSessionTopic"; + const expectedDeepLink = `${deepLink}wc?requestId=${requestId}&sessionTopic=${sessionTopic}`; + const formatted = formatDeeplinkUrl(deepLink, requestId, sessionTopic); + expect(formatted).to.eql(expectedDeepLink); + }); + it("should format telegram universal link", async () => { + const deepLink = "https://t.me"; + const requestId = 123; + const sessionTopic = "randomSessionTopic"; + const partToEncode = `requestId=${requestId}&sessionTopic=${sessionTopic}`; + const expectedDeepLink = `${deepLink}?startapp=${toBase64(partToEncode, true)}`; + const formatted = formatDeeplinkUrl(deepLink, requestId, sessionTopic); + expect(formatted).to.eql(expectedDeepLink); + const decoded = atob(formatted.split("startapp=")[1]); + expect(decoded).to.eql(partToEncode); + }); + }); });