@sphereon/ssi-sdk-web3.headless-provider 0.34.1-next.3 → 0.34.1-next.323
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.cjs
CHANGED
|
@@ -47,7 +47,7 @@ __export(index_exports, {
|
|
|
47
47
|
module.exports = __toCommonJS(index_exports);
|
|
48
48
|
|
|
49
49
|
// src/types.ts
|
|
50
|
-
var Web3Method = /* @__PURE__ */ function(Web3Method2) {
|
|
50
|
+
var Web3Method = /* @__PURE__ */ (function(Web3Method2) {
|
|
51
51
|
Web3Method2["RequestAccounts"] = "eth_requestAccounts";
|
|
52
52
|
Web3Method2["Accounts"] = "eth_accounts";
|
|
53
53
|
Web3Method2["SendTransaction"] = "eth_sendTransaction";
|
|
@@ -59,7 +59,7 @@ var Web3Method = /* @__PURE__ */ function(Web3Method2) {
|
|
|
59
59
|
Web3Method2["SignTypedDataV3"] = "eth_signTypedData_v3";
|
|
60
60
|
Web3Method2["SignTypedDataV4"] = "eth_signTypedData_v4";
|
|
61
61
|
return Web3Method2;
|
|
62
|
-
}({});
|
|
62
|
+
})({});
|
|
63
63
|
function without(list, item) {
|
|
64
64
|
const idx = list.indexOf(item);
|
|
65
65
|
if (idx >= 0) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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":"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","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"]}
|
|
1
|
+
{"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":"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","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"]}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
|
|
4
4
|
// src/types.ts
|
|
5
|
-
var Web3Method = /* @__PURE__ */ function(Web3Method2) {
|
|
5
|
+
var Web3Method = /* @__PURE__ */ (function(Web3Method2) {
|
|
6
6
|
Web3Method2["RequestAccounts"] = "eth_requestAccounts";
|
|
7
7
|
Web3Method2["Accounts"] = "eth_accounts";
|
|
8
8
|
Web3Method2["SendTransaction"] = "eth_sendTransaction";
|
|
@@ -14,7 +14,7 @@ var Web3Method = /* @__PURE__ */ function(Web3Method2) {
|
|
|
14
14
|
Web3Method2["SignTypedDataV3"] = "eth_signTypedData_v3";
|
|
15
15
|
Web3Method2["SignTypedDataV4"] = "eth_signTypedData_v4";
|
|
16
16
|
return Web3Method2;
|
|
17
|
-
}({});
|
|
17
|
+
})({});
|
|
18
18
|
function without(list, item) {
|
|
19
19
|
const idx = list.indexOf(item);
|
|
20
20
|
if (idx >= 0) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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":["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":"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","names":["Web3Method","without","list","item","idx","indexOf","slice","concat","toUtf8String","signTypedData","SignTypedDataVersion","assert","ethers","BehaviorSubject","filter","first","firstValueFrom","from","switchMap","tap","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","serialize","Signer","arrayify","defineReadOnly","fromString","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","sendErrorResponse","Router","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"]}
|
|
1
|
+
{"version":3,"sources":["../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":["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":"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","names":["Web3Method","without","list","item","idx","indexOf","slice","concat","toUtf8String","signTypedData","SignTypedDataVersion","assert","ethers","BehaviorSubject","filter","first","firstValueFrom","from","switchMap","tap","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","serialize","Signer","arrayify","defineReadOnly","fromString","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","sendErrorResponse","Router","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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sphereon/ssi-sdk-web3.headless-provider",
|
|
3
|
-
"version": "0.34.1-next.
|
|
3
|
+
"version": "0.34.1-next.323+d3f5079e",
|
|
4
4
|
"source": "src/index.ts",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@ethersproject/strings": "^5.7.0",
|
|
29
29
|
"@ethersproject/transactions": "^5.7.0",
|
|
30
30
|
"@metamask/eth-sig-util": "^6.0.2",
|
|
31
|
-
"@sphereon/ssi-express-support": "0.34.1-next.
|
|
31
|
+
"@sphereon/ssi-express-support": "0.34.1-next.323+d3f5079e",
|
|
32
32
|
"@veramo/core": "4.2.0",
|
|
33
33
|
"@veramo/key-manager": "4.2.0",
|
|
34
34
|
"bn.js": "^5.2.1",
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"web3-validator": "^2.0.6"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@sphereon/ssi-sdk-ext.key-manager": "0.
|
|
57
|
-
"@sphereon/ssi-sdk-ext.kms-local": "0.
|
|
56
|
+
"@sphereon/ssi-sdk-ext.key-manager": "0.34.1-next.323+d3f5079e",
|
|
57
|
+
"@sphereon/ssi-sdk-ext.kms-local": "0.34.1-next.323+d3f5079e",
|
|
58
58
|
"@types/body-parser": "^1.19.5",
|
|
59
59
|
"@types/cors": "^2.8.17",
|
|
60
60
|
"@types/dotenv-flow": "^3.3.3",
|
|
@@ -85,5 +85,5 @@
|
|
|
85
85
|
"SSI",
|
|
86
86
|
"Agent"
|
|
87
87
|
],
|
|
88
|
-
"gitHead": "
|
|
88
|
+
"gitHead": "d3f5079e9d38e5e63abb8695829b724a03180a47"
|
|
89
89
|
}
|