essefuga
Version:
A simple, maximally extensible, dependency minimized framework for building modern Ethereum dApps
84 lines (71 loc) • 2.62 kB
text/typescript
import { ConnectorUpdate } from '@web3-react/types'
import { AbstractConnector } from '@web3-react/abstract-connector'
import Web3ProviderEngine from 'web3-provider-engine'
import { TrezorSubprovider } from '@0x/subproviders/lib/src/subproviders/trezor' // https://github.com/0xProject/0x-monorepo/issues/1400
import CacheSubprovider from 'web3-provider-engine/subproviders/cache.js'
import { RPCSubprovider } from '@0x/subproviders/lib/src/subproviders/rpc_subprovider' // https://github.com/0xProject/0x-monorepo/issues/1400
interface TrezorConnectorArguments {
chainId: number
url: string
pollingInterval?: number
requestTimeoutMs?: number
config?: any
manifestEmail: string
manifestAppUrl: string
}
export class TrezorConnector extends AbstractConnector {
private readonly chainId: number
private readonly url: string
private readonly pollingInterval?: number
private readonly requestTimeoutMs?: number
private readonly config: any
private readonly manifestEmail: string
private readonly manifestAppUrl: string
private provider: any
constructor({
chainId,
url,
pollingInterval,
requestTimeoutMs,
config = {},
manifestEmail,
manifestAppUrl
}: TrezorConnectorArguments) {
super({ supportedChainIds: [chainId] })
this.chainId = chainId
this.url = url
this.pollingInterval = pollingInterval
this.requestTimeoutMs = requestTimeoutMs
this.config = config
this.manifestEmail = manifestEmail
this.manifestAppUrl = manifestAppUrl
}
public async activate(): Promise<ConnectorUpdate> {
if (!this.provider) {
const { default: TrezorConnect } = await import('trezor-connect')
TrezorConnect.manifest({
email: this.manifestEmail,
appUrl: this.manifestAppUrl
})
const engine = new Web3ProviderEngine({ pollingInterval: this.pollingInterval })
engine.addProvider(new TrezorSubprovider({ trezorConnectClientApi: TrezorConnect, ...this.config }))
engine.addProvider(new CacheSubprovider())
engine.addProvider(new RPCSubprovider(this.url, this.requestTimeoutMs))
this.provider = engine
}
this.provider.start()
return { provider: this.provider, chainId: this.chainId }
}
public async getProvider(): Promise<Web3ProviderEngine> {
return this.provider
}
public async getChainId(): Promise<number> {
return this.chainId
}
public async getAccount(): Promise<null> {
return this.provider._providers[0].getAccountsAsync(1).then((accounts: string[]): string => accounts[0])
}
public deactivate() {
this.provider.stop()
}
}