{"version":3,"sources":["../src/chains/evm2SIP44.ts","../src/format/address/index.ts","../src/format/records/formatter.ts","../src/format/records/discord/discord.ts","../src/format/records/github/github.ts","../src/format/records/linkedin/linkedin.ts","../src/format/records/reddit/reddit.ts","../src/format/records/telegram/telegram.ts","../src/format/records/twitter/twitter.ts","../src/format/records/website/website.ts","../src/format/records/index.ts","../src/react/hooks/useEnsMultichainAddress.ts","../src/react/hooks/useRecords.ts","../src/react/hooks/usePreferredName.ts"],"names":["convertEVMChainIdToCoinType","chainId","convertCoinTypeToEVMChainId","coinType","AddressRegex","formatAddress","address","formatter","rules","value","accumulator","rule","formatDiscordRules","record","formatGithubRules","formatLinkedinRules","formatRedditRules","formatTelegramRules","formatTwitterRules","formatWebsiteRules","socialFormatters","formatRecord","useEnsMultichainAddress","resolverConfig","fetchEnsResolver","useEffect","useSWR","useRecords","name","records","v","resolver","_object_","result","usePreferredName","fallback"],"mappings":"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","sourcesContent":["/**\n * Convert EVM chainId to [SLIP-0044]() coinType as per [ENSIP-11](https://docs.ens.domains/ensip/11).\n * @param chainId EVM chainId\n * @returns SLIP-0044 coinType\n */\nexport const convertEVMChainIdToCoinType = (chainId: number) => {\n    return (0x80_00_00_00 | chainId) >>> 0;\n};\n\n/**\n * Convert [SLIP-0044]() coinType to EVM chainId as per [ENSIP-11](https://docs.ens.domains/ensip/11).\n * @param coinType SLIP-0044 coinType (above range 0x80000000 (2147483648))\n * @returns EVM chainId\n */\nexport const convertCoinTypeToEVMChainId = (coinType: number) => {\n    // eslint-disable-next-line prettier/prettier\n    return Math.trunc(0x7F_FF_FF_FF & coinType);\n};\n","export const AddressRegex = /^0x[\\dA-Fa-f]{40}$/;\n\n/**\n * Formats the address from 0x225f137127d9067788314bc7fcc1f36746a3c3B5 to 0x225f...c3B5\n * Returns the address if it doesn't match the address pattern\n * @param address The address to format\n */\nexport const formatAddress = (address: string) => {\n    if (address.match(AddressRegex) === null) return address;\n\n    return `${address.slice(0, 5)}...${address.slice(-4)}`;\n};\n","import { Rule } from './rule';\n\nexport const formatter = (rules: Rule[]): Rule => {\n    return (value: string) => {\n        return rules.reduce<string | undefined>((accumulator, rule) => {\n            if (accumulator === undefined) return;\n\n            return rule(accumulator);\n        }, value);\n    };\n};\n","import { formatter } from '../formatter';\n\nexport const formatDiscordRules = formatter([\n    (record) =>\n        record.replace(\n            /^(https?:\\/\\/)?(www\\.)?discord(app)?\\.((gg|me)\\/|com\\/invite\\/)/,\n            ''\n        ),\n    (record) => (/^.+#\\d{4}/.test(record) ? record : undefined),\n]);\n","import { formatter } from '../formatter';\n\nexport const formatGithubRules = formatter([\n    (record) => record.replace(/^(https?:\\/\\/)?(www\\.)?github\\.com\\//, ''),\n    (record) => record.replace(/^@/, ''),\n    (record) => record.replace(/\\/+$/, ''),\n]);\n","import { formatter } from '../formatter';\n\nexport const formatLinkedinRules = formatter([\n    (record) =>\n        record.replace(/^(https?:\\/\\/)?([A-Za-z]+\\.)?linkedin\\.com/, ''),\n    (record) => record.replace(/^\\/?(in\\/)?/, ''),\n    (record) => record.replace(/\\/+$/, ''),\n]);\n","import { formatter } from '../formatter';\n\nexport const formatRedditRules = formatter([\n    (record) => record.replace(/^(https?:\\/\\/)?(www\\.)?reddit\\.com\\//, ''),\n    (record) => record.replace(/^(user\\/)/, 'u/'),\n    (record) => record.replace(/^(subreddit\\/)/, 'r/'),\n    (record) => record.replace(/\\/+$/, ''),\n    (record) => (/^.+$/.test(record) ? record : undefined),\n]);\n","import { formatter } from '../formatter';\n\nexport const formatTelegramRules = formatter([\n    (record) => record.replace(/^(https?:\\/\\/)?(www\\.)?(mobile\\.)?t\\.me\\//, ''),\n    (record) => record.replace(/^(joinchat\\/)/, ''),\n    (record) => record.replace(/\\/+$/, ''),\n    (record) => (/^.+$/.test(record) ? record : undefined),\n]);\n","import { formatter } from '../formatter';\n\nexport const formatTwitterRules = formatter([\n    (record) =>\n        record.replace(/^(https?:\\/\\/)?(www\\.)?(mobile\\.)?twitter\\.com\\//, ''),\n    (record) => record.replace(/^@/, ''),\n    (record) => record.replace(/\\/$/, ''),\n    (record) => (/^.{1,15}$/.test(record) ? `@${record}` : undefined),\n]);\n","import { formatter } from '../formatter';\n\nexport const formatWebsiteRules = formatter([\n    (record) => record.match(/^(.+?:\\/\\/)?(([^.]+\\.)+[^./]+)/)?.[2],\n]);\n","import { formatDiscordRules } from './discord/discord';\nimport { formatGithubRules } from './github/github';\nimport { formatLinkedinRules } from './linkedin/linkedin';\nimport { formatRedditRules } from './reddit/reddit';\nimport { Rule } from './rule';\nimport { formatTelegramRules } from './telegram/telegram';\nimport { formatTwitterRules } from './twitter/twitter';\nimport { formatWebsiteRules } from './website/website';\n\ntype Types =\n    | 'com.twitter'\n    | 'com.reddit'\n    | 'com.github'\n    | 'com.discord'\n    | 'com.linkedin'\n    | 'org.telegram'\n    | 'website';\n\nconst socialFormatters: Record<Types, Rule> = {\n    'com.twitter': formatTwitterRules,\n    'com.reddit': formatRedditRules,\n    'com.github': formatGithubRules,\n    'com.discord': formatDiscordRules,\n    'com.linkedin': formatLinkedinRules,\n    'org.telegram': formatTelegramRules,\n    website: formatWebsiteRules,\n};\n\nexport const formatRecord = (record: Types, value: string | undefined) => {\n    if (!value) return;\n\n    return socialFormatters[record]?.(value);\n};\n","/**\n * Supports ENSIP-9 & ENSIP-11\n */\nexport type EnsMultichainAddressConfig = {\n    // ENS name (eg. \"luc.eth\")\n    name: string;\n    // SLIP-0044 coin type (eg. 60 for Ethereum)\n    coinType: number;\n};\n\n/**\n * Gets the user's address for a given ENS name and coin type.\n * CURRENTLY INCOMPLETE IMPLEMENTATION\n * Based on: https://github.com/wagmi-dev/wagmi/blob/main/packages/react/src/hooks/ens/useEnsResolver.ts\n */\nexport const useEnsMultichainAddress = ({\n    coinType,\n    ...resolverConfig\n}: EnsMultichainAddressConfig): any => {\n    \n};\n","import { fetchEnsResolver } from '@wagmi/core';\nimport { useEffect } from 'react';\nimport useSWR from 'swr';\n\nexport type EnsRecordsConfig<K extends string> = {\n    /** ENS name (eg. \"luc.eth\") */\n    name: string;\n    /** Records (eg. [\"com.github\", \"avatar\", \"com.discord\"]) */\n    records: K[];\n    /** Wether to format/normalize the records */\n    format: boolean;\n};\n\ntype EnsRecordsResult<K extends string> = ReturnType<\n    typeof useSWR<Record<K, string> | null>\n>;\n\n/**\n * Gets the user's records for a given ENS.\n */\nexport const useRecords = <K extends string>({\n    name,\n    records,\n}: EnsRecordsConfig<K>): EnsRecordsResult<K> => {\n    const v = useSWR(\n        records?.length > 0 ? `ens/r/${records.join(',')}` : null,\n        async () => {\n            const resolver = await fetchEnsResolver({ name });\n\n            if (!resolver) return null;\n\n            const _object_ = await Promise.allSettled(\n                records.map(async (record) => {\n                    const value = await resolver.getText(record);\n\n                    return [record, value] as const;\n                })\n            );\n\n            return Object.fromEntries(\n                _object_\n                    .map((result) => {\n                        if (result && result.status === 'fulfilled')\n                            return result.value;\n\n                        return null;\n                    })\n                    .filter(Boolean) as Array<readonly [K, string]>\n            ) as Record<K, string>;\n        }\n    );\n\n    useEffect(() => {\n        v.mutate();\n    }, [records.join(',')]);\n\n    return v;\n};\n","import { useRecords } from './useRecords';\n\ntype EnsPreferredNameConfig = {\n    /** ENS name to look up */\n    name: string;\n    /** Fallback to use incase no `display` record */\n    fallback?: string;\n};\n\ntype EnsPreferredNameResult = {\n    /**\n     * ENS name with capitalization following the `display` text record\n     * For more info see [ENSIP-5](https://docs.ens.domains/ens-improvement-proposals/ensip-5-text-records)\n     */\n    data: string;\n};\n\n/**\n * Gets the user's preferred ENS capitalization respecting the `display` text record.\n * For more info see [ENSIP-5](https://docs.ens.domains/ens-improvement-proposals/ensip-5-text-records)\n */\nexport const usePreferredName = ({\n    name,\n    fallback = name,\n}: EnsPreferredNameConfig): EnsPreferredNameResult => {\n    const v = useRecords({\n        name,\n        records: ['display'],\n        format: false,\n    });\n\n    if (!v.data) return { ...v, data: fallback };\n\n    if (v.data.display?.toLowerCase() != name.toLowerCase())\n        return { ...v, data: fallback };\n\n    return { ...v, data: v.data.display };\n};\n"]}