diff --git a/package-lock.json b/package-lock.json index 9fdc71630..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" @@ -7988,28 +7989,28 @@ } }, "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==", + "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.6.2", - "@walletconnect/modal-ui": "2.6.2" + "@walletconnect/modal-core": "2.7.0", + "@walletconnect/modal-ui": "2.7.0" } }, "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==", + "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.6.2", - "resolved": "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.6.2.tgz", - "integrity": "sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==", + "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.6.2", + "@walletconnect/modal-core": "2.7.0", "lit": "2.8.0", "motion": "10.16.2", "qrcode": "1.5.3" @@ -27669,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", + "@walletconnect/modal": "2.7.0", "@walletconnect/sign-client": "2.16.3", "@walletconnect/types": "2.16.3", "@walletconnect/universal-provider": "2.16.3", @@ -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", + "@walletconnect/modal": "2.7.0", "@walletconnect/sign-client": "2.16.3", "@walletconnect/types": "2.16.3", "@walletconnect/universal-provider": "2.16.3", @@ -33887,28 +33888,28 @@ } }, "@walletconnect/modal": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.6.2.tgz", - "integrity": "sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==", + "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.6.2", - "@walletconnect/modal-ui": "2.6.2" + "@walletconnect/modal-core": "2.7.0", + "@walletconnect/modal-ui": "2.7.0" } }, "@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==", + "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.6.2", - "resolved": "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.6.2.tgz", - "integrity": "sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==", + "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.6.2", + "@walletconnect/modal-core": "2.7.0", "lit": "2.8.0", "motion": "10.16.2", "qrcode": "1.5.3" 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/sign-client/src/controllers/engine.ts b/packages/sign-client/src/controllers/engine.ts index fc84f6072..0daa3a982 100644 --- a/packages/sign-client/src/controllers/engine.ts +++ b/packages/sign-client/src/controllers/engine.ts @@ -615,11 +615,11 @@ 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( + const wcDeepLink = (await getDeepLink( this.client.core.storage, WALLETCONNECT_DEEPLINK_CHOICE, - ); - handleDeeplinkRedirect({ id: clientRpcId, topic, wcDeepLink }); + )) as string; + await handleDeeplinkRedirect({ id: clientRpcId, topic, wcDeepLink }); } resolve(); }), 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 { diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index 77e0f96e8..11940c7f3 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -368,14 +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; - - if (deeplink.endsWith("/")) deeplink = deeplink.slice(0, -1); - - const link = `${deeplink}/wc?requestId=${id}&sessionTopic=${topic}`; - + const link = formatDeeplinkUrl(deeplink, id, topic); const env = getEnvironment(); if (env === ENV_MAP.browser) { @@ -387,7 +382,7 @@ export async function handleDeeplinkRedirect({ if (link.startsWith("https://") || link.startsWith("http://")) { window.open(link, "_blank", "noreferrer noopener"); } else { - window.open(link, "_self", "noreferrer noopener"); + window.open(link, isTelegram() ? "_blank" : "_self", "noreferrer noopener"); } } else if (env === ENV_MAP.reactNative) { // global.Linking is set by react-native-compat @@ -402,18 +397,32 @@ export async function handleDeeplinkRedirect({ } } -export async function getDeepLink(store: IKeyValueStorage, key: string) { - try { - const deepLink = await store.getItem(key); - if (deepLink) return deepLink; +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; +} - // check localStorage as fallback - if (!isBrowser()) return; - return localStorage.getItem(key) as string; +export async function getDeepLink(storage: IKeyValueStorage, key: string) { + let link: string | undefined = ""; + try { + if (isBrowser()) { + link = localStorage.getItem(key) as string; + if (link) return link; + } + link = await storage.getItem(key); } catch (err) { // eslint-disable-next-line no-console console.error(err); } + return link; } export function getCommonValuesInArrays(arr1: T[], arr2: T[]): T[] { @@ -445,3 +454,24 @@ export function uuidv4() { export function isTestRun() { return typeof process !== "undefined" && process.env.IS_VITEST === "true"; } + +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)) + ); +} + +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"); +} 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/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); + }); + }); }); 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); + }); }); diff --git a/providers/ethereum-provider/package.json b/providers/ethereum-provider/package.json index 997c6fc44..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", + "@walletconnect/modal": "2.7.0", "@walletconnect/sign-client": "2.16.3", "@walletconnect/types": "2.16.3", "@walletconnect/universal-provider": "2.16.3",