UNPKG

@metamask/snaps-rpc-methods

Version:
1 lines 9.45 kB
{"version":3,"file":"name-lookup.cjs","sourceRoot":"","sources":["../../src/endowments/name-lookup.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n EndowmentGetterParams,\n PermissionSpecificationBuilder,\n PermissionValidatorConstraint,\n ValidPermissionSpecification,\n Caveat,\n CaveatSpecificationConstraint,\n PermissionConstraint,\n CaveatConstraint,\n} from '@metamask/permission-controller';\nimport { PermissionType, SubjectType } from '@metamask/permission-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport {\n ChainIdsStruct,\n LookupMatchersStruct,\n SnapCaveatType,\n} from '@metamask/snaps-utils';\nimport type { Json, NonEmptyArray } from '@metamask/utils';\nimport {\n assert,\n assertStruct,\n hasProperty,\n isObject,\n isPlainObject,\n} from '@metamask/utils';\n\nimport { createGenericPermissionValidator } from './caveats';\nimport { SnapEndowments } from './enum';\n\nconst permissionName = SnapEndowments.NameLookup;\n\ntype NameLookupEndowmentSpecification = ValidPermissionSpecification<{\n permissionType: PermissionType.Endowment;\n targetName: typeof permissionName;\n endowmentGetter: (_options?: EndowmentGetterParams) => null;\n allowedCaveats: Readonly<NonEmptyArray<string>> | null;\n validator: PermissionValidatorConstraint;\n}>;\n\n/**\n * `endowment:name-lookup` returns nothing; it is intended to be used as a flag\n * by the extension to detect whether the snap has the capability to resolve a domain/address.\n *\n * @param _builderOptions - Optional specification builder options.\n * @returns The specification for the name-lookup endowment.\n */\nconst specificationBuilder: PermissionSpecificationBuilder<\n PermissionType.Endowment,\n any,\n NameLookupEndowmentSpecification\n> = (_builderOptions?: unknown) => {\n return {\n permissionType: PermissionType.Endowment,\n targetName: permissionName,\n allowedCaveats: [\n SnapCaveatType.ChainIds,\n SnapCaveatType.LookupMatchers,\n SnapCaveatType.MaxRequestTime,\n ],\n endowmentGetter: (_getterOptions?: EndowmentGetterParams) => null,\n validator: createGenericPermissionValidator([\n { type: SnapCaveatType.ChainIds, optional: true },\n { type: SnapCaveatType.LookupMatchers, optional: true },\n { type: SnapCaveatType.MaxRequestTime, optional: true },\n ]),\n subjectTypes: [SubjectType.Snap],\n };\n};\n\nexport const nameLookupEndowmentBuilder = Object.freeze({\n targetName: permissionName,\n specificationBuilder,\n} as const);\n\n/**\n * Validates the type of the caveat value.\n *\n * @param caveat - The caveat to validate.\n * @throws If the caveat value is invalid.\n */\nfunction validateCaveat(caveat: Caveat<string, any>): void {\n if (!hasProperty(caveat, 'value') || !isPlainObject(caveat)) {\n throw rpcErrors.invalidParams({\n message: 'Expected a plain object.',\n });\n }\n\n const { value } = caveat;\n\n switch (caveat.type) {\n case SnapCaveatType.ChainIds:\n assertStruct(value, ChainIdsStruct);\n break;\n case SnapCaveatType.LookupMatchers:\n assertStruct(value, LookupMatchersStruct);\n break;\n default:\n throw rpcErrors.invalidParams({\n message:\n 'Invalid caveat type, must be one of the following: \"chainIds\", \"matchers\".',\n });\n }\n}\n\n/**\n * Map a raw value from the `initialPermissions` to a caveat specification.\n * Note that this function does not do any validation, that's handled by the\n * PermissionsController when the permission is requested.\n *\n * @param value - The raw value from the `initialPermissions`.\n * @returns The caveat specification.\n */\nexport function getNameLookupCaveatMapper(\n value: Json,\n): Pick<PermissionConstraint, 'caveats'> {\n if (!value || !isObject(value) || Object.keys(value).length === 0) {\n return { caveats: null };\n }\n\n const caveats = [];\n\n if (value.chains) {\n caveats.push({\n type: SnapCaveatType.ChainIds,\n value: value.chains,\n });\n }\n\n if (value.matchers) {\n caveats.push({\n type: SnapCaveatType.LookupMatchers,\n value: value.matchers,\n });\n }\n\n assert(caveats.length > 0);\n\n return { caveats: caveats as NonEmptyArray<CaveatConstraint> };\n}\n\n/**\n * Getter function to get the chainIds caveat from a permission.\n *\n * This does basic validation of the caveat, but does not validate the type or\n * value of the namespaces object itself, as this is handled by the\n * `PermissionsController` when the permission is requested.\n *\n * @param permission - The permission to get the `chainIds` caveat from.\n * @returns An array of `chainIds` that the snap supports.\n */\nexport function getChainIdsCaveat(\n permission?: PermissionConstraint,\n): string[] | null {\n if (!permission?.caveats) {\n return null;\n }\n\n const caveat = permission.caveats.find(\n (permCaveat) => permCaveat.type === SnapCaveatType.ChainIds,\n ) as Caveat<string, string[]> | undefined;\n\n return caveat ? caveat.value : null;\n}\n\n/**\n * Getter function to get the matchers caveat from a permission.\n *\n * This does basic validation of the caveat, but does not validate the type or\n * value of the namespaces object itself, as this is handled by the\n * `PermissionsController` when the permission is requested.\n *\n * @param permission - The permission to get the `matchers` caveat from.\n * @returns A `matchers` object that defines the input that the snap supports.\n */\nexport function getLookupMatchersCaveat(\n permission?: PermissionConstraint,\n): Record<string, string[]> | null {\n if (!permission?.caveats) {\n return null;\n }\n\n const caveat = permission.caveats.find(\n (permCaveat) => permCaveat.type === SnapCaveatType.LookupMatchers,\n ) as Caveat<string, Record<string, string[]>> | undefined;\n\n return caveat ? caveat.value : null;\n}\n\nexport const nameLookupCaveatSpecifications: Record<\n SnapCaveatType.ChainIds | SnapCaveatType.LookupMatchers,\n CaveatSpecificationConstraint\n> = {\n [SnapCaveatType.ChainIds]: Object.freeze({\n type: SnapCaveatType.ChainIds,\n validator: (caveat: Caveat<string, any>) => validateCaveat(caveat),\n }),\n [SnapCaveatType.LookupMatchers]: Object.freeze({\n type: SnapCaveatType.LookupMatchers,\n validator: (caveat: Caveat<string, any>) => validateCaveat(caveat),\n }),\n};\n"]}