import { IChainData } from '..' import WalletConnectProvider from '../lib/WalletConnectProvider' import { toHexChainId } from '../util/chain.util' export class ZWalletConnect { provider: WalletConnectProvider accounts: string[] = [] socketConnected = false constructor(rpc: any) { 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(()=>{ // @ts-ignore jumpToWallet(uri) }, 1500) //@ts-ignore // jumpToWallet(uri); }, close(): void { } } }) this._subscribeToEvents(this.provider) } public async connect() { console.log('wallet connect begin connect') return this.provider.enable() } private _subscribeToEvents(provider: WalletConnectProvider) { 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) }) // Subscribe to session disconnection this.provider.on('disconnect', (err: any) => { console.log('disconnect', err) }) } /** * @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) resolve && resolve(chainId); } 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 }, 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); }) }) } public async signData(signObj: any, signer: string) { const msgParams = JSON.stringify(signObj) const from = signer || this.accounts[0] if (!from) { throw new Error('no account'); } console.log('sending personal sign req from', from, msgParams) const params = [from, msgParams] const result: any = await this.sendCmd({ method: 'eth_signTypedData_v4', params, 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 } resolve && resolve(result) }) }) } }