From bbfeb6bd01285b2262b68e6d3760596fbbeb5d35 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 14 Feb 2025 17:57:32 +0000 Subject: [PATCH 01/11] Upgrade keyring-eth-hd --- packages/keyring-eth-hd/package.json | 4 ++-- packages/keyring-eth-hd/src/index.ts | 28 ++++++++++------------ packages/keyring-eth-hd/test/index.test.ts | 21 +++++++--------- yarn.lock | 6 ++--- 4 files changed, 27 insertions(+), 32 deletions(-) diff --git a/packages/keyring-eth-hd/package.json b/packages/keyring-eth-hd/package.json index 6de58ea9..2ab0522d 100644 --- a/packages/keyring-eth-hd/package.json +++ b/packages/keyring-eth-hd/package.json @@ -43,7 +43,7 @@ "test:clean": "jest --clearCache" }, "dependencies": { - "@ethereumjs/util": "^8.1.0", + "@ethereumjs/util": "^9.1.0", "@metamask/eth-sig-util": "^8.2.0", "@metamask/key-tree": "^10.0.2", "@metamask/scure-bip39": "^2.1.1", @@ -51,7 +51,7 @@ "ethereum-cryptography": "^2.1.2" }, "devDependencies": { - "@ethereumjs/tx": "^4.2.0", + "@ethereumjs/tx": "^5.4.0", "@lavamoat/allow-scripts": "^3.2.1", "@lavamoat/preinstall-always-fail": "^2.1.0", "@metamask/auto-changelog": "^3.4.4", diff --git a/packages/keyring-eth-hd/src/index.ts b/packages/keyring-eth-hd/src/index.ts index f340593d..c3137b95 100644 --- a/packages/keyring-eth-hd/src/index.ts +++ b/packages/keyring-eth-hd/src/index.ts @@ -1,11 +1,5 @@ import type { TypedTransaction } from '@ethereumjs/tx'; -import { - privateToPublic, - publicToAddress, - ecsign, - arrToBufArr, - bufferToHex, -} from '@ethereumjs/util'; +import { privateToPublic, publicToAddress, ecsign } from '@ethereumjs/util'; import { concatSig, decrypt, @@ -31,6 +25,8 @@ import { add0x, assert, assertIsHexString, + bigIntToBytes, + bigIntToHex, type Hex, remove0x, } from '@metamask/utils'; @@ -227,7 +223,7 @@ class HdKeyring { }); assert(wallet.publicKey, 'Expected public key to be set'); const appKeyAddress = this.#normalizeAddress( - publicToAddress(wallet.publicKey).toString('hex'), + bytesToHex(publicToAddress(wallet.publicKey)), ); return appKeyAddress; } @@ -293,10 +289,9 @@ class HdKeyring { const privKey = this.#getPrivateKeyFor(address, opts); const msgSig = ecsign(Buffer.from(message, 'hex'), Buffer.from(privKey)); const rawMsgSig = concatSig( - // WARN: verify this cast to Buffer - msgSig.v as unknown as Buffer, - msgSig.r, - msgSig.s, + Buffer.from(bigIntToBytes(msgSig.v)), + Buffer.from(msgSig.r), + Buffer.from(msgSig.s), ); return rawMsgSig; } @@ -567,9 +562,12 @@ class HdKeyring { assert(privateKey, 'Expected private key to be set'); const appKeyOriginBuffer = Buffer.from(withAppKeyOrigin, 'utf8'); const appKeyBuffer = Buffer.concat([privateKey, appKeyOriginBuffer]); - const appKeyPrivateKey = arrToBufArr(keccak256(appKeyBuffer)); + const appKeyPrivateKey = keccak256(appKeyBuffer); const appKeyPublicKey = privateToPublic(appKeyPrivateKey); - return { privateKey: appKeyPrivateKey, publicKey: appKeyPublicKey }; + return { + privateKey: Buffer.from(appKeyPrivateKey), + publicKey: Buffer.from(appKeyPublicKey), + }; } return wallet; @@ -611,7 +609,7 @@ class HdKeyring { */ #addressfromPublicKey(publicKey: Uint8Array): Hex { return add0x( - bufferToHex(publicToAddress(Buffer.from(publicKey), true)).toLowerCase(), + bytesToHex(publicToAddress(Buffer.from(publicKey), true)).toLowerCase(), ); } diff --git a/packages/keyring-eth-hd/test/index.test.ts b/packages/keyring-eth-hd/test/index.test.ts index fa1726c2..e23bef70 100644 --- a/packages/keyring-eth-hd/test/index.test.ts +++ b/packages/keyring-eth-hd/test/index.test.ts @@ -1,8 +1,6 @@ -import { TransactionFactory, Transaction as EthereumTx } from '@ethereumjs/tx'; +import { TransactionFactory, Transaction as EthereumTx, LegacyTransaction, TypedTxData } from '@ethereumjs/tx'; import { isValidAddress, - bufferToHex, - toBuffer, ecrecover, pubToAddress, } from '@ethereumjs/util'; @@ -22,7 +20,7 @@ import { type EIP7702Authorization, } from '@metamask/eth-sig-util'; import { wordlist } from '@metamask/scure-bip39/dist/wordlists/english'; -import { assert, type Hex } from '@metamask/utils'; +import { assert, bytesToHex, hexToBytes, type Hex } from '@metamask/utils'; import { webcrypto } from 'crypto'; import { keccak256 } from 'ethereum-cryptography/keccak'; // eslint-disable-next-line @typescript-eslint/naming-convention @@ -636,7 +634,7 @@ describe('hd-keyring', () => { numberOfAccounts: 1, }); const localMessage = 'hello there!'; - const msgHashHex = bufferToHex( + const msgHashHex = bytesToHex( Buffer.from(keccak256(Buffer.from(localMessage))), ); await keyring.addAccounts(9); @@ -649,12 +647,12 @@ describe('hd-keyring', () => { signatures.forEach((sgn, index) => { const accountAddress = addresses[index]; - const signatureR = toBuffer(sgn.slice(0, 66)); - const signatureS = toBuffer(`0x${sgn.slice(66, 130)}`); + const signatureR = hexToBytes(sgn.slice(0, 66)); + const signatureS = hexToBytes(`0x${sgn.slice(66, 130)}`); const signatureV = BigInt(`0x${sgn.slice(130, 132)}`); - const messageHash = toBuffer(msgHashHex); + const messageHash = hexToBytes(msgHashHex); const pub = ecrecover(messageHash, signatureV, signatureR, signatureS); - const adr = `0x${pubToAddress(pub).toString('hex')}`; + const adr = bytesToHex(pubToAddress(pub)); expect(adr).toBe(accountAddress); }); @@ -1049,8 +1047,7 @@ describe('hd-keyring', () => { }); }); - const txParams = { - from: firstAcct, + const txParams: TypedTxData = { nonce: '0x00', gasPrice: '0x09184e72a000', gasLimit: '0x2710', @@ -1059,7 +1056,7 @@ describe('hd-keyring', () => { }; it('returns a signed legacy tx object', async function () { - const tx = new EthereumTx(txParams); + const tx = LegacyTransaction.fromTxData(txParams); expect(tx.isSigned()).toBe(false); const signed = await keyring.signTransaction(firstAcct, tx); diff --git a/yarn.lock b/yarn.lock index 81f1f20e..81c8f2ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -643,7 +643,7 @@ __metadata: languageName: node linkType: hard -"@ethereumjs/tx@npm:^5.2.1": +"@ethereumjs/tx@npm:^5.2.1, @ethereumjs/tx@npm:^5.4.0": version: 5.4.0 resolution: "@ethereumjs/tx@npm:5.4.0" dependencies: @@ -1661,8 +1661,8 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/eth-hd-keyring@workspace:packages/keyring-eth-hd" dependencies: - "@ethereumjs/tx": "npm:^4.2.0" - "@ethereumjs/util": "npm:^8.1.0" + "@ethereumjs/tx": "npm:^5.4.0" + "@ethereumjs/util": "npm:^9.1.0" "@lavamoat/allow-scripts": "npm:^3.2.1" "@lavamoat/preinstall-always-fail": "npm:^2.1.0" "@metamask/auto-changelog": "npm:^3.4.4" From 629078d73c1dfe720d5c76b58f1ac4b93d840335 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 14 Feb 2025 18:04:44 +0000 Subject: [PATCH 02/11] Upgrade keyring-eth-ledger-bridge --- .../keyring-eth-ledger-bridge/jest.config.js | 4 +-- .../keyring-eth-ledger-bridge/package.json | 6 ++--- .../src/ledger-keyring.test.ts | 11 ++++---- .../src/ledger-keyring.ts | 26 ++++++++++++------- yarn.lock | 6 ++--- 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/packages/keyring-eth-ledger-bridge/jest.config.js b/packages/keyring-eth-ledger-bridge/jest.config.js index b4262844..7b811051 100644 --- a/packages/keyring-eth-ledger-bridge/jest.config.js +++ b/packages/keyring-eth-ledger-bridge/jest.config.js @@ -25,8 +25,8 @@ module.exports = merge(baseConfig, { global: { branches: 90.9, functions: 96, - lines: 95.03, - statements: 95.09, + lines: 95.05, + statements: 95.1, }, }, }); diff --git a/packages/keyring-eth-ledger-bridge/package.json b/packages/keyring-eth-ledger-bridge/package.json index 7e99768f..7f2787e6 100644 --- a/packages/keyring-eth-ledger-bridge/package.json +++ b/packages/keyring-eth-ledger-bridge/package.json @@ -47,14 +47,14 @@ }, "dependencies": { "@ethereumjs/rlp": "^5.0.2", - "@ethereumjs/tx": "^4.2.0", - "@ethereumjs/util": "^8.1.0", + "@ethereumjs/tx": "^5.4.0", + "@ethereumjs/util": "^9.1.0", "@ledgerhq/hw-app-eth": "^6.42.0", "@metamask/eth-sig-util": "^8.2.0", "hdkey": "^2.1.0" }, "devDependencies": { - "@ethereumjs/common": "^3.2.0", + "@ethereumjs/common": "^4.4.0", "@lavamoat/allow-scripts": "^3.2.1", "@lavamoat/preinstall-always-fail": "^2.1.0", "@ledgerhq/hw-transport": "^6.31.3", diff --git a/packages/keyring-eth-ledger-bridge/src/ledger-keyring.test.ts b/packages/keyring-eth-ledger-bridge/src/ledger-keyring.test.ts index 3b060d47..959ef392 100644 --- a/packages/keyring-eth-ledger-bridge/src/ledger-keyring.test.ts +++ b/packages/keyring-eth-ledger-bridge/src/ledger-keyring.test.ts @@ -9,6 +9,7 @@ import HDKey from 'hdkey'; import { LedgerBridge, LedgerBridgeOptions } from './ledger-bridge'; import { LedgerIframeBridge } from './ledger-iframe-bridge'; import { AccountDetails, LedgerKeyring } from './ledger-keyring'; +import { bytesToHex } from '@metamask/utils'; jest.mock('@metamask/eth-sig-util', () => { return { @@ -48,7 +49,7 @@ const fakeTx = new EthereumTx({ value: '0x00', data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057', // EIP 155 chainId - mainnet: 1, ropsten: 3 - chainId: 1, + chainId: '0x1', }); const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin }); @@ -653,7 +654,7 @@ describe('LedgerKeyring', function () { v: '0x26', r: '0xf3a7718999d1b87beda810b25cc025153e74df0745279826b9b2f3d1d1b6318', s: '0x7e33bdfbf5272dc4f55649e9ba729849670171a68ef8c0fbeed3b879b90b8954', - }; + } as const; await basicSetupToUnlockOneAccount(); @@ -679,7 +680,7 @@ describe('LedgerKeyring', function () { expect(params).toStrictEqual({ hdPath: "m/44'/60'/0'/0", tx: Buffer.from( - RLP.encode(newFakeTx.getMessageToSign(false)), + RLP.encode(newFakeTx.getMessageToSign()), ).toString('hex'), }); return expectedRSV; @@ -701,7 +702,7 @@ describe('LedgerKeyring', function () { v: '0x0', r: '0x5ffb3adeaec80e430e7a7b02d95c5108b6f09a0bdf3cf69869dc1b38d0fb8d3a', s: '0x28b234a5403d31564e18258df84c51a62683e3f54fa2b106fdc1a9058006a112', - }; + } as const; await basicSetupToUnlockOneAccount(); @@ -726,7 +727,7 @@ describe('LedgerKeyring', function () { .mockImplementation(async (params) => { expect(params).toStrictEqual({ hdPath: "m/44'/60'/0'/0", - tx: fakeTypeTwoTx.getMessageToSign(false).toString('hex'), + tx: bytesToHex(fakeTypeTwoTx.getMessageToSign() as Uint8Array), }); return expectedRSV; }); diff --git a/packages/keyring-eth-ledger-bridge/src/ledger-keyring.ts b/packages/keyring-eth-ledger-bridge/src/ledger-keyring.ts index f277270c..da440f5a 100644 --- a/packages/keyring-eth-ledger-bridge/src/ledger-keyring.ts +++ b/packages/keyring-eth-ledger-bridge/src/ledger-keyring.ts @@ -1,5 +1,10 @@ import { RLP } from '@ethereumjs/rlp'; -import { TransactionFactory, TxData, TypedTransaction } from '@ethereumjs/tx'; +import { + TransactionFactory, + TxData, + TypedTransaction, + TypedTxData, +} from '@ethereumjs/tx'; import * as ethUtil from '@ethereumjs/util'; import type { MessageTypes, TypedMessage } from '@metamask/eth-sig-util'; import { @@ -15,6 +20,7 @@ import HDKey from 'hdkey'; import { LedgerBridge, LedgerBridgeOptions } from './ledger-bridge'; import { LedgerIframeBridgeOptions } from './ledger-iframe-bridge'; +import { bytesToHex, remove0x } from '@metamask/utils'; const pathBase = 'm'; const hdPathString = `${pathBase}/44'/60'/0'`; @@ -330,7 +336,7 @@ export class LedgerKeyring extends EventEmitter { // value. In newer versions the chainId is communicated via the 'Common' // object. // @ts-expect-error tx.v should be a Buffer, but we are assigning a string - tx.v = ethUtil.bufferToHex(tx.getChainId()); + tx.v = ethUtil.bytesToHex(tx.getChainId()); // @ts-expect-error tx.r should be a Buffer, but we are assigning a string tx.r = '0x00'; // @ts-expect-error tx.s should be a Buffer, but we are assigning a string @@ -354,17 +360,17 @@ export class LedgerKeyring extends EventEmitter { // Note also that `getMessageToSign` will return valid RLP for all transaction types, whereas the // `serialize` method will not for any transaction type except legacy. This is because `serialize` includes // empty r, s and v values in the encoded rlp. This is why we use `getMessageToSign` here instead of `serialize`. - const messageToSign = tx.getMessageToSign(false); + const messageToSign = tx.getMessageToSign(); - rawTxHex = Buffer.isBuffer(messageToSign) - ? messageToSign.toString('hex') - : Buffer.from(RLP.encode(messageToSign)).toString('hex'); + rawTxHex = Array.isArray(messageToSign) + ? Buffer.from(RLP.encode(messageToSign)).toString('hex') + : bytesToHex(messageToSign); return this.#signTransaction(address, rawTxHex, (payload) => { // Because tx will be immutable, first get a plain javascript object that // represents the transaction. Using txData here as it aligns with the // nomenclature of ethereumjs/tx. - const txData: TxData = tx.toJSON(); + const txData: TypedTxData = tx.toJSON(); // The fromTxData utility expects a type to support transactions with a type other than 0 txData.type = tx.type; // The fromTxData utility expects v,r and s to be hex prefixed @@ -632,9 +638,9 @@ export class LedgerKeyring extends EventEmitter { #addressFromIndex(basePath: string, i: number): string { const dkey = this.hdk.derive(`${basePath}/${i}`); - const address = ethUtil - .publicToAddress(dkey.publicKey, true) - .toString('hex'); + const address = remove0x( + bytesToHex(ethUtil.publicToAddress(dkey.publicKey, true)), + ); return ethUtil.toChecksumAddress(`0x${address}`); } diff --git a/yarn.lock b/yarn.lock index 81c8f2ac..f32bf79e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1684,10 +1684,10 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/eth-ledger-bridge-keyring@workspace:packages/keyring-eth-ledger-bridge" dependencies: - "@ethereumjs/common": "npm:^3.2.0" + "@ethereumjs/common": "npm:^4.4.0" "@ethereumjs/rlp": "npm:^5.0.2" - "@ethereumjs/tx": "npm:^4.2.0" - "@ethereumjs/util": "npm:^8.1.0" + "@ethereumjs/tx": "npm:^5.4.0" + "@ethereumjs/util": "npm:^9.1.0" "@lavamoat/allow-scripts": "npm:^3.2.1" "@lavamoat/preinstall-always-fail": "npm:^2.1.0" "@ledgerhq/hw-app-eth": "npm:^6.42.0" From faaa42217e75de8d9f24d7d110dbc98dc602a1c4 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 14 Feb 2025 20:29:19 +0000 Subject: [PATCH 03/11] Upgrade keyring-eth-simple --- packages/keyring-eth-simple/package.json | 4 +- .../src/simple-keyring.test.ts | 47 +++++++------------ .../keyring-eth-simple/src/simple-keyring.ts | 42 +++++++++++------ yarn.lock | 4 +- 4 files changed, 49 insertions(+), 48 deletions(-) diff --git a/packages/keyring-eth-simple/package.json b/packages/keyring-eth-simple/package.json index 4a9329e4..b7ffe7f9 100644 --- a/packages/keyring-eth-simple/package.json +++ b/packages/keyring-eth-simple/package.json @@ -44,14 +44,14 @@ "test:watch": "jest --watch" }, "dependencies": { - "@ethereumjs/util": "^8.1.0", + "@ethereumjs/util": "^9.1.0", "@metamask/eth-sig-util": "^8.2.0", "@metamask/utils": "^11.1.0", "ethereum-cryptography": "^2.1.2", "randombytes": "^2.1.0" }, "devDependencies": { - "@ethereumjs/tx": "^4.2.0", + "@ethereumjs/tx": "^5.4.0", "@lavamoat/allow-scripts": "^3.2.1", "@lavamoat/preinstall-always-fail": "^2.1.0", "@metamask/auto-changelog": "^3.4.4", diff --git a/packages/keyring-eth-simple/src/simple-keyring.test.ts b/packages/keyring-eth-simple/src/simple-keyring.test.ts index 2114486f..46ac61e4 100644 --- a/packages/keyring-eth-simple/src/simple-keyring.test.ts +++ b/packages/keyring-eth-simple/src/simple-keyring.test.ts @@ -1,12 +1,14 @@ -import { Transaction as EthereumTx, TransactionFactory } from '@ethereumjs/tx'; import { - bufferToHex, + LegacyTransaction, + TransactionFactory, + TypedTxData, +} from '@ethereumjs/tx'; +import { ecrecover, isValidAddress, privateToAddress, pubToAddress, stripHexPrefix, - toBuffer, } from '@ethereumjs/util'; import { EIP7702Authorization, @@ -21,7 +23,7 @@ import { SignTypedDataVersion, TypedMessage, } from '@metamask/eth-sig-util'; -import { add0x, Hex } from '@metamask/utils'; +import { add0x, bytesToHex, Hex, hexToBytes } from '@metamask/utils'; import assert from 'assert'; import { keccak256 } from 'ethereum-cryptography/keccak'; // eslint-disable-next-line @typescript-eslint/naming-convention @@ -101,8 +103,7 @@ describe('simple-keyring', function () { const address = '0x9858e7d8b79fc3e6d989636721584498926da38a'; const privateKey = '0x7dd98753d7b4394095de7d176c58128e2ed6ee600abe97c9f6d9fd65015d9b18'; - const txParams = { - from: address, + const txParams: TypedTxData = { nonce: '0x00', gasPrice: '0x09184e72a000', gasLimit: '0x2710', @@ -112,7 +113,7 @@ describe('simple-keyring', function () { it('returns a signed legacy tx object (using @ethereumjs/tx)', async function () { await keyring.deserialize([privateKey]); - const tx = new EthereumTx(txParams); + const tx = LegacyTransaction.fromTxData(txParams); expect(tx.isSigned()).toBe(false); const signed = await keyring.signTransaction(address, tx); @@ -177,9 +178,7 @@ describe('simple-keyring', function () { it('reliably can decode messages it signs', async function () { await keyring.deserialize([privateKey]); const localMessage = 'hello there!'; - const msgHashHex = bufferToHex( - Buffer.from(keccak256(Buffer.from(localMessage))), - ); + const msgHashHex = bytesToHex(keccak256(Buffer.from(localMessage))); await keyring.addAccounts(9); const addresses = await keyring.getAccounts(); @@ -192,14 +191,14 @@ describe('simple-keyring', function () { const accountAddress = addresses[index]; /* eslint-disable id-length */ - const r = toBuffer(sgn.slice(0, 66)); - const s = toBuffer(`0x${sgn.slice(66, 130)}`); + const r = hexToBytes(sgn.slice(0, 66)); + const s = hexToBytes(`0x${sgn.slice(66, 130)}`); const v = BigInt(`0x${sgn.slice(130, 132)}`); - const m = toBuffer(msgHashHex); + const m = hexToBytes(msgHashHex); /* eslint-enable id-length */ const pub = ecrecover(m, v, r, s); - const adr = `0x${pubToAddress(pub).toString('hex')}`; + const adr = bytesToHex(pubToAddress(pub)); expect(adr).toBe(accountAddress); }); @@ -296,7 +295,7 @@ describe('simple-keyring', function () { '6969696969696969696969696969696969696969696969696969696969696969', 'hex', ); - const privKeyHex = bufferToHex(privateKey); + const privKeyHex = bytesToHex(privateKey); const message = '0x68656c6c6f20776f726c64'; const expectedSignature = '0xce909e8ea6851bc36c007a0072d0524b07a3ff8d4e623aca4c71ca8e57250c4d0a3fc38fa8fbaaa81ead4b9f6bd03356b6f8bf18bccad167d78891636e1d69561b'; @@ -550,9 +549,7 @@ describe('simple-keyring', function () { const address = '0x29c76e6ad8f28bb1004902578fb108c507be341b'; const privKeyHex = '0x4af1bceebf7f3634ec3cff8a2c38e51178d5d4ce585c52d6043e5e2cc3418bb0'; - const signerAddress = `0x${privateToAddress( - Buffer.from(privKeyHex.slice(2), 'hex'), - ).toString('hex')}`; + const signerAddress = bytesToHex(privateToAddress(hexToBytes(privKeyHex))); const chainId = 1; const nonce = 1; @@ -593,14 +590,10 @@ describe('simple-keyring', function () { describe('#decryptMessage', function () { const address = '0xbe93f9bacbcffc8ee6663f2647917ed7a20a57bb'; - const privateKey = Buffer.from( - '6969696969696969696969696969696969696969696969696969696969696969', - 'hex', - ); - const privKeyHex = bufferToHex(privateKey); + const privKeyHex = '6969696969696969696969696969696969696969696969696969696969696969'; const message = 'Hello world!'; const encryptedMessage = encrypt({ - publicKey: getEncryptionPublicKey(privateKey.toString('hex')), + publicKey: getEncryptionPublicKey(privKeyHex), data: message, version: 'x25519-xsalsa20-poly1305', }); @@ -633,12 +626,8 @@ describe('simple-keyring', function () { describe('#encryptionPublicKey', function () { const address = '0xbe93f9bacbcffc8ee6663f2647917ed7a20a57bb'; - const privateKey = Buffer.from( - '6969696969696969696969696969696969696969696969696969696969696969', - 'hex', - ); + const privKeyHex = '0x6969696969696969696969696969696969696969696969696969696969696969'; const publicKey = 'GxuMqoE2oHsZzcQtv/WMNB3gCH2P6uzynuwO1P0MM1U='; - const privKeyHex = bufferToHex(privateKey); it('returns the expected value', async function () { await keyring.deserialize([privKeyHex]); diff --git a/packages/keyring-eth-simple/src/simple-keyring.ts b/packages/keyring-eth-simple/src/simple-keyring.ts index 7aea5dba..1a67bf95 100644 --- a/packages/keyring-eth-simple/src/simple-keyring.ts +++ b/packages/keyring-eth-simple/src/simple-keyring.ts @@ -1,13 +1,10 @@ import { TypedTransaction } from '@ethereumjs/tx'; import { - arrToBufArr, - bufferToHex, ecsign, isValidPrivate, privateToPublic, publicToAddress, stripHexPrefix, - toBuffer, } from '@ethereumjs/util'; import { concatSig, @@ -20,7 +17,14 @@ import { signTypedData, SignTypedDataVersion, } from '@metamask/eth-sig-util'; -import { add0x, Eip1024EncryptedData, Hex, Keyring } from '@metamask/utils'; +import { + add0x, + bigIntToBytes, + bytesToHex, + Eip1024EncryptedData, + Hex, + Keyring, +} from '@metamask/utils'; import { keccak256 } from 'ethereum-cryptography/keccak'; import randombytes from 'randombytes'; @@ -62,7 +66,7 @@ export default class SimpleKeyring implements Keyring { this.#wallets = privateKeys.map((hexPrivateKey) => { const strippedHexPrivateKey = stripHexPrefix(hexPrivateKey); const privateKey = Buffer.from(strippedHexPrivateKey, 'hex'); - const publicKey = privateToPublic(privateKey); + const publicKey = Buffer.from(privateToPublic(privateKey)); return { privateKey, publicKey }; }); } @@ -71,22 +75,23 @@ export default class SimpleKeyring implements Keyring { const newWallets = []; for (let i = 0; i < numAccounts; i++) { const privateKey = generateKey(); - const publicKey = privateToPublic(privateKey); + const publicKey = Buffer.from(privateToPublic(privateKey)); newWallets.push({ privateKey, publicKey }); } this.#wallets = this.#wallets.concat(newWallets); const hexWallets = newWallets.map(({ publicKey }) => - add0x(bufferToHex(publicToAddress(publicKey))), + add0x(bytesToHex(publicToAddress(publicKey))), ); return hexWallets; } async getAccounts(): Promise { return this.#wallets.map(({ publicKey }) => - add0x(bufferToHex(publicToAddress(publicKey))), + add0x(bytesToHex(publicToAddress(publicKey))), ); } + // @ts-expect-error Update utils package async signTransaction( address: Hex, transaction: TypedTransaction, @@ -122,7 +127,11 @@ export default class SimpleKeyring implements Keyring { } const privKey = this.#getPrivateKeyFor(address, opts); const msgSig = ecsign(Buffer.from(message, 'hex'), privKey); - const rawMsgSig = concatSig(toBuffer(msgSig.v), msgSig.r, msgSig.s); + const rawMsgSig = concatSig( + Buffer.from(bigIntToBytes(msgSig.v)), + Buffer.from(msgSig.r), + Buffer.from(msgSig.s), + ); return rawMsgSig; } @@ -192,7 +201,7 @@ export default class SimpleKeyring implements Keyring { const wallet = this.#getWalletForAccount(address, { withAppKeyOrigin: origin, }); - const appKeyAddress = add0x(bufferToHex(publicToAddress(wallet.publicKey))); + const appKeyAddress = add0x(bytesToHex(publicToAddress(wallet.publicKey))); return appKeyAddress; } @@ -209,7 +218,7 @@ export default class SimpleKeyring implements Keyring { if ( !this.#wallets .map(({ publicKey }) => - bufferToHex(publicToAddress(publicKey)).toLowerCase(), + bytesToHex(publicToAddress(publicKey)).toLowerCase(), ) .includes(address.toLowerCase()) ) { @@ -218,7 +227,7 @@ export default class SimpleKeyring implements Keyring { this.#wallets = this.#wallets.filter( ({ publicKey }) => - bufferToHex(publicToAddress(publicKey)).toLowerCase() !== + bytesToHex(publicToAddress(publicKey)).toLowerCase() !== address.toLowerCase(), ); } @@ -229,7 +238,7 @@ export default class SimpleKeyring implements Keyring { ): Wallet { const address = normalize(account); let wallet = this.#wallets.find( - ({ publicKey }) => bufferToHex(publicToAddress(publicKey)) === address, + ({ publicKey }) => bytesToHex(publicToAddress(publicKey)) === address, ); if (!wallet) { throw new Error('Simple Keyring - Unable to find matching address.'); @@ -239,9 +248,12 @@ export default class SimpleKeyring implements Keyring { const { privateKey } = wallet; const appKeyOriginBuffer = Buffer.from(opts.withAppKeyOrigin, 'utf8'); const appKeyBuffer = Buffer.concat([privateKey, appKeyOriginBuffer]); - const appKeyPrivateKey = arrToBufArr(keccak256(appKeyBuffer)); + const appKeyPrivateKey = keccak256(appKeyBuffer); const appKeyPublicKey = privateToPublic(appKeyPrivateKey); - wallet = { privateKey: appKeyPrivateKey, publicKey: appKeyPublicKey }; + wallet = { + privateKey: Buffer.from(appKeyPrivateKey), + publicKey: Buffer.from(appKeyPublicKey), + }; } return wallet; diff --git a/yarn.lock b/yarn.lock index f32bf79e..be0d71a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1759,8 +1759,8 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/eth-simple-keyring@workspace:packages/keyring-eth-simple" dependencies: - "@ethereumjs/tx": "npm:^4.2.0" - "@ethereumjs/util": "npm:^8.1.0" + "@ethereumjs/tx": "npm:^5.4.0" + "@ethereumjs/util": "npm:^9.1.0" "@lavamoat/allow-scripts": "npm:^3.2.1" "@lavamoat/preinstall-always-fail": "npm:^2.1.0" "@metamask/auto-changelog": "npm:^3.4.4" From a13acb2798ad49c40445ded007ca890ccd077832 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 14 Feb 2025 20:47:25 +0000 Subject: [PATCH 04/11] Upgrade keyring-eth-trezor --- packages/keyring-eth-trezor/jest.config.js | 2 +- packages/keyring-eth-trezor/package.json | 6 +++--- .../src/trezor-keyring.test.ts | 3 ++- .../keyring-eth-trezor/src/trezor-keyring.ts | 16 ++++++++-------- yarn.lock | 6 +++--- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/packages/keyring-eth-trezor/jest.config.js b/packages/keyring-eth-trezor/jest.config.js index b35e07cc..511516fc 100644 --- a/packages/keyring-eth-trezor/jest.config.js +++ b/packages/keyring-eth-trezor/jest.config.js @@ -23,7 +23,7 @@ module.exports = merge(baseConfig, { // An object that configures minimum threshold enforcement for coverage results coverageThreshold: { global: { - branches: 48.27, + branches: 51.61, functions: 91.37, lines: 90.2, statements: 90.4, diff --git a/packages/keyring-eth-trezor/package.json b/packages/keyring-eth-trezor/package.json index feafde5a..84e95caf 100644 --- a/packages/keyring-eth-trezor/package.json +++ b/packages/keyring-eth-trezor/package.json @@ -46,8 +46,8 @@ "test:watch": "jest --watch" }, "dependencies": { - "@ethereumjs/tx": "^4.2.0", - "@ethereumjs/util": "^8.1.0", + "@ethereumjs/tx": "^5.4.0", + "@ethereumjs/util": "^9.1.0", "@metamask/eth-sig-util": "^8.2.0", "@trezor/connect-plugin-ethereum": "^9.0.3", "@trezor/connect-web": "^9.1.11", @@ -55,7 +55,7 @@ "tslib": "^2.6.2" }, "devDependencies": { - "@ethereumjs/common": "^3.2.0", + "@ethereumjs/common": "^4.4.0", "@lavamoat/allow-scripts": "^3.2.1", "@lavamoat/preinstall-always-fail": "^2.1.0", "@metamask/auto-changelog": "^3.4.4", diff --git a/packages/keyring-eth-trezor/src/trezor-keyring.test.ts b/packages/keyring-eth-trezor/src/trezor-keyring.test.ts index 7a2601d6..cff4aa26 100644 --- a/packages/keyring-eth-trezor/src/trezor-keyring.test.ts +++ b/packages/keyring-eth-trezor/src/trezor-keyring.test.ts @@ -412,7 +412,7 @@ describe('TrezorKeyring', function () { sinon.stub(fakeTx, 'verifySignature').callsFake(() => true); sinon .stub(fakeTx, 'getSenderAddress') - .callsFake(() => Address.fromString(fakeAccounts[0]).toBuffer()); + .callsFake(() => Buffer.from(Address.fromString(fakeAccounts[0]).bytes)); const returnedTx = await keyring.signTransaction(fakeAccounts[0], fakeTx); // assert that the v,r,s values got assigned to tx. @@ -533,6 +533,7 @@ describe('TrezorKeyring', function () { sinon.assert.calledWithExactly(ethereumSignTransactionStub, { path: "m/44'/60'/0'/0/0", transaction: { + type: '0x2', chainId: 1, nonce: '0x0', maxPriorityFeePerGas: '0x9184e72a000', diff --git a/packages/keyring-eth-trezor/src/trezor-keyring.ts b/packages/keyring-eth-trezor/src/trezor-keyring.ts index 13030d32..4b2007bd 100644 --- a/packages/keyring-eth-trezor/src/trezor-keyring.ts +++ b/packages/keyring-eth-trezor/src/trezor-keyring.ts @@ -1,5 +1,5 @@ import { TransactionFactory } from '@ethereumjs/tx'; -import type { TypedTransaction, TxData } from '@ethereumjs/tx'; +import type { TypedTransaction, TxData, TypedTxData } from '@ethereumjs/tx'; import * as ethUtil from '@ethereumjs/util'; import { TypedMessage, @@ -318,7 +318,7 @@ export class TrezorKeyring extends EventEmitter { // Because tx will be immutable, first get a plain javascript object that // represents the transaction. Using txData here as it aligns with the // nomenclature of ethereumjs/tx. - const txData: TxData = tx.toJSON(); + const txData: TypedTxData = tx.toJSON(); // The fromTxData utility expects a type to support transactions with a type other than 0 txData.type = tx.type; // The fromTxData utility expects v,r and s to be hex prefixed @@ -370,7 +370,7 @@ export class TrezorKeyring extends EventEmitter { transaction = { ...tx.toJSON(), chainId, - to: this.#normalize(ethUtil.toBuffer(tx.to)), + to: this.#normalize(Buffer.from(tx.to?.bytes ?? [])), } as EthereumTransaction | EthereumTransactionEIP1559; } @@ -549,15 +549,15 @@ export class TrezorKeyring extends EventEmitter { } #normalize(buf: Buffer): string { - return ethUtil.bufferToHex(buf).toString(); + return `0x${buf.toString('hex')}`; } #addressFromIndex(basePath: string, i: number): string { const dkey = this.hdk.derive(`${basePath}/${i}`); - const address = ethUtil - .publicToAddress(dkey.publicKey, true) - .toString('hex'); - return ethUtil.toChecksumAddress(`0x${address}`); + const address = ethUtil.bytesToHex( + ethUtil.publicToAddress(dkey.publicKey, true), + ); + return ethUtil.toChecksumAddress(address); } #pathFromAddress(address: string): string { diff --git a/yarn.lock b/yarn.lock index be0d71a8..0337a921 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1826,9 +1826,9 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/eth-trezor-keyring@workspace:packages/keyring-eth-trezor" dependencies: - "@ethereumjs/common": "npm:^3.2.0" - "@ethereumjs/tx": "npm:^4.2.0" - "@ethereumjs/util": "npm:^8.1.0" + "@ethereumjs/common": "npm:^4.4.0" + "@ethereumjs/tx": "npm:^5.4.0" + "@ethereumjs/util": "npm:^9.1.0" "@lavamoat/allow-scripts": "npm:^3.2.1" "@lavamoat/preinstall-always-fail": "npm:^2.1.0" "@metamask/auto-changelog": "npm:^3.4.4" From 5c5f018d7f89b2a61fa07c4c4ab01395db347f03 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 14 Feb 2025 20:49:43 +0000 Subject: [PATCH 05/11] Upgrade keyring-snap-bridge --- packages/keyring-snap-bridge/package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/keyring-snap-bridge/package.json b/packages/keyring-snap-bridge/package.json index f92a69c9..8f7afb5a 100644 --- a/packages/keyring-snap-bridge/package.json +++ b/packages/keyring-snap-bridge/package.json @@ -37,7 +37,7 @@ "test:watch": "jest --watch" }, "dependencies": { - "@ethereumjs/tx": "^4.2.0", + "@ethereumjs/tx": "^5.4.0", "@metamask/base-controller": "^7.1.1", "@metamask/eth-sig-util": "^8.2.0", "@metamask/keyring-api": "workspace:^", diff --git a/yarn.lock b/yarn.lock index 0337a921..7774d000 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1788,7 +1788,7 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/eth-snap-keyring@workspace:packages/keyring-snap-bridge" dependencies: - "@ethereumjs/tx": "npm:^4.2.0" + "@ethereumjs/tx": "npm:^5.4.0" "@lavamoat/allow-scripts": "npm:^3.2.1" "@lavamoat/preinstall-always-fail": "npm:^2.1.0" "@metamask/auto-changelog": "npm:^3.4.4" From cfd600f277dd5df573e23d6934e350bb979dfa57 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 14 Feb 2025 21:05:13 +0000 Subject: [PATCH 06/11] Fix linting --- packages/keyring-eth-hd/src/index.ts | 1 - packages/keyring-eth-hd/test/index.test.ts | 10 +++++----- .../src/ledger-keyring.test.ts | 2 +- .../keyring-eth-ledger-bridge/src/ledger-keyring.ts | 3 +-- packages/keyring-eth-simple/src/simple-keyring.test.ts | 6 ++++-- packages/keyring-eth-trezor/src/trezor-keyring.test.ts | 4 +++- packages/keyring-eth-trezor/src/trezor-keyring.ts | 2 +- packages/keyring-utils/package.json | 2 +- yarn.lock | 2 +- 9 files changed, 17 insertions(+), 15 deletions(-) diff --git a/packages/keyring-eth-hd/src/index.ts b/packages/keyring-eth-hd/src/index.ts index c3137b95..2e8a0872 100644 --- a/packages/keyring-eth-hd/src/index.ts +++ b/packages/keyring-eth-hd/src/index.ts @@ -26,7 +26,6 @@ import { assert, assertIsHexString, bigIntToBytes, - bigIntToHex, type Hex, remove0x, } from '@metamask/utils'; diff --git a/packages/keyring-eth-hd/test/index.test.ts b/packages/keyring-eth-hd/test/index.test.ts index e23bef70..9d152569 100644 --- a/packages/keyring-eth-hd/test/index.test.ts +++ b/packages/keyring-eth-hd/test/index.test.ts @@ -1,9 +1,9 @@ -import { TransactionFactory, Transaction as EthereumTx, LegacyTransaction, TypedTxData } from '@ethereumjs/tx'; import { - isValidAddress, - ecrecover, - pubToAddress, -} from '@ethereumjs/util'; + TransactionFactory, + LegacyTransaction, + type TypedTxData, +} from '@ethereumjs/tx'; +import { isValidAddress, ecrecover, pubToAddress } from '@ethereumjs/util'; import * as oldMMForkBIP39 from '@metamask/bip39'; import { normalize, diff --git a/packages/keyring-eth-ledger-bridge/src/ledger-keyring.test.ts b/packages/keyring-eth-ledger-bridge/src/ledger-keyring.test.ts index 959ef392..927ae2ad 100644 --- a/packages/keyring-eth-ledger-bridge/src/ledger-keyring.test.ts +++ b/packages/keyring-eth-ledger-bridge/src/ledger-keyring.test.ts @@ -3,13 +3,13 @@ import { RLP } from '@ethereumjs/rlp'; import { TransactionFactory } from '@ethereumjs/tx'; import * as ethUtil from '@ethereumjs/util'; import * as sigUtil from '@metamask/eth-sig-util'; +import { bytesToHex } from '@metamask/utils'; import EthereumTx from 'ethereumjs-tx'; import HDKey from 'hdkey'; import { LedgerBridge, LedgerBridgeOptions } from './ledger-bridge'; import { LedgerIframeBridge } from './ledger-iframe-bridge'; import { AccountDetails, LedgerKeyring } from './ledger-keyring'; -import { bytesToHex } from '@metamask/utils'; jest.mock('@metamask/eth-sig-util', () => { return { diff --git a/packages/keyring-eth-ledger-bridge/src/ledger-keyring.ts b/packages/keyring-eth-ledger-bridge/src/ledger-keyring.ts index da440f5a..f3d349b6 100644 --- a/packages/keyring-eth-ledger-bridge/src/ledger-keyring.ts +++ b/packages/keyring-eth-ledger-bridge/src/ledger-keyring.ts @@ -1,7 +1,6 @@ import { RLP } from '@ethereumjs/rlp'; import { TransactionFactory, - TxData, TypedTransaction, TypedTxData, } from '@ethereumjs/tx'; @@ -13,6 +12,7 @@ import { SignTypedDataVersion, TypedDataUtils, } from '@metamask/eth-sig-util'; +import { bytesToHex, remove0x } from '@metamask/utils'; import { Buffer } from 'buffer'; import type OldEthJsTransaction from 'ethereumjs-tx'; import { EventEmitter } from 'events'; @@ -20,7 +20,6 @@ import HDKey from 'hdkey'; import { LedgerBridge, LedgerBridgeOptions } from './ledger-bridge'; import { LedgerIframeBridgeOptions } from './ledger-iframe-bridge'; -import { bytesToHex, remove0x } from '@metamask/utils'; const pathBase = 'm'; const hdPathString = `${pathBase}/44'/60'/0'`; diff --git a/packages/keyring-eth-simple/src/simple-keyring.test.ts b/packages/keyring-eth-simple/src/simple-keyring.test.ts index 46ac61e4..da561688 100644 --- a/packages/keyring-eth-simple/src/simple-keyring.test.ts +++ b/packages/keyring-eth-simple/src/simple-keyring.test.ts @@ -590,7 +590,8 @@ describe('simple-keyring', function () { describe('#decryptMessage', function () { const address = '0xbe93f9bacbcffc8ee6663f2647917ed7a20a57bb'; - const privKeyHex = '6969696969696969696969696969696969696969696969696969696969696969'; + const privKeyHex = + '6969696969696969696969696969696969696969696969696969696969696969'; const message = 'Hello world!'; const encryptedMessage = encrypt({ publicKey: getEncryptionPublicKey(privKeyHex), @@ -626,7 +627,8 @@ describe('simple-keyring', function () { describe('#encryptionPublicKey', function () { const address = '0xbe93f9bacbcffc8ee6663f2647917ed7a20a57bb'; - const privKeyHex = '0x6969696969696969696969696969696969696969696969696969696969696969'; + const privKeyHex = + '0x6969696969696969696969696969696969696969696969696969696969696969'; const publicKey = 'GxuMqoE2oHsZzcQtv/WMNB3gCH2P6uzynuwO1P0MM1U='; it('returns the expected value', async function () { diff --git a/packages/keyring-eth-trezor/src/trezor-keyring.test.ts b/packages/keyring-eth-trezor/src/trezor-keyring.test.ts index cff4aa26..1ea9c7e3 100644 --- a/packages/keyring-eth-trezor/src/trezor-keyring.test.ts +++ b/packages/keyring-eth-trezor/src/trezor-keyring.test.ts @@ -412,7 +412,9 @@ describe('TrezorKeyring', function () { sinon.stub(fakeTx, 'verifySignature').callsFake(() => true); sinon .stub(fakeTx, 'getSenderAddress') - .callsFake(() => Buffer.from(Address.fromString(fakeAccounts[0]).bytes)); + .callsFake(() => + Buffer.from(Address.fromString(fakeAccounts[0]).bytes), + ); const returnedTx = await keyring.signTransaction(fakeAccounts[0], fakeTx); // assert that the v,r,s values got assigned to tx. diff --git a/packages/keyring-eth-trezor/src/trezor-keyring.ts b/packages/keyring-eth-trezor/src/trezor-keyring.ts index 4b2007bd..290b7a66 100644 --- a/packages/keyring-eth-trezor/src/trezor-keyring.ts +++ b/packages/keyring-eth-trezor/src/trezor-keyring.ts @@ -1,5 +1,5 @@ import { TransactionFactory } from '@ethereumjs/tx'; -import type { TypedTransaction, TxData, TypedTxData } from '@ethereumjs/tx'; +import type { TypedTransaction, TypedTxData } from '@ethereumjs/tx'; import * as ethUtil from '@ethereumjs/util'; import { TypedMessage, diff --git a/packages/keyring-utils/package.json b/packages/keyring-utils/package.json index 8453c54b..3d28590f 100644 --- a/packages/keyring-utils/package.json +++ b/packages/keyring-utils/package.json @@ -45,7 +45,7 @@ "test:watch": "jest --watch" }, "dependencies": { - "@ethereumjs/tx": "^4.2.0", + "@ethereumjs/tx": "^5.4.0", "@metamask/superstruct": "^3.1.0", "@metamask/utils": "^11.1.0", "bitcoin-address-validation": "^2.2.3" diff --git a/yarn.lock b/yarn.lock index 7774d000..f73a445d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2060,7 +2060,7 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/keyring-utils@workspace:packages/keyring-utils" dependencies: - "@ethereumjs/tx": "npm:^4.2.0" + "@ethereumjs/tx": "npm:^5.4.0" "@lavamoat/allow-scripts": "npm:^3.2.1" "@lavamoat/preinstall-always-fail": "npm:^2.1.0" "@metamask/auto-changelog": "npm:^3.4.4" From 915ef40be84fd6f1d5f35949fe86aac04e59a629 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 14 Feb 2025 21:21:13 +0000 Subject: [PATCH 07/11] Fix linting --- packages/keyring-snap-bridge/src/SnapKeyring.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/keyring-snap-bridge/src/SnapKeyring.ts b/packages/keyring-snap-bridge/src/SnapKeyring.ts index 89b208bb..51e6e111 100644 --- a/packages/keyring-snap-bridge/src/SnapKeyring.ts +++ b/packages/keyring-snap-bridge/src/SnapKeyring.ts @@ -36,7 +36,7 @@ import { strictMask } from '@metamask/keyring-utils'; import type { SnapId } from '@metamask/snaps-sdk'; import { type Snap } from '@metamask/snaps-utils'; import { assert, mask, object, string } from '@metamask/superstruct'; -import type { Json } from '@metamask/utils'; +import type { Hex, Json } from '@metamask/utils'; import { bigIntToHex, KnownCaipNamespace, @@ -907,9 +907,9 @@ export class SnapKeyring extends EventEmitter { return TransactionFactory.fromTxData({ ...(tx as Record), - r: signature.r, - s: signature.s, - v: signature.v, + r: signature.r as Hex, + s: signature.s as Hex, + v: signature.v as Hex, }); } From 508843c56ffdbe49e4efb5aca9851a9c6f324c5e Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 14 Feb 2025 21:31:31 +0000 Subject: [PATCH 08/11] Fix unit test --- packages/keyring-snap-bridge/src/SnapKeyring.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/keyring-snap-bridge/src/SnapKeyring.test.ts b/packages/keyring-snap-bridge/src/SnapKeyring.test.ts index c2e4cb40..e3391642 100644 --- a/packages/keyring-snap-bridge/src/SnapKeyring.test.ts +++ b/packages/keyring-snap-bridge/src/SnapKeyring.test.ts @@ -1,4 +1,4 @@ -import { TransactionFactory } from '@ethereumjs/tx'; +import { TransactionFactory, TypedTxData } from '@ethereumjs/tx'; import { Messenger } from '@metamask/base-controller'; import { SignTypedDataVersion } from '@metamask/eth-sig-util'; import type { @@ -669,7 +669,7 @@ describe('SnapKeyring', () => { expect(keyring.listAccounts()[0]?.methods).toStrictEqual( updatedMethods, ); - const mockTx = { + const mockTx: TypedTxData = { data: '0x0', gasLimit: '0x26259fe', gasPrice: '0x1', @@ -1174,7 +1174,7 @@ describe('SnapKeyring', () => { describe('signTransaction', () => { it('signs a ethereum transaction synchronously', async () => { - const mockTx = { + const mockTx: TypedTxData = { data: '0x00', gasLimit: '0x26259fe', gasPrice: '0x1', @@ -1184,7 +1184,7 @@ describe('SnapKeyring', () => { chainId: '0x1', type: '0x0', }; - const mockSignedTx = { + const mockSignedTx: TypedTxData = { ...mockTx, r: '0x0', s: '0x0', From 44b05d14c900509c183691c770930f89a037f3c2 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 14 Feb 2025 21:43:02 +0000 Subject: [PATCH 09/11] Fix linting --- packages/keyring-snap-bridge/src/SnapKeyring.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/keyring-snap-bridge/src/SnapKeyring.test.ts b/packages/keyring-snap-bridge/src/SnapKeyring.test.ts index e3391642..b201f0c2 100644 --- a/packages/keyring-snap-bridge/src/SnapKeyring.test.ts +++ b/packages/keyring-snap-bridge/src/SnapKeyring.test.ts @@ -1,4 +1,4 @@ -import { TransactionFactory, TypedTxData } from '@ethereumjs/tx'; +import { TransactionFactory, type TypedTxData } from '@ethereumjs/tx'; import { Messenger } from '@metamask/base-controller'; import { SignTypedDataVersion } from '@metamask/eth-sig-util'; import type { From 82fcc29ad2ea2774dc9e71ae6c5e34534e85538c Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Mon, 17 Feb 2025 14:13:29 +0000 Subject: [PATCH 10/11] Update keyring type --- packages/keyring-utils/src/keyring.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/keyring-utils/src/keyring.ts b/packages/keyring-utils/src/keyring.ts index a523e3ce..8be5157d 100644 --- a/packages/keyring-utils/src/keyring.ts +++ b/packages/keyring-utils/src/keyring.ts @@ -1,4 +1,4 @@ -import type { TypedTransaction, TxData } from '@ethereumjs/tx'; +import type { TypedTransaction, TypedTxData } from '@ethereumjs/tx'; import type { Eip1024EncryptedData, Hex, Json } from '@metamask/utils'; /** @@ -140,7 +140,7 @@ export type Keyring = { address: Hex, transaction: TypedTransaction, options?: Record, - ): Promise; + ): Promise; /** * Sign a message. This is equivalent to an older version of the the From 8e5f3e5273ea1b31e32c9338b3a92578e00aedc1 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 28 Feb 2025 12:22:34 +0000 Subject: [PATCH 11/11] Remove unnecessary code --- packages/keyring-eth-trezor/src/trezor-keyring.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/keyring-eth-trezor/src/trezor-keyring.ts b/packages/keyring-eth-trezor/src/trezor-keyring.ts index aa492db6..7d1fe5df 100644 --- a/packages/keyring-eth-trezor/src/trezor-keyring.ts +++ b/packages/keyring-eth-trezor/src/trezor-keyring.ts @@ -548,7 +548,7 @@ export class TrezorKeyring implements Keyring { } #normalize(buf: Buffer): string { - return bytesToHex(buf).toString(); + return bytesToHex(buf); } #addressFromIndex(basePath: string, i: number): Hex {