@metamask-previews/eth-simple-keyring 8.1.0-44b05d1 → 8.1.0-9ea5be4

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.
@@ -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 = Buffer.from((0, util_1.privateToPublic)(privateKey));
45
+ const publicKey = (0, util_1.privateToPublic)(privateKey);
46
46
  return { privateKey, publicKey };
47
47
  }), "f");
48
48
  }
@@ -50,17 +50,16 @@ class SimpleKeyring {
50
50
  const newWallets = [];
51
51
  for (let i = 0; i < numAccounts; i++) {
52
52
  const privateKey = generateKey();
53
- const publicKey = Buffer.from((0, util_1.privateToPublic)(privateKey));
53
+ const publicKey = (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, utils_1.bytesToHex)((0, util_1.publicToAddress)(publicKey))));
57
+ const hexWallets = newWallets.map(({ publicKey }) => (0, utils_1.add0x)((0, util_1.bufferToHex)((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, utils_1.bytesToHex)((0, util_1.publicToAddress)(publicKey))));
61
+ return __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").map(({ publicKey }) => (0, utils_1.add0x)((0, util_1.bufferToHex)((0, util_1.publicToAddress)(publicKey))));
62
62
  }
63
- // @ts-expect-error Update utils package
64
63
  async signTransaction(address, transaction, opts = {}) {
65
64
  const privKey = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getPrivateKeyFor).call(this, address, opts);
66
65
  const signedTx = transaction.sign(privKey);
@@ -80,7 +79,7 @@ class SimpleKeyring {
80
79
  }
81
80
  const privKey = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getPrivateKeyFor).call(this, address, opts);
82
81
  const msgSig = (0, util_1.ecsign)(Buffer.from(message, 'hex'), privKey);
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));
82
+ const rawMsgSig = (0, eth_sig_util_1.concatSig)((0, util_1.toBuffer)(msgSig.v), msgSig.r, msgSig.s);
84
83
  return rawMsgSig;
85
84
  }
86
85
  // For personal_sign, we need to prefix the message:
@@ -118,7 +117,7 @@ class SimpleKeyring {
118
117
  const wallet = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getWalletForAccount).call(this, address, {
119
118
  withAppKeyOrigin: origin,
120
119
  });
121
- const appKeyAddress = (0, utils_1.add0x)((0, utils_1.bytesToHex)((0, util_1.publicToAddress)(wallet.publicKey)));
120
+ const appKeyAddress = (0, utils_1.add0x)((0, util_1.bufferToHex)((0, util_1.publicToAddress)(wallet.publicKey)));
122
121
  return appKeyAddress;
123
122
  }
124
123
  // exportAccount should return a hex-encoded private key:
@@ -128,11 +127,11 @@ class SimpleKeyring {
128
127
  }
129
128
  removeAccount(address) {
130
129
  if (!__classPrivateFieldGet(this, _SimpleKeyring_wallets, "f")
131
- .map(({ publicKey }) => (0, utils_1.bytesToHex)((0, util_1.publicToAddress)(publicKey)).toLowerCase())
130
+ .map(({ publicKey }) => (0, util_1.bufferToHex)((0, util_1.publicToAddress)(publicKey)).toLowerCase())
132
131
  .includes(address.toLowerCase())) {
133
132
  throw new Error(`Address ${address} not found in this keyring`);
134
133
  }
135
- __classPrivateFieldSet(this, _SimpleKeyring_wallets, __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").filter(({ publicKey }) => (0, utils_1.bytesToHex)((0, util_1.publicToAddress)(publicKey)).toLowerCase() !==
134
+ __classPrivateFieldSet(this, _SimpleKeyring_wallets, __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").filter(({ publicKey }) => (0, util_1.bufferToHex)((0, util_1.publicToAddress)(publicKey)).toLowerCase() !==
136
135
  address.toLowerCase()), "f");
137
136
  }
138
137
  }
@@ -144,7 +143,7 @@ _SimpleKeyring_wallets = new WeakMap(), _SimpleKeyring_instances = new WeakSet()
144
143
  return wallet.privateKey;
145
144
  }, _SimpleKeyring_getWalletForAccount = function _SimpleKeyring_getWalletForAccount(account, opts = {}) {
146
145
  const address = (0, eth_sig_util_1.normalize)(account);
147
- let wallet = __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").find(({ publicKey }) => (0, utils_1.bytesToHex)((0, util_1.publicToAddress)(publicKey)) === address);
146
+ let wallet = __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").find(({ publicKey }) => (0, util_1.bufferToHex)((0, util_1.publicToAddress)(publicKey)) === address);
148
147
  if (!wallet) {
149
148
  throw new Error('Simple Keyring - Unable to find matching address.');
150
149
  }
@@ -152,12 +151,9 @@ _SimpleKeyring_wallets = new WeakMap(), _SimpleKeyring_instances = new WeakSet()
152
151
  const { privateKey } = wallet;
153
152
  const appKeyOriginBuffer = Buffer.from(opts.withAppKeyOrigin, 'utf8');
154
153
  const appKeyBuffer = Buffer.concat([privateKey, appKeyOriginBuffer]);
155
- const appKeyPrivateKey = (0, keccak_1.keccak256)(appKeyBuffer);
154
+ const appKeyPrivateKey = (0, util_1.arrToBufArr)((0, keccak_1.keccak256)(appKeyBuffer));
156
155
  const appKeyPublicKey = (0, util_1.privateToPublic)(appKeyPrivateKey);
157
- wallet = {
158
- privateKey: Buffer.from(appKeyPrivateKey),
159
- publicKey: Buffer.from(appKeyPublicKey),
160
- };
156
+ wallet = { privateKey: appKeyPrivateKey, publicKey: appKeyPublicKey };
161
157
  }
162
158
  return wallet;
163
159
  };
@@ -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 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
+ {"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 EIP7702Authorization,\n getEncryptionPublicKey,\n normalize,\n personalSign,\n signEIP7702Authorization,\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 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(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 +1 @@
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
+ {"version":3,"file":"simple-keyring.d.cts","sourceRoot":"","sources":["../src/simple-keyring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB;AAWlD,OAAO,EAGL,oBAAoB,EAMpB,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;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;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 +1 @@
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"}
1
+ {"version":3,"file":"simple-keyring.d.mts","sourceRoot":"","sources":["../src/simple-keyring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB;AAWlD,OAAO,EAGL,oBAAoB,EAMpB,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;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;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"}
@@ -16,12 +16,13 @@ function $importDefault(module) {
16
16
  }
17
17
  return module;
18
18
  }
19
- import { TypedTransaction } from "@ethereumjs/tx";
20
- import { ecsign, isValidPrivate, privateToPublic, publicToAddress, stripHexPrefix } from "@ethereumjs/util";
19
+ import $ethereumjstx from "@ethereumjs/tx";
20
+ const { TypedTransaction } = $ethereumjstx;
21
+ import { arrToBufArr, bufferToHex, ecsign, isValidPrivate, privateToPublic, publicToAddress, stripHexPrefix, toBuffer } from "@ethereumjs/util";
21
22
  import { concatSig, decrypt, getEncryptionPublicKey, normalize, personalSign, signEIP7702Authorization, signTypedData, SignTypedDataVersion } from "@metamask/eth-sig-util";
22
23
  import $metamaskethsigutil from "@metamask/eth-sig-util";
23
24
  const { EIP7702Authorization } = $metamaskethsigutil;
24
- import { add0x, bigIntToBytes, bytesToHex, Eip1024EncryptedData, Hex, Keyring } from "@metamask/utils";
25
+ import { add0x, Eip1024EncryptedData, Hex, Keyring } from "@metamask/utils";
25
26
  import { keccak256 } from "ethereum-cryptography/keccak";
26
27
  import $randombytes from "randombytes";
27
28
  const randombytes = $importDefault($randombytes);
@@ -46,7 +47,7 @@ class SimpleKeyring {
46
47
  __classPrivateFieldSet(this, _SimpleKeyring_wallets, privateKeys.map((hexPrivateKey) => {
47
48
  const strippedHexPrivateKey = stripHexPrefix(hexPrivateKey);
48
49
  const privateKey = Buffer.from(strippedHexPrivateKey, 'hex');
49
- const publicKey = Buffer.from(privateToPublic(privateKey));
50
+ const publicKey = privateToPublic(privateKey);
50
51
  return { privateKey, publicKey };
51
52
  }), "f");
52
53
  }
@@ -54,17 +55,16 @@ class SimpleKeyring {
54
55
  const newWallets = [];
55
56
  for (let i = 0; i < numAccounts; i++) {
56
57
  const privateKey = generateKey();
57
- const publicKey = Buffer.from(privateToPublic(privateKey));
58
+ const publicKey = privateToPublic(privateKey);
58
59
  newWallets.push({ privateKey, publicKey });
59
60
  }
60
61
  __classPrivateFieldSet(this, _SimpleKeyring_wallets, __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").concat(newWallets), "f");
61
- const hexWallets = newWallets.map(({ publicKey }) => add0x(bytesToHex(publicToAddress(publicKey))));
62
+ const hexWallets = newWallets.map(({ publicKey }) => add0x(bufferToHex(publicToAddress(publicKey))));
62
63
  return hexWallets;
63
64
  }
64
65
  async getAccounts() {
65
- return __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").map(({ publicKey }) => add0x(bytesToHex(publicToAddress(publicKey))));
66
+ return __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").map(({ publicKey }) => add0x(bufferToHex(publicToAddress(publicKey))));
66
67
  }
67
- // @ts-expect-error Update utils package
68
68
  async signTransaction(address, transaction, opts = {}) {
69
69
  const privKey = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getPrivateKeyFor).call(this, address, opts);
70
70
  const signedTx = transaction.sign(privKey);
@@ -84,7 +84,7 @@ class SimpleKeyring {
84
84
  }
85
85
  const privKey = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getPrivateKeyFor).call(this, address, opts);
86
86
  const msgSig = ecsign(Buffer.from(message, 'hex'), privKey);
87
- const rawMsgSig = concatSig(Buffer.from(bigIntToBytes(msgSig.v)), Buffer.from(msgSig.r), Buffer.from(msgSig.s));
87
+ const rawMsgSig = concatSig(toBuffer(msgSig.v), msgSig.r, msgSig.s);
88
88
  return rawMsgSig;
89
89
  }
90
90
  // For personal_sign, we need to prefix the message:
@@ -122,7 +122,7 @@ class SimpleKeyring {
122
122
  const wallet = __classPrivateFieldGet(this, _SimpleKeyring_instances, "m", _SimpleKeyring_getWalletForAccount).call(this, address, {
123
123
  withAppKeyOrigin: origin,
124
124
  });
125
- const appKeyAddress = add0x(bytesToHex(publicToAddress(wallet.publicKey)));
125
+ const appKeyAddress = add0x(bufferToHex(publicToAddress(wallet.publicKey)));
126
126
  return appKeyAddress;
127
127
  }
128
128
  // exportAccount should return a hex-encoded private key:
@@ -132,11 +132,11 @@ class SimpleKeyring {
132
132
  }
133
133
  removeAccount(address) {
134
134
  if (!__classPrivateFieldGet(this, _SimpleKeyring_wallets, "f")
135
- .map(({ publicKey }) => bytesToHex(publicToAddress(publicKey)).toLowerCase())
135
+ .map(({ publicKey }) => bufferToHex(publicToAddress(publicKey)).toLowerCase())
136
136
  .includes(address.toLowerCase())) {
137
137
  throw new Error(`Address ${address} not found in this keyring`);
138
138
  }
139
- __classPrivateFieldSet(this, _SimpleKeyring_wallets, __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").filter(({ publicKey }) => bytesToHex(publicToAddress(publicKey)).toLowerCase() !==
139
+ __classPrivateFieldSet(this, _SimpleKeyring_wallets, __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").filter(({ publicKey }) => bufferToHex(publicToAddress(publicKey)).toLowerCase() !==
140
140
  address.toLowerCase()), "f");
141
141
  }
142
142
  }
@@ -148,7 +148,7 @@ _SimpleKeyring_wallets = new WeakMap(), _SimpleKeyring_instances = new WeakSet()
148
148
  return wallet.privateKey;
149
149
  }, _SimpleKeyring_getWalletForAccount = function _SimpleKeyring_getWalletForAccount(account, opts = {}) {
150
150
  const address = normalize(account);
151
- let wallet = __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").find(({ publicKey }) => bytesToHex(publicToAddress(publicKey)) === address);
151
+ let wallet = __classPrivateFieldGet(this, _SimpleKeyring_wallets, "f").find(({ publicKey }) => bufferToHex(publicToAddress(publicKey)) === address);
152
152
  if (!wallet) {
153
153
  throw new Error('Simple Keyring - Unable to find matching address.');
154
154
  }
@@ -156,12 +156,9 @@ _SimpleKeyring_wallets = new WeakMap(), _SimpleKeyring_instances = new WeakSet()
156
156
  const { privateKey } = wallet;
157
157
  const appKeyOriginBuffer = Buffer.from(opts.withAppKeyOrigin, 'utf8');
158
158
  const appKeyBuffer = Buffer.concat([privateKey, appKeyOriginBuffer]);
159
- const appKeyPrivateKey = keccak256(appKeyBuffer);
159
+ const appKeyPrivateKey = arrToBufArr(keccak256(appKeyBuffer));
160
160
  const appKeyPublicKey = privateToPublic(appKeyPrivateKey);
161
- wallet = {
162
- privateKey: Buffer.from(appKeyPrivateKey),
163
- publicKey: Buffer.from(appKeyPublicKey),
164
- };
161
+ wallet = { privateKey: appKeyPrivateKey, publicKey: appKeyPublicKey };
165
162
  }
166
163
  return wallet;
167
164
  };
@@ -1 +1 @@
1
- {"version":3,"file":"simple-keyring.mjs","sourceRoot":"","sources":["../src/simple-keyring.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB;AAClD,OAAO,EACL,MAAM,EACN,cAAc,EACd,eAAe,EACf,eAAe,EACf,cAAc,EACf,yBAAyB;;;;AAY1B,OAAO,EACL,KAAK,EACL,aAAa,EACb,UAAU,EACV,oBAAoB,EACpB,GAAG,EACH,OAAO,EACR,wBAAwB;AACzB,OAAO,EAAE,SAAS,EAAE,qCAAqC;AACzD,OAAO,YAAW,oBAAoB;;AAYtC,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAE/B,iDAAiD;AACjD,MAAqB,aAAa;IAOhC,YAAY,cAAwB,EAAE;;QANtC,yCAAsD;QAE7C,SAAI,GAAW,IAAI,CAAC;QAK3B,uBAAA,IAAI,0BAAY,EAAE,MAAA,CAAC;QAEnB;iHACyG;QACzG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE;YACnD,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,uBAAA,IAAI,8BAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,cAAwB,EAAE;QAC1C,uBAAA,IAAI,0BAAY,WAAW,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE;YAChD,MAAM,qBAAqB,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;YAC3D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QACnC,CAAC,CAAC,MAAA,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAW,GAAG,CAAC;QAC/B,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,UAAU,GAAG,WAAW,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;YAC3D,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,uBAAA,IAAI,0BAAY,uBAAA,IAAI,8BAAS,CAAC,MAAM,CAAC,UAAU,CAAC,MAAA,CAAC;QACjD,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAClD,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAC9C,CAAC;QACF,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,uBAAA,IAAI,8BAAS,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CACzC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAC9C,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,eAAe,CACnB,OAAY,EACZ,WAA6B,EAC7B,OAAmB,EAAE;QAErB,MAAM,OAAO,GAAG,uBAAA,IAAI,iEAAkB,MAAtB,IAAI,EAAmB,OAAO,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,2EAA2E;QAC3E,OAAO,QAAQ,IAAI,WAAW,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC5B,OAAY,EACZ,aAAmC,EACnC,OAAmB,EAAE;QAErB,MAAM,UAAU,GAAG,uBAAA,IAAI,iEAAkB,MAAtB,IAAI,EAAmB,OAAO,EAAE,IAAI,CAAC,CAAC;QACzD,OAAO,wBAAwB,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,gDAAgD;IAChD,KAAK,CAAC,WAAW,CACf,OAAY,EACZ,IAAY,EACZ,IAAI,GAAG,EAAE,gBAAgB,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;QAEtD,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACrC,IACE,IAAI,CAAC,eAAe;YACpB,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAC3D,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,OAAO,GAAG,uBAAA,IAAI,iEAAkB,MAAtB,IAAI,EAAmB,OAAO,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,SAAS,CACzB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EACpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EACrB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CACtB,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,mBAAmB,CACvB,OAAY,EACZ,MAAW,EACX,IAAI,GAAG,EAAE,gBAAgB,EAAE,EAAE,EAAE;QAE/B,MAAM,OAAO,GAAG,uBAAA,IAAI,iEAAkB,MAAtB,IAAI,EAAmB,OAAO,EAAE,IAAI,CAAC,CAAC;QACtD,OAAO,YAAY,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,0BAA0B;IAC1B,KAAK,CAAC,cAAc,CAClB,WAAgB,EAChB,aAAmC;QAEnC,MAAM,MAAM,GAAG,uBAAA,IAAI,oEAAqB,MAAzB,IAAI,EAAsB,WAAW,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,aAAa,CACjB,OAAY,EACZ,SAAc,EACd,OAAmB,EAAE,OAAO,EAAE,oBAAoB,CAAC,EAAE,EAAE;QAEvD,iCAAiC;QACjC,IAAI,OAAO,GAAG,oBAAoB,CAAC,EAAE,CAAC;QAEtC,IAAI,IAAI,CAAC,OAAO,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,UAAU,GAAG,uBAAA,IAAI,iEAAkB,MAAtB,IAAI,EAAmB,OAAO,EAAE,IAAI,CAAC,CAAC;QACzD,OAAO,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,0BAA0B;IAC1B,KAAK,CAAC,sBAAsB,CAC1B,WAAgB,EAChB,IAAiB;QAEjB,MAAM,OAAO,GAAG,uBAAA,IAAI,iEAAkB,MAAtB,IAAI,EAAmB,WAAW,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IAaD,wCAAwC;IACxC,KAAK,CAAC,gBAAgB,CAAC,OAAY,EAAE,MAAc;QACjD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,MAAM,GAAG,uBAAA,IAAI,oEAAqB,MAAzB,IAAI,EAAsB,OAAO,EAAE;YAChD,gBAAgB,EAAE,MAAM;SACzB,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3E,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,aAAa,CACjB,OAAY,EACZ,IAAI,GAAG,EAAE,gBAAgB,EAAE,EAAE,EAAE;QAE/B,MAAM,MAAM,GAAG,uBAAA,IAAI,oEAAqB,MAAzB,IAAI,EAAsB,OAAO,EAAE,IAAI,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,aAAa,CAAC,OAAe;QAC3B,IACE,CAAC,uBAAA,IAAI,8BAAS;aACX,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CACrB,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CACrD;aACA,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAClC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,4BAA4B,CAAC,CAAC;QAClE,CAAC;QAED,uBAAA,IAAI,0BAAY,uBAAA,IAAI,8BAAS,CAAC,MAAM,CAClC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAChB,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE;YACpD,OAAO,CAAC,WAAW,EAAE,CACxB,MAAA,CAAC;IACJ,CAAC;;6JA/CC,OAAY,EACZ,OAAmB,EAAE,gBAAgB,EAAE,EAAE,EAAE;IAE3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,MAAM,GAAG,uBAAA,IAAI,oEAAqB,MAAzB,IAAI,EAAsB,OAAO,EAAE,IAAI,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC,UAAU,CAAC;AAC3B,CAAC,mFA0CC,OAAwB,EACxB,OAAmB,EAAE;IAErB,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,MAAM,GAAG,uBAAA,IAAI,8BAAS,CAAC,IAAI,CAC7B,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,OAAO,CACtE,CAAC;IACF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAC9B,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACrE,MAAM,gBAAgB,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,eAAe,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAC1D,MAAM,GAAG;YACP,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;YACzC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;SACxC,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAnNM,kBAAI,GAAW,IAAI,AAAf,CAAgB;eALR,aAAa;AA2NlC;;;;GAIG;AACH,SAAS,WAAW;IAClB,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAEnC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,2CAA2C;AAC3C,SAAS,sBAAsB,CAC7B,OAAsC;IAEtC,OAAO,OAAO,IAAI,oBAAoB,CAAC;AACzC,CAAC","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
+ {"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 EIP7702Authorization,\n getEncryptionPublicKey,\n normalize,\n personalSign,\n signEIP7702Authorization,\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 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(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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/eth-simple-keyring",
3
- "version": "8.1.0-44b05d1",
3
+ "version": "8.1.0-9ea5be4",
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": "^9.1.0",
47
+ "@ethereumjs/util": "^8.1.0",
48
48
  "@metamask/eth-sig-util": "^8.2.0",
49
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": "^5.4.0",
54
+ "@ethereumjs/tx": "^4.2.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",