jcwallet/src/comp/ZWalletConnect.ts
2022-09-16 11:43:46 +08:00

126 lines
3.3 KiB
TypeScript

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)
})
})
}
}