import { permissionedRegistryRolesSnippet } from '@ensdomains/ensjs-abi/v2/permissionedRegistry' import { type Client, labelhash } from 'viem' import type { Address } from 'viem/accounts' import { type ReadContractErrorType, readContract } from 'viem/actions' import { getAction } from 'viem/utils' import { ASSERT_NO_TYPE_ERROR } from '../../../../types/internal.js' import { decodeRoleCounts, registryRoles } from '../../../../utils/v2/index.js' export type GetNameRolesForAccountParameters = { registryAddress: Address account: Address label: string } export type GetNameRolesForAccountReturnType = { decoded: Array raw: bigint } export type GetNameRolesForAccountErrorType = ReadContractErrorType /** * Gets the registry's roles for an account. * @param client - {@link Client} * @param parameters - {@link GetRolesForAccountParameters} * @returns Decoded roles bitmap and raw value. {@link GetRolesForAccountReturnType} * * @example * import { createPublicClient, http } from 'viem' * import { mainnet } from 'viem/chains' * import { addEnsContracts } from '@ensdomains/ensjs' * import { getNameRolesForAccount } from '@ensdomains/ensjs/public/v2' * * const client = createPublicClient({ * chain: addEnsContracts(mainnet), * transport: http(), * }) * * const result = await getNameRolesForAccount(client, { * registryAddress: '0x0f3eb298470639a96bd548cea4a648bc80b2cee2', * account: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7', * label: 'raffy', * }) */ export async function getNameRolesForAccount( client: Client, { registryAddress, account, label }: GetNameRolesForAccountParameters, ): Promise { ASSERT_NO_TYPE_ERROR(client) const readContractAction = getAction(client, readContract, 'readContract') const roleBitmap = await readContractAction({ address: registryAddress, abi: permissionedRegistryRolesSnippet, functionName: 'roles', args: [BigInt(labelhash(label)), account], }) const roleCounts = decodeRoleCounts(roleBitmap, registryRoles) const decoded = ( Object.keys(roleCounts) as Array ).filter((key) => roleCounts[key] !== 0) return { decoded, raw: roleBitmap, } }