@metamask-previews/eth-simple-keyring 8.0.1-fb72e65 → 8.1.0-44b05d1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [8.1.0]
11
+
12
+ ### Added
13
+
14
+ - Add `signEip7702Authorization` method ([#182](https://github.com/MetaMask/accounts/pull/182))
15
+
16
+ ### Changed
17
+
18
+ - Bump `@metamask/eth-sig-util` dependency from `^8.0.0` to `8.2.0` ([#177](https://github.com/MetaMask/accounts/pull/177)), ([#134](https://github.com/MetaMask/accounts/pull/134))
19
+ - Bump `@metamask/utils` dependency from `^9.3.1` to `11.1.0` ([#134](https://github.com/MetaMask/accounts/pull/134)), ([#167](https://github.com/MetaMask/accounts/pull/167))
20
+
10
21
  ## [8.0.1]
11
22
 
12
23
  ### Changed
@@ -107,7 +118,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
107
118
  - **BREAKING:** Remove redundant `newGethSignMessage` method ([#72](https://github.com/MetaMask/eth-simple-keyring/pull/72))
108
119
  - Consumers can use `signPersonalMessage` method as a replacement for `newGethSignMessage`.
109
120
 
110
- [Unreleased]: https://github.com/MetaMask/accounts/compare/@metamask/eth-simple-keyring@8.0.1...HEAD
121
+ [Unreleased]: https://github.com/MetaMask/accounts/compare/@metamask/eth-simple-keyring@8.1.0...HEAD
122
+ [8.1.0]: https://github.com/MetaMask/accounts/compare/@metamask/eth-simple-keyring@8.0.1...@metamask/eth-simple-keyring@8.1.0
111
123
  [8.0.1]: https://github.com/MetaMask/accounts/compare/@metamask/eth-simple-keyring@8.0.0...@metamask/eth-simple-keyring@8.0.1
112
124
  [8.0.0]: https://github.com/MetaMask/accounts/compare/@metamask/eth-simple-keyring@7.0.0...@metamask/eth-simple-keyring@8.0.0
113
125
  [7.0.0]: https://github.com/MetaMask/accounts/compare/@metamask/eth-simple-keyring@6.0.5...@metamask/eth-simple-keyring@7.0.0
@@ -42,7 +42,7 @@ class SimpleKeyring {
42
42
  __classPrivateFieldSet(this, _SimpleKeyring_wallets, privateKeys.map((hexPrivateKey) => {
43
43
  const strippedHexPrivateKey = (0, util_1.stripHexPrefix)(hexPrivateKey);
44
44
  const privateKey = Buffer.from(strippedHexPrivateKey, 'hex');
45
- const publicKey = (0, util_1.privateToPublic)(privateKey);
45
+ const publicKey = Buffer.from((0, util_1.privateToPublic)(privateKey));
46
46
  return { privateKey, publicKey };
47
47
  }), "f");
48
48
  }
@@ -50,22 +50,27 @@ class SimpleKeyring {
50
50
  const newWallets = [];
51
51
  for (let i = 0; i < numAccounts; i++) {
52
52
  const privateKey = generateKey();
53
- const publicKey = (0, util_1.privateToPublic)(privateKey);
53
+ const publicKey = Buffer.from((0, util_1.privateToPublic)(privateKey));
54
54
  newWallets.push({ privateKey, publicKey });
55
55
  }
56
56
  __classPrivateFieldSet(this, _SimpleKeyring_wallets, __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").concat(newWallets), "f");
57
- const hexWallets = newWallets.map(({ publicKey }) => (0, utils_1.add0x)((0, util_1.bufferToHex)((0, util_1.publicToAddress)(publicKey))));
57
+ const hexWallets = newWallets.map(({ publicKey }) => (0, utils_1.add0x)((0, utils_1.bytesToHex)((0, util_1.publicToAddress)(publicKey))));
58
58
  return hexWallets;
59
59
  }
60
60
  async getAccounts() {
61
- return __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").map(({ publicKey }) => (0, utils_1.add0x)((0, util_1.bufferToHex)((0, util_1.publicToAddress)(publicKey))));
61
+ return __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").map(({ publicKey }) => (0, utils_1.add0x)((0, utils_1.bytesToHex)((0, util_1.publicToAddress)(publicKey))));
62
62
  }
63
+ // @ts-expect-error Update utils package
63
64
  async signTransaction(address, transaction, opts = {}) {
64
65
  const privKey = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getPrivateKeyFor).call(this, address, opts);
65
66
  const signedTx = transaction.sign(privKey);
66
67
  // Newer versions of Ethereumjs-tx are immutable and return a new tx object
67
68
  return signedTx ?? transaction;
68
69
  }
70
+ async signEip7702Authorization(address, authorization, opts = {}) {
71
+ const privateKey = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getPrivateKeyFor).call(this, address, opts);
72
+ return (0, eth_sig_util_1.signEIP7702Authorization)({ privateKey, authorization });
73
+ }
69
74
  // For eth_sign, we need to sign arbitrary data:
70
75
  async signMessage(address, data, opts = { withAppKeyOrigin: '', validateMessage: true }) {
71
76
  const message = (0, util_1.stripHexPrefix)(data);
@@ -75,7 +80,7 @@ class SimpleKeyring {
75
80
  }
76
81
  const privKey = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getPrivateKeyFor).call(this, address, opts);
77
82
  const msgSig = (0, util_1.ecsign)(Buffer.from(message, 'hex'), privKey);
78
- const rawMsgSig = (0, eth_sig_util_1.concatSig)((0, util_1.toBuffer)(msgSig.v), msgSig.r, msgSig.s);
83
+ const rawMsgSig = (0, eth_sig_util_1.concatSig)(Buffer.from((0, utils_1.bigIntToBytes)(msgSig.v)), Buffer.from(msgSig.r), Buffer.from(msgSig.s));
79
84
  return rawMsgSig;
80
85
  }
81
86
  // For personal_sign, we need to prefix the message:
@@ -113,7 +118,7 @@ class SimpleKeyring {
113
118
  const wallet = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getWalletForAccount).call(this, address, {
114
119
  withAppKeyOrigin: origin,
115
120
  });
116
- const appKeyAddress = (0, utils_1.add0x)((0, util_1.bufferToHex)((0, util_1.publicToAddress)(wallet.publicKey)));
121
+ const appKeyAddress = (0, utils_1.add0x)((0, utils_1.bytesToHex)((0, util_1.publicToAddress)(wallet.publicKey)));
117
122
  return appKeyAddress;
118
123
  }
119
124
  // exportAccount should return a hex-encoded private key:
@@ -123,11 +128,11 @@ class SimpleKeyring {
123
128
  }
124
129
  removeAccount(address) {
125
130
  if (!__classPrivateFieldGet(this, _SimpleKeyring_wallets, "f")
126
- .map(({ publicKey }) => (0, util_1.bufferToHex)((0, util_1.publicToAddress)(publicKey)).toLowerCase())
131
+ .map(({ publicKey }) => (0, utils_1.bytesToHex)((0, util_1.publicToAddress)(publicKey)).toLowerCase())
127
132
  .includes(address.toLowerCase())) {
128
133
  throw new Error(`Address ${address} not found in this keyring`);
129
134
  }
130
- __classPrivateFieldSet(this, _SimpleKeyring_wallets, __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").filter(({ publicKey }) => (0, util_1.bufferToHex)((0, util_1.publicToAddress)(publicKey)).toLowerCase() !==
135
+ __classPrivateFieldSet(this, _SimpleKeyring_wallets, __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").filter(({ publicKey }) => (0, utils_1.bytesToHex)((0, util_1.publicToAddress)(publicKey)).toLowerCase() !==
131
136
  address.toLowerCase()), "f");
132
137
  }
133
138
  }
@@ -139,7 +144,7 @@ _SimpleKeyring_wallets = new WeakMap(), _SimpleKeyring_instances = new WeakSet()
139
144
  return wallet.privateKey;
140
145
  }, _SimpleKeyring_getWalletForAccount = function _SimpleKeyring_getWalletForAccount(account, opts = {}) {
141
146
  const address = (0, eth_sig_util_1.normalize)(account);
142
- let wallet = __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").find(({ publicKey }) => (0, util_1.bufferToHex)((0, util_1.publicToAddress)(publicKey)) === address);
147
+ let wallet = __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").find(({ publicKey }) => (0, utils_1.bytesToHex)((0, util_1.publicToAddress)(publicKey)) === address);
143
148
  if (!wallet) {
144
149
  throw new Error('Simple Keyring - Unable to find matching address.');
145
150
  }
@@ -147,9 +152,12 @@ _SimpleKeyring_wallets = new WeakMap(), _SimpleKeyring_instances = new WeakSet()
147
152
  const { privateKey } = wallet;
148
153
  const appKeyOriginBuffer = Buffer.from(opts.withAppKeyOrigin, 'utf8');
149
154
  const appKeyBuffer = Buffer.concat([privateKey, appKeyOriginBuffer]);
150
- const appKeyPrivateKey = (0, util_1.arrToBufArr)((0, keccak_1.keccak256)(appKeyBuffer));
155
+ const appKeyPrivateKey = (0, keccak_1.keccak256)(appKeyBuffer);
151
156
  const appKeyPublicKey = (0, util_1.privateToPublic)(appKeyPrivateKey);
152
- wallet = { privateKey: appKeyPrivateKey, publicKey: appKeyPublicKey };
157
+ wallet = {
158
+ privateKey: Buffer.from(appKeyPrivateKey),
159
+ publicKey: Buffer.from(appKeyPublicKey),
160
+ };
153
161
  }
154
162
  return wallet;
155
163
  };
@@ -1 +1 @@
1
- {"version":3,"file":"simple-keyring.cjs","sourceRoot":"","sources":["../src/simple-keyring.ts"],"names":[],"mappings":"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","sourcesContent":["import { TypedTransaction } from '@ethereumjs/tx';\nimport {\n arrToBufArr,\n bufferToHex,\n ecsign,\n isValidPrivate,\n privateToPublic,\n publicToAddress,\n stripHexPrefix,\n toBuffer,\n} from '@ethereumjs/util';\nimport {\n concatSig,\n decrypt,\n getEncryptionPublicKey,\n normalize,\n personalSign,\n signTypedData,\n SignTypedDataVersion,\n} from '@metamask/eth-sig-util';\nimport { add0x, Eip1024EncryptedData, Hex, Keyring } from '@metamask/utils';\nimport { keccak256 } from 'ethereum-cryptography/keccak';\nimport randombytes from 'randombytes';\n\ntype KeyringOpt = {\n withAppKeyOrigin?: string;\n version?: SignTypedDataVersion | string;\n};\n\ntype Wallet = {\n privateKey: Buffer;\n publicKey: Buffer;\n};\n\nconst TYPE = 'Simple Key Pair';\n\n// FIXME: This should not be exported as default.\nexport default class SimpleKeyring implements Keyring<string[]> {\n #wallets: { privateKey: Buffer; publicKey: Buffer }[];\n\n readonly type: string = TYPE;\n\n static type: string = TYPE;\n\n constructor(privateKeys: string[] = []) {\n this.#wallets = [];\n\n /* istanbul ignore next: It's not possible to write a unit test for this, because a constructor isn't allowed\n * to be async. Jest can't await the constructor, and when the error gets thrown, Jest can't catch it. */\n this.deserialize(privateKeys).catch((error: Error) => {\n throw new Error(`Problem deserializing SimpleKeyring ${error.message}`);\n });\n }\n\n async serialize(): Promise<string[]> {\n return this.#wallets.map((a) => a.privateKey.toString('hex'));\n }\n\n async deserialize(privateKeys: string[] = []): Promise<void> {\n this.#wallets = privateKeys.map((hexPrivateKey) => {\n const strippedHexPrivateKey = stripHexPrefix(hexPrivateKey);\n const privateKey = Buffer.from(strippedHexPrivateKey, 'hex');\n const publicKey = privateToPublic(privateKey);\n return { privateKey, publicKey };\n });\n }\n\n async addAccounts(numAccounts = 1): Promise<Hex[]> {\n const newWallets = [];\n for (let i = 0; i < numAccounts; i++) {\n const privateKey = generateKey();\n const publicKey = privateToPublic(privateKey);\n newWallets.push({ privateKey, publicKey });\n }\n this.#wallets = this.#wallets.concat(newWallets);\n const hexWallets = newWallets.map(({ publicKey }) =>\n add0x(bufferToHex(publicToAddress(publicKey))),\n );\n return hexWallets;\n }\n\n async getAccounts(): Promise<Hex[]> {\n return this.#wallets.map(({ publicKey }) =>\n add0x(bufferToHex(publicToAddress(publicKey))),\n );\n }\n\n async signTransaction(\n address: Hex,\n transaction: TypedTransaction,\n opts: KeyringOpt = {},\n ): Promise<TypedTransaction> {\n const privKey = this.#getPrivateKeyFor(address, opts);\n const signedTx = transaction.sign(privKey);\n // Newer versions of Ethereumjs-tx are immutable and return a new tx object\n return signedTx ?? transaction;\n }\n\n // For eth_sign, we need to sign arbitrary data:\n async signMessage(\n address: Hex,\n data: string,\n opts = { withAppKeyOrigin: '', validateMessage: true },\n ): Promise<string> {\n const message = stripHexPrefix(data);\n if (\n opts.validateMessage &&\n (message.length === 0 || !message.match(/^[a-fA-F0-9]*$/u))\n ) {\n throw new Error('Cannot sign invalid message');\n }\n const privKey = this.#getPrivateKeyFor(address, opts);\n const msgSig = ecsign(Buffer.from(message, 'hex'), privKey);\n const rawMsgSig = concatSig(toBuffer(msgSig.v), msgSig.r, msgSig.s);\n return rawMsgSig;\n }\n\n // For personal_sign, we need to prefix the message:\n async signPersonalMessage(\n address: Hex,\n msgHex: Hex,\n opts = { withAppKeyOrigin: '' },\n ): Promise<string> {\n const privKey = this.#getPrivateKeyFor(address, opts);\n return personalSign({ privateKey: privKey, data: msgHex });\n }\n\n // For eth_decryptMessage:\n async decryptMessage(\n withAccount: Hex,\n encryptedData: Eip1024EncryptedData,\n ): Promise<string> {\n const wallet = this.#getWalletForAccount(withAccount);\n const privateKey = wallet.privateKey.toString('hex');\n return decrypt({ privateKey, encryptedData });\n }\n\n // personal_signTypedData, signs data along with the schema\n async signTypedData(\n address: Hex,\n typedData: any,\n opts: KeyringOpt = { version: SignTypedDataVersion.V1 },\n ): Promise<string> {\n // Treat invalid versions as \"V1\"\n let version = SignTypedDataVersion.V1;\n\n if (opts.version && isSignTypedDataVersion(opts.version)) {\n version = SignTypedDataVersion[opts.version];\n }\n\n const privateKey = this.#getPrivateKeyFor(address, opts);\n return signTypedData({ privateKey, data: typedData, version });\n }\n\n // get public key for nacl\n async getEncryptionPublicKey(\n withAccount: Hex,\n opts?: KeyringOpt,\n ): Promise<string> {\n const privKey = this.#getPrivateKeyFor(withAccount, opts);\n const publicKey = getEncryptionPublicKey(privKey.toString('hex'));\n return publicKey;\n }\n\n #getPrivateKeyFor(\n address: Hex,\n opts: KeyringOpt = { withAppKeyOrigin: '' },\n ): Buffer {\n if (!address) {\n throw new Error('Must specify address.');\n }\n const wallet = this.#getWalletForAccount(address, opts);\n return wallet.privateKey;\n }\n\n // returns an address specific to an app\n async getAppKeyAddress(address: Hex, origin: string): Promise<Hex> {\n if (!origin || typeof origin !== 'string') {\n throw new Error(`'origin' must be a non-empty string`);\n }\n const wallet = this.#getWalletForAccount(address, {\n withAppKeyOrigin: origin,\n });\n const appKeyAddress = add0x(bufferToHex(publicToAddress(wallet.publicKey)));\n return appKeyAddress;\n }\n\n // exportAccount should return a hex-encoded private key:\n async exportAccount(\n address: Hex,\n opts = { withAppKeyOrigin: '' },\n ): Promise<string> {\n const wallet = this.#getWalletForAccount(address, opts);\n return wallet.privateKey.toString('hex');\n }\n\n removeAccount(address: string): void {\n if (\n !this.#wallets\n .map(({ publicKey }) =>\n bufferToHex(publicToAddress(publicKey)).toLowerCase(),\n )\n .includes(address.toLowerCase())\n ) {\n throw new Error(`Address ${address} not found in this keyring`);\n }\n\n this.#wallets = this.#wallets.filter(\n ({ publicKey }) =>\n bufferToHex(publicToAddress(publicKey)).toLowerCase() !==\n address.toLowerCase(),\n );\n }\n\n #getWalletForAccount(\n account: string | number,\n opts: KeyringOpt = {},\n ): Wallet {\n const address = normalize(account);\n let wallet = this.#wallets.find(\n ({ publicKey }) => bufferToHex(publicToAddress(publicKey)) === address,\n );\n if (!wallet) {\n throw new Error('Simple Keyring - Unable to find matching address.');\n }\n\n if (opts.withAppKeyOrigin) {\n const { privateKey } = wallet;\n const appKeyOriginBuffer = Buffer.from(opts.withAppKeyOrigin, 'utf8');\n const appKeyBuffer = Buffer.concat([privateKey, appKeyOriginBuffer]);\n const appKeyPrivateKey = arrToBufArr(keccak256(appKeyBuffer));\n const appKeyPublicKey = privateToPublic(appKeyPrivateKey);\n wallet = { privateKey: appKeyPrivateKey, publicKey: appKeyPublicKey };\n }\n\n return wallet;\n }\n}\n\n/**\n * Generate and validate a new random key of 32 bytes.\n *\n * @returns Buffer The generated key.\n */\nfunction generateKey(): Buffer {\n const privateKey = randombytes(32);\n\n if (!isValidPrivate(privateKey)) {\n throw new Error(\n 'Private key does not satisfy the curve requirements (ie. it is invalid)',\n );\n }\n return privateKey;\n}\n\n/**\n * Type predicate type guard to check if a string is in the enum SignTypedDataVersion.\n *\n * @param version - The string to check.\n * @returns Whether it's in the enum.\n */\n// TODO: Put this in @metamask/eth-sig-util\nfunction isSignTypedDataVersion(\n version: SignTypedDataVersion | string,\n): version is SignTypedDataVersion {\n return version in SignTypedDataVersion;\n}\n"]}
1
+ {"version":3,"file":"simple-keyring.cjs","sourceRoot":"","sources":["../src/simple-keyring.ts"],"names":[],"mappings":"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","sourcesContent":["import { TypedTransaction } from '@ethereumjs/tx';\nimport {\n ecsign,\n isValidPrivate,\n privateToPublic,\n publicToAddress,\n stripHexPrefix,\n} from '@ethereumjs/util';\nimport {\n concatSig,\n decrypt,\n EIP7702Authorization,\n getEncryptionPublicKey,\n normalize,\n personalSign,\n signEIP7702Authorization,\n signTypedData,\n SignTypedDataVersion,\n} from '@metamask/eth-sig-util';\nimport {\n add0x,\n bigIntToBytes,\n bytesToHex,\n Eip1024EncryptedData,\n Hex,\n Keyring,\n} from '@metamask/utils';\nimport { keccak256 } from 'ethereum-cryptography/keccak';\nimport randombytes from 'randombytes';\n\ntype KeyringOpt = {\n withAppKeyOrigin?: string;\n version?: SignTypedDataVersion | string;\n};\n\ntype Wallet = {\n privateKey: Buffer;\n publicKey: Buffer;\n};\n\nconst TYPE = 'Simple Key Pair';\n\n// FIXME: This should not be exported as default.\nexport default class SimpleKeyring implements Keyring<string[]> {\n #wallets: { privateKey: Buffer; publicKey: Buffer }[];\n\n readonly type: string = TYPE;\n\n static type: string = TYPE;\n\n constructor(privateKeys: string[] = []) {\n this.#wallets = [];\n\n /* istanbul ignore next: It's not possible to write a unit test for this, because a constructor isn't allowed\n * to be async. Jest can't await the constructor, and when the error gets thrown, Jest can't catch it. */\n this.deserialize(privateKeys).catch((error: Error) => {\n throw new Error(`Problem deserializing SimpleKeyring ${error.message}`);\n });\n }\n\n async serialize(): Promise<string[]> {\n return this.#wallets.map((a) => a.privateKey.toString('hex'));\n }\n\n async deserialize(privateKeys: string[] = []): Promise<void> {\n this.#wallets = privateKeys.map((hexPrivateKey) => {\n const strippedHexPrivateKey = stripHexPrefix(hexPrivateKey);\n const privateKey = Buffer.from(strippedHexPrivateKey, 'hex');\n const publicKey = Buffer.from(privateToPublic(privateKey));\n return { privateKey, publicKey };\n });\n }\n\n async addAccounts(numAccounts = 1): Promise<Hex[]> {\n const newWallets = [];\n for (let i = 0; i < numAccounts; i++) {\n const privateKey = generateKey();\n const publicKey = Buffer.from(privateToPublic(privateKey));\n newWallets.push({ privateKey, publicKey });\n }\n this.#wallets = this.#wallets.concat(newWallets);\n const hexWallets = newWallets.map(({ publicKey }) =>\n add0x(bytesToHex(publicToAddress(publicKey))),\n );\n return hexWallets;\n }\n\n async getAccounts(): Promise<Hex[]> {\n return this.#wallets.map(({ publicKey }) =>\n add0x(bytesToHex(publicToAddress(publicKey))),\n );\n }\n\n // @ts-expect-error Update utils package\n async signTransaction(\n address: Hex,\n transaction: TypedTransaction,\n opts: KeyringOpt = {},\n ): Promise<TypedTransaction> {\n const privKey = this.#getPrivateKeyFor(address, opts);\n const signedTx = transaction.sign(privKey);\n // Newer versions of Ethereumjs-tx are immutable and return a new tx object\n return signedTx ?? transaction;\n }\n\n async signEip7702Authorization(\n address: Hex,\n authorization: EIP7702Authorization,\n opts: KeyringOpt = {},\n ): Promise<string> {\n const privateKey = this.#getPrivateKeyFor(address, opts);\n return signEIP7702Authorization({ privateKey, authorization });\n }\n\n // For eth_sign, we need to sign arbitrary data:\n async signMessage(\n address: Hex,\n data: string,\n opts = { withAppKeyOrigin: '', validateMessage: true },\n ): Promise<string> {\n const message = stripHexPrefix(data);\n if (\n opts.validateMessage &&\n (message.length === 0 || !message.match(/^[a-fA-F0-9]*$/u))\n ) {\n throw new Error('Cannot sign invalid message');\n }\n const privKey = this.#getPrivateKeyFor(address, opts);\n const msgSig = ecsign(Buffer.from(message, 'hex'), privKey);\n const rawMsgSig = concatSig(\n Buffer.from(bigIntToBytes(msgSig.v)),\n Buffer.from(msgSig.r),\n Buffer.from(msgSig.s),\n );\n return rawMsgSig;\n }\n\n // For personal_sign, we need to prefix the message:\n async signPersonalMessage(\n address: Hex,\n msgHex: Hex,\n opts = { withAppKeyOrigin: '' },\n ): Promise<string> {\n const privKey = this.#getPrivateKeyFor(address, opts);\n return personalSign({ privateKey: privKey, data: msgHex });\n }\n\n // For eth_decryptMessage:\n async decryptMessage(\n withAccount: Hex,\n encryptedData: Eip1024EncryptedData,\n ): Promise<string> {\n const wallet = this.#getWalletForAccount(withAccount);\n const privateKey = wallet.privateKey.toString('hex');\n return decrypt({ privateKey, encryptedData });\n }\n\n // personal_signTypedData, signs data along with the schema\n async signTypedData(\n address: Hex,\n typedData: any,\n opts: KeyringOpt = { version: SignTypedDataVersion.V1 },\n ): Promise<string> {\n // Treat invalid versions as \"V1\"\n let version = SignTypedDataVersion.V1;\n\n if (opts.version && isSignTypedDataVersion(opts.version)) {\n version = SignTypedDataVersion[opts.version];\n }\n\n const privateKey = this.#getPrivateKeyFor(address, opts);\n return signTypedData({ privateKey, data: typedData, version });\n }\n\n // get public key for nacl\n async getEncryptionPublicKey(\n withAccount: Hex,\n opts?: KeyringOpt,\n ): Promise<string> {\n const privKey = this.#getPrivateKeyFor(withAccount, opts);\n const publicKey = getEncryptionPublicKey(privKey.toString('hex'));\n return publicKey;\n }\n\n #getPrivateKeyFor(\n address: Hex,\n opts: KeyringOpt = { withAppKeyOrigin: '' },\n ): Buffer {\n if (!address) {\n throw new Error('Must specify address.');\n }\n const wallet = this.#getWalletForAccount(address, opts);\n return wallet.privateKey;\n }\n\n // returns an address specific to an app\n async getAppKeyAddress(address: Hex, origin: string): Promise<Hex> {\n if (!origin || typeof origin !== 'string') {\n throw new Error(`'origin' must be a non-empty string`);\n }\n const wallet = this.#getWalletForAccount(address, {\n withAppKeyOrigin: origin,\n });\n const appKeyAddress = add0x(bytesToHex(publicToAddress(wallet.publicKey)));\n return appKeyAddress;\n }\n\n // exportAccount should return a hex-encoded private key:\n async exportAccount(\n address: Hex,\n opts = { withAppKeyOrigin: '' },\n ): Promise<string> {\n const wallet = this.#getWalletForAccount(address, opts);\n return wallet.privateKey.toString('hex');\n }\n\n removeAccount(address: string): void {\n if (\n !this.#wallets\n .map(({ publicKey }) =>\n bytesToHex(publicToAddress(publicKey)).toLowerCase(),\n )\n .includes(address.toLowerCase())\n ) {\n throw new Error(`Address ${address} not found in this keyring`);\n }\n\n this.#wallets = this.#wallets.filter(\n ({ publicKey }) =>\n bytesToHex(publicToAddress(publicKey)).toLowerCase() !==\n address.toLowerCase(),\n );\n }\n\n #getWalletForAccount(\n account: string | number,\n opts: KeyringOpt = {},\n ): Wallet {\n const address = normalize(account);\n let wallet = this.#wallets.find(\n ({ publicKey }) => bytesToHex(publicToAddress(publicKey)) === address,\n );\n if (!wallet) {\n throw new Error('Simple Keyring - Unable to find matching address.');\n }\n\n if (opts.withAppKeyOrigin) {\n const { privateKey } = wallet;\n const appKeyOriginBuffer = Buffer.from(opts.withAppKeyOrigin, 'utf8');\n const appKeyBuffer = Buffer.concat([privateKey, appKeyOriginBuffer]);\n const appKeyPrivateKey = keccak256(appKeyBuffer);\n const appKeyPublicKey = privateToPublic(appKeyPrivateKey);\n wallet = {\n privateKey: Buffer.from(appKeyPrivateKey),\n publicKey: Buffer.from(appKeyPublicKey),\n };\n }\n\n return wallet;\n }\n}\n\n/**\n * Generate and validate a new random key of 32 bytes.\n *\n * @returns Buffer The generated key.\n */\nfunction generateKey(): Buffer {\n const privateKey = randombytes(32);\n\n if (!isValidPrivate(privateKey)) {\n throw new Error(\n 'Private key does not satisfy the curve requirements (ie. it is invalid)',\n );\n }\n return privateKey;\n}\n\n/**\n * Type predicate type guard to check if a string is in the enum SignTypedDataVersion.\n *\n * @param version - The string to check.\n * @returns Whether it's in the enum.\n */\n// TODO: Put this in @metamask/eth-sig-util\nfunction isSignTypedDataVersion(\n version: SignTypedDataVersion | string,\n): version is SignTypedDataVersion {\n return version in SignTypedDataVersion;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { TypedTransaction } from "@ethereumjs/tx";
2
- import { SignTypedDataVersion } from "@metamask/eth-sig-util";
2
+ import { EIP7702Authorization, SignTypedDataVersion } from "@metamask/eth-sig-util";
3
3
  import { Eip1024EncryptedData, Hex, Keyring } from "@metamask/utils";
4
4
  type KeyringOpt = {
5
5
  withAppKeyOrigin?: string;
@@ -15,6 +15,7 @@ export default class SimpleKeyring implements Keyring<string[]> {
15
15
  addAccounts(numAccounts?: number): Promise<Hex[]>;
16
16
  getAccounts(): Promise<Hex[]>;
17
17
  signTransaction(address: Hex, transaction: TypedTransaction, opts?: KeyringOpt): Promise<TypedTransaction>;
18
+ signEip7702Authorization(address: Hex, authorization: EIP7702Authorization, opts?: KeyringOpt): Promise<string>;
18
19
  signMessage(address: Hex, data: string, opts?: {
19
20
  withAppKeyOrigin: string;
20
21
  validateMessage: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"simple-keyring.d.cts","sourceRoot":"","sources":["../src/simple-keyring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB;AAWlD,OAAO,EAOL,oBAAoB,EACrB,+BAA+B;AAChC,OAAO,EAAS,oBAAoB,EAAE,GAAG,EAAE,OAAO,EAAE,wBAAwB;AAI5E,KAAK,UAAU,GAAG;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAAC;CACzC,CAAC;AAUF,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,OAAO,CAAC,MAAM,EAAE,CAAC;;IAG7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAQ;IAE7B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAQ;gBAEf,WAAW,GAAE,MAAM,EAAO;IAUhC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI9B,WAAW,CAAC,WAAW,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD,WAAW,CAAC,WAAW,SAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAc5C,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAM7B,eAAe,CACnB,OAAO,EAAE,GAAG,EACZ,WAAW,EAAE,gBAAgB,EAC7B,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAQtB,WAAW,CACf,OAAO,EAAE,GAAG,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI;;;KAAkD,GACrD,OAAO,CAAC,MAAM,CAAC;IAeZ,mBAAmB,CACvB,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,GAAG,EACX,IAAI;;KAA2B,GAC9B,OAAO,CAAC,MAAM,CAAC;IAMZ,cAAc,CAClB,WAAW,EAAE,GAAG,EAChB,aAAa,EAAE,oBAAoB,GAClC,OAAO,CAAC,MAAM,CAAC;IAOZ,aAAa,CACjB,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,GAAG,EACd,IAAI,GAAE,UAAiD,GACtD,OAAO,CAAC,MAAM,CAAC;IAaZ,sBAAsB,CAC1B,WAAW,EAAE,GAAG,EAChB,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC,MAAM,CAAC;IAkBZ,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAY5D,aAAa,CACjB,OAAO,EAAE,GAAG,EACZ,IAAI;;KAA2B,GAC9B,OAAO,CAAC,MAAM,CAAC;IAKlB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAyCrC"}
1
+ {"version":3,"file":"simple-keyring.d.cts","sourceRoot":"","sources":["../src/simple-keyring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB;AAQlD,OAAO,EAGL,oBAAoB,EAMpB,oBAAoB,EACrB,+BAA+B;AAChC,OAAO,EAIL,oBAAoB,EACpB,GAAG,EACH,OAAO,EACR,wBAAwB;AAIzB,KAAK,UAAU,GAAG;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAAC;CACzC,CAAC;AAUF,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,OAAO,CAAC,MAAM,EAAE,CAAC;;IAG7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAQ;IAE7B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAQ;gBAEf,WAAW,GAAE,MAAM,EAAO;IAUhC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI9B,WAAW,CAAC,WAAW,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD,WAAW,CAAC,WAAW,SAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAc5C,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAO7B,eAAe,CACnB,OAAO,EAAE,GAAG,EACZ,WAAW,EAAE,gBAAgB,EAC7B,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAOtB,wBAAwB,CAC5B,OAAO,EAAE,GAAG,EACZ,aAAa,EAAE,oBAAoB,EACnC,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,MAAM,CAAC;IAMZ,WAAW,CACf,OAAO,EAAE,GAAG,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI;;;KAAkD,GACrD,OAAO,CAAC,MAAM,CAAC;IAmBZ,mBAAmB,CACvB,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,GAAG,EACX,IAAI;;KAA2B,GAC9B,OAAO,CAAC,MAAM,CAAC;IAMZ,cAAc,CAClB,WAAW,EAAE,GAAG,EAChB,aAAa,EAAE,oBAAoB,GAClC,OAAO,CAAC,MAAM,CAAC;IAOZ,aAAa,CACjB,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,GAAG,EACd,IAAI,GAAE,UAAiD,GACtD,OAAO,CAAC,MAAM,CAAC;IAaZ,sBAAsB,CAC1B,WAAW,EAAE,GAAG,EAChB,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC,MAAM,CAAC;IAkBZ,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAY5D,aAAa,CACjB,OAAO,EAAE,GAAG,EACZ,IAAI;;KAA2B,GAC9B,OAAO,CAAC,MAAM,CAAC;IAKlB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CA4CrC"}
@@ -1,5 +1,5 @@
1
1
  import { TypedTransaction } from "@ethereumjs/tx";
2
- import { SignTypedDataVersion } from "@metamask/eth-sig-util";
2
+ import { EIP7702Authorization, SignTypedDataVersion } from "@metamask/eth-sig-util";
3
3
  import { Eip1024EncryptedData, Hex, Keyring } from "@metamask/utils";
4
4
  type KeyringOpt = {
5
5
  withAppKeyOrigin?: string;
@@ -15,6 +15,7 @@ export default class SimpleKeyring implements Keyring<string[]> {
15
15
  addAccounts(numAccounts?: number): Promise<Hex[]>;
16
16
  getAccounts(): Promise<Hex[]>;
17
17
  signTransaction(address: Hex, transaction: TypedTransaction, opts?: KeyringOpt): Promise<TypedTransaction>;
18
+ signEip7702Authorization(address: Hex, authorization: EIP7702Authorization, opts?: KeyringOpt): Promise<string>;
18
19
  signMessage(address: Hex, data: string, opts?: {
19
20
  withAppKeyOrigin: string;
20
21
  validateMessage: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"simple-keyring.d.mts","sourceRoot":"","sources":["../src/simple-keyring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB;AAWlD,OAAO,EAOL,oBAAoB,EACrB,+BAA+B;AAChC,OAAO,EAAS,oBAAoB,EAAE,GAAG,EAAE,OAAO,EAAE,wBAAwB;AAI5E,KAAK,UAAU,GAAG;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAAC;CACzC,CAAC;AAUF,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,OAAO,CAAC,MAAM,EAAE,CAAC;;IAG7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAQ;IAE7B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAQ;gBAEf,WAAW,GAAE,MAAM,EAAO;IAUhC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI9B,WAAW,CAAC,WAAW,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD,WAAW,CAAC,WAAW,SAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAc5C,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAM7B,eAAe,CACnB,OAAO,EAAE,GAAG,EACZ,WAAW,EAAE,gBAAgB,EAC7B,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAQtB,WAAW,CACf,OAAO,EAAE,GAAG,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI;;;KAAkD,GACrD,OAAO,CAAC,MAAM,CAAC;IAeZ,mBAAmB,CACvB,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,GAAG,EACX,IAAI;;KAA2B,GAC9B,OAAO,CAAC,MAAM,CAAC;IAMZ,cAAc,CAClB,WAAW,EAAE,GAAG,EAChB,aAAa,EAAE,oBAAoB,GAClC,OAAO,CAAC,MAAM,CAAC;IAOZ,aAAa,CACjB,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,GAAG,EACd,IAAI,GAAE,UAAiD,GACtD,OAAO,CAAC,MAAM,CAAC;IAaZ,sBAAsB,CAC1B,WAAW,EAAE,GAAG,EAChB,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC,MAAM,CAAC;IAkBZ,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAY5D,aAAa,CACjB,OAAO,EAAE,GAAG,EACZ,IAAI;;KAA2B,GAC9B,OAAO,CAAC,MAAM,CAAC;IAKlB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAyCrC"}
1
+ {"version":3,"file":"simple-keyring.d.mts","sourceRoot":"","sources":["../src/simple-keyring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB;AAQlD,OAAO,EAGL,oBAAoB,EAMpB,oBAAoB,EACrB,+BAA+B;AAChC,OAAO,EAIL,oBAAoB,EACpB,GAAG,EACH,OAAO,EACR,wBAAwB;AAIzB,KAAK,UAAU,GAAG;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAAC;CACzC,CAAC;AAUF,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,OAAO,CAAC,MAAM,EAAE,CAAC;;IAG7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAQ;IAE7B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAQ;gBAEf,WAAW,GAAE,MAAM,EAAO;IAUhC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI9B,WAAW,CAAC,WAAW,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD,WAAW,CAAC,WAAW,SAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAc5C,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAO7B,eAAe,CACnB,OAAO,EAAE,GAAG,EACZ,WAAW,EAAE,gBAAgB,EAC7B,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAOtB,wBAAwB,CAC5B,OAAO,EAAE,GAAG,EACZ,aAAa,EAAE,oBAAoB,EACnC,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,MAAM,CAAC;IAMZ,WAAW,CACf,OAAO,EAAE,GAAG,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI;;;KAAkD,GACrD,OAAO,CAAC,MAAM,CAAC;IAmBZ,mBAAmB,CACvB,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,GAAG,EACX,IAAI;;KAA2B,GAC9B,OAAO,CAAC,MAAM,CAAC;IAMZ,cAAc,CAClB,WAAW,EAAE,GAAG,EAChB,aAAa,EAAE,oBAAoB,GAClC,OAAO,CAAC,MAAM,CAAC;IAOZ,aAAa,CACjB,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,GAAG,EACd,IAAI,GAAE,UAAiD,GACtD,OAAO,CAAC,MAAM,CAAC;IAaZ,sBAAsB,CAC1B,WAAW,EAAE,GAAG,EAChB,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC,MAAM,CAAC;IAkBZ,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAY5D,aAAa,CACjB,OAAO,EAAE,GAAG,EACZ,IAAI;;KAA2B,GAC9B,OAAO,CAAC,MAAM,CAAC;IAKlB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CA4CrC"}
@@ -16,11 +16,12 @@ function $importDefault(module) {
16
16
  }
17
17
  return module;
18
18
  }
19
- import $ethereumjstx from "@ethereumjs/tx";
20
- const { TypedTransaction } = $ethereumjstx;
21
- import { arrToBufArr, bufferToHex, ecsign, isValidPrivate, privateToPublic, publicToAddress, stripHexPrefix, toBuffer } from "@ethereumjs/util";
22
- import { concatSig, decrypt, getEncryptionPublicKey, normalize, personalSign, signTypedData, SignTypedDataVersion } from "@metamask/eth-sig-util";
23
- import { add0x, Eip1024EncryptedData, Hex, Keyring } from "@metamask/utils";
19
+ import { TypedTransaction } from "@ethereumjs/tx";
20
+ import { ecsign, isValidPrivate, privateToPublic, publicToAddress, stripHexPrefix } from "@ethereumjs/util";
21
+ import { concatSig, decrypt, getEncryptionPublicKey, normalize, personalSign, signEIP7702Authorization, signTypedData, SignTypedDataVersion } from "@metamask/eth-sig-util";
22
+ import $metamaskethsigutil from "@metamask/eth-sig-util";
23
+ const { EIP7702Authorization } = $metamaskethsigutil;
24
+ import { add0x, bigIntToBytes, bytesToHex, Eip1024EncryptedData, Hex, Keyring } from "@metamask/utils";
24
25
  import { keccak256 } from "ethereum-cryptography/keccak";
25
26
  import $randombytes from "randombytes";
26
27
  const randombytes = $importDefault($randombytes);
@@ -45,7 +46,7 @@ class SimpleKeyring {
45
46
  __classPrivateFieldSet(this, _SimpleKeyring_wallets, privateKeys.map((hexPrivateKey) => {
46
47
  const strippedHexPrivateKey = stripHexPrefix(hexPrivateKey);
47
48
  const privateKey = Buffer.from(strippedHexPrivateKey, 'hex');
48
- const publicKey = privateToPublic(privateKey);
49
+ const publicKey = Buffer.from(privateToPublic(privateKey));
49
50
  return { privateKey, publicKey };
50
51
  }), "f");
51
52
  }
@@ -53,22 +54,27 @@ class SimpleKeyring {
53
54
  const newWallets = [];
54
55
  for (let i = 0; i < numAccounts; i++) {
55
56
  const privateKey = generateKey();
56
- const publicKey = privateToPublic(privateKey);
57
+ const publicKey = Buffer.from(privateToPublic(privateKey));
57
58
  newWallets.push({ privateKey, publicKey });
58
59
  }
59
60
  __classPrivateFieldSet(this, _SimpleKeyring_wallets, __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").concat(newWallets), "f");
60
- const hexWallets = newWallets.map(({ publicKey }) => add0x(bufferToHex(publicToAddress(publicKey))));
61
+ const hexWallets = newWallets.map(({ publicKey }) => add0x(bytesToHex(publicToAddress(publicKey))));
61
62
  return hexWallets;
62
63
  }
63
64
  async getAccounts() {
64
- return __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").map(({ publicKey }) => add0x(bufferToHex(publicToAddress(publicKey))));
65
+ return __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").map(({ publicKey }) => add0x(bytesToHex(publicToAddress(publicKey))));
65
66
  }
67
+ // @ts-expect-error Update utils package
66
68
  async signTransaction(address, transaction, opts = {}) {
67
69
  const privKey = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getPrivateKeyFor).call(this, address, opts);
68
70
  const signedTx = transaction.sign(privKey);
69
71
  // Newer versions of Ethereumjs-tx are immutable and return a new tx object
70
72
  return signedTx ?? transaction;
71
73
  }
74
+ async signEip7702Authorization(address, authorization, opts = {}) {
75
+ const privateKey = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getPrivateKeyFor).call(this, address, opts);
76
+ return signEIP7702Authorization({ privateKey, authorization });
77
+ }
72
78
  // For eth_sign, we need to sign arbitrary data:
73
79
  async signMessage(address, data, opts = { withAppKeyOrigin: '', validateMessage: true }) {
74
80
  const message = stripHexPrefix(data);
@@ -78,7 +84,7 @@ class SimpleKeyring {
78
84
  }
79
85
  const privKey = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getPrivateKeyFor).call(this, address, opts);
80
86
  const msgSig = ecsign(Buffer.from(message, 'hex'), privKey);
81
- const rawMsgSig = concatSig(toBuffer(msgSig.v), msgSig.r, msgSig.s);
87
+ const rawMsgSig = concatSig(Buffer.from(bigIntToBytes(msgSig.v)), Buffer.from(msgSig.r), Buffer.from(msgSig.s));
82
88
  return rawMsgSig;
83
89
  }
84
90
  // For personal_sign, we need to prefix the message:
@@ -116,7 +122,7 @@ class SimpleKeyring {
116
122
  const wallet = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getWalletForAccount).call(this, address, {
117
123
  withAppKeyOrigin: origin,
118
124
  });
119
- const appKeyAddress = add0x(bufferToHex(publicToAddress(wallet.publicKey)));
125
+ const appKeyAddress = add0x(bytesToHex(publicToAddress(wallet.publicKey)));
120
126
  return appKeyAddress;
121
127
  }
122
128
  // exportAccount should return a hex-encoded private key:
@@ -126,11 +132,11 @@ class SimpleKeyring {
126
132
  }
127
133
  removeAccount(address) {
128
134
  if (!__classPrivateFieldGet(this, _SimpleKeyring_wallets, "f")
129
- .map(({ publicKey }) => bufferToHex(publicToAddress(publicKey)).toLowerCase())
135
+ .map(({ publicKey }) => bytesToHex(publicToAddress(publicKey)).toLowerCase())
130
136
  .includes(address.toLowerCase())) {
131
137
  throw new Error(`Address ${address} not found in this keyring`);
132
138
  }
133
- __classPrivateFieldSet(this, _SimpleKeyring_wallets, __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").filter(({ publicKey }) => bufferToHex(publicToAddress(publicKey)).toLowerCase() !==
139
+ __classPrivateFieldSet(this, _SimpleKeyring_wallets, __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").filter(({ publicKey }) => bytesToHex(publicToAddress(publicKey)).toLowerCase() !==
134
140
  address.toLowerCase()), "f");
135
141
  }
136
142
  }
@@ -142,7 +148,7 @@ _SimpleKeyring_wallets = new WeakMap(), _SimpleKeyring_instances = new WeakSet()
142
148
  return wallet.privateKey;
143
149
  }, _SimpleKeyring_getWalletForAccount = function _SimpleKeyring_getWalletForAccount(account, opts = {}) {
144
150
  const address = normalize(account);
145
- let wallet = __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").find(({ publicKey }) => bufferToHex(publicToAddress(publicKey)) === address);
151
+ let wallet = __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").find(({ publicKey }) => bytesToHex(publicToAddress(publicKey)) === address);
146
152
  if (!wallet) {
147
153
  throw new Error('Simple Keyring - Unable to find matching address.');
148
154
  }
@@ -150,9 +156,12 @@ _SimpleKeyring_wallets = new WeakMap(), _SimpleKeyring_instances = new WeakSet()
150
156
  const { privateKey } = wallet;
151
157
  const appKeyOriginBuffer = Buffer.from(opts.withAppKeyOrigin, 'utf8');
152
158
  const appKeyBuffer = Buffer.concat([privateKey, appKeyOriginBuffer]);
153
- const appKeyPrivateKey = arrToBufArr(keccak256(appKeyBuffer));
159
+ const appKeyPrivateKey = keccak256(appKeyBuffer);
154
160
  const appKeyPublicKey = privateToPublic(appKeyPrivateKey);
155
- wallet = { privateKey: appKeyPrivateKey, publicKey: appKeyPublicKey };
161
+ wallet = {
162
+ privateKey: Buffer.from(appKeyPrivateKey),
163
+ publicKey: Buffer.from(appKeyPublicKey),
164
+ };
156
165
  }
157
166
  return wallet;
158
167
  };
@@ -1 +1 @@
1
- {"version":3,"file":"simple-keyring.mjs","sourceRoot":"","sources":["../src/simple-keyring.ts"],"names":[],"mappings":"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","sourcesContent":["import { TypedTransaction } from '@ethereumjs/tx';\nimport {\n arrToBufArr,\n bufferToHex,\n ecsign,\n isValidPrivate,\n privateToPublic,\n publicToAddress,\n stripHexPrefix,\n toBuffer,\n} from '@ethereumjs/util';\nimport {\n concatSig,\n decrypt,\n getEncryptionPublicKey,\n normalize,\n personalSign,\n signTypedData,\n SignTypedDataVersion,\n} from '@metamask/eth-sig-util';\nimport { add0x, Eip1024EncryptedData, Hex, Keyring } from '@metamask/utils';\nimport { keccak256 } from 'ethereum-cryptography/keccak';\nimport randombytes from 'randombytes';\n\ntype KeyringOpt = {\n withAppKeyOrigin?: string;\n version?: SignTypedDataVersion | string;\n};\n\ntype Wallet = {\n privateKey: Buffer;\n publicKey: Buffer;\n};\n\nconst TYPE = 'Simple Key Pair';\n\n// FIXME: This should not be exported as default.\nexport default class SimpleKeyring implements Keyring<string[]> {\n #wallets: { privateKey: Buffer; publicKey: Buffer }[];\n\n readonly type: string = TYPE;\n\n static type: string = TYPE;\n\n constructor(privateKeys: string[] = []) {\n this.#wallets = [];\n\n /* istanbul ignore next: It's not possible to write a unit test for this, because a constructor isn't allowed\n * to be async. Jest can't await the constructor, and when the error gets thrown, Jest can't catch it. */\n this.deserialize(privateKeys).catch((error: Error) => {\n throw new Error(`Problem deserializing SimpleKeyring ${error.message}`);\n });\n }\n\n async serialize(): Promise<string[]> {\n return this.#wallets.map((a) => a.privateKey.toString('hex'));\n }\n\n async deserialize(privateKeys: string[] = []): Promise<void> {\n this.#wallets = privateKeys.map((hexPrivateKey) => {\n const strippedHexPrivateKey = stripHexPrefix(hexPrivateKey);\n const privateKey = Buffer.from(strippedHexPrivateKey, 'hex');\n const publicKey = privateToPublic(privateKey);\n return { privateKey, publicKey };\n });\n }\n\n async addAccounts(numAccounts = 1): Promise<Hex[]> {\n const newWallets = [];\n for (let i = 0; i < numAccounts; i++) {\n const privateKey = generateKey();\n const publicKey = privateToPublic(privateKey);\n newWallets.push({ privateKey, publicKey });\n }\n this.#wallets = this.#wallets.concat(newWallets);\n const hexWallets = newWallets.map(({ publicKey }) =>\n add0x(bufferToHex(publicToAddress(publicKey))),\n );\n return hexWallets;\n }\n\n async getAccounts(): Promise<Hex[]> {\n return this.#wallets.map(({ publicKey }) =>\n add0x(bufferToHex(publicToAddress(publicKey))),\n );\n }\n\n async signTransaction(\n address: Hex,\n transaction: TypedTransaction,\n opts: KeyringOpt = {},\n ): Promise<TypedTransaction> {\n const privKey = this.#getPrivateKeyFor(address, opts);\n const signedTx = transaction.sign(privKey);\n // Newer versions of Ethereumjs-tx are immutable and return a new tx object\n return signedTx ?? transaction;\n }\n\n // For eth_sign, we need to sign arbitrary data:\n async signMessage(\n address: Hex,\n data: string,\n opts = { withAppKeyOrigin: '', validateMessage: true },\n ): Promise<string> {\n const message = stripHexPrefix(data);\n if (\n opts.validateMessage &&\n (message.length === 0 || !message.match(/^[a-fA-F0-9]*$/u))\n ) {\n throw new Error('Cannot sign invalid message');\n }\n const privKey = this.#getPrivateKeyFor(address, opts);\n const msgSig = ecsign(Buffer.from(message, 'hex'), privKey);\n const rawMsgSig = concatSig(toBuffer(msgSig.v), msgSig.r, msgSig.s);\n return rawMsgSig;\n }\n\n // For personal_sign, we need to prefix the message:\n async signPersonalMessage(\n address: Hex,\n msgHex: Hex,\n opts = { withAppKeyOrigin: '' },\n ): Promise<string> {\n const privKey = this.#getPrivateKeyFor(address, opts);\n return personalSign({ privateKey: privKey, data: msgHex });\n }\n\n // For eth_decryptMessage:\n async decryptMessage(\n withAccount: Hex,\n encryptedData: Eip1024EncryptedData,\n ): Promise<string> {\n const wallet = this.#getWalletForAccount(withAccount);\n const privateKey = wallet.privateKey.toString('hex');\n return decrypt({ privateKey, encryptedData });\n }\n\n // personal_signTypedData, signs data along with the schema\n async signTypedData(\n address: Hex,\n typedData: any,\n opts: KeyringOpt = { version: SignTypedDataVersion.V1 },\n ): Promise<string> {\n // Treat invalid versions as \"V1\"\n let version = SignTypedDataVersion.V1;\n\n if (opts.version && isSignTypedDataVersion(opts.version)) {\n version = SignTypedDataVersion[opts.version];\n }\n\n const privateKey = this.#getPrivateKeyFor(address, opts);\n return signTypedData({ privateKey, data: typedData, version });\n }\n\n // get public key for nacl\n async getEncryptionPublicKey(\n withAccount: Hex,\n opts?: KeyringOpt,\n ): Promise<string> {\n const privKey = this.#getPrivateKeyFor(withAccount, opts);\n const publicKey = getEncryptionPublicKey(privKey.toString('hex'));\n return publicKey;\n }\n\n #getPrivateKeyFor(\n address: Hex,\n opts: KeyringOpt = { withAppKeyOrigin: '' },\n ): Buffer {\n if (!address) {\n throw new Error('Must specify address.');\n }\n const wallet = this.#getWalletForAccount(address, opts);\n return wallet.privateKey;\n }\n\n // returns an address specific to an app\n async getAppKeyAddress(address: Hex, origin: string): Promise<Hex> {\n if (!origin || typeof origin !== 'string') {\n throw new Error(`'origin' must be a non-empty string`);\n }\n const wallet = this.#getWalletForAccount(address, {\n withAppKeyOrigin: origin,\n });\n const appKeyAddress = add0x(bufferToHex(publicToAddress(wallet.publicKey)));\n return appKeyAddress;\n }\n\n // exportAccount should return a hex-encoded private key:\n async exportAccount(\n address: Hex,\n opts = { withAppKeyOrigin: '' },\n ): Promise<string> {\n const wallet = this.#getWalletForAccount(address, opts);\n return wallet.privateKey.toString('hex');\n }\n\n removeAccount(address: string): void {\n if (\n !this.#wallets\n .map(({ publicKey }) =>\n bufferToHex(publicToAddress(publicKey)).toLowerCase(),\n )\n .includes(address.toLowerCase())\n ) {\n throw new Error(`Address ${address} not found in this keyring`);\n }\n\n this.#wallets = this.#wallets.filter(\n ({ publicKey }) =>\n bufferToHex(publicToAddress(publicKey)).toLowerCase() !==\n address.toLowerCase(),\n );\n }\n\n #getWalletForAccount(\n account: string | number,\n opts: KeyringOpt = {},\n ): Wallet {\n const address = normalize(account);\n let wallet = this.#wallets.find(\n ({ publicKey }) => bufferToHex(publicToAddress(publicKey)) === address,\n );\n if (!wallet) {\n throw new Error('Simple Keyring - Unable to find matching address.');\n }\n\n if (opts.withAppKeyOrigin) {\n const { privateKey } = wallet;\n const appKeyOriginBuffer = Buffer.from(opts.withAppKeyOrigin, 'utf8');\n const appKeyBuffer = Buffer.concat([privateKey, appKeyOriginBuffer]);\n const appKeyPrivateKey = arrToBufArr(keccak256(appKeyBuffer));\n const appKeyPublicKey = privateToPublic(appKeyPrivateKey);\n wallet = { privateKey: appKeyPrivateKey, publicKey: appKeyPublicKey };\n }\n\n return wallet;\n }\n}\n\n/**\n * Generate and validate a new random key of 32 bytes.\n *\n * @returns Buffer The generated key.\n */\nfunction generateKey(): Buffer {\n const privateKey = randombytes(32);\n\n if (!isValidPrivate(privateKey)) {\n throw new Error(\n 'Private key does not satisfy the curve requirements (ie. it is invalid)',\n );\n }\n return privateKey;\n}\n\n/**\n * Type predicate type guard to check if a string is in the enum SignTypedDataVersion.\n *\n * @param version - The string to check.\n * @returns Whether it's in the enum.\n */\n// TODO: Put this in @metamask/eth-sig-util\nfunction isSignTypedDataVersion(\n version: SignTypedDataVersion | string,\n): version is SignTypedDataVersion {\n return version in SignTypedDataVersion;\n}\n"]}
1
+ {"version":3,"file":"simple-keyring.mjs","sourceRoot":"","sources":["../src/simple-keyring.ts"],"names":[],"mappings":"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","sourcesContent":["import { TypedTransaction } from '@ethereumjs/tx';\nimport {\n ecsign,\n isValidPrivate,\n privateToPublic,\n publicToAddress,\n stripHexPrefix,\n} from '@ethereumjs/util';\nimport {\n concatSig,\n decrypt,\n EIP7702Authorization,\n getEncryptionPublicKey,\n normalize,\n personalSign,\n signEIP7702Authorization,\n signTypedData,\n SignTypedDataVersion,\n} from '@metamask/eth-sig-util';\nimport {\n add0x,\n bigIntToBytes,\n bytesToHex,\n Eip1024EncryptedData,\n Hex,\n Keyring,\n} from '@metamask/utils';\nimport { keccak256 } from 'ethereum-cryptography/keccak';\nimport randombytes from 'randombytes';\n\ntype KeyringOpt = {\n withAppKeyOrigin?: string;\n version?: SignTypedDataVersion | string;\n};\n\ntype Wallet = {\n privateKey: Buffer;\n publicKey: Buffer;\n};\n\nconst TYPE = 'Simple Key Pair';\n\n// FIXME: This should not be exported as default.\nexport default class SimpleKeyring implements Keyring<string[]> {\n #wallets: { privateKey: Buffer; publicKey: Buffer }[];\n\n readonly type: string = TYPE;\n\n static type: string = TYPE;\n\n constructor(privateKeys: string[] = []) {\n this.#wallets = [];\n\n /* istanbul ignore next: It's not possible to write a unit test for this, because a constructor isn't allowed\n * to be async. Jest can't await the constructor, and when the error gets thrown, Jest can't catch it. */\n this.deserialize(privateKeys).catch((error: Error) => {\n throw new Error(`Problem deserializing SimpleKeyring ${error.message}`);\n });\n }\n\n async serialize(): Promise<string[]> {\n return this.#wallets.map((a) => a.privateKey.toString('hex'));\n }\n\n async deserialize(privateKeys: string[] = []): Promise<void> {\n this.#wallets = privateKeys.map((hexPrivateKey) => {\n const strippedHexPrivateKey = stripHexPrefix(hexPrivateKey);\n const privateKey = Buffer.from(strippedHexPrivateKey, 'hex');\n const publicKey = Buffer.from(privateToPublic(privateKey));\n return { privateKey, publicKey };\n });\n }\n\n async addAccounts(numAccounts = 1): Promise<Hex[]> {\n const newWallets = [];\n for (let i = 0; i < numAccounts; i++) {\n const privateKey = generateKey();\n const publicKey = Buffer.from(privateToPublic(privateKey));\n newWallets.push({ privateKey, publicKey });\n }\n this.#wallets = this.#wallets.concat(newWallets);\n const hexWallets = newWallets.map(({ publicKey }) =>\n add0x(bytesToHex(publicToAddress(publicKey))),\n );\n return hexWallets;\n }\n\n async getAccounts(): Promise<Hex[]> {\n return this.#wallets.map(({ publicKey }) =>\n add0x(bytesToHex(publicToAddress(publicKey))),\n );\n }\n\n // @ts-expect-error Update utils package\n async signTransaction(\n address: Hex,\n transaction: TypedTransaction,\n opts: KeyringOpt = {},\n ): Promise<TypedTransaction> {\n const privKey = this.#getPrivateKeyFor(address, opts);\n const signedTx = transaction.sign(privKey);\n // Newer versions of Ethereumjs-tx are immutable and return a new tx object\n return signedTx ?? transaction;\n }\n\n async signEip7702Authorization(\n address: Hex,\n authorization: EIP7702Authorization,\n opts: KeyringOpt = {},\n ): Promise<string> {\n const privateKey = this.#getPrivateKeyFor(address, opts);\n return signEIP7702Authorization({ privateKey, authorization });\n }\n\n // For eth_sign, we need to sign arbitrary data:\n async signMessage(\n address: Hex,\n data: string,\n opts = { withAppKeyOrigin: '', validateMessage: true },\n ): Promise<string> {\n const message = stripHexPrefix(data);\n if (\n opts.validateMessage &&\n (message.length === 0 || !message.match(/^[a-fA-F0-9]*$/u))\n ) {\n throw new Error('Cannot sign invalid message');\n }\n const privKey = this.#getPrivateKeyFor(address, opts);\n const msgSig = ecsign(Buffer.from(message, 'hex'), privKey);\n const rawMsgSig = concatSig(\n Buffer.from(bigIntToBytes(msgSig.v)),\n Buffer.from(msgSig.r),\n Buffer.from(msgSig.s),\n );\n return rawMsgSig;\n }\n\n // For personal_sign, we need to prefix the message:\n async signPersonalMessage(\n address: Hex,\n msgHex: Hex,\n opts = { withAppKeyOrigin: '' },\n ): Promise<string> {\n const privKey = this.#getPrivateKeyFor(address, opts);\n return personalSign({ privateKey: privKey, data: msgHex });\n }\n\n // For eth_decryptMessage:\n async decryptMessage(\n withAccount: Hex,\n encryptedData: Eip1024EncryptedData,\n ): Promise<string> {\n const wallet = this.#getWalletForAccount(withAccount);\n const privateKey = wallet.privateKey.toString('hex');\n return decrypt({ privateKey, encryptedData });\n }\n\n // personal_signTypedData, signs data along with the schema\n async signTypedData(\n address: Hex,\n typedData: any,\n opts: KeyringOpt = { version: SignTypedDataVersion.V1 },\n ): Promise<string> {\n // Treat invalid versions as \"V1\"\n let version = SignTypedDataVersion.V1;\n\n if (opts.version && isSignTypedDataVersion(opts.version)) {\n version = SignTypedDataVersion[opts.version];\n }\n\n const privateKey = this.#getPrivateKeyFor(address, opts);\n return signTypedData({ privateKey, data: typedData, version });\n }\n\n // get public key for nacl\n async getEncryptionPublicKey(\n withAccount: Hex,\n opts?: KeyringOpt,\n ): Promise<string> {\n const privKey = this.#getPrivateKeyFor(withAccount, opts);\n const publicKey = getEncryptionPublicKey(privKey.toString('hex'));\n return publicKey;\n }\n\n #getPrivateKeyFor(\n address: Hex,\n opts: KeyringOpt = { withAppKeyOrigin: '' },\n ): Buffer {\n if (!address) {\n throw new Error('Must specify address.');\n }\n const wallet = this.#getWalletForAccount(address, opts);\n return wallet.privateKey;\n }\n\n // returns an address specific to an app\n async getAppKeyAddress(address: Hex, origin: string): Promise<Hex> {\n if (!origin || typeof origin !== 'string') {\n throw new Error(`'origin' must be a non-empty string`);\n }\n const wallet = this.#getWalletForAccount(address, {\n withAppKeyOrigin: origin,\n });\n const appKeyAddress = add0x(bytesToHex(publicToAddress(wallet.publicKey)));\n return appKeyAddress;\n }\n\n // exportAccount should return a hex-encoded private key:\n async exportAccount(\n address: Hex,\n opts = { withAppKeyOrigin: '' },\n ): Promise<string> {\n const wallet = this.#getWalletForAccount(address, opts);\n return wallet.privateKey.toString('hex');\n }\n\n removeAccount(address: string): void {\n if (\n !this.#wallets\n .map(({ publicKey }) =>\n bytesToHex(publicToAddress(publicKey)).toLowerCase(),\n )\n .includes(address.toLowerCase())\n ) {\n throw new Error(`Address ${address} not found in this keyring`);\n }\n\n this.#wallets = this.#wallets.filter(\n ({ publicKey }) =>\n bytesToHex(publicToAddress(publicKey)).toLowerCase() !==\n address.toLowerCase(),\n );\n }\n\n #getWalletForAccount(\n account: string | number,\n opts: KeyringOpt = {},\n ): Wallet {\n const address = normalize(account);\n let wallet = this.#wallets.find(\n ({ publicKey }) => bytesToHex(publicToAddress(publicKey)) === address,\n );\n if (!wallet) {\n throw new Error('Simple Keyring - Unable to find matching address.');\n }\n\n if (opts.withAppKeyOrigin) {\n const { privateKey } = wallet;\n const appKeyOriginBuffer = Buffer.from(opts.withAppKeyOrigin, 'utf8');\n const appKeyBuffer = Buffer.concat([privateKey, appKeyOriginBuffer]);\n const appKeyPrivateKey = keccak256(appKeyBuffer);\n const appKeyPublicKey = privateToPublic(appKeyPrivateKey);\n wallet = {\n privateKey: Buffer.from(appKeyPrivateKey),\n publicKey: Buffer.from(appKeyPublicKey),\n };\n }\n\n return wallet;\n }\n}\n\n/**\n * Generate and validate a new random key of 32 bytes.\n *\n * @returns Buffer The generated key.\n */\nfunction generateKey(): Buffer {\n const privateKey = randombytes(32);\n\n if (!isValidPrivate(privateKey)) {\n throw new Error(\n 'Private key does not satisfy the curve requirements (ie. it is invalid)',\n );\n }\n return privateKey;\n}\n\n/**\n * Type predicate type guard to check if a string is in the enum SignTypedDataVersion.\n *\n * @param version - The string to check.\n * @returns Whether it's in the enum.\n */\n// TODO: Put this in @metamask/eth-sig-util\nfunction isSignTypedDataVersion(\n version: SignTypedDataVersion | string,\n): version is SignTypedDataVersion {\n return version in SignTypedDataVersion;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/eth-simple-keyring",
3
- "version": "8.0.1-fb72e65",
3
+ "version": "8.1.0-44b05d1",
4
4
  "description": "A simple standard interface for a series of Ethereum private keys.",
5
5
  "keywords": [
6
6
  "ethereum",
@@ -44,14 +44,14 @@
44
44
  "test:watch": "jest --watch"
45
45
  },
46
46
  "dependencies": {
47
- "@ethereumjs/util": "^8.1.0",
48
- "@metamask/eth-sig-util": "^8.0.0",
49
- "@metamask/utils": "^9.3.0",
47
+ "@ethereumjs/util": "^9.1.0",
48
+ "@metamask/eth-sig-util": "^8.2.0",
49
+ "@metamask/utils": "^11.1.0",
50
50
  "ethereum-cryptography": "^2.1.2",
51
51
  "randombytes": "^2.1.0"
52
52
  },
53
53
  "devDependencies": {
54
- "@ethereumjs/tx": "^4.2.0",
54
+ "@ethereumjs/tx": "^5.4.0",
55
55
  "@lavamoat/allow-scripts": "^3.2.1",
56
56
  "@lavamoat/preinstall-always-fail": "^2.1.0",
57
57
  "@metamask/auto-changelog": "^3.4.4",