{"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 type {\n  TypedDataV1,\n  MessageTypes,\n  TypedMessage,\n} from '@metamask/eth-sig-util';\nimport { Keyring } from '@metamask/keyring-utils';\nimport {\n  add0x,\n  bigIntToBytes,\n  bytesToHex,\n  Eip1024EncryptedData,\n  Hex,\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 {\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  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  async signTypedData<\n    Version extends SignTypedDataVersion,\n    Types extends MessageTypes,\n    Options extends { version?: Version } & KeyringOpt,\n  >(\n    address: Hex,\n    data: Version extends 'V1' ? TypedDataV1 : TypedMessage<Types>,\n    options?: Options,\n  ): Promise<string> {\n    let { version } = options ?? { version: SignTypedDataVersion.V1 };\n\n    // Treat invalid versions as \"V1\"\n    if (!version || !isSignTypedDataVersion(version)) {\n      version = SignTypedDataVersion.V1;\n    }\n\n    const privateKey = this.#getPrivateKeyFor(address, options);\n    return signTypedData({ privateKey, data, 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"]}