UNPKG

saepenatus

Version:

Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardised spec compliant web3 providers for all supported wallets, framework agnostic modern javascript UI with code splitting, CSS customization, mul

94 lines (87 loc) 2.58 kB
import type { RequestPatch, Balance, ChainId, EIP1193Provider, ProviderAccounts } from './types.js' import { ProviderRpcError } from './errors.js' /** * Takes a provider instance along with events * and requests to override and returns an EIP1193 provider * * ## Example: * * *Overriding events: * * ```typescript * ``` * * @param provider The provider to patch * @param requestPatch An `object` with the method to patch * and the implementation with which to patch * @param events Events to patch * @returns An EIP1193 Provider */ export const createEIP1193Provider = ( provider: any, requestPatch?: RequestPatch ): EIP1193Provider => { let baseRequest: any if (provider.request) { // Copy the original request method and bind the provider context to it baseRequest = provider.request.bind(provider) } else if (provider.sendAsync) { baseRequest = createRequest(provider) } const request: EIP1193Provider['request'] = async ({ method, params }) => { const key = method as keyof RequestPatch // If the request method is set to null // this indicates this method is not supported if (requestPatch && requestPatch[key] === null) { throw new ProviderRpcError({ code: 4200, message: `The Provider does not support the requested method: ${method}` }) } if (requestPatch && requestPatch[key]) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore // @TODO - Fix this type error return requestPatch[key]({ baseRequest, params }) } else if (baseRequest) { return baseRequest({ method, params }) } else { throw new ProviderRpcError({ code: 4200, message: `The Provider does not support the requested method: ${method}` }) } } provider.request = request return provider } interface JsonRpcResponse { id: string | undefined jsonrpc: '2.0' method: string result?: ProviderAccounts | Balance | ProviderAccounts | ChainId | null error?: string } const createRequest = (provider: any): EIP1193Provider['request'] => (({ method, params }) => new Promise((resolve, reject) => { provider.sendAsync( { id: 0, jsonrpc: '2.0', method, params }, (error: string, { result }: JsonRpcResponse) => { if (error) { reject(JSON.parse(error)) } else { resolve(result == undefined ? null : (result as any)) } } ) })) as EIP1193Provider['request']