UNPKG

@sphereon/ssi-sdk-web3.headless-provider

Version:

1 lines • 41.8 kB
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/ethers-headless-provider.ts","../src/errors.ts","../src/event-emitter.ts","../src/ethers-kms-signer.ts","../src/functions.ts","../src/factory.ts","../src/rpc-server.ts"],"sourcesContent":["export * from './types'\nexport * from './ethers-headless-provider'\nexport * from './ethers-kms-signer'\nexport * from './factory'\nexport * from './event-emitter'\nexport * from './functions'\nexport * from './rpc-server'\n\n/**\n * 8f2695a99c416ab9241fc75ae53f90b083aecff9e4463e046a1527f456b502c6\n */\n","import { TransactionRequest } from '@ethersproject/abstract-provider'\nimport { TypedDataDomain, TypedDataField } from '@ethersproject/abstract-signer'\nimport { IAgentContext, IKeyManager } from '@veramo/core'\n\nexport type rpcMethods = 'eth_call' | 'eth_getBalance'\n\nexport interface IWeb3Provider {\n isMetaMask?: boolean\n\n request(args: { method: 'eth_call'; params: any[] }): Promise<any>\n request(args: { method: 'eth_getBalance'; params: string[] }): Promise<string>\n request(args: { method: 'eth_accounts'; params: [] }): Promise<string[]>\n request(args: { method: 'eth_requestAccounts'; params: [] }): Promise<string[]>\n request(args: { method: 'net_version'; params: [] }): Promise<number>\n request(args: { method: 'eth_chainId'; params: [] }): Promise<string>\n request(args: { method: 'personal_sign'; params: string[] }): Promise<string>\n request(args: { method: 'eth_signTypedData' | 'eth_signTypedData_v1'; params: [object[], string] }): Promise<string>\n request(args: { method: 'eth_signTypedData_v3' | 'eth_signTypedData_v4'; params: string[] }): Promise<string>\n request(args: { method: 'eth_sendTransaction'; params: TransactionRequest[] }): Promise<string>\n request(args: { method: rpcMethods | string; params?: any[] }): Promise<any>\n\n emit(eventName: string, ...args: any[]): void\n on(eventName: string, listener: (eventName: string) => void): void\n}\n\nexport type IRequiredContext = IAgentContext<IKeyManager>\n\nexport interface PendingRequest {\n requestInfo: { method: string; params: any[] }\n reject: (err: { message?: string; code?: number }) => void\n authorize: () => Promise<void>\n}\n\nexport interface ChainConnection {\n chainId: number\n rpcUrl: string\n}\n\nexport interface Web3ProviderConfig {\n debug?: boolean\n logger: typeof console.log\n}\nexport interface TypedDataSigner {\n _signTypedData(domain: TypedDataDomain, types: Record<string, Array<TypedDataField>>, value: Record<string, any>): Promise<string>\n}\n\nexport enum Web3Method {\n RequestAccounts = 'eth_requestAccounts',\n Accounts = 'eth_accounts',\n SendTransaction = 'eth_sendTransaction',\n SwitchEthereumChain = 'wallet_switchEthereumChain',\n AddEthereumChain = 'wallet_addEthereumChain',\n SignMessage = 'personal_sign',\n SignTypedData = 'eth_signTypedData',\n SignTypedDataV1 = 'eth_signTypedData_v1',\n SignTypedDataV3 = 'eth_signTypedData_v3',\n SignTypedDataV4 = 'eth_signTypedData_v4',\n}\n\nexport function without<T>(list: T[], item: T): T[] {\n const idx = list.indexOf(item)\n if (idx >= 0) {\n return list.slice(0, idx).concat(list.slice(idx + 1))\n }\n return list\n}\n","import { TransactionRequest } from '@ethersproject/abstract-provider'\nimport { toUtf8String } from '@ethersproject/strings'\nimport { signTypedData, SignTypedDataVersion } from '@metamask/eth-sig-util'\nimport assert from 'assert/strict'\nimport { ethers, Signer, Wallet } from 'ethers'\n// import {hashMessage} from \"ethers/lib/utils\";\nimport { BehaviorSubject, filter, first, firstValueFrom, from, switchMap, tap } from 'rxjs'\n\nimport { Deny, Disconnected, ErrorWithCode, Unauthorized, UnrecognizedChainID } from './errors'\nimport { EthersKMSSigner } from './ethers-kms-signer'\nimport { EventEmitter } from './event-emitter'\nimport { ChainConnection, IWeb3Provider, PendingRequest, Web3Method, Web3ProviderConfig, without } from './types'\n\nexport class EthersHeadlessProvider extends EventEmitter implements IWeb3Provider {\n private _pendingRequests = new BehaviorSubject<PendingRequest[]>([])\n private _signers: Signer[] = []\n private _activeChainId: number\n private _rpc: Record<number, ethers.providers.JsonRpcProvider> = {}\n private _config: { debug: boolean; logger: typeof console.log }\n private _authorizedRequests: { [K in Web3Method | string]?: boolean } = {}\n\n constructor(\n signers: Signer[],\n private readonly chains: ChainConnection[],\n // @ts-ignore\n config: Web3ProviderConfig = {},\n ) {\n super()\n this._signers = signers\n this._activeChainId = chains[0].chainId\n this._config = Object.assign({ debug: true, logger: console.log }, config)\n }\n\n request(args: { method: 'eth_call'; params: any[] }): Promise<any>\n request(args: { method: 'eth_getBalance'; params: string[] }): Promise<string>\n request(args: { method: 'eth_accounts'; params: [] }): Promise<string[]>\n request(args: { method: 'eth_requestAccounts'; params: string[] }): Promise<string[]>\n\n request(args: { method: 'net_version'; params: [] }): Promise<number>\n request(args: { method: 'eth_chainId'; params: [] }): Promise<string>\n request(args: { method: 'personal_sign'; params: string[] }): Promise<string>\n request(args: { method: 'eth_signTypedData' | 'eth_signTypedData_v1'; params: [object[], string] }): Promise<string>\n\n request(args: { method: 'eth_signTypedData_v3' | 'eth_signTypedData_v4'; params: string[] }): Promise<string>\n\n request(args: { method: 'eth_sendTransaction'; params: TransactionRequest[] }): Promise<string>\n\n async request({ method, params }: { method: string; params: any[] }): Promise<any> {\n if (this._config.debug) {\n this._config.logger(JSON.stringify({ method, params }))\n }\n\n switch (method) {\n case 'eth_call':\n case 'eth_getBalance':\n case 'eth_estimateGas':\n case 'eth_blockNumber':\n case 'eth_getBlockByNumber':\n case 'eth_getTransactionByHash':\n case 'eth_getTransactionReceipt':\n case 'eth_feeHistory':\n return this.getRpc().send(method, params)\n\n case 'eth_requestAccounts':\n case 'eth_accounts':\n return this.waitAuthorization(\n { method, params },\n async () => {\n const { chainId } = this.getCurrentChain()\n this.emit('connect', { chainId })\n return Promise.all(this._signers.map((wallet) => wallet.getAddress()))\n },\n true,\n 'eth_requestAccounts',\n )\n\n case 'eth_chainId': {\n const { chainId } = this.getCurrentChain()\n return '0x' + chainId.toString(16)\n }\n\n case 'net_version': {\n const { chainId } = this.getCurrentChain()\n return '' + chainId\n }\n\n case 'eth_sendTransaction': {\n return this.waitAuthorization({ method, params }, async () => {\n const wallet = this.getCurrentWallet()\n const rpc = this.getRpc()\n const { gas, from, ...txRequest } = params[0]\n const tx = await wallet.connect(rpc).sendTransaction(txRequest)\n return tx.hash\n })\n }\n\n case 'eth_sign': {\n return this.waitAuthorization({ method, params }, async () => {\n const wallet = this.getCurrentWallet()\n const rpc = this.getRpc()\n const message = params[1]\n return await (wallet.connect(rpc) as EthersKMSSigner).signMessage(message)\n })\n }\n\n case 'wallet_addEthereumChain': {\n return this.waitAuthorization({ method, params }, async () => {\n const chainId = Number(params[0].chainId)\n const { rpcUrl } = params[0]\n this.addNetwork(chainId, rpcUrl)\n return null\n })\n }\n\n case 'wallet_switchEthereumChain': {\n if (this._activeChainId === Number(params[0].chainId)) {\n return null\n }\n return this.waitAuthorization({ method, params }, async () => {\n const chainId = Number(params[0].chainId)\n this.switchNetwork(chainId)\n return null\n })\n }\n\n case 'personal_sign': {\n return this.waitAuthorization({ method, params }, async () => {\n const wallet = this.getCurrentWallet()\n const address = await wallet.getAddress()\n assert.equal(address, ethers.utils.getAddress(params[1]))\n const message = toUtf8String(params[0])\n\n const signature = await wallet.signMessage(message)\n if (this._config.debug) {\n this._config.logger('personal_sign', {\n message,\n signature,\n })\n }\n\n return signature\n })\n }\n\n case 'eth_signTypedData':\n case 'eth_signTypedData_v1': {\n return this.waitAuthorization({ method, params }, async () => {\n const wallet = this.getCurrentWallet() as Wallet\n const address = await wallet.getAddress()\n assert.equal(address, ethers.utils.getAddress(params[1]))\n\n const msgParams = params[0]\n\n return signTypedData({\n privateKey: Buffer.from(wallet.privateKey.slice(2), 'hex'),\n data: msgParams,\n version: SignTypedDataVersion.V1,\n })\n })\n }\n\n case 'eth_signTypedData_v3':\n case 'eth_signTypedData_v4': {\n return this.waitAuthorization({ method, params }, async () => {\n const wallet = this.getCurrentWallet() as Wallet\n const address = await wallet.getAddress()\n assert.equal(address, ethers.utils.getAddress(params[0]))\n\n const msgParams = JSON.parse(params[1])\n\n return signTypedData({\n privateKey: Buffer.from(wallet.privateKey.slice(2), 'hex'),\n data: msgParams,\n version: method === 'eth_signTypedData_v4' ? SignTypedDataVersion.V4 : SignTypedDataVersion.V3,\n })\n })\n }\n\n default:\n return this.getRpc().send(method, params)\n // throw UnsupportedMethod()\n }\n }\n\n getCurrentWallet(): Signer {\n const wallet = this._signers[0]\n\n if (!wallet) {\n throw Unauthorized()\n }\n\n return wallet\n }\n\n waitAuthorization<T>(requestInfo: PendingRequest['requestInfo'], task: () => Promise<T>, permanentPermission = false, methodOverride?: string) {\n const method = methodOverride ?? requestInfo.method\n\n if (this._authorizedRequests[method]) {\n return task()\n }\n\n return new Promise((resolve, reject) => {\n const pendingRequest: PendingRequest = {\n requestInfo,\n authorize: async () => {\n if (permanentPermission) {\n this._authorizedRequests[method] = true\n }\n\n resolve(await task())\n },\n reject(err) {\n reject(err)\n },\n }\n\n this._pendingRequests.next(this._pendingRequests.getValue().concat(pendingRequest))\n })\n }\n\n private consumeRequest(requestKind: Web3Method) {\n return firstValueFrom(\n this._pendingRequests.pipe(\n switchMap((a) => from(a)),\n filter((request) => {\n return request.requestInfo.method === requestKind\n }),\n first(),\n tap((item) => {\n this._pendingRequests.next(without(this._pendingRequests.getValue(), item))\n }),\n ),\n )\n }\n\n private consumeAllRequests() {\n const pendingRequests = this._pendingRequests.getValue()\n this._pendingRequests.next([])\n return pendingRequests\n }\n\n getPendingRequests(): PendingRequest['requestInfo'][] {\n return this._pendingRequests.getValue().map((pendingRequest) => pendingRequest.requestInfo)\n }\n\n getPendingRequestCount(requestKind?: Web3Method): number {\n const pendingRequests = this._pendingRequests.getValue()\n if (!requestKind) {\n return pendingRequests.length\n }\n\n return pendingRequests.filter((pendingRequest) => pendingRequest.requestInfo.method === requestKind).length\n }\n\n async authorize(requestKind: Web3Method): Promise<void> {\n const pendingRequest = await this.consumeRequest(requestKind)\n return pendingRequest.authorize()\n }\n\n async reject(requestKind: Web3Method, reason: ErrorWithCode = Deny()): Promise<void> {\n const pendingRequest = await this.consumeRequest(requestKind)\n return pendingRequest.reject(reason)\n }\n\n authorizeAll(): void {\n this.consumeAllRequests().forEach((request) => request.authorize())\n }\n\n rejectAll(reason: ErrorWithCode = Deny()): void {\n this.consumeAllRequests().forEach((request) => request.reject(reason))\n }\n\n async changeAccounts(signers: Signer[]): Promise<void> {\n this._signers = signers\n this.emit('accountsChanged', await Promise.all(this._signers.map((signer) => signer.getAddress())))\n }\n\n private getCurrentChain(): ChainConnection {\n const chainConn = this.chains.find((chainConn) => chainConn.chainId === this._activeChainId)\n if (!chainConn) {\n throw Disconnected()\n }\n return chainConn\n }\n\n public getRpc(): ethers.providers.JsonRpcProvider {\n const chainConn = this.getCurrentChain()\n let rpc = this._rpc[chainConn.chainId]\n\n if (!rpc) {\n rpc = new ethers.providers.JsonRpcProvider(chainConn.rpcUrl, chainConn.chainId)\n this._rpc[chainConn.chainId] = rpc\n }\n\n return rpc\n }\n\n getNetwork(): ChainConnection {\n return this.getCurrentChain()\n }\n\n getNetworks(): ChainConnection[] {\n return this.chains\n }\n\n addNetwork(chainId: number, rpcUrl: string): void {\n this.chains.push({ chainId, rpcUrl })\n }\n\n switchNetwork(chainId: number): void {\n const idx = this.chains.findIndex((connection) => connection.chainId === chainId)\n if (idx < 0) {\n throw UnrecognizedChainID()\n }\n if (chainId !== this._activeChainId) {\n this._activeChainId = chainId\n this.emit('chainChanged', chainId)\n }\n }\n}\n","export class ErrorWithCode extends Error {\n constructor(\n message?: string,\n public code?: number,\n ) {\n super(message)\n return this\n }\n}\n\nexport const Deny = (): ErrorWithCode => new ErrorWithCode('The user rejected the request.', 4001)\n\nexport const Unauthorized = (): ErrorWithCode => new ErrorWithCode('The requested method and/or account has not been authorized by the user.', 4100)\n\nexport const UnsupportedMethod = (): ErrorWithCode => new ErrorWithCode('The Provider does not support the requested method.', 4200)\n\nexport const Disconnected = (): ErrorWithCode => new ErrorWithCode('The Provider is disconnected from all chains.', 4900)\n\nexport const ChainDisconnected = (): ErrorWithCode => new ErrorWithCode('The Provider is not connected to the requested chain.', 4901)\n\nexport const UnrecognizedChainID = (): ErrorWithCode =>\n new ErrorWithCode('Unrecognized chain ID. Try adding the chain using `wallet_addEthereumChain` first.', 4902)\n","export class EventEmitter {\n private readonly listeners: Record<string, Array<(...args: any[]) => void>> = Object.create(null)\n\n emit(eventName: string, ...args: any[]): boolean {\n this.listeners[eventName]?.forEach((listener) => {\n listener(...args)\n })\n return true\n }\n\n on(eventName: string, listener: (...args: any[]) => void): this {\n this.listeners[eventName] ??= []\n this.listeners[eventName]?.push(listener)\n return this\n }\n\n off(eventName: string, listener: (...args: any[]) => void): this {\n const listeners = this.listeners[eventName] ?? []\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n for (const [i, listener_] of listeners.entries()) {\n if (listener === listener_) {\n listeners.splice(i, 1)\n break\n }\n }\n\n return this\n }\n\n once(eventName: string, listener: (...args: any[]) => void): this {\n const cb = (...args: any[]): void => {\n this.off(eventName, cb)\n listener(...args)\n }\n\n return this.on(eventName, cb)\n }\n}\n","import { Provider, TransactionRequest } from '@ethersproject/abstract-provider'\nimport { Deferrable } from '@ethersproject/properties'\nimport { serialize } from '@ethersproject/transactions'\nimport { IKey } from '@veramo/core'\nimport { Eip712Payload } from '@veramo/key-manager'\nimport { ethers, Signer, TypedDataDomain, TypedDataField } from 'ethers'\n// import {arrayify, defineReadOnly, serializeTransaction} from 'ethers/lib/utils'\nimport { arrayify, defineReadOnly } from 'ethers/lib/utils'\n// @ts-ignore\nimport { fromString } from 'uint8arrays/from-string'\n// import {ECDSASignature} from \"web3-eth-accounts\";\nimport { getAddressFromAgent } from './functions'\nimport { IRequiredContext, TypedDataSigner } from './types'\n\nexport class EthersKMSSignerBuilder {\n private context?: IRequiredContext\n private keyRef?: Pick<IKey, 'kid'>\n private provider?: ethers.providers.Provider\n\n withContext(context: IRequiredContext): this {\n this.context = context\n return this\n }\n\n withKid(kid: string): this {\n this.keyRef = { kid }\n return this\n }\n\n withKeyRef(keyRef: Pick<IKey, 'kid'> | string): this {\n if (typeof keyRef === 'string') {\n return this.withKid(keyRef)\n }\n\n this.keyRef = keyRef\n return this\n }\n\n withProvider(provider: ethers.providers.Provider): this {\n this.provider = provider\n return this\n }\n\n build() {\n if (!this.context) {\n throw Error('Agent context needs to be provided')\n }\n if (!this.keyRef) {\n throw Error('Keyref needs to be provided')\n }\n return new EthersKMSSigner({ context: this.context, keyRef: this.keyRef, provider: this.provider })\n }\n}\n\n/**\n * This is a Ethers signer that delegates back to the KMS for the actual signatures.\n * This means we do not expose private keys and can use any Secp256k1 key stored in the KMS if we want\n *\n * Be aware that the provided KeyRef needs to belong to the respective KMS, as it will use a lookup for the key in the KMS to sign\n */\nexport class EthersKMSSigner extends Signer implements TypedDataSigner {\n private readonly context: IRequiredContext\n private readonly keyRef: Pick<IKey, 'kid'>\n\n constructor({ provider, context, keyRef }: { provider?: ethers.providers.Provider; context: IRequiredContext; keyRef: Pick<IKey, 'kid'> }) {\n super()\n // defineReadOnly(this, \"address\", address);\n defineReadOnly(this, 'provider', provider || undefined)\n this.context = context\n this.keyRef = keyRef\n }\n\n async getAddress(): Promise<string> {\n return await getAddressFromAgent(this.context, this.keyRef)\n }\n async signTransaction(transaction: Deferrable<TransactionRequest>): Promise<string> {\n const { from, ...tx } = await transaction\n\n return this.context.agent.keyManagerSign({\n algorithm: 'eth_signTransaction',\n keyRef: this.keyRef.kid,\n // keyRef: this.keyRef,\n // @ts-ignore\n data: arrayify(serialize(tx)),\n })\n }\n\n async signRaw(message: string | Uint8Array): Promise<string> {\n return await this.context.agent.keyManagerSign({\n algorithm: 'eth_rawSign',\n keyRef: this.keyRef.kid,\n encoding: 'base16',\n // @ts-ignore // KMS accepts uint8arrays but interface does not expose it\n data: message,\n })\n }\n\n async signMessage(message: string | Uint8Array): Promise<string> {\n return await this.context.agent.keyManagerSign({\n algorithm: 'eth_signMessage',\n keyRef: this.keyRef.kid,\n encoding: 'base16',\n // @ts-ignore // KMS accepts uint8arrays but interface does not expose it\n data: message,\n })\n }\n\n async _signTypedData(domain: TypedDataDomain, types: Record<string, Array<TypedDataField>>, value: Record<string, any>): Promise<string> {\n const jsonData: Partial<Eip712Payload> = {\n domain,\n types,\n message: value,\n }\n return this.context.agent.keyManagerSign({\n algorithm: 'eth_signTypedData',\n keyRef: this.keyRef.kid,\n // @ts-ignore // KMS accepts uint8arrays but interface does not expose it\n data: fromString(JSON.stringify(jsonData)),\n })\n }\n\n connect(provider?: Provider): EthersKMSSigner {\n return new EthersKMSSigner({ provider, context: this.context, keyRef: this.keyRef })\n }\n}\n\n/*\n/!**\n * Convert signature format of the `eth_sign` RPC method to signature parameters\n * NOTE: all because of a bug in geth: https://github.com/ethereum/go-ethereum/issues/2053\n *!/\nexport const fromRpcSig = function(sig: string): ECDSASignature {\n const buf: Buffer = toBuffer(sig)\n\n if (buf.length < 65) {\n throw new Error('Invalid signature length')\n }\n\n let v = bufferToInt(buf.slice(64))\n // support both versions of `eth_sign` responses\n if (v < 27) {\n v += 27\n }\n\n return {\n v: v,\n r: buf.slice(0, 32),\n s: buf.slice(32, 64)\n }\n}\n*/\n","import { IKey } from '@veramo/core'\nimport { ethers } from 'ethers'\nimport { IRequiredContext } from './types'\n\nexport async function getAddressFromAgent(context: IRequiredContext, keyRef: Pick<IKey, 'kid'>): Promise<string> {\n const publicKeyHex = await getKey(context, keyRef).then((key) => key?.publicKeyHex)\n if (!publicKeyHex) {\n throw Error(`Could not retrieve public hex key for ${keyRef}`)\n }\n const address = ethers.utils.computeAddress(`${publicKeyHex.startsWith('0x') ? '' : '0x'}${publicKeyHex}`)\n if (!address || !address.startsWith('0x')) {\n throw Error(`Invalid address ${address} public key for key ${publicKeyHex}`)\n }\n return address\n}\n\nexport async function getKey(context: IRequiredContext, keyRef: Pick<IKey, 'kid'>): Promise<IKey | undefined> {\n return await context.agent.keyManagerGet({ kid: keyRef.kid })\n}\n","import { Signer } from 'ethers'\nimport { EventEmitter } from './event-emitter'\nimport { IWeb3Provider, Web3ProviderConfig } from './types'\nimport { EthersHeadlessProvider } from './ethers-headless-provider'\n\ntype Fn = (...args: any[]) => any\n\nfunction relayEvents(\n eventEmitter: EventEmitter,\n execute: <T extends keyof IWeb3Provider>(method: T, ...args: IWeb3Provider[T] extends Fn ? Parameters<IWeb3Provider[T]> : []) => Promise<void>,\n): void {\n const emit_ = eventEmitter.emit\n eventEmitter.emit = (eventName, ...args) => {\n void execute('emit', eventName, ...args)\n return emit_.apply(eventEmitter, [eventName, ...args])\n }\n}\n\nexport function createWeb3Provider(\n signers: Signer[],\n chainId: number | number[],\n rpcUrl: string,\n evaluate: <T extends keyof IWeb3Provider>(\n method: T,\n ...args: IWeb3Provider[T] extends Fn ? Parameters<IWeb3Provider[T]> : []\n ) => Promise<void> = async () => {},\n config?: Web3ProviderConfig,\n): IWeb3Provider {\n const chainIds: number[] = Array.isArray(chainId) ? chainId : [chainId]\n const chains = chainIds.map((chainId) => {\n return { chainId, rpcUrl }\n })\n const web3Provider = new EthersHeadlessProvider(signers, chains, config)\n relayEvents(web3Provider, evaluate)\n return web3Provider\n}\n","import { ExpressSupport, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { Router } from 'express'\nimport { EthersHeadlessProvider } from './ethers-headless-provider'\nimport { Web3Method } from './types'\n\nexport function createRpcServer(\n provider: EthersHeadlessProvider,\n expressSupport: ExpressSupport,\n opts?: ISingleEndpointOpts & { basePath?: string },\n) {\n const express = expressSupport.express\n const router = Router()\n // const app = expressSupport.express\n // app.post(opts?.basePath ?? \"/web3/rpc\", (req, res, next) => {console.log(`${JSON.stringify(req.body, null,2)}`); next()} , rpcHandler(createService(provider)));\n const path = opts?.path ?? '/web3/rpc'\n console.log(`RPC server will use basePath ${opts?.basePath ?? '/'} and path ${path}`)\n router.post(\n path,\n (req, res, next) => {\n console.log(`REQ ${req.body?.method}:\\r\\n${JSON.stringify(req.body, null, 2)}\\r\\n===`)\n next()\n },\n async (req, res, next) => {\n try {\n const method = req.body.method\n const params = req.body.params\n const id = req.body.id\n\n // todo: A Notification is a Request object without an \"id\" member.\n // A Request object that is a Notification signifies the Client's lack of interest in the corresponding Response object,\n // and as such no Response object needs to be returned to the client. The Server MUST NOT reply to a Notification, including those that are within a batch request.\n if (req.body.jsonrpc !== '2.0') {\n console.log('No valid JSON RPC call received', JSON.stringify(req.body))\n return sendErrorResponse(res, 200, {\n id: req.body.id,\n jsonrpc: '2.0',\n error: 'No valid JSON RPC call received. No jsonrp version supplied',\n code: -32600,\n })\n } else if (!id || !method) {\n console.log('No valid JSON RPC call received', JSON.stringify(req.body))\n return sendErrorResponse(res, 200, {\n id: req.body.id,\n jsonrpc: '2.0',\n error: 'No valid JSON RPC call received',\n code: -32600,\n })\n }\n const result = provider.request({ method, params })\n provider.authorizeAll()\n const respBody = { id, jsonrpc: '2.0', result: await result }\n res.json(respBody)\n console.log(`RESPONSE for ${method}:\\r\\n${JSON.stringify(respBody, null, 2)}`)\n } catch (error) {\n console.log(error.message)\n let msg = error.message\n if (`body` in error) {\n msg = error.body\n return sendErrorResponse(res, 200, msg)\n // res.json(error.body)\n } else {\n return sendErrorResponse(res, 200, {\n id: req.body.id,\n jsonrpc: '2.0',\n error: msg,\n code: error.code ?? -32000,\n })\n }\n }\n return next()\n },\n )\n express.use(opts?.basePath ?? '', router)\n}\n\nexport function createServiceMethod(method: string, service: Record<string, Function>, provider: EthersHeadlessProvider) {\n service[method] = async (params: any) => {\n // @ts-ignore\n const result = provider.request({ method, params })\n\n provider.authorizeAll()\n return await result\n }\n}\n\nexport function createService(provider: EthersHeadlessProvider) {\n const service = {}\n for (const method of Object.values(Web3Method)) {\n createServiceMethod(method, service, provider)\n }\n\n return service\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;AC8CO,IAAKA,aAAAA,0BAAAA,aAAAA;;;;;;;;;;;SAAAA;;AAaL,SAASC,QAAWC,MAAWC,MAAO;AAC3C,QAAMC,MAAMF,KAAKG,QAAQF,IAAAA;AACzB,MAAIC,OAAO,GAAG;AACZ,WAAOF,KAAKI,MAAM,GAAGF,GAAAA,EAAKG,OAAOL,KAAKI,MAAMF,MAAM,CAAA,CAAA;EACpD;AACA,SAAOF;AACT;AANgBD;;;AC1DhB,qBAA6B;AAC7B,0BAAoD;AACpD,oBAAmB;AACnB,oBAAuC;AAEvC,kBAAqF;;;ACN9E,IAAMO,gBAAN,cAA4BC,MAAAA;EAAnC,OAAmCA;;;;EACjC,YACEC,SACOC,MACP;AACA,UAAMD,OAAAA,GAAAA,KAFCC,OAAAA;AAGP,WAAO;EACT;AACF;AAEO,IAAMC,OAAO,6BAAqB,IAAIJ,cAAc,kCAAkC,IAAA,GAAzE;AAEb,IAAMK,eAAe,6BAAqB,IAAIL,cAAc,4EAA4E,IAAA,GAAnH;AAIrB,IAAMM,eAAe,6BAAqB,IAAIC,cAAc,iDAAiD,IAAA,GAAxF;AAIrB,IAAMC,sBAAsB,6BACjC,IAAIC,cAAc,sFAAsF,IAAA,GADvE;;;ACpB5B,IAAMC,eAAN,MAAMA;EAAb,OAAaA;;;EACMC,YAA6DC,uBAAOC,OAAO,IAAA;EAE5FC,KAAKC,cAAsBC,MAAsB;AAC/C,SAAKL,UAAUI,SAAAA,GAAYE,QAAQ,CAACC,aAAAA;AAClCA,eAAAA,GAAYF,IAAAA;IACd,CAAA;AACA,WAAO;EACT;EAEAG,GAAGJ,WAAmBG,UAA0C;AAC9D,SAAKP,UAAUI,SAAAA,MAAe,CAAA;AAC9B,SAAKJ,UAAUI,SAAAA,GAAYK,KAAKF,QAAAA;AAChC,WAAO;EACT;EAEAG,IAAIN,WAAmBG,UAA0C;AAC/D,UAAMP,YAAY,KAAKA,UAAUI,SAAAA,KAAc,CAAA;AAI/C,eAAW,CAACO,GAAGC,SAAAA,KAAcZ,UAAUa,QAAO,GAAI;AAChD,UAAIN,aAAaK,WAAW;AAC1BZ,kBAAUc,OAAOH,GAAG,CAAA;AACpB;MACF;IACF;AAEA,WAAO;EACT;EAEAI,KAAKX,WAAmBG,UAA0C;AAChE,UAAMS,KAAK,2BAAIX,SAAAA;AACb,WAAKK,IAAIN,WAAWY,EAAAA;AACpBT,eAAAA,GAAYF,IAAAA;IACd,GAHW;AAKX,WAAO,KAAKG,GAAGJ,WAAWY,EAAAA;EAC5B;AACF;;;AF1BO,IAAMC,yBAAN,cAAqCC,aAAAA;EAZ5C,OAY4CA;;;;EAClCC,mBAAmB,IAAIC,4BAAkC,CAAA,CAAE;EAC3DC,WAAqB,CAAA;EACrBC;EACAC,OAAyD,CAAC;EAC1DC;EACAC,sBAAgE,CAAC;EAEzE,YACEC,SACiBC,QAEjBC,SAA6B,CAAC,GAC9B;AACA,UAAK,GAAA,KAJYD,SAAAA;AAKjB,SAAKN,WAAWK;AAChB,SAAKJ,iBAAiBK,OAAO,CAAA,EAAGE;AAChC,SAAKL,UAAUM,OAAOC,OAAO;MAAEC,OAAO;MAAMC,QAAQC,QAAQC;IAAI,GAAGP,MAAAA;EACrE;EAgBA,MAAMQ,QAAQ,EAAEC,QAAQC,OAAM,GAAqD;AACjF,QAAI,KAAKd,QAAQQ,OAAO;AACtB,WAAKR,QAAQS,OAAOM,KAAKC,UAAU;QAAEH;QAAQC;MAAO,CAAA,CAAA;IACtD;AAEA,YAAQD,QAAAA;MACN,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;AACH,eAAO,KAAKI,OAAM,EAAGC,KAAKL,QAAQC,MAAAA;MAEpC,KAAK;MACL,KAAK;AACH,eAAO,KAAKK,kBACV;UAAEN;UAAQC;QAAO,GACjB,YAAA;AACE,gBAAM,EAAET,QAAO,IAAK,KAAKe,gBAAe;AACxC,eAAKC,KAAK,WAAW;YAAEhB;UAAQ,CAAA;AAC/B,iBAAOiB,QAAQC,IAAI,KAAK1B,SAAS2B,IAAI,CAACC,WAAWA,OAAOC,WAAU,CAAA,CAAA;QACpE,GACA,MACA,qBAAA;MAGJ,KAAK,eAAe;AAClB,cAAM,EAAErB,QAAO,IAAK,KAAKe,gBAAe;AACxC,eAAO,OAAOf,QAAQsB,SAAS,EAAA;MACjC;MAEA,KAAK,eAAe;AAClB,cAAM,EAAEtB,QAAO,IAAK,KAAKe,gBAAe;AACxC,eAAO,KAAKf;MACd;MAEA,KAAK,uBAAuB;AAC1B,eAAO,KAAKc,kBAAkB;UAAEN;UAAQC;QAAO,GAAG,YAAA;AAChD,gBAAMW,SAAS,KAAKG,iBAAgB;AACpC,gBAAMC,MAAM,KAAKZ,OAAM;AACvB,gBAAM,EAAEa,KAAKC,MAAAA,OAAM,GAAGC,UAAAA,IAAclB,OAAO,CAAA;AAC3C,gBAAMmB,KAAK,MAAMR,OAAOS,QAAQL,GAAAA,EAAKM,gBAAgBH,SAAAA;AACrD,iBAAOC,GAAGG;QACZ,CAAA;MACF;MAEA,KAAK,YAAY;AACf,eAAO,KAAKjB,kBAAkB;UAAEN;UAAQC;QAAO,GAAG,YAAA;AAChD,gBAAMW,SAAS,KAAKG,iBAAgB;AACpC,gBAAMC,MAAM,KAAKZ,OAAM;AACvB,gBAAMoB,UAAUvB,OAAO,CAAA;AACvB,iBAAO,MAAOW,OAAOS,QAAQL,GAAAA,EAAyBS,YAAYD,OAAAA;QACpE,CAAA;MACF;MAEA,KAAK,2BAA2B;AAC9B,eAAO,KAAKlB,kBAAkB;UAAEN;UAAQC;QAAO,GAAG,YAAA;AAChD,gBAAMT,UAAUkC,OAAOzB,OAAO,CAAA,EAAGT,OAAO;AACxC,gBAAM,EAAEmC,OAAM,IAAK1B,OAAO,CAAA;AAC1B,eAAK2B,WAAWpC,SAASmC,MAAAA;AACzB,iBAAO;QACT,CAAA;MACF;MAEA,KAAK,8BAA8B;AACjC,YAAI,KAAK1C,mBAAmByC,OAAOzB,OAAO,CAAA,EAAGT,OAAO,GAAG;AACrD,iBAAO;QACT;AACA,eAAO,KAAKc,kBAAkB;UAAEN;UAAQC;QAAO,GAAG,YAAA;AAChD,gBAAMT,UAAUkC,OAAOzB,OAAO,CAAA,EAAGT,OAAO;AACxC,eAAKqC,cAAcrC,OAAAA;AACnB,iBAAO;QACT,CAAA;MACF;MAEA,KAAK,iBAAiB;AACpB,eAAO,KAAKc,kBAAkB;UAAEN;UAAQC;QAAO,GAAG,YAAA;AAChD,gBAAMW,SAAS,KAAKG,iBAAgB;AACpC,gBAAMe,UAAU,MAAMlB,OAAOC,WAAU;AACvCkB,wBAAAA,QAAOC,MAAMF,SAASG,qBAAOC,MAAMrB,WAAWZ,OAAO,CAAA,CAAE,CAAA;AACvD,gBAAMuB,cAAUW,6BAAalC,OAAO,CAAA,CAAE;AAEtC,gBAAMmC,YAAY,MAAMxB,OAAOa,YAAYD,OAAAA;AAC3C,cAAI,KAAKrC,QAAQQ,OAAO;AACtB,iBAAKR,QAAQS,OAAO,iBAAiB;cACnC4B;cACAY;YACF,CAAA;UACF;AAEA,iBAAOA;QACT,CAAA;MACF;MAEA,KAAK;MACL,KAAK,wBAAwB;AAC3B,eAAO,KAAK9B,kBAAkB;UAAEN;UAAQC;QAAO,GAAG,YAAA;AAChD,gBAAMW,SAAS,KAAKG,iBAAgB;AACpC,gBAAMe,UAAU,MAAMlB,OAAOC,WAAU;AACvCkB,wBAAAA,QAAOC,MAAMF,SAASG,qBAAOC,MAAMrB,WAAWZ,OAAO,CAAA,CAAE,CAAA;AAEvD,gBAAMoC,YAAYpC,OAAO,CAAA;AAEzB,qBAAOqC,mCAAc;YACnBC,YAAYC,OAAOtB,KAAKN,OAAO2B,WAAWE,MAAM,CAAA,GAAI,KAAA;YACpDC,MAAML;YACNM,SAASC,yCAAqBC;UAChC,CAAA;QACF,CAAA;MACF;MAEA,KAAK;MACL,KAAK,wBAAwB;AAC3B,eAAO,KAAKvC,kBAAkB;UAAEN;UAAQC;QAAO,GAAG,YAAA;AAChD,gBAAMW,SAAS,KAAKG,iBAAgB;AACpC,gBAAMe,UAAU,MAAMlB,OAAOC,WAAU;AACvCkB,wBAAAA,QAAOC,MAAMF,SAASG,qBAAOC,MAAMrB,WAAWZ,OAAO,CAAA,CAAE,CAAA;AAEvD,gBAAMoC,YAAYnC,KAAK4C,MAAM7C,OAAO,CAAA,CAAE;AAEtC,qBAAOqC,mCAAc;YACnBC,YAAYC,OAAOtB,KAAKN,OAAO2B,WAAWE,MAAM,CAAA,GAAI,KAAA;YACpDC,MAAML;YACNM,SAAS3C,WAAW,yBAAyB4C,yCAAqBG,KAAKH,yCAAqBI;UAC9F,CAAA;QACF,CAAA;MACF;MAEA;AACE,eAAO,KAAK5C,OAAM,EAAGC,KAAKL,QAAQC,MAAAA;IAEtC;EACF;EAEAc,mBAA2B;AACzB,UAAMH,SAAS,KAAK5B,SAAS,CAAA;AAE7B,QAAI,CAAC4B,QAAQ;AACX,YAAMqC,aAAAA;IACR;AAEA,WAAOrC;EACT;EAEAN,kBAAqB4C,aAA4CC,MAAwBC,sBAAsB,OAAOC,gBAAyB;AAC7I,UAAMrD,SAASqD,kBAAkBH,YAAYlD;AAE7C,QAAI,KAAKZ,oBAAoBY,MAAAA,GAAS;AACpC,aAAOmD,KAAAA;IACT;AAEA,WAAO,IAAI1C,QAAQ,CAAC6C,SAASC,WAAAA;AAC3B,YAAMC,iBAAiC;QACrCN;QACAO,WAAW,mCAAA;AACT,cAAIL,qBAAqB;AACvB,iBAAKhE,oBAAoBY,MAAAA,IAAU;UACrC;AAEAsD,kBAAQ,MAAMH,KAAAA,CAAAA;QAChB,GANW;QAOXI,OAAOG,KAAG;AACRH,iBAAOG,GAAAA;QACT;MACF;AAEA,WAAK5E,iBAAiB6E,KAAK,KAAK7E,iBAAiB8E,SAAQ,EAAGC,OAAOL,cAAAA,CAAAA;IACrE,CAAA;EACF;EAEQM,eAAeC,aAAyB;AAC9C,eAAOC,4BACL,KAAKlF,iBAAiBmF,SACpBC,uBAAU,CAACC,UAAMjD,kBAAKiD,CAAAA,CAAAA,OACtBC,oBAAO,CAACrE,YAAAA;AACN,aAAOA,QAAQmD,YAAYlD,WAAW+D;IACxC,CAAA,OACAM,mBAAAA,OACAC,iBAAI,CAACC,SAAAA;AACH,WAAKzF,iBAAiB6E,KAAKa,QAAQ,KAAK1F,iBAAiB8E,SAAQ,GAAIW,IAAAA,CAAAA;IACvE,CAAA,CAAA,CAAA;EAGN;EAEQE,qBAAqB;AAC3B,UAAMC,kBAAkB,KAAK5F,iBAAiB8E,SAAQ;AACtD,SAAK9E,iBAAiB6E,KAAK,CAAA,CAAE;AAC7B,WAAOe;EACT;EAEAC,qBAAsD;AACpD,WAAO,KAAK7F,iBAAiB8E,SAAQ,EAAGjD,IAAI,CAAC6C,mBAAmBA,eAAeN,WAAW;EAC5F;EAEA0B,uBAAuBb,aAAkC;AACvD,UAAMW,kBAAkB,KAAK5F,iBAAiB8E,SAAQ;AACtD,QAAI,CAACG,aAAa;AAChB,aAAOW,gBAAgBG;IACzB;AAEA,WAAOH,gBAAgBN,OAAO,CAACZ,mBAAmBA,eAAeN,YAAYlD,WAAW+D,WAAAA,EAAac;EACvG;EAEA,MAAMpB,UAAUM,aAAwC;AACtD,UAAMP,iBAAiB,MAAM,KAAKM,eAAeC,WAAAA;AACjD,WAAOP,eAAeC,UAAS;EACjC;EAEA,MAAMF,OAAOQ,aAAyBe,SAAwBC,KAAAA,GAAuB;AACnF,UAAMvB,iBAAiB,MAAM,KAAKM,eAAeC,WAAAA;AACjD,WAAOP,eAAeD,OAAOuB,MAAAA;EAC/B;EAEAE,eAAqB;AACnB,SAAKP,mBAAkB,EAAGQ,QAAQ,CAAClF,YAAYA,QAAQ0D,UAAS,CAAA;EAClE;EAEAyB,UAAUJ,SAAwBC,KAAAA,GAAc;AAC9C,SAAKN,mBAAkB,EAAGQ,QAAQ,CAAClF,YAAYA,QAAQwD,OAAOuB,MAAAA,CAAAA;EAChE;EAEA,MAAMK,eAAe9F,SAAkC;AACrD,SAAKL,WAAWK;AAChB,SAAKmB,KAAK,mBAAmB,MAAMC,QAAQC,IAAI,KAAK1B,SAAS2B,IAAI,CAACyE,WAAWA,OAAOvE,WAAU,CAAA,CAAA,CAAA;EAChG;EAEQN,kBAAmC;AACzC,UAAM8E,YAAY,KAAK/F,OAAOgG,KAAK,CAACD,eAAcA,WAAU7F,YAAY,KAAKP,cAAc;AAC3F,QAAI,CAACoG,WAAW;AACd,YAAME,aAAAA;IACR;AACA,WAAOF;EACT;EAEOjF,SAA2C;AAChD,UAAMiF,YAAY,KAAK9E,gBAAe;AACtC,QAAIS,MAAM,KAAK9B,KAAKmG,UAAU7F,OAAO;AAErC,QAAI,CAACwB,KAAK;AACRA,YAAM,IAAIiB,qBAAOuD,UAAUC,gBAAgBJ,UAAU1D,QAAQ0D,UAAU7F,OAAO;AAC9E,WAAKN,KAAKmG,UAAU7F,OAAO,IAAIwB;IACjC;AAEA,WAAOA;EACT;EAEA0E,aAA8B;AAC5B,WAAO,KAAKnF,gBAAe;EAC7B;EAEAoF,cAAiC;AAC/B,WAAO,KAAKrG;EACd;EAEAsC,WAAWpC,SAAiBmC,QAAsB;AAChD,SAAKrC,OAAOsG,KAAK;MAAEpG;MAASmC;IAAO,CAAA;EACrC;EAEAE,cAAcrC,SAAuB;AACnC,UAAMqG,MAAM,KAAKvG,OAAOwG,UAAU,CAACC,eAAeA,WAAWvG,YAAYA,OAAAA;AACzE,QAAIqG,MAAM,GAAG;AACX,YAAMG,oBAAAA;IACR;AACA,QAAIxG,YAAY,KAAKP,gBAAgB;AACnC,WAAKA,iBAAiBO;AACtB,WAAKgB,KAAK,gBAAgBhB,OAAAA;IAC5B;EACF;AACF;;;AG7TA,0BAA0B;AAG1B,IAAAyG,iBAAgE;AAEhE,mBAAyC;AAEzC,yBAA2B;;;ACR3B,IAAAC,iBAAuB;AAGvB,eAAsBC,oBAAoBC,SAA2BC,QAAyB;AAC5F,QAAMC,eAAe,MAAMC,OAAOH,SAASC,MAAAA,EAAQG,KAAK,CAACC,QAAQA,KAAKH,YAAAA;AACtE,MAAI,CAACA,cAAc;AACjB,UAAMI,MAAM,yCAAyCL,MAAAA,EAAQ;EAC/D;AACA,QAAMM,UAAUC,sBAAOC,MAAMC,eAAe,GAAGR,aAAaS,WAAW,IAAA,IAAQ,KAAK,IAAA,GAAOT,YAAAA,EAAc;AACzG,MAAI,CAACK,WAAW,CAACA,QAAQI,WAAW,IAAA,GAAO;AACzC,UAAML,MAAM,mBAAmBC,OAAAA,uBAA8BL,YAAAA,EAAc;EAC7E;AACA,SAAOK;AACT;AAVsBR;AAYtB,eAAsBI,OAAOH,SAA2BC,QAAyB;AAC/E,SAAO,MAAMD,QAAQY,MAAMC,cAAc;IAAEC,KAAKb,OAAOa;EAAI,CAAA;AAC7D;AAFsBX;;;ADFf,IAAMY,yBAAN,MAAMA;EAZb,OAYaA;;;EACHC;EACAC;EACAC;EAERC,YAAYH,SAAiC;AAC3C,SAAKA,UAAUA;AACf,WAAO;EACT;EAEAI,QAAQC,KAAmB;AACzB,SAAKJ,SAAS;MAAEI;IAAI;AACpB,WAAO;EACT;EAEAC,WAAWL,QAA0C;AACnD,QAAI,OAAOA,WAAW,UAAU;AAC9B,aAAO,KAAKG,QAAQH,MAAAA;IACtB;AAEA,SAAKA,SAASA;AACd,WAAO;EACT;EAEAM,aAAaL,UAA2C;AACtD,SAAKA,WAAWA;AAChB,WAAO;EACT;EAEAM,QAAQ;AACN,QAAI,CAAC,KAAKR,SAAS;AACjB,YAAMS,MAAM,oCAAA;IACd;AACA,QAAI,CAAC,KAAKR,QAAQ;AAChB,YAAMQ,MAAM,6BAAA;IACd;AACA,WAAO,IAAIC,gBAAgB;MAAEV,SAAS,KAAKA;MAASC,QAAQ,KAAKA;MAAQC,UAAU,KAAKA;IAAS,CAAA;EACnG;AACF;AAQO,IAAMQ,kBAAN,MAAMA,yBAAwBC,sBAAAA;EA1DrC,OA0DqCA;;;EAClBX;EACAC;EAEjB,YAAY,EAAEC,UAAUF,SAASC,OAAM,GAAoG;AACzI,UAAK;AAELW,qCAAe,MAAM,YAAYV,YAAYW,MAAAA;AAC7C,SAAKb,UAAUA;AACf,SAAKC,SAASA;EAChB;EAEA,MAAMa,aAA8B;AAClC,WAAO,MAAMC,oBAAoB,KAAKf,SAAS,KAAKC,MAAM;EAC5D;EACA,MAAMe,gBAAgBC,aAA8D;AAClF,UAAM,EAAEC,MAAAA,OAAM,GAAGC,GAAAA,IAAO,MAAMF;AAE9B,WAAO,KAAKjB,QAAQoB,MAAMC,eAAe;MACvCC,WAAW;MACXrB,QAAQ,KAAKA,OAAOI;;;MAGpBkB,UAAMC,2BAASC,+BAAUN,EAAAA,CAAAA;IAC3B,CAAA;EACF;EAEA,MAAMO,QAAQC,SAA+C;AAC3D,WAAO,MAAM,KAAK3B,QAAQoB,MAAMC,eAAe;MAC7CC,WAAW;MACXrB,QAAQ,KAAKA,OAAOI;MACpBuB,UAAU;;MAEVL,MAAMI;IACR,CAAA;EACF;EAEA,MAAME,YAAYF,SAA+C;AAC/D,WAAO,MAAM,KAAK3B,QAAQoB,MAAMC,eAAe;MAC7CC,WAAW;MACXrB,QAAQ,KAAKA,OAAOI;MACpBuB,UAAU;;MAEVL,MAAMI;IACR,CAAA;EACF;EAEA,MAAMG,eAAeC,QAAyBC,OAA8CC,OAA6C;AACvI,UAAMC,WAAmC;MACvCH;MACAC;MACAL,SAASM;IACX;AACA,WAAO,KAAKjC,QAAQoB,MAAMC,eAAe;MACvCC,WAAW;MACXrB,QAAQ,KAAKA,OAAOI;;MAEpBkB,UAAMY,+BAAWC,KAAKC,UAAUH,QAAAA,CAAAA;IAClC,CAAA;EACF;EAEAI,QAAQpC,UAAsC;AAC5C,WAAO,IAAIQ,iBAAgB;MAAER;MAAUF,SAAS,KAAKA;MAASC,QAAQ,KAAKA;IAAO,CAAA;EACpF;AACF;;;AErHA,SAASsC,YACPC,cACAC,SAA8I;AAE9I,QAAMC,QAAQF,aAAaG;AAC3BH,eAAaG,OAAO,CAACC,cAAcC,SAAAA;AACjC,SAAKJ,QAAQ,QAAQG,WAAAA,GAAcC,IAAAA;AACnC,WAAOH,MAAMI,MAAMN,cAAc;MAACI;SAAcC;KAAK;EACvD;AACF;AATSN;AAWF,SAASQ,mBACdC,SACAC,SACAC,QACAC,WAGqB,YAAA;AAAa,GAClCC,QAA2B;AAE3B,QAAMC,WAAqBC,MAAMC,QAAQN,OAAAA,IAAWA,UAAU;IAACA;;AAC/D,QAAMO,SAASH,SAASI,IAAI,CAACR,aAAAA;AAC3B,WAAO;MAAEA,SAAAA;MAASC;IAAO;EAC3B,CAAA;AACA,QAAMQ,eAAe,IAAIC,uBAAuBX,SAASQ,QAAQJ,MAAAA;AACjEb,cAAYmB,cAAcP,QAAAA;AAC1B,SAAOO;AACT;AAjBgBX;;;AClBhB,iCAAuE;AACvE,qBAAuB;AAIhB,SAASa,gBACdC,UACAC,gBACAC,MAAkD;AAElD,QAAMC,UAAUF,eAAeE;AAC/B,QAAMC,aAASC,uBAAAA;AAGf,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BC,UAAQC,IAAI,gCAAgCN,MAAMO,YAAY,GAAA,aAAgBH,IAAAA,EAAM;AACpFF,SAAOM,KACLJ,MACA,CAACK,KAAKC,KAAKC,SAAAA;AACTN,YAAQC,IAAI,OAAOG,IAAIG,MAAMC,MAAAA;EAAcC,KAAKC,UAAUN,IAAIG,MAAM,MAAM,CAAA,CAAA;IAAW;AACrFD,SAAAA;EACF,GACA,OAAOF,KAAKC,KAAKC,SAAAA;AACf,QAAI;AACF,YAAME,SAASJ,IAAIG,KAAKC;AACxB,YAAMG,SAASP,IAAIG,KAAKI;AACxB,YAAMC,KAAKR,IAAIG,KAAKK;AAKpB,UAAIR,IAAIG,KAAKM,YAAY,OAAO;AAC9Bb,gBAAQC,IAAI,mCAAmCQ,KAAKC,UAAUN,IAAIG,IAAI,CAAA;AACtE,mBAAOO,8CAAkBT,KAAK,KAAK;UACjCO,IAAIR,IAAIG,KAAKK;UACbC,SAAS;UACTE,OAAO;UACPC,MAAM;QACR,CAAA;MACF,WAAW,CAACJ,MAAM,CAACJ,QAAQ;AACzBR,gBAAQC,IAAI,mCAAmCQ,KAAKC,UAAUN,IAAIG,IAAI,CAAA;AACtE,mBAAOO,8CAAkBT,KAAK,KAAK;UACjCO,IAAIR,IAAIG,KAAKK;UACbC,SAAS;UACTE,OAAO;UACPC,MAAM;QACR,CAAA;MACF;AACA,YAAMC,SAASxB,SAASyB,QAAQ;QAAEV;QAAQG;MAAO,CAAA;AACjDlB,eAAS0B,aAAY;AACrB,YAAMC,WAAW;QAAER;QAAIC,SAAS;QAAOI,QAAQ,MAAMA;MAAO;AAC5DZ,UAAIgB,KAAKD,QAAAA;AACTpB,cAAQC,IAAI,gBAAgBO,MAAAA;EAAcC,KAAKC,UAAUU,UAAU,MAAM,CAAA,CAAA,EAAI;IAC/E,SAASL,OAAO;AACdf,cAAQC,IAAIc,MAAMO,OAAO;AACzB,UAAIC,MAAMR,MAAMO;AAChB,UAAI,UAAUP,OAAO;AACnBQ,cAAMR,MAAMR;AACZ,mBAAOO,8CAAkBT,KAAK,KAAKkB,GAAAA;MAErC,OAAO;AACL,mBAAOT,8CAAkBT,KAAK,KAAK;UACjCO,IAAIR,IAAIG,KAAKK;UACbC,SAAS;UACTE,OAAOQ;UACPP,MAAMD,MAAMC,QAAQ;QACtB,CAAA;MACF;IACF;AACA,WAAOV,KAAAA;EACT,CAAA;AAEFV,UAAQ4B,IAAI7B,MAAMO,YAAY,IAAIL,MAAAA;AACpC;AApEgBL;AAsET,SAASiC,oBAAoBjB,QAAgBkB,SAAmCjC,UAAgC;AACrHiC,UAAQlB,MAAAA,IAAU,OAAOG,WAAAA;AAEvB,UAAMM,SAASxB,SAASyB,QAAQ;MAAEV;MAAQG;IAAO,CAAA;AAEjDlB,aAAS0B,aAAY;AACrB,WAAO,MAAMF;EACf;AACF;AARgBQ;AAUT,SAASE,cAAclC,UAAgC;AAC5D,QAAMiC,UAAU,CAAC;AACjB,aAAWlB,UAAUoB,OAAOC,OAAOC,UAAAA,GAAa;AAC9CL,wBAAoBjB,QAAQkB,SAASjC,QAAAA;EACvC;AAEA,SAAOiC;AACT;AAPgBC;","names":["Web3Method","without","list","item","idx","indexOf","slice","concat","ErrorWithCode","Error","message","code","Deny","Unauthorized","Disconnected","ErrorWithCode","UnrecognizedChainID","ErrorWithCode","EventEmitter","listeners","Object","create","emit","eventName","args","forEach","listener","on","push","off","i","listener_","entries","splice","once","cb","EthersHeadlessProvider","EventEmitter","_pendingRequests","BehaviorSubject","_signers","_activeChainId","_rpc","_config","_authorizedRequests","signers","chains","config","chainId","Object","assign","debug","logger","console","log","request","method","params","JSON","stringify","getRpc","send","waitAuthorization","getCurrentChain","emit","Promise","all","map","wallet","getAddress","toString","getCurrentWallet","rpc","gas","from","txRequest","tx","connect","sendTransaction","hash","message","signMessage","Number","rpcUrl","addNetwork","switchNetwork","address","assert","equal","ethers","utils","toUtf8String","signature","msgParams","signTypedData","privateKey","Buffer","slice","data","version","SignTypedDataVersion","V1","parse","V4","V3","Unauthorized","requestInfo","task","permanentPermission","methodOverride","resolve","reject","pendingRequest","authorize","err","next","getValue","concat","consumeRequest","requestKind","firstValueFrom","pipe","switchMap","a","filter","first","tap","item","without","consumeAllRequests","pendingRequests","getPendingRequests","getPendingRequestCount","length","reason","Deny","authorizeAll","forEach","rejectAll","changeAccounts","signer","chainConn","find","Disconnected","providers","JsonRpcProvider","getNetwork","getNetworks","push","idx","findIndex","connection","UnrecognizedChainID","import_ethers","import_ethers","getAddressFromAgent","context","keyRef","publicKeyHex","getKey","then","key","Error","address","ethers","utils","computeAddress","startsWith","agent","keyManagerGet","kid","EthersKMSSignerBuilder","context","keyRef","provider","withContext","withKid","kid","withKeyRef","withProvider","build","Error","EthersKMSSigner","Signer","defineReadOnly","undefined","getAddress","getAddressFromAgent","signTransaction","transaction","from","tx","agent","keyManagerSign","algorithm","data","arrayify","serialize","signRaw","message","encoding","signMessage","_signTypedData","domain","types","value","jsonData","fromString","JSON","stringify","connect","relayEvents","eventEmitter","execute","emit_","emit","eventName","args","apply","createWeb3Provider","signers","chainId","rpcUrl","evaluate","config","chainIds","Array","isArray","chains","map","web3Provider","EthersHeadlessProvider","createRpcServer","provider","expressSupport","opts","express","router","Router","path","console","log","basePath","post","req","res","next","body","method","JSON","stringify","params","id","jsonrpc","sendErrorResponse","error","code","result","request","authorizeAll","respBody","json","message","msg","use","createServiceMethod","service","createService","Object","values","Web3Method"]}