{"version":3,"file":"snap.cjs","sourceRoot":"","sources":["../../src/rules/snap.ts"],"names":[],"mappings":";;;;;;;;;AAAA,uDAA4E;AAC5E,uDAA4E;AAC5E,iDAAuD;AACvD,qEAA4D;AAG5D,uDAAwD;AAExD,sCAAmC;AAGnC,2CAAiE;AAajE,MAAa,QACX,SAAQ,eAAQ;IADlB;;;QAIW,eAAU,GAAG,+BAAiB,CAAC,IAAI,CAAC;QAEpC,cAAS,GAAG,8BAAgB,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,IAAA,+BAAiB,EAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAA,8BAAgB,EAAC,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,IAAA,6BAAe,EAAC,MAAM,CAAC,CAAC;QAE5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,4BAA4B,CAC1B,OAAsD;QAEtD,OAAO,IAAA,8CAAoC,EAAC,iCAAY,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;CA2BF;AA1FD,4BA0FC;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,iCAAY,CAAC,IAAI,IAAI,WAAW,KAAK,gBAAW,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"]}