{"version":3,"file":"snap.mjs","sourceRoot":"","sources":["../../src/rules/snap.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,8BAA8B;AAC5E,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,8BAA8B;AAC5E,OAAO,EAAE,WAAW,EAAE,iCAAiC;AACvD,OAAO,EAAE,YAAY,EAAE,qCAAqC;AAG5D,OAAO,EAAE,eAAe,EAAE,8BAA8B;AAExD,OAAO,EAAE,QAAQ,EAAE,oBAAgB;AAGnC,OAAO,EAAE,oCAAoC,EAAE,sBAAkB;AAajE,MAAM,OAAO,QACX,SAAQ,QAAQ;IADlB;;;QAIW,eAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC;QAEpC,cAAS,GAAG,gBAAgB,CAAC,aAAa,CAAC;IAoFtD,CAAC;IAlFC,KAAK,CACH,OAAwB;QAIxB,IAAI,CAAC,uBAAA,IAAI,oDAAe,MAAnB,IAAI,EAAgB,OAAO,CAAC,EAAE,CAAC;YAClC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAE7C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAE5D,OAAO;YACL,MAAM,EAAE;gBACN,IAAI,EAAE,IAAI,CAAC,UAAU;gBACrB,EAAE,EAAE,QAAQ;gBACZ,QAAQ,EAAE;oBACR,IAAI,EAAE;wBACJ,EAAE,EAAE,MAAM;qBACX;iBACF;aACF;YAED,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI,CAAC,SAAS;gBACpB,EAAE,EAAE,OAAO;gBACX,QAAQ,EAAE;oBACR,MAAM,EAAE,KAAK;oBACb,MAAM,EAAE,KAAK;oBACb,YAAY,EAAE,CAAC;iBAChB;aACF;SACF,CAAC;IACJ,CAAC;IAED,2BAA2B,CACzB,MAAqD;QAErD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,IAAI;YACnB,CAAC,CAAC,oGAAoG;gBACpG,eAAe;gBACf,IAAI,CAAC,QAAQ,CAAC,YAAY;YAC5B,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAE5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,4BAA4B,CAC1B,OAAsD;QAEtD,OAAO,oCAAoC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;CA2BF;gGAlBG,OAAwB;IAExB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IACzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;IACnE,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;IAClD,MAAM,kBAAkB,GACtB,WAAW,KAAK,YAAY,CAAC,IAAI,IAAI,WAAW,KAAK,WAAW,CAAC,IAAI,CAAC;IAExE,OAAO,kBAAkB,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AAC7D,CAAC","sourcesContent":["import { AccountGroupType, AccountWalletType } from '@metamask/account-api';\nimport { toAccountWalletId, toAccountGroupId } from '@metamask/account-api';\nimport { KeyringType } from '@metamask/keyring-api/v2';\nimport { KeyringTypes } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { stripSnapPrefix } from '@metamask/snaps-utils';\n\nimport { BaseRule } from '../rule';\nimport type { Rule, RuleResult } from '../rule';\nimport type { AccountWalletObjectOf } from '../wallet';\nimport { getAccountGroupPrefixFromKeyringType } from './keyring';\n\n/**\n * Snap account type.\n */\ntype SnapAccount<Account extends InternalAccount> = Account & {\n  metadata: Account['metadata'] & {\n    snap: {\n      id: SnapId;\n    };\n  };\n};\n\nexport class SnapRule\n  extends BaseRule\n  implements Rule<AccountWalletType.Snap, AccountGroupType.SingleAccount>\n{\n  readonly walletType = AccountWalletType.Snap;\n\n  readonly groupType = AccountGroupType.SingleAccount;\n\n  match(\n    account: InternalAccount,\n  ):\n    | RuleResult<AccountWalletType.Snap, AccountGroupType.SingleAccount>\n    | undefined {\n    if (!this.#isSnapAccount(account)) {\n      return undefined;\n    }\n\n    const { id: snapId } = account.metadata.snap;\n\n    const walletId = toAccountWalletId(this.walletType, snapId);\n    const groupId = toAccountGroupId(walletId, account.address);\n\n    return {\n      wallet: {\n        type: this.walletType,\n        id: walletId,\n        metadata: {\n          snap: {\n            id: snapId,\n          },\n        },\n      },\n\n      group: {\n        type: this.groupType,\n        id: groupId,\n        metadata: {\n          pinned: false,\n          hidden: false,\n          lastSelected: 0,\n        },\n      },\n    };\n  }\n\n  getDefaultAccountWalletName(\n    wallet: AccountWalletObjectOf<AccountWalletType.Snap>,\n  ): string {\n    const snapId = wallet.metadata.snap.id;\n    const snap = this.messenger.call('SnapController:getSnap', snapId);\n    const snapName = snap\n      ? // TODO: Handle localization here, but that's a \"client thing\", so we don't have a `core` controller\n        // to refer to.\n        snap.manifest.proposedName\n      : stripSnapPrefix(snapId);\n\n    return snapName;\n  }\n\n  getDefaultAccountGroupPrefix(\n    _wallet: AccountWalletObjectOf<AccountWalletType.Snap>,\n  ): string {\n    return getAccountGroupPrefixFromKeyringType(KeyringTypes.snap);\n  }\n\n  /**\n   * Check if an account is a Snap account.\n   *\n   * @param account - The account to check.\n   * @returns True if the account is a Snap account, false otherwise.\n   */\n  #isSnapAccount(\n    account: InternalAccount,\n  ): account is SnapAccount<InternalAccount> {\n    const snapId = account.metadata.snap?.id;\n    if (snapId === undefined) {\n      return false;\n    }\n\n    const snap = this.messenger.call('SnapController:getSnap', snapId);\n    if (snap === null) {\n      return false;\n    }\n\n    const keyringType = account.metadata.keyring.type;\n    const hasSnapKeyringType =\n      keyringType === KeyringTypes.snap || keyringType === KeyringType.Snap;\n\n    return hasSnapKeyringType && snap.enabled && !snap.blocked;\n  }\n}\n"]}