From 8cfc528f0857b8f0aa83f3060a098446f67407c7 Mon Sep 17 00:00:00 2001 From: cebgcontract <99630598+cebgcontract@users.noreply.github.com> Date: Mon, 5 Dec 2022 19:05:21 +0800 Subject: [PATCH] =?UTF-8?q?wc=E4=B8=8D=E5=86=8D=E4=BF=9D=E5=AD=98=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0session?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- patches/@walletconnect+core+1.8.0.patch | 17 ++- src/comp/ZWalletConnect.ts | 154 +++++++++++++----------- src/index.ts | 6 +- 3 files changed, 100 insertions(+), 77 deletions(-) diff --git a/patches/@walletconnect+core+1.8.0.patch b/patches/@walletconnect+core+1.8.0.patch index 3820b42..659fce7 100644 --- a/patches/@walletconnect+core+1.8.0.patch +++ b/patches/@walletconnect+core+1.8.0.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/@walletconnect/core/dist/esm/index.js b/node_modules/@walletconnect/core/dist/esm/index.js -index a66eece..4668f0f 100644 +index a66eece..e6a79f4 100644 --- a/node_modules/@walletconnect/core/dist/esm/index.js +++ b/node_modules/@walletconnect/core/dist/esm/index.js @@ -22,11 +22,16 @@ class Connector { @@ -59,12 +59,25 @@ index a66eece..4668f0f 100644 + event: "socket_open", + params: [], + }); -+ self._transport.remove("open", sendOpenMsg) ++ self._transport.remove("open", sendOpenMsg); + } + this._transport.on("open", sendOpenMsg); this._transport.open(); } _formatUri() { +@@ -867,9 +887,9 @@ class Connector { + } + _getStorageSession() { + let result = null; +- if (this._sessionStorage) { +- result = this._sessionStorage.getSession(); +- } ++ // if (this._sessionStorage) { ++ // result = this._sessionStorage.getSession(); ++ // } + return result; + } + _setStorageSession() { diff --git a/node_modules/@walletconnect/core/dist/esm/url.js b/node_modules/@walletconnect/core/dist/esm/url.js index d6da2b8..19202d5 100644 --- a/node_modules/@walletconnect/core/dist/esm/url.js diff --git a/src/comp/ZWalletConnect.ts b/src/comp/ZWalletConnect.ts index dc2eb30..98b41fa 100644 --- a/src/comp/ZWalletConnect.ts +++ b/src/comp/ZWalletConnect.ts @@ -1,125 +1,133 @@ - -import { IChainData } from '..' -import WalletConnectProvider from '../lib/WalletConnectProvider' -import { toHexChainId } from '../util/chain.util' +import { IChainData } from ".."; +import WalletConnectProvider from "../lib/WalletConnectProvider"; +import { toHexChainId } from "../util/chain.util"; export class ZWalletConnect { - provider: WalletConnectProvider - accounts: string[] = [] - socketConnected = false + provider: WalletConnectProvider; + accounts: string[] = []; + socketConnected = false; constructor(rpc: any) { - console.log('ZWalletConnect constructor'); + console.log("ZWalletConnect constructor"); this.provider = new WalletConnectProvider({ rpc, qrcodeModal: { open(uri: string, cb: any, opts?: any): void { - console.log('walletconnect prepare jump to wallet: ' + uri) - setTimeout(()=>{ + console.log("walletconnect prepare jump to wallet: " + uri); + setTimeout(() => { // @ts-ignore - jumpToWallet(uri) - }, 1500) + jumpToWallet(uri); + }, 1500); //@ts-ignore // jumpToWallet(uri); }, - close(): void { - - } - } - }) - this._subscribeToEvents(this.provider) + close(): void {}, + }, + }); + this._subscribeToEvents(this.provider); } public async connect() { - console.log('wallet connect begin connect') - return this.provider.enable() + console.log("wallet connect begin connect"); + return this.provider.enable(); + } + + public async disconnect() { + if (this.provider) { + this.provider.removeListener("accountsChanged"); + this.provider.removeListener("chainChanged"); + this.provider.removeListener("disconnect"); + await this.provider.disconnect(); + } } private _subscribeToEvents(provider: WalletConnectProvider) { - this.provider.on('accountsChanged', async(accounts: string[]) => { - console.log('accountsChanged: ', accounts) + this.provider.on("accountsChanged", async (accounts: string[]) => { + console.log("accountsChanged: ", accounts); this.accounts = accounts; - }) + }); // Subscribe to chainId change - this.provider.on('chainChanged', async(chainId: string) => { - const chainIdNum = parseInt(chainId) - console.log('chainChanged', chainId, chainIdNum) - }) + this.provider.on("chainChanged", async (chainId: string) => { + const chainIdNum = parseInt(chainId); + console.log("chainChanged", chainId, chainIdNum); + }); // Subscribe to session disconnection - this.provider.on('disconnect', (err: any) => { - console.log('disconnect', err) - }) + this.provider.on("disconnect", (err: any) => { + console.log("disconnect", err); + }); } /** - * @param data + * @param data */ public async addOrChangeChain(data: IChainData) { return new Promise((resolve, reject) => { const onChainChange = (chainId: string) => { - console.log('switchEthereumChain: ', chainId) - this.provider.removeListener('chainChanged', onChainChange) + console.log("switchEthereumChain: ", chainId); + this.provider.removeListener("chainChanged", onChainChange); resolve && resolve(chainId); - } - this.provider.on('chainChanged', onChainChange) + }; + this.provider.on("chainChanged", onChainChange); let params = { chainId: toHexChainId(data.id), chainName: data.name, nativeCurrency: { name: data.symbol, symbol: data.symbol, - decimals: data.decimals || 18 + decimals: data.decimals || 18, }, rpcUrls: [data.rpc], - blockExplorerUrls: [data.explorerurl] - } - this.provider.request({ - method: 'wallet_addEthereumChain', - params: [params] - }) - .then(() => { - console.log('add chain success, wait result'); - }) - .catch(err=>{ - console.error('add chain error: ', JSON.stringify(err)); - this.provider.removeListener('chainChanged', onChainChange); - reject && reject(err); - }) - }) + blockExplorerUrls: [data.explorerurl], + }; + this.provider + .request({ + method: "wallet_addEthereumChain", + params: [params], + }) + .then(() => { + console.log("add chain success, wait result"); + }) + .catch((err) => { + console.error("add chain error: ", JSON.stringify(err)); + this.provider.removeListener("chainChanged", onChainChange); + reject && reject(err); + }); + }); } - public async signData(signObj: any, signer: string) { - const msgParams = JSON.stringify(signObj) - const from = signer || this.accounts[0] + const msgParams = JSON.stringify(signObj); + const from = signer || this.accounts[0]; if (!from) { - throw new Error('no account'); + throw new Error("no account"); } - console.log('sending personal sign req from', from, msgParams) - const params = [from, msgParams] + console.log("sending personal sign req from", from, msgParams); + const params = [from, msgParams]; const result: any = await this.sendCmd({ - method: 'eth_signTypedData_v4', + method: "eth_signTypedData_v4", params, - from - }) - return result.result + from, + }); + return result.result; } public async sendCmd({ method, params, from }: any) { return new Promise((resolve, reject) => { - this.provider.sendAsync({ - method, - params, - from - }, async function(err: any, result: any) { - if (err) { - reject && reject(err) - return + this.provider.sendAsync( + { + method, + params, + from, + }, + async function (err: any, result: any) { + if (err) { + reject && reject(err); + return; + } + resolve && resolve(result); } - resolve && resolve(result) - }) - }) + ); + }); } - } diff --git a/src/index.ts b/src/index.ts index 584ed97..21359a2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -140,12 +140,14 @@ export default class JCWallet { */ public async initThirdPartyWallet() { this.walletType = WalletType.THIRD_PATH; - return new Promise((resolve, reject) => { + return new Promise(async (resolve, reject) => { for (const d of AllChains) { const id = d.id; this.rpc[id] = d.rpc; } - + if (this.wConnect) { + this.wConnect.disconnect(); + } this.wConnect = new ZWalletConnect(this.rpc); // return this.wConnect.connect(); this.wConnect