wallet-connect-web-examples/wallets/react-wallet-eip155/src/utils/LegacyWalletConnectUtil.ts
0xAsimetriq 2379c795ce
eip155 example (#115)
* eip155 example

* temp fix for duplicate accs
2023-02-15 17:11:42 +02:00

97 lines
3.0 KiB
TypeScript

import { EIP155_SIGNING_METHODS } from '@/data/EIP155Data'
import ModalStore from '@/store/ModalStore'
import LegacySignClient from '@walletconnect/client'
import { IWalletConnectSession } from '@walletconnect/legacy-types'
export let legacySignClient: LegacySignClient
export function createLegacySignClient({ uri }: { uri?: string } = {}) {
// If URI is passed always create a new session,
// otherwise fall back to cached session if client isn't already instantiated.
if (uri) {
deleteCachedLegacySession()
legacySignClient = new LegacySignClient({ uri })
} else if (!legacySignClient && getCachedLegacySession()) {
const session = getCachedLegacySession()
legacySignClient = new LegacySignClient({ session })
} else {
return
}
legacySignClient.on('session_request', (error, payload) => {
if (error) {
throw new Error(`legacySignClient > session_request failed: ${error}`)
}
ModalStore.open('LegacySessionProposalModal', { legacyProposal: payload })
})
legacySignClient.on('connect', () => {
console.log('legacySignClient > connect')
})
legacySignClient.on('error', error => {
throw new Error(`legacySignClient > on error: ${error}`)
})
legacySignClient.on('call_request', (error, payload) => {
if (error) {
throw new Error(`legacySignClient > call_request failed: ${error}`)
}
onCallRequest(payload)
})
legacySignClient.on('disconnect', async () => {
deleteCachedLegacySession()
})
}
const onCallRequest = async (payload: { id: number; method: string; params: any[] }) => {
switch (payload.method) {
case EIP155_SIGNING_METHODS.ETH_SIGN:
case EIP155_SIGNING_METHODS.PERSONAL_SIGN:
return ModalStore.open('LegacySessionSignModal', {
legacyCallRequestEvent: payload,
legacyRequestSession: legacySignClient.session
})
case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA:
case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V3:
case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V4:
return ModalStore.open('LegacySessionSignTypedDataModal', {
legacyCallRequestEvent: payload,
legacyRequestSession: legacySignClient.session
})
case EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION:
case EIP155_SIGNING_METHODS.ETH_SIGN_TRANSACTION:
return ModalStore.open('LegacySessionSendTransactionModal', {
legacyCallRequestEvent: payload,
legacyRequestSession: legacySignClient.session
})
default:
alert(`${payload.method} is not supported for WalletConnect v1`)
}
}
function getCachedLegacySession(): IWalletConnectSession | undefined {
if (typeof window === 'undefined') return
const local = window.localStorage ? window.localStorage.getItem('walletconnect') : null
let session = null
if (local) {
try {
session = JSON.parse(local)
} catch (error) {
throw error
}
}
return session
}
function deleteCachedLegacySession(): void {
if (typeof window === 'undefined') return
window.localStorage.removeItem('walletconnect')
}