Commit 1e16ac84 authored by Zach Pomerantz's avatar Zach Pomerantz Committed by GitHub

fix: wrap Eip1193Bridge to fix outstanding bugs (#3355)

* fix: wrap Eip1193Bridge to fix outstanding bugs

* revert: widget height change
parent 5b5e7657
import { Provider as EthersProvider } from '@ethersproject/abstract-provider' import { Provider as EthersProvider } from '@ethersproject/abstract-provider'
import { Signer as EthersSigner } from '@ethersproject/abstract-signer'
import { Provider as Eip1193Provider } from '@web3-react/types' import { Provider as Eip1193Provider } from '@web3-react/types'
import { DEFAULT_LOCALE, SupportedLocale } from 'constants/locales' import { DEFAULT_LOCALE, SupportedLocale } from 'constants/locales'
import { Provider as AtomProvider } from 'jotai' import { Provider as AtomProvider } from 'jotai'
...@@ -94,7 +93,7 @@ function Updaters() { ...@@ -94,7 +93,7 @@ function Updaters() {
export type WidgetProps = { export type WidgetProps = {
theme?: Theme theme?: Theme
locale?: SupportedLocale locale?: SupportedLocale
provider?: Eip1193Provider | EthersProvider | { provider: EthersProvider; signer: EthersSigner } provider?: Eip1193Provider | EthersProvider
jsonRpcEndpoint?: string jsonRpcEndpoint?: string
width?: string | number width?: string | number
dialog?: HTMLElement | null dialog?: HTMLElement | null
......
import { Provider as EthersProvider } from '@ethersproject/abstract-provider' import { Provider as EthersProvider } from '@ethersproject/abstract-provider'
import { Signer as EthersSigner } from '@ethersproject/abstract-signer'
import { VoidSigner } from '@ethersproject/abstract-signer' import { VoidSigner } from '@ethersproject/abstract-signer'
import { Eip1193Bridge as ExperimentalEip1193Bridge } from '@ethersproject/experimental' import { Eip1193Bridge as ExperimentalEip1193Bridge } from '@ethersproject/experimental'
import { JsonRpcProvider } from '@ethersproject/providers' import { JsonRpcProvider, JsonRpcSigner } from '@ethersproject/providers'
import { Provider as Eip1193Provider } from '@web3-react/types' import { Provider as Eip1193Provider } from '@web3-react/types'
import { ZERO_ADDRESS } from 'constants/misc' import { ZERO_ADDRESS } from 'constants/misc'
import { useMemo } from 'react' import { useMemo } from 'react'
...@@ -17,32 +16,42 @@ class Eip1193Bridge extends ExperimentalEip1193Bridge { ...@@ -17,32 +16,42 @@ class Eip1193Bridge extends ExperimentalEip1193Bridge {
const result = await this.provider.getNetwork() const result = await this.provider.getNetwork()
return '0x' + result.chainId.toString(16) return '0x' + result.chainId.toString(16)
} }
case 'eth_sendTransaction': {
if (!this.signer) break
// TODO(zzmp): JsonRpcProvider filters from/gas fields from the params.
const req = JsonRpcProvider.hexlifyTransaction(params?.[0], { from: true, gas: true })
const tx = await this.signer.sendTransaction(req)
return tx.hash
}
default: default:
return super.send(method, params) return super.send(method, params)
} }
} }
} }
interface EthersSigningProvider extends EthersProvider {
getSigner(): JsonRpcSigner
}
export default function useEip1193Provider( export default function useEip1193Provider(
provider?: Eip1193Provider | EthersProvider | JsonRpcProvider | { provider: EthersProvider; signer: EthersSigner } provider?: Eip1193Provider | EthersSigningProvider | EthersProvider
): Eip1193Provider | undefined { ): Eip1193Provider | undefined {
return useMemo(() => { return useMemo(() => {
if (provider) { if (provider) {
if (provider instanceof EthersProvider) { if (EthersProvider.isProvider(provider)) {
// A JsonRpcProvider includes its own Signer, otherwise use a VoidSigner.
const signer = 'getSigner' in provider ? provider.getSigner() : null ?? voidSigner const signer = 'getSigner' in provider ? provider.getSigner() : null ?? voidSigner
return new Eip1193Bridge(signer, provider) return new Eip1193Bridge(signer, provider)
} } else if (EthersProvider.isProvider((provider as ExperimentalEip1193Bridge).provider)) {
/*
if ('provider' in provider && 'signer' in provider) { * Direct users to use our own wrapper to avoid any pitfalls:
return new Eip1193Bridge(provider.signer, provider.provider) * - Eip1193Bridge is experimental
} * - signer is not straightforward
* - bugs out if chainId>8
// See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md. */
if ('request' in provider && 'on' in provider && 'removeListener' in provider) { throw new Error('Eip1193Bridge is experimental: pass your ethers Provider directly')
return provider
} }
} }
return return provider
}, [provider]) }, [provider])
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment