126 lines
3.3 KiB
TypeScript
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)
|
|
})
|
|
})
|
|
}
|
|
|
|
}
|