From f5dcdf2d5cfe6d6c884cd3e801f4ffb6b55b335d Mon Sep 17 00:00:00 2001 From: Dennis von der Bey Date: Thu, 5 Oct 2023 16:33:52 +0200 Subject: [PATCH] chore(deps): bump ethers (#1242) BREAKING CHANGE: now using ethers v6 as a dependency which may need extra attention when merging. The output of `eth_signTransaction` algorithms may be slightly different as transactions are by default infered as type 1 (EIP1559) --- __tests__/shared/didManager.ts | 2 +- __tests__/shared/keyManager.ts | 45 +++++++++--- __tests__/utils/ethers-provider.ts | 27 +++---- __tests__/utils/ganache-provider.ts | 18 ++--- package.json | 4 - packages/did-comm/package.json | 7 +- packages/did-provider-ethr/package.json | 15 +--- .../src/ethr-did-provider.ts | 73 ++++++++++++------- .../did-provider-ethr/src/kms-eth-signer.ts | 61 +++++++++------- packages/did-provider-ion/package.json | 2 - packages/did-provider-ion/src/functions.ts | 5 +- .../did-provider-key/src/key-did-provider.ts | 15 +++- packages/did-provider-pkh/package.json | 8 +- .../did-provider-pkh/src/pkh-did-provider.ts | 47 +++++------- packages/did-resolver/package.json | 2 +- packages/key-manager/package.json | 4 - .../src/abstract-key-management-system.ts | 12 ++- packages/key-manager/src/key-manager.ts | 12 ++- packages/key-manager/src/types.ts | 2 +- packages/kms-local/package.json | 7 -- .../kms-local/src/key-management-system.ts | 72 ++++++++++-------- packages/kms-local/src/secret-box.ts | 11 ++- packages/kms-web3/package.json | 10 +-- .../src/web3-key-management-system.ts | 15 ++-- packages/utils/package.json | 4 +- packages/utils/src/did-utils.ts | 7 +- 26 files changed, 254 insertions(+), 233 deletions(-) diff --git a/__tests__/shared/didManager.ts b/__tests__/shared/didManager.ts index e1b2acb1a..664c8003d 100644 --- a/__tests__/shared/didManager.ts +++ b/__tests__/shared/didManager.ts @@ -58,7 +58,7 @@ export default (testContext: { expect(identifier.controllerKeyId).toEqual(identifier.keys[0].kid) }) - it('should create identifier using chainId 3', async () => { + it('should translate identifier using chainId 421613 to arbitrum', async () => { identifier = await agent.didManagerCreate({ provider: 'did:ethr', options: { diff --git a/__tests__/shared/keyManager.ts b/__tests__/shared/keyManager.ts index 42d9ae6ad..cb1341c5a 100644 --- a/__tests__/shared/keyManager.ts +++ b/__tests__/shared/keyManager.ts @@ -1,9 +1,9 @@ // noinspection ES6PreferShortImport import { IAgentOptions, IDIDManager, IKeyManager, IResolver, TAgent, TKeyType } from '../../packages/core/src' -import { computeAddress, serialize } from '@ethersproject/transactions' import { mapIdentifierKeysToDoc } from '../../packages/utils/src' import { recoverTypedSignature, SignTypedDataVersion } from '@metamask/eth-sig-util' +import {computeAddress, Transaction} from "ethers"; type ConfiguredAgent = TAgent @@ -222,7 +222,7 @@ export default (testContext: { const rawTx = await agent.keyManagerSignEthTX({ kid: key.kid, transaction: { - to: '0xce31a19193d4b23f4e9d6163d7247243bAF801c3', + to: '0xcE31a19193D4b23F4E9D6163d7247243BAF801C3', value: 300000, gasLimit: 43092000, gasPrice: 20000000000, @@ -243,7 +243,7 @@ export default (testContext: { const rawTx = await agent.keyManagerSignEthTX({ kid: key.kid, transaction: { - to: '0xce31a19193d4b23f4e9d6163d7247243bAF801c3', + to: '0xcE31a19193D4b23F4E9D6163d7247243BAF801C3', from: keyAddress, value: 300000, gasLimit: 43092000, @@ -266,8 +266,8 @@ export default (testContext: { agent.keyManagerSignEthTX({ kid: key.kid, transaction: { - to: '0xce31a19193d4b23f4e9d6163d7247243bAF801c3', - from: '0xce31a19193d4b23f4e9d6163d7247243bAF801c3', + to: '0xcE31a19193D4b23F4E9D6163d7247243BAF801C3', + from: '0xcE31a19193D4b23F4E9D6163d7247243BAF801C3', value: 300000, gasLimit: 43092000, gasPrice: 20000000000, @@ -351,7 +351,7 @@ export default (testContext: { const rawTx = await agent.keyManagerSignEthTX({ kid: importedKey.kid, transaction: { - to: '0xce31a19193d4b23f4e9d6163d7247243bAF801c3', + to: '0xcE31a19193D4b23F4E9D6163d7247243BAF801C3', value: 300000, gasLimit: 43092000, gasPrice: 20000000000, @@ -359,7 +359,7 @@ export default (testContext: { }, }) expect(rawTx).toEqual( - '0xf869018504a817c800840291882094ce31a19193d4b23f4e9d6163d7247243baf801c3830493e0801ba0f16e2206290181c3feaa04051dad19089105c24339dbdf0d80147b48a59fa152a0770e8751ec77ccc78e8b207023f168444f7cfb67055c55c70ef75234458a3d51', + '0x01f86b80018504a817c800840291882094ce31a19193d4b23f4e9d6163d7247243baf801c3830493e080c001a05a46cdfe2102e81e90f89d8896ddaf32aee5473bad994bc1767f0d2af9afa160a01c028daaf737d69f6933d2dfef5e739f459cfb9e8ce1d9ba9ea7bb0c6006518c', ) }) @@ -376,14 +376,39 @@ export default (testContext: { }) it('should sign EthTX using generic signer', async () => { - const txData = serialize({ - to: '0xce31a19193d4b23f4e9d6163d7247243bAF801c3', + const transaction = new Transaction() + transaction.to = '0xcE31a19193D4b23F4E9D6163d7247243BAF801C3' + transaction.value = 300000 + transaction.gasLimit = 43092000 + transaction.gasPrice = 20000000000 + transaction.nonce = 1 + + const txData = transaction.unsignedSerialized + + const rawTx = await agent.keyManagerSign({ + algorithm: 'eth_signTransaction', + data: txData, + encoding: 'hex', + keyRef: importedKey.kid, + }) + + expect(rawTx).toEqual( + '0x01f86b80018504a817c800840291882094ce31a19193d4b23f4e9d6163d7247243baf801c3830493e080c001a05a46cdfe2102e81e90f89d8896ddaf32aee5473bad994bc1767f0d2af9afa160a01c028daaf737d69f6933d2dfef5e739f459cfb9e8ce1d9ba9ea7bb0c6006518c', + ) + }) + + it('should sign EthTX using generic signer and specific type', async () => { + const transaction = Transaction.from({ + to: '0xcE31a19193D4b23F4E9D6163d7247243BAF801C3', value: 300000, gasLimit: 43092000, gasPrice: 20000000000, nonce: 1, + type: 0, // enforce legacy serialization }) + const txData = transaction.unsignedSerialized + const rawTx = await agent.keyManagerSign({ algorithm: 'eth_signTransaction', data: txData, @@ -392,7 +417,7 @@ export default (testContext: { }) expect(rawTx).toEqual( - '0xf869018504a817c800840291882094ce31a19193d4b23f4e9d6163d7247243baf801c3830493e0801ba0f16e2206290181c3feaa04051dad19089105c24339dbdf0d80147b48a59fa152a0770e8751ec77ccc78e8b207023f168444f7cfb67055c55c70ef75234458a3d51', + '0xf869018504a817c800840291882094ce31a19193d4b23f4e9d6163d7247243baf801c3830493e0801ba0f16e2206290181c3feaa04051dad19089105c24339dbdf0d80147b48a59fa152a0770e8751ec77ccc78e8b207023f168444f7cfb67055c55c70ef75234458a3d51', ) }) }) diff --git a/__tests__/utils/ethers-provider.ts b/__tests__/utils/ethers-provider.ts index c8c266f47..b863448f5 100644 --- a/__tests__/utils/ethers-provider.ts +++ b/__tests__/utils/ethers-provider.ts @@ -1,34 +1,35 @@ -import { Web3Provider, ExternalProvider } from '@ethersproject/providers' -import { Wallet } from '@ethersproject/wallet' +import { BrowserProvider, Eip1193Provider, Wallet } from 'ethers' -export function createEthersProvider(): Web3Provider { +export function createEthersProvider(): BrowserProvider { const privateKeyHex = '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db' const wallet = new Wallet(privateKeyHex) const mockProvider = new MockWeb3Provider(wallet) - const provider = new Web3Provider(mockProvider) + const provider = new BrowserProvider(mockProvider) return provider } +class MockWeb3Provider implements Eip1193Provider { + constructor(private wallet: Wallet) {} -class MockWeb3Provider implements ExternalProvider { - constructor(private wallet: Wallet){ - - } async request(request: { method: string; params?: any[] }): Promise { - + switch(request.method) { case 'personal_sign': //@ts-ignore return this.wallet.signMessage(request.params[1]) break - case 'eth_signTypedData_v4': - //@ts-ignore + case 'eth_signTypedData_v4': + // @ts-ignore const {domain, types, message} = JSON.parse(request.params[1]) delete(types.EIP712Domain) - return this.wallet._signTypedData(domain, types, message) + return this.wallet.signTypedData(domain, types, message) + case 'eth_accounts': + return [await this.wallet.getAddress()] + case 'eth_chainId': + return "1337" break default: throw Error(`not_available: method ${request.method}`) } } -} \ No newline at end of file +} diff --git a/__tests__/utils/ganache-provider.ts b/__tests__/utils/ganache-provider.ts index 9448585a4..c68b4518a 100644 --- a/__tests__/utils/ganache-provider.ts +++ b/__tests__/utils/ganache-provider.ts @@ -1,7 +1,5 @@ -import { Web3Provider } from '@ethersproject/providers' -import { Contract, ContractFactory } from '@ethersproject/contracts' -// @ts-ignore -import DidRegistryContract from 'ethr-did-registry' +import { BrowserProvider, Contract, ContractFactory } from 'ethers' +import { EthereumDIDRegistry } from 'ethr-did-resolver' import ganache from 'ganache' /** @@ -9,8 +7,8 @@ import ganache from 'ganache' * * This provider can only be used in a single test suite, because of some concurrency issues with ganache. */ -export async function createGanacheProvider(): Promise<{ provider: Web3Provider; registry: string }> { - const provider = new Web3Provider( +export async function createGanacheProvider(): Promise<{ provider: BrowserProvider; registry: string }> { + const provider = new BrowserProvider( ganache.provider({ logging: { quiet: true }, accounts: [ @@ -58,13 +56,11 @@ export async function createGanacheProvider(): Promise<{ provider: Web3Provider; }) as any ) await provider.ready - const factory = ContractFactory.fromSolidity(DidRegistryContract).connect(provider.getSigner(0)) + const factory = ContractFactory.fromSolidity(EthereumDIDRegistry).connect(await provider.getSigner(0)) let registryContract: Contract = await factory.deploy() - registryContract = await registryContract.deployed() + registryContract = await registryContract.waitForDeployment() - await registryContract.deployTransaction.wait() - - const registry = registryContract.address + const registry = await registryContract.getAddress() return { provider, registry } } diff --git a/package.json b/package.json index 3b70993af..f98973ba6 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,6 @@ "__browser_tests__/*" ], "devDependencies": { - "@ethersproject/contracts": "^5.7.0", - "@ethersproject/providers": "^5.7.2", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wallet": "^5.7.0", "@metamask/eth-sig-util": "^5.0.0", "@microsoft/api-documenter": "7.19.27", "@microsoft/api-extractor": "7.33.7", diff --git a/packages/did-comm/package.json b/packages/did-comm/package.json index 42c035814..c4d91195a 100644 --- a/packages/did-comm/package.json +++ b/packages/did-comm/package.json @@ -14,11 +14,10 @@ } }, "dependencies": { - "@ethersproject/signing-key": "^5.7.0", "@stablelib/ed25519": "^1.0.3", - "@veramo/core": "^4.3.0", - "@veramo/message-handler": "^4.3.0", - "@veramo/utils": "^4.3.0", + "@veramo/core": "workspace:^", + "@veramo/message-handler": "workspace:^", + "@veramo/utils": "workspace:^", "cross-fetch": "^3.1.4", "debug": "^4.3.3", "did-jwt": "^6.9.0", diff --git a/packages/did-provider-ethr/package.json b/packages/did-provider-ethr/package.json index 61136a8fe..a3cd70772 100644 --- a/packages/did-provider-ethr/package.json +++ b/packages/did-provider-ethr/package.json @@ -9,19 +9,10 @@ "extract-api": "pnpm exec veramo dev extract-api" }, "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/providers": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@veramo/core": "^4.3.0", - "@veramo/did-manager": "^4.3.0", + "@veramo/core": "workspace:^", + "@veramo/did-manager": "workspace:^", "debug": "^4.3.3", - "ethr-did": "^2.3.6" + "ethr-did": "^3.0.1" }, "devDependencies": { "@types/debug": "4.1.7", diff --git a/packages/did-provider-ethr/src/ethr-did-provider.ts b/packages/did-provider-ethr/src/ethr-did-provider.ts index 0ea781e94..8ee610d69 100644 --- a/packages/did-provider-ethr/src/ethr-did-provider.ts +++ b/packages/did-provider-ethr/src/ethr-did-provider.ts @@ -1,14 +1,9 @@ import { IAgentContext, IIdentifier, IKey, IKeyManager, IService } from '@veramo/core' import { AbstractIdentifierProvider } from '@veramo/did-manager' -import { Provider } from '@ethersproject/abstract-provider' -import { JsonRpcProvider, TransactionRequest } from '@ethersproject/providers' -import { BigNumber } from '@ethersproject/bignumber' -import { computePublicKey } from '@ethersproject/signing-key' -import { computeAddress } from '@ethersproject/transactions' +import { Provider, SigningKey, computeAddress, JsonRpcProvider, TransactionRequest, Signature } from 'ethers' import { KmsEthereumSigner } from './kms-eth-signer' import Debug from 'debug' import { EthrDID } from 'ethr-did' -import { splitSignature } from '@ethersproject/bytes' const debug = Debug('veramo:did-provider-ethr') @@ -38,7 +33,7 @@ export interface CreateDidEthrOptions { * * If this is not specified, `mainnet` is assumed. */ - network?: string | number + network?: string | number | bigint /** * This is usually a did prefix, like `did:ethr` or `did:ethr:goerli` and can be used to determine the desired @@ -106,7 +101,7 @@ export interface EthrNetworkConfiguration { * * Example, chainId==42 and name==undefined => DIDs are prefixed with `did:ethr:0x2a:` */ - chainId?: string | number + chainId?: string | number | bigint // eslint-disable-next-line @typescript-eslint/no-explicit-any [index: string]: any @@ -129,7 +124,7 @@ export class EthrDIDProvider extends AbstractIdentifierProvider { /** * @deprecated Please use the `networks` parameter instead. */ - network?: string | number + network?: string | number | bigint /** * @deprecated Please use the `networks` parameter instead. */ @@ -166,13 +161,16 @@ export class EthrDIDProvider extends AbstractIdentifierProvider { } if (typeof options.network === 'string') { if (options.network.startsWith('0x')) { - singleNetwork.chainId = parseInt(options.network.substring(2), 16) + singleNetwork.chainId = BigInt(options.network) } else { singleNetwork.name = options.network } - } else if (typeof options.network === 'number') { + } else if (typeof options.network === 'bigint') { singleNetwork.chainId = options.network singleNetwork.name = options.name + } else if (typeof options.network === 'number') { + singleNetwork.chainId = BigInt(options.network) + singleNetwork.name = options.name } this.networks = [singleNetwork] } @@ -184,22 +182,33 @@ export class EthrDIDProvider extends AbstractIdentifierProvider { { kms, options }: { kms?: string; options?: CreateDidEthrOptions }, context: IRequiredContext, ): Promise> { - const key = await context.agent.keyManagerCreate({ kms: kms || this.defaultKms, type: 'Secp256k1' }) - const compressedPublicKey = computePublicKey(`0x${key.publicKeyHex}`, true) - let networkSpecifier = - options?.network || - (options?.providerName?.match(/^did:ethr:.+$/) ? options?.providerName?.substring(9) : undefined) + const key = await context.agent.keyManagerCreate({kms: kms || this.defaultKms, type: 'Secp256k1'}) + const compressedPublicKey = SigningKey.computePublicKey(`0x${key.publicKeyHex}`, true) + + let networkSpecifier + if(options?.network) { + if(typeof options.network === 'number') { + networkSpecifier = BigInt(options?.network) + } else { + networkSpecifier = options?.network + } + } else if(options?.providerName?.match(/^did:ethr:.+$/)) { + networkSpecifier = options?.providerName?.substring(9) + } else { + networkSpecifier = undefined + } + const network = this.getNetworkFor(networkSpecifier) if (!network) { throw new Error( `invalid_setup: Cannot create did:ethr. There is no known configuration for network=${networkSpecifier}'`, ) } - if (typeof networkSpecifier === 'number') { + if (typeof networkSpecifier === 'bigint' || typeof networkSpecifier === 'number') { networkSpecifier = network.name && network.name.length > 0 ? network.name - : BigNumber.from(options?.network || 1).toHexString() + : BigInt(options?.network || 1).toString(16) } const networkString = networkSpecifier && networkSpecifier !== 'mainnet' ? `${networkSpecifier}:` : '' const identifier: Omit = { @@ -227,16 +236,19 @@ export class EthrDIDProvider extends AbstractIdentifierProvider { return true } - private getNetworkFor(networkSpecifier: string | number | undefined): EthrNetworkConfiguration | undefined { - let networkNameOrId: string | number = networkSpecifier || 'mainnet' - if ( - typeof networkNameOrId === 'string' && - (networkNameOrId.startsWith('0x') || parseInt(networkNameOrId) > 0) - ) { - networkNameOrId = BigNumber.from(networkNameOrId).toNumber() - } + private getNetworkFor(networkSpecifier: string | number | bigint | undefined): EthrNetworkConfiguration | undefined { + let networkNameOrId: string | number | bigint = networkSpecifier || 'mainnet' let network = this.networks.find( - (n) => n.chainId === networkNameOrId || n.name === networkNameOrId || n.description === networkNameOrId, + (n) => { + if(n.chainId) { + if(typeof networkSpecifier === 'bigint') { + if(BigInt(n.chainId) === networkNameOrId) return n + } else { + if(n.chainId === networkNameOrId) return n + } + } + if(n.name === networkNameOrId || n.description === networkNameOrId) return n + }, ) if (!network && !networkSpecifier && this.networks.length === 1) { network = this.networks[0] @@ -261,10 +273,15 @@ export class EthrDIDProvider extends AbstractIdentifierProvider { const networkStringMatcher = /^did:ethr(:.+)?:(0x[0-9a-fA-F]{40}|0x[0-9a-fA-F]{66}).*$/ const matches = identifier.did.match(networkStringMatcher) let network = this.getNetworkFor(matches?.[1]?.substring(1)) + if (!matches || !network) { throw new Error(`invalid_argument: cannot find network for ${identifier.did}`) } + if(!network.provider) { + throw new Error(`Provider was not found for network ${identifier.did}`) + } + if (metaIdentifierKeyId) { const metaControllerKey = await context.agent.keyManagerGet({ kid: metaIdentifierKeyId }) if (typeof metaControllerKey === 'undefined') { @@ -522,6 +539,6 @@ export class EthrDIDProvider extends AbstractIdentifierProvider { algorithm: 'eth_rawSign', encoding: 'hex', }) - return splitSignature(signature) + return Signature.from(signature) } } diff --git a/packages/did-provider-ethr/src/kms-eth-signer.ts b/packages/did-provider-ethr/src/kms-eth-signer.ts index 9540db836..dfb477ce6 100644 --- a/packages/did-provider-ethr/src/kms-eth-signer.ts +++ b/packages/did-provider-ethr/src/kms-eth-signer.ts @@ -1,26 +1,29 @@ -import { TransactionRequest, Provider } from '@ethersproject/abstract-provider' -import { Signer, TypedDataSigner, TypedDataDomain, TypedDataField } from '@ethersproject/abstract-signer' -import { getAddress } from '@ethersproject/address' -import { Bytes } from '@ethersproject/bytes' -import { Deferrable, resolveProperties } from '@ethersproject/properties' -import { computeAddress, serialize, UnsignedTransaction } from '@ethersproject/transactions' +import { + Provider, + Signer, + TypedDataDomain, + TypedDataField, + getAddress, + computeAddress, + Transaction, + AbstractSigner, +} from 'ethers' import { IRequiredContext } from './ethr-did-provider' import { IKey } from '@veramo/core' +import { Addressable } from 'ethers' /** - * Creates an `@ethersproject/abstract-signer` implementation by wrapping + * Creates an `ethers` - `signer` implementation by wrapping * a veramo agent with a key-manager that should be capable of `eth_signTransaction` */ -export class KmsEthereumSigner extends Signer implements TypedDataSigner { +export class KmsEthereumSigner extends AbstractSigner { private context: IRequiredContext private controllerKey: IKey - readonly provider?: Provider constructor(controllerKey: IKey, context: IRequiredContext, provider?: Provider) { - super() + super(provider) this.controllerKey = controllerKey this.context = context - this.provider = provider } async getAddress(): Promise { @@ -31,46 +34,52 @@ export class KmsEthereumSigner extends Signer implements TypedDataSigner { return computeAddress('0x' + this.controllerKey.publicKeyHex) } - async signTransaction(transaction: Deferrable): Promise { - const tx = await resolveProperties(transaction) - if (tx.from != null) { + async signTransaction(transaction: Transaction): Promise { + if (transaction.from != null) { const thisAddress = await this.getAddress() - if (getAddress(tx.from) !== thisAddress) { + if (getAddress(transaction.from) !== thisAddress) { throw new Error(`transaction from address mismatch ${transaction.from} != ${thisAddress}`) } - delete tx.from } + const signature = await this.context.agent.keyManagerSign({ keyRef: this.controllerKey.kid, - data: serialize(tx), + data: transaction.unsignedSerialized, algorithm: 'eth_signTransaction', encoding: 'base16', }) return signature } - async _signTypedData( - domain: TypedDataDomain, - types: Record>, - value: Record, + async signTypedData( + domain: TypedDataDomain, + types: Record>, + value: Record, ): Promise { const data = JSON.stringify({ domain: domain, types: types, message: value, - }); + }) return this.context.agent.keyManagerSign({ keyRef: this.controllerKey.kid, algorithm: 'eth_signTypedData', data: data, - }); + }) } - signMessage(message: string | Bytes): Promise { + signMessage(message: string | Uint8Array): Promise { throw new Error('not_implemented: signMessage() Method not implemented by KmsEthereumSigner.') } - connect(provider: Provider): KmsEthereumSigner { - return new KmsEthereumSigner(this.controllerKey, this.context, provider) + connect(provider: Provider | null) { + if (!provider) { + throw new Error('provider must not be null') + } + return new KmsEthereumSigner(this.controllerKey, this.context, provider) as unknown as Signer } } + +function isAddressable(address: any): address is Addressable { + return (address as Addressable).getAddress !== undefined +} diff --git a/packages/did-provider-ion/package.json b/packages/did-provider-ion/package.json index c2d80be41..66bb15fe6 100644 --- a/packages/did-provider-ion/package.json +++ b/packages/did-provider-ion/package.json @@ -10,8 +10,6 @@ }, "dependencies": { "@decentralized-identity/ion-sdk": "^0.6.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", "@sphereon/ion-pow": "^0.2.0", "@sphereon/isomorphic-argon2": "^1.0.0", "@stablelib/ed25519": "^1.0.3", diff --git a/packages/did-provider-ion/src/functions.ts b/packages/did-provider-ion/src/functions.ts index d24f66103..f190ef70d 100644 --- a/packages/did-provider-ion/src/functions.ts +++ b/packages/did-provider-ion/src/functions.ts @@ -6,10 +6,9 @@ import { KeyType, } from './types/ion-provider-types' import { IonDid, IonDocumentModel, IonPublicKeyModel, IonPublicKeyPurpose, JwkEs256k } from '@decentralized-identity/ion-sdk' -import { computePublicKey } from '@ethersproject/signing-key' import { IKey, ManagedKeyInfo } from '@veramo/core' import keyto from '@trust/keyto'; -import { randomBytes } from '@ethersproject/random' +import { randomBytes, SigningKey } from 'ethers' import * as u8a from 'uint8arrays' import { generateKeyPair as generateSigningKeyPair } from '@stablelib/ed25519' import Debug from 'debug' @@ -100,7 +99,7 @@ const publicKeyJwkFromPublicKeyHex = (publicKeyHex: string) => { const compressedHexEncodedPublicKeyLength = 66; if (publicKeyHex.length === compressedHexEncodedPublicKeyLength) { const publicBytes = u8a.fromString(publicKeyHex, 'base16') - key = computePublicKey(publicBytes, true).substring(2) + key = SigningKey.computePublicKey(publicBytes, true).substring(2) } const jwk = { ...keyto.from(key, 'blk').toJwk('public'), diff --git a/packages/did-provider-key/src/key-did-provider.ts b/packages/did-provider-key/src/key-did-provider.ts index 8102e3b40..41a1cb83b 100644 --- a/packages/did-provider-key/src/key-did-provider.ts +++ b/packages/did-provider-key/src/key-did-provider.ts @@ -1,13 +1,20 @@ import { IIdentifier, IKey, IService, IAgentContext, IKeyManager } from '@veramo/core' import { AbstractIdentifierProvider } from '@veramo/did-manager' import Multibase from 'multibase' -import Multicodec from 'multicodec' +import Multicodec, { CodecName } from 'multicodec' +import { SigningKey } from 'ethers' import Debug from 'debug' const debug = Debug('veramo:did-key:identifier-provider') type IContext = IAgentContext +const keyCodecs: Record = { + Ed25519: 'ed25519-pub', + X25519: 'x25519-pub', + Secp256k1: 'secp256k1-pub', +} as const + /** * {@link @veramo/did-manager#DIDManager} identifier provider for `did:key` identifiers * @@ -25,12 +32,14 @@ export class KeyDIDProvider extends AbstractIdentifierProvider { { kms, options }: { kms?: string; options?: any }, context: IContext, ): Promise> { - const key = await context.agent.keyManagerCreate({ kms: kms || this.defaultKms, type: 'Ed25519' }) + const keyType = (options?.keyType && keyCodecs[options?.keyType] && options.keyType) || 'Ed25519' + const key = await context.agent.keyManagerCreate({ kms: kms || this.defaultKms, type: keyType }) + const publicKeyHex = key.type === 'Secp256k1' ? SigningKey.computePublicKey('0x' + key.publicKeyHex, true) : key.publicKeyHex const methodSpecificId = Buffer.from( Multibase.encode( 'base58btc', - Multicodec.addPrefix('ed25519-pub', Buffer.from(key.publicKeyHex, 'hex')), + Multicodec.addPrefix(keyCodecs[key.type], Buffer.from(publicKeyHex, 'hex')), ), ).toString() diff --git a/packages/did-provider-pkh/package.json b/packages/did-provider-pkh/package.json index f514668ff..71cb4c0ed 100644 --- a/packages/did-provider-pkh/package.json +++ b/packages/did-provider-pkh/package.json @@ -9,12 +9,8 @@ "extract-api": "pnpm exec veramo dev extract-api" }, "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@veramo/core": "^4.3.0", - "@veramo/did-manager": "^4.3.0", + "@veramo/core": "workspace:^", + "@veramo/did-manager": "workspace:^", "debug": "^4.3.3", "did-resolver": "^4.0.1" }, diff --git a/packages/did-provider-pkh/src/pkh-did-provider.ts b/packages/did-provider-pkh/src/pkh-did-provider.ts index 6deda5345..4ae15980b 100644 --- a/packages/did-provider-pkh/src/pkh-did-provider.ts +++ b/packages/did-provider-pkh/src/pkh-did-provider.ts @@ -1,10 +1,7 @@ -import { IIdentifier, IKey, IService, IAgentContext, IKeyManager } from '@veramo/core' -import { Provider } from '@ethersproject/abstract-provider' -import { computeAddress } from '@ethersproject/transactions' +import { computeAddress } from 'ethers' +import { IAgentContext, IIdentifier, IKey, IKeyManager, IService, ManagedKeyInfo } from '@veramo/core' import { AbstractIdentifierProvider } from '@veramo/did-manager' -import { computePublicKey } from '@ethersproject/signing-key' -import { BigNumber } from '@ethersproject/bignumber' import Debug from 'debug' const debug = Debug('veramo:did-pkh:identifier-provider') @@ -15,7 +12,7 @@ type IContext = IAgentContext * Options for creating a did:ethr * @beta */ - export interface CreateDidPkhEthrOptions { +export interface CreateDidPkhEthrOptions { /** * This can be hex encoded chain ID (string) or a chainId number * @@ -24,15 +21,14 @@ type IContext = IAgentContext chainId?: string | number } - /** +/** * Helper method that can computes the ethereumAddress corresponding to a Secp256k1 public key. * @param hexPublicKey A hex encoded public key, optionally prefixed with `0x` */ - export function toEthereumAddress(hexPublicKey: string): string { - const publicKey = hexPublicKey.startsWith('0x') ? hexPublicKey : '0x' + hexPublicKey - return computeAddress(publicKey) - } - +export function toEthereumAddress(hexPublicKey: string): string { + const publicKey = hexPublicKey.startsWith('0x') ? hexPublicKey : '0x' + hexPublicKey + return computeAddress(publicKey) +} /** * {@link @veramo/did-manager#DIDManager} identifier provider for `did:pkh` identifiers @@ -40,27 +36,21 @@ type IContext = IAgentContext * @beta This API may change without a BREAKING CHANGE notice. */ export class PkhDIDProvider extends AbstractIdentifierProvider { - private defaultKms: string - - constructor(options: { - defaultKms: string - }) - { - super() - this.defaultKms = options.defaultKms - } - + private defaultKms: string + constructor(options: { defaultKms: string }) { + super() + this.defaultKms = options.defaultKms + } async createIdentifier( { kms, options }: { kms?: string; options?: CreateDidPkhEthrOptions }, context: IContext, ): Promise> { - const key = await context.agent.keyManagerCreate({ kms: kms || this.defaultKms, type: 'Secp256k1' }) - const publicAddress = toEthereumAddress(key.publicKeyHex); + const publicAddress = toEthereumAddress(key.publicKeyHex) - const network = options?.chainId; + const network = options?.chainId if (!network) { throw new Error( `invalid_setup: Cannot create did:pkh. There is no known configuration for network=${network}'`, @@ -76,7 +66,10 @@ export class PkhDIDProvider extends AbstractIdentifierProvider { debug('Created', identifier.did) return identifier } - async updateIdentifier(args: { did: string; kms?: string | undefined; alias?: string | undefined; options?: any }, context: IAgentContext): Promise { + async updateIdentifier( + args: { did: string; kms?: string | undefined; alias?: string | undefined; options?: any }, + context: IAgentContext, + ): Promise { throw new Error('PkhDIDProvider updateIdentifier not supported yet.') } @@ -131,6 +124,4 @@ export class PkhDIDProvider extends AbstractIdentifierProvider { // } // return network // } - - } diff --git a/packages/did-resolver/package.json b/packages/did-resolver/package.json index 2dbb58bf8..3d5ff6165 100644 --- a/packages/did-resolver/package.json +++ b/packages/did-resolver/package.json @@ -17,7 +17,7 @@ }, "devDependencies": { "@types/debug": "4.1.7", - "ethr-did-resolver": "^7.0.2", + "ethr-did-resolver": "9.0.0", "typescript": "4.9.4", "web-did-resolver": "^2.0.21" }, diff --git a/packages/key-manager/package.json b/packages/key-manager/package.json index 1437304a9..f2fda6816 100644 --- a/packages/key-manager/package.json +++ b/packages/key-manager/package.json @@ -9,9 +9,6 @@ "extract-api": "pnpm exec veramo dev extract-api" }, "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", "@stablelib/ed25519": "^1.0.3", "@veramo/core": "^4.3.0", "debug": "^4.3.4", @@ -20,7 +17,6 @@ "uuid": "^9.0.0" }, "devDependencies": { - "@ethersproject/abstract-signer": "5.7.0", "@types/debug": "4.1.7", "@types/uuid": "9.0.0", "typescript": "4.9.4" diff --git a/packages/key-manager/src/abstract-key-management-system.ts b/packages/key-manager/src/abstract-key-management-system.ts index ba36bc2e7..0054a7b25 100644 --- a/packages/key-manager/src/abstract-key-management-system.ts +++ b/packages/key-manager/src/abstract-key-management-system.ts @@ -1,6 +1,5 @@ import { IKey, ManagedKeyInfo, MinimalImportableKey, TKeyType } from '@veramo/core' -import { arrayify } from '@ethersproject/bytes' -import { serialize } from '@ethersproject/transactions' +import { getBytes, Transaction } from 'ethers' import * as u8a from 'uint8arrays' /** @@ -20,7 +19,8 @@ export abstract class AbstractKeyManagementSystem { /**@deprecated please use `sign({key, alg: 'eth_signTransaction', data: arrayify(serialize(transaction))})` instead */ async signEthTX({ key, transaction }: { key: Pick; transaction: object }): Promise { const { v, r, s, from, ...tx } = transaction - const data = arrayify(serialize(tx)) + const serializedTx = Transaction.from(tx).unsignedSerialized + const data = getBytes(serializedTx) const algorithm = 'eth_signTransaction' const signedTxHexString = this.sign({ keyRef: key, data, algorithm }) return signedTxHexString @@ -31,7 +31,11 @@ export abstract class AbstractKeyManagementSystem { let dataBytes: Uint8Array if (typeof data === 'string') { try { - dataBytes = arrayify(data, { allowMissingPrefix: true }) + // TODO: Make sure this works as we removed the options from arrayify + if (data && data.substring(0, 2) !== "0x") { + data = "0x" + data; + } + dataBytes = getBytes(data) } catch (e) { dataBytes = u8a.fromString(data, 'utf-8') } diff --git a/packages/key-manager/src/key-manager.ts b/packages/key-manager/src/key-manager.ts index 0d9837cd3..c39476740 100644 --- a/packages/key-manager/src/key-manager.ts +++ b/packages/key-manager/src/key-manager.ts @@ -20,11 +20,9 @@ import { } from '@veramo/core' import * as u8a from 'uint8arrays' import { JWE, createAnonDecrypter, createAnonEncrypter, createJWE, decryptJWE, ECDH } from 'did-jwt' -import { arrayify, hexlify } from '@ethersproject/bytes' -import { serialize, computeAddress } from '@ethersproject/transactions' -import { toUtf8String, toUtf8Bytes } from '@ethersproject/strings' import { convertPublicKeyToX25519 } from '@stablelib/ed25519' import Debug from 'debug' +import {getBytes, hexlify, toUtf8Bytes, toUtf8String, computeAddress, Transaction} from "ethers"; const debug = Debug('veramo:key-manager') @@ -130,10 +128,10 @@ export class KeyManager implements IAgentPlugin { let recipientPublicKey: Uint8Array if (to.type === 'Ed25519') { - recipientPublicKey = arrayify('0x' + to.publicKeyHex) + recipientPublicKey = getBytes('0x' + to.publicKeyHex) recipientPublicKey = convertPublicKeyToX25519(recipientPublicKey) } else if (to.type === 'X25519') { - recipientPublicKey = arrayify('0x' + to.publicKeyHex) + recipientPublicKey = getBytes('0x' + to.publicKeyHex) } else { throw new Error('not_supported: The recipient public key type is not supported') } @@ -203,7 +201,7 @@ export class KeyManager implements IAgentPlugin { } } } - const data = serialize(tx) + const data = Transaction.from(tx).unsignedSerialized const algorithm = 'eth_signTransaction' return this.keyManagerSign({ keyRef: kid, data, algorithm, encoding: 'base16' }) } @@ -231,7 +229,7 @@ export class KeyManager implements IAgentPlugin { } const publicKey = { type: 'X25519', publicKeyHex: hexlify(theirPublicKey).substring(2) } const shared = await this.keyManagerSharedSecret({ secretKeyRef, publicKey }) - return arrayify('0x' + shared) + return getBytes('0x' + shared) } } } diff --git a/packages/key-manager/src/types.ts b/packages/key-manager/src/types.ts index 691a0e7f5..fdae0c580 100644 --- a/packages/key-manager/src/types.ts +++ b/packages/key-manager/src/types.ts @@ -1,4 +1,4 @@ -import { TypedDataDomain, TypedDataField } from '@ethersproject/abstract-signer' +import { TypedDataDomain, TypedDataField } from 'ethers' /** * The payload that is sent to be signed according to EIP712 diff --git a/packages/kms-local/package.json b/packages/kms-local/package.json index ce85f5a71..3a9386816 100644 --- a/packages/kms-local/package.json +++ b/packages/kms-local/package.json @@ -9,13 +9,6 @@ "extract-api": "pnpm exec veramo dev extract-api" }, "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wallet": "^5.7.0", "@stablelib/ed25519": "^1.0.3", "@stablelib/nacl": "^1.0.4", "@stablelib/random": "^1.0.2", diff --git a/packages/kms-local/src/key-management-system.ts b/packages/kms-local/src/key-management-system.ts index 03d860fcf..455f52f2f 100644 --- a/packages/kms-local/src/key-management-system.ts +++ b/packages/kms-local/src/key-management-system.ts @@ -1,5 +1,6 @@ import { TKeyType, IKey, ManagedKeyInfo, MinimalImportableKey, RequireOnly } from '@veramo/core' import { AbstractKeyManagementSystem, AbstractPrivateKeyStore, Eip712Payload } from '@veramo/key-manager' +import { hexToBytes, bytesToHex } from '@veramo/utils' import { ManagedPrivateKey } from '@veramo/key-manager' import { EdDSASigner, ES256KSigner, ES256Signer } from 'did-jwt' @@ -14,13 +15,17 @@ import { generateKeyPairFromSeed as generateEncryptionKeyPairFromSeed, sharedKey, } from '@stablelib/x25519' -import { TransactionRequest } from '@ethersproject/abstract-provider' -import { toUtf8String } from '@ethersproject/strings' -import { parse } from '@ethersproject/transactions' -import { Wallet } from '@ethersproject/wallet' -import { SigningKey } from '@ethersproject/signing-key' -import { randomBytes } from '@ethersproject/random' -import { arrayify, hexlify } from '@ethersproject/bytes' +import { + TransactionRequest, + toUtf8String, + Wallet, + SigningKey, + randomBytes, + getBytes, + hexlify, + Transaction, + decodeRlp, +} from 'ethers' import * as u8a from 'uint8arrays' import Debug from 'debug' import elliptic from 'elliptic' @@ -103,10 +108,10 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { } async sign({ - keyRef, - algorithm, - data, - }: { + keyRef, + algorithm, + data, + }: { keyRef: Pick algorithm?: string data: Uint8Array @@ -133,10 +138,11 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { } else if (['eth_signTypedData', 'EthereumEip712Signature2021'].includes(algorithm)) { return await this.eth_signTypedData(managedKey.privateKeyHex, data) } else if (['eth_rawSign'].includes(algorithm)) { - return this.eth_rawSign(managedKey.privateKeyHex, data); + return this.eth_rawSign(managedKey.privateKeyHex, data) } - } else if (managedKey.type === 'Secp256r1' && - (typeof algorithm === 'undefined' || algorithm === 'ES256') + } else if ( + managedKey.type === 'Secp256r1' && + (typeof algorithm === 'undefined' || algorithm === 'ES256') ) { return await this.signES256(managedKey.privateKeyHex, data) } @@ -166,13 +172,13 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { ) { throw new Error(`invalid_argument: args.theirKey must contain 'type' and 'publicKeyHex'`) } - let myKeyBytes = arrayify('0x' + myKey.privateKeyHex) + let myKeyBytes = getBytes('0x' + myKey.privateKeyHex) if (myKey.type === 'Ed25519') { myKeyBytes = convertSecretKeyToX25519(myKeyBytes) } else if (myKey.type !== 'X25519') { throw new Error(`not_supported: can't compute shared secret for type=${myKey.type}`) } - let theirKeyBytes = arrayify('0x' + theirKey.publicKeyHex) + let theirKeyBytes = getBytes('0x' + theirKey.publicKeyHex) if (theirKey.type === 'Ed25519') { theirKeyBytes = convertPublicKeyToX25519(theirKeyBytes) } else if (theirKey.type !== 'X25519') { @@ -206,10 +212,10 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { `invalid_arguments: Cannot sign typed data. 'domain', 'types', and 'message' must be provided`, ) } - delete(msgTypes.EIP712Domain) + delete msgTypes.EIP712Domain const wallet = new Wallet(privateKeyHex) - const signature = await wallet._signTypedData(msgDomain, msgTypes, msg) + const signature = await wallet.signTypedData(msgDomain, msgTypes, msg) // HEX encoded string return signature } @@ -228,18 +234,18 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { * @returns a `0x` prefixed hex string representing the signed raw transaction */ private async eth_signTransaction(privateKeyHex: string, rlpTransaction: Uint8Array) { - const { v, r, s, from, ...tx } = parse(rlpTransaction) + const transaction = Transaction.from(bytesToHex(rlpTransaction, true)) const wallet = new Wallet(privateKeyHex) - if (from) { + if (transaction.from) { debug('WARNING: executing a transaction signing request with a `from` field.') - if (wallet.address.toLowerCase() !== from.toLowerCase()) { + if (wallet.address.toLowerCase() !== transaction.from.toLowerCase()) { const msg = 'invalid_arguments: eth_signTransaction `from` field does not match the chosen key. `from` field should be omitted.' debug(msg) throw new Error(msg) } } - const signedRawTransaction = await wallet.signTransaction(tx) + const signedRawTransaction = await wallet.signTransaction(transaction) // HEX encoded string, 0x prefixed return signedRawTransaction } @@ -248,14 +254,14 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { * @returns a `0x` prefixed hex string representing the signed digest in compact format */ private eth_rawSign(managedKey: string, data: Uint8Array) { - return new SigningKey("0x" + managedKey).signDigest(data).compact + return new SigningKey('0x' + managedKey).sign(data).compactSerialized } /** * @returns a base64url encoded signature for the `EdDSA` alg */ private async signEdDSA(key: string, data: Uint8Array): Promise { - const signer = EdDSASigner(arrayify(key, { allowMissingPrefix: true })) + const signer = EdDSASigner(hexToBytes(key)) const signature = await signer(data) // base64url encoded string return signature as string @@ -269,7 +275,7 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { alg: string | undefined, data: Uint8Array, ): Promise { - const signer = ES256KSigner(arrayify(privateKeyHex, { allowMissingPrefix: true }), alg === 'ES256K-R') + const signer = ES256KSigner(hexToBytes(privateKeyHex), alg === 'ES256K-R') const signature = await signer(data) // base64url encoded string return signature as string @@ -278,11 +284,8 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { /** * @returns a base64url encoded signature for the `ES256` alg */ - private async signES256( - privateKeyHex: string, - data: Uint8Array, - ): Promise { - const signer = ES256Signer(arrayify(privateKeyHex, { allowMissingPrefix: true })) + private async signES256(privateKeyHex: string, data: Uint8Array): Promise { + const signer = ES256Signer(hexToBytes(privateKeyHex)) const signature = await signer(data) // base64url encoded string return signature as string @@ -316,7 +319,14 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { kid: args.alias || publicKeyHex, publicKeyHex, meta: { - algorithms: ['ES256K', 'ES256K-R', 'eth_signTransaction', 'eth_signTypedData', 'eth_signMessage', 'eth_rawSign'], + algorithms: [ + 'ES256K', + 'ES256K-R', + 'eth_signTransaction', + 'eth_signTypedData', + 'eth_signMessage', + 'eth_rawSign', + ], }, } break diff --git a/packages/kms-local/src/secret-box.ts b/packages/kms-local/src/secret-box.ts index 3b69d123c..ce28f7393 100644 --- a/packages/kms-local/src/secret-box.ts +++ b/packages/kms-local/src/secret-box.ts @@ -1,8 +1,7 @@ import { AbstractSecretBox } from '@veramo/key-manager' import { secretBox, openSecretBox, generateKeyPair } from '@stablelib/nacl' import { randomBytes } from '@stablelib/random' -import { arrayify, hexConcat, hexlify } from '@ethersproject/bytes' -import { toUtf8Bytes, toUtf8String } from '@ethersproject/strings' +import { getBytes, concat, hexlify, toUtf8Bytes, toUtf8String } from 'ethers' const NONCE_BYTES = 24 @@ -31,16 +30,16 @@ export class SecretBox extends AbstractSecretBox { async encrypt(message: string): Promise { const nonce = randomBytes(NONCE_BYTES) - const key = arrayify('0x' + this.secretKey) + const key = getBytes('0x' + this.secretKey) const cipherText = secretBox(key, nonce, toUtf8Bytes(message)) - return hexConcat([nonce, cipherText]).substring(2) + return concat([nonce, cipherText]).substring(2) } async decrypt(encryptedMessageHex: string): Promise { - const cipherTextWithNonce = arrayify('0x' + encryptedMessageHex) + const cipherTextWithNonce = getBytes('0x' + encryptedMessageHex) const nonce = cipherTextWithNonce.slice(0, NONCE_BYTES) const cipherText = cipherTextWithNonce.slice(NONCE_BYTES) - const key = arrayify('0x' + this.secretKey) + const key = getBytes('0x' + this.secretKey) const decrypted = openSecretBox(key, nonce, cipherText) || new Uint8Array(0) return toUtf8String(decrypted) } diff --git a/packages/kms-web3/package.json b/packages/kms-web3/package.json index 31fe2ae5b..137114412 100644 --- a/packages/kms-web3/package.json +++ b/packages/kms-web3/package.json @@ -9,12 +9,10 @@ "extract-api": "pnpm exec veramo dev extract-api" }, "dependencies": { - "@ethersproject/providers": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@veramo/core": "^4.3.0", - "@veramo/key-manager": "^4.3.0", - "debug": "^4.3.3" + "@veramo/core": "workspace:^", + "@veramo/key-manager": "workspace:^", + "debug": "^4.3.3", + "ethers": "^6.7.1" }, "devDependencies": { "@types/debug": "4.1.7", diff --git a/packages/kms-web3/src/web3-key-management-system.ts b/packages/kms-web3/src/web3-key-management-system.ts index 865ea2afa..84cdcc55c 100644 --- a/packages/kms-web3/src/web3-key-management-system.ts +++ b/packages/kms-web3/src/web3-key-management-system.ts @@ -1,7 +1,6 @@ -import { JsonRpcSigner, Web3Provider } from '@ethersproject/providers' +import { JsonRpcSigner, BrowserProvider, toUtf8String } from 'ethers' import { TKeyType, IKey, ManagedKeyInfo, MinimalImportableKey } from '@veramo/core' import { AbstractKeyManagementSystem, Eip712Payload } from '@veramo/key-manager' -import { toUtf8String } from '@ethersproject/strings' /** * This is a {@link @veramo/key-manager#AbstractKeyManagementSystem | KMS} implementation that uses the addresses of a @@ -14,7 +13,7 @@ export class Web3KeyManagementSystem extends AbstractKeyManagementSystem { * @param providers - the key can be any unique name. * Example `{ metamask: metamaskProvider, walletConnect: walletConnectProvider }` */ - constructor(private providers: Record) { + constructor(private providers: Record) { super() } @@ -63,12 +62,12 @@ export class Web3KeyManagementSystem extends AbstractKeyManagementSystem { // keyRef should be in this format '{providerName-account} // example: 'metamask-0xf3beac30c498d9e26865f34fcaa57dbb935b0d74' - private getAccountAndSignerByKeyRef(keyRef: Pick): { account: string; signer: JsonRpcSigner } { + private async getAccountAndSignerByKeyRef(keyRef: Pick): Promise<{ account: string; signer: JsonRpcSigner }> { const [providerName, account] = keyRef.kid.split('-') if (!this.providers[providerName]) { throw Error(`not_available: provider ${providerName}`) } - const signer = this.providers[providerName].getSigner(account) + const signer = await this.providers[providerName].getSigner(account) return { account, signer } } @@ -119,8 +118,8 @@ export class Web3KeyManagementSystem extends AbstractKeyManagementSystem { } delete msgTypes.EIP712Domain - const { signer } = this.getAccountAndSignerByKeyRef(keyRef) - const signature = await signer._signTypedData(msgDomain, msgTypes, msg) + const { signer } = await this.getAccountAndSignerByKeyRef(keyRef) + const signature = await signer.signTypedData(msgDomain, msgTypes, msg) return signature } @@ -129,7 +128,7 @@ export class Web3KeyManagementSystem extends AbstractKeyManagementSystem { * @returns a `0x` prefixed hex string representing the signed message */ private async eth_signMessage(keyRef: Pick, rawMessageBytes: Uint8Array) { - const { signer } = this.getAccountAndSignerByKeyRef(keyRef) + const { signer } = await this.getAccountAndSignerByKeyRef(keyRef) const signature = await signer.signMessage(rawMessageBytes) // HEX encoded string, 0x prefixed return signature diff --git a/packages/utils/package.json b/packages/utils/package.json index eea4be6c2..7622013ee 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -9,10 +9,8 @@ "extract-api": "pnpm exec veramo dev extract-api" }, "dependencies": { - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", "@stablelib/ed25519": "^1.0.3", - "@veramo/core": "^4.3.0", + "@veramo/core": "workspace:^", "blakejs": "^1.1.1", "credential-status": "^2.0.5", "debug": "^4.3.3", diff --git a/packages/utils/src/did-utils.ts b/packages/utils/src/did-utils.ts index 755aa7dea..793982d34 100644 --- a/packages/utils/src/did-utils.ts +++ b/packages/utils/src/did-utils.ts @@ -1,6 +1,5 @@ import { convertPublicKeyToX25519, convertSecretKeyToX25519 } from '@stablelib/ed25519' -import { computePublicKey } from '@ethersproject/signing-key' -import { computeAddress } from '@ethersproject/transactions' +import { SigningKey, computeAddress } from 'ethers' import { DIDDocumentSection, IAgentContext, IIdentifier, IKey, IResolver } from '@veramo/core' import { DIDDocument, VerificationMethod } from 'did-resolver' import { @@ -61,7 +60,7 @@ export function compressIdentifierSecp256k1Keys(identifier: IIdentifier): IKey[] if (key.type === 'Secp256k1') { if (key.publicKeyHex) { const publicBytes = u8a.fromString(key.publicKeyHex, 'base16') - key.publicKeyHex = computePublicKey(publicBytes, true).substring(2) + key.publicKeyHex = SigningKey.computePublicKey(publicBytes, true).substring(2) key.meta = { ...key.meta } key.meta.ethereumAddress = computeAddress('0x' + key.publicKeyHex) } @@ -123,7 +122,7 @@ export function getEthereumAddress(verificationMethod: VerificationMethod): stri verificationMethod.publicKeyJwk ) { const pbBytes = extractPublicKeyBytes(verificationMethod) - const pbHex = computePublicKey(pbBytes, false) + const pbHex = SigningKey.computePublicKey(pbBytes, false) vmEthAddr = computeAddress(pbHex).toLowerCase() }