From dcf8423535b837d6910b8c7cafda1f78c7d6c465 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Mon, 13 Jan 2025 12:13:26 -0500 Subject: [PATCH 01/79] Init vocs --- .gitignore | 8 + package.json | 17 + pnpm-lock.yaml | 5661 +++++++++++++++++ {docs => src/pages}/bugs.mdx | 0 {docs => src/pages}/changelog.mdx | 0 {docs => src/pages}/contracts/index.mdx | 0 {docs => src/pages}/dao/constitution.mdx | 0 {docs => src/pages}/dao/foundation.mdx | 0 .../pages}/dao/governance/moderator.mdx | 0 .../pages}/dao/governance/process.mdx | 0 {docs => src/pages}/dao/index.mdx | 0 {docs => src/pages}/dao/proposals/0.1.mdx | 0 {docs => src/pages}/dao/proposals/0.2.mdx | 0 {docs => src/pages}/dao/proposals/0.3.mdx | 0 {docs => src/pages}/dao/proposals/0.4.mdx | 0 {docs => src/pages}/dao/proposals/1.1.mdx | 0 {docs => src/pages}/dao/proposals/1.2.1.mdx | 0 {docs => src/pages}/dao/proposals/1.2.2.mdx | 0 {docs => src/pages}/dao/proposals/1.3.1.mdx | 0 {docs => src/pages}/dao/proposals/1.3.2.mdx | 0 {docs => src/pages}/dao/proposals/1.3.3.mdx | 0 {docs => src/pages}/dao/proposals/1.3.4.mdx | 0 {docs => src/pages}/dao/proposals/1.4.mdx | 0 {docs => src/pages}/dao/proposals/1.5.mdx | 0 {docs => src/pages}/dao/proposals/1.6.mdx | 0 {docs => src/pages}/dao/proposals/1.7.mdx | 0 {docs => src/pages}/dao/proposals/1.8.mdx | 0 {docs => src/pages}/dao/proposals/1.9.mdx | 0 {docs => src/pages}/dao/proposals/2.1.mdx | 0 {docs => src/pages}/dao/proposals/2.2.1.mdx | 0 {docs => src/pages}/dao/proposals/2.2.2.mdx | 0 {docs => src/pages}/dao/proposals/2.2.3.mdx | 0 {docs => src/pages}/dao/proposals/2.2.4.mdx | 0 {docs => src/pages}/dao/proposals/2.2.5.mdx | 0 {docs => src/pages}/dao/proposals/3.1.1.mdx | 0 {docs => src/pages}/dao/proposals/3.1.2.mdx | 0 {docs => src/pages}/dao/proposals/3.1.3.mdx | 0 {docs => src/pages}/dao/proposals/3.2.mdx | 0 {docs => src/pages}/dao/proposals/3.3.mdx | 0 {docs => src/pages}/dao/proposals/3.4.mdx | 0 {docs => src/pages}/dao/proposals/3.5.mdx | 0 {docs => src/pages}/dao/proposals/3.6.mdx | 0 {docs => src/pages}/dao/proposals/3.7.mdx | 0 {docs => src/pages}/dao/proposals/4.1.mdx | 0 {docs => src/pages}/dao/proposals/4.10.mdx | 0 {docs => src/pages}/dao/proposals/4.2.mdx | 0 {docs => src/pages}/dao/proposals/4.3.mdx | 0 {docs => src/pages}/dao/proposals/4.4.mdx | 0 {docs => src/pages}/dao/proposals/4.5.mdx | 0 {docs => src/pages}/dao/proposals/4.6.mdx | 0 {docs => src/pages}/dao/proposals/4.7.mdx | 0 {docs => src/pages}/dao/proposals/4.8.mdx | 0 {docs => src/pages}/dao/proposals/4.9.mdx | 0 {docs => src/pages}/dao/proposals/5.1.mdx | 0 {docs => src/pages}/dao/proposals/5.10.mdx | 0 {docs => src/pages}/dao/proposals/5.11.mdx | 0 {docs => src/pages}/dao/proposals/5.12.mdx | 0 {docs => src/pages}/dao/proposals/5.13.mdx | 0 {docs => src/pages}/dao/proposals/5.14.mdx | 0 {docs => src/pages}/dao/proposals/5.15.mdx | 0 {docs => src/pages}/dao/proposals/5.16.mdx | 0 {docs => src/pages}/dao/proposals/5.17.1.mdx | 0 {docs => src/pages}/dao/proposals/5.17.2.mdx | 0 {docs => src/pages}/dao/proposals/5.17.3.mdx | 0 {docs => src/pages}/dao/proposals/5.18.mdx | 0 {docs => src/pages}/dao/proposals/5.19.mdx | 0 {docs => src/pages}/dao/proposals/5.2.mdx | 0 {docs => src/pages}/dao/proposals/5.20.mdx | 0 {docs => src/pages}/dao/proposals/5.21.mdx | 0 {docs => src/pages}/dao/proposals/5.22.mdx | 0 {docs => src/pages}/dao/proposals/5.23.mdx | 0 {docs => src/pages}/dao/proposals/5.24.mdx | 0 {docs => src/pages}/dao/proposals/5.25.mdx | 0 {docs => src/pages}/dao/proposals/5.26.mdx | 0 {docs => src/pages}/dao/proposals/5.27.mdx | 0 {docs => src/pages}/dao/proposals/5.28.mdx | 0 {docs => src/pages}/dao/proposals/5.29.mdx | 0 {docs => src/pages}/dao/proposals/5.3.mdx | 0 {docs => src/pages}/dao/proposals/5.4.1.mdx | 0 {docs => src/pages}/dao/proposals/5.4.2.mdx | 0 {docs => src/pages}/dao/proposals/5.5.mdx | 0 {docs => src/pages}/dao/proposals/5.6.mdx | 0 {docs => src/pages}/dao/proposals/5.7.mdx | 0 {docs => src/pages}/dao/proposals/5.8.mdx | 0 {docs => src/pages}/dao/proposals/5.9.mdx | 0 {docs => src/pages}/dao/proposals/submit.mdx | 0 {docs => src/pages}/dao/stewards.mdx | 0 {docs => src/pages}/dao/token.mdx | 0 {docs => src/pages}/dao/wg/rules.mdx | 0 {docs => src/pages}/disappeared.mdx | 0 {docs => src/pages}/dns/tlds.mdx | 0 {docs => src/pages}/dweb/intro.mdx | 0 {docs => src/pages}/ensip/1.mdx | 0 {docs => src/pages}/ensip/10.mdx | 0 {docs => src/pages}/ensip/11.mdx | 0 {docs => src/pages}/ensip/12.mdx | 0 {docs => src/pages}/ensip/13.mdx | 0 {docs => src/pages}/ensip/14.mdx | 0 {docs => src/pages}/ensip/15.mdx | 0 {docs => src/pages}/ensip/16.mdx | 0 {docs => src/pages}/ensip/17.mdx | 0 {docs => src/pages}/ensip/18.mdx | 0 {docs => src/pages}/ensip/19.mdx | 0 {docs => src/pages}/ensip/2.mdx | 0 {docs => src/pages}/ensip/3.mdx | 0 {docs => src/pages}/ensip/4.mdx | 0 {docs => src/pages}/ensip/5.mdx | 0 {docs => src/pages}/ensip/6.mdx | 0 {docs => src/pages}/ensip/7.mdx | 0 {docs => src/pages}/ensip/8.mdx | 0 {docs => src/pages}/ensip/9.mdx | 0 {docs => src/pages}/ensip/index.mdx | 0 {docs => src/pages}/faq.mdx | 0 {docs => src/pages}/index.mdx | 0 {docs => src/pages}/learn/ccip-read.mdx | 0 {docs => src/pages}/learn/deployments.mdx | 0 {docs => src/pages}/learn/dns.mdx | 0 {docs => src/pages}/learn/protocol.mdx | 0 {docs => src/pages}/learn/resolution.mdx | 0 {docs => src/pages}/registry/dns.mdx | 0 {docs => src/pages}/registry/ens.mdx | 0 {docs => src/pages}/registry/eth.mdx | 0 {docs => src/pages}/registry/reverse.mdx | 0 {docs => src/pages}/registry/test.mdx | 0 {docs => src/pages}/registry/writing.mdx | 0 {docs => src/pages}/resolution/index.mdx | 0 {docs => src/pages}/resolution/names.mdx | 0 {docs => src/pages}/resolvers/ccip-read.mdx | 0 {docs => src/pages}/resolvers/interacting.mdx | 0 {docs => src/pages}/resolvers/interfaces.mdx | 0 {docs => src/pages}/resolvers/public.mdx | 0 {docs => src/pages}/resolvers/quickstart.mdx | 0 {docs => src/pages}/resolvers/universal.mdx | 0 {docs => src/pages}/resolvers/writing.mdx | 0 {docs => src/pages}/terminology.mdx | 0 src/pages/vocs-index.mdx | 16 + {docs => src/pages}/web/avatars.mdx | 0 {docs => src/pages}/web/design.mdx | 0 {docs => src/pages}/web/enumerate.mdx | 0 {docs => src/pages}/web/index.mdx | 0 {docs => src/pages}/web/libraries.mdx | 0 {docs => src/pages}/web/multichain.mdx | 0 {docs => src/pages}/web/naming-contracts.mdx | 0 {docs => src/pages}/web/quickstart.mdx | 0 {docs => src/pages}/web/records.mdx | 0 {docs => src/pages}/web/resolution.mdx | 0 {docs => src/pages}/web/reverse.mdx | 0 {docs => src/pages}/web/siwe.mdx | 0 {docs => src/pages}/web/subdomains.mdx | 0 {docs => src/pages}/web/subgraph.mdx | 0 {docs => src/pages}/wrapper/contracts.mdx | 0 .../wrapper/creating-subname-registrar.mdx | 0 {docs => src/pages}/wrapper/expiry.mdx | 0 {docs => src/pages}/wrapper/fuses.mdx | 0 {docs => src/pages}/wrapper/overview.mdx | 0 {docs => src/pages}/wrapper/states.mdx | 0 {docs => src/pages}/wrapper/usecases.mdx | 0 tsconfig.json | 28 +- vocs.config.ts | 16 + 159 files changed, 5740 insertions(+), 6 deletions(-) create mode 100644 .gitignore create mode 100644 package.json create mode 100644 pnpm-lock.yaml rename {docs => src/pages}/bugs.mdx (100%) rename {docs => src/pages}/changelog.mdx (100%) rename {docs => src/pages}/contracts/index.mdx (100%) rename {docs => src/pages}/dao/constitution.mdx (100%) rename {docs => src/pages}/dao/foundation.mdx (100%) rename {docs => src/pages}/dao/governance/moderator.mdx (100%) rename {docs => src/pages}/dao/governance/process.mdx (100%) rename {docs => src/pages}/dao/index.mdx (100%) rename {docs => src/pages}/dao/proposals/0.1.mdx (100%) rename {docs => src/pages}/dao/proposals/0.2.mdx (100%) rename {docs => src/pages}/dao/proposals/0.3.mdx (100%) rename {docs => src/pages}/dao/proposals/0.4.mdx (100%) rename {docs => src/pages}/dao/proposals/1.1.mdx (100%) rename {docs => src/pages}/dao/proposals/1.2.1.mdx (100%) rename {docs => src/pages}/dao/proposals/1.2.2.mdx (100%) rename {docs => src/pages}/dao/proposals/1.3.1.mdx (100%) rename {docs => src/pages}/dao/proposals/1.3.2.mdx (100%) rename {docs => src/pages}/dao/proposals/1.3.3.mdx (100%) rename {docs => src/pages}/dao/proposals/1.3.4.mdx (100%) rename {docs => src/pages}/dao/proposals/1.4.mdx (100%) rename {docs => src/pages}/dao/proposals/1.5.mdx (100%) rename {docs => src/pages}/dao/proposals/1.6.mdx (100%) rename {docs => src/pages}/dao/proposals/1.7.mdx (100%) rename {docs => src/pages}/dao/proposals/1.8.mdx (100%) rename {docs => src/pages}/dao/proposals/1.9.mdx (100%) rename {docs => src/pages}/dao/proposals/2.1.mdx (100%) rename {docs => src/pages}/dao/proposals/2.2.1.mdx (100%) rename {docs => src/pages}/dao/proposals/2.2.2.mdx (100%) rename {docs => src/pages}/dao/proposals/2.2.3.mdx (100%) rename {docs => src/pages}/dao/proposals/2.2.4.mdx (100%) rename {docs => src/pages}/dao/proposals/2.2.5.mdx (100%) rename {docs => src/pages}/dao/proposals/3.1.1.mdx (100%) rename {docs => src/pages}/dao/proposals/3.1.2.mdx (100%) rename {docs => src/pages}/dao/proposals/3.1.3.mdx (100%) rename {docs => src/pages}/dao/proposals/3.2.mdx (100%) rename {docs => src/pages}/dao/proposals/3.3.mdx (100%) rename {docs => src/pages}/dao/proposals/3.4.mdx (100%) rename {docs => src/pages}/dao/proposals/3.5.mdx (100%) rename {docs => src/pages}/dao/proposals/3.6.mdx (100%) rename {docs => src/pages}/dao/proposals/3.7.mdx (100%) rename {docs => src/pages}/dao/proposals/4.1.mdx (100%) rename {docs => src/pages}/dao/proposals/4.10.mdx (100%) rename {docs => src/pages}/dao/proposals/4.2.mdx (100%) rename {docs => src/pages}/dao/proposals/4.3.mdx (100%) rename {docs => src/pages}/dao/proposals/4.4.mdx (100%) rename {docs => src/pages}/dao/proposals/4.5.mdx (100%) rename {docs => src/pages}/dao/proposals/4.6.mdx (100%) rename {docs => src/pages}/dao/proposals/4.7.mdx (100%) rename {docs => src/pages}/dao/proposals/4.8.mdx (100%) rename {docs => src/pages}/dao/proposals/4.9.mdx (100%) rename {docs => src/pages}/dao/proposals/5.1.mdx (100%) rename {docs => src/pages}/dao/proposals/5.10.mdx (100%) rename {docs => src/pages}/dao/proposals/5.11.mdx (100%) rename {docs => src/pages}/dao/proposals/5.12.mdx (100%) rename {docs => src/pages}/dao/proposals/5.13.mdx (100%) rename {docs => src/pages}/dao/proposals/5.14.mdx (100%) rename {docs => src/pages}/dao/proposals/5.15.mdx (100%) rename {docs => src/pages}/dao/proposals/5.16.mdx (100%) rename {docs => src/pages}/dao/proposals/5.17.1.mdx (100%) rename {docs => src/pages}/dao/proposals/5.17.2.mdx (100%) rename {docs => src/pages}/dao/proposals/5.17.3.mdx (100%) rename {docs => src/pages}/dao/proposals/5.18.mdx (100%) rename {docs => src/pages}/dao/proposals/5.19.mdx (100%) rename {docs => src/pages}/dao/proposals/5.2.mdx (100%) rename {docs => src/pages}/dao/proposals/5.20.mdx (100%) rename {docs => src/pages}/dao/proposals/5.21.mdx (100%) rename {docs => src/pages}/dao/proposals/5.22.mdx (100%) rename {docs => src/pages}/dao/proposals/5.23.mdx (100%) rename {docs => src/pages}/dao/proposals/5.24.mdx (100%) rename {docs => src/pages}/dao/proposals/5.25.mdx (100%) rename {docs => src/pages}/dao/proposals/5.26.mdx (100%) rename {docs => src/pages}/dao/proposals/5.27.mdx (100%) rename {docs => src/pages}/dao/proposals/5.28.mdx (100%) rename {docs => src/pages}/dao/proposals/5.29.mdx (100%) rename {docs => src/pages}/dao/proposals/5.3.mdx (100%) rename {docs => src/pages}/dao/proposals/5.4.1.mdx (100%) rename {docs => src/pages}/dao/proposals/5.4.2.mdx (100%) rename {docs => src/pages}/dao/proposals/5.5.mdx (100%) rename {docs => src/pages}/dao/proposals/5.6.mdx (100%) rename {docs => src/pages}/dao/proposals/5.7.mdx (100%) rename {docs => src/pages}/dao/proposals/5.8.mdx (100%) rename {docs => src/pages}/dao/proposals/5.9.mdx (100%) rename {docs => src/pages}/dao/proposals/submit.mdx (100%) rename {docs => src/pages}/dao/stewards.mdx (100%) rename {docs => src/pages}/dao/token.mdx (100%) rename {docs => src/pages}/dao/wg/rules.mdx (100%) rename {docs => src/pages}/disappeared.mdx (100%) rename {docs => src/pages}/dns/tlds.mdx (100%) rename {docs => src/pages}/dweb/intro.mdx (100%) rename {docs => src/pages}/ensip/1.mdx (100%) rename {docs => src/pages}/ensip/10.mdx (100%) rename {docs => src/pages}/ensip/11.mdx (100%) rename {docs => src/pages}/ensip/12.mdx (100%) rename {docs => src/pages}/ensip/13.mdx (100%) rename {docs => src/pages}/ensip/14.mdx (100%) rename {docs => src/pages}/ensip/15.mdx (100%) rename {docs => src/pages}/ensip/16.mdx (100%) rename {docs => src/pages}/ensip/17.mdx (100%) rename {docs => src/pages}/ensip/18.mdx (100%) rename {docs => src/pages}/ensip/19.mdx (100%) rename {docs => src/pages}/ensip/2.mdx (100%) rename {docs => src/pages}/ensip/3.mdx (100%) rename {docs => src/pages}/ensip/4.mdx (100%) rename {docs => src/pages}/ensip/5.mdx (100%) rename {docs => src/pages}/ensip/6.mdx (100%) rename {docs => src/pages}/ensip/7.mdx (100%) rename {docs => src/pages}/ensip/8.mdx (100%) rename {docs => src/pages}/ensip/9.mdx (100%) rename {docs => src/pages}/ensip/index.mdx (100%) rename {docs => src/pages}/faq.mdx (100%) rename {docs => src/pages}/index.mdx (100%) rename {docs => src/pages}/learn/ccip-read.mdx (100%) rename {docs => src/pages}/learn/deployments.mdx (100%) rename {docs => src/pages}/learn/dns.mdx (100%) rename {docs => src/pages}/learn/protocol.mdx (100%) rename {docs => src/pages}/learn/resolution.mdx (100%) rename {docs => src/pages}/registry/dns.mdx (100%) rename {docs => src/pages}/registry/ens.mdx (100%) rename {docs => src/pages}/registry/eth.mdx (100%) rename {docs => src/pages}/registry/reverse.mdx (100%) rename {docs => src/pages}/registry/test.mdx (100%) rename {docs => src/pages}/registry/writing.mdx (100%) rename {docs => src/pages}/resolution/index.mdx (100%) rename {docs => src/pages}/resolution/names.mdx (100%) rename {docs => src/pages}/resolvers/ccip-read.mdx (100%) rename {docs => src/pages}/resolvers/interacting.mdx (100%) rename {docs => src/pages}/resolvers/interfaces.mdx (100%) rename {docs => src/pages}/resolvers/public.mdx (100%) rename {docs => src/pages}/resolvers/quickstart.mdx (100%) rename {docs => src/pages}/resolvers/universal.mdx (100%) rename {docs => src/pages}/resolvers/writing.mdx (100%) rename {docs => src/pages}/terminology.mdx (100%) create mode 100644 src/pages/vocs-index.mdx rename {docs => src/pages}/web/avatars.mdx (100%) rename {docs => src/pages}/web/design.mdx (100%) rename {docs => src/pages}/web/enumerate.mdx (100%) rename {docs => src/pages}/web/index.mdx (100%) rename {docs => src/pages}/web/libraries.mdx (100%) rename {docs => src/pages}/web/multichain.mdx (100%) rename {docs => src/pages}/web/naming-contracts.mdx (100%) rename {docs => src/pages}/web/quickstart.mdx (100%) rename {docs => src/pages}/web/records.mdx (100%) rename {docs => src/pages}/web/resolution.mdx (100%) rename {docs => src/pages}/web/reverse.mdx (100%) rename {docs => src/pages}/web/siwe.mdx (100%) rename {docs => src/pages}/web/subdomains.mdx (100%) rename {docs => src/pages}/web/subgraph.mdx (100%) rename {docs => src/pages}/wrapper/contracts.mdx (100%) rename {docs => src/pages}/wrapper/creating-subname-registrar.mdx (100%) rename {docs => src/pages}/wrapper/expiry.mdx (100%) rename {docs => src/pages}/wrapper/fuses.mdx (100%) rename {docs => src/pages}/wrapper/overview.mdx (100%) rename {docs => src/pages}/wrapper/states.mdx (100%) rename {docs => src/pages}/wrapper/usecases.mdx (100%) create mode 100644 vocs.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..d9a376795 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.env +.env*.local +*.DS_Store +node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 000000000..4c6e6303e --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "docs", + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vocs dev", + "build": "vocs build", + "preview": "vocs preview" + }, + "dependencies": { + "@types/react": "latest", + "react": "latest", + "react-dom": "latest", + "typescript": "latest", + "vocs": "latest" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..32aadfce1 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5661 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@types/react': + specifier: latest + version: 19.0.6 + react: + specifier: latest + version: 19.0.0 + react-dom: + specifier: latest + version: 19.0.0(react@19.0.0) + typescript: + specifier: latest + version: 5.7.3 + vocs: + specifier: latest + version: 1.0.0-alpha.62(@types/node@22.10.5)(@types/react@19.0.6)(acorn@8.14.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(rollup@4.30.1)(typescript@5.7.3) + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.5': + resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.5': + resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} + engines: {node: '>=6.9.0'} + + '@clack/core@0.3.5': + resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} + + '@clack/prompts@0.7.0': + resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} + bundledDependencies: + - is-unicode-supported + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@hono/node-server@1.13.7': + resolution: {integrity: sha512-kTfUMsoloVKtRA2fLiGSd9qBddmru9KadNyhJCwgKBxTiNkaAJEwkVN9KV/rS4HtmmNRtUh6P+YpmjRMl0d9vQ==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + + '@mdx-js/react@3.1.0': + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@mdx-js/rollup@3.1.0': + resolution: {integrity: sha512-q4xOtUXpCzeouE8GaJ8StT4rDxm/U5j6lkMHL2srb2Q3Y7cobE0aXyPzXVVlbeIMBi+5R5MpbiaVE5/vJUdnHg==} + peerDependencies: + rollup: '>=2' + + '@noble/hashes@1.7.0': + resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@radix-ui/colors@3.0.0': + resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} + + '@radix-ui/primitive@1.1.1': + resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + + '@radix-ui/react-accordion@1.2.2': + resolution: {integrity: sha512-b1oh54x4DMCdGsB4/7ahiSrViXxaBwRPotiZNnYXjLha9vfuURSAZErki6qjDoSIV0eXx5v57XnTGVtGwnfp2g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-arrow@1.1.1': + resolution: {integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.2': + resolution: {integrity: sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.1': + resolution: {integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.1': + resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.4': + resolution: {integrity: sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.3': + resolution: {integrity: sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.1': + resolution: {integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-icons@1.3.2': + resolution: {integrity: sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==} + peerDependencies: + react: ^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.1': + resolution: {integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-navigation-menu@1.2.3': + resolution: {integrity: sha512-IQWAsQ7dsLIYDrn0WqPU+cdM7MONTv9nqrLVYoie3BPiabSfUVDe6Fr+oEt0Cofsr9ONDcDe9xhmJbL1Uq1yKg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.4': + resolution: {integrity: sha512-aUACAkXx8LaFymDma+HQVji7WhvEhpFJ7+qPz17Nf4lLZqtreGOFRiNQWQmhzp7kEWg9cOyyQJpdIMUMPc/CPw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.1': + resolution: {integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.3': + resolution: {integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.2': + resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.1': + resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.1': + resolution: {integrity: sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.1.1': + resolution: {integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-tabs@1.1.2': + resolution: {integrity: sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.0': + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.1': + resolution: {integrity: sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + + '@remix-run/router@1.21.0': + resolution: {integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==} + engines: {node: '>=14.0.0'} + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.30.1': + resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.30.1': + resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.30.1': + resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.30.1': + resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.30.1': + resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.30.1': + resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.30.1': + resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.30.1': + resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.30.1': + resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.30.1': + resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.30.1': + resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.30.1': + resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.30.1': + resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.30.1': + resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} + cpu: [x64] + os: [win32] + + '@shikijs/core@1.26.2': + resolution: {integrity: sha512-ORyu3MrY7dCC7FDLDsFSkBM9b/AT9/Y8rH+UQ07Rtek48pp0ZhQOMPTKolqszP4bBCas6FqTZQYt18BBamVl/g==} + + '@shikijs/engine-javascript@1.26.2': + resolution: {integrity: sha512-ngkIu9swLVo9Zt5QBtz5Sk08vmPcwuj01r7pPK/Zjmo2U2WyKMK4WMUMmkdQiUacdcLth0zt8u1onp4zhkFXKQ==} + + '@shikijs/engine-oniguruma@1.26.2': + resolution: {integrity: sha512-mlN7Qrs+w60nKrd7at7XkXSwz6728Pe34taDmHrG6LRHjzCqQ+ysg+/AT6/D2LMk0s2lsr71DjpI73430QP4/w==} + + '@shikijs/langs@1.26.2': + resolution: {integrity: sha512-o5cdPycB2Kw3IgncHxWopWPiTkjAj7dG01fLkkUyj3glb5ftxL/Opecq9F54opMlrgXy7ZIqDERvFLlUzsCOuA==} + + '@shikijs/rehype@1.26.2': + resolution: {integrity: sha512-8h7FqdaMfT4xpcK8OtsRPpp8kHzQMpisB2VELLvTY4rYnLILxHAkfbaV8tuGXYBNtKeCji3Ym4oX+kDUjgVk3g==} + + '@shikijs/themes@1.26.2': + resolution: {integrity: sha512-y4Pn6PM5mODz/e3yF6jAUG7WLKJzqL2tJ5qMJCUkMUB1VRgtQVvoa1cHh7NScryGXyrYGJ8nPnRDhdv2rw0xpA==} + + '@shikijs/transformers@1.26.2': + resolution: {integrity: sha512-nAwivOhYDKudYsX9xOmA9ekkqYv+Q/IadX5ca0nV7qPTN+wf/tXHrjxVmJJlsEVtakCEuMR0a0AVL+V9QZxi7w==} + + '@shikijs/twoslash@1.26.2': + resolution: {integrity: sha512-fVQOCqtDz60fMzqPVUdNihUp78pEsLgl5SHSm3bw2+y0tbL5RYKi+inacdeWEqHgbbFVOAr8YiakEtTBCBXi+A==} + + '@shikijs/types@1.26.2': + resolution: {integrity: sha512-PO2jucx2FIdlLBPYbIUlMtWSLs5ulcRcuV93cR3T65lkK5SJP4MGBRt9kmWGXiQc0f7+FHj/0BEawditZcI/fQ==} + + '@shikijs/vscode-textmate@10.0.1': + resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@22.10.5': + resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} + + '@types/react@19.0.6': + resolution: {integrity: sha512-gIlMztcTeDgXCUj0vCBOqEuSEhX//63fW9SZtCJ+agxoQTOklwDfiEMlTWn4mR/C/UK5VHlpwsCsOyf7/hc4lw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@typescript/vfs@1.6.0': + resolution: {integrity: sha512-hvJUjNVeBMp77qPINuUvYXj4FyWeeMMKZkxEATEU3hqBAQ7qdTBCUFT7Sp0Zu0faeEtFf+ldXxMEDr/bk73ISg==} + peerDependencies: + typescript: '*' + + '@ungap/structured-clone@1.2.1': + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + + '@vanilla-extract/babel-plugin-debug-ids@1.2.0': + resolution: {integrity: sha512-z5nx2QBnOhvmlmBKeRX5sPVLz437wV30u+GJL+Hzj1rGiJYVNvgIIlzUpRNjVQ0MgAgiQIqIUbqPnmMc6HmDlQ==} + + '@vanilla-extract/css@1.17.0': + resolution: {integrity: sha512-W6FqVFDD+C71ZlKsuj0MxOXSvHb1tvQ9h/+79aYfi097wLsALrnnBzd0by8C///iurrpQ3S+SH74lXd7Lr9MvA==} + + '@vanilla-extract/dynamic@2.1.2': + resolution: {integrity: sha512-9BGMciD8rO1hdSPIAh1ntsG4LPD3IYKhywR7VOmmz9OO4Lx1hlwkSg3E6X07ujFx7YuBfx0GDQnApG9ESHvB2A==} + + '@vanilla-extract/integration@6.5.0': + resolution: {integrity: sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ==} + + '@vanilla-extract/private@1.0.6': + resolution: {integrity: sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw==} + + '@vanilla-extract/vite-plugin@3.9.5': + resolution: {integrity: sha512-CWI/CtrVW6i3HKccI6T7uGQkTJ8bd8Xl2UMBg3Pkr7dwWMmavXTeucV0I9KSbmXaYXSbEj+Q8c9y0xAZwtmTig==} + peerDependencies: + vite: ^2.2.3 || ^3.0.0 || ^4.0.3 || ^5.0.0 + + '@vitejs/plugin-react@4.3.1': + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001692: + resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chroma-js@2.6.0: + resolution: {integrity: sha512-BLHvCB9s8Z1EV4ethr6xnkl/P2YRFOGqfgvuMG/MyCbZPrTA+NeiByY6XvgF0zP4/2deU2CXnWyMa3zu1LqQ3A==} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.5: + resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} + engines: {node: '>= 0.8.0'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + create-vocs@1.0.0-alpha.5: + resolution: {integrity: sha512-/Nr9taHX1SxL5t72DLFPYujqD8d5PDk0T8bJ9Fb/m7ck1lP20PBxHzF5IYnHI0BeTpIuGk/MQoLfT6JKpY6xnw==} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-selector-parser@3.0.5: + resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + detect-package-manager@3.0.2: + resolution: {integrity: sha512-8JFjJHutStYrfWwzfretQoyNGoZVW1Fsrp4JO9spa7h/fBfwgTMEIy4/LBzRDGsxwVPHU0q+T9YvwLDJoOApLQ==} + engines: {node: '>=12'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.80: + resolution: {integrity: sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==} + + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-value-to-estree@3.2.1: + resolution: {integrity: sha512-Vt2UOjyPbNQQgT5eJh+K5aATti0OjCIAGc9SgMdOFYbohuifsWclR74l0iZTJwePMgWYdX1hlVS+dedH9XV8kw==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-classnames@3.0.0: + resolution: {integrity: sha512-tI3JjoGDEBVorMAWK4jNRsfLMYmih1BUOG3VV36pH36njs1IEl7xkNrVTD2mD2yYHmQCa5R/fj61a8IAF4bRaQ==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-select@6.0.3: + resolution: {integrity: sha512-OVRQlQ1XuuLP8aFVLYmC2atrfWHS5UD3shonxpnyrjcCkwtvmt/+N6kYJdcY4mkMJhxp4kj2EFIxQ9kvkkt/eQ==} + + hast-util-to-estree@3.1.1: + resolution: {integrity: sha512-IWtwwmPskfSmma9RpzCappDUitC8t5jhAynHhc1m2+5trOgsrp7txscUSavc5Ic8PATyAjfrCK1wgtxh2cICVQ==} + + hast-util-to-html@9.0.4: + resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} + + hast-util-to-jsx-runtime@2.3.2: + resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + + hono@3.12.12: + resolution: {integrity: sha512-5IAMJOXfpA5nT+K0MNjClchzz0IhBHs2Szl7WFAhrFOsbtQsYmNynFyJRg/a3IPsmCfxcrf8txUGiNShXpK5Rg==} + engines: {node: '>=16.0.0'} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + javascript-stringify@2.1.0: + resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-directive@3.0.0: + resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.2: + resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + + micromark-extension-mdx-jsx@3.0.1: + resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.2: + resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.0.3: + resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + + micromark@4.0.1: + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minisearch@6.3.0: + resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + modern-ahocorasick@1.1.0: + resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + oniguruma-to-es@1.0.0: + resolution: {integrity: sha512-kihvp0O4lFwf5tZMkfanwQLIZ9ORe9OeOFgZonH0BQeThgwfJiaZFeOfvvJVnJIM9TiVmx0RDD35hUJDR0++rQ==} + + ora@7.0.1: + resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} + engines: {node: '>=16'} + + outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.1: + resolution: {integrity: sha512-6jpjMpOth5S9ITVu5clZ7NOgHNsv5vRQdheL9ztp2vZmM6fRbLvyua1tiBIL4lk8SAe3ARzeXEly6siXCjDHDw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-types@1.3.0: + resolution: {integrity: sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + peerDependencies: + react: ^19.0.0 + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-helmet@6.1.0: + resolution: {integrity: sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==} + peerDependencies: + react: '>=16.3.0' + + react-intersection-observer@9.14.1: + resolution: {integrity: sha512-k1xIUn3sCQi3ugNeF64FJb3zwve5mcetvAUR9JazXeOmtap4IP2evN8rs+yf6SQ7F1QydsOGiqTmt+lySKZ9uA==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react-dom: + optional: true + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.2: + resolution: {integrity: sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-router-dom@6.28.1: + resolution: {integrity: sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.28.1: + resolution: {integrity: sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-side-effect@2.1.2: + resolution: {integrity: sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==} + peerDependencies: + react: ^16.3.0 || ^17.0.0 || ^18.0.0 + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.0: + resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + + rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + + rehype-class-names@1.0.14: + resolution: {integrity: sha512-eFBt6Qxb7K77y6P82tUtN9rKpU7guWlaK4XA4RrrSFHkUTCvr2D3cgb9OR5d4t1AaGOvR59FH9nRwUnbpn9AEg==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + + remark-directive@3.0.0: + resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-mdx-frontmatter@4.0.0: + resolution: {integrity: sha512-PZzAiDGOEfv1Ua7exQ8S5kKxkD8CDaSb4nM+1Mprs6u8dyvQifakh+kCj6NovfGXW+bTvrhjaR3srzjS2qJHKg==} + + remark-mdx@3.1.0: + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.1: + resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.30.1: + resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@1.26.2: + resolution: {integrity: sha512-iP7u2NA9A6JwRRCkIUREEX2cMhlYV5EBmbbSlfSRvPThwca8HBRbVkWuNWW+kw9+i6BSUZqqG6YeUs5dC2SjZw==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + twoslash-protocol@0.2.12: + resolution: {integrity: sha512-5qZLXVYfZ9ABdjqbvPc4RWMr7PrpPaaDSeaYY55vl/w1j6H6kzsWK/urAEIXlzYlyrFmyz1UbwIt+AA0ck+wbg==} + + twoslash@0.2.12: + resolution: {integrity: sha512-tEHPASMqi7kqwfJbkk7hc/4EhlrKCSLcur+TcvYki3vhIfaRMXnXjaYFgXpoZRbT6GdprD4tGuVBEmTpUgLBsw==} + peerDependencies: + typescript: '*' + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@1.0.40: + resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vocs@1.0.0-alpha.62: + resolution: {integrity: sha512-WidbX8M33lPlDjOvvjQyZaYGtn3hRZ3iViFuwvlmgAqCX1yGXaQs1tLdS1Cy5ki+q0BIUqXvvy8jo9rBQ+fM6w==} + hasBin: true + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.5': {} + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.5 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.5': + dependencies: + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 + + '@babel/parser@7.26.5': + dependencies: + '@babel/types': 7.26.5 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + + '@babel/traverse@7.26.5': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.5': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@clack/core@0.3.5': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.7.0': + dependencies: + '@clack/core': 0.3.5 + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@emotion/hash@0.9.2': {} + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/dom': 1.6.13 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@floating-ui/react@0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@floating-ui/utils': 0.2.9 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.9': {} + + '@hono/node-server@1.13.7(hono@3.12.12)': + dependencies: + hono: 3.12.12 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@mdx-js/mdx@3.1.0(acorn@8.14.0)': + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.2 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.14.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + + '@mdx-js/react@3.1.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.0.6 + react: 19.0.0 + + '@mdx-js/rollup@3.1.0(acorn@8.14.0)(rollup@4.30.1)': + dependencies: + '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) + rollup: 4.30.1 + source-map: 0.7.4 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + + '@noble/hashes@1.7.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.18.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@radix-ui/colors@3.0.0': {} + + '@radix-ui/primitive@1.1.1': {} + + '@radix-ui/react-accordion@1.2.2(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collapsible': 1.1.2(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-collection': 1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-arrow@1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-collapsible@1.1.2(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-collection@1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.6)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-context@1.1.1(@types/react@19.0.6)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-dialog@1.1.4(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.6)(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.2(@types/react@19.0.6)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-direction@1.1.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-dismissable-layer@1.1.3(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.6)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-focus-scope@1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-icons@1.3.2(react@19.0.0)': + dependencies: + react: 19.0.0 + + '@radix-ui/react-id@1.1.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-label@2.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-navigation-menu@1.2.3(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-popover@1.1.4(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-popper': 1.2.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.6)(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.2(@types/react@19.0.6)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-popper@1.2.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/rect': 1.1.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-portal@1.1.3(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-presence@1.1.2(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-primitive@2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-roving-focus@1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-slot@1.1.1(@types/react@19.0.6)(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-tabs@1.1.2(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-context': 1.1.1(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.6)(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-use-previous@1.1.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-use-size@1.1.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.6)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/react-visually-hidden@1.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + '@radix-ui/rect@1.1.0': {} + + '@remix-run/router@1.21.0': {} + + '@rollup/pluginutils@5.1.4(rollup@4.30.1)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.30.1 + + '@rollup/rollup-android-arm-eabi@4.30.1': + optional: true + + '@rollup/rollup-android-arm64@4.30.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.30.1': + optional: true + + '@rollup/rollup-darwin-x64@4.30.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.30.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.30.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.30.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.30.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.30.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.30.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.30.1': + optional: true + + '@shikijs/core@1.26.2': + dependencies: + '@shikijs/engine-javascript': 1.26.2 + '@shikijs/engine-oniguruma': 1.26.2 + '@shikijs/types': 1.26.2 + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.4 + + '@shikijs/engine-javascript@1.26.2': + dependencies: + '@shikijs/types': 1.26.2 + '@shikijs/vscode-textmate': 10.0.1 + oniguruma-to-es: 1.0.0 + + '@shikijs/engine-oniguruma@1.26.2': + dependencies: + '@shikijs/types': 1.26.2 + '@shikijs/vscode-textmate': 10.0.1 + + '@shikijs/langs@1.26.2': + dependencies: + '@shikijs/types': 1.26.2 + + '@shikijs/rehype@1.26.2': + dependencies: + '@shikijs/types': 1.26.2 + '@types/hast': 3.0.4 + hast-util-to-string: 3.0.1 + shiki: 1.26.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + '@shikijs/themes@1.26.2': + dependencies: + '@shikijs/types': 1.26.2 + + '@shikijs/transformers@1.26.2': + dependencies: + shiki: 1.26.2 + + '@shikijs/twoslash@1.26.2(typescript@5.7.3)': + dependencies: + '@shikijs/core': 1.26.2 + '@shikijs/types': 1.26.2 + twoslash: 0.2.12(typescript@5.7.3) + transitivePeerDependencies: + - supports-color + - typescript + + '@shikijs/types@1.26.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.1': {} + + '@types/acorn@4.0.6': + dependencies: + '@types/estree': 1.0.6 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.5 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.5 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.6 + + '@types/estree@1.0.6': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/ms@0.7.34': {} + + '@types/node@22.10.5': + dependencies: + undici-types: 6.20.0 + + '@types/react@19.0.6': + dependencies: + csstype: 3.1.3 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@typescript/vfs@1.6.0(typescript@5.7.3)': + dependencies: + debug: 4.4.0 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@ungap/structured-clone@1.2.1': {} + + '@vanilla-extract/babel-plugin-debug-ids@1.2.0': + dependencies: + '@babel/core': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@vanilla-extract/css@1.17.0': + dependencies: + '@emotion/hash': 0.9.2 + '@vanilla-extract/private': 1.0.6 + css-what: 6.1.0 + cssesc: 3.0.0 + csstype: 3.1.3 + dedent: 1.5.3 + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + lru-cache: 10.4.3 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.1.0 + picocolors: 1.1.1 + transitivePeerDependencies: + - babel-plugin-macros + + '@vanilla-extract/dynamic@2.1.2': + dependencies: + '@vanilla-extract/private': 1.0.6 + + '@vanilla-extract/integration@6.5.0(@types/node@22.10.5)': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + '@vanilla-extract/babel-plugin-debug-ids': 1.2.0 + '@vanilla-extract/css': 1.17.0 + esbuild: 0.19.12 + eval: 0.1.8 + find-up: 5.0.0 + javascript-stringify: 2.1.0 + lodash: 4.17.21 + mlly: 1.7.4 + outdent: 0.8.0 + vite: 5.4.11(@types/node@22.10.5) + vite-node: 1.6.0(@types/node@22.10.5) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + '@vanilla-extract/private@1.0.6': {} + + '@vanilla-extract/vite-plugin@3.9.5(@types/node@22.10.5)(vite@5.4.11(@types/node@22.10.5))': + dependencies: + '@vanilla-extract/integration': 6.5.0(@types/node@22.10.5) + outdent: 0.8.0 + postcss: 8.4.49 + postcss-load-config: 4.0.2(postcss@8.4.49) + vite: 5.4.11(@types/node@22.10.5) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - ts-node + + '@vitejs/plugin-react@4.3.1(vite@5.4.11(@types/node@22.10.5))': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.4.11(@types/node@22.10.5) + transitivePeerDependencies: + - supports-color + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + + astring@1.9.0: {} + + autoprefixer@10.4.20(postcss@8.4.49): + dependencies: + browserslist: 4.24.4 + caniuse-lite: 1.0.30001692 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bcp-47-match@2.0.3: {} + + binary-extensions@2.3.0: {} + + bl@5.1.0: + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + + boolbase@1.0.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001692 + electron-to-chromium: 1.5.80 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bytes@3.1.2: {} + + cac@6.7.14: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001692: {} + + ccount@2.0.1: {} + + chalk@5.4.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chroma-js@2.6.0: {} + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-spinners@2.9.2: {} + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + comma-separated-tokens@2.0.3: {} + + commander@4.1.1: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.53.0 + + compression@1.7.5: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + confbox@0.1.8: {} + + convert-source-map@2.0.0: {} + + create-vocs@1.0.0-alpha.5: + dependencies: + '@clack/prompts': 0.7.0 + cac: 6.7.14 + detect-package-manager: 3.0.2 + fs-extra: 11.2.0 + picocolors: 1.1.1 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-selector-parser@3.0.5: {} + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + dedent@1.5.3: {} + + deep-object-diff@1.1.9: {} + + deepmerge@4.3.1: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-node-es@1.1.0: {} + + detect-package-manager@3.0.2: + dependencies: + execa: 5.1.1 + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + didyoumean@1.2.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + direction@2.0.1: {} + + dlv@1.1.3: {} + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.80: {} + + emoji-regex-xs@1.0.0: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.14.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@5.0.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.6 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.4 + + estree-util-value-to-estree@3.2.1: + dependencies: + '@types/estree': 1.0.6 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + etag@1.8.1: {} + + eval@0.1.8: + dependencies: + '@types/node': 22.10.5 + require-like: 0.1.2 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + extend@3.0.2: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.18.0: + dependencies: + reusify: 1.0.4 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + format@0.2.2: {} + + fraction.js@4.3.7: {} + + fresh@0.5.2: {} + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-nonce@1.0.1: {} + + get-stream@6.0.1: {} + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@11.12.0: {} + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 4.0.0 + + graceful-fs@4.2.11: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-classnames@3.0.0: + dependencies: + '@types/hast': 3.0.4 + space-separated-tokens: 2.0.2 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-select@6.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.0.5 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.1: + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.8 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.2: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.8 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + hono@3.12.12: {} + + html-void-elements@3.0.0: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + human-signals@2.1.0: {} + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + inherits@2.0.4: {} + + inline-style-parser@0.2.4: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-buffer@2.0.5: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-decimal@2.0.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-interactive@2.0.0: {} + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-stream@2.0.1: {} + + is-unicode-supported@1.3.0: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + javascript-stringify@2.1.0: {} + + jiti@1.21.7: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash@4.17.21: {} + + log-symbols@5.1.0: + dependencies: + chalk: 5.4.1 + is-unicode-supported: 1.3.0 + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + mark.js@8.11.1: {} + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + mdast-util-directive@3.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + media-query-parser@2.0.2: + dependencies: + '@babel/runtime': 7.26.0 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.2: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + parse-entities: 4.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.1 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-mdx-expression@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-mdx-jsx@3.0.1: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.1 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.1 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-mdx-expression@2.0.2: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.1 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.2: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.1 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.0.3: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + + micromark@4.0.1: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.53.0: {} + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + minisearch@6.3.0: {} + + mlly@1.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.1 + pkg-types: 1.3.0 + ufo: 1.5.4 + + modern-ahocorasick@1.1.0: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.8: {} + + negotiator@0.6.4: {} + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + oniguruma-to-es@1.0.0: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 + + ora@7.0.1: + dependencies: + chalk: 5.4.1 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + string-width: 6.1.0 + strip-ansi: 7.1.0 + + outdent@0.8.0: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathe@2.0.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@2.3.0: {} + + pirates@4.0.6: {} + + pkg-types@1.3.0: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 1.1.2 + + postcss-import@15.1.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.0.1(postcss@8.4.49): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.49 + + postcss-load-config@4.0.2(postcss@8.4.49): + dependencies: + lilconfig: 3.1.3 + yaml: 2.7.0 + optionalDependencies: + postcss: 8.4.49 + + postcss-nested@6.2.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.49: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@6.5.0: {} + + queue-microtask@1.2.3: {} + + range-parser@1.2.1: {} + + react-dom@19.0.0(react@19.0.0): + dependencies: + react: 19.0.0 + scheduler: 0.25.0 + + react-fast-compare@3.2.2: {} + + react-helmet@6.1.0(react@19.0.0): + dependencies: + object-assign: 4.1.1 + prop-types: 15.8.1 + react: 19.0.0 + react-fast-compare: 3.2.2 + react-side-effect: 2.1.2(react@19.0.0) + + react-intersection-observer@9.14.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + react: 19.0.0 + optionalDependencies: + react-dom: 19.0.0(react@19.0.0) + + react-is@16.13.1: {} + + react-refresh@0.14.2: {} + + react-remove-scroll-bar@2.3.8(@types/react@19.0.6)(react@19.0.0): + dependencies: + react: 19.0.0 + react-style-singleton: 2.2.3(@types/react@19.0.6)(react@19.0.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.6 + + react-remove-scroll@2.6.2(@types/react@19.0.6)(react@19.0.0): + dependencies: + react: 19.0.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.0.6)(react@19.0.0) + react-style-singleton: 2.2.3(@types/react@19.0.6)(react@19.0.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.0.6)(react@19.0.0) + use-sidecar: 1.1.3(@types/react@19.0.6)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + + react-router-dom@6.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@remix-run/router': 1.21.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-router: 6.28.1(react@19.0.0) + + react-router@6.28.1(react@19.0.0): + dependencies: + '@remix-run/router': 1.21.0 + react: 19.0.0 + + react-side-effect@2.1.2(react@19.0.0): + dependencies: + react: 19.0.0 + + react-style-singleton@2.2.3(@types/react@19.0.6)(react@19.0.0): + dependencies: + get-nonce: 1.0.1 + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.6 + + react@19.0.0: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.14.0): + dependencies: + acorn-jsx: 5.3.2(acorn@8.14.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.6 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regenerator-runtime@0.14.1: {} + + regex-recursion@5.1.1: + dependencies: + regex: 5.1.1 + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@5.1.1: + dependencies: + regex-utilities: 2.3.0 + + rehype-autolink-headings@7.1.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.1 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-class-names@1.0.14: + dependencies: + '@types/hast': 3.0.4 + hast-util-classnames: 3.0.0 + hast-util-select: 6.0.3 + unified: 10.1.2 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.1 + transitivePeerDependencies: + - supports-color + + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.1 + unist-util-visit: 5.0.0 + + remark-directive@3.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.0.0 + micromark-extension-directive: 3.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx-frontmatter@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + estree-util-is-identifier-name: 3.0.0 + estree-util-value-to-estree: 3.2.1 + toml: 3.0.0 + unified: 11.0.5 + yaml: 2.7.0 + + remark-mdx@3.1.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.1 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + require-like@0.1.2: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.0.4: {} + + rollup@4.30.1: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.30.1 + '@rollup/rollup-android-arm64': 4.30.1 + '@rollup/rollup-darwin-arm64': 4.30.1 + '@rollup/rollup-darwin-x64': 4.30.1 + '@rollup/rollup-freebsd-arm64': 4.30.1 + '@rollup/rollup-freebsd-x64': 4.30.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 + '@rollup/rollup-linux-arm-musleabihf': 4.30.1 + '@rollup/rollup-linux-arm64-gnu': 4.30.1 + '@rollup/rollup-linux-arm64-musl': 4.30.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 + '@rollup/rollup-linux-riscv64-gnu': 4.30.1 + '@rollup/rollup-linux-s390x-gnu': 4.30.1 + '@rollup/rollup-linux-x64-gnu': 4.30.1 + '@rollup/rollup-linux-x64-musl': 4.30.1 + '@rollup/rollup-win32-arm64-msvc': 4.30.1 + '@rollup/rollup-win32-ia32-msvc': 4.30.1 + '@rollup/rollup-win32-x64-msvc': 4.30.1 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + scheduler@0.25.0: {} + + semver@6.3.1: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shiki@1.26.2: + dependencies: + '@shikijs/core': 1.26.2 + '@shikijs/engine-javascript': 1.26.2 + '@shikijs/engine-oniguruma': 1.26.2 + '@shikijs/langs': 1.26.2 + '@shikijs/themes': 1.26.2 + '@shikijs/types': 1.26.2 + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sisteransi@1.0.5: {} + + slash@4.0.0: {} + + source-map-js@1.2.1: {} + + source-map@0.7.4: {} + + space-separated-tokens@2.0.2: {} + + statuses@2.0.1: {} + + stdin-discarder@0.1.0: + dependencies: + bl: 5.1.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@6.1.0: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 10.4.0 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@2.0.0: {} + + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-preserve-symlinks-flag@1.0.0: {} + + tabbable@6.2.0: {} + + tailwindcss@3.4.17: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-import: 15.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49) + postcss-nested: 6.2.0(postcss@8.4.49) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + toml@3.0.0: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-interface-checker@0.1.13: {} + + tslib@2.8.1: {} + + twoslash-protocol@0.2.12: {} + + twoslash@0.2.12(typescript@5.7.3): + dependencies: + '@typescript/vfs': 1.6.0(typescript@5.7.3) + twoslash-protocol: 0.2.12 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + typescript@5.7.3: {} + + ua-parser-js@1.0.40: {} + + ufo@1.5.4: {} + + undici-types@6.20.0: {} + + unified@10.1.2: + dependencies: + '@types/unist': 2.0.11 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 5.3.7 + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@3.0.3: + dependencies: + '@types/unist': 2.0.11 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@2.0.1: {} + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + use-callback-ref@1.3.3(@types/react@19.0.6)(react@19.0.0): + dependencies: + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.6 + + use-sidecar@1.1.3(@types/react@19.0.6)(react@19.0.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.6 + + util-deprecate@1.0.2: {} + + vary@1.1.2: {} + + vfile-message@3.1.4: + dependencies: + '@types/unist': 2.0.11 + unist-util-stringify-position: 3.0.3 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@5.3.7: + dependencies: + '@types/unist': 2.0.11 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vite-node@1.6.0(@types/node@22.10.5): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.11(@types/node@22.10.5) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.11(@types/node@22.10.5): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.30.1 + optionalDependencies: + '@types/node': 22.10.5 + fsevents: 2.3.3 + + vocs@1.0.0-alpha.62(@types/node@22.10.5)(@types/react@19.0.6)(acorn@8.14.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(rollup@4.30.1)(typescript@5.7.3): + dependencies: + '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@hono/node-server': 1.13.7(hono@3.12.12) + '@mdx-js/react': 3.1.0(@types/react@19.0.6)(react@19.0.0) + '@mdx-js/rollup': 3.1.0(acorn@8.14.0)(rollup@4.30.1) + '@noble/hashes': 1.7.0 + '@radix-ui/colors': 3.0.0 + '@radix-ui/react-accordion': 1.2.2(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-dialog': 1.1.4(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-icons': 1.3.2(react@19.0.0) + '@radix-ui/react-label': 2.1.1(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-navigation-menu': 1.2.3(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-popover': 1.1.4(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-tabs': 1.1.2(@types/react@19.0.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@shikijs/rehype': 1.26.2 + '@shikijs/transformers': 1.26.2 + '@shikijs/twoslash': 1.26.2(typescript@5.7.3) + '@vanilla-extract/css': 1.17.0 + '@vanilla-extract/dynamic': 2.1.2 + '@vanilla-extract/vite-plugin': 3.9.5(@types/node@22.10.5)(vite@5.4.11(@types/node@22.10.5)) + '@vitejs/plugin-react': 4.3.1(vite@5.4.11(@types/node@22.10.5)) + autoprefixer: 10.4.20(postcss@8.4.49) + cac: 6.7.14 + chroma-js: 2.6.0 + clsx: 2.1.1 + compression: 1.7.5 + create-vocs: 1.0.0-alpha.5 + cross-spawn: 7.0.6 + fs-extra: 11.2.0 + globby: 13.2.2 + hastscript: 8.0.0 + hono: 3.12.12 + mark.js: 8.11.1 + mdast-util-directive: 3.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm: 3.0.0 + mdast-util-to-hast: 13.2.0 + minimatch: 9.0.5 + minisearch: 6.3.0 + ora: 7.0.1 + p-limit: 5.0.0 + postcss: 8.4.49 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-helmet: 6.1.0(react@19.0.0) + react-intersection-observer: 9.14.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-router-dom: 6.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + rehype-autolink-headings: 7.1.0 + rehype-class-names: 1.0.14 + rehype-slug: 6.0.0 + remark-directive: 3.0.0 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.0 + remark-mdx-frontmatter: 4.0.0 + remark-parse: 11.0.0 + serve-static: 1.16.2 + shiki: 1.26.2 + tailwindcss: 3.4.17 + toml: 3.0.0 + twoslash: 0.2.12(typescript@5.7.3) + ua-parser-js: 1.0.40 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vite: 5.4.11(@types/node@22.10.5) + transitivePeerDependencies: + - '@types/node' + - '@types/react' + - '@types/react-dom' + - acorn + - babel-plugin-macros + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - ts-node + - typescript + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + yallist@3.1.1: {} + + yaml@2.7.0: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.1.1: {} + + zwitch@2.0.4: {} diff --git a/docs/bugs.mdx b/src/pages/bugs.mdx similarity index 100% rename from docs/bugs.mdx rename to src/pages/bugs.mdx diff --git a/docs/changelog.mdx b/src/pages/changelog.mdx similarity index 100% rename from docs/changelog.mdx rename to src/pages/changelog.mdx diff --git a/docs/contracts/index.mdx b/src/pages/contracts/index.mdx similarity index 100% rename from docs/contracts/index.mdx rename to src/pages/contracts/index.mdx diff --git a/docs/dao/constitution.mdx b/src/pages/dao/constitution.mdx similarity index 100% rename from docs/dao/constitution.mdx rename to src/pages/dao/constitution.mdx diff --git a/docs/dao/foundation.mdx b/src/pages/dao/foundation.mdx similarity index 100% rename from docs/dao/foundation.mdx rename to src/pages/dao/foundation.mdx diff --git a/docs/dao/governance/moderator.mdx b/src/pages/dao/governance/moderator.mdx similarity index 100% rename from docs/dao/governance/moderator.mdx rename to src/pages/dao/governance/moderator.mdx diff --git a/docs/dao/governance/process.mdx b/src/pages/dao/governance/process.mdx similarity index 100% rename from docs/dao/governance/process.mdx rename to src/pages/dao/governance/process.mdx diff --git a/docs/dao/index.mdx b/src/pages/dao/index.mdx similarity index 100% rename from docs/dao/index.mdx rename to src/pages/dao/index.mdx diff --git a/docs/dao/proposals/0.1.mdx b/src/pages/dao/proposals/0.1.mdx similarity index 100% rename from docs/dao/proposals/0.1.mdx rename to src/pages/dao/proposals/0.1.mdx diff --git a/docs/dao/proposals/0.2.mdx b/src/pages/dao/proposals/0.2.mdx similarity index 100% rename from docs/dao/proposals/0.2.mdx rename to src/pages/dao/proposals/0.2.mdx diff --git a/docs/dao/proposals/0.3.mdx b/src/pages/dao/proposals/0.3.mdx similarity index 100% rename from docs/dao/proposals/0.3.mdx rename to src/pages/dao/proposals/0.3.mdx diff --git a/docs/dao/proposals/0.4.mdx b/src/pages/dao/proposals/0.4.mdx similarity index 100% rename from docs/dao/proposals/0.4.mdx rename to src/pages/dao/proposals/0.4.mdx diff --git a/docs/dao/proposals/1.1.mdx b/src/pages/dao/proposals/1.1.mdx similarity index 100% rename from docs/dao/proposals/1.1.mdx rename to src/pages/dao/proposals/1.1.mdx diff --git a/docs/dao/proposals/1.2.1.mdx b/src/pages/dao/proposals/1.2.1.mdx similarity index 100% rename from docs/dao/proposals/1.2.1.mdx rename to src/pages/dao/proposals/1.2.1.mdx diff --git a/docs/dao/proposals/1.2.2.mdx b/src/pages/dao/proposals/1.2.2.mdx similarity index 100% rename from docs/dao/proposals/1.2.2.mdx rename to src/pages/dao/proposals/1.2.2.mdx diff --git a/docs/dao/proposals/1.3.1.mdx b/src/pages/dao/proposals/1.3.1.mdx similarity index 100% rename from docs/dao/proposals/1.3.1.mdx rename to src/pages/dao/proposals/1.3.1.mdx diff --git a/docs/dao/proposals/1.3.2.mdx b/src/pages/dao/proposals/1.3.2.mdx similarity index 100% rename from docs/dao/proposals/1.3.2.mdx rename to src/pages/dao/proposals/1.3.2.mdx diff --git a/docs/dao/proposals/1.3.3.mdx b/src/pages/dao/proposals/1.3.3.mdx similarity index 100% rename from docs/dao/proposals/1.3.3.mdx rename to src/pages/dao/proposals/1.3.3.mdx diff --git a/docs/dao/proposals/1.3.4.mdx b/src/pages/dao/proposals/1.3.4.mdx similarity index 100% rename from docs/dao/proposals/1.3.4.mdx rename to src/pages/dao/proposals/1.3.4.mdx diff --git a/docs/dao/proposals/1.4.mdx b/src/pages/dao/proposals/1.4.mdx similarity index 100% rename from docs/dao/proposals/1.4.mdx rename to src/pages/dao/proposals/1.4.mdx diff --git a/docs/dao/proposals/1.5.mdx b/src/pages/dao/proposals/1.5.mdx similarity index 100% rename from docs/dao/proposals/1.5.mdx rename to src/pages/dao/proposals/1.5.mdx diff --git a/docs/dao/proposals/1.6.mdx b/src/pages/dao/proposals/1.6.mdx similarity index 100% rename from docs/dao/proposals/1.6.mdx rename to src/pages/dao/proposals/1.6.mdx diff --git a/docs/dao/proposals/1.7.mdx b/src/pages/dao/proposals/1.7.mdx similarity index 100% rename from docs/dao/proposals/1.7.mdx rename to src/pages/dao/proposals/1.7.mdx diff --git a/docs/dao/proposals/1.8.mdx b/src/pages/dao/proposals/1.8.mdx similarity index 100% rename from docs/dao/proposals/1.8.mdx rename to src/pages/dao/proposals/1.8.mdx diff --git a/docs/dao/proposals/1.9.mdx b/src/pages/dao/proposals/1.9.mdx similarity index 100% rename from docs/dao/proposals/1.9.mdx rename to src/pages/dao/proposals/1.9.mdx diff --git a/docs/dao/proposals/2.1.mdx b/src/pages/dao/proposals/2.1.mdx similarity index 100% rename from docs/dao/proposals/2.1.mdx rename to src/pages/dao/proposals/2.1.mdx diff --git a/docs/dao/proposals/2.2.1.mdx b/src/pages/dao/proposals/2.2.1.mdx similarity index 100% rename from docs/dao/proposals/2.2.1.mdx rename to src/pages/dao/proposals/2.2.1.mdx diff --git a/docs/dao/proposals/2.2.2.mdx b/src/pages/dao/proposals/2.2.2.mdx similarity index 100% rename from docs/dao/proposals/2.2.2.mdx rename to src/pages/dao/proposals/2.2.2.mdx diff --git a/docs/dao/proposals/2.2.3.mdx b/src/pages/dao/proposals/2.2.3.mdx similarity index 100% rename from docs/dao/proposals/2.2.3.mdx rename to src/pages/dao/proposals/2.2.3.mdx diff --git a/docs/dao/proposals/2.2.4.mdx b/src/pages/dao/proposals/2.2.4.mdx similarity index 100% rename from docs/dao/proposals/2.2.4.mdx rename to src/pages/dao/proposals/2.2.4.mdx diff --git a/docs/dao/proposals/2.2.5.mdx b/src/pages/dao/proposals/2.2.5.mdx similarity index 100% rename from docs/dao/proposals/2.2.5.mdx rename to src/pages/dao/proposals/2.2.5.mdx diff --git a/docs/dao/proposals/3.1.1.mdx b/src/pages/dao/proposals/3.1.1.mdx similarity index 100% rename from docs/dao/proposals/3.1.1.mdx rename to src/pages/dao/proposals/3.1.1.mdx diff --git a/docs/dao/proposals/3.1.2.mdx b/src/pages/dao/proposals/3.1.2.mdx similarity index 100% rename from docs/dao/proposals/3.1.2.mdx rename to src/pages/dao/proposals/3.1.2.mdx diff --git a/docs/dao/proposals/3.1.3.mdx b/src/pages/dao/proposals/3.1.3.mdx similarity index 100% rename from docs/dao/proposals/3.1.3.mdx rename to src/pages/dao/proposals/3.1.3.mdx diff --git a/docs/dao/proposals/3.2.mdx b/src/pages/dao/proposals/3.2.mdx similarity index 100% rename from docs/dao/proposals/3.2.mdx rename to src/pages/dao/proposals/3.2.mdx diff --git a/docs/dao/proposals/3.3.mdx b/src/pages/dao/proposals/3.3.mdx similarity index 100% rename from docs/dao/proposals/3.3.mdx rename to src/pages/dao/proposals/3.3.mdx diff --git a/docs/dao/proposals/3.4.mdx b/src/pages/dao/proposals/3.4.mdx similarity index 100% rename from docs/dao/proposals/3.4.mdx rename to src/pages/dao/proposals/3.4.mdx diff --git a/docs/dao/proposals/3.5.mdx b/src/pages/dao/proposals/3.5.mdx similarity index 100% rename from docs/dao/proposals/3.5.mdx rename to src/pages/dao/proposals/3.5.mdx diff --git a/docs/dao/proposals/3.6.mdx b/src/pages/dao/proposals/3.6.mdx similarity index 100% rename from docs/dao/proposals/3.6.mdx rename to src/pages/dao/proposals/3.6.mdx diff --git a/docs/dao/proposals/3.7.mdx b/src/pages/dao/proposals/3.7.mdx similarity index 100% rename from docs/dao/proposals/3.7.mdx rename to src/pages/dao/proposals/3.7.mdx diff --git a/docs/dao/proposals/4.1.mdx b/src/pages/dao/proposals/4.1.mdx similarity index 100% rename from docs/dao/proposals/4.1.mdx rename to src/pages/dao/proposals/4.1.mdx diff --git a/docs/dao/proposals/4.10.mdx b/src/pages/dao/proposals/4.10.mdx similarity index 100% rename from docs/dao/proposals/4.10.mdx rename to src/pages/dao/proposals/4.10.mdx diff --git a/docs/dao/proposals/4.2.mdx b/src/pages/dao/proposals/4.2.mdx similarity index 100% rename from docs/dao/proposals/4.2.mdx rename to src/pages/dao/proposals/4.2.mdx diff --git a/docs/dao/proposals/4.3.mdx b/src/pages/dao/proposals/4.3.mdx similarity index 100% rename from docs/dao/proposals/4.3.mdx rename to src/pages/dao/proposals/4.3.mdx diff --git a/docs/dao/proposals/4.4.mdx b/src/pages/dao/proposals/4.4.mdx similarity index 100% rename from docs/dao/proposals/4.4.mdx rename to src/pages/dao/proposals/4.4.mdx diff --git a/docs/dao/proposals/4.5.mdx b/src/pages/dao/proposals/4.5.mdx similarity index 100% rename from docs/dao/proposals/4.5.mdx rename to src/pages/dao/proposals/4.5.mdx diff --git a/docs/dao/proposals/4.6.mdx b/src/pages/dao/proposals/4.6.mdx similarity index 100% rename from docs/dao/proposals/4.6.mdx rename to src/pages/dao/proposals/4.6.mdx diff --git a/docs/dao/proposals/4.7.mdx b/src/pages/dao/proposals/4.7.mdx similarity index 100% rename from docs/dao/proposals/4.7.mdx rename to src/pages/dao/proposals/4.7.mdx diff --git a/docs/dao/proposals/4.8.mdx b/src/pages/dao/proposals/4.8.mdx similarity index 100% rename from docs/dao/proposals/4.8.mdx rename to src/pages/dao/proposals/4.8.mdx diff --git a/docs/dao/proposals/4.9.mdx b/src/pages/dao/proposals/4.9.mdx similarity index 100% rename from docs/dao/proposals/4.9.mdx rename to src/pages/dao/proposals/4.9.mdx diff --git a/docs/dao/proposals/5.1.mdx b/src/pages/dao/proposals/5.1.mdx similarity index 100% rename from docs/dao/proposals/5.1.mdx rename to src/pages/dao/proposals/5.1.mdx diff --git a/docs/dao/proposals/5.10.mdx b/src/pages/dao/proposals/5.10.mdx similarity index 100% rename from docs/dao/proposals/5.10.mdx rename to src/pages/dao/proposals/5.10.mdx diff --git a/docs/dao/proposals/5.11.mdx b/src/pages/dao/proposals/5.11.mdx similarity index 100% rename from docs/dao/proposals/5.11.mdx rename to src/pages/dao/proposals/5.11.mdx diff --git a/docs/dao/proposals/5.12.mdx b/src/pages/dao/proposals/5.12.mdx similarity index 100% rename from docs/dao/proposals/5.12.mdx rename to src/pages/dao/proposals/5.12.mdx diff --git a/docs/dao/proposals/5.13.mdx b/src/pages/dao/proposals/5.13.mdx similarity index 100% rename from docs/dao/proposals/5.13.mdx rename to src/pages/dao/proposals/5.13.mdx diff --git a/docs/dao/proposals/5.14.mdx b/src/pages/dao/proposals/5.14.mdx similarity index 100% rename from docs/dao/proposals/5.14.mdx rename to src/pages/dao/proposals/5.14.mdx diff --git a/docs/dao/proposals/5.15.mdx b/src/pages/dao/proposals/5.15.mdx similarity index 100% rename from docs/dao/proposals/5.15.mdx rename to src/pages/dao/proposals/5.15.mdx diff --git a/docs/dao/proposals/5.16.mdx b/src/pages/dao/proposals/5.16.mdx similarity index 100% rename from docs/dao/proposals/5.16.mdx rename to src/pages/dao/proposals/5.16.mdx diff --git a/docs/dao/proposals/5.17.1.mdx b/src/pages/dao/proposals/5.17.1.mdx similarity index 100% rename from docs/dao/proposals/5.17.1.mdx rename to src/pages/dao/proposals/5.17.1.mdx diff --git a/docs/dao/proposals/5.17.2.mdx b/src/pages/dao/proposals/5.17.2.mdx similarity index 100% rename from docs/dao/proposals/5.17.2.mdx rename to src/pages/dao/proposals/5.17.2.mdx diff --git a/docs/dao/proposals/5.17.3.mdx b/src/pages/dao/proposals/5.17.3.mdx similarity index 100% rename from docs/dao/proposals/5.17.3.mdx rename to src/pages/dao/proposals/5.17.3.mdx diff --git a/docs/dao/proposals/5.18.mdx b/src/pages/dao/proposals/5.18.mdx similarity index 100% rename from docs/dao/proposals/5.18.mdx rename to src/pages/dao/proposals/5.18.mdx diff --git a/docs/dao/proposals/5.19.mdx b/src/pages/dao/proposals/5.19.mdx similarity index 100% rename from docs/dao/proposals/5.19.mdx rename to src/pages/dao/proposals/5.19.mdx diff --git a/docs/dao/proposals/5.2.mdx b/src/pages/dao/proposals/5.2.mdx similarity index 100% rename from docs/dao/proposals/5.2.mdx rename to src/pages/dao/proposals/5.2.mdx diff --git a/docs/dao/proposals/5.20.mdx b/src/pages/dao/proposals/5.20.mdx similarity index 100% rename from docs/dao/proposals/5.20.mdx rename to src/pages/dao/proposals/5.20.mdx diff --git a/docs/dao/proposals/5.21.mdx b/src/pages/dao/proposals/5.21.mdx similarity index 100% rename from docs/dao/proposals/5.21.mdx rename to src/pages/dao/proposals/5.21.mdx diff --git a/docs/dao/proposals/5.22.mdx b/src/pages/dao/proposals/5.22.mdx similarity index 100% rename from docs/dao/proposals/5.22.mdx rename to src/pages/dao/proposals/5.22.mdx diff --git a/docs/dao/proposals/5.23.mdx b/src/pages/dao/proposals/5.23.mdx similarity index 100% rename from docs/dao/proposals/5.23.mdx rename to src/pages/dao/proposals/5.23.mdx diff --git a/docs/dao/proposals/5.24.mdx b/src/pages/dao/proposals/5.24.mdx similarity index 100% rename from docs/dao/proposals/5.24.mdx rename to src/pages/dao/proposals/5.24.mdx diff --git a/docs/dao/proposals/5.25.mdx b/src/pages/dao/proposals/5.25.mdx similarity index 100% rename from docs/dao/proposals/5.25.mdx rename to src/pages/dao/proposals/5.25.mdx diff --git a/docs/dao/proposals/5.26.mdx b/src/pages/dao/proposals/5.26.mdx similarity index 100% rename from docs/dao/proposals/5.26.mdx rename to src/pages/dao/proposals/5.26.mdx diff --git a/docs/dao/proposals/5.27.mdx b/src/pages/dao/proposals/5.27.mdx similarity index 100% rename from docs/dao/proposals/5.27.mdx rename to src/pages/dao/proposals/5.27.mdx diff --git a/docs/dao/proposals/5.28.mdx b/src/pages/dao/proposals/5.28.mdx similarity index 100% rename from docs/dao/proposals/5.28.mdx rename to src/pages/dao/proposals/5.28.mdx diff --git a/docs/dao/proposals/5.29.mdx b/src/pages/dao/proposals/5.29.mdx similarity index 100% rename from docs/dao/proposals/5.29.mdx rename to src/pages/dao/proposals/5.29.mdx diff --git a/docs/dao/proposals/5.3.mdx b/src/pages/dao/proposals/5.3.mdx similarity index 100% rename from docs/dao/proposals/5.3.mdx rename to src/pages/dao/proposals/5.3.mdx diff --git a/docs/dao/proposals/5.4.1.mdx b/src/pages/dao/proposals/5.4.1.mdx similarity index 100% rename from docs/dao/proposals/5.4.1.mdx rename to src/pages/dao/proposals/5.4.1.mdx diff --git a/docs/dao/proposals/5.4.2.mdx b/src/pages/dao/proposals/5.4.2.mdx similarity index 100% rename from docs/dao/proposals/5.4.2.mdx rename to src/pages/dao/proposals/5.4.2.mdx diff --git a/docs/dao/proposals/5.5.mdx b/src/pages/dao/proposals/5.5.mdx similarity index 100% rename from docs/dao/proposals/5.5.mdx rename to src/pages/dao/proposals/5.5.mdx diff --git a/docs/dao/proposals/5.6.mdx b/src/pages/dao/proposals/5.6.mdx similarity index 100% rename from docs/dao/proposals/5.6.mdx rename to src/pages/dao/proposals/5.6.mdx diff --git a/docs/dao/proposals/5.7.mdx b/src/pages/dao/proposals/5.7.mdx similarity index 100% rename from docs/dao/proposals/5.7.mdx rename to src/pages/dao/proposals/5.7.mdx diff --git a/docs/dao/proposals/5.8.mdx b/src/pages/dao/proposals/5.8.mdx similarity index 100% rename from docs/dao/proposals/5.8.mdx rename to src/pages/dao/proposals/5.8.mdx diff --git a/docs/dao/proposals/5.9.mdx b/src/pages/dao/proposals/5.9.mdx similarity index 100% rename from docs/dao/proposals/5.9.mdx rename to src/pages/dao/proposals/5.9.mdx diff --git a/docs/dao/proposals/submit.mdx b/src/pages/dao/proposals/submit.mdx similarity index 100% rename from docs/dao/proposals/submit.mdx rename to src/pages/dao/proposals/submit.mdx diff --git a/docs/dao/stewards.mdx b/src/pages/dao/stewards.mdx similarity index 100% rename from docs/dao/stewards.mdx rename to src/pages/dao/stewards.mdx diff --git a/docs/dao/token.mdx b/src/pages/dao/token.mdx similarity index 100% rename from docs/dao/token.mdx rename to src/pages/dao/token.mdx diff --git a/docs/dao/wg/rules.mdx b/src/pages/dao/wg/rules.mdx similarity index 100% rename from docs/dao/wg/rules.mdx rename to src/pages/dao/wg/rules.mdx diff --git a/docs/disappeared.mdx b/src/pages/disappeared.mdx similarity index 100% rename from docs/disappeared.mdx rename to src/pages/disappeared.mdx diff --git a/docs/dns/tlds.mdx b/src/pages/dns/tlds.mdx similarity index 100% rename from docs/dns/tlds.mdx rename to src/pages/dns/tlds.mdx diff --git a/docs/dweb/intro.mdx b/src/pages/dweb/intro.mdx similarity index 100% rename from docs/dweb/intro.mdx rename to src/pages/dweb/intro.mdx diff --git a/docs/ensip/1.mdx b/src/pages/ensip/1.mdx similarity index 100% rename from docs/ensip/1.mdx rename to src/pages/ensip/1.mdx diff --git a/docs/ensip/10.mdx b/src/pages/ensip/10.mdx similarity index 100% rename from docs/ensip/10.mdx rename to src/pages/ensip/10.mdx diff --git a/docs/ensip/11.mdx b/src/pages/ensip/11.mdx similarity index 100% rename from docs/ensip/11.mdx rename to src/pages/ensip/11.mdx diff --git a/docs/ensip/12.mdx b/src/pages/ensip/12.mdx similarity index 100% rename from docs/ensip/12.mdx rename to src/pages/ensip/12.mdx diff --git a/docs/ensip/13.mdx b/src/pages/ensip/13.mdx similarity index 100% rename from docs/ensip/13.mdx rename to src/pages/ensip/13.mdx diff --git a/docs/ensip/14.mdx b/src/pages/ensip/14.mdx similarity index 100% rename from docs/ensip/14.mdx rename to src/pages/ensip/14.mdx diff --git a/docs/ensip/15.mdx b/src/pages/ensip/15.mdx similarity index 100% rename from docs/ensip/15.mdx rename to src/pages/ensip/15.mdx diff --git a/docs/ensip/16.mdx b/src/pages/ensip/16.mdx similarity index 100% rename from docs/ensip/16.mdx rename to src/pages/ensip/16.mdx diff --git a/docs/ensip/17.mdx b/src/pages/ensip/17.mdx similarity index 100% rename from docs/ensip/17.mdx rename to src/pages/ensip/17.mdx diff --git a/docs/ensip/18.mdx b/src/pages/ensip/18.mdx similarity index 100% rename from docs/ensip/18.mdx rename to src/pages/ensip/18.mdx diff --git a/docs/ensip/19.mdx b/src/pages/ensip/19.mdx similarity index 100% rename from docs/ensip/19.mdx rename to src/pages/ensip/19.mdx diff --git a/docs/ensip/2.mdx b/src/pages/ensip/2.mdx similarity index 100% rename from docs/ensip/2.mdx rename to src/pages/ensip/2.mdx diff --git a/docs/ensip/3.mdx b/src/pages/ensip/3.mdx similarity index 100% rename from docs/ensip/3.mdx rename to src/pages/ensip/3.mdx diff --git a/docs/ensip/4.mdx b/src/pages/ensip/4.mdx similarity index 100% rename from docs/ensip/4.mdx rename to src/pages/ensip/4.mdx diff --git a/docs/ensip/5.mdx b/src/pages/ensip/5.mdx similarity index 100% rename from docs/ensip/5.mdx rename to src/pages/ensip/5.mdx diff --git a/docs/ensip/6.mdx b/src/pages/ensip/6.mdx similarity index 100% rename from docs/ensip/6.mdx rename to src/pages/ensip/6.mdx diff --git a/docs/ensip/7.mdx b/src/pages/ensip/7.mdx similarity index 100% rename from docs/ensip/7.mdx rename to src/pages/ensip/7.mdx diff --git a/docs/ensip/8.mdx b/src/pages/ensip/8.mdx similarity index 100% rename from docs/ensip/8.mdx rename to src/pages/ensip/8.mdx diff --git a/docs/ensip/9.mdx b/src/pages/ensip/9.mdx similarity index 100% rename from docs/ensip/9.mdx rename to src/pages/ensip/9.mdx diff --git a/docs/ensip/index.mdx b/src/pages/ensip/index.mdx similarity index 100% rename from docs/ensip/index.mdx rename to src/pages/ensip/index.mdx diff --git a/docs/faq.mdx b/src/pages/faq.mdx similarity index 100% rename from docs/faq.mdx rename to src/pages/faq.mdx diff --git a/docs/index.mdx b/src/pages/index.mdx similarity index 100% rename from docs/index.mdx rename to src/pages/index.mdx diff --git a/docs/learn/ccip-read.mdx b/src/pages/learn/ccip-read.mdx similarity index 100% rename from docs/learn/ccip-read.mdx rename to src/pages/learn/ccip-read.mdx diff --git a/docs/learn/deployments.mdx b/src/pages/learn/deployments.mdx similarity index 100% rename from docs/learn/deployments.mdx rename to src/pages/learn/deployments.mdx diff --git a/docs/learn/dns.mdx b/src/pages/learn/dns.mdx similarity index 100% rename from docs/learn/dns.mdx rename to src/pages/learn/dns.mdx diff --git a/docs/learn/protocol.mdx b/src/pages/learn/protocol.mdx similarity index 100% rename from docs/learn/protocol.mdx rename to src/pages/learn/protocol.mdx diff --git a/docs/learn/resolution.mdx b/src/pages/learn/resolution.mdx similarity index 100% rename from docs/learn/resolution.mdx rename to src/pages/learn/resolution.mdx diff --git a/docs/registry/dns.mdx b/src/pages/registry/dns.mdx similarity index 100% rename from docs/registry/dns.mdx rename to src/pages/registry/dns.mdx diff --git a/docs/registry/ens.mdx b/src/pages/registry/ens.mdx similarity index 100% rename from docs/registry/ens.mdx rename to src/pages/registry/ens.mdx diff --git a/docs/registry/eth.mdx b/src/pages/registry/eth.mdx similarity index 100% rename from docs/registry/eth.mdx rename to src/pages/registry/eth.mdx diff --git a/docs/registry/reverse.mdx b/src/pages/registry/reverse.mdx similarity index 100% rename from docs/registry/reverse.mdx rename to src/pages/registry/reverse.mdx diff --git a/docs/registry/test.mdx b/src/pages/registry/test.mdx similarity index 100% rename from docs/registry/test.mdx rename to src/pages/registry/test.mdx diff --git a/docs/registry/writing.mdx b/src/pages/registry/writing.mdx similarity index 100% rename from docs/registry/writing.mdx rename to src/pages/registry/writing.mdx diff --git a/docs/resolution/index.mdx b/src/pages/resolution/index.mdx similarity index 100% rename from docs/resolution/index.mdx rename to src/pages/resolution/index.mdx diff --git a/docs/resolution/names.mdx b/src/pages/resolution/names.mdx similarity index 100% rename from docs/resolution/names.mdx rename to src/pages/resolution/names.mdx diff --git a/docs/resolvers/ccip-read.mdx b/src/pages/resolvers/ccip-read.mdx similarity index 100% rename from docs/resolvers/ccip-read.mdx rename to src/pages/resolvers/ccip-read.mdx diff --git a/docs/resolvers/interacting.mdx b/src/pages/resolvers/interacting.mdx similarity index 100% rename from docs/resolvers/interacting.mdx rename to src/pages/resolvers/interacting.mdx diff --git a/docs/resolvers/interfaces.mdx b/src/pages/resolvers/interfaces.mdx similarity index 100% rename from docs/resolvers/interfaces.mdx rename to src/pages/resolvers/interfaces.mdx diff --git a/docs/resolvers/public.mdx b/src/pages/resolvers/public.mdx similarity index 100% rename from docs/resolvers/public.mdx rename to src/pages/resolvers/public.mdx diff --git a/docs/resolvers/quickstart.mdx b/src/pages/resolvers/quickstart.mdx similarity index 100% rename from docs/resolvers/quickstart.mdx rename to src/pages/resolvers/quickstart.mdx diff --git a/docs/resolvers/universal.mdx b/src/pages/resolvers/universal.mdx similarity index 100% rename from docs/resolvers/universal.mdx rename to src/pages/resolvers/universal.mdx diff --git a/docs/resolvers/writing.mdx b/src/pages/resolvers/writing.mdx similarity index 100% rename from docs/resolvers/writing.mdx rename to src/pages/resolvers/writing.mdx diff --git a/docs/terminology.mdx b/src/pages/terminology.mdx similarity index 100% rename from docs/terminology.mdx rename to src/pages/terminology.mdx diff --git a/src/pages/vocs-index.mdx b/src/pages/vocs-index.mdx new file mode 100644 index 000000000..b2bfc9095 --- /dev/null +++ b/src/pages/vocs-index.mdx @@ -0,0 +1,16 @@ +--- +layout: landing +--- + +import { HomePage } from 'vocs/components' + + + + My Awesome Docs + + This is a description of my documentation website. + + Get started + GitHub + + \ No newline at end of file diff --git a/docs/web/avatars.mdx b/src/pages/web/avatars.mdx similarity index 100% rename from docs/web/avatars.mdx rename to src/pages/web/avatars.mdx diff --git a/docs/web/design.mdx b/src/pages/web/design.mdx similarity index 100% rename from docs/web/design.mdx rename to src/pages/web/design.mdx diff --git a/docs/web/enumerate.mdx b/src/pages/web/enumerate.mdx similarity index 100% rename from docs/web/enumerate.mdx rename to src/pages/web/enumerate.mdx diff --git a/docs/web/index.mdx b/src/pages/web/index.mdx similarity index 100% rename from docs/web/index.mdx rename to src/pages/web/index.mdx diff --git a/docs/web/libraries.mdx b/src/pages/web/libraries.mdx similarity index 100% rename from docs/web/libraries.mdx rename to src/pages/web/libraries.mdx diff --git a/docs/web/multichain.mdx b/src/pages/web/multichain.mdx similarity index 100% rename from docs/web/multichain.mdx rename to src/pages/web/multichain.mdx diff --git a/docs/web/naming-contracts.mdx b/src/pages/web/naming-contracts.mdx similarity index 100% rename from docs/web/naming-contracts.mdx rename to src/pages/web/naming-contracts.mdx diff --git a/docs/web/quickstart.mdx b/src/pages/web/quickstart.mdx similarity index 100% rename from docs/web/quickstart.mdx rename to src/pages/web/quickstart.mdx diff --git a/docs/web/records.mdx b/src/pages/web/records.mdx similarity index 100% rename from docs/web/records.mdx rename to src/pages/web/records.mdx diff --git a/docs/web/resolution.mdx b/src/pages/web/resolution.mdx similarity index 100% rename from docs/web/resolution.mdx rename to src/pages/web/resolution.mdx diff --git a/docs/web/reverse.mdx b/src/pages/web/reverse.mdx similarity index 100% rename from docs/web/reverse.mdx rename to src/pages/web/reverse.mdx diff --git a/docs/web/siwe.mdx b/src/pages/web/siwe.mdx similarity index 100% rename from docs/web/siwe.mdx rename to src/pages/web/siwe.mdx diff --git a/docs/web/subdomains.mdx b/src/pages/web/subdomains.mdx similarity index 100% rename from docs/web/subdomains.mdx rename to src/pages/web/subdomains.mdx diff --git a/docs/web/subgraph.mdx b/src/pages/web/subgraph.mdx similarity index 100% rename from docs/web/subgraph.mdx rename to src/pages/web/subgraph.mdx diff --git a/docs/wrapper/contracts.mdx b/src/pages/wrapper/contracts.mdx similarity index 100% rename from docs/wrapper/contracts.mdx rename to src/pages/wrapper/contracts.mdx diff --git a/docs/wrapper/creating-subname-registrar.mdx b/src/pages/wrapper/creating-subname-registrar.mdx similarity index 100% rename from docs/wrapper/creating-subname-registrar.mdx rename to src/pages/wrapper/creating-subname-registrar.mdx diff --git a/docs/wrapper/expiry.mdx b/src/pages/wrapper/expiry.mdx similarity index 100% rename from docs/wrapper/expiry.mdx rename to src/pages/wrapper/expiry.mdx diff --git a/docs/wrapper/fuses.mdx b/src/pages/wrapper/fuses.mdx similarity index 100% rename from docs/wrapper/fuses.mdx rename to src/pages/wrapper/fuses.mdx diff --git a/docs/wrapper/overview.mdx b/src/pages/wrapper/overview.mdx similarity index 100% rename from docs/wrapper/overview.mdx rename to src/pages/wrapper/overview.mdx diff --git a/docs/wrapper/states.mdx b/src/pages/wrapper/states.mdx similarity index 100% rename from docs/wrapper/states.mdx rename to src/pages/wrapper/states.mdx diff --git a/docs/wrapper/usecases.mdx b/src/pages/wrapper/usecases.mdx similarity index 100% rename from docs/wrapper/usecases.mdx rename to src/pages/wrapper/usecases.mdx diff --git a/tsconfig.json b/tsconfig.json index f3db7416c..d2636aac4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,24 @@ { - "compilerOptions": { - "paths": { - "@/*": ["./app/src/*"], - "#/*": ["./app/local/*"] - } - } + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["**/*.ts", "**/*.tsx"] } diff --git a/vocs.config.ts b/vocs.config.ts new file mode 100644 index 000000000..a5e243cc1 --- /dev/null +++ b/vocs.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'vocs' + +export default defineConfig({ + title: 'Docs', + rootDir: 'src', + // sidebar: [ + // { + // text: 'Getting Started', + // link: '/getting-started', + // }, + // { + // text: 'Example', + // link: '/example', + // }, + // ], +}) From c0633f32dd11394f7899f8f702cb307320e15dc0 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Wed, 15 Jan 2025 03:27:04 -0500 Subject: [PATCH 02/79] Colors, home page --- .gitignore | 4 +- app/src/components/Button.tsx | 120 ------------------------------ package.json | 2 + pnpm-lock.yaml | 11 +++ src/components/HomePage.tsx | 112 ++++++++++++++++++++++++++++ src/components/ui/Button.tsx | 80 ++++++++++++++++++++ src/components/ui/Typography.tsx | 14 ++++ src/lib/utils.ts | 6 ++ src/pages/index.mdx | 124 ++----------------------------- src/pages/vocs-index.mdx | 16 ---- src/styles.css | 70 +++++++++++++++++ tailwind.config.cjs | 98 ++++++++++++++++++++++++ vocs.config.ts | 16 +++- 13 files changed, 416 insertions(+), 257 deletions(-) delete mode 100644 app/src/components/Button.tsx create mode 100644 src/components/HomePage.tsx create mode 100644 src/components/ui/Button.tsx create mode 100644 src/components/ui/Typography.tsx create mode 100644 src/lib/utils.ts delete mode 100644 src/pages/vocs-index.mdx create mode 100644 src/styles.css create mode 100644 tailwind.config.cjs diff --git a/.gitignore b/.gitignore index d9a376795..052090db3 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,6 @@ node_modules npm-debug.log* yarn-debug.log* yarn-error.log* -.pnpm-debug.log* \ No newline at end of file +.pnpm-debug.log* +vocs.config.ts.timestamp-* +src/dist \ No newline at end of file diff --git a/app/src/components/Button.tsx b/app/src/components/Button.tsx deleted file mode 100644 index f18de034d..000000000 --- a/app/src/components/Button.tsx +++ /dev/null @@ -1,120 +0,0 @@ -/* eslint-disable sonarjs/no-duplicate-string */ -import clsx from 'clsx'; -import Link from 'next/link'; -import { FC, PropsWithChildren } from 'react'; - -import { cx } from '@/lib/cx'; - -const ArrowIcon: FC = (properties) => { - return ( - - ); -}; - -const variantStyles = { - primary: 'btn-blue-primary', - disabled: 'btn-disabled', - subtle: 'btn-subtle', - red: 'btn-red-primary', - secondary: 'btn-blue-surface', - green: 'rounded-lg py-1 px-3 bg-green-400/10 text-green-600 ring-1 ring-inset ring-green-400/20 hover:bg-green-400/10 hover:text-green-300 hover:ring-green-300', - filled: 'rounded-lg bg-zinc-900 py-1 px-3 text-white hover:bg-zinc-700 dark:bg-ens-light-blue-500 dark:text-white dark:hover:bg-ens-light-blue-400', - outline: - 'rounded-lg py-1 px-3 text-zinc-700 ring-1 ring-inset ring-zinc-900/10 hover:bg-zinc-900/2.5 hover:text-zinc-900 dark:text-zinc-400 dark:ring-white/10 dark:hover:bg-white/5 dark:hover:text-white', - text: 'text-ens-light-blue-500 hover:text-ens-light-blue-600 dark:text-ens-light-blue-400 dark:hover:text-ens-light-blue-500', -}; - -type HrefProperties = { - href: string; - target?: string; -}; - -type ButtonProperties = { - onClick: () => void; -}; - -export const Button: FC< - { - variant?: string; - className?: string; - arrow?: 'left' | 'right'; - disabled?: boolean; - width?: 'full' | string; - } & (HrefProperties | ButtonProperties) & - PropsWithChildren -> = ({ - variant = 'primary', - disabled = false, - className, - children, - arrow, - ...properties -}) => { - const Component = properties['href'] ? Link : 'button'; - - const newVariant = disabled ? 'disabled' : variant; - - className = clsx('btn', variantStyles[newVariant], className); - - // const arrowIcon = ( - // - // ); - - // return ( - // // @ts-ignore - // - // {arrow === 'left' && arrowIcon} - // {children} - // {arrow === 'right' && arrowIcon} - // {/* @ts-ignore */} - // - // ); - - const arrowIcon = ( - - ); - - return ( - - {arrow === 'left' && arrowIcon} - {children} - {arrow === 'right' && arrowIcon} - - ); -}; diff --git a/package.json b/package.json index 4c6e6303e..3253b1e16 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,10 @@ }, "dependencies": { "@types/react": "latest", + "clsx": "^2.1.1", "react": "latest", "react-dom": "latest", + "tailwind-merge": "^2.6.0", "typescript": "latest", "vocs": "latest" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32aadfce1..9cc2bf227 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,12 +11,18 @@ importers: '@types/react': specifier: latest version: 19.0.6 + clsx: + specifier: ^2.1.1 + version: 2.1.1 react: specifier: latest version: 19.0.0 react-dom: specifier: latest version: 19.0.0(react@19.0.0) + tailwind-merge: + specifier: ^2.6.0 + version: 2.6.0 typescript: specifier: latest version: 5.7.3 @@ -2390,6 +2396,9 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + tailwindcss@3.4.17: resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} @@ -5355,6 +5364,8 @@ snapshots: tabbable@6.2.0: {} + tailwind-merge@2.6.0: {} + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 diff --git a/src/components/HomePage.tsx b/src/components/HomePage.tsx new file mode 100644 index 000000000..69aa4bc44 --- /dev/null +++ b/src/components/HomePage.tsx @@ -0,0 +1,112 @@ +import { Button } from './ui/Button' +import { H1 } from './ui/Typography' + +const navigation = [ + { + title: 'Get Started', + links: [ + ['Protocol Docs', '/learn/protocol'], + ['Resolution', '/resolution'], + ['Tools and Libraries', '/web/libraries'], + ['Layer 2 & Offchain', '/learn/ccip-read'], + ], + }, + { + title: 'Use ENS', + links: [ + ['Address Lookup', '/web/resolution'], + ['Text Records', '/web/records'], + ['Avatars', '/web/avatars'], + ['Primary Names', '/web/reverse'], + ['List Names', '/web/enumerate'], + ], + }, + { + title: 'Registries', + links: [ + ['ENS Registrar', '/registry/ens'], + ['ETH Registrar', '/registry/eth'], + ['DNS Registrar', '/registry/dns'], + ['Reverse Registrar', '/registry/reverse'], + ], + }, + { + title: 'Resolvers', + links: [ + ['Public Resolver', '/resolvers/public'], + ['Writing a Resolver', '/resolvers/writing'], + ['Interacting with a Resolver', '/resolvers/interacting'], + ['Cross Chain Resolvers', '/resolvers/ccip-read'], + ['Interface Reference', '/resolvers/interfaces'], + ], + }, + { + title: 'Governance', + links: [ + ['Welcome', '/dao'], + ['Constitution', '/dao/constitution'], + ['Foundation', '/dao/foundation'], + ['Governance Token & Airdrop', '/dao/token'], + ], + }, + { + title: 'Extra', + links: [ + ['Naming Smart-Contracts', '/web/naming-contracts'], + // ["Issuing Subdomains", "/web/subdomains"], + ['Name Wrapper', '/wrapper/overview'], + ['Subgraph', '/web/subgraph'], + ['Sign In With Ethereum (SIWE)', '/web/siwe'], + ], + }, + { + title: 'Design', + links: [ + ['Thorin', 'https://thorin.ens.domains/'], + [ + 'Thorin (Figma)', + 'https://www.figma.com/community/file/1303431204471074291', + ], + ['Brand', 'https://ens.domains/brand'], + ], + }, + { + title: 'Support', + links: [ + ['Changelog', '/changelog'], + ['Knowledgebase', 'https://support.ens.domains/'], + ['Community Blog', 'https://blog.ens.domains'], + ['Discord', 'https://chat.ens.domains/'], + ], + }, +] + +export function HomePage() { + return ( + <> +
+

ENS Documentation

+

Build applications with decentralized self-sovereign identity.

+
+ + +
+
+ +
+ {navigation.map((column) => ( +
+
{column.title}
+ {column.links.map(([title, href]) => ( +
+ {title} +
+ ))} +
+ ))} +
+ + ) +} diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx new file mode 100644 index 000000000..da9015486 --- /dev/null +++ b/src/components/ui/Button.tsx @@ -0,0 +1,80 @@ +/* eslint-disable sonarjs/no-duplicate-string */ +import { FC, PropsWithChildren } from 'react' + +import { cn } from '../../lib/utils' + +const ArrowIcon: FC> = (properties) => { + return ( + + ) +} + +const variantStyles = { + primary: 'bg-blue text-white hover:bg-blue-bright', + disabled: 'bg-grey-light text-grey', + destructive: 'bg-red text-white hover:bg-red-bright', + success: 'bg-green text-white hover:bg-green-bright', + outline: + 'ring-2 ring-inset ring-grey-active text-grey-active hover:ring-grey hover:text-grey', +} + +type HrefProperties = { + href: string + target?: string +} + +type ButtonProperties = { + onClick: () => void + disabled?: boolean +} + +export const Button: FC< + { + variant?: keyof typeof variantStyles + className?: string + arrow?: 'left' | 'right' + width?: 'full' | string + } & (HrefProperties | ButtonProperties) & + PropsWithChildren +> = ({ variant = 'primary', className, children, arrow, ...properties }) => { + className = cn( + 'py-3 px-5 rounded-lg inline-flex justify-center gap-0.5 overflow-hidden text-sm font-medium transition', + 'hover:-translate-y-[1px]', + 'active:translate-y-0', + variantStyles[variant], + className + ) + + const arrowIcon = ( + + ) + + if ('href' in properties) { + return ( + + {children} + + ) + } + + return ( + + ) +} diff --git a/src/components/ui/Typography.tsx b/src/components/ui/Typography.tsx new file mode 100644 index 000000000..02f28f2d5 --- /dev/null +++ b/src/components/ui/Typography.tsx @@ -0,0 +1,14 @@ +import { HTMLAttributes, PropsWithChildren } from 'react' + +import { cn } from '../../lib/utils' + +type HeadingProps = PropsWithChildren> + +export function H1({ className, ...props }: HeadingProps) { + return ( +

+ ) +} diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 000000000..d32b0fe65 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/src/pages/index.mdx b/src/pages/index.mdx index 9a42b9d58..573edad45 100644 --- a/src/pages/index.mdx +++ b/src/pages/index.mdx @@ -1,121 +1,7 @@ -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Learn everything about the Ethereum Name Service (ENS). How to integrate names into your dApp, issue subnames, and so much more!', - title: 'ENS Documentation', - emoji: '👋', - showDetailsSection: false, - contributors: [ - 'luc.eth', - 'nick.eth', - ] -}; +--- +layout: landing +--- -
-
-

ENS Documentation

-

Build applications with decentralized self-soverign identity.

-
- - -
-
-
+import { HomePage } from '../components/HomePage' -
-
- { - [ - { - title: 'Get Started', - links: [ - ["Protocol Docs", "/learn/protocol"], - ["Resolution", "/resolution"], - ["Tools and Libraries", "/web/libraries"], - ["Layer 2 & Offchain", "/learn/ccip-read"] - ] - }, - { - title: 'Use ENS', - links: [ - ["Address Lookup", "/web/resolution"], - ["Text Records", "/web/records"], - ["Avatars", "/web/avatars"], - ["Primary Names", "/web/reverse"], - ["List Names", "/web/enumerate"] - ] - }, - { - title: 'Registries', - links: [ - ["ENS Registrar", "/registry/ens"], - ["ETH Registrar", "/registry/eth"], - ["DNS Registrar", "/registry/dns"], - ["Reverse Registrar", "/registry/reverse"] - ] - }, - { - title: 'Resolvers', - links: [ - ["Public Resolver", "/resolvers/public"], - ["Writing a Resolver", "/resolvers/writing"], - ["Interacting with a Resolver", "/resolvers/interacting"], - ["Cross Chain Resolvers", "/resolvers/ccip-read"], - ["Interface Reference", "/resolvers/interfaces"] - ] - }, - { - title: 'Governance', - links: [ - ["Welcome", "/dao"], - ["Constitution", "/dao/constitution"], - ["Foundation", "/dao/foundation"], - ["Governance Token & Airdrop", "/dao/token"] - ] - }, - { - title: 'Extra', - links: [ - ["Naming Smart-Contracts", "/web/naming-contracts"], - // ["Issuing Subdomains", "/web/subdomains"], - ["Name Wrapper", "/wrapper/overview"], - ["Subgraph", "/web/subgraph"], - ["Sign In With Ethereum (SIWE)", "/web/siwe"] - ] - }, - { - title: 'Design', - links: [ - ["Thorin", "https://thorin.ens.domains/"], - ["Thorin (Figma)", "https://www.figma.com/community/file/1303431204471074291"], - // ["Design Guidelines", "/web/design"], - ["Brand", "https://ens.domains/brand"], - ] - }, - { - title: 'Support', - links: [ - ["Changelog", "/changelog"], - ["Knowledgebase", "https://support.ens.domains/"], - ["Community Blog", "https://blog.ens.domains"], - ["Discord", "https://chat.ens.domains/"] - ] - } - ].map((column) => ( -
-
{column.title}
- { - column.links.map(([title, href]) => ( -
- {title} -
- )) - } -
- )) - } -
- -

Videos

- - -
+ diff --git a/src/pages/vocs-index.mdx b/src/pages/vocs-index.mdx deleted file mode 100644 index b2bfc9095..000000000 --- a/src/pages/vocs-index.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: landing ---- - -import { HomePage } from 'vocs/components' - - - - My Awesome Docs - - This is a description of my documentation website. - - Get started - GitHub - - \ No newline at end of file diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 000000000..9bbb3ec39 --- /dev/null +++ b/src/styles.css @@ -0,0 +1,70 @@ +@layer vocs_preflight { + @tailwind base; +} +@tailwind components; +@tailwind utilities; + +:root { + --ens-blue-active: #003685; + --ens-blue-dim: #056aff; + --ens-blue-primary: #3889ff; + --ens-blue-bright: #569aff; + --ens-blue-light: #d1e4ff; + --ens-blue-surface: #eef5ff; + + --ens-indigo-active: #19175f; + --ens-indigo-dim: #342fc5; + --ens-indigo-primary: #5854d6; + --ens-indigo-bright: #7e7bdf; + --ens-indigo-light: #c7c5f1; + --ens-indigo-surface: #e3e2f8; + + --ens-purple-active: #3d1353; + --ens-purple-dim: #8a2bba; + --ens-purple-primary: #a343d3; + --ens-purple-bright: #b86edd; + --ens-purple-light: #e3c6f1; + --ens-purple-surface: #ebd6f5; + + --ens-pink-active: #440e28; + --ens-pink-dim: #ae2366; + --ens-pink-primary: #d52e7e; + --ens-pink-bright: #de5999; + --ens-pink-light: #f4cde0; + --ens-pink-surface: #ebd6f5; + + --ens-red-active: #280a06; + --ens-red-dim: #992515; + --ens-red-primary: #c6301b; + --ens-red-bright: #e34631; + --ens-red-light: #f0c2c2; + --ens-red-surface: #f9e7e7; + + --ens-orange-active: #492c03; + --ens-orange-dim: #c37609; + --ens-orange-primary: #f3930b; + --ens-orange-bright: #f6a93c; + --ens-orange-light: #fbe1bc; + --ens-orange-surface: #fdf0dd; + + --ens-yellow-active: #423505; + --ens-yellow-dim: #b9930e; + --ens-yellow-primary: #e9b911; + --ens-yellow-bright: #f0c93c; + --ens-yellow-light: #ffefad; + --ens-yellow-surface: #fff5cd; + + --ens-green-active: #072c21; + --ens-green-dim: #158463; + --ens-green-primary: #199c75; + --ens-green-bright: #1eb789; + --ens-green-light: #cbe7dc; + --ens-green-surface: #e7f4ef; + + --ens-grey-active: #1e2122; + --ens-grey-dim: #595959; + --ens-grey-primary: #9b9ba7; + --ens-grey-bright: #b6b6bf; + --ens-grey-light: #e8e8e8; + --ens-grey-surface: #f6f6f6; +} diff --git a/tailwind.config.cjs b/tailwind.config.cjs new file mode 100644 index 000000000..4d4cb14f1 --- /dev/null +++ b/tailwind.config.cjs @@ -0,0 +1,98 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./src/**/*.{html,md,mdx,tsx,js,jsx}'], + theme: { + // Reset Tailwind default colors + colors: { + white: '#FFFFFF', + black: '#000000', + zinc: { + 50: '#fafafa', + 100: '#f4f4f5', + 200: '#e4e4e7', + 300: '#d4d4d8', + 400: '#a1a1aa', + 500: '#71717a', + 600: '#52525b', + 700: '#3f3f46', + 800: '#27272a', + 900: '#18181b', + 950: '#09090b', + }, + blue: { + active: 'var(--ens-blue-active)', + dim: 'var(--ens-blue-dim)', + DEFAULT: 'var(--ens-blue-primary)', + bright: 'var(--ens-blue-bright)', + light: 'var(--ens-blue-light)', + surface: 'var(--ens-blue-surface)', + }, + indigo: { + active: 'var(--ens-indigo-active)', + dim: 'var(--ens-indigo-dim)', + DEFAULT: 'var(--ens-indigo-primary)', + bright: 'var(--ens-indigo-bright)', + light: 'var(--ens-indigo-light)', + surface: 'var(--ens-indigo-surface)', + }, + purple: { + active: 'var(--ens-purple-active)', + dim: 'var(--ens-purple-dim)', + DEFAULT: 'var(--ens-purple-primary)', + bright: 'var(--ens-purple-bright)', + light: 'var(--ens-purple-light)', + surface: 'var(--ens-purple-surface)', + }, + pink: { + active: 'var(--ens-pink-active)', + dim: 'var(--ens-pink-dim)', + DEFAULT: 'var(--ens-pink-primary)', + bright: 'var(--ens-pink-bright)', + light: 'var(--ens-pink-light)', + surface: 'var(--ens-pink-surface)', + }, + red: { + active: 'var(--ens-red-active)', + dim: 'var(--ens-red-dim)', + DEFAULT: 'var(--ens-red-primary)', + bright: 'var(--ens-red-bright)', + light: 'var(--ens-red-light)', + surface: 'var(--ens-red-surface)', + }, + orange: { + active: 'var(--ens-orange-active)', + dim: 'var(--ens-orange-dim)', + DEFAULT: 'var(--ens-orange-primary)', + bright: 'var(--ens-orange-bright)', + light: 'var(--ens-orange-light)', + surface: 'var(--ens-orange-surface)', + }, + yellow: { + active: 'var(--ens-yellow-active)', + dim: 'var(--ens-yellow-dim)', + DEFAULT: 'var(--ens-yellow-primary)', + bright: 'var(--ens-yellow-bright)', + light: 'var(--ens-yellow-light)', + surface: 'var(--ens-yellow-surface)', + }, + green: { + active: 'var(--ens-green-active)', + dim: 'var(--ens-green-dim)', + DEFAULT: 'var(--ens-green-primary)', + bright: 'var(--ens-green-bright)', + light: 'var(--ens-green-light)', + surface: 'var(--ens-green-surface)', + }, + grey: { + active: 'var(--ens-grey-active)', + dim: 'var(--ens-grey-dim)', + DEFAULT: 'var(--ens-grey-primary)', + bright: 'var(--ens-grey-bright)', + light: 'var(--ens-grey-light)', + surface: '#F6F6F6', + }, + }, + extend: {}, + }, + plugins: [], +} diff --git a/vocs.config.ts b/vocs.config.ts index a5e243cc1..56225f8e3 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -1,8 +1,22 @@ import { defineConfig } from 'vocs' export default defineConfig({ - title: 'Docs', + title: 'ENS', rootDir: 'src', + font: { + google: 'Inter', + }, + theme: { + colorScheme: 'light', + variables: { + color: { + text: 'var(--ens-grey-active)', + textAccent: 'var(--ens-blue-dim)', + backgroundAccent: 'var(--ens-blue-primary)', + backgroundAccentHover: 'var(--ens-blue-bright)', + }, + }, + }, // sidebar: [ // { // text: 'Getting Started', From 961cc819f932e90925aea8861b2a2900ab820edb Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Thu, 16 Jan 2025 02:34:31 -0500 Subject: [PATCH 03/79] Progress --- .prettierrc | 15 ++ app/src/components/ConnectKits.tsx | 223 ------------------ package.json | 6 + pnpm-lock.yaml | 123 ++++++++++ src/components/ConnectKits.tsx | 217 +++++++++++++++++ src/components/EnsProfile.tsx | 25 ++ src/components/ui/Card.tsx | 16 ++ src/lib/utils.ts | 4 + .../logos => src/public/img}/connectkit.png | Bin .../logos => src/public/img}/rainbow.svg | 0 .../public/img}/walletconnect.svg | 0 11 files changed, 406 insertions(+), 223 deletions(-) create mode 100644 .prettierrc delete mode 100644 app/src/components/ConnectKits.tsx create mode 100644 src/components/ConnectKits.tsx create mode 100644 src/components/EnsProfile.tsx create mode 100644 src/components/ui/Card.tsx rename {app/public/icons/legacy/logos => src/public/img}/connectkit.png (100%) rename {app/public/icons/legacy/logos => src/public/img}/rainbow.svg (100%) rename {app/public/icons/legacy/logos => src/public/img}/walletconnect.svg (100%) diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..f5ee2600a --- /dev/null +++ b/.prettierrc @@ -0,0 +1,15 @@ +{ + "semi": false, + "tabWidth": 2, + "printWidth": 80, + "useTabs": false, + "singleQuote": true, + "trailingComma": "es5", + "plugins": [ + "@trivago/prettier-plugin-sort-imports", + "prettier-plugin-tailwindcss" + ], + "importOrder": ["", "^@/", "^[./]"], + "importOrderSeparation": true, + "importOrderSortSpecifiers": true +} diff --git a/app/src/components/ConnectKits.tsx b/app/src/components/ConnectKits.tsx deleted file mode 100644 index 4ec786a1c..000000000 --- a/app/src/components/ConnectKits.tsx +++ /dev/null @@ -1,223 +0,0 @@ -import { ReactNode } from 'react'; -import { FaReact, FaSwift } from 'react-icons/fa'; -import { SiRemix } from 'react-icons/si'; -import { - TbBrandAndroid, - TbBrandFlutter, - TbBrandJavascript, - TbBrandNextjs, - TbBrandVite, - TbBrandVue, -} from 'react-icons/tb'; - -import { cx } from '@/lib/cx'; - -import { Button } from './Button'; - -type Template = { - name: string; - url: string; - icon?: ReactNode; -}; - -type Kit = { - name: string; - creator: string; - creator_url: string; - logo: string; - url: string; - demo?: string; - templates?: Template[]; -}; - -export const kits: Kit[] = [ - { - name: 'ConnectKit', - creator: 'Family', - creator_url: 'https://family.co', - logo: '/icons/legacy/logos/connectkit.png', - url: 'https://docs.family.co/connectkit/try-it-out', - demo: 'https://docs.family.co/connectkit/try-it-out', - templates: [ - { - name: 'Create React App', - url: 'https://github.com/family/connectkit/tree/main/examples/cra', - icon: , - }, - { - name: 'Vite + React', - url: 'https://github.com/family/connectkit/tree/main/examples/vite', - icon: , - }, - { - name: 'Next.js', - url: 'https://github.com/family/connectkit/tree/main/examples/nextjs', - icon: , - }, - { - name: 'Next.js + Siwe', - url: 'https://github.com/family/connectkit/tree/main/examples/nextjs-siwe', - icon: , - }, - ], - }, - { - name: 'Rainbowkit', - creator: 'Rainbow', - creator_url: 'https://rainbow.me', - logo: '/icons/legacy/logos/rainbow.svg', - url: 'https://www.rainbowkit.com/docs/introduction', - demo: 'https://rainbowkit-demo.vercel.app/', - templates: [ - { - name: 'Create React App', - url: 'https://codesandbox.io/p/sandbox/github/rainbow-me/rainbowkit/tree/main/examples/with-create-react-app', - icon: , - }, - { - name: 'Vite + React', - url: 'https://codesandbox.io/p/sandbox/github/rainbow-me/rainbowkit/tree/main/examples/with-vite', - icon: , - }, - { - name: 'Next.js', - url: 'https://codesandbox.io/p/sandbox/github/rainbow-me/rainbowkit/tree/main/examples/with-next', - icon: , - }, - { - name: 'Next.js App Router', - url: 'https://codesandbox.io/p/sandbox/github/rainbow-me/rainbowkit/tree/main/examples/with-next-app', - icon: , - }, - { - name: 'Remix', - url: 'https://codesandbox.io/p/sandbox/github/rainbow-me/rainbowkit/tree/main/examples/with-remix', - icon: , - }, - ], - }, - { - name: 'Web3Modalv2', - creator: 'WalletConnect', - creator_url: 'https://walletconnect.org', - logo: '/icons/legacy/logos/walletconnect.svg', - url: 'https://docs.walletconnect.com/2.0/web3modal/about', - demo: 'https://lab.web3modal.com/', - templates: [ - { - name: 'React', - url: 'https://docs.walletconnect.com/web3modal/react/about', - icon: , - }, - { - name: 'Vue', - url: 'https://docs.walletconnect.com/web3modal/vue/about', - icon: , - }, - { - name: 'Javascript', - url: 'https://docs.walletconnect.com/web3modal/javascript/about', - icon: , - }, - { - name: 'Flutter', - url: 'https://docs.walletconnect.com/web3modal/flutter/about', - icon: , - }, - { - name: 'Android', - url: 'https://docs.walletconnect.com/web3modal/android/about', - icon: , - }, - { - name: 'iOS', - url: 'https://docs.walletconnect.com/web3modal/ios/about', - icon: , - }, - ], - }, -]; - -export const ConnectKits = () => { - return ( -
-
-
- {kits.map((library) => ( -
-
-
-
- {library.name} -
-
-
- {library.name} -
- - by{' '} - - {library.creator} - - -
-
-
-
- -
-
-
- {library.demo && ( - - )} -
-
-
- ))} -
-
-
- ); -}; diff --git a/package.json b/package.json index 3253b1e16..403e4198b 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,14 @@ "clsx": "^2.1.1", "react": "latest", "react-dom": "latest", + "react-icons": "^5.4.0", "tailwind-merge": "^2.6.0", "typescript": "latest", "vocs": "latest" + }, + "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "^5.2.1", + "prettier": "^3.4.2", + "prettier-plugin-tailwindcss": "^0.6.10" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9cc2bf227..9e7caf1c5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: react-dom: specifier: latest version: 19.0.0(react@19.0.0) + react-icons: + specifier: ^5.4.0 + version: 5.4.0(react@19.0.0) tailwind-merge: specifier: ^2.6.0 version: 2.6.0 @@ -29,6 +32,16 @@ importers: vocs: specifier: latest version: 1.0.0-alpha.62(@types/node@22.10.5)(@types/react@19.0.6)(acorn@8.14.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(rollup@4.30.1)(typescript@5.7.3) + devDependencies: + '@trivago/prettier-plugin-sort-imports': + specifier: ^5.2.1 + version: 5.2.1(prettier@3.4.2) + prettier: + specifier: ^3.4.2 + version: 3.4.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.10 + version: 0.6.10(@trivago/prettier-plugin-sort-imports@5.2.1(prettier@3.4.2))(prettier@3.4.2) packages: @@ -989,6 +1002,22 @@ packages: '@shikijs/vscode-textmate@10.0.1': resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} + '@trivago/prettier-plugin-sort-imports@5.2.1': + resolution: {integrity: sha512-NDZndt0fmVThIx/8cExuJHLZagUVzfGCoVrwH9x6aZvwfBdkrDFTYujecek6X2WpG4uUFsVaPg5+aNQPSyjcmw==} + engines: {node: '>18.12'} + peerDependencies: + '@vue/compiler-sfc': 3.x + prettier: 2.x - 3.x + prettier-plugin-svelte: 3.x + svelte: 4.x || 5.x + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + prettier-plugin-svelte: + optional: true + svelte: + optional: true + '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -1648,6 +1677,9 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + javascript-stringify@2.1.0: resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} @@ -2097,6 +2129,66 @@ packages: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} + prettier-plugin-tailwindcss@0.6.10: + resolution: {integrity: sha512-ndj2WLDaMzACnr1gAYZiZZLs5ZdOeBYgOsbBmHj3nvW/6q8h8PymsXiEnKvj/9qgCCAoHyvLOisoQdIcsDvIgw==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -2123,6 +2215,11 @@ packages: peerDependencies: react: '>=16.3.0' + react-icons@5.4.0: + resolution: {integrity: sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==} + peerDependencies: + react: '*' + react-intersection-observer@9.14.1: resolution: {integrity: sha512-k1xIUn3sCQi3ugNeF64FJb3zwve5mcetvAUR9JazXeOmtap4IP2evN8rs+yf6SQ7F1QydsOGiqTmt+lySKZ9uA==} peerDependencies: @@ -3450,6 +3547,18 @@ snapshots: '@shikijs/vscode-textmate@10.0.1': {} + '@trivago/prettier-plugin-sort-imports@5.2.1(prettier@3.4.2)': + dependencies: + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 + javascript-natural-sort: 0.7.1 + lodash: 4.17.21 + prettier: 3.4.2 + transitivePeerDependencies: + - supports-color + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.6 @@ -4241,6 +4350,8 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + javascript-natural-sort@0.7.1: {} + javascript-stringify@2.1.0: {} jiti@1.21.7: {} @@ -4954,6 +5065,14 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prettier-plugin-tailwindcss@0.6.10(@trivago/prettier-plugin-sort-imports@5.2.1(prettier@3.4.2))(prettier@3.4.2): + dependencies: + prettier: 3.4.2 + optionalDependencies: + '@trivago/prettier-plugin-sort-imports': 5.2.1(prettier@3.4.2) + + prettier@3.4.2: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -4981,6 +5100,10 @@ snapshots: react-fast-compare: 3.2.2 react-side-effect: 2.1.2(react@19.0.0) + react-icons@5.4.0(react@19.0.0): + dependencies: + react: 19.0.0 + react-intersection-observer@9.14.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 diff --git a/src/components/ConnectKits.tsx b/src/components/ConnectKits.tsx new file mode 100644 index 000000000..69131aff3 --- /dev/null +++ b/src/components/ConnectKits.tsx @@ -0,0 +1,217 @@ +import { ReactNode } from 'react' +import { FaReact, FaSwift } from 'react-icons/fa' +import { SiRemix } from 'react-icons/si' +import { + TbBrandAndroid, + TbBrandFlutter, + TbBrandJavascript, + TbBrandNextjs, + TbBrandVite, + TbBrandVue, +} from 'react-icons/tb' + +import { cn } from '../lib/utils' +import { Button } from './ui/Button' + +type Template = { + name: string + url: string + icon?: ReactNode +} + +type Kit = { + name: string + creator: string + creator_url: string + logo: string + url: string + demo?: string + templates?: Template[] +} + +export const kits: Kit[] = [ + { + name: 'ConnectKit', + creator: 'Family', + creator_url: 'https://family.co', + logo: '/img/connectkit.png', + url: 'https://docs.family.co/connectkit/try-it-out', + demo: 'https://docs.family.co/connectkit/try-it-out', + templates: [ + { + name: 'Create React App', + url: 'https://github.com/family/connectkit/tree/main/examples/cra', + icon: , + }, + { + name: 'Vite + React', + url: 'https://github.com/family/connectkit/tree/main/examples/vite', + icon: , + }, + { + name: 'Next.js', + url: 'https://github.com/family/connectkit/tree/main/examples/nextjs', + icon: , + }, + { + name: 'Next.js + Siwe', + url: 'https://github.com/family/connectkit/tree/main/examples/nextjs-siwe', + icon: , + }, + ], + }, + { + name: 'Rainbowkit', + creator: 'Rainbow', + creator_url: 'https://rainbow.me', + logo: '/img/rainbow.svg', + url: 'https://www.rainbowkit.com/docs/introduction', + demo: 'https://rainbowkit-demo.vercel.app/', + templates: [ + { + name: 'Create React App', + url: 'https://codesandbox.io/p/sandbox/github/rainbow-me/rainbowkit/tree/main/examples/with-create-react-app', + icon: , + }, + { + name: 'Vite + React', + url: 'https://codesandbox.io/p/sandbox/github/rainbow-me/rainbowkit/tree/main/examples/with-vite', + icon: , + }, + { + name: 'Next.js', + url: 'https://codesandbox.io/p/sandbox/github/rainbow-me/rainbowkit/tree/main/examples/with-next', + icon: , + }, + { + name: 'Next.js App Router', + url: 'https://codesandbox.io/p/sandbox/github/rainbow-me/rainbowkit/tree/main/examples/with-next-app', + icon: , + }, + { + name: 'Remix', + url: 'https://codesandbox.io/p/sandbox/github/rainbow-me/rainbowkit/tree/main/examples/with-remix', + icon: , + }, + ], + }, + { + name: 'Web3Modalv2', + creator: 'WalletConnect', + creator_url: 'https://walletconnect.org', + logo: '/img/walletconnect.svg', + url: 'https://docs.walletconnect.com/2.0/web3modal/about', + demo: 'https://lab.web3modal.com/', + templates: [ + { + name: 'React', + url: 'https://docs.walletconnect.com/web3modal/react/about', + icon: , + }, + { + name: 'Vue', + url: 'https://docs.walletconnect.com/web3modal/vue/about', + icon: , + }, + { + name: 'Javascript', + url: 'https://docs.walletconnect.com/web3modal/javascript/about', + icon: , + }, + { + name: 'Flutter', + url: 'https://docs.walletconnect.com/web3modal/flutter/about', + icon: , + }, + { + name: 'Android', + url: 'https://docs.walletconnect.com/web3modal/android/about', + icon: , + }, + { + name: 'iOS', + url: 'https://docs.walletconnect.com/web3modal/ios/about', + icon: , + }, + ], + }, +] + +export const ConnectKits = () => { + return ( +
+
+
+ {kits.map((library) => ( +
+
+
+
+ {library.name} +
+
+
{library.name}
+ + by{' '} + + {library.creator} + + +
+
+
+
+ +
+
+
+ {library.demo && ( + + )} +
+
+
+ ))} +
+
+
+ ) +} diff --git a/src/components/EnsProfile.tsx b/src/components/EnsProfile.tsx new file mode 100644 index 000000000..4bb346b5c --- /dev/null +++ b/src/components/EnsProfile.tsx @@ -0,0 +1,25 @@ +import { truncateAddress } from '../lib/utils' + +type Props = { + name: string + address: `0x${string}` +} + +export function EnsProfile({ name, address }: Props) { + return ( +
+
+ +
+ {name} + + {truncateAddress(address)} + +
+
+
+ ) +} diff --git a/src/components/ui/Card.tsx b/src/components/ui/Card.tsx new file mode 100644 index 000000000..95c3d4454 --- /dev/null +++ b/src/components/ui/Card.tsx @@ -0,0 +1,16 @@ +import { PropsWithChildren } from 'react' + +import { cn } from '../../lib/utils' + +type Props = PropsWithChildren> + +export function Card({ children, className, ...props }: Props) { + return ( +
+ {children} +
+ ) +} diff --git a/src/lib/utils.ts b/src/lib/utils.ts index d32b0fe65..98d1cf5f7 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -4,3 +4,7 @@ import { twMerge } from 'tailwind-merge' export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) } + +export function truncateAddress(address: `0x${string}`) { + return `${address.slice(0, 6)}...${address.slice(-4)}` +} diff --git a/app/public/icons/legacy/logos/connectkit.png b/src/public/img/connectkit.png similarity index 100% rename from app/public/icons/legacy/logos/connectkit.png rename to src/public/img/connectkit.png diff --git a/app/public/icons/legacy/logos/rainbow.svg b/src/public/img/rainbow.svg similarity index 100% rename from app/public/icons/legacy/logos/rainbow.svg rename to src/public/img/rainbow.svg diff --git a/app/public/icons/legacy/logos/walletconnect.svg b/src/public/img/walletconnect.svg similarity index 100% rename from app/public/icons/legacy/logos/walletconnect.svg rename to src/public/img/walletconnect.svg From 6e1155690f34079ccf054c3bb3a0ae267785a7a8 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Thu, 16 Jan 2025 04:52:44 -0500 Subject: [PATCH 04/79] Install wagmi, create a bunch of building blocks --- package.json | 5 +- pnpm-lock.yaml | 2727 +++++++++++++++++ src/components/AddressRecords.tsx | 28 + src/components/ConnectKits.tsx | 4 +- src/components/EnsProfile.tsx | 53 +- src/components/TextRecords.tsx | 26 + src/components/ui/Card.tsx | 2 +- src/components/ui/Table.tsx | 30 + src/hooks/useEnsAddresses.ts | 27 + src/hooks/useEnsTexts.ts | 21 + src/layout.tsx | 21 + src/pages/web/quickstart.mdx | 251 +- .../public/img}/fallback-avatar.svg | 0 13 files changed, 2990 insertions(+), 205 deletions(-) create mode 100644 src/components/AddressRecords.tsx create mode 100644 src/components/TextRecords.tsx create mode 100644 src/components/ui/Table.tsx create mode 100644 src/hooks/useEnsAddresses.ts create mode 100644 src/hooks/useEnsTexts.ts create mode 100644 src/layout.tsx rename {app/public => src/public/img}/fallback-avatar.svg (100%) diff --git a/package.json b/package.json index 403e4198b..76e5bba2b 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "preview": "vocs preview" }, "dependencies": { + "@tanstack/react-query": "^5.64.1", "@types/react": "latest", "clsx": "^2.1.1", "react": "latest", @@ -15,7 +16,9 @@ "react-icons": "^5.4.0", "tailwind-merge": "^2.6.0", "typescript": "latest", - "vocs": "latest" + "viem": "^2.22.8", + "vocs": "latest", + "wagmi": "^2.14.8" }, "devDependencies": { "@trivago/prettier-plugin-sort-imports": "^5.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e7caf1c5..fa99d21d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@tanstack/react-query': + specifier: ^5.64.1 + version: 5.64.1(react@19.0.0) '@types/react': specifier: latest version: 19.0.6 @@ -29,9 +32,15 @@ importers: typescript: specifier: latest version: 5.7.3 + viem: + specifier: ^2.22.8 + version: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) vocs: specifier: latest version: 1.0.0-alpha.62(@types/node@22.10.5)(@types/react@19.0.6)(acorn@8.14.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(rollup@4.30.1)(typescript@5.7.3) + wagmi: + specifier: ^2.14.8 + version: 2.14.8(@tanstack/query-core@5.64.1)(@tanstack/react-query@5.64.1(react@19.0.0))(@types/react@19.0.6)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)) devDependencies: '@trivago/prettier-plugin-sort-imports': specifier: ^5.2.1 @@ -45,6 +54,9 @@ importers: packages: + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -150,6 +162,18 @@ packages: bundledDependencies: - is-unicode-supported + '@coinbase/wallet-sdk@3.9.3': + resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} + + '@coinbase/wallet-sdk@4.2.3': + resolution: {integrity: sha512-BcyHZ/Ec84z0emORzqdXDv4P0oV+tV3a0OirfA8Ko1JGBIAVvB+hzLvZzCDvnuZx7MTK+Dd8Y9Tjlo446BpCIg==} + + '@ecies/ciphers@0.2.2': + resolution: {integrity: sha512-ylfGR7PyTd+Rm2PqQowG08BCKA22QuX8NzrL+LxAAvazN10DMwdJ2fWwAzRj05FI/M8vNFGm3cv9Wq/GFWCBLg==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} @@ -429,6 +453,22 @@ packages: cpu: [x64] os: [win32] + '@ethereumjs/common@3.2.0': + resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} + + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/tx@4.2.0': + resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} + engines: {node: '>=14'} + + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + '@floating-ui/core@1.6.9': resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} @@ -478,6 +518,12 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@lit-labs/ssr-dom-shim@1.3.0': + resolution: {integrity: sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==} + + '@lit/reactive-element@1.6.3': + resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + '@mdx-js/mdx@3.1.0': resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} @@ -492,6 +538,127 @@ packages: peerDependencies: rollup: '>=2' + '@metamask/eth-json-rpc-provider@1.0.1': + resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} + engines: {node: '>=14.0.0'} + + '@metamask/json-rpc-engine@7.3.3': + resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-engine@8.0.2': + resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-middleware-stream@7.0.2': + resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} + engines: {node: '>=16.0.0'} + + '@metamask/object-multiplex@2.1.0': + resolution: {integrity: sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==} + engines: {node: ^16.20 || ^18.16 || >=20} + + '@metamask/onboarding@1.0.1': + resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} + + '@metamask/providers@16.1.0': + resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} + engines: {node: ^18.18 || >=20} + + '@metamask/rpc-errors@6.4.0': + resolution: {integrity: sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==} + engines: {node: '>=16.0.0'} + + '@metamask/safe-event-emitter@2.0.0': + resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} + + '@metamask/safe-event-emitter@3.1.2': + resolution: {integrity: sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA==} + engines: {node: '>=12.0.0'} + + '@metamask/sdk-communication-layer@0.31.0': + resolution: {integrity: sha512-V9CxdzabDPjQVgmKGHsyU3SYt4Af27g+4DbGCx0fLoHqN/i1RBDZqs/LYbJX3ykJCANzE+llz/MolMCMrzM2RA==} + peerDependencies: + cross-fetch: ^4.0.0 + eciesjs: '*' + eventemitter2: ^6.4.9 + readable-stream: ^3.6.2 + socket.io-client: ^4.5.1 + + '@metamask/sdk-install-modal-web@0.31.5': + resolution: {integrity: sha512-ZfrVkPAabfH4AIxcTlxQN5oyyzzVXFTLZrm1/BJ+X632d9MiyAVHNtiqa9EZpZYkZGk2icmDVP+xCpvJmVOVpQ==} + + '@metamask/sdk@0.31.5': + resolution: {integrity: sha512-i7wteqO/fU2JWQrMZz+addHokYThHYznp4nYXviv+QysdxGVgAYvcW/PBA+wpeP3veX7QGfNqMPgSsZbBrASYw==} + + '@metamask/superstruct@3.1.0': + resolution: {integrity: sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@5.0.2': + resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} + engines: {node: '>=14.0.0'} + + '@metamask/utils@8.5.0': + resolution: {integrity: sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@9.3.0': + resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} + engines: {node: '>=16.0.0'} + + '@motionone/animation@10.18.0': + resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} + + '@motionone/dom@10.18.0': + resolution: {integrity: sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==} + + '@motionone/easing@10.18.0': + resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==} + + '@motionone/generators@10.18.0': + resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==} + + '@motionone/svelte@10.16.4': + resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} + + '@motionone/types@10.17.1': + resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==} + + '@motionone/utils@10.18.0': + resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} + + '@motionone/vue@10.16.4': + resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} + deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion + + '@noble/ciphers@1.2.0': + resolution: {integrity: sha512-YGdEUzYEd+82jeaVbSKKVp1jFZb8LwaNMIIzHFkihGvYdd/KKAr7KaJHdEdSYGredE3ssSravXIa0Jxg28Sv5w==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.7.0': + resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.8.0': + resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.6.0': + resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.6.1': + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.7.0': resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} engines: {node: ^14.21.3 || >=16} @@ -508,6 +675,9 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@paulmillr/qr@0.2.1': + resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -972,6 +1142,34 @@ packages: cpu: [x64] os: [win32] + '@safe-global/safe-apps-provider@0.18.5': + resolution: {integrity: sha512-9v9wjBi3TwLsEJ3C2ujYoexp3pFJ0omDLH/GX91e2QB+uwCKTBYyhxFSrTQ9qzoyQd+bfsk4gjOGW87QcJhf7g==} + + '@safe-global/safe-apps-sdk@9.1.0': + resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} + + '@safe-global/safe-gateway-typescript-sdk@3.22.6': + resolution: {integrity: sha512-R0Ck7n8fj7KtFUpbsGi0j3e2t0/bhpHTY/U8P8315vQ8aT/sfZrWMcfFcD5I9Kw8TEU7rvKY0+sngT1lCptJmQ==} + engines: {node: '>=16'} + + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/base@1.2.1': + resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip32@1.6.0': + resolution: {integrity: sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==} + + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + + '@scure/bip39@1.5.0': + resolution: {integrity: sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A==} + '@shikijs/core@1.26.2': resolution: {integrity: sha512-ORyu3MrY7dCC7FDLDsFSkBM9b/AT9/Y8rH+UQ07Rtek48pp0ZhQOMPTKolqszP4bBCas6FqTZQYt18BBamVl/g==} @@ -1002,6 +1200,71 @@ packages: '@shikijs/vscode-textmate@10.0.1': resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@stablelib/aead@1.0.1': + resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} + + '@stablelib/binary@1.0.1': + resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} + + '@stablelib/bytes@1.0.1': + resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} + + '@stablelib/chacha20poly1305@1.0.1': + resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} + + '@stablelib/chacha@1.0.1': + resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} + + '@stablelib/constant-time@1.0.1': + resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} + + '@stablelib/ed25519@1.0.3': + resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} + + '@stablelib/hash@1.0.1': + resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} + + '@stablelib/hkdf@1.0.1': + resolution: {integrity: sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==} + + '@stablelib/hmac@1.0.1': + resolution: {integrity: sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==} + + '@stablelib/int@1.0.1': + resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} + + '@stablelib/keyagreement@1.0.1': + resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} + + '@stablelib/poly1305@1.0.1': + resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} + + '@stablelib/random@1.0.2': + resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + + '@stablelib/sha256@1.0.1': + resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} + + '@stablelib/sha512@1.0.1': + resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} + + '@stablelib/wipe@1.0.1': + resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + + '@stablelib/x25519@1.0.3': + resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} + + '@tanstack/query-core@5.64.1': + resolution: {integrity: sha512-978Wx4Wl4UJZbmvU/rkaM9cQtXXrbhK0lsz/UZhYIbyKYA8E4LdomTwyh2GHZ4oU0BKKoDH4YlKk2VscCUgNmg==} + + '@tanstack/react-query@5.64.1': + resolution: {integrity: sha512-vW5ggHpIO2Yjj44b4sB+Fd3cdnlMJppXRBJkEHvld6FXh3j5dwWJoQo7mGtKI2RbSFyiyu/PhGAy0+Vv5ev9Eg==} + peerDependencies: + react: ^18 || ^19 + '@trivago/prettier-plugin-sort-imports@5.2.1': resolution: {integrity: sha512-NDZndt0fmVThIx/8cExuJHLZagUVzfGCoVrwH9x6aZvwfBdkrDFTYujecek6X2WpG4uUFsVaPg5+aNQPSyjcmw==} engines: {node: '>18.12'} @@ -1060,6 +1323,9 @@ packages: '@types/react@19.0.6': resolution: {integrity: sha512-gIlMztcTeDgXCUj0vCBOqEuSEhX//63fW9SZtCJ+agxoQTOklwDfiEMlTWn4mR/C/UK5VHlpwsCsOyf7/hc4lw==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -1100,6 +1366,120 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 + '@wagmi/connectors@5.7.4': + resolution: {integrity: sha512-ubecKH0grfkfjTB17l1V6Gj4SCMTvCtie7Bq0oQdjqA3Z7zf+F/RAwZoehxkPnSyeK6pFotUlUSr82J3bNhPqA==} + peerDependencies: + '@wagmi/core': 2.16.3 + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + '@wagmi/core@2.16.3': + resolution: {integrity: sha512-SVovoWHaQ2AIkmGf+ucNijT6AHXcTMffFcLmcFF6++y21x+ge7Gkh3UoJiU91SDDv8n08eTQ9jbyia3GEgU5jQ==} + peerDependencies: + '@tanstack/query-core': '>=5.0.0' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + '@tanstack/query-core': + optional: true + typescript: + optional: true + + '@walletconnect/core@2.17.0': + resolution: {integrity: sha512-On+uSaCfWdsMIQsECwWHZBmUXfrnqmv6B8SXRRuTJgd8tUpEvBkLQH4X7XkSm3zW6ozEkQTCagZ2ox2YPn3kbw==} + engines: {node: '>=18'} + + '@walletconnect/environment@1.0.1': + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + + '@walletconnect/ethereum-provider@2.17.0': + resolution: {integrity: sha512-b+KTAXOb6JjoxkwpgYQQKPUcTwENGmdEdZoIDLeRicUmZTn/IQKfkMoC2frClB4YxkyoVMtj1oMV2JAax+yu9A==} + + '@walletconnect/events@1.0.1': + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + + '@walletconnect/heartbeat@1.2.2': + resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} + + '@walletconnect/jsonrpc-http-connection@1.0.8': + resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} + + '@walletconnect/jsonrpc-provider@1.0.14': + resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} + + '@walletconnect/jsonrpc-types@1.0.4': + resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} + + '@walletconnect/jsonrpc-utils@1.0.8': + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + + '@walletconnect/jsonrpc-ws-connection@1.0.14': + resolution: {integrity: sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA==} + + '@walletconnect/keyvaluestorage@1.1.1': + resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + + '@walletconnect/logger@2.1.2': + resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} + + '@walletconnect/modal-core@2.7.0': + resolution: {integrity: sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==} + + '@walletconnect/modal-ui@2.7.0': + resolution: {integrity: sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==} + + '@walletconnect/modal@2.7.0': + resolution: {integrity: sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==} + + '@walletconnect/relay-api@1.0.11': + resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} + + '@walletconnect/relay-auth@1.0.4': + resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} + + '@walletconnect/safe-json@1.0.2': + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + + '@walletconnect/sign-client@2.17.0': + resolution: {integrity: sha512-sErYwvSSHQolNXni47L3Bm10ptJc1s1YoJvJd34s5E9h9+d3rj7PrhbiW9X82deN+Dm5oA8X9tC4xty1yIBrVg==} + + '@walletconnect/time@1.0.2': + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + + '@walletconnect/types@2.17.0': + resolution: {integrity: sha512-i1pn9URpvt9bcjRDkabuAmpA9K7mzyKoLJlbsAujRVX7pfaG7wur7u9Jz0bk1HxvuABL5LHNncTnVKSXKQ5jZA==} + + '@walletconnect/universal-provider@2.17.0': + resolution: {integrity: sha512-d3V5Be7AqLrvzcdMZSBS8DmGDRdqnyLk1DWmRKAGgR6ieUWykhhUKlvfeoZtvJrIXrY7rUGYpH1X41UtFkW5Pw==} + + '@walletconnect/utils@2.17.0': + resolution: {integrity: sha512-1aeQvjwsXy4Yh9G6g2eGmXrEl+BzkNjHRdCrGdMYqFTFa8ROEJfTGsSH3pLsNDlOY94CoBUvJvM55q/PMoN/FQ==} + + '@walletconnect/window-getters@1.0.1': + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + + '@walletconnect/window-metadata@1.0.1': + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + + abitype@1.0.7: + resolution: {integrity: sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1144,6 +1524,13 @@ packages: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true + async-mutex@0.2.6: + resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + autoprefixer@10.4.20: resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} @@ -1151,6 +1538,10 @@ packages: peerDependencies: postcss: ^8.1.0 + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1170,9 +1561,18 @@ packages: bl@5.1.0: resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + bn.js@4.12.1: + resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -1180,6 +1580,9 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + browserslist@4.24.4: resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1188,6 +1591,10 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bufferutil@4.0.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -1196,10 +1603,26 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + caniuse-lite@1.0.30001692: resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==} @@ -1237,6 +1660,13 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -1269,17 +1699,41 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + create-vocs@1.0.0-alpha.5: resolution: {integrity: sha512-/Nr9taHX1SxL5t72DLFPYujqD8d5PDk0T8bJ9Fb/m7ck1lP20PBxHzF5IYnHI0BeTpIuGk/MQoLfT6JKpY6xnw==} hasBin: true + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crossws@0.3.1: + resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==} + css-selector-parser@3.0.5: resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} @@ -1295,6 +1749,10 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -1303,6 +1761,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -1312,9 +1779,17 @@ packages: supports-color: optional: true + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dedent@1.5.3: resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: @@ -1330,6 +1805,13 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1338,10 +1820,16 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} @@ -1355,6 +1843,9 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1366,15 +1857,29 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + eciesjs@0.4.13: + resolution: {integrity: sha512-zBdtR4K+wbj10bWPpIOF9DW+eFYQu8miU5ypunh0t4Bvt83ZPlEWgT5Dq/0G6uwEXumZKjfb5BZxYUZQ2Hzn/Q==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} electron-to-chromium@1.5.80: resolution: {integrity: sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==} + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -1387,6 +1892,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -1395,6 +1903,28 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + engine.io-client@6.6.2: + resolution: {integrity: sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -1453,10 +1983,37 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + eth-block-tracker@7.1.0: + resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} + engines: {node: '>=14.0.0'} + + eth-json-rpc-filters@6.0.1: + resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} + engines: {node: '>=14.0.0'} + + eth-query@2.1.2: + resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} + + eth-rpc-errors@4.0.3: + resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + eval@0.1.8: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -1464,10 +2021,24 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extension-port-stream@3.0.0: + resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} + engines: {node: '>=12.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fastq@1.18.0: resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} @@ -1478,10 +2049,21 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -1513,10 +2095,22 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -1544,9 +2138,30 @@ packages: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + h3@1.13.1: + resolution: {integrity: sha512-u/z6Z4YY+ANZ05cRRfsFJadTBrNA6e3jxdU+AN5UCbZSZEUwgHiwjvUEe0k1NoQmAvQmETwr+xB5jd7mhCJuIQ==} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1587,6 +2202,12 @@ packages: hastscript@8.0.0: resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hono@3.12.12: resolution: {integrity: sha512-5IAMJOXfpA5nT+K0MNjClchzz0IhBHs2Szl7WFAhrFOsbtQsYmNynFyJRg/a3IPsmCfxcrf8txUGiNShXpK5Rg==} engines: {node: '>=16.0.0'} @@ -1602,6 +2223,9 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -1615,12 +2239,19 @@ packages: inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1629,6 +2260,10 @@ packages: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -1644,6 +2279,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1663,17 +2302,33 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -1695,6 +2350,13 @@ packages: engines: {node: '>=6'} hasBin: true + json-rpc-engine@6.1.0: + resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} + engines: {node: '>=10.0.0'} + + json-rpc-random-id@1.0.1: + resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -1703,6 +2365,13 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -1710,10 +2379,26 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lit-element@3.3.3: + resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + + lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + + lit@2.8.0: + resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -1744,6 +2429,10 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + mdast-util-directive@3.0.0: resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} @@ -1808,6 +2497,9 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + micromark-core-commonmark@2.0.2: resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} @@ -1932,10 +2624,21 @@ packages: engines: {node: '>=4'} hasBin: true + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -1947,18 +2650,32 @@ packages: minisearch@6.3.0: resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} + mipd@0.0.7: + resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} modern-ahocorasick@1.1.0: resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} + motion@10.16.2: + resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -1971,6 +2688,25 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -1989,6 +2725,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + obj-multiplex@1.0.0: + resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -1997,6 +2736,15 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} + + on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -2005,6 +2753,9 @@ packages: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -2019,6 +2770,18 @@ packages: outdent@0.8.0: resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + ox@0.6.0: + resolution: {integrity: sha512-blUzTLidvUlshv0O02CnLFqBLidNzPoAZdIth894avUAotTuWziznv6IENv5idRuOSSP3dH8WzcYw84zVdu0Aw==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -2027,10 +2790,18 @@ packages: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -2081,6 +2852,24 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + + pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + + pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + + pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -2088,6 +2877,18 @@ packages: pkg-types@1.3.0: resolution: {integrity: sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==} + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + pony-cause@2.1.11: + resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + engines: {node: '>=12.0.0'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -2129,6 +2930,9 @@ packages: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} + preact@10.25.4: + resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==} + prettier-plugin-tailwindcss@0.6.10: resolution: {integrity: sha512-ndj2WLDaMzACnr1gAYZiZZLs5ZdOeBYgOsbBmHj3nvW/6q8h8PymsXiEnKvj/9qgCCAoHyvLOisoQdIcsDvIgw==} engines: {node: '>=14.21.3'} @@ -2189,15 +2993,42 @@ packages: engines: {node: '>=14'} hasBin: true + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + proxy-compare@2.5.1: + resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} + hasBin: true + + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -2291,6 +3122,9 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -2299,6 +3133,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} @@ -2359,9 +3197,16 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + require-like@0.1.2: resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -2383,9 +3228,20 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} @@ -2393,6 +3249,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -2401,9 +3262,20 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2429,6 +3301,17 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2440,6 +3323,14 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -2448,6 +3339,13 @@ packages: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2460,6 +3358,9 @@ packages: resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} engines: {node: '>=16'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -2486,6 +3387,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + superstruct@1.0.4: + resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + engines: {node: '>=14.0.0'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -2508,6 +3413,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2519,6 +3427,9 @@ packages: toml@3.0.0: resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -2528,6 +3439,9 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2551,9 +3465,18 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + uint8arrays@3.1.0: + resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + unenv@1.10.0: + resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} + unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} @@ -2585,6 +3508,65 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + unstorage@1.14.4: + resolution: {integrity: sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.5.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 + '@deno/kv': '>=0.8.4' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.0' + '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.1 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + update-browserslist-db@1.1.2: resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} hasBin: true @@ -2611,9 +3593,46 @@ packages: '@types/react': optional: true + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + valtio@1.11.2: + resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -2630,6 +3649,14 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + viem@2.22.8: + resolution: {integrity: sha512-iB3PW/a/qzpYbpjo3R662u6a/zo6piZHez/N/bOC25C79FYXBCs8mQDqwiHk3FYErUhS4KVZLabKV9zGMd+EgQ==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + vite-node@1.6.0: resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -2673,11 +3700,45 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 + wagmi@2.14.8: + resolution: {integrity: sha512-m7oMF/rqsTwYuBZzwyYskzhdkZxq6zJjY2le6Vz7We5Hih7hwJ7hLNU5TxMfhqjPRfsqXlWX9HLOszOipHxz8Q==} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + webauthn-p256@0.0.10: + resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} + + webextension-polyfill@0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2686,6 +3747,56 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -2694,6 +3805,14 @@ packages: engines: {node: '>= 14'} hasBin: true + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2702,11 +3821,31 @@ packages: resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} + zustand@5.0.0: + resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: + '@adraffy/ens-normalize@1.11.0': {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -2844,6 +3983,31 @@ snapshots: picocolors: 1.1.1 sisteransi: 1.0.5 + '@coinbase/wallet-sdk@3.9.3': + dependencies: + bn.js: 5.2.1 + buffer: 6.0.3 + clsx: 1.2.1 + eth-block-tracker: 7.1.0 + eth-json-rpc-filters: 6.0.1 + eventemitter3: 5.0.1 + keccak: 3.0.4 + preact: 10.25.4 + sha.js: 2.4.11 + transitivePeerDependencies: + - supports-color + + '@coinbase/wallet-sdk@4.2.3': + dependencies: + '@noble/hashes': 1.7.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + preact: 10.25.4 + + '@ecies/ciphers@0.2.2(@noble/ciphers@1.2.0)': + dependencies: + '@noble/ciphers': 1.2.0 + '@emotion/hash@0.9.2': {} '@esbuild/aix-ppc64@0.19.12': @@ -2984,6 +4148,26 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true + '@ethereumjs/common@3.2.0': + dependencies: + '@ethereumjs/util': 8.1.0 + crc-32: 1.2.2 + + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/tx@4.2.0': + dependencies: + '@ethereumjs/common': 3.2.0 + '@ethereumjs/rlp': 4.0.1 + '@ethereumjs/util': 8.1.0 + ethereum-cryptography: 2.2.1 + + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + '@floating-ui/core@1.6.9': dependencies: '@floating-ui/utils': 0.2.9 @@ -3039,6 +4223,12 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@lit-labs/ssr-dom-shim@1.3.0': {} + + '@lit/reactive-element@1.6.3': + dependencies: + '@lit-labs/ssr-dom-shim': 1.3.0 + '@mdx-js/mdx@3.1.0(acorn@8.14.0)': dependencies: '@types/estree': 1.0.6 @@ -3086,6 +4276,227 @@ snapshots: - acorn - supports-color + '@metamask/eth-json-rpc-provider@1.0.1': + dependencies: + '@metamask/json-rpc-engine': 7.3.3 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 5.0.2 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@7.3.3': + dependencies: + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@8.0.2': + dependencies: + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-middleware-stream@7.0.2': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color + + '@metamask/object-multiplex@2.1.0': + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + + '@metamask/onboarding@1.0.1': + dependencies: + bowser: 2.11.0 + + '@metamask/providers@16.1.0': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/json-rpc-middleware-stream': 7.0.2 + '@metamask/object-multiplex': 2.1.0 + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + detect-browser: 5.3.0 + extension-port-stream: 3.0.0 + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + transitivePeerDependencies: + - supports-color + + '@metamask/rpc-errors@6.4.0': + dependencies: + '@metamask/utils': 9.3.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + + '@metamask/safe-event-emitter@2.0.0': {} + + '@metamask/safe-event-emitter@3.1.2': {} + + '@metamask/sdk-communication-layer@0.31.0(cross-fetch@4.1.0)(eciesjs@0.4.13)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + bufferutil: 4.0.9 + cross-fetch: 4.1.0 + date-fns: 2.30.0 + debug: 4.4.0 + eciesjs: 0.4.13 + eventemitter2: 6.4.9 + readable-stream: 3.6.2 + socket.io-client: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + utf-8-validate: 5.0.10 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + + '@metamask/sdk-install-modal-web@0.31.5': + dependencies: + '@paulmillr/qr': 0.2.1 + + '@metamask/sdk@0.31.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.26.0 + '@metamask/onboarding': 1.0.1 + '@metamask/providers': 16.1.0 + '@metamask/sdk-communication-layer': 0.31.0(cross-fetch@4.1.0)(eciesjs@0.4.13)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@metamask/sdk-install-modal-web': 0.31.5 + '@paulmillr/qr': 0.2.1 + bowser: 2.11.0 + cross-fetch: 4.1.0 + debug: 4.4.0 + eciesjs: 0.4.13 + eth-rpc-errors: 4.0.3 + eventemitter2: 6.4.9 + obj-multiplex: 1.0.0 + pump: 3.0.2 + readable-stream: 3.6.2 + socket.io-client: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + tslib: 2.8.1 + util: 0.12.5 + uuid: 8.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@metamask/superstruct@3.1.0': {} + + '@metamask/utils@5.0.2': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@types/debug': 4.1.12 + debug: 4.4.0 + semver: 7.6.3 + superstruct: 1.0.4 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@8.5.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.1.0 + '@noble/hashes': 1.7.0 + '@scure/base': 1.2.1 + '@types/debug': 4.1.12 + debug: 4.4.0 + pony-cause: 2.1.11 + semver: 7.6.3 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@9.3.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.1.0 + '@noble/hashes': 1.7.0 + '@scure/base': 1.2.1 + '@types/debug': 4.1.12 + debug: 4.4.0 + pony-cause: 2.1.11 + semver: 7.6.3 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@motionone/animation@10.18.0': + dependencies: + '@motionone/easing': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + + '@motionone/dom@10.18.0': + dependencies: + '@motionone/animation': 10.18.0 + '@motionone/generators': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + hey-listen: 1.0.8 + tslib: 2.8.1 + + '@motionone/easing@10.18.0': + dependencies: + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + + '@motionone/generators@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + + '@motionone/svelte@10.16.4': + dependencies: + '@motionone/dom': 10.18.0 + tslib: 2.8.1 + + '@motionone/types@10.17.1': {} + + '@motionone/utils@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + hey-listen: 1.0.8 + tslib: 2.8.1 + + '@motionone/vue@10.16.4': + dependencies: + '@motionone/dom': 10.18.0 + tslib: 2.8.1 + + '@noble/ciphers@1.2.0': {} + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.7.0': + dependencies: + '@noble/hashes': 1.6.0 + + '@noble/curves@1.8.0': + dependencies: + '@noble/hashes': 1.7.0 + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.6.0': {} + + '@noble/hashes@1.6.1': {} + '@noble/hashes@1.7.0': {} '@nodelib/fs.scandir@2.1.5': @@ -3100,6 +4511,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.18.0 + '@paulmillr/qr@0.2.1': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -3490,6 +4903,54 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.30.1': optional: true + '@safe-global/safe-apps-provider@0.18.5(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)': + dependencies: + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.22.6 + viem: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-gateway-typescript-sdk@3.22.6': {} + + '@scure/base@1.1.9': {} + + '@scure/base@1.2.1': {} + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip32@1.6.0': + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/base': 1.2.1 + + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.5.0': + dependencies: + '@noble/hashes': 1.6.1 + '@scure/base': 1.2.1 + '@shikijs/core@1.26.2': dependencies: '@shikijs/engine-javascript': 1.26.2 @@ -3547,6 +5008,95 @@ snapshots: '@shikijs/vscode-textmate@10.0.1': {} + '@socket.io/component-emitter@3.1.2': {} + + '@stablelib/aead@1.0.1': {} + + '@stablelib/binary@1.0.1': + dependencies: + '@stablelib/int': 1.0.1 + + '@stablelib/bytes@1.0.1': {} + + '@stablelib/chacha20poly1305@1.0.1': + dependencies: + '@stablelib/aead': 1.0.1 + '@stablelib/binary': 1.0.1 + '@stablelib/chacha': 1.0.1 + '@stablelib/constant-time': 1.0.1 + '@stablelib/poly1305': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/chacha@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/constant-time@1.0.1': {} + + '@stablelib/ed25519@1.0.3': + dependencies: + '@stablelib/random': 1.0.2 + '@stablelib/sha512': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/hash@1.0.1': {} + + '@stablelib/hkdf@1.0.1': + dependencies: + '@stablelib/hash': 1.0.1 + '@stablelib/hmac': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/hmac@1.0.1': + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/int@1.0.1': {} + + '@stablelib/keyagreement@1.0.1': + dependencies: + '@stablelib/bytes': 1.0.1 + + '@stablelib/poly1305@1.0.1': + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/random@1.0.2': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/sha256@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/sha512@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/wipe@1.0.1': {} + + '@stablelib/x25519@1.0.3': + dependencies: + '@stablelib/keyagreement': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/wipe': 1.0.1 + + '@tanstack/query-core@5.64.1': {} + + '@tanstack/react-query@5.64.1(react@19.0.0)': + dependencies: + '@tanstack/query-core': 5.64.1 + react: 19.0.0 + '@trivago/prettier-plugin-sort-imports@5.2.1(prettier@3.4.2)': dependencies: '@babel/generator': 7.26.5 @@ -3614,6 +5164,8 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/trusted-types@2.0.7': {} + '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -3714,6 +5266,409 @@ snapshots: transitivePeerDependencies: - supports-color + '@wagmi/connectors@5.7.4(@types/react@19.0.6)(@wagmi/core@2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10))': + dependencies: + '@coinbase/wallet-sdk': 4.2.3 + '@metamask/sdk': 0.31.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.5(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + '@wagmi/core': 2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)) + '@walletconnect/ethereum-provider': 2.17.0(@types/react@19.0.6)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + viem: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - supports-color + - uploadthing + - utf-8-validate + - zod + + '@wagmi/core@2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.7.3) + viem: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + zustand: 5.0.0(@types/react@19.0.6)(react@19.0.0)(use-sync-external-store@1.4.0(react@19.0.0)) + optionalDependencies: + '@tanstack/query-core': 5.64.1 + typescript: 5.7.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + + '@walletconnect/core@2.17.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.17.0 + '@walletconnect/utils': 2.17.0 + events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - uploadthing + - utf-8-validate + + '@walletconnect/environment@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/ethereum-provider@2.17.0(@types/react@19.0.6)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.7.0(@types/react@19.0.6)(react@19.0.0) + '@walletconnect/sign-client': 2.17.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.17.0 + '@walletconnect/universal-provider': 2.17.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.17.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - uploadthing + - utf-8-validate + + '@walletconnect/events@1.0.1': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.2': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-http-connection@1.0.8': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.2.0 + events: 3.3.0 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.4 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.14(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.1 + unstorage: 1.14.4(idb-keyval@6.2.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/modal-core@2.7.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + valtio: 1.11.2(@types/react@19.0.6)(react@19.0.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal-ui@2.7.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + '@walletconnect/modal-core': 2.7.0(@types/react@19.0.6)(react@19.0.0) + lit: 2.8.0 + motion: 10.16.2 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal@2.7.0(@types/react@19.0.6)(react@19.0.0)': + dependencies: + '@walletconnect/modal-core': 2.7.0(@types/react@19.0.6)(react@19.0.0) + '@walletconnect/modal-ui': 2.7.0(@types/react@19.0.6)(react@19.0.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-auth@1.0.4': + dependencies: + '@stablelib/ed25519': 1.0.3 + '@stablelib/random': 1.0.2 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + uint8arrays: 3.1.0 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.17.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.17.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.17.0 + '@walletconnect/utils': 2.17.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - uploadthing + - utf-8-validate + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.17.0': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/universal-provider@2.17.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.17.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.17.0 + '@walletconnect/utils': 2.17.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - uploadthing + - utf-8-validate + + '@walletconnect/utils@2.17.0': + dependencies: + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.17.0 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + elliptic: 6.6.1 + query-string: 7.1.3 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/window-getters@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/window-metadata@1.0.1': + dependencies: + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 + + abitype@1.0.7(typescript@5.7.3): + optionalDependencies: + typescript: 5.7.3 + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -3745,6 +5700,12 @@ snapshots: astring@1.9.0: {} + async-mutex@0.2.6: + dependencies: + tslib: 2.8.1 + + atomic-sleep@1.0.0: {} + autoprefixer@10.4.20(postcss@8.4.49): dependencies: browserslist: 4.24.4 @@ -3755,6 +5716,10 @@ snapshots: postcss: 8.4.49 postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -3771,8 +5736,14 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + bn.js@4.12.1: {} + + bn.js@5.2.1: {} + boolbase@1.0.0: {} + bowser@2.11.0: {} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -3781,6 +5752,8 @@ snapshots: dependencies: fill-range: 7.1.1 + brorand@1.1.0: {} + browserslist@4.24.4: dependencies: caniuse-lite: 1.0.30001692 @@ -3793,12 +5766,35 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bufferutil@4.0.9: + dependencies: + node-gyp-build: 4.8.4 + bytes@3.1.2: {} cac@6.7.14: {} + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + camelcase-css@2.0.1: {} + camelcase@5.3.1: {} + caniuse-lite@1.0.30001692: {} ccount@2.0.1: {} @@ -3833,6 +5829,14 @@ snapshots: cli-spinners@2.9.2: {} + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + clsx@1.2.1: {} + clsx@2.1.1: {} collapse-white-space@2.1.0: {} @@ -3865,8 +5869,16 @@ snapshots: confbox@0.1.8: {} + consola@3.4.0: {} + convert-source-map@2.0.0: {} + cookie-es@1.2.2: {} + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + create-vocs@1.0.0-alpha.5: dependencies: '@clack/prompts': 0.7.0 @@ -3875,12 +5887,28 @@ snapshots: fs-extra: 11.2.0 picocolors: 1.1.1 + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-fetch@4.1.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + crossws@0.3.1: + dependencies: + uncrypto: 0.1.3 + css-selector-parser@3.0.5: {} css-what@6.1.0: {} @@ -3889,30 +5917,54 @@ snapshots: csstype@3.1.3: {} + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.26.0 + debug@2.6.9: dependencies: ms: 2.0.0 + debug@4.3.7: + dependencies: + ms: 2.1.3 + debug@4.4.0: dependencies: ms: 2.1.3 + decamelize@1.2.0: {} + decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 + decode-uri-component@0.2.2: {} + dedent@1.5.3: {} deep-object-diff@1.1.9: {} deepmerge@4.3.1: {} + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + defu@6.1.4: {} + depd@2.0.0: {} dequal@2.0.3: {} + destr@2.0.3: {} + destroy@1.2.0: {} + detect-browser@5.3.0: {} + detect-node-es@1.1.0: {} detect-package-manager@3.0.2: @@ -3925,6 +5977,8 @@ snapshots: didyoumean@1.2.2: {} + dijkstrajs@1.0.3: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -3933,12 +5987,42 @@ snapshots: dlv@1.1.3: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} + eciesjs@0.4.13: + dependencies: + '@ecies/ciphers': 0.2.2(@noble/ciphers@1.2.0) + '@noble/ciphers': 1.2.0 + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + ee-first@1.1.1: {} electron-to-chromium@1.5.80: {} + elliptic@6.6.1: + dependencies: + bn.js: 4.12.1 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + emoji-regex-xs@1.0.0: {} emoji-regex@10.4.0: {} @@ -3947,10 +6031,38 @@ snapshots: emoji-regex@9.2.2: {} + encode-utf8@1.0.3: {} + encodeurl@1.0.2: {} encodeurl@2.0.0: {} + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + engine.io-client@6.6.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + esast-util-from-estree@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -4064,11 +6176,51 @@ snapshots: etag@1.8.1: {} + eth-block-tracker@7.1.0: + dependencies: + '@metamask/eth-json-rpc-provider': 1.0.1 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 5.0.2 + json-rpc-random-id: 1.0.1 + pify: 3.0.0 + transitivePeerDependencies: + - supports-color + + eth-json-rpc-filters@6.0.1: + dependencies: + '@metamask/safe-event-emitter': 3.1.2 + async-mutex: 0.2.6 + eth-query: 2.1.2 + json-rpc-engine: 6.1.0 + pify: 5.0.0 + + eth-query@2.1.2: + dependencies: + json-rpc-random-id: 1.0.1 + xtend: 4.0.2 + + eth-rpc-errors@4.0.3: + dependencies: + fast-safe-stringify: 2.1.1 + + ethereum-cryptography@2.2.1: + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + eval@0.1.8: dependencies: '@types/node': 22.10.5 require-like: 0.1.2 + eventemitter2@6.4.9: {} + + eventemitter3@5.0.1: {} + + events@3.3.0: {} + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -4083,6 +6235,13 @@ snapshots: extend@3.0.2: {} + extension-port-stream@3.0.0: + dependencies: + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + + fast-deep-equal@3.1.3: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4091,6 +6250,10 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -4103,11 +6266,22 @@ snapshots: dependencies: to-regex-range: 5.0.1 + filter-obj@1.1.0: {} + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 @@ -4132,8 +6306,28 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@6.0.1: {} github-slugger@2.0.0: {} @@ -4165,8 +6359,38 @@ snapshots: merge2: 1.4.1 slash: 4.0.0 + gopd@1.2.0: {} + graceful-fs@4.2.11: {} + h3@1.13.1: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.1 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.2.1 + ohash: 1.1.4 + radix3: 1.1.2 + ufo: 1.5.4 + uncrypto: 0.1.3 + unenv: 1.10.0 + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -4281,6 +6505,14 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 + hey-listen@1.0.8: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + hono@3.12.12: {} html-void-elements@3.0.0: {} @@ -4295,6 +6527,8 @@ snapshots: human-signals@2.1.0: {} + idb-keyval@6.2.1: {} + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -4303,6 +6537,8 @@ snapshots: inline-style-parser@0.2.4: {} + iron-webcrypto@1.2.1: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -4310,12 +6546,19 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 is-buffer@2.0.5: {} + is-callable@1.2.7: {} + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -4326,6 +6569,13 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -4338,12 +6588,29 @@ snapshots: is-plain-obj@4.1.0: {} + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + is-stream@2.0.1: {} + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + is-unicode-supported@1.3.0: {} + isarray@1.0.0: {} + isexe@2.0.0: {} + isows@1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -4360,6 +6627,13 @@ snapshots: jsesc@3.1.0: {} + json-rpc-engine@6.1.0: + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + eth-rpc-errors: 4.0.3 + + json-rpc-random-id@1.0.1: {} + json5@2.2.3: {} jsonfile@6.1.0: @@ -4368,14 +6642,44 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 + + keyvaluestorage-interface@1.0.0: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} + lit-element@3.3.3: + dependencies: + '@lit-labs/ssr-dom-shim': 1.3.0 + '@lit/reactive-element': 1.6.3 + lit-html: 2.8.0 + + lit-html@2.8.0: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@2.8.0: + dependencies: + '@lit/reactive-element': 1.6.3 + lit-element: 3.3.3 + lit-html: 2.8.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 + lodash.isequal@4.5.0: {} + lodash@4.17.21: {} log-symbols@5.1.0: @@ -4401,6 +6705,8 @@ snapshots: markdown-table@3.0.4: {} + math-intrinsics@1.1.0: {} + mdast-util-directive@3.0.0: dependencies: '@types/mdast': 4.0.4 @@ -4596,6 +6902,8 @@ snapshots: merge2@1.4.1: {} + micro-ftch@0.3.1: {} + micromark-core-commonmark@2.0.2: dependencies: decode-named-character-reference: 1.0.2 @@ -4888,8 +7196,14 @@ snapshots: mime@1.6.0: {} + mime@3.0.0: {} + mimic-fn@2.1.0: {} + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -4898,6 +7212,10 @@ snapshots: minisearch@6.3.0: {} + mipd@0.0.7(typescript@5.7.3): + optionalDependencies: + typescript: 5.7.3 + mlly@1.7.4: dependencies: acorn: 8.14.0 @@ -4907,10 +7225,21 @@ snapshots: modern-ahocorasick@1.1.0: {} + motion@10.16.2: + dependencies: + '@motionone/animation': 10.18.0 + '@motionone/dom': 10.18.0 + '@motionone/svelte': 10.16.4 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + '@motionone/vue': 10.16.4 + ms@2.0.0: {} ms@2.1.3: {} + multiformats@9.9.0: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -4921,6 +7250,16 @@ snapshots: negotiator@0.6.4: {} + node-addon-api@2.0.2: {} + + node-fetch-native@1.6.4: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: {} + node-releases@2.0.19: {} normalize-path@3.0.0: {} @@ -4935,16 +7274,36 @@ snapshots: dependencies: boolbase: 1.0.0 + obj-multiplex@1.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + readable-stream: 2.3.8 + object-assign@4.1.1: {} object-hash@3.0.0: {} + ofetch@1.4.1: + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.4 + + ohash@1.1.4: {} + + on-exit-leak-free@0.2.0: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 on-headers@1.0.2: {} + once@1.4.0: + dependencies: + wrappy: 1.0.2 + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -4969,6 +7328,24 @@ snapshots: outdent@0.8.0: {} + ox@0.6.0(typescript@5.7.3): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@scure/bip32': 1.6.0 + '@scure/bip39': 1.5.0 + abitype: 1.0.7(typescript@5.7.3) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - zod + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -4977,10 +7354,16 @@ snapshots: dependencies: yocto-queue: 1.1.1 + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 + p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} parse-entities@4.0.2: @@ -5020,6 +7403,31 @@ snapshots: pify@2.3.0: {} + pify@3.0.0: {} + + pify@5.0.0: {} + + pino-abstract-transport@0.5.0: + dependencies: + duplexify: 4.1.3 + split2: 4.2.0 + + pino-std-serializers@4.0.0: {} + + pino@7.11.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + pirates@4.0.6: {} pkg-types@1.3.0: @@ -5028,6 +7436,12 @@ snapshots: mlly: 1.7.4 pathe: 1.1.2 + pngjs@5.0.0: {} + + pony-cause@2.1.11: {} + + possible-typed-array-names@1.0.0: {} + postcss-import@15.1.0(postcss@8.4.49): dependencies: postcss: 8.4.49 @@ -5065,6 +7479,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + preact@10.25.4: {} + prettier-plugin-tailwindcss@0.6.10(@trivago/prettier-plugin-sort-imports@5.2.1(prettier@3.4.2))(prettier@3.4.2): dependencies: prettier: 3.4.2 @@ -5073,6 +7489,10 @@ snapshots: prettier@3.4.2: {} + process-nextick-args@2.0.1: {} + + process-warning@1.0.0: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -5081,8 +7501,33 @@ snapshots: property-information@6.5.0: {} + proxy-compare@2.5.1: {} + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + qrcode@1.5.3: + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + + radix3@1.1.2: {} + range-parser@1.2.1: {} react-dom@19.0.0(react@19.0.0): @@ -5163,6 +7608,16 @@ snapshots: dependencies: pify: 2.3.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -5173,6 +7628,8 @@ snapshots: dependencies: picomatch: 2.3.1 + real-require@0.1.0: {} + recma-build-jsx@1.0.0: dependencies: '@types/estree': 1.0.6 @@ -5316,8 +7773,12 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 + require-directory@2.1.1: {} + require-like@0.1.2: {} + require-main-filename@2.0.0: {} + resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -5360,12 +7821,24 @@ snapshots: dependencies: queue-microtask: 1.2.3 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-stable-stringify@2.5.0: {} + scheduler@0.25.0: {} semver@6.3.1: {} + semver@7.6.3: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -5393,8 +7866,24 @@ snapshots: transitivePeerDependencies: - supports-color + set-blocking@2.0.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + setprototypeof@1.2.0: {} + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -5420,18 +7909,48 @@ snapshots: slash@4.0.0: {} + socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-client: 6.6.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + sonic-boom@2.8.0: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.2.1: {} source-map@0.7.4: {} space-separated-tokens@2.0.2: {} + split-on-first@1.1.0: {} + + split2@4.2.0: {} + statuses@2.0.1: {} stdin-discarder@0.1.0: dependencies: bl: 5.1.0 + stream-shift@1.0.3: {} + + strict-uri-encode@2.0.0: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -5450,6 +7969,10 @@ snapshots: emoji-regex: 10.4.0 strip-ansi: 7.1.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -5483,6 +8006,8 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 + superstruct@1.0.4: {} + supports-preserve-symlinks-flag@1.0.0: {} tabbable@6.2.0: {} @@ -5524,6 +8049,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thread-stream@0.15.2: + dependencies: + real-require: 0.1.0 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -5532,12 +8061,16 @@ snapshots: toml@3.0.0: {} + tr46@0.0.3: {} + trim-lines@3.0.1: {} trough@2.2.0: {} ts-interface-checker@0.1.13: {} + tslib@1.14.1: {} + tslib@2.8.1: {} twoslash-protocol@0.2.12: {} @@ -5556,8 +8089,22 @@ snapshots: ufo@1.5.4: {} + uint8arrays@3.1.0: + dependencies: + multiformats: 9.9.0 + + uncrypto@0.1.3: {} + undici-types@6.20.0: {} + unenv@1.10.0: + dependencies: + consola: 3.4.0 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.4 + pathe: 1.1.2 + unified@10.1.2: dependencies: '@types/unist': 2.0.11 @@ -5611,6 +8158,19 @@ snapshots: universalify@2.0.1: {} + unstorage@1.14.4(idb-keyval@6.2.1): + dependencies: + anymatch: 3.1.3 + chokidar: 3.6.0 + destr: 2.0.3 + h3: 1.13.1 + lru-cache: 10.4.3 + node-fetch-native: 1.6.4 + ofetch: 1.4.1 + ufo: 1.5.4 + optionalDependencies: + idb-keyval: 6.2.1 + update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: browserslist: 4.24.4 @@ -5632,8 +8192,40 @@ snapshots: optionalDependencies: '@types/react': 19.0.6 + use-sync-external-store@1.2.0(react@19.0.0): + dependencies: + react: 19.0.0 + + use-sync-external-store@1.4.0(react@19.0.0): + dependencies: + react: 19.0.0 + + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + util-deprecate@1.0.2: {} + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.18 + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + valtio@1.11.2(@types/react@19.0.6)(react@19.0.0): + dependencies: + proxy-compare: 2.5.1 + use-sync-external-store: 1.2.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.6 + react: 19.0.0 + vary@1.1.2: {} vfile-message@3.1.4: @@ -5658,6 +8250,24 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10): + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/bip32': 1.6.0 + '@scure/bip39': 1.5.0 + abitype: 1.0.7(typescript@5.7.3) + isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.6.0(typescript@5.7.3) + webauthn-p256: 0.0.10 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + vite-node@1.6.0(@types/node@22.10.5): dependencies: cac: 6.7.14 @@ -5768,10 +8378,79 @@ snapshots: - ts-node - typescript + wagmi@2.14.8(@tanstack/query-core@5.64.1)(@tanstack/react-query@5.64.1(react@19.0.0))(@types/react@19.0.6)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)): + dependencies: + '@tanstack/react-query': 5.64.1(react@19.0.0) + '@wagmi/connectors': 5.7.4(@types/react@19.0.6)(@wagmi/core@2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)) + '@wagmi/core': 2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)) + react: 19.0.0 + use-sync-external-store: 1.4.0(react@19.0.0) + viem: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - immer + - ioredis + - supports-color + - uploadthing + - utf-8-validate + - zod + + webauthn-p256@0.0.10: + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + + webextension-polyfill@0.10.0: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-module@2.0.1: {} + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@2.0.2: dependencies: isexe: 2.0.0 + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -5784,12 +8463,60 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrappy@1.0.2: {} + + ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + + ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + + ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + + xmlhttprequest-ssl@2.1.2: {} + + xtend@4.0.2: {} + + y18n@4.0.3: {} + yallist@3.1.1: {} yaml@2.7.0: {} + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yocto-queue@0.1.0: {} yocto-queue@1.1.1: {} + zustand@5.0.0(@types/react@19.0.6)(react@19.0.0)(use-sync-external-store@1.4.0(react@19.0.0)): + optionalDependencies: + '@types/react': 19.0.6 + react: 19.0.0 + use-sync-external-store: 1.4.0(react@19.0.0) + zwitch@2.0.4: {} diff --git a/src/components/AddressRecords.tsx b/src/components/AddressRecords.tsx new file mode 100644 index 000000000..ef18e6e8c --- /dev/null +++ b/src/components/AddressRecords.tsx @@ -0,0 +1,28 @@ +import { useEnsAvatar } from 'wagmi' + +import { UseEnsAddressesProps, useEnsAddresses } from '../hooks/useEnsAddresses' +import { Table } from './ui/Table' + +export const AddressRecords = ({ name, coinTypes }: UseEnsAddressesProps) => { + const { data: avatar } = useEnsAvatar({ name, chainId: 1 }) + const { data: addresses } = useEnsAddresses({ name, coinTypes }) + + return ( + <> +
+ + {name} +
+ + [coinType, address]) || [] + } + /> + + ) +} diff --git a/src/components/ConnectKits.tsx b/src/components/ConnectKits.tsx index 69131aff3..59025819a 100644 --- a/src/components/ConnectKits.tsx +++ b/src/components/ConnectKits.tsx @@ -179,11 +179,11 @@ export const ConnectKits = () => {
[key, value]) || []} + /> + + ) +} diff --git a/src/components/ui/Card.tsx b/src/components/ui/Card.tsx index 95c3d4454..273b5ac7e 100644 --- a/src/components/ui/Card.tsx +++ b/src/components/ui/Card.tsx @@ -7,7 +7,7 @@ type Props = PropsWithChildren> export function Card({ children, className, ...props }: Props) { return (
{children} diff --git a/src/components/ui/Table.tsx b/src/components/ui/Table.tsx new file mode 100644 index 000000000..35da072f8 --- /dev/null +++ b/src/components/ui/Table.tsx @@ -0,0 +1,30 @@ +type Props = { + columns: string[] + rows: (string | number | null)[][] +} + +export function Table({ columns, rows }: Props) { + return ( +
+ + + {columns.map((column) => ( + + ))} + + + + {rows.map((row) => ( + + {row.map((cell) => ( + + ))} + + ))} + +
{column}
{cell}
+ ) +} diff --git a/src/hooks/useEnsAddresses.ts b/src/hooks/useEnsAddresses.ts new file mode 100644 index 000000000..5e048af1e --- /dev/null +++ b/src/hooks/useEnsAddresses.ts @@ -0,0 +1,27 @@ +import { useQuery } from '@tanstack/react-query' +import { usePublicClient } from 'wagmi' + +export type UseEnsAddressesProps = { + name: string + coinTypes: number[] +} + +export function useEnsAddresses({ name, coinTypes }: UseEnsAddressesProps) { + const client = usePublicClient({ chainId: 1 }) + + return useQuery({ + queryKey: ['ens-addresses', name, coinTypes], + queryFn: async () => { + const promises = coinTypes.map((coinType) => + client!.getEnsAddress({ name, coinType }) + ) + + const results = await Promise.all(promises) + + return coinTypes.map((coinType, index) => ({ + coinType, + address: results[index], + })) + }, + }) +} diff --git a/src/hooks/useEnsTexts.ts b/src/hooks/useEnsTexts.ts new file mode 100644 index 000000000..e530e8b76 --- /dev/null +++ b/src/hooks/useEnsTexts.ts @@ -0,0 +1,21 @@ +import { useQuery } from '@tanstack/react-query' +import { usePublicClient } from 'wagmi' + +export type UseEnsTextsProps = { + name: string + keys: string[] +} + +export function useEnsTexts({ name, keys }: UseEnsTextsProps) { + const wagmiClient = usePublicClient({ chainId: 1 }) + + return useQuery({ + queryKey: ['ens-texts', name, keys], + queryFn: async () => { + const promises = keys.map((key) => wagmiClient!.getEnsText({ name, key })) + const results = await Promise.all(promises) + + return keys.map((key, index) => ({ key, value: results[index] })) + }, + }) +} diff --git a/src/layout.tsx b/src/layout.tsx new file mode 100644 index 000000000..1d59f8173 --- /dev/null +++ b/src/layout.tsx @@ -0,0 +1,21 @@ +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { PropsWithChildren } from 'react' +import { WagmiProvider, createConfig, http } from 'wagmi' +import { mainnet } from 'wagmi/chains' + +const config = createConfig({ + chains: [mainnet], + transports: { + [mainnet.id]: http(), + }, +}) + +const queryClient = new QueryClient() + +export default function Layout({ children }: PropsWithChildren) { + return ( + + {children} + + ) +} diff --git a/src/pages/web/quickstart.mdx b/src/pages/web/quickstart.mdx index 9ec8eaca9..6bbd02461 100644 --- a/src/pages/web/quickstart.mdx +++ b/src/pages/web/quickstart.mdx @@ -1,13 +1,8 @@ -import { ConnectKits } from '@/components/ConnectKits'; - -export const meta = { - description: 'Everything on one page', - emoji: '⚡', - showDetailsSection: false, - contributors: [ - 'luc.eth' - ] -}; +import { AddressRecords } from '../../components/AddressRecords' +import { ConnectKits } from '../../components/ConnectKits' +import { EnsProfile } from '../../components/EnsProfile' +import { TextRecords } from '../../components/TextRecords' +import { Card } from '../../components/ui/Card' # Quickstart @@ -20,212 +15,90 @@ If you would rather just clone an example repository checkout these: ## Add to your dApp -This quickstart guide assumes you have a basic understanding of **react, ethers, wagmi, tailwindcss, and web3**. +This quickstart guide assumes you have a basic understanding of React. ### Installation - - -```sh {{ title: "Connectkit", variant: "connectkit", link: "https://docs.family.co/connectkit/getting-started" }} -npm install connectkit wagmi viem -``` - -```sh {{ title: "Rainbowkit", variant: "rainbowkit", link: "https://www.rainbowkit.com/docs/installation" }} -npm install @rainbow-me/rainbowkit wagmi viem -``` - -```tsx {{ title: "Wagmi", variant: "wagmi", link: "https://wagmi.sh/react/getting-started", stackblitz: 'https://stackblitz.com/edit/ens-wagmi-template' }} -npm install wagmi viem -``` - -```tsx {{ title: "Ethers", variant: "ethers", link: "https://docs.ethers.org/v5/getting-started/" }} -npm install ethers -``` - -```tsx {{ title: "Viem", variant: "viem", link: "https://viem.sh/docs/getting-started.html", stackblitz: "https://new.viem.sh" }} -npm install viem -``` - -```tsx {{ title: "Ethers.rs", variant: "rust", link: "https://docs.rs/ethers/latest/ethers/" }} -cargo add ethers -``` - -```sh {{ title: "Go", variant: "go" }} -go get github.com/wealdtech/go-ens/v3 +```bash [Terminal] +npm install wagmi viem @tanstack/react-query ``` - - ### Showing the User Profile -The below codesnippet demonstrates how you can create a basic UserProfile section that shows the users ENS name and avatar. +The below codesnippet demonstrates how you can create a basic user profile section that shows the users ENS name and avatar. The snippet leverages the [useAccount](https://wagmi.sh/react/hooks/useAccount), [useEnsName](https://wagmi.sh/react/hooks/useEnsName), and [useEnsAvatar](https://wagmi.sh/react/hooks/useEnsAvatar) hooks from wagmi. -
-
- -
- luc.eth - 0x123...456 -
-
-
- - + + + + + + -```tsx {{ variant: "rainbowkit", link: "https://www.rainbowkit.com/docs/connect-button" }} -import { ConnectButton } from '@rainbow-me/rainbowkit'; +```tsx +import { useAccount, useEnsAvatar, useEnsName } from 'wagmi' -// Rainbowkit's ConnectButton includes a built-in user profile! -export const YourApp = () => { - return ; -}; -``` - -```tsx {{ meta: "focus=5:11", variant: "wagmi", link: "https://wagmi.sh/react/hooks/useEnsAvatar", stackblitz: "https://stackblitz.com/edit/ens-wagmi-quickstart-profile" }} -import { useAccount, useEnsName, useEnsAvatar } from 'wagmi'; -import { formatAddress } from 'ens-tools'; - -export const YourApp: FC = () => { - const { address } = useAccount(); - const { data: name } = useEnsName({ address, chainId: 1 }); - const { data: avatar } = useEnsAvatar({ name, chainId: 1 }); - - return ( -
- -
- {name && {name}} - {formatAddress(address)} -
-
- ); -}; -``` - -```go {{ variant: "go" }} -package main - -import ( - "fmt" +export const EnsProfile = () => { + const { address } = useAccount() + const { data: name } = useEnsName({ address, chainId: 1 }) + const { data: avatar } = useEnsAvatar({ name, chainId: 1 }) - "github.com/ethereum/go-ethereum/ethclient" - ens "github.com/wealdtech/go-ens/v3" -) - -func main() { - client, _ := ethclient.Dial("https://rpc.ankr.com/eth") - - domain, _ := ens.Normalize("luc.eth") - resolver, _ := ens.NewResolver(client, domain) - avatar, _ := resolver.Text("avatar") - address, _ := resolver.Address() - - fmt.Printf("ENS: %s, Avatar: %s, Address: %s\n", domain, avatar, address.Hex()) - // ENS: luc.eth, Avatar: https://ens.xyz/luc.eth, Address: 0x225f137127d9067788314bc7fcc1f36746a3c3B5 + return ( +
+ +
+ {name} + {address} +
+
+ ) } ``` -
- - - ENS resolution always starts from L1 regardless of the chain the user is connected to. - This is why we specify `chainId: 1` for Ethereum Mainnet in the wagmi hooks above. - - -### Name Lookups +:::info +ENS resolution always starts from L1 regardless of the chain the user is connected to. This is why we specify `chainId: 1` for Ethereum Mainnet in the wagmi hooks above. +::: - +### Text Record Lookups - + + + -```tsx {{ variant: "wagmi", link: "https://wagmi.sh/react/hooks/useEnsAddress", stackblitz: "https://stackblitz.com/edit/ens-wagmi-quickstart-lookup" }} -import { useAccount, useEnsAddress, useEnsAvatar, useEnsName } from 'wagmi'; -import { normalize } from 'viem/ens'; -import { formatAddress } from '@ens-tools/format'; +:::code-group -export const NameLookup = () => { - const name = normalize("luc.eth"); - const { data: avatar } = useEnsAvatar({ name, chainId: 1 }); - const { data: ethereum } = useEnsAddress({ name, coinType: 60, chainId: 1 }); +```tsx [TextRecords.tsx] +// [!include ~/components/TextRecords.tsx] +``` - return ( -
- {ethereum && formatAddress(ethereum)}
- {avatar && } -
- ); -}; +```ts [useEnsTexts.ts] +// [!include ~/hooks/useEnsTexts.ts] ``` -```go {{ variant: "go", name: "Go" }} -package main - -import ( - "fmt" - - "github.com/ethereum/go-ethereum/ethclient" - ens "github.com/wealdtech/go-ens/v3" -) - -var ( - records = []string{ - "com.twitter", - "com.reddit", - "com.github", - "com.discord", - "com.linkedin", - "org.telegram", - "url", - "description", - "avatar", - "email", - "location", - } -) - -type EnsName struct { - name string - records map[string]string - address string -} +::: -func main() { - client, _ := ethclient.Dial("https://rpc.ankr.com/eth") +### Address Record Lookups - domain, _ := ens.Normalize("luc.eth") - resolver, _ := ens.NewResolver(client, domain) - address, _ := resolver.Address() +While ENS resolution always starts from Ethereum L1, you can store addresses for other chains in ENS records. - name := EnsName{ - name: domain, - records: make(map[string]string), - address: address.Hex(), - } + + + - for _, record := range records { - value, _ := resolver.Text(record) - name.records[record] = value - } +:::code-group - fmt.Println(name) -} +```tsx [AddressRecords.tsx] +// [!include ~/components/AddressRecords.tsx] ``` -
- -## Still not sure? - -Try reading the rest of the [docs](/web/) instead. +```ts [useEnsAddresses.ts] +// [!include ~/hooks/useEnsAddresses.ts] +``` - +::: diff --git a/app/public/fallback-avatar.svg b/src/public/img/fallback-avatar.svg similarity index 100% rename from app/public/fallback-avatar.svg rename to src/public/img/fallback-avatar.svg From d522a69655c285e42f36ea12a31392c747a8d604 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:19:23 -0500 Subject: [PATCH 05/79] Sidebar with empty links --- vocs.config.ts | 338 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 328 insertions(+), 10 deletions(-) diff --git a/vocs.config.ts b/vocs.config.ts index 56225f8e3..6c0c34f11 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -17,14 +17,332 @@ export default defineConfig({ }, }, }, - // sidebar: [ - // { - // text: 'Getting Started', - // link: '/getting-started', - // }, - // { - // text: 'Example', - // link: '/example', - // }, - // ], + sidebar: [ + { + text: 'Intro', + collapsed: true, + items: [ + { + text: 'Learn', + items: [ + { + text: 'The Protocol', + link: '', + }, + { + text: 'Deployments', + link: '', + }, + { + text: 'Resolution', + link: '', + }, + { + text: 'DNS Names', + link: '', + }, + { + text: 'Layer 2 & Offchain', + link: '', + }, + ], + }, + { + text: 'Other', + items: [ + { + text: 'Frequently Asked Questions', + link: '', + }, + { + text: 'Terminology', + link: '', + }, + { + text: 'Bug Bounties', + link: '', + }, + { + text: 'Changelog', + link: '', + }, + ], + }, + ], + }, + { + text: 'Using ENS', + collapsed: true, + items: [ + { + text: 'Quickstart', + link: '/web/quickstart', + }, + { + text: 'Getting Started', + link: '', + }, + { + text: 'Tools and Libraries', + link: '', + }, + { + text: 'Web & Querying', + items: [ + { + text: 'Addresses', + link: '', + }, + { + text: 'Text Records', + link: '', + }, + { + text: 'Avatars', + link: '', + }, + { + text: 'Primary Names', + link: '', + }, + { + text: 'Listing Names', + link: '', + }, + ], + }, + { + text: 'Advanced', + items: [ + { + text: 'Decentralized Web', + link: '', + }, + { + text: 'Issuing Subdomains', + link: '', + }, + { + text: 'Naming Smart-contracts', + link: '', + }, + { + text: "Layer 2's & Multichain", + link: '', + }, + { + text: 'Subgraph', + link: '', + }, + ], + }, + { + text: 'Design', + items: [ + { + text: 'Thorin', + link: 'https://thorin.ens.domains', + }, + { + text: 'Brand', + link: 'https://brand.ens.domains', + }, + ], + }, + ], + }, + { + text: 'Smart Contracts', + collapsed: true, + items: [ + { + text: 'Overview', + link: '', + }, + { + text: 'Resolution', + items: [ + { + text: 'Resolution Process', + link: '', + }, + { + text: 'Name Processing', + link: '', + }, + ], + }, + { + text: 'Resolvers', + items: [ + { + text: 'Start Here', + link: '', + }, + { + text: 'Public Resolver', + link: '', + }, + { + text: 'Interacting with a resolver', + link: '', + }, + { + text: 'Writing your own resolver', + link: '', + }, + { + text: 'Cross Chain Resolvers', + link: '', + }, + { + text: 'Universal Resolver', + link: '', + }, + { + text: 'Interface Reference', + link: '', + }, + ], + }, + { + text: 'Registries', + items: [ + { + text: 'The Registry', + link: '', + }, + { + text: 'ETH Registrar', + link: '', + }, + { + text: 'DNS Registrar', + link: '', + }, + { + text: 'TLDs List', + link: '', + }, + { + text: 'Reverse Registrar', + link: '', + }, + ], + }, + { + text: 'Namewrapper', + items: [ + { + text: 'Overview', + link: '', + }, + { + text: 'Wrapped States', + link: '', + }, + { + text: 'Fuses', + link: '', + }, + { + text: 'Expiry', + link: '', + }, + { + text: 'Contract Details', + link: '', + }, + { + text: 'Use-Cases', + link: '', + }, + { + text: 'Creating a Subname Registrar', + link: '', + }, + ], + }, + ], + }, + { + text: 'Governance', + collapsed: true, + items: [ + { + text: 'Welcome', + link: '', + }, + { + text: 'The interesting bits', + items: [ + { + text: 'Constitution', + link: '', + }, + { + text: 'Foundation', + link: '', + }, + { + text: 'Token & Airdrop', + link: '', + }, + ], + }, + { + text: 'Good to know', + items: [ + { + text: 'Submit Proposal', + link: '', + }, + { + text: 'DAO Stewards', + link: '', + }, + { + text: 'Working Group Rules', + link: '', + }, + ], + }, + { + text: 'Links', + items: [ + { + text: 'Discourse', + link: 'https://discuss.ens.domains', + }, + { + text: 'Snapshot', + link: 'https://snapshot.org/#/ens.eth', + }, + { + text: 'Tally', + link: 'https://www.withtally.com/governance/ens', + }, + { + text: 'Agora', + link: 'https://agora.ensdao.org', + }, + ], + }, + ], + }, + { + text: 'Improvement Proposals', + collapsed: true, + items: [ + { + text: 'What is an ENSIP?', + link: '', + }, + { + text: 'Proposals', + link: '', + }, + ], + }, + ], }) From 7cf42fabd5c8a8d82da66456e35765882789d91b Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Fri, 17 Jan 2025 18:43:51 -0500 Subject: [PATCH 06/79] Config --- src/public/img/icon.svg | 7 +++++++ .../public/img/logo-mark.svg | 0 vocs.config.ts | 20 ++++++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/public/img/icon.svg rename app/public/ens/v2/ens-logo.svg => src/public/img/logo-mark.svg (100%) diff --git a/src/public/img/icon.svg b/src/public/img/icon.svg new file mode 100644 index 000000000..e98abd4a8 --- /dev/null +++ b/src/public/img/icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/public/ens/v2/ens-logo.svg b/src/public/img/logo-mark.svg similarity index 100% rename from app/public/ens/v2/ens-logo.svg rename to src/public/img/logo-mark.svg diff --git a/vocs.config.ts b/vocs.config.ts index 6c0c34f11..03f08626e 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -1,8 +1,26 @@ import { defineConfig } from 'vocs' export default defineConfig({ - title: 'ENS', + title: 'ENS Documentation', + titleTemplate: '%s | ENS Docs', rootDir: 'src', + iconUrl: '/img/icon.svg', + logoUrl: '/img/logo-mark.svg', + baseUrl: 'https://docs.ens.domains', + editLink: { + pattern: 'https://github.com/ensdomains/docs/edit/vocs/src/pages/:path', + text: 'Edit on Github', + }, + socials: [ + { + icon: 'github', + link: 'https://github.com/ensdomains/docs', + }, + { + icon: 'telegram', + link: 'https://t.me/+aLmF83si62ZhOGNh', + }, + ], font: { google: 'Inter', }, From 7a12efdaba1576ad8177bcf7e97a76f31b912074 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Sat, 18 Jan 2025 13:11:19 -0500 Subject: [PATCH 07/79] Add /web page, fix components --- app/src/components/mdx/EmbedLink.tsx | 33 ---- src/components/ConnectKits.tsx | 2 +- src/components/EmbedLink.tsx | 34 ++++ src/components/ui/Card.tsx | 17 +- src/pages/web/index.mdx | 222 ++++++++++++--------------- src/pages/web/quickstart.mdx | 1 - vocs.config.ts | 2 +- 7 files changed, 146 insertions(+), 165 deletions(-) delete mode 100644 app/src/components/mdx/EmbedLink.tsx create mode 100644 src/components/EmbedLink.tsx diff --git a/app/src/components/mdx/EmbedLink.tsx b/app/src/components/mdx/EmbedLink.tsx deleted file mode 100644 index ed246ec39..000000000 --- a/app/src/components/mdx/EmbedLink.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import Link from 'next/link'; -import { FC } from 'react'; -import { FiChevronRight } from 'react-icons/fi'; - -export const EmbedLink: FC<{ - title: string; - href: string; - tag?: string; - description: string; - target?: string; -}> = ({ title, href, description, target, tag }) => { - return ( - -
- - {title} - {description} - - - {tag && ( - - {tag} - - )} - -
- - ); -}; diff --git a/src/components/ConnectKits.tsx b/src/components/ConnectKits.tsx index 59025819a..4937ccde1 100644 --- a/src/components/ConnectKits.tsx +++ b/src/components/ConnectKits.tsx @@ -167,7 +167,7 @@ export const ConnectKits = () => { by{' '}
{library.creator} diff --git a/src/components/EmbedLink.tsx b/src/components/EmbedLink.tsx new file mode 100644 index 000000000..1bcf42c25 --- /dev/null +++ b/src/components/EmbedLink.tsx @@ -0,0 +1,34 @@ +import { FC } from 'react' +import { FiChevronRight } from 'react-icons/fi' + +import { Card } from './ui/Card' + +type Props = { + title: string + tag?: string + description: string +} & React.AnchorHTMLAttributes + +export const EmbedLink: FC = ({ title, description, tag, ...props }) => { + return ( + +
+ + {title} + {description} + + + {tag && ( + + {tag} + + )} + +
+
+ ) +} diff --git a/src/components/ui/Card.tsx b/src/components/ui/Card.tsx index 273b5ac7e..046fecdc5 100644 --- a/src/components/ui/Card.tsx +++ b/src/components/ui/Card.tsx @@ -2,15 +2,24 @@ import { PropsWithChildren } from 'react' import { cn } from '../../lib/utils' -type Props = PropsWithChildren> +type Props = PropsWithChildren< + | ({ + as: 'a' + } & React.AnchorHTMLAttributes) + | ({ + as: 'div' + } & React.HTMLAttributes) +> + +export function Card({ as = 'div', children, className, ...props }: Props) { + const Component = as as React.ElementType -export function Card({ children, className, ...props }: Props) { return ( -
{children} -
+ ) } diff --git a/src/pages/web/index.mdx b/src/pages/web/index.mdx index b3c82f37f..967a6316f 100644 --- a/src/pages/web/index.mdx +++ b/src/pages/web/index.mdx @@ -1,75 +1,69 @@ -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Integrate ENS into your dApp, learn how to use ENS.', - emoji: '👋', - showDetailsSection: false, - contributors: [] -}; +import { EmbedLink } from '../../components/EmbedLink' +import { Card } from '../../components/ui/Card' -# Getting Started +# Getting Started [Integrate ENS into your dApp] This section walks you through how to leverage the ENS open standards to improve the user experience of your app. -
-
-
- 0x225...c3B5 - 0x179...9285 - 0xd8d...6045 - 0x849...8bf1 -
- - ➡️ - ➡️ - ➡️ - ➡️ - -
- {[ - 'luc.eth', 'gregskril.eth', 'vitalik.eth', 'jesse.xyz'].map((name) => ( -
-
- - - -
- {name} -
- ))} -
+{/* TODO: Break the following examples into a component to fetch live data */} + + +
+
+ + + + vitalik.eth
-
- -
-
-
-
-
- - - -
- luc.eth -
-
- - ➡️ - -
- DevRel @ ENS. Create Epic Shit - 0x225...c3B5 +
+ ➡️ +
+ mi pinxe lo crino tcati + 0xd8d...6045 +
+ + + +
+
+ 0xb8c...67d5 + 0x866...5eEE + 0xd8d...6045 +
+ + ➡️ + ➡️ + ➡️ + +
+ {['nick.eth', 'jefflau.eth', 'vitalik.eth'].map((name) => ( +
+ + + + {name}
+ ))}
-
+
+ ## Quickstart If you are looking to jumpstart your journey with ENS, or you are looking for a quick reference, visit the [Quickstart](/web/quickstart) page. ## Tools and Libraries @@ -79,90 +73,68 @@ Fortunately, the open-source community is to the rescue, and almost all of the t To learn more check out the [tools & libraries section](/web/libraries). -{/* ## Examples - -If you just want to see some code in action we have a variety of codesnippet & template repository examples available at - -
- {[''].map((a)=>(
{a}
))} -
*/} - ## Avatars, Addresses & Records -
-
-
-
- { - ['gregskril.eth', 'matoken.eth', 'luc.eth'].map(name => ( -
- - - -
- )) - } -
-
-
- 0x179...9285 - 0x5A3...0615 - 0x225...c3B5 -
-
- DevRel @ ENS. Create Epic Shit - Europe/Amsterdam -
-
-
- Information about a name is fetched from its resolver. This can be done using pre-built features included in popular [web3 libraries](/web/libraries) (recommended), or by calling a resolver contract directly. If you're interested in interacting with ENS resolvers, you might find the [Resolver Reference](/resolvers/interfaces) section helpful. ## Subnames -
-
- { - ["vault", "domico", "subname", "nick", "cold"].map((subname, i) => ( -
{subname}
- )) - } -
-
.nick.eth
-
+ +
+ {['root', 'registrar', 'controller', 'resolver', 'registry'].map( + (subname, i) => ( +
+ {subname} +
+ ) + )} +
+
.ens.eth
+
## Registration -
-
- { - ["vault", "domico", "subname", "nick", "cold"].map((subname, i) => ( -
{subname}
- )) + +
+ {['nick', 'vitalik', 'matoken', 'jefflau', 'ens'].map((subname, i) => ( +
-
.eth
-
+ key={subname} + > + {subname} +
+ ))} +
+
.eth
+ + diff --git a/src/pages/web/quickstart.mdx b/src/pages/web/quickstart.mdx index 6bbd02461..6556be6f2 100644 --- a/src/pages/web/quickstart.mdx +++ b/src/pages/web/quickstart.mdx @@ -32,7 +32,6 @@ The snippet leverages the [useAccount](https://wagmi.sh/react/hooks/useAccount), - ```tsx diff --git a/vocs.config.ts b/vocs.config.ts index 03f08626e..14a542176 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -98,7 +98,7 @@ export default defineConfig({ }, { text: 'Getting Started', - link: '', + link: '/web', }, { text: 'Tools and Libraries', From 0df68e1e48dd2c166929d6b72999c225b38bf9c7 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Sat, 18 Jan 2025 13:23:13 -0500 Subject: [PATCH 08/79] Add /web/libraries --- app/src/components/Libraries.tsx | 219 ------------------ src/components/Libraries.tsx | 213 +++++++++++++++++ src/pages/web/libraries.mdx | 18 +- .../public/img/libraries}/ensjs.svg | 0 .../public/img/libraries}/ethers.svg | 0 .../logos => src/public/img/libraries}/go.svg | 0 .../public/img/libraries}/kethereum.png | Bin .../public/img/libraries}/nuget.svg | 0 .../public/img}/libraries/thirdweb.svg | 0 .../public/img/libraries}/web3j.png | Bin .../public/img/libraries}/web3js.svg | 0 vocs.config.ts | 2 +- 12 files changed, 217 insertions(+), 235 deletions(-) delete mode 100644 app/src/components/Libraries.tsx create mode 100644 src/components/Libraries.tsx rename {app/public/icons/legacy/logos => src/public/img/libraries}/ensjs.svg (100%) rename {app/public/icons/legacy/logos => src/public/img/libraries}/ethers.svg (100%) rename {app/public/icons/legacy/logos => src/public/img/libraries}/go.svg (100%) rename {app/public/icons/legacy/logos => src/public/img/libraries}/kethereum.png (100%) rename {app/public/icons/legacy/logos => src/public/img/libraries}/nuget.svg (100%) rename {app/public/icons => src/public/img}/libraries/thirdweb.svg (100%) rename {app/public/icons/legacy/logos => src/public/img/libraries}/web3j.png (100%) rename {app/public/icons/legacy/logos => src/public/img/libraries}/web3js.svg (100%) diff --git a/app/src/components/Libraries.tsx b/app/src/components/Libraries.tsx deleted file mode 100644 index 81f7d6bd0..000000000 --- a/app/src/components/Libraries.tsx +++ /dev/null @@ -1,219 +0,0 @@ -import Link from 'next/link'; -import { ReactNode } from 'react'; -import { FaJava, FaReact, FaRust } from 'react-icons/fa'; -import { SiDelphi, SiKotlin, SiNuget, SiPython } from 'react-icons/si'; -import { TbBrandGolang, TbBrandJavascript } from 'react-icons/tb'; - -type Language = { - name: string; - logo: ReactNode | string; - libraries: Library[]; -}; - -type Library = { - name: string; - description: string; - href: string; - logo?: string; - official?: boolean; -}; - -export const ensLibraries: Language[] = [ - { - name: 'React', - logo: , - libraries: [ - { - href: 'https://wagmi.sh/', - name: 'Wagmi', - description: '', - logo: undefined, - }, - ], - }, - { - name: 'JavaScript', - logo: , - libraries: [ - { - href: 'https://viem.sh/', - name: 'Viem', - description: '', - logo: undefined, - }, - { - href: 'https://docs.ethers.org/', - name: 'Ethers', - description: '', - logo: '/icons/legacy/logos/ethers.svg', - }, - { - href: 'https://github.com/ensdomains/ensjs', - name: 'ENSjs', - description: '', - logo: '/icons/legacy/logos/ensjs.svg', - official: true, - }, - { - href: 'https://web3js.readthedocs.io/', - name: 'Web3.js', - description: '', - logo: '/icons/legacy/logos/web3js.svg', - }, - { - href: 'https://portal.thirdweb.com/typescript/v5', - name: 'Thirdweb', - description: '', - logo: '/icons/libraries/thirdweb.svg', - }, - ], - }, - { - name: 'Rust', - logo: , - libraries: [ - { - href: 'https://ethers.rs/', - name: 'Ethers.rs', - description: '', - logo: undefined, - }, - { - href: 'https://github.com/alloy-rs/', - name: 'Alloy', - description: '', - logo: undefined, - }, - ], - }, - { - name: 'Python', - logo: , - libraries: [ - { - href: 'https://github.com/ethereum/web3.py', - name: 'web3.py', - description: - 'A python interface for interacting with the Ethereum blockchain and ecosystem.', - logo: undefined, - }, - ], - }, - { - name: 'NuGet', - logo: , - libraries: [ - { - href: 'https://github.com/Nethereum/Nethereum/', - name: 'Nethereum', - description: '', - logo: '/icons/legacy/logos/nuget.svg', - }, - ], - }, - { - name: 'Kotlin', - logo: , - libraries: [ - { - href: 'https://github.com/komputing/KEthereum', - name: 'KEthereum', - description: '', - logo: '/icons/legacy/logos/kethereum.png', - }, - ], - }, - { - name: 'Java', - logo: , - libraries: [ - { - href: 'https://docs.web3j.io/', - name: 'web3j', - description: '', - logo: '/icons/legacy/logos/web3j.png', - }, - ], - }, - { - name: 'Go', - logo: , - libraries: [ - { - href: 'https://github.com/wealdtech/go-ens', - name: 'go-ens', - description: '', - logo: '/icons/legacy/logos/go.svg', - }, - { - href: 'https://github.com/wealdtech/ethereal', - name: 'ethereal', - description: '', - logo: undefined, // - - }, - ], - }, - { - name: 'Delphi', - logo: , - libraries: [ - { - href: 'https://github.com/svanas/delphereum', - name: 'delphereum', - description: '', - logo: undefined, // - - }, - ], - }, -]; - -export function Libraries() { - return ( -
-
- {ensLibraries.map((language) => ( -
-
-
- {language.name} -
-
-
- {language.libraries.map((library) => ( - -
- {library.logo ? ( -
- {library.name} -
- ) : ( - language.logo - )} - {library.name} -
- - ))} -
-
- ))} -
-
- ); -} diff --git a/src/components/Libraries.tsx b/src/components/Libraries.tsx new file mode 100644 index 000000000..40d889372 --- /dev/null +++ b/src/components/Libraries.tsx @@ -0,0 +1,213 @@ +import { ReactNode } from 'react' +import { FaJava, FaReact, FaRust } from 'react-icons/fa' +import { SiDelphi, SiKotlin, SiNuget, SiPython } from 'react-icons/si' +import { TbBrandGolang, TbBrandJavascript } from 'react-icons/tb' + +type Language = { + name: string + logo: ReactNode | string + libraries: Library[] +} + +type Library = { + name: string + description: string + href: string + logo?: string + official?: boolean +} + +const ensLibraries: Language[] = [ + { + name: 'React', + logo: , + libraries: [ + { + href: 'https://wagmi.sh/', + name: 'Wagmi', + description: '', + logo: undefined, + }, + ], + }, + { + name: 'JavaScript', + logo: , + libraries: [ + { + href: 'https://viem.sh/', + name: 'Viem', + description: '', + logo: undefined, + }, + { + href: 'https://docs.ethers.org/', + name: 'Ethers', + description: '', + logo: '/img/libraries/ethers.svg', + }, + { + href: 'https://github.com/ensdomains/ensjs', + name: 'ENSjs', + description: '', + logo: '/img/libraries/ensjs.svg', + official: true, + }, + { + href: 'https://web3js.readthedocs.io/', + name: 'Web3.js', + description: '', + logo: '/img/libraries/web3js.svg', + }, + { + href: 'https://portal.thirdweb.com/typescript/v5', + name: 'Thirdweb', + description: '', + logo: '/img/libraries/thirdweb.svg', + }, + ], + }, + { + name: 'Rust', + logo: , + libraries: [ + { + href: 'https://ethers.rs/', + name: 'Ethers.rs', + description: '', + logo: undefined, + }, + { + href: 'https://github.com/alloy-rs/', + name: 'Alloy', + description: '', + logo: undefined, + }, + ], + }, + { + name: 'Python', + logo: , + libraries: [ + { + href: 'https://github.com/ethereum/web3.py', + name: 'web3.py', + description: + 'A python interface for interacting with the Ethereum blockchain and ecosystem.', + logo: undefined, + }, + ], + }, + { + name: 'NuGet', + logo: , + libraries: [ + { + href: 'https://github.com/Nethereum/Nethereum/', + name: 'Nethereum', + description: '', + logo: '/img/libraries/nuget.svg', + }, + ], + }, + { + name: 'Kotlin', + logo: , + libraries: [ + { + href: 'https://github.com/komputing/KEthereum', + name: 'KEthereum', + description: '', + logo: '/img/libraries/kethereum.png', + }, + ], + }, + { + name: 'Java', + logo: , + libraries: [ + { + href: 'https://docs.web3j.io/', + name: 'web3j', + description: '', + logo: '/img/libraries/web3j.png', + }, + ], + }, + { + name: 'Go', + logo: , + libraries: [ + { + href: 'https://github.com/wealdtech/go-ens', + name: 'go-ens', + description: '', + logo: '/img/libraries/go.svg', + }, + { + href: 'https://github.com/wealdtech/ethereal', + name: 'ethereal', + description: '', + logo: undefined, // - + }, + ], + }, + { + name: 'Delphi', + logo: , + libraries: [ + { + href: 'https://github.com/svanas/delphereum', + name: 'delphereum', + description: '', + logo: undefined, // - + }, + ], + }, +] + +export function Libraries() { + return ( +
+ ) +} diff --git a/src/pages/web/libraries.mdx b/src/pages/web/libraries.mdx index 6f08b2f57..48f54c111 100644 --- a/src/pages/web/libraries.mdx +++ b/src/pages/web/libraries.mdx @@ -1,19 +1,7 @@ -import { Libraries, ensLibraries } from '@/components/Libraries'; -import { ConnectKits } from '@/components/ConnectKits'; +import { ConnectKits } from '../../components/ConnectKits' +import { Libraries } from '../../components/Libraries' -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'A list of libraries and tools to help you interface with the ENS protocol.', - emoji: '🛠️', - contributors: [ - 'luc.eth', - 'antony1060.eth' - ] -}; - -# Tools & Libraries - -There are many ways you can interface with the Ethereum smart contracts. {{ className: 'lead' }} +# Tools & Libraries [Tools to help you interface with the ENS protocol] ## Quickstart Kits diff --git a/app/public/icons/legacy/logos/ensjs.svg b/src/public/img/libraries/ensjs.svg similarity index 100% rename from app/public/icons/legacy/logos/ensjs.svg rename to src/public/img/libraries/ensjs.svg diff --git a/app/public/icons/legacy/logos/ethers.svg b/src/public/img/libraries/ethers.svg similarity index 100% rename from app/public/icons/legacy/logos/ethers.svg rename to src/public/img/libraries/ethers.svg diff --git a/app/public/icons/legacy/logos/go.svg b/src/public/img/libraries/go.svg similarity index 100% rename from app/public/icons/legacy/logos/go.svg rename to src/public/img/libraries/go.svg diff --git a/app/public/icons/legacy/logos/kethereum.png b/src/public/img/libraries/kethereum.png similarity index 100% rename from app/public/icons/legacy/logos/kethereum.png rename to src/public/img/libraries/kethereum.png diff --git a/app/public/icons/legacy/logos/nuget.svg b/src/public/img/libraries/nuget.svg similarity index 100% rename from app/public/icons/legacy/logos/nuget.svg rename to src/public/img/libraries/nuget.svg diff --git a/app/public/icons/libraries/thirdweb.svg b/src/public/img/libraries/thirdweb.svg similarity index 100% rename from app/public/icons/libraries/thirdweb.svg rename to src/public/img/libraries/thirdweb.svg diff --git a/app/public/icons/legacy/logos/web3j.png b/src/public/img/libraries/web3j.png similarity index 100% rename from app/public/icons/legacy/logos/web3j.png rename to src/public/img/libraries/web3j.png diff --git a/app/public/icons/legacy/logos/web3js.svg b/src/public/img/libraries/web3js.svg similarity index 100% rename from app/public/icons/legacy/logos/web3js.svg rename to src/public/img/libraries/web3js.svg diff --git a/vocs.config.ts b/vocs.config.ts index 14a542176..007b08b7e 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -102,7 +102,7 @@ export default defineConfig({ }, { text: 'Tools and Libraries', - link: '', + link: '/web/libraries', }, { text: 'Web & Querying', From b825d958737588dd4ba2bebe6b505f4807d5ce7a Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Sat, 18 Jan 2025 14:05:07 -0500 Subject: [PATCH 09/79] Add most of the governance pages --- src/pages/dao/constitution.mdx | 12 +- src/pages/dao/foundation.mdx | 82 ++++----- src/pages/dao/index.mdx | 41 +---- src/pages/dao/proposals/submit.mdx | 21 +-- src/pages/dao/token.mdx | 27 +-- src/pages/dao/wg/rules.mdx | 161 +++++++++--------- .../constitutional-amendment-template.md | 10 +- .../executable-proposal-template.md | 10 +- .../public}/governance/rfp-template.md | 0 .../governance/social-proposal-template.md | 10 +- src/public/img/token-distribution.png | Bin 0 -> 562141 bytes vocs.config.ts | 12 +- 12 files changed, 168 insertions(+), 218 deletions(-) rename {app/public/content/dao => src/public}/governance/constitutional-amendment-template.md (64%) rename {app/public/content/dao => src/public}/governance/executable-proposal-template.md (75%) rename {app/public/content/dao => src/public}/governance/rfp-template.md (100%) rename {app/public/content/dao => src/public}/governance/social-proposal-template.md (61%) create mode 100644 src/public/img/token-distribution.png diff --git a/src/pages/dao/constitution.mdx b/src/pages/dao/constitution.mdx index d7c678e08..6da91feba 100644 --- a/src/pages/dao/constitution.mdx +++ b/src/pages/dao/constitution.mdx @@ -1,13 +1,3 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'The ENS constitution is a set of binding rules that determine what governance actions are legitimate for the DAO to take.', - emoji: '📜', - contributors: [ - 'ensdomains', - 'ensdao' - ] -}; - # ENS DAO Constitution The ENS constitution is a set of binding rules that determine what governance actions are legitimate for the DAO to take. @@ -58,4 +48,4 @@ In order to facilitate making the most widely usable naming system, ENS aims to ## V. Amendments to this constitution by majority vote -Any change may be made to this constitution only by two-thirds majority and at least 1% of all tokens participating. \ No newline at end of file +Any change may be made to this constitution only by two-thirds majority and at least 1% of all tokens participating. diff --git a/src/pages/dao/foundation.mdx b/src/pages/dao/foundation.mdx index c5df37e71..3fc0ffd26 100644 --- a/src/pages/dao/foundation.mdx +++ b/src/pages/dao/foundation.mdx @@ -1,26 +1,14 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: "The ENS DAO is represented in the real world by a Cayman Islands Foundation. This page describes why this is useful, how the foundation is structured, and what powers the DAO has over the Foundation.", - emoji: '🏛️', - contributors: [ - 'validator.eth', - 'nick.eth', - 'luc.eth', - ] -}; - - # The ENS Foundation ## Why have a legal entity? Having a legal entity that represents the DAO in the "real world" is valuable for a number of reasons: -* It provides limited liability to DAO participants for the actions of the DAO. Without a legal entity, participants may be individually held liable for anything the DAO as a whole does. -* It is capable of complying with taxation requirements - without a legal entity, DAO participants may be held liable for a proportion of the DAO's income, even if they are not able to access these funds. -* It is capable of entering into contracts with other "real world" entities, of holding assets (including IP rights), and so forth. +- It provides limited liability to DAO participants for the actions of the DAO. Without a legal entity, participants may be individually held liable for anything the DAO as a whole does. +- It is capable of complying with taxation requirements - without a legal entity, DAO participants may be held liable for a proportion of the DAO's income, even if they are not able to access these funds. +- It is capable of entering into contracts with other "real world" entities, of holding assets (including IP rights), and so forth. -For a more detailed discussion of this topic, see [this excellent blog post](https://mirror.xyz/0x954888B7a5C6736F4955dF18B556D8328FD02f61/5K9llACK4tzu5WHL68CM3bBsmSleL\_XxJ2kRGYnwp7A). +For a more detailed discussion of this topic, see [this excellent blog post](https://mirror.xyz/0x954888B7a5C6736F4955dF18B556D8328FD02f61/5K9llACK4tzu5WHL68CM3bBsmSleL_XxJ2kRGYnwp7A). ## What is The ENS Foundation? @@ -32,9 +20,9 @@ The ENS Foundation has one supervisor. The supervisor is an administrative role The ENS Foundation's Articles of Incorporation give significant powers to the ENS DAO (referred to as "The Council" in the Articles). The DAO may vote to: -* Appoint or remove a director, member, or supervisor. -* Prohibit admitting any members in future. -* Instruct the directors to wind up the foundation, and specify what charity or other foundation should receive the foundation's assets. +- Appoint or remove a director, member, or supervisor. +- Prohibit admitting any members in future. +- Instruct the directors to wind up the foundation, and specify what charity or other foundation should receive the foundation's assets. Though not specified directly in the Articles, the DAO may also instruct the directors to take action on behalf of the Foundation - such as signing a contract, engaging a company for a service the DAO requires, or delegating some of the directors' powers to a DAO working group. @@ -42,10 +30,10 @@ Though not specified directly in the Articles, the DAO may also instruct the dir Running a Foundation is not free, and comes with some real-world costs. An incomplete list of anticipated expenses includes: -* Registered Office & Secretary Services: $10,000 USD p/a -* Supervisory Services: $30,000 USD p/a -* Agent for service of process: $1,200 USD p/a -* Companies Register Fees: $850 USD p/a +- Registered Office & Secretary Services: $10,000 USD p/a +- Supervisory Services: $30,000 USD p/a +- Agent for service of process: $1,200 USD p/a +- Companies Register Fees: $850 USD p/a The Directors may ask the DAO for reimbursement of these fees when they are incurred so that the Foundation can continue to operate. @@ -53,32 +41,22 @@ The Directors may ask the DAO for reimbursement of these fees when they are incu For transparency, important documents relating to the Foundation can be found below. Meeting minutes, resolutions, accounts, and other documentation will be uploaded here as it is made available to the directors. - - - M & A - Incorp - The ENS Foundation - 26 October 2021.pdf - - - - - - Certificate of Incorporation - The ENS Foundation - 26 October 2021.pdf - - - - - - Dir Res - Stage 2 - The ENS Foundation (27.10.21).pdf - - - - - - Resignation and appointment of a director.pdf - - - - - - Brantly resignation.pdf - - +:::note +[M & A - Incorp - The ENS Foundation - 26 October 2021.pdf](https://github.com/ensdomains/governance-docs/blob/main/assets/M%26A%20-%20Incorp%20-%20The%20ENS%20Foundation%20-%2026%20October%202021.pdf) +::: + +:::note +[Certificate of Incorporation - The ENS Foundation - 26 October 2021.pdf](https://github.com/ensdomains/governance-docs/blob/main/assets/Certificate%20of%20Incorporation%20-%20The%20ENS%20Foundation%20-%2026%20October%202021.pdf) +::: + +:::note +[Dir Res - Stage 2 - The ENS Foundation (27.10.21).pdf]() +::: + +:::note +[Resignation and appointment of a director.pdf](https://github.com/ensdomains/governance-docs/blob/main/assets/Resignation%20and%20appointment%20of%20a%20director.pdf) +::: + +:::note +[Brantly resignation.pdf](https://github.com/ensdomains/governance-docs/blob/main/assets/Brantly%20resignation.pdf) +::: diff --git a/src/pages/dao/index.mdx b/src/pages/dao/index.mdx index f6adba184..7487535ef 100644 --- a/src/pages/dao/index.mdx +++ b/src/pages/dao/index.mdx @@ -1,41 +1,18 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'The ENS DAO is a DAO that governs the ENS protocol. Here you will find important links and resources related to understanding and participating in the governance of ENS.', - showDetailsSection: false, - emoji: '👋', - contributors: [ - 'brantly.eth', - 'dragonenergy', - 'nick.eth', - 'luc.eth', - ] -}; - -export const sections = []; - -# Welcome to ENS DAO +# Welcome to ENS DAO [The ENS DAO governs the ENS protocol and treasury] ## Context for ENS -[**ENS homepage**](https://ens.domains): Where you can register and manage ENS names.\ -[**X.com**](https://x.com/ensdomains): The official ENS Twitter account\ -[**Discord**](https://chat.ens.domains): Where the users can get support and the community can hang out.\ -[**Newsletter**](https://ensdomains.substack.com): Where we catch up on what's been happening in the ENS community. - -## $ENS Governance Token Airdrop - -[**Airdrop Claim Site**](https://claim.ens.domains): Check your eligibility and claim your $ENS airdrop.\ -[**Call for Delegates post**](https://ens.mirror.xyz/cfvfKRpQSPtZJjPQOprWqEeqv2rytE7tQkxDg6ht7Oo): Announcement of the DAO and call for Delegates\ -[**$ENS Token Allocation post**](https://ens.mirror.xyz/-eaqMv7XPikvXhvjbjzzPNLS4wzcQ8vdOgi9eNXeUuY): Breakdown of the $ENS token allocation\ -[**$ENS Claiming post**](https://ens.mirror.xyz/-eaqMv7XPikvXhvjbjzzPNLS4wzcQ8vdOgi9eNXeUuY): Overview of the process to claim your $ENS Governance tokens +- [**ENS landing page**](https://ens.domains): Where you can register and manage ENS names. +- [**X.com**](https://x.com/ensdomains): The official ENS Twitter account. +- [**Discord**](https://chat.ens.domains): Where the users can get support and the community can hang out. ## Context for Governance -[**Discourse Forum**](https://discuss.ens.domains): For discussion on governance proposals and working group discussions.\ -[**Snapshot**](https://snapshot.org/#/ens.eth): For off-chain voting on proposals.\ -[**Tally**](https://www.withtally.com/governance/ens): View ENS DAO information on proposals, Delegates, and delegate your voting power.\ -[**Sybil**](https://sybil.org/#/delegates/ens): For on-chain voting and viewing Delegates. +- [**Forum**](https://discuss.ens.domains): For discussion on governance proposals and working group operations. +- [**Snapshot**](https://snapshot.org/#/ens.eth): For off-chain proposals. +- [**Agora**](https://agora.ensdao.org): For onchain proposals and token delegation. +- [**Tally**](https://www.withtally.com/governance/ens): For onchain proposals and token delegation. ## Onboarding & Participation -[**Participation Request Form**](https://airtable.com/shrv2xP39SmuCcd5j): To request access for write-access for restricted categories of the Discourse Forum and Governance channels within the Discord Server, please fill in this form. +[**Participation Request Form**](https://airtable.com/shrv2xP39SmuCcd5j): To request write-access for restricted categories of the Discourse Forum, please fill in this form. diff --git a/src/pages/dao/proposals/submit.mdx b/src/pages/dao/proposals/submit.mdx index 46d52bd27..18086c009 100644 --- a/src/pages/dao/proposals/submit.mdx +++ b/src/pages/dao/proposals/submit.mdx @@ -1,13 +1,4 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'The process of submitting a proposal', - emoji: '🧠', - contributors: [ - 'luc.eth' - ] -}; - -# Process of submitting a Proposal +# Process of Submitting a Proposal ## Passing a Proposal @@ -15,9 +6,9 @@ export const meta = { There are three main types of governance proposals you can make: -1. **[Executable Proposal](/content/dao/governance/executable-proposal-template.md):** This is a proposal for a series of smart contract operations to be executed by accounts the DAO controls. These can include transfers of tokens as well as arbitrary smart contract calls. Examples of this include allocating funding to a workstream multisig wallet, or upgrading an ENS core contract. Executable proposals have a quorum requirement of 1% and require a minimum approval of 50% to pass. -2. **[Social Proposal](/content/dao/governance/social-proposal-template.md)**: This is a proposal that asks for the agreement of the DAO on something that cannot be enforced onchain. Examples of this include a proposal to change the royalty percentage for the ENS secondary market on OpenSea, or a petition to the root keyholders. Social proposals have a quorum requirement of 1% and require a minimum approval of 50% to pass. -3. **[Constitutional Amendment](/content/dao/governance/constitutional-amendment-template.md)**: This is a social proposal that asks the DAO to amend the constitution. Your draft proposal should include a [diff](https://en.wikipedia.org/wiki/Diff) showing the exact changes you propose to make to the constitution. Rules for amending the constitution are set in the constitution itself, and currently require a quorum of 1% and a minimum approval of two thirds to pass. +1. **[Executable Proposal](/governance/executable-proposal-template.md):** This is a proposal for a series of smart contract operations to be executed by accounts the DAO controls. These can include transfers of tokens as well as arbitrary smart contract calls. Examples of this include allocating funding to a workstream multisig wallet, or upgrading an ENS core contract. Executable proposals have a quorum requirement of 1% and require a minimum approval of 50% to pass. +2. **[Social Proposal](/governance/social-proposal-template.md)**: This is a proposal that asks for the agreement of the DAO on something that cannot be enforced onchain. Examples of this include a proposal to change the royalty percentage for the ENS secondary market on OpenSea, or a petition to the root keyholders. Social proposals have a quorum requirement of 1% and require a minimum approval of 50% to pass. +3. **[Constitutional Amendment](/governance/constitutional-amendment-template.md)**: This is a social proposal that asks the DAO to amend the constitution. Your draft proposal should include a [diff](https://en.wikipedia.org/wiki/Diff) showing the exact changes you propose to make to the constitution. Rules for amending the constitution are set in the constitution itself, and currently require a quorum of 1% and a minimum approval of two thirds to pass. ### **Phase 1: Temperature Check — Discourse** @@ -31,13 +22,13 @@ Temperature checks are informal and optional; it's up to you to use the feedback The purpose of the Draft Proposal is to establish formal discussion around a potential proposal. -To create a Draft Proposal, [create a new governance proposal](https://github.com/ensdomains/governance-docs/new/main/governance-proposals) in the governance-docs repository on GitHub. Start by copying the template for an [executable proposal](executable-proposal-template.md), [social proposal](social-proposal-template.md), or [constitutional amendment](constitutional-amendment-template.md), as appropriate. Once you have written your proposal, create a Draft Pull Request for it. Start a new post in the DAO-wide -> Draft Proposals" category with a link to the PR for discussion. +To create a Draft Proposal, [create a new governance proposal](https://github.com/ensdomains/governance-docs/new/main/governance-proposals) in the governance-docs repository on GitHub. Start by copying the template for an [executable proposal](/governance/executable-proposal-template.md), [social proposal](/governance/social-proposal-template.md), or [constitutional amendment](/governance/constitutional-amendment-template.md), as appropriate. Once you have written your proposal, create a Draft Pull Request for it. Start a new post in the DAO-wide -> Draft Proposals" category with a link to the PR for discussion. Reach out to your network to build support for the proposal. Discuss the proposal and solicit delegates to provide feedback on it. Be willing to respond to questions on the Draft Proposal topic and in comments on the pull request. Share your viewpoint, although try to remain as impartial as possible. If your proposal is an executable proposal, you will need to specify the actions your proposal will take while it is in draft stage. You may wish to wait until the proposal is stable before doing this. The executable proposal template explains how to do this. -If your proposal is a constitutional amendment, you will need to produce a diff showing the exact changes you are proposing to make. The easiest way to do this is to go to the [constitution](../ens-dao-constitution.md), click "Edit on GitHub", then click the pencil icon to edit the document in a fork. You can then create a pull request via the GitHub UI and include this in your proposal. You should do this in a separate branch to your draft proposal; while the proposal will be merged as soon as it goes to a vote, the amendment will only be merged if the proposal passes. +If your proposal is a constitutional amendment, you will need to produce a diff showing the exact changes you are proposing to make. The easiest way to do this is to go to the [constitution](/dao/constitution), click "Edit on GitHub", then click the pencil icon to edit the document in a fork. You can then create a pull request via the GitHub UI and include this in your proposal. You should do this in a separate branch to your draft proposal; while the proposal will be merged as soon as it goes to a vote, the amendment will only be merged if the proposal passes. Once you are confident the proposal is in a stable state, you can proceed to phase 3. diff --git a/src/pages/dao/token.mdx b/src/pages/dao/token.mdx index bbdb0c497..a331a65c4 100644 --- a/src/pages/dao/token.mdx +++ b/src/pages/dao/token.mdx @@ -1,18 +1,23 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'THERE ARE NO PLANS FOR ANOTHER AIRDROP', - emoji: '🪂', - contributors: [] -}; +# The ENS Token -# The ENS Token {{ title: "The ENS Token" }} +:::info +ENS Airdropped tokens to anyone who held an ENS name on _October 31st, 2021_. +**THERE ARE NO PLANS FOR ANOTHER AIRDROP**. Please be weary of any notices of +airdrops as these could turn out fraudulent. +::: -ENS Airdropped tokens to anyone who held an ENS name on _October 31st, 2021_. **THERE ARE NO PLANS FOR ANOTHER AIRDROP**. Please be weary of any notices of airdrops as these could turn out fraudulent. +All major decisions of the ENS DAO governance rely on the ENS Governance Token, which was distributted to ENS owners in 2021. The token can be found at [token.ensdao.eth](https://etherscan.io/address/token.ensdao.eth) on Ethereum Mainnet and is the only official governance token for ENS DAO. -All major decisions of the ENS DAO governance rely on the ENS Governance Token, which was distributted to ENS owners in 2021. The token address is at token.ensdao.eth (0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72) on ethereum Mainnet and is the only official governance token for the DAO. +The $ENS token allocation can be seen in the pie chart below. + +![ENS token distribution](/img/token-distribution.png) ## Can I recover tokens accidentally sent to the wrong address? -The answer depends on the address the token was sent to. If you accidentally sent the token to the token contract address listed above (0xC1836021..) or the wallet.ensdao.eth address (0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7) then the tokens might be recoverable. Contact the [Meta-governance working group](/dao/stewards/) at the [ENS Forum](https://discuss.ens.domains) and explain the situation. Tokens can only be sent back to the address they were sent from, so if it was sent from an exchange, contact your exchange support to make sure the address can receive tokens. +The answer depends on the address the token was sent to. + +- If you accidentally sent the token to [token.ensdao.eth](https://etherscan.io/address/token.ensdao.eth) or [wallet.ensdao.eth](https://etherscan.io/address/wallet.ensdao.eth), then it might be recoverable. Contact the [Meta-governance working group](/dao/stewards/) and explain the situation. + +- If the tokens were sent to the null address (0x000...0000) or an address with a typo, then the tokens are unrecoverable and there's nothing that anyone can do. -If the tokens were sent to the null address (0x000..) or an address with a typo, then the tokens are unrecoverable and there's nothing that anyone can do. If the tokens were sent to an exchange or a third party, then contact that third party for help. +- If the tokens were sent to an exchange or a third party, then contact that third party for help. diff --git a/src/pages/dao/wg/rules.mdx b/src/pages/dao/wg/rules.mdx index 380a19400..3e8eae8b2 100644 --- a/src/pages/dao/wg/rules.mdx +++ b/src/pages/dao/wg/rules.mdx @@ -1,102 +1,111 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Current state of the Working Group Rules as created by EP0.4', - emoji: '', - contributors: [] -}; +# ENS DAO Working Group Rules -# Working Group Rules +_This document represents the current state of the Working Group Rules as created by [EP0.4](https://snapshot.box/#/s:ens.eth/proposal/0x899ead1d9b9b98f63f6a60dc0939bef55dbe365e78c6a550f07be969a47f148b), and amended by [EP1.8](https://snapshot.box/#/s:ens.eth/proposal/0xc7186cf8bebe47600f8d847e76f7971ea97b48bc04eda1e07780aff91fb6410d) and [EP4.8](https://snapshot.box/#/s:ens.eth/proposal/0x26a5c8dec547837495707e70446d1e7cd874a91f75753c602998f6e70083a266). These should represent the canonical version of the rules and any social proposal to amend it should include a PR to this document._ -*This document represents the current state of the Working Group Rules as created by [EP0.4](governance-proposals/term-0/ep4-social-proposal-creation-of-foundational-working-groups-and-working-group-rules), and amended by [EP1.8](governance-proposals/term-1/ep12-working-group-rules) and [EP4.8](governance-proposals/term-4/ep4.8-Social-Extend-Stewards-terms.md). These should represent the canonical version of the rules and any social proposal to amend it should include a PR to this document.* +:::note +The numbering system of EP's was changed after Working Group rules were established, which is why the above proposals have different numbers than Snapshot displays. +::: ## 1. Formation of Working Groups - 1. To create a new working group, a social proposal, as defined by the ENS governance documentation ('Social Proposal'), must be put forward and passed by the DAO. - 2. A Social Proposal to create a new working group must demonstrate that the new working group is needed and the work cannot be undertaken within an existing working group. + +1. To create a new working group, a social proposal, as defined by the ENS governance documentation ('Social Proposal'), must be put forward and passed by the DAO. +2. A Social Proposal to create a new working group must demonstrate that the new working group is needed and the work cannot be undertaken within an existing working group. ## 2. Dissolution of Working Groups - 1. A working group can be dissolved by passing a Social Proposal requesting the dissolution of a working group or working groups. - 2. If an active proposal is put forward to dissolve a working group, all working group funds, including outgoing payments, within that working group, are to be frozen with immediate effect, pending the outcome of that vote. - 3. Upon the dissolution of a working group, any and all unspent working group funds from that working group, at the time of dissolution, must be immediately returned to the DAO treasury, without delay. + +1. A working group can be dissolved by passing a Social Proposal requesting the dissolution of a working group or working groups. +2. If an active proposal is put forward to dissolve a working group, all working group funds, including outgoing payments, within that working group, are to be frozen with immediate effect, pending the outcome of that vote. +3. Upon the dissolution of a working group, any and all unspent working group funds from that working group, at the time of dissolution, must be immediately returned to the DAO treasury, without delay. ## 3. Working Group Stewards - 1. Each working group shall be managed by three stewards (hereafter a 'Steward' or 'Stewards'). - 2. Stewards will be elected to serve within working groups for a set period of one calendar year (hereafter known as a 'Term'). - 3. The Term for Stewards commences at 9am UTC on January 1 each year and ends immediately prior to the commencement of the Term of the following year. - 4. Stewards are responsible for overseeing the operation of working groups in accordance with these rules and the ENS DAO constitution. - 5. The responsibilities of Stewards include, but are not limited to: - 1. Requesting working group funds from the DAO in accordance with these rules; - 2. Approving the creation of sub-groups or workstreams within a working group to undertake work and/or carry out specific projects or tasks; - 3. Dissolving sub-groups or workstreams within a working group; - 4. Using discretion to make working group funds available to sub-groups, workstreams, or contributors within a working group; - 5. Using discretion to disburse working group funds to people and/or projects in accordance with the ENS DAO constitution; and - 6. Acting as keyholders of working group multi-sigs. + +1. Each working group shall be managed by three stewards (hereafter a 'Steward' or 'Stewards'). +2. Stewards will be elected to serve within working groups for a set period of one calendar year (hereafter known as a 'Term'). +3. The Term for Stewards commences at 9am UTC on January 1 each year and ends immediately prior to the commencement of the Term of the following year. +4. Stewards are responsible for overseeing the operation of working groups in accordance with these rules and the ENS DAO constitution. +5. The responsibilities of Stewards include, but are not limited to: + 1. Requesting working group funds from the DAO in accordance with these rules; + 2. Approving the creation of sub-groups or workstreams within a working group to undertake work and/or carry out specific projects or tasks; + 3. Dissolving sub-groups or workstreams within a working group; + 4. Using discretion to make working group funds available to sub-groups, workstreams, or contributors within a working group; + 5. Using discretion to disburse working group funds to people and/or projects in accordance with the ENS DAO constitution; and + 6. Acting as keyholders of working group multi-sigs. ## 4. Steward Eligibility and Nominations - 1. Any individual is eligible to nominate themselves to be a Steward of a working group within the DAO ('Eligible Person'). - 2. To be eligible for the election for the annual Term, Eligible Persons must nominate themselves between 9am UTC on December 6 and 9am UTC on December 9 ('Nomination Window'). - 3. An Eligible Person may nominate themselves to become a Steward of a working group during the Nomination Window, by meeting the requirements set out in a call for nominations posted in the relevant working group category of the ENS governance forum. - 4. An Eligible Person who completes the steps outlined in rule 4.3 above during the Nomination Window and receives 10,000 signed votes to support their nomination will be included in the ballot as a nominee in the election for Stewards that takes place following that Nomination Window ('Nominee'). + +1. Any individual is eligible to nominate themselves to be a Steward of a working group within the DAO ('Eligible Person'). +2. To be eligible for the election for the annual Term, Eligible Persons must nominate themselves between 9am UTC on December 6 and 9am UTC on December 9 ('Nomination Window'). +3. An Eligible Person may nominate themselves to become a Steward of a working group during the Nomination Window, by meeting the requirements set out in a call for nominations posted in the relevant working group category of the ENS governance forum. +4. An Eligible Person who completes the steps outlined in rule 4.3 above during the Nomination Window and receives 10,000 signed votes to support their nomination will be included in the ballot as a nominee in the election for Stewards that takes place following that Nomination Window ('Nominee'). ## 5. Steward Elections - 1. Elections for working group Stewards for the upcoming year will take place by a vote of governance token holders using signed messages and will be open for 120 hours, commencing at 9am UTC on December 10 each year ('Election Window'). - 2. The top-ranked Nominees from the working group vote held during the Election Window will fill any available positions for the role of Steward for those working groups for the upcoming Term, based on the order in which they are ranked in the vote. - 3. A Nominee elected to serve as a Steward may not take up the role of Steward for more than two working groups during their Term. + +1. Elections for working group Stewards for the upcoming year will take place by a vote of governance token holders using signed messages and will be open for 120 hours, commencing at 9am UTC on December 10 each year ('Election Window'). +2. The top-ranked Nominees from the working group vote held during the Election Window will fill any available positions for the role of Steward for those working groups for the upcoming Term, based on the order in which they are ranked in the vote. +3. A Nominee elected to serve as a Steward may not take up the role of Steward for more than two working groups during their Term. ## 6. Delay of Nominations or Elections - 1. In the event that nominations or elections for Stewards take place after a Nomination Window or after an Election Window, the nomination process and/or elections shall take place, as otherwise prescribed in rules 4 and 5 above, as soon as is practicable after the missed Nomination Window or missed Election Window. - 2. In the event that an election takes place outside of an Election Window and after the commencement date of a new Term, outgoing Stewards from the previous Term shall stay in their positions as working group Stewards until immediately prior to 9am UTC the day following the end of the election, which, for the avoidance of doubt, is 120 hours after voting in those elections commenced. - 3. In the event that an election takes place outside of an Election Window and after the commencement date of a new Term, newly elected Stewards will assume the responsibilities of stewardship within working groups at 9am UTC the day following the end of the election, as defined in rule 6.2 above, for the remainder of that Term. + +1. In the event that nominations or elections for Stewards take place after a Nomination Window or after an Election Window, the nomination process and/or elections shall take place, as otherwise prescribed in rules 4 and 5 above, as soon as is practicable after the missed Nomination Window or missed Election Window. +2. In the event that an election takes place outside of an Election Window and after the commencement date of a new Term, outgoing Stewards from the previous Term shall stay in their positions as working group Stewards until immediately prior to 9am UTC the day following the end of the election, which, for the avoidance of doubt, is 120 hours after voting in those elections commenced. +3. In the event that an election takes place outside of an Election Window and after the commencement date of a new Term, newly elected Stewards will assume the responsibilities of stewardship within working groups at 9am UTC the day following the end of the election, as defined in rule 6.2 above, for the remainder of that Term. ## 7. Removal and Replacement of Stewards - 1. Stewards may be removed at any time by: - 1. a Social Proposal passed by the DAO; or - 2. a simple indicative majority vote among Stewards of all working groups, with the outcome of that vote communicated in the relevant working group category of the ENS governance forum. - 2. Stewards may step down from their position at any time by communicating their intention to step down in the ENS governance forum. - 3. In the event that a Steward is removed, steps down, or is unable to continue as a Steward, for whatever reason, prior to the end of a Term, a new election must be held to fill any vacant Steward positions, in accordance with rule 6 above. + +1. Stewards may be removed at any time by: + 1. a Social Proposal passed by the DAO; or + 2. a simple indicative majority vote among Stewards of all working groups, with the outcome of that vote communicated in the relevant working group category of the ENS governance forum. +2. Stewards may step down from their position at any time by communicating their intention to step down in the ENS governance forum. +3. In the event that a Steward is removed, steps down, or is unable to continue as a Steward, for whatever reason, prior to the end of a Term, a new election must be held to fill any vacant Steward positions, in accordance with rule 6 above. ## 8. Lead Stewards - 1. Each working group must appoint a lead Steward within the first five days of a Term (hereafter a 'Lead Steward' or 'Lead Stewards'). - 2. Only current elected Stewards of a working group are eligible to serve as Lead Stewards within a given working group. - 3. Lead Stewards may be appointed or removed from that role at any time by a simple indicative majority vote among the Stewards of a working group, with the outcome of that vote communicated in the relevant working group category of the ENS governance forum. - 4. In the event that a Lead Steward steps down from the position or is removed as a Lead Steward before the end of a Term in accordance with rule 8.3 above, a new Lead Steward must be appointed within five calendar days. - 5. A Steward who is appointed to serve as a Lead Steward of a working group will remain in that position, as Lead Steward, from the date of appointment until the end of their elected Term as a Steward or until they are removed as a Lead Steward in accordance with rule 8.3 above or until they are removed as a Steward in accordance with rule 7 above. - 6. Lead Stewards are responsible for the operational management and administration of working groups and are expected to provide regular updates to the DAO in the ENS governance forum related to working group progress, achievements, and challenges. - 7. The responsibilities of Lead Stewards include, but are not limited to: - 1. Acting as a representative of a working group; - 2. Managing resource requests from sub-groups, workstreams, and contributors within a working group; - 3. Initiating the disbursement of working group funds on an as-needed basis; - 4. Providing reports of working group spending in the ENS governance forum; and - 5. Maintaining open communications with DAO participants in the ENS governance forum. + +1. Each working group must appoint a lead Steward within the first five days of a Term (hereafter a 'Lead Steward' or 'Lead Stewards'). +2. Only current elected Stewards of a working group are eligible to serve as Lead Stewards within a given working group. +3. Lead Stewards may be appointed or removed from that role at any time by a simple indicative majority vote among the Stewards of a working group, with the outcome of that vote communicated in the relevant working group category of the ENS governance forum. +4. In the event that a Lead Steward steps down from the position or is removed as a Lead Steward before the end of a Term in accordance with rule 8.3 above, a new Lead Steward must be appointed within five calendar days. +5. A Steward who is appointed to serve as a Lead Steward of a working group will remain in that position, as Lead Steward, from the date of appointment until the end of their elected Term as a Steward or until they are removed as a Lead Steward in accordance with rule 8.3 above or until they are removed as a Steward in accordance with rule 7 above. +6. Lead Stewards are responsible for the operational management and administration of working groups and are expected to provide regular updates to the DAO in the ENS governance forum related to working group progress, achievements, and challenges. +7. The responsibilities of Lead Stewards include, but are not limited to: + 1. Acting as a representative of a working group; + 2. Managing resource requests from sub-groups, workstreams, and contributors within a working group; + 3. Initiating the disbursement of working group funds on an as-needed basis; + 4. Providing reports of working group spending in the ENS governance forum; and + 5. Maintaining open communications with DAO participants in the ENS governance forum. ## 9. DAO Secretary - 1. At the start of each Term, the current Stewards of each working group shall collaborate to appoint an individual who will serve as the secretary of the DAO (hereafter 'Secretary' or 'Secretaries'). - 2. The Secretary may be appointed or removed from that role at any time by a majority vote of all elected Stewards in a given Term with the outcome of that vote communicated in the ENS governance forum. - 3. The Secretary will remain in that position, as Secretary of the DAO, from the date of appointment until the end of a given Term or until the date at which they are removed from that position in accordance with rule 9.2 above. - 4. Secretaries are eligible to receive fair compensation for their work as Secretary of the DAO. - 5. Compensation for the Secretary of the DAO is to be paid by the Meta-Governance Working Group using funds requested in accordance with rule 10 below. - 6. Any individual is eligible to be appointed as the Secretary of the DAO, including past and present working group Stewards. - 7. The Secretary is responsible for managing working relationships and communications across working groups as well as performing administrative duties for the DAO. - 8. The responsibilities of the Secretary include, but are not limited to: - 1. Managing a DAO-wide calendar; - 2. Coordinating and attending working group meetings where possible and ensuring meeting summaries are posted in the ENS governance forum; - 3. Assisting Stewards with coordination challenges within working groups; and - 4. Acting as a multi-sig keyholder for each working group. + +1. At the start of each Term, the current Stewards of each working group shall collaborate to appoint an individual who will serve as the secretary of the DAO (hereafter 'Secretary' or 'Secretaries'). +2. The Secretary may be appointed or removed from that role at any time by a majority vote of all elected Stewards in a given Term with the outcome of that vote communicated in the ENS governance forum. +3. The Secretary will remain in that position, as Secretary of the DAO, from the date of appointment until the end of a given Term or until the date at which they are removed from that position in accordance with rule 9.2 above. +4. Secretaries are eligible to receive fair compensation for their work as Secretary of the DAO. +5. Compensation for the Secretary of the DAO is to be paid by the Meta-Governance Working Group using funds requested in accordance with rule 10 below. +6. Any individual is eligible to be appointed as the Secretary of the DAO, including past and present working group Stewards. +7. The Secretary is responsible for managing working relationships and communications across working groups as well as performing administrative duties for the DAO. +8. The responsibilities of the Secretary include, but are not limited to: + 1. Managing a DAO-wide calendar; + 2. Coordinating and attending working group meetings where possible and ensuring meeting summaries are posted in the ENS governance forum; + 3. Assisting Stewards with coordination challenges within working groups; and + 4. Acting as a multi-sig keyholder for each working group. ## 10. Working Group Funds - 1. To request working group funds, Stewards of all working groups will collaborate to submit an active executable proposal, as defined by the ENS governance documentation ('Collective Proposal'), to the DAO during the months of January, April, July, and October each calendar year (each a 'Funding Window'). - 1. In order for a working group to have a funding request included in a Collective Proposal submitted to the DAO during a Funding Window, the funding request must have passed as a Social Proposal in the same Funding Window. - 2. In the case of an emergency, where working group funds are needed by a working group outside of a Funding Window, an executable proposal, as defined by the ENS governance documentation, may be submitted at any time by a Steward of a working group to request funds from the DAO. - 2. Working group funds requested and approved in accordance with rule 10.1 above are to be paid out into separate working group multi-sigs controlled by the DAO. - 3. Each working group multi-sig must have four keyholders, made up of three current elected Stewards for that working group and the Secretary of the DAO for that Term, with no other keyholders permitted. - 4. Working group funds may be disbursed from working group multi-sigs with three-of-four keyholder signing. - 5. Stewards of a given working group shall have the discretion to reallocate funds approved in a Collective Proposal where appropriate and where it is not in conflict with any rules of the DAO, DAO bylaws, or the ENS DAO constitution. + +1. To request working group funds, Stewards of all working groups will collaborate to submit an active executable proposal, as defined by the ENS governance documentation ('Collective Proposal'), to the DAO during the months of January, April, July, and October each calendar year (each a 'Funding Window'). + 1. In order for a working group to have a funding request included in a Collective Proposal submitted to the DAO during a Funding Window, the funding request must have passed as a Social Proposal in the same Funding Window. + 2. In the case of an emergency, where working group funds are needed by a working group outside of a Funding Window, an executable proposal, as defined by the ENS governance documentation, may be submitted at any time by a Steward of a working group to request funds from the DAO. +2. Working group funds requested and approved in accordance with rule 10.1 above are to be paid out into separate working group multi-sigs controlled by the DAO. +3. Each working group multi-sig must have four keyholders, made up of three current elected Stewards for that working group and the Secretary of the DAO for that Term, with no other keyholders permitted. +4. Working group funds may be disbursed from working group multi-sigs with three-of-four keyholder signing. +5. Stewards of a given working group shall have the discretion to reallocate funds approved in a Collective Proposal where appropriate and where it is not in conflict with any rules of the DAO, DAO bylaws, or the ENS DAO constitution. ## 11. Compensation for Stewards and Lead Stewards - 1. Stewards are eligible to receive fair compensation for their work as a Steward or Lead Steward in the DAO. - 2. All requests for Steward or Lead Steward compensation must be detailed in a Collective Proposal for working group funds submitted to the DAO in accordance with rule 10.1 above. - 3. Stewards may not receive compensation for their role as a Steward or Lead Steward outside of that compensation expressly provided for in a Collective Proposal submitted to the DAO in accordance with rule 10.1 above. - 4. The Meta-Governance working group are responsible for defining standards for fair compensation ('Compensation Guidelines'). - 5. The Compensation Guidelines shall be defined prior to the Nomination Window for each term and can only take effect for the following term. + +1. Stewards are eligible to receive fair compensation for their work as a Steward or Lead Steward in the DAO. +2. All requests for Steward or Lead Steward compensation must be detailed in a Collective Proposal for working group funds submitted to the DAO in accordance with rule 10.1 above. +3. Stewards may not receive compensation for their role as a Steward or Lead Steward outside of that compensation expressly provided for in a Collective Proposal submitted to the DAO in accordance with rule 10.1 above. +4. The Meta-Governance working group are responsible for defining standards for fair compensation ('Compensation Guidelines'). +5. The Compensation Guidelines shall be defined prior to the Nomination Window for each term and can only take effect for the following term. ## 12. Amendments - 1. These rules may be amended at any time by passing a Social Proposal. + +1. These rules may be amended at any time by passing a Social Proposal. diff --git a/app/public/content/dao/governance/constitutional-amendment-template.md b/src/public/governance/constitutional-amendment-template.md similarity index 64% rename from app/public/content/dao/governance/constitutional-amendment-template.md rename to src/public/governance/constitutional-amendment-template.md index a88cde12c..66aa6f8cc 100644 --- a/app/public/content/dao/governance/constitutional-amendment-template.md +++ b/src/public/governance/constitutional-amendment-template.md @@ -4,17 +4,17 @@ description: A short (1-2 sentence) description of the proposal. # [Amendment] Proposal Title -| **Status** | Pending | -| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -| **Discussion Thread** | [Discuss](https://discuss.ens.domains/t/...) | -| **Votes** | Pending | +| **Status** | Pending | +| --------------------- | -------------------------------------------- | +| **Discussion Thread** | [Discuss](https://discuss.ens.domains/t/...) | +| **Votes** | Pending | ## Abstract ## Specification diff --git a/app/public/content/dao/governance/executable-proposal-template.md b/src/public/governance/executable-proposal-template.md similarity index 75% rename from app/public/content/dao/governance/executable-proposal-template.md rename to src/public/governance/executable-proposal-template.md index 7ff4ac405..89ceb7080 100644 --- a/app/public/content/dao/governance/executable-proposal-template.md +++ b/src/public/governance/executable-proposal-template.md @@ -4,17 +4,17 @@ description: A short (1-2 sentence) description of the proposal. # [Executable] Proposal Title -| **Status** | Pending | -| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -| **Discussion Thread** | [Discuss](https://discuss.ens.domains/t/...) | -| **Votes** | Pending | +| **Status** | Pending | +| --------------------- | -------------------------------------------- | +| **Discussion Thread** | [Discuss](https://discuss.ens.domains/t/...) | +| **Votes** | Pending | ## Abstract ## Specification diff --git a/app/public/content/dao/governance/rfp-template.md b/src/public/governance/rfp-template.md similarity index 100% rename from app/public/content/dao/governance/rfp-template.md rename to src/public/governance/rfp-template.md diff --git a/app/public/content/dao/governance/social-proposal-template.md b/src/public/governance/social-proposal-template.md similarity index 61% rename from app/public/content/dao/governance/social-proposal-template.md rename to src/public/governance/social-proposal-template.md index b45140295..10a75d73e 100644 --- a/app/public/content/dao/governance/social-proposal-template.md +++ b/src/public/governance/social-proposal-template.md @@ -4,17 +4,17 @@ description: A short (1-2 sentence) description of the proposal. # [Social] Proposal Title -| **Status** | Pending | -| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -| **Discussion Thread** | [Discuss](https://discuss.ens.domains/t/...) | -| **Votes** | Pending | +| **Status** | Pending | +| --------------------- | -------------------------------------------- | +| **Discussion Thread** | [Discuss](https://discuss.ens.domains/t/...) | +| **Votes** | Pending | ## Abstract ## Specification diff --git a/src/public/img/token-distribution.png b/src/public/img/token-distribution.png new file mode 100644 index 0000000000000000000000000000000000000000..273f7fce31633a95909815a3fcc5136badd1f4d6 GIT binary patch literal 562141 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 Fi_VNZ5jitZZm;iO<}A;6dxCXB!{p<%XBmeD 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 Zq2|$qMM_OiSLZ|4Af)d-+bRdfC5Bm@jJb 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֯Wf_sh(kk(+2faul$Pl`~zDZ_bu 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 literal 0 HcmV?d00001 diff --git a/vocs.config.ts b/vocs.config.ts index 007b08b7e..8b673bfb8 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -289,22 +289,22 @@ export default defineConfig({ items: [ { text: 'Welcome', - link: '', + link: '/dao', }, { text: 'The interesting bits', items: [ { text: 'Constitution', - link: '', + link: '/dao/constitution', }, { text: 'Foundation', - link: '', + link: '/dao/foundation', }, { text: 'Token & Airdrop', - link: '', + link: '/dao/token', }, ], }, @@ -313,7 +313,7 @@ export default defineConfig({ items: [ { text: 'Submit Proposal', - link: '', + link: '/dao/proposals/submit', }, { text: 'DAO Stewards', @@ -321,7 +321,7 @@ export default defineConfig({ }, { text: 'Working Group Rules', - link: '', + link: '/dao/wg/rules', }, ], }, From 5acff650188dbf8838652d5d0d163603638d4ad6 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Sat, 18 Jan 2025 14:19:43 -0500 Subject: [PATCH 10/79] Add /dao/stewards page --- app/src/components/mdx/Avatar.tsx | 26 ------------------ src/components/Avatar.tsx | 25 ++++++++++++++++++ src/pages/dao/stewards.mdx | 44 ++++++++++++++++++++----------- vocs.config.ts | 2 +- 4 files changed, 54 insertions(+), 43 deletions(-) delete mode 100644 app/src/components/mdx/Avatar.tsx create mode 100644 src/components/Avatar.tsx diff --git a/app/src/components/mdx/Avatar.tsx b/app/src/components/mdx/Avatar.tsx deleted file mode 100644 index 5ff9c64d8..000000000 --- a/app/src/components/mdx/Avatar.tsx +++ /dev/null @@ -1,26 +0,0 @@ -'use client'; - -import clsx from 'clsx'; -import { useEnsAvatar } from 'wagmi'; - -type Properties = { - name: string; - width: number; - rounded?: boolean; -}; - -export function Avatar({ name, width, rounded }: Properties) { - const { data: ensAvatar } = useEnsAvatar({ name, chainId: 1 }); - - return ( - {name} - ); -} diff --git a/src/components/Avatar.tsx b/src/components/Avatar.tsx new file mode 100644 index 000000000..23b9aabf9 --- /dev/null +++ b/src/components/Avatar.tsx @@ -0,0 +1,25 @@ +import { useEnsAvatar } from 'wagmi' + +import { cn } from '../lib/utils' + +type Properties = { + name: string + width: number + rounded?: boolean +} + +export function Avatar({ name, width, rounded }: Properties) { + const { data: ensAvatar } = useEnsAvatar({ name, chainId: 1 }) + + return ( + + + + ) +} diff --git a/src/pages/dao/stewards.mdx b/src/pages/dao/stewards.mdx index cec3ef743..fb12756c2 100644 --- a/src/pages/dao/stewards.mdx +++ b/src/pages/dao/stewards.mdx @@ -1,23 +1,37 @@ -import { Avatar } from '@/components/mdx/Avatar' - -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Overview of the current governance stewards', - emoji: '', - contributors: [ - 'avsa.eth' - ] -}; +import { Avatar } from '../../components/Avatar' # ENS DAO Stewards -The DAO is governed through a democratic process in which all major matters are decided through a vote open to all holders of governance tokens. Those who wish can also delegate their voting power to anyone they trust to delegates whose responsibility is to keep tabs on all the current matters being voted on and discussed. Even those who have delegated their votes can still vote directly on matters, thus overriding their delegate's decision on that specific topic. Delegates can be chosen or switched at any time, often without cost, by visiting the [ENS Delegate Website](https://claim.ens.domains/delegate-ranking) or through other apps. +The DAO is governed through a democratic process in which all major matters are decided through a vote open to all holders of governance tokens. Those who wish can also delegate their voting power, entrusting somebody else to keep tabs on the latest DAO matters. + +Delegates can be chosen or switched at any time, often without cost, via [Tally](https://www.tally.xyz/gov/ens), [Agora](https://agora.ensdao.org/) or other apps. + +For more day-to-day matters, there are Stewards who are elected for a one-year term. The election happens every year on December 10 and lasts for 5 days. Stewards make decisions on governance, hold public meetings, and decide on grants, sponsorships, and other matters. Stewards are divided into different working groups, each reflecting their specific focus. + +Read the [full active rules governing the Working Groups](/dao/wg/rules) -For more day-to-day matters, there are also Stewards who are elected for a one-year term. The election happens every year on December 10 and lasts for 5 days. Stewards make decisions on governance, hold public meetings, and decide on grants, sponsorships, and other matters. Stewards are divided into different working groups, each reflecting their specific focus. +## Stewards for 2025 Term -Read the [full active rules governing the Working Groups](https://docs.ens.domains/dao/wg/rules) +#### Meta-Governance Working Group + +| | | | +| ---------------------------------------- | --------------------------------------- | ------------------------------------------ | +| Spence / 5pence.eth | Alex / netto.eth | Cam / daostrat.eth | + +#### ENS Ecosystem Working Group -## Current Stewards +| | | | +| --------------------------------------- | --------------------------------------- | ---------------------------------------- | +| slobo.eth | limes.eth | Donnie / daemon.eth | + +#### Public Goods Working Group + +| | | | +| ----------------------------------------- | ---------------------------------------- | ------------------------------------------------- | +| coltron.eth | simona.eth | sovereignsignal.eth | +| | + +## Past Stewards ### 2024 @@ -39,8 +53,6 @@ Read the [full active rules governing the Working Groups](https://docs.ens.domai | ----------------------------------------- | ---------------------------------------- | ---------------------------------------- | | coltron.eth | Simona / simona.eth | vegayp.eth | -## Past Stewards - ### 2023 Q3/Q4 #### Meta-Governance Working Group diff --git a/vocs.config.ts b/vocs.config.ts index 8b673bfb8..3783e1274 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -317,7 +317,7 @@ export default defineConfig({ }, { text: 'DAO Stewards', - link: '', + link: '/dao/stewards', }, { text: 'Working Group Rules', From 76e37b62e00d2f230129d5ab4cd3e983c1577d28 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Sat, 18 Jan 2025 14:22:31 -0500 Subject: [PATCH 11/79] Prettier --- src/pages/dao/stewards.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/dao/stewards.mdx b/src/pages/dao/stewards.mdx index fb12756c2..8d325b2c1 100644 --- a/src/pages/dao/stewards.mdx +++ b/src/pages/dao/stewards.mdx @@ -29,7 +29,7 @@ Read the [full active rules governing the Working Groups](/dao/wg/rules) | | | | | ----------------------------------------- | ---------------------------------------- | ------------------------------------------------- | | coltron.eth | simona.eth | sovereignsignal.eth | -| | +| | ## Past Stewards From 4f86356fb729e6c820f91a0587983dbc051438e1 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Sat, 18 Jan 2025 19:07:47 -0500 Subject: [PATCH 12/79] Generate ENSIP pages --- .gitignore | 6 +- package.json | 2 + pnpm-lock.yaml | 13 + src/pages/ensip/1.mdx | 410 ---------------------------- src/pages/ensip/10.mdx | 139 ---------- src/pages/ensip/11.mdx | 113 -------- src/pages/ensip/12.mdx | 119 --------- src/pages/ensip/13.mdx | 352 ------------------------ src/pages/ensip/14.mdx | 64 ----- src/pages/ensip/15.mdx | 499 ----------------------------------- src/pages/ensip/16.mdx | 190 ------------- src/pages/ensip/17.mdx | 120 --------- src/pages/ensip/18.mdx | 182 ------------- src/pages/ensip/19.mdx | 110 -------- src/pages/ensip/2.mdx | 256 ------------------ src/pages/ensip/3.mdx | 227 ---------------- src/pages/ensip/4.mdx | 79 ------ src/pages/ensip/5.mdx | 110 -------- src/pages/ensip/6.mdx | 96 ------- src/pages/ensip/7.mdx | 129 --------- src/pages/ensip/8.mdx | 69 ----- src/pages/ensip/9.mdx | 219 --------------- src/pages/ensip/index.mdx | 39 +-- src/pages/ensip/sidebar.json | 1 + src/plugins/ensips.ts | 86 ++++++ vocs.config.ts | 10 +- 26 files changed, 120 insertions(+), 3520 deletions(-) delete mode 100644 src/pages/ensip/1.mdx delete mode 100644 src/pages/ensip/10.mdx delete mode 100644 src/pages/ensip/11.mdx delete mode 100644 src/pages/ensip/12.mdx delete mode 100644 src/pages/ensip/13.mdx delete mode 100644 src/pages/ensip/14.mdx delete mode 100644 src/pages/ensip/15.mdx delete mode 100644 src/pages/ensip/16.mdx delete mode 100644 src/pages/ensip/17.mdx delete mode 100644 src/pages/ensip/18.mdx delete mode 100644 src/pages/ensip/19.mdx delete mode 100644 src/pages/ensip/2.mdx delete mode 100644 src/pages/ensip/3.mdx delete mode 100644 src/pages/ensip/4.mdx delete mode 100644 src/pages/ensip/5.mdx delete mode 100644 src/pages/ensip/6.mdx delete mode 100644 src/pages/ensip/7.mdx delete mode 100644 src/pages/ensip/8.mdx delete mode 100644 src/pages/ensip/9.mdx create mode 100644 src/pages/ensip/sidebar.json create mode 100644 src/plugins/ensips.ts diff --git a/.gitignore b/.gitignore index 052090db3..6063b3c4d 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,8 @@ yarn-debug.log* yarn-error.log* .pnpm-debug.log* vocs.config.ts.timestamp-* -src/dist \ No newline at end of file +src/dist + +# Generated markdown files +src/pages/deployments.md +src/pages/ensip/*.md \ No newline at end of file diff --git a/package.json b/package.json index 76e5bba2b..8714dcd3c 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,14 @@ "@tanstack/react-query": "^5.64.1", "@types/react": "latest", "clsx": "^2.1.1", + "marked": "^15.0.6", "react": "latest", "react-dom": "latest", "react-icons": "^5.4.0", "tailwind-merge": "^2.6.0", "typescript": "latest", "viem": "^2.22.8", + "vite": "^5.4.11", "vocs": "latest", "wagmi": "^2.14.8" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fa99d21d3..4e22b163b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 + marked: + specifier: ^15.0.6 + version: 15.0.6 react: specifier: latest version: 19.0.0 @@ -35,6 +38,9 @@ importers: viem: specifier: ^2.22.8 version: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + vite: + specifier: ^5.4.11 + version: 5.4.11(@types/node@22.10.5) vocs: specifier: latest version: 1.0.0-alpha.62(@types/node@22.10.5)(@types/react@19.0.6)(acorn@8.14.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(rollup@4.30.1)(typescript@5.7.3) @@ -2429,6 +2435,11 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked@15.0.6: + resolution: {integrity: sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==} + engines: {node: '>= 18'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -6705,6 +6716,8 @@ snapshots: markdown-table@3.0.4: {} + marked@15.0.6: {} + math-intrinsics@1.1.0: {} mdast-util-directive@3.0.0: diff --git a/src/pages/ensip/1.mdx b/src/pages/ensip/1.mdx deleted file mode 100644 index 34aafc4e9..000000000 --- a/src/pages/ensip/1.mdx +++ /dev/null @@ -1,410 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Documentation of the basic ENS protocol (formerly EIP-137)', - contributors: [ - // Nick Johnson - 'arachnid' - ], - ensip: { - created: '2016-04-04', - status: 'final', - } -}; - -# ENSIP-1: ENS - -## Abstract - -This ENSIP describes the details of the Ethereum Name Service, a proposed protocol and ABI definition that provides flexible resolution of short, human-readable names to service and resource identifiers. This permits users and developers to refer to human-readable and easy to remember names, and permits those names to be updated as necessary when the underlying resource (contract, content-addressed data, etc) changes. - -The goal of domain names is to provide stable, human-readable identifiers that can be used to specify network resources. In this way, users can enter a memorable string, such as 'vitalik.wallet' or 'www.mysite.swarm', and be directed to the appropriate resource. The mapping between names and resources may change over time, so a user may change wallets, a website may change hosts, or a swarm document may be updated to a new version, without the domain name changing. Further, a domain need not specify a single resource; different record types allow the same domain to reference different resources. For instance, a browser may resolve 'mysite.swarm' to the IP address of its server by fetching its A (address) record, while a mail client may resolve the same address to a mail server by fetching its MX (mail exchanger) record. - -## Motivation - -Existing [specifications](https://github.com/ethereum/wiki/wiki/Registrar-ABI) and [implementations](https://ethereum.gitbooks.io/frontier-guide/content/registrar\_services.html) for name resolution in Ethereum provide basic functionality, but suffer several shortcomings that will significantly limit their long-term usefulness: - -* A single global namespace for all names with a single 'centralised' resolver. -* Limited or no support for delegation and sub-names/sub-domains. -* Only one record type, and no support for associating multiple copies of a record with a domain. -* Due to a single global implementation, no support for multiple different name allocation systems. -* Conflation of responsibilities: Name resolution, registration, and whois information. - -Use-cases that these features would permit include: - -* Support for subnames/sub-domains - eg, live.mysite.tld and forum.mysite.tld. -* Multiple services under a single name, such as a DApp hosted in Swarm, a Whisper address, and a mail server. -* Support for DNS record types, allowing blockchain hosting of 'legacy' names. This would permit an Ethereum client such as Mist to resolve the address of a traditional website, or the mail server for an email address, from a blockchain name. -* DNS gateways, exposing ENS domains via the Domain Name Service, providing easier means for legacy clients to resolve and connect to blockchain services. - -The first two use-cases, in particular, can be observed everywhere on the present-day internet under DNS, and we believe them to be fundamental features of a name service that will continue to be useful as the Ethereum platform develops and matures. - -The normative parts of this document does not specify an implementation of the proposed system; its purpose is to document a protocol that different resolver implementations can adhere to in order to facilitate consistent name resolution. An appendix provides sample implementations of resolver contracts and libraries, which should be treated as illustrative examples only. - -Likewise, this document does not attempt to specify how domains should be registered or updated, or how systems can find the owner responsible for a given domain. Registration is the responsibility of registrars, and is a governance matter that will necessarily vary between top-level domains. - -Updating of domain records can also be handled separately from resolution. Some systems, such as swarm, may require a well defined interface for updating domains, in which event we anticipate the development of a standard for this. - -## Specification - -### Overview - -The ENS system comprises three main parts: - -* The ENS registry -* Resolvers -* Registrars - -The registry is a single contract that provides a mapping from any registered name to the resolver responsible for it, and permits the owner of a name to set the resolver address, and to create subdomains, potentially with different owners to the parent domain. - -Resolvers are responsible for performing resource lookups for a name - for instance, returning a contract address, a content hash, or IP address(es) as appropriate. The resolver specification, defined here and extended in other ENSIPs, defines what methods a resolver may implement to support resolving different types of records. - -Registrars are responsible for allocating domain names to users of the system, and are the only entities capable of updating the ENS; the owner of a node in the ENS registry is its registrar. Registrars may be contracts or externally owned accounts, though it is expected that the root and top-level registrars, at a minimum, will be implemented as contracts. - -Resolving a name in ENS is a two-step process. First, the ENS registry is called with the name to resolve, after hashing it using the procedure described below. If the record exists, the registry returns the address of its resolver. Then, the resolver is called, using the method appropriate to the resource being requested. The resolver then returns the desired result. - -For example, suppose you wish to find the address of the token contract associated with 'beercoin.eth'. First, get the resolver: - -```javascript -var node = namehash("beercoin.eth"); -var resolver = ens.resolver(node); -``` - -Then, ask the resolver for the address for the contract: - -```javascript -var address = resolver.addr(node); -``` - -Because the `namehash` procedure depends only on the name itself, this can be precomputed and inserted into a contract, removing the need for string manipulation, and permitting O(1) lookup of ENS records regardless of the number of components in the raw name. - -### Name Syntax - -ENS names must conform to the following syntax: - -```go - ::= - -Resolvers wishing to support contract address resources must provide the following function: - -```solidity -function addr(bytes32 node) constant returns (address); -``` - -If the resolver supports `addr` lookups but the requested node does not have an addr record, the resolver MUST return the zero address. - -Clients resolving the `addr` record MUST check for a zero return value, and treat this in the same manner as a name that does not have a resolver specified - that is, refuse to send funds to or interact with the address. Failure to do this can result in users accidentally sending funds to the 0 address. - -Changes to an address MUST trigger the following event: - -```solidity -event AddrChanged(bytes32 indexed node, address a); -``` - -## Appendix A: Registry Implementation - -```solidity -contract ENS { - struct Record { - address owner; - address resolver; - uint64 ttl; - } - - mapping(bytes32=>Record) records; - - event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); - event Transfer(bytes32 indexed node, address owner); - event NewResolver(bytes32 indexed node, address resolver); - - modifier only_owner(bytes32 node) { - if(records[node].owner != msg.sender) throw; - _ - } - - function ENS(address owner) { - records[0].owner = owner; - } - - function owner(bytes32 node) constant returns (address) { - return records[node].owner; - } - - function resolver(bytes32 node) constant returns (address) { - return records[node].resolver; - } - - function ttl(bytes32 node) constant returns (uint64) { - return records[node].ttl; - } - - function setOwner(bytes32 node, address owner) only_owner(node) { - Transfer(node, owner); - records[node].owner = owner; - } - - function setSubnodeOwner(bytes32 node, bytes32 label, address owner) only_owner(node) { - var subnode = sha3(node, label); - NewOwner(node, label, owner); - records[subnode].owner = owner; - } - - function setResolver(bytes32 node, address resolver) only_owner(node) { - NewResolver(node, resolver); - records[node].resolver = resolver; - } - - function setTTL(bytes32 node, uint64 ttl) only_owner(node) { - NewTTL(node, ttl); - records[node].ttl = ttl; - } -} -``` - -## Appendix B: Sample Resolver Implementations - -#### Built-in resolver - -The simplest possible resolver is a contract that acts as its own name resolver by implementing the contract address resource profile: - -```solidity -contract DoSomethingUseful { - // Other code - - function addr(bytes32 node) constant returns (address) { - return this; - } - - function supportsInterface(bytes4 interfaceID) constant returns (bool) { - return interfaceID == 0x3b3b57de || interfaceID == 0x01ffc9a7; - } - - function() { - throw; - } -} -``` - -Such a contract can be inserted directly into the ENS registry, eliminating the need for a separate resolver contract in simple use-cases. However, the requirement to 'throw' on unknown function calls may interfere with normal operation of some types of contract. - -#### Standalone resolver - -A basic resolver that implements the contract address profile, and allows only its owner to update records: - -```solidity -contract Resolver { - event AddrChanged(bytes32 indexed node, address a); - - address owner; - mapping(bytes32=>address) addresses; - - modifier only_owner() { - if(msg.sender != owner) throw; - _ - } - - function Resolver() { - owner = msg.sender; - } - - function addr(bytes32 node) constant returns(address) { - return addresses[node]; - } - - function setAddr(bytes32 node, address addr) only_owner { - addresses[node] = addr; - AddrChanged(node, addr); - } - - function supportsInterface(bytes4 interfaceID) constant returns (bool) { - return interfaceID == 0x3b3b57de || interfaceID == 0x01ffc9a7; - } - - function() { - throw; - } -} -``` - -After deploying this contract, use it by updating the ENS registry to reference this contract for a name, then calling `setAddr()` with the same node to set the contract address it will resolve to. - -#### Public resolver - -Similar to the resolver above, this contract only supports the contract address profile, but uses the ENS registry to determine who should be allowed to update entries: - -```solidity -contract PublicResolver { - event AddrChanged(bytes32 indexed node, address a); - event ContentChanged(bytes32 indexed node, bytes32 hash); - - ENS ens; - mapping(bytes32=>address) addresses; - - modifier only_owner(bytes32 node) { - if(ens.owner(node) != msg.sender) throw; - _ - } - - function PublicResolver(address ensAddr) { - ens = ENS(ensAddr); - } - - function addr(bytes32 node) constant returns (address ret) { - ret = addresses[node]; - } - - function setAddr(bytes32 node, address addr) only_owner(node) { - addresses[node] = addr; - AddrChanged(node, addr); - } - - function supportsInterface(bytes4 interfaceID) constant returns (bool) { - return interfaceID == 0x3b3b57de || interfaceID == 0x01ffc9a7; - } - - function() { - throw; - } -} -``` - -## Appendix C: Sample Registrar Implementation - -This registrar allows users to register names at no cost if they are the first to request them. - -```solidity -contract FIFSRegistrar { - ENS ens; - bytes32 rootNode; - - function FIFSRegistrar(address ensAddr, bytes32 node) { - ens = ENS(ensAddr); - rootNode = node; - } - - function register(bytes32 subnode, address owner) { - var node = sha3(rootNode, subnode); - var currentOwner = ens.owner(node); - if(currentOwner != 0 && currentOwner != msg.sender) - throw; - - ens.setSubnodeOwner(rootNode, subnode, owner); - } -} -``` \ No newline at end of file diff --git a/src/pages/ensip/10.mdx b/src/pages/ensip/10.mdx deleted file mode 100644 index f7c595e95..000000000 --- a/src/pages/ensip/10.mdx +++ /dev/null @@ -1,139 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Provides a mechanism to support wildcard resolution of ENS names (formerly EIP-2544).', - contributors: [ - // Nick Johnson - 'arachnid', - '0age' - ], - ensip: { - created: '2020-02-28', - status: 'draft' - } -}; - -# ENSIP-10: Wildcard Resolution - -Provides a mechanism to support wildcard resolution of ENS names (formerly [EIP-2544](https://eips.ethereum.org/EIPS/eip-2544)). - -## Abstract - -The Ethereum Name Service Specification (ENSIP-1) establishes a two-step name resolution process. First, an ENS client performs the namehash algorithm on the name to determine the associated "node", and supplies that node to the ENS Registry contract to determine the resolver. Then, if a resolver has been set on the Registry, the client supplies that same node to the resolver contract, which will return the associated address or other record. - -As currently specified, this process terminates if a resolver is not set on the ENS Registry for a given node. This ENSIP changes the name resolution process by adding an additional step if a resolver is not set for a domain. This step strips out the leftmost label from the name, derives the node of the new fragment, and supplies that node to the ENS Registry. If a resolver is located for that node, the client supplies the original, complete node to that resolver contract to derive the relevant records. This step is repeated until a node with a resolver is found. - -Further, this specification defines a new way for resolvers to resolve names, using a unified `resolve()` method that permits more flexible handling of name resolution. - -## Motivation - -Many applications such as wallet providers, exchanges, and dapps have expressed a desire to issue ENS names for their users via custom subdomains on a shared parent domain. However, the cost of doing so is currently prohibitive for large user bases, as a distinct record must be set on the ENS Registry for each subdomain. - -Furthermore, users cannot immediately utilize these subdomains upon account creation, as the transaction to assign a resolver for the node of the subdomain must first be submitted and mined on-chain. This adds unnecessary friction when onboarding new users, who coincidentally would often benefit greatly from the usability improvements afforded by an ENS name. - -Enabling wildcard support allows for the design of more advanced resolvers that deterministically generate addresses and other records for unassigned subdomains. The generated addresses could map to counterfactual contract deployment addresses (i.e. `CREATE2` addresses), to designated "fallback" addresses, or other schemes. Additionally, individual resolvers would still be assignable to any given subdomain, which would supersede the wildcard resolution using the parent resolver. - -Another critical motivation with this standard is to enable wildcard resolution in a backwards-compatible fashion. It does not require modifying the current ENS Registry contract or any existing resolvers, and continues to support existing ENS records — legacy ENS clients would simply fail to resolve wildcard records. - -## Specification - -The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119. - -Let: - -* `namehash` be the algorithm defined in ENSIP-1. -* `dnsencode` be the process for encoding DNS names specified in section 3.1 of RFC1035, with the exception that there is no limit on the total length of the encoded name. The empty string is encoded identically to the name '.', as a single 0-octet. -* `parent` be a function that removes the first label from a name (eg, `parent('foo.eth') = 'eth'`). `parent('tld')` is defined as the empty string ''. -* `ens` is the ENS registry contract for the current network. - -ENSIP-10-compliant ENS resolvers MAY implement the following function interface: - -```solidity -interface ExtendedResolver { - function resolve(bytes calldata name, bytes calldata data) external view returns(bytes); -} -``` - -If a resolver implements this function, it MUST return true when `supportsInterface()` is called on it with the interface's ID, `0x9061b923`. - -ENS clients will call `resolve` with the DNS-encoded name to resolve and the encoded calldata for a resolver function (as specified in ENSIP-1 and elsewhere); the function MUST either return valid return data for that function, or revert if it is not supported. - -ENSIP-10-compliant ENS clients MUST perform the following procedure when determining the resolver for a given name: - -1. Set `currentname = name` -2. Set `resolver = ens.resolver(namehash(currentname))` -3. If `resolver` is not the zero address, halt and return `resolver`. -4. If `currentname` is the empty name ('' or '.'), halt and return null. -5. Otherwise, set `currentname = parent(currentname)` and go to 2. - -If the procedure above returns null, name resolution MUST terminate unsuccessfully. Otherwise, ENSIP-10-compliant ENS clients MUST perform the following procedure when resolving a record: - -1. Set `calldata` to the ABI-encoded call data for the resolution function required - for example, the ABI encoding of `addr(namehash(name))` when resolving the `addr` record. -2. Set `supportsENSIP10 = resolver.supportsInterface('0x9061b923')`. -3. If `supportsENSIP10` is true, set `result = resolver.resolve(dnsencode(name), calldata)` -4. If `supportsENSIP10` is false and `name == currentname`, set `result` to the result of calling `resolver` with `calldata`. -5. If neither 3 nor 4 are true, terminate unsuccessfully. -6. Return `result` after decoding it using the return data ABI of the corresponding resolution function (eg, for `addr()`, ABI-decode the result of `resolver.resolve()` as an `address`). - -Note that in all cases the resolution function (`addr()` etc) and the `resolve` function are supplied the original `name`, _not_ the `currentname` found in the first stage of resolution. - -Also note that when wildcard resolution is in use (eg, `name != currentname`), clients MUST NOT call legacy methods such as `addr` to resolve the name. These methods may only be called on resolvers set on an exact match for `name`. - -### Pseudocode - -```solidity -function getResolver(name) { - for(let currentname = name; currentname !== ''; currentname = parent(currentname)) { - const node = namehash(currentname); - const resolver = ens.resolver(node); - if(resolver != '0x0000000000000000000000000000000000000000') { - return [resolver, currentname]; - } - } - return [null, '']; -} - -function resolve(name, func, ...args) { - const [resolver, resolverName] = getResolver(name); - if(resolver === null) { - return null; - } - const supportsENSIP10 = resolver.supportsInterface('0x9061b923'); - if(supportsENSIP10) { - const calldata = resolver[func].encodeFunctionCall(namehash(name), ...args); - const result = resolver.resolve(dnsencode(name), calldata); - return resolver[func].decodeReturnData(result); - } else if(name == resolverName) { - return resolver[func](...args); - } else { - return null; - } -} -``` - -## Rationale - -The proposed implementation supports wildcard resolution in a manner that minimizes the impact to existing systems. It also reuses existing algorithms and procedures to the greatest possible extent, thereby easing the burden placed on authors and maintainers of various ENS clients. - -It also recognizes an existing consensus concerning the desirability of wildcard resolution for ENS, enabling more widespread adoption of the original specification by solving for a key scalability obstacle. - -While introducing an optional `resolve` function for resolvers, taking the unhashed name and calldata for a resolution function increases implementation complexity, it provides a means for resolvers to obtain plaintext labels and act accordingly, which enables many wildcard-related use-cases that would otherwise not be possible - for example, a wildcard resolver could resolve `id.nifty.eth` to the owner of the NFT with id `id` in some collection. With only namehashes to work with, this is not possible. - -The DNS wire format is used for encoding names as it permits quick and gas-efficient hashing of names, as well as other common operations such as fetching or removing individual labels; in contrast, dot-separated names require iterating over every character in the name to find the delimiter. - -## Backwards Compatibility - -Existing ENS clients that are compliant with ENSIP-1 will fail to resolve wildcard records and refuse to interact with them, while those compliant with ENSIP-10 will continue to correctly resolve, or reject, existing ENS records. Resolvers wishing to implement the new `resolve` function for non-wildcard use-cases (eg, where the resolver is set directly on the name being resolved) should consider what to return to legacy clients that call the individual resolution functions for maximum compatibility. - -Requiring clients to avoid calling existing resolution functions (eg, `addr` etc) on wildcard resolvers prevents inadvertent backwards compatibility issues with resolvers that answer queries for all names. - -## Security Considerations - -While compliant ENS clients will continue to refuse to resolve records without a resolver, there is still the risk that an improperly-configured client will refer to an incorrect resolver, or will not reject interactions with the null address when a resolver cannot be located. - -Additionally, resolvers supporting completely arbitrary wildcard subdomain resolution will increase the likelihood of funds being sent to unintended recipients as a result of typos. Applications that implement such resolvers should consider making additional name validation available to clients depending on the context, or implementing features that support recoverability of funds. - -There is also the possibility that some applications might require that no resolver be set for certain subdomains. For this to be problematic, the parent domain would need to successfully resolve the given subdomain node — to the knowledge of the authors, no application currently supports this feature or expects that subdomains should not resolve to a record. - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/11.mdx b/src/pages/ensip/11.mdx deleted file mode 100644 index cd1edf7b4..000000000 --- a/src/pages/ensip/11.mdx +++ /dev/null @@ -1,113 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Introduces coinType for EVM compatible chains (amending ENSIP9).', - contributors: [ - // Makoto Inoue - 'makoto' - ], - ensip: { - status: 'draft', - created: '2022-01-13', - } -}; - -# ENSIP-11: EVM compatible Chain Address Resolution - -Introduces coinType for EVM compatible chains (amending [ENSIP-9](./9)). - -## Abstract - -This ENSIP extends [ENSIP 9 (multichain address resolution)](./9), dedicates a range of coin types for EVM compatible chains, and specifies a way to derive EVM chain IDs to the designated coin types. - -The dedicated range uses over 0x80000000 (2147483648) which is reserved under ENSIP 9 so there will be no possibility of coin type collision with other non EVM coin types to be added in future. However, some of coin types previously allocated to EVM chain ids will be deprecated. - -## Motivation - -The existing ENSIP 9 relies on the existence of coin types on [SLIP44](https://github.com/satoshilabs/slips/blob/master/slip-0044.md) which was designed to define address encoding type for deterministic wallets. As the majority of EVM compatible chains inherit the same encoding type as Ethereum, it is redundant to keep requesting the addition of EVM compatible chains into SLIP 44. This specification standardises a way to derive coinType based on [Chain ID](https://chainlist.org). - -## Specification - -This specification amends ENSIP 9 to specify that coin types with the most-significant bit set are to be treated as EVM chain IDs. The MSB is reserved in SLIP44 for other purposes relating to HD wallet key derivation, so no coin types exist in this range. - -To compute the new coin type for EVM chains, bitwise-OR the chain ID with `0x80000000`: `0x80000000 | chainId`. - -```typescript -export const convertEVMChainIdToCoinType = (chainId: number) =>{ - return (0x80000000 | chainId) >>> 0 -} -``` - -And to reverse the operation, bitwise-AND the coinType with `0x7fffffff`: `0x7fffffff & coinType`. - -```typescript -export const convertCoinTypeToEVMChainId = (coinType: number) =>{ - return (0x7fffffff & coinType) >> 0 -} -``` - -### Implementation - -An implementation of this interface is provided in the [ensdomains/address-encoder](https://github.com/ensdomains/address-encoder/) repository. - -### Example - -To compute the new coin type for EVM chains, call `convertEVMChainIdToCoinType(chainId)` - -```javascript -const encoder = require('@ensdomains/address-encoder') -> encoder.convertEVMChainIdToCoinType(61) -2147483709 -> encoder.convertCoinTypeToEVMChainId(2147483709) -61 -``` - -You can also use existing functions formatsByName and formatsByCoinType to derive these chain IDs - -```javascript -> encoder.formatsByName['XDAI'] -{ - coinType: 2147483748, - decoder: [Function (anonymous)], - encoder: [Function (anonymous)], - name: 'XDAI' -} -> encoder.formatsByCoinType[2147483748] -{ - coinType: 2147483748, - decoder: [Function (anonymous)], - encoder: [Function (anonymous)], - name: 'XDAI' -} -``` - -### Exceptions - -The following EVM chains are the exception to this standard. - -* AVAX = AVAX has multiple chain address formats, and only c chain is EVM compatible -* RSK = RSK has its own additional validation - -They will continue using coinType defined at SLIP44 - -### Backwards Compatibility - -The following EVM compatible cointypes existed before introducing this new standard. - -* NRG -* POA -* TT -* CELO -* CLO -* TOMO -* EWT -* THETA -* GO -* FTM -* XDAI -* ETC - -When you display them for backward compatibility purposes, append `_LEGACY` to the cointype and make them read only. - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/12.mdx b/src/pages/ensip/12.mdx deleted file mode 100644 index 0d2237cc0..000000000 --- a/src/pages/ensip/12.mdx +++ /dev/null @@ -1,119 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'A standard for storage of the avatar text record in ENS.', - contributors: [ - // Nick Johnson - 'arachnid', - // Makoto Inoue - 'makoto' - ], - ensip: { - status: 'draft', - created: '2022-01-18', - } -}; - -# ENSIP-12: Avatar Text Records - -A standard for storage of the avatar text record in ENS. - -## Abstract - -This ENSIP defines a process for retrieving avatar URIs from ENS, several [URI](https://datatracker.ietf.org/doc/html/rfc3986) schemes for the ENS 'avatar' text field, and how they should be interpreted by clients wishing to display a user's avatar image. - -## Motivation - -ENS primary name (formerly known as reverse record) has been widely integrated as a de facto web3 user name across many Ethereum based applications. As multiple apps started specifying avatar profile image as well as let users pick NFT as pfp (profile image), it became obvious to store such information within ENS so that the avatar information can be shared across different applications. - -This specification standardises a way to store and retrieve this information using [ENSIP-5: Text Records](ensip-5-text-records.md) - -## Specification - -### Retrieving the avatar URI - -The process for retrieving the avatar URI depends on whether the client has an Ethereum address or an ENS name to start with. - -### ENS Name - -To determine the avatar URI for an ENS name, the client MUST first look up the resolver for the name and call `.text(namehash(name), 'avatar')` on it to retrieve the avatar URI for the name. - -The client MUST treat the absence of a resolver, an revert when calling the `addr` method on the resolver, or an empty string returned by the resolver identically, as a failure to find a valid avatar URI. - -### Ethereum Address - -To determine the avatar URI for an Ethereum address, the client MUST reverse-resolve the address by querying the ENS registry for the resolver of `<address>.addr.reverse`, where `<address>` is the lowercase hex-encoded Ethereum address, without leading '0x'. Then, the client calls `.text(namehash(<address>.addr.reverse'), 'avatar')` to retrieve the avatar URI for the address. - -If a resolver is returned for the reverse record, but calling `text` causes a revert or returns an empty string, the client MUST call `.name(namehash('<address>.addr.reverse'))`. If this method returns a valid ENS name, the client MUST: - -1. Validate that the reverse record is valid, by resolving the returned name and calling `addr` on the resolver, checking it matches the original Ethereum address. -2. Perform the process described under 'ENS Name' to look for a valid avatar URI on the name. - -A failure at any step of this process MUST be treated by the client identically as a failure to find a valid avatar URI. - -### General Format - -The 'avatar' text field MUST be formatted as a URI. Clients MUST ignore URI types they do not recognise, treating them the same as if no value was set for the field. - -### Image Types - -Clients MUST support images with mime types of `image/jpeg`, `image/png`, and `image/svg+xml`. Clients MAY support additional image types. - -### URI Types - -All clients SHOULD support the URI schemes defined below. They MAY implement additional schemes not defined in this specification. - -**`https`** - -If an https URI is provided, it MUST resolve to an avatar image directly. https URLs MUST NOT resolve to HTML pages, metadata, or other content containing the avatar image. - -**`ipfs`** - -If an [ipfs URI](https://docs.ipfs.io/how-to/address-ipfs-on-web/#native-urls) is provided, it MUST resolve to an avatar image directly. Clients without built-in IPFS support MAY rewrite the URI to an https URL referencing an IPFS gateway as described in [this document](https://docs.ipfs.io/how-to/address-ipfs-on-web/) before resolving it as an https URL. - -**`data`** - -If a [data URL](https://datatracker.ietf.org/doc/html/rfc2397) is provided, it MUST resolve to an avatar image directly. - -**NFTs** - -A reference to an NFT may be used as an avatar URI, following the standards defined in [CAIP-22](https://github.com/ChainAgnostic/CAIPs/blob/master/CAIPs/caip-22.md) and [CAIP-29](https://github.com/ChainAgnostic/CAIPs/blob/master/CAIPs/caip-29.md). - -Clients MUST support at least ERC721 and ERC1155 type NFTs, and MAY support additional types of NFT. - -To resolve an NFT URI, a client follows this process: - -1. Retrieve the metadata URI for the token specified in the `avatar` field URI. -2. Resolve the metadata URI, fetching the ERC721 or ERC1155 metadata. -3. Extract the image URL specified in the NFT metadata. -4. Resolve the image URL and use it as the avatar. - -Clients MUST support at least `https` and `ipfs` URIs for resolving the metadata URI and the avatar image, and MAY support additional schemes. Clients MAY implement `ifps` scheme support by rewriting the URI to an HTTPS URL referencing an IPFS gateway as described above. - -Clients SHOULD additionally take the following verification steps: - -1. Where the avatar URI was retrieved via forward resolution (starting from an ENS name), call the `addr` function on the same resolver and for the same name to retrieve the Ethereum address to which the name resolves. Otherwise, if the avatar URI was retrieved via reverse resolution (starting from an Ethereum address), use that address. -2. Verify that the address from step 1 is an owner of the NFT specified in the URI. If it is not, the client MUST treat the URI as invalid and behave in the same manner as they would if no avatar URI was specified. - -Clients MAY support NFT URIs by rewriting them to `https` URIs for a service that provides NFT avatar image resolution support. - -## Examples - -The following examples all resolve to the same avatar image: - -```bash -eip155:1/erc721:0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d/0 # BAYC token 0 -ipfs://QmRRPWG96cmgTn2qSzjwr2qvfNEuhunv6FNeMFGa9bx6mQ # IPFS hash for BAYC token 0 image -https://ipfs.io/ipfs/QmRRPWG96cmgTn2qSzjwr2qvfNEuhunv6FNeMFGa9bx6mQ # HTTPS URL to IPFS gateway for BAYC token 0 image -``` - -## Backwards Compatibility - -Not applicable. - -## Security Considerations - -None. - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/13.mdx b/src/pages/ensip/13.mdx deleted file mode 100644 index bc5d95a08..000000000 --- a/src/pages/ensip/13.mdx +++ /dev/null @@ -1,352 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Using ENS Text Records to facilitate safer and more convenient signing operations.', - contributors: [ - // Wilkins Chung - 'wwhchung', - // Jalil Wahdatehagh - 'jwahdatehagh', - // Cry - 'crydoteth', - // Sillytuna - 'sillytuna', - // Cyberpnk - 'cyberpnkwin' - ], - ensip: { - status: 'draft', - created: '2021-08-03', - } -}; - -# ENSIP-13: SAFE Authentication For ENS - -Using ENS Text Records to facilitate safer and more convenient signing operations. | - -## Abstract -This EIP links one or more signing wallets via Ethereum Name Service Specification ([EIP-137](https://eips.ethereum.org/EIPS/eip-137)) to prove control and asset ownership of a main wallet. - -## Motivation -Proving ownership of an asset to a third party application in the Ethereum ecosystem is common. Users frequently sign payloads of data to authenticate themselves before gaining access to perform some operation. However, this method--akin to giving the third party root access to one's main wallet--is both insecure and inconvenient. - -***Examples:*** - 1. In order for you to edit your profile on OpenSea, you must sign a message with your wallet. - 2. In order to access NFT gated content, you must sign a message with the wallet containing the NFT in order to prove ownership. - 3. In order to gain access to an event, you must sign a message with the wallet containing a required NFT in order to prove ownership. - 4. In order to claim an airdrop, you must interact with the smart contract with the qualifying wallet. - 5. In order to prove ownership of an NFT, you must sign a payload with the wallet that owns that NFT. - -In all the above examples, one interacts with the dApp or smart contract using the wallet itself, which may be - - inconvenient (if it is controlled via a hardware wallet or a multi-sig) - - insecure (since the above operations are read-only, but you are signing/interacting via a wallet that has write access) - -Instead, one should be able to approve multiple wallets to authenticate on behalf of a given wallet. - -### Problems with existing methods and solutions -Unfortunately, we've seen many cases where users have accidentally signed a malicious payload. The result is almost always a significant loss of assets associated with the signing address. - -In addition to this, many users keep significant portions of their assets in 'cold storage'. With the increased security from 'cold storage' solutions, we usually see decreased accessibility because users naturally increase the barriers required to access these wallets. - -Some solutions propose dedicated registry smart contracts to create this link, or new protocols to be supported. This is problematic from an adoption standpoint, and there have not been any standards created for them. - -### Proposal: Use the Ethereum Name Service (EIP-137) -Rather than 're-invent the wheel', this proposal aims to use the widely adopted Ethereum Name Service in conjunction with the ENS Text Records feature ([EIP-634](https://eips.ethereum.org/EIPS/eip-634)) in order to achieve a safer and more convenient way to sign and authenticate, and provide 'read only' access to a main wallet via one or more secondary wallets. - -From there, the benefits are twofold. This EIP gives users increased security via outsourcing potentially malicious signing operations to wallets that are more accessible (hot wallets), while being able to maintain the intended security assumptions of wallets that are not frequently used for signing operations. - -#### Improving dApp Interaction Security -Many dApps requires one to prove control of a wallet to gain access. At the moment, this means that you must interact with the dApp using the wallet itself. This is a security issue, as malicious dApps or phishing sites can lead to the assets of the wallet being compromised by having them sign malicious payloads. - -However, this risk would be mitigated if one were to use a secondary wallet for these interactions. Malicious interactions would be isolated to the assets held in the secondary wallet, which can be set up to contain little to nothing of value. - -#### Improving Multiple Device Access Security -In order for a non-hardware wallet to be used on multiple devices, you must import the seed phrase to each device. Each time a seed phrase is entered on a new device, the risk of the wallet being compromised increases as you are increasing the surface area of devices that have knowledge of the seed phrase. - -Instead, each device can have its own unique wallet that is an authorized secondary wallet of the main wallet. If a device specific wallet was ever compromised or lost, you could simply remove the authorization to authenticate. - -Further, wallet authentication can be matokenUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119. - -Let: - - `mainAddress` represent the wallet address we are trying to authenticate or prove asset ownership for. - - `mainENS` represent the reverse lookup ENS string for `mainAddress`. - - `authAddress` represent the address we want to use for signing in lieu of `mainAddress`. - - `authENS` represent the reverse lookup ENS string for `authAddress`. - - `authKey` represents a string in the format `[0-9A-Za-z]+`. - -Control of `mainAddress` and ownership of `mainAddress` assets by `authAddress` is proven if all the following conditions are met: - - `mainAddress` has an ENS resolver record and a reverse record set to `mainENS`. - - `authAddress` has an ENS resolver record and a reverse record set to `authENS`. - - `authENS` has an ENS TEXT record `eip5131:vault` in the format `:`. - - `mainENS` has an ENS TEXT record `eip5131:`. - -### Setting up one or many `authAddress` records on a single ENS domain -The `mainAddress` MUST have an ENS resolver record and reverse record configured. -In order to automatically discover the linked account, the `authAddress` SHOULD have an ENS resolver record and reverse record configured. - -1. Choose an unused ``. This can be any string in the format `[0-0A-Za-z]+`. -2. Set a TEXT record `eip5131:` on `mainENS`, with the value set to the desired `authAddress`. -3. Set a TEXT record `eip5131:vault` on `authENS`, with the value set to the `:mainAddress`. - -Currently this EIP does not enforce an upper-bound on the number of `authAddress` entries you can include. Users can repeat this process with as many address as they like. - -### Authenticating `mainAddress` via `authAddress` -Control of `mainAddress` and ownership of `mainAddress` assets is proven if any associated `authAddress` is the `msg.sender` or has signed the message. - -Practically, this would work by performing the following operations: -1. Get the resolver for `authENS` -2. Get the `eip5131:vault` TEXT record of `authENS` -3. Parse `:` to determine the `authKey` and `mainAddress`. -4. MUST get the reverse ENS record for `mainAddress` and verify that it matches ``. - - Otherwise one could set up other ENS nodes (with auths) that point to `mainAddress` and authenticate via those. -5. Get the `eip5131:` TEXT record of `mainENS` and ensure it matches `authAddress`. - -Note that this specification allows for both contract level and client/server side validation of signatures. It is not limited to smart contracts, which is why there is no proposed external interface definition. - -### Revocation of `authAddress` -To revoke permission of `authAddress`, delete the `eip5131:` TEXT record of `mainENS` or update it to point to a new `authAddress`. - -## Rationale - -### Usage of EIP-137 -The proposed specification makes use of EIP-137 rather than introduce another registry paradigm. The reason for this is due to the existing wide adoption of EIP-137 and ENS. - -However, the drawback to EIP-137 is that any linked `authAddress` must contain some ETH in order to set the `authENS` reverse record as well as the `eip5131:vault` TEXT record. This can be solved by a separate reverse lookup registry that enables `mainAddress` to set the reverse record and TEXT record with a message signed by `authAddress`. - -With the advent of L2s and ENS Layer 2 functionalities, off chain verification of linked addresses is possible even with domains managed across different chains. - -### One-to-Many Authentication Relationship - -This proposed specification allows for a one (`mainAddress`) to many (`authAddress`) authentication relationship. i.e. one `mainAddress` can authorize many `authAddress` to authenticate, but an `authAddress` can only authenticate itself or a single `mainAddress`. - -The reason for this design choice is to allow for simplicity of authentication via client and smart contract code. You can determine which `mainAddress` the `authAddress` is signing for without any additional user input. - -Further, you can design UX without any user interaction necessary to 'pick' the interacting address by display assets owned by `authAddress` and `mainAddress` and use the appropriate address dependent on the asset the user is attempting to authenticate with. - -## Reference Implementation - -### Client/Server Side - -In typescript, the validation function, using ethers.js would be as follows: - -```solidity -export interface LinkedAddress { - ens: string, - address: string, -} - -export async function getLinkedAddress( - provider: ethers.providers.EnsProvider, address: string -): Promise { - const addressENS = await provider.lookupAddress(address); - if (!addressENS) return null; - - const vaultInfo = await (await provider.getResolver(addressENS))?.getText('eip5131:vault'); - if (!vaultInfo) return null; - - const vaultInfoArray = vaultInfo.split(':'); - if (vaultInfoArray.length !== 2) { - throw new Error('EIP5131: Authkey and vault address not configured correctly.'); - } - - const [ authKey, vaultAddress ] = vaultInfoArray; - - const vaultENS = await provider.lookupAddress(vaultAddress); - if (!vaultENS) { - throw new Error(`EIP5131: No ENS domain with reverse record set for vault.`); - }; - - const expectedSigningAddress = await ( - await provider.getResolver(vaultENS) - )?.getText(`eip5131:${authKey}`); - - if (expectedSigningAddress?.toLowerCase() !== address.toLowerCase()) { - throw new Error(`EIP5131: Authentication mismatch.`); - }; - - return { - ens: vaultENS, - address: vaultAddress - }; -} -``` - -### Contract side - -#### With a backend - -If your application operates a secure backend server, you could run the client/server code above, then use the result in conjunction with specs like [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) : `Standard Signature Validation Method for Contracts` for a cheap and secure way to validate that the message signer is indeed authenticated for the main address. - -#### Without a backend (JavaScript only) - -Provided is a reference implementation for an internal function to verify that the message sender has an authentication link to the main address. - -```solidity -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -/// @author: manifold.xyz - -/** - * ENS Registry Interface - */ -interface ENS { - function resolver(bytes32 node) external view returns (address); -} - -/** - * ENS Resolver Interface - */ -interface Resolver { - function addr(bytes32 node) external view returns (address); - function name(bytes32 node) external view returns (string memory); - function text(bytes32 node, string calldata key) external view returns (string memory); -} - -/** - * Validate a signing address is associtaed with a linked address - */ -library LinkedAddress { - /** - * Validate that the message sender is an authentication address for mainAddress - * - * @param ensRegistry Address of ENS registry - * @param mainAddress The main address we want to authenticate for. - * @param mainENSNodeHash The main ENS Node Hash - * @param authKey The TEXT record of the authKey we are using for validation - * @param authENSNodeHash The auth ENS Node Hash - */ - function validateSender( - address ensRegistry, - address mainAddress, - bytes32 mainENSNodeHash, - string calldata authKey, - bytes32 authENSNodeHash - ) internal view returns (bool) { - return validate(ensRegistry, mainAddress, mainENSNodeHash, authKey, msg.sender, authENSNodeHash); - } - - /** - * Validate that the authAddress is an authentication address for mainAddress - * - * @param ensRegistry Address of ENS registry - * @param mainAddress The main address we want to authenticate for. - * @param mainENSNodeHash The main ENS Node Hash - * @param authAddress The address of the authentication wallet - * @param authENSNodeHash The auth ENS Node Hash - */ - function validate( - address ensRegistry, - address mainAddress, - bytes32 mainENSNodeHash, - string calldata authKey, - address authAddress, - bytes32 authENSNodeHash - ) internal view returns (bool) { - _verifyMainENS(ensRegistry, mainAddress, mainENSNodeHash, authKey, authAddress); - _verifyAuthENS(ensRegistry, mainAddress, authKey, authAddress, authENSNodeHash); - - return true; - } - - // ********************* - // Helper Functions - // ********************* - function _verifyMainENS( - address ensRegistry, - address mainAddress, - bytes32 mainENSNodeHash, - string calldata authKey, - address authAddress - ) private view { - // Check if the ENS nodes resolve correctly to the provided addresses - address mainResolver = ENS(ensRegistry).resolver(mainENSNodeHash); - require(mainResolver != address(0), "Main ENS not registered"); - require(mainAddress == Resolver(mainResolver).addr(mainENSNodeHash), "Main address is wrong"); - - // Verify the authKey TEXT record is set to authAddress by mainENS - string memory authText = Resolver(mainResolver).text(mainENSNodeHash, string(abi.encodePacked("eip5131:", authKey))); - require( - keccak256(bytes(authText)) == keccak256(bytes(_addressToString(authAddress))), - "Invalid auth address" - ); - } - - function _verifyAuthENS( - address ensRegistry, - address mainAddress, - string memory authKey, - address authAddress, - bytes32 authENSNodeHash - ) private view { - // Check if the ENS nodes resolve correctly to the provided addresses - address authResolver = ENS(ensRegistry).resolver(authENSNodeHash); - require(authResolver != address(0), "Auth ENS not registered"); - require(authAddress == Resolver(authResolver).addr(authENSNodeHash), "Auth address is wrong"); - - // Verify the TEXT record is appropriately set by authENS - string memory vaultText = Resolver(authResolver).text(authENSNodeHash, "eip5131:vault"); - require( - keccak256(abi.encodePacked(authKey, ":", _addressToString(mainAddress))) == - keccak256(bytes(vaultText)), - "Invalid auth text record" - ); - } - - bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; - - function sha3HexAddress(address addr) private pure returns (bytes32 ret) { - uint256 value = uint256(uint160(addr)); - bytes memory buffer = new bytes(40); - for (uint256 i = 39; i > 1; --i) { - buffer[i] = _HEX_SYMBOLS[value & 0xf]; - value >>= 4; - } - return keccak256(buffer); - } - - function _addressToString(address addr) private pure returns (string memory ptr) { - // solhint-disable-next-line no-inline-assembly - assembly { - ptr := mload(0x40) - - // Adjust mem ptr and keep 32 byte aligned - // 32 bytes to store string length; address is 42 bytes long - mstore(0x40, add(ptr, 96)) - - // Store (string length, '0', 'x') (42, 48, 120) - // Single write by offsetting across 32 byte boundary - ptr := add(ptr, 2) - mstore(ptr, 0x2a3078) - - // Write string backwards - for { - // end is at 'x', ptr is at lsb char - let end := add(ptr, 31) - ptr := add(ptr, 71) - } gt(ptr, end) { - ptr := sub(ptr, 1) - addr := shr(4, addr) - } { - let v := and(addr, 0xf) - // if > 9, use ascii 'a-f' (no conditional required) - v := add(v, mul(gt(v, 9), 39)) - // Add ascii for '0' - v := add(v, 48) - mstore8(ptr, v) - } - - // return ptr to point to length (32 + 2 for '0x' - 1) - ptr := sub(ptr, 33) - } - - return string(ptr); - } -} -``` - -## Security Considerations -The core purpose of this EIP is to enhance security and promote a safer way to authenticate wallet control and asset ownership when the main wallet is not needed and assets held by the main wallet do not need to be moved. Consider it a way to do 'read only' authentication. - -## Copyright -Copyright and related rights waived via [CC0](../LICENSE.md). diff --git a/src/pages/ensip/14.mdx b/src/pages/ensip/14.mdx deleted file mode 100644 index 5d50a6b40..000000000 --- a/src/pages/ensip/14.mdx +++ /dev/null @@ -1,64 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Using the reveal secret as a way to have on chain information about the source of the registration', - contributors: [ - // Alex Slobodnik - 'aslobodnik', - // Alex Van de Sande - 'alexvandesande' - ], - ensip: { - status: 'draft', - created: '2021-02-07', - } -}; - -# ENSIP-14: On Chain Source Parameter - -Using the reveal secret as a way to have on chain information about the source of the registration. - -## Abstract - -We have many reasons to measure user registration names. Knowing our ecosystem and which apps are popular is essential for identifying the creators who contribute. Retroactive funding via grants is often better than proactive funding, as it allows us to detect what has already worked, rather than relying on guesses. This community often sees unexpected successes that we can't predict. - -At the same time, it's important to make the process transparent, open source, and privacy-preserving. Source data would also help create referral programs. - -## Specification - -The ETH Registrar Controller takes a random secret as part of its input. This secret parameter is random data that obscures the name before the final step of the registration process is complete. It is 32 bytes of entropy and the ens manager app on app.ens.domains generates it by calling `require('crypto').randomBytes(32)`. - -This proposal suggests a social convention that generates the secret from a combination of the first **4 bytes of the namehash**, plus another **4 bytes for user referrals**, combined with the appropriate number of random bytes. - -In hex formatted string it means that the first 8 chars of the secret would be the platform name and the next 8 would be used as an identifier of the user referral. For example, if the above was registered via ensfairy, the secret would be: - -> 0x **1b7f8b3c** **612c63bc** c635528d3b7196bc89d13566c1be2068af0cad6fb3ecebf0 -> - -With this, we can attribute registrations using the first 16 chars of the secret. The loss of entropy of 64 bits is not relevant, since the only goal of the secret is to obscure the details of the bid to avoid front-running during the short period (usually a few minutes, but it could be as long as a week) before the reveal transaction is executed. The secret still retains 192 bits, which is highly secure, especially for such a short time frame. - -## User Referral Data - -The goal of this ENSIP is to empower app makers and anyone who wants to start a registration campaign. Any app that conforms to this standard should accept a referral link in the form of `?ensref=12345678` (or a similar scheme for mobile apps and other platforms). When a new user arrives at the site via a referral code, the platform should try to remember the user if they later register an ENS name, by appending the code to the platform code, followed by the rest of the secret. Standard cookie and private data regulations apply. While we encourage users to derive their code from a namehash, any random code should be accepted. - -The extra data can be used in this example: - -- Alice refers Bob to an ENS registrar app using a custom link like `app.ens.domains/?ensref=deadbeef` -- If Bob clicks the link, the information is saved on the cookies/local storage (until it's overwritten by another referral code, Bob clears his memory, or the code expires). -- Later, Bob wants to register a name; the secret will be prepended by the first 8 letters of the platform, followed by the code provided by Alice. - -This allows individuals who don't own a name registrar app, but have their own audience, to have a cross-registrar referral, which registrars can choose to share revenue with. - -## Privacy Concerns - -This action makes it public which apps users are using to register names, and may reveal who they are friends with or who they follow. It could also reveal some demographic information about accounts - if a registrar app is known to be popular in a certain country or to only have a UI in a certain language, it can indicate that a specific Ethereum address might be from that demographic. This is not unlike seeing a user send funds to a known exchange address. - -To address these concerns, we ask app makers to make the process transparent and allow users to opt-out of either the referral code or the whole platform code being added to their secret. - -This would also enable comparison of different clients' usage - again, this is by design. If a given platform doesn't want any of their numbers to be public, they can simply not implement it. - -## A Reverse Code Registry - -Since the source code is derived from the namehash, it's not reversible. Therefore, some sort of registry of names is needed to make sense of these names. Such registrars could be made on-chain or simply be a git text file with multiple forks across many repos. A registrar definition is outside the scope of this ENSIP, as if the ground truth was on-chain it would be relatively easy to game. - -With a purely random number, it would take about 30,000 registrants to create a 10% chance of an accidental collision, and by 77,163 codes that chance increases to 50%. This means it should be quite rare for an accidental collision to happen, but it is still trivial to create such a collision or to spam a registry. Therefore, instead of trying to play the security cat and mouse game, we would rather leave the "truth" of the codes to their usage. If someone is using them to create a ranking website or launch a referral program, each should simply exercise common sense to maintain their own copy of the registry for the very top of the ranking, where it should be easier to disambiguate. - diff --git a/src/pages/ensip/15.mdx b/src/pages/ensip/15.mdx deleted file mode 100644 index df2a782b3..000000000 --- a/src/pages/ensip/15.mdx +++ /dev/null @@ -1,499 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: '', - contributors: [ - // Andrew Raffensperger - 'adraffy' - ], - ensip: { - status: 'draft', - created: '2023-04-03', - updated: '2024-09-14', - } -}; - -# ENSIP-15: ENS Name Normalization Standard - -## Abstract - -This ENSIP standardizes Ethereum Name Service (ENS) name normalization process outlined in [ENSIP-1 § Name Syntax](./1#name-syntax). - -## Motivation - -* Since [ENSIP-1](./1) (originally [EIP-137](https://eips.ethereum.org/EIPS/eip-137)) was finalized in 2016, Unicode has [evolved](https://unicode.org/history/publicationdates.html) from version 8.0.0 to 15.0.0 and incorporated many new characters, including complex emoji sequences. -* ENSIP-1 does not state the version of Unicode. -* ENSIP-1 implies but does not state an explicit flavor of IDNA processing. -* [UTS-46](https://unicode.org/reports/tr46/) is insufficient to normalize emoji sequences. Correct emoji processing is only possible with [UTS-51](https://www.unicode.org/reports/tr51/). -* Validation tests are needed to ensure implementation compliance. -* The success of ENS has encouraged spoofing via the following techniques: - 1. Insertion of zero-width characters. - 1. Using names which normalize differently between algorithms. - 1. Using names which appear differently between applications and devices. - 1. Substitution of confusable (look-alike) characters. - 1. Mixing incompatible scripts. - -## Specification - -* Unicode version `16.0.0` - * Normalization is a living specification and should use the latest stable version of Unicode. -* [`spec.json`](https://github.com/adraffy/ens-normalize.js/blob/main/derive/output/spec.json) contains all [necessary data](#description-of-specjson) for normalization. -* [`nf.json`](https://github.com/adraffy/ens-normalize.js/blob/main/derive/output/nf.json) contains all [necessary data](#description-of-nfjson) for [Unicode Normalization Forms](https://unicode.org/reports/tr15/) NFC and NFD. - -### Definitions - -* Terms in **bold** throughout this document correspond with [components of `spec.json`](#description-of-specjson). -* A string is a sequence of Unicode codepoints. - * Example: `"abc"` is `61 62 63` -* An [Unicode emoji](https://www.unicode.org/reports/tr51/) is a [single entity](https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries) composed of one or more codepoints: - * An **Emoji Sequence** is the preferred form of an emoji, resulting from input that [tokenized](#tokenize) into an `Emoji` token. - * Example: `💩︎︎ [1F4A9]` → `Emoji[1F4A9 FE0F]` - * `1F4A9 FE0F` is the **Emoji Sequence**. - * [`spec.json`](#description-of-specjson) contains the complete [list of valid](./ensip-15/emoji.md) **Emoji Sequences**. - * [Derivation](#derivation) defines which emoji are normalizable. - * Not all Unicode emoji are valid. - * `‼ [203C] double exclamation mark` → *error: Disallowed character* - * `🈁 [1F201] Japanese “here” button` → `Text["ココ"]` - * An **Emoji Sequence** may contain characters that are disallowed: - * `👩‍❤️‍👨 [1F469 200D 2764 FE0F 200D 1F468] couple with heart: woman, man` — contains ZWJ - * `#️⃣ [23 FE0F 20E3] keycap: #` — contains `23 (#)` - * `🏴󠁧󠁢󠁥󠁮󠁧󠁿 [1F3F4 E0067 E0062 E0065 E006E E0067 E007F]` — contains `E00XX` - * An **Emoji Sequence** may contain other emoji: - * Example: `❤️ [2764 FE0F] red heart` is a substring of `❤️‍🔥 [2764 FE0F 200D 1F525] heart on fire` - * Single-codepoint emoji may have various [presentation styles](https://www.unicode.org/reports/tr51/#Presentation_Style) on input: - * Default: `❤ [2764]` - * Text: `❤︎ [2764 FE0E]` - * Emoji: `❤️ [2764 FE0F]` - * However, these all [tokenize](#tokenize) to the same **Emoji Sequence**. - * All **Emoji Sequence** have explicit emoji-presentation. - * The convention of ignoring presentation is difficult to change because: - * Presentation characters (`FE0F` and `FE0E`) are **Ignored** - * [ENSIP-1](./1) did not treat emoji differently from text - * Registration hashes are immutable - * [Beautification](#annex-beautification) can be used to restore emoji-presentation in normalized names. - -### Algorithm - -* Normalization is the process of canonicalizing a name before for [hashing](./1#namehash-algorithm). -* It is idempotent: applying normalization multiple times produces the same result. -* For user convenience, leading and trailing whitespace should be trimmed before normalization, as all whitespace codepoints are disallowed. Inner characters should remain unmodified. -* No string transformations (like case-folding) should be applied. - -1. [Split](#split) the name into [labels](./1#name-syntax). -1. [Normalize](#normalize) each label. -1. [Join](#join) the labels together into a name again. - -### Normalize - -1. [Tokenize](#tokenize) — transform the label into `Text` and `Emoji` tokens. - * If there are no tokens, the label cannot be normalized. -1. Apply [NFC](https://unicode.org/reports/tr15/#Norm_Forms) to each `Text` token. - * Example: `Text["à"]` → `[61 300] → [E0]` → `Text["à"]` -1. Strip `FE0F` from each `Emoji` token. -1. [Validate](#validate) — check if the tokens are valid and obtain the **Label Type**. - * The **Label Type** and **Restricted** state may be presented to user for additional security. -1. Concatenate the tokens together. - * Return the normalized label. - -Examples: - -1. `"_$A" [5F 24 41]` → `"_$a" [5F 24 61]` — *ASCII* -1. `"E︎̃" [45 FE0E 303]` → `"ẽ" [1EBD]` — *Latin* -1. `"𓆏🐸" [1318F 1F438]` → `"𓆏🐸" [1318F 1F438]` — *Restricted: Egyp* -1. `"nı̇ck" [6E 131 307 63 6B]` → *error: Disallowed character* - -### Tokenize - -Convert a label into a list of `Text` and `Emoji` tokens, each with a payload of codepoints. The complete list of character types and [emoji sequences](#appendix-additional-resources) can be found in [`spec.json`](#description-of-specjson). - -1. Allocate an empty codepoint buffer. -1. Find the longest **Emoji Sequence** that matches the remaining input. - * Example: `👨🏻‍💻 [1F468 1F3FB 200D 1F4BB]` - * Match (1): `👨️ [1F468] man` - * Match (2): `👨🏻 [1F468 1F3FB] man: light skin tone` - * Match (4): `👨🏻‍💻 [1F468 1F3FB 200D 1F4BB] man technologist: light skin tone` — longest match! - * `FE0F` is optional from the input during matching. - * Example: `👨‍❤️‍👨 [1F468 200D 2764 FE0F 200D 1F468]` - * Match: `1F468 200D 2764 FE0F 200D 1F468` — fully-qualified - * Match: `1F468 200D 2764 200D 1F468` — missing `FE0F` - * No match: `1F468 FE0F 200D 2764 FE0F 200D 1F468` — extra `FE0F` - * No match: `1F468 200D 2764 FE0F FE0F 200D 1F468` — has (2) `FE0F` - * This is equivalent to `/^(emoji1|emoji2|...)/` where `\uFE0F` is replaced with `\uFE0F?` and `*` is replaced with `\x2A`. -1. If an **Emoji Sequence** is found: - * If the buffer is nonempty, emit a `Text` token, and clear the buffer. - * Emit an `Emoji` token with the fully-qualified matching sequence. - * Remove the matched sequence from the input. -1. Otherwise: - 1. Remove the leading codepoint from the input. - 1. Determine the character type: - * If **Valid**, append the codepoint to the buffer. - * This set can be precomputed from the union of characters in all groups and their NFD decompositions. - * If **Mapped**, append the corresponding mapped codepoint(s) to the buffer. - * If **Ignored**, do nothing. - * Otherwise, the label cannot be normalized. -1. Repeat until all the input is consumed. -1. If the buffer is nonempty, emit a final `Text` token with its contents. - * Return the list of emitted tokens. - -Examples: - -1. `"xyz👨🏻" [78 79 7A 1F468 1F3FB]` → `Text["xyz"]` + `Emoji["👨🏻"]` -1. `"A💩︎︎b" [41 FE0E 1F4A9 FE0E FE0E 62]` → `Text["a"]` + `Emoji["💩️"]` + `Text["b"]` -1. `"a™️" [61 2122 FE0F]` → `Text["atm"]` - -### Validate - -Given a list of `Emoji` and `Text` tokens, determine if the label is valid and return the **Label Type**. If any assertion fails, the name cannot be normalized. - -1. If only `Emoji` tokens: - * Return `"Emoji"` -1. If a single `Text` token and every characters is ASCII (`00..7F`): - * `5F (_) LOW LINE` can only occur at the start. - * Must match `/^_*[^_]*$/` - * Examples: `"___"` and `"__abc"` are valid, `"abc__"` and `"_abc_"` are invalid. - * The 3rd and 4th characters must not both be `2D (-) HYPHEN-MINUS`. - * Must not match `/^..--/` - * Examples: `"ab-c"` and `"---a"`are valid, `"xn--"` and `----` are invalid. - * Return `"ASCII"` - * The label is free of **Fenced** and **Combining Mark** characters, and not confusable. -1. Concatenate all the tokens together. - * `5F (_) LOW LINE` can only occur at the start. - * The first and last characters cannot be **Fenced**. - * Examples: `"a’s"` and `"a・a"` are valid, `"’85"` and `"joneses’"` and `"・a・"` are invalid. - * **Fenced** characters cannot be contiguous. - * Examples: `"a・a’s"` is valid, `"6’0’’"` and `"a・・a"` are invalid. -1. The first character of every `Text` token must not be a **Combining Mark**. -1. Concatenate the `Text` tokens together. -1. Find the first **Group** that contain every text character: - * If no group is found, the label cannot be normalized. -1. If the group is not **CM Whitelisted**: - * Apply NFD to the concatenated text characters. - * For every contiguous sequence of **NSM** characters: - * Each character must be unique. - * Example: `"x̀̀" [78 300 300]` has (2) grave accents. - * The number of **NSM** characters cannot exceed **Maximum NSM** (4). - * Example: ` "إؐؑؒؓؔ"‎ [625 610 611 612 613 614]` has (6) **NSM**. -1. [Wholes](#wholes) — check if text characters form a confusable. -1. The label is valid. - * Return the name of the group as the **Label Type**. - -Examples: - -1. `Emoji["💩️"]` + `Emoji["💩️"]` → `"Emoji"` -1. `Text["abc$123"]` → `"ASCII"` -1. `Emoji["🚀️"]` + `Text["à"]` → `"Latin"` - -### Wholes - -A label is [whole-script confusable](https://unicode.org/reports/tr39/#def_whole_script_confusables) if a similarly-looking valid label can be constructed using one alternative character from a different group. The complete list of **Whole Confusables** can be found in [`spec.json`](#description-of-specjson). Each **Whole Confusable** has a set of non-confusing characters (`"valid"`) and a set of confusing characters (`"confused"`) where each character may be the member of one or more groups. - -Example: **Whole Confusable** for `"g"` - -| Type | Code | Form | Character | Latn | Hani | Japn | Kore | Armn | Cher | Lisu | -| :-: | -: | :-: | :- | :-: | :-: | :-: | :-: | :-: | :-: | :-: | -| valid | `67` | `g` | LATIN SMALL LETTER G | A | A | A | A | -| confused | `581` | `ց` | ARMENIAN SMALL LETTER CO | | | | | B | -| confused | `13C0` | `Ꮐ` | CHEROKEE LETTER NAH | | | | | | C | -| confused | `13F3` | `Ᏻ` | CHEROKEE LETTER YU | | | | | | C | -| confused | `A4D6` | `ꓖ` | LISU LETTER GA | | | | | | | D | - -1. Allocate an empty character buffer. -1. Start with the set of **ALL** groups. -1. For each unique character in the label: - * If the character is **Confused** (a member of a **Whole Confusable**): - * Retain groups with **Whole Confusable** characters excluding the **Confusable Extent** of the matching **Confused** character. - * If no groups remain, the label is not confusable. - * The **Confusable Extent** is the fully-connected graph formed from different groups with the same confusable and different confusables of the same group. - * The mapping from **Confused** to **Confusable Extent** can be precomputed. - * In the table above, **Whole Confusable** for `"g"`, the rectangle formed by each capital letter is a **Confusable Extent**: - * `A` is [`g`] ⊗ [*Latin*, *Han*, *Japanese*, *Korean*] - * `B` is [`ց`] ⊗ [*Armn*] - * `C` is [`Ꮐ`, `Ᏻ`] ⊗ [*Cher*] - * `D` is [`ꓖ`] ⊗ [*Lisu*] - * A **Confusable Extent** can span multiple characters and multiple groups. Consider the (incomplete) **Whole Confusable** for `"o"`: - * `6F (o) LATIN SMALL LETTER O` → *Latin*, *Han*, *Japanese*, and *Korean* - * `3007 (〇) IDEOGRAPHIC NUMBER ZERO` → *Han*, *Japanese*, *Korean*, and *Bopomofo* - * **Confusable Extent** is [`o`, `〇`] ⊗ [*Latin*, *Han*, *Japanese*, *Korean*, *Bopomofo*] - * If the character is **Unique**, the label is not confusable. - * This set can be precomputed from characters that appear in exactly one group and are not **Confused**. - * Otherwise: - * Append the character to the buffer. -1. If any **Confused** characters were found: - * If there are no buffered characters, the label is confusable. - * If any of the remaining groups contain all of the buffered characters, the label is confusable. - * Example: `"0х" [30 445]` - 1. `30 (0) DIGIT ZERO` - * Not **Confused** or **Unique**, add to buffer. - 1. `445 (х) CYRILLIC SMALL LETTER HA` - * **Confusable Extent** is [`х`, `4B3 (ҳ) CYRILLIC SMALL LETTER HA WITH DESCENDER`] ⊗ [*Cyrillic*] - * **Whole Confusable** excluding the extent is [`78 (x) LATIN SMALL LETTER X`, ...] → [*Latin*, ...] - * Remaining groups: **ALL** ∩ [*Latin*, ...] → [*Latin*, ...] - 1. There was (1) buffered character: - * *Latin* also contains `30` → `"0x" [30 78]` - 1. The label is confusable. -1. The label is not confusable. - -A label composed of confusable characters isn't necessarily confusable. - -* Example: `"тӕ" [442 4D5]` - 1. `442 (т) CYRILLIC SMALL LETTER TE` - * **Confusable Extent** is [`т`] ⊗ [*Cyrillic*] - * **Whole Confusable** excluding the extent is [`3C4 (τ) GREEK SMALL LETTER TAU`] → [*Greek*] - * Remaining groups: **ALL** ∩ [*Greek*] → [*Greek*] - 1. `4D5 (ӕ) CYRILLIC SMALL LIGATURE A IE` - * **Confusable Extent** is [`ӕ`] ⊗ [*Greek*] - * **Whole Confusable** excluding the extent is [`E6 (æ) LATIN SMALL LETTER AE`] → [*Latin*] - * Remaining groups: [*Greek*] ∩ [*Latin*] → ∅ - 1. No groups remain so the label is not confusable. - -### Split - -* Partition a name into labels, separated by `2D (.) FULL STOP`, and return the resulting array. - * Example: `"abc.123.eth"` → `["abc", "123", "eth"]` -* The empty string is 0-labels: `""` → `[]` - -### Join - -* Assemble an array of labels into a name, inserting `2D (.) FULL STOP` between each label, and return the resulting string. - * Example: `["abc", "123", "eth"]` → `"abc.123.eth"` - -## Description of `spec.json` - -* **Groups** (`"groups"`) — [groups](#appendix-additional-resources) of characters that can constitute a label - * `"name"` — ASCII name of the group (or abbreviation if **Restricted**) - * Examples: *Latin*, *Japanese*, *Egyp* - * **Restricted** (`"restricted"`) — **`true`** if [Excluded](https://www.unicode.org/reports/tr31#Table_Candidate_Characters_for_Exclusion_from_Identifiers) or [Limited-Use](https://www.unicode.org/reports/tr31/#Table_Limited_Use_Scripts) script - * Examples: *Latin* → **`false`**, *Egyp* → **`true`** - * `"primary"` — subset of characters that define the group - * Examples: `"a"` → *Latin*, `"あ"` → *Japanese*, `"𓀀"` → *Egyp* - * `"secondary"` — subset of characters included with the group - * Example: `"0"` → *Common* but mixable with *Latin* - * **CM Whitelist(ed)** (`"cm"`) — (optional) set of allowed compound sequences in NFC - * Each compound sequence is a character followed by one or more **Combining Marks**. - * Example: `à̀̀` → `E0 300 300` - * Currently, every group that is **CM Whitelist** has zero compound sequences. - * **CM Whitelisted** is effectively **`true`** if `[]` otherwise **`false`** -* **Ignored** (`"ignored"`) — [characters](#appendix-additional-resources) that are ignored during normalization - * Example: `34F (�) COMBINING GRAPHEME JOINER` -* **Mapped** (`"mapped"`) — characters that are mapped to a sequence of **valid** characters - * Example: `41 (A) LATIN CAPITAL LETTER A` → `[61 (a) LATIN SMALL LETTER A]` - * Example: `2165 (Ⅵ) ROMAN NUMERAL SIX` → `[76 (v) LATIN SMALL LETTER V, 69 (i) LATIN SMALL LETTER I]` -* **Whole Confusable** (`"wholes"`) — groups of characters that look similar - * `"valid"` — subset of confusable characters that are allowed - * Example: `34 (4) DIGIT FOUR` - * **Confused** (`"confused"`) — subset of confusable characters that confuse - * Example: `13CE (Ꮞ) CHEROKEE LETTER SE` -* **Fenced** (`"fenced"`) — [characters](#appendix-additional-resources) that cannot be first, last, or contiguous - * Example: `2044 (⁄) FRACTION SLASH` -* **Emoji Sequence(s)** (`"emoji"`) — valid [emoji sequences](#appendix-additional-resources) - * Example: `👨‍💻 [1F468 200D 1F4BB] man technologist` -* **Combining Marks / CM** (`"cm"`) — [characters](#appendix-additional-resources) that are [Combining Marks](https://unicode.org/faq/char_combmark.html) -* **Non-spacing Marks / NSM** (`"nsm"`) — valid [subset](#appendix-additional-resources) of **CM** with general category (`"Mn"` or `"Me"`) -* **Maximum NSM** (`"nsm_max"`) — maximum sequence length of unique **NSM** -* **Should Escape** (`"escape"`) — [characters](#appendix-additional-resources) that shouldn't be printed -* **NFC Check** (`"nfc_check"`) — valid [subset](#appendix-additional-resources) of characters that [may require NFC](https://unicode.org/reports/tr15/#NFC_QC_Optimization) - -## Description of `nf.json` - -* `"decomp"` — [mapping](https://www.unicode.org/reports/tr44/tr44-30.html#Character_Decomposition_Mappings) from a composed character to a sequence of (partially)-decomposed characters - * [`UnicodeData.txt`](https://www.unicode.org/reports/tr44/tr44-30.html#UnicodeData.txt) where `Decomposition_Mapping` exists and does not have a [formatting tag](https://www.unicode.org/reports/tr44/tr44-30.html#Formatting_Tags_Table) -* `"exclusions"` — set of characters for which the `"decomp"` mapping is not applied when forming a composition - * [`CompositionExclusions.txt`](https://www.unicode.org/reports/tr44/tr44-30.html#CompositionExclusions.txt) -* `"ranks"` — sets of characters with increasing [`Canonical_Combining_Class`](https://www.unicode.org/reports/tr44/tr44-30.html#Canonical_Combining_Class_Values) - * [`UnicodeData.txt`](https://www.unicode.org/reports/tr44/tr44-30.html#UnicodeData.txt) grouped by `Canonical_Combining_Class` - * Class `0` is not included -* `"qc"` — set of characters with property [`NFC_QC`](https://www.unicode.org/reports/tr44/tr44-30.html#Decompositions_and_Normalization) of value `N` or `M` - * [`DerivedNormalizationProps.txt`](https://www.unicode.org/reports/tr44/tr44-30.html#DerivedNormalizationProps.txt) - * **NFC Check** (from [`spec.json`](#description-of-specjson)) is a subset of this set - -## Derivation - -* [IDNA 2003](https://unicode.org/Public/idna/15.1.0/IdnaMappingTable.txt) - * `UseSTD3ASCIIRules` is **`true`** - * `VerifyDnsLength` is **`false`** - * `Transitional_Processing` is **`false`** - * The following [deviations](https://unicode.org/reports/tr46/#Table_Deviation_Characters) are **valid**: - * `DF (ß) LATIN SMALL LETTER SHARP S` - * `3C2 (ς) GREEK SMALL LETTER FINAL SIGMA` - * `CheckHyphens` is **`false`** ([WHATWG URL Spec § 3.3](https://url.spec.whatwg.org/#idna)) - * `CheckBidi` is **`false`** - * [ContextJ](https://datatracker.ietf.org/doc/html/rfc5892#appendix-A.1): - * `200C (�) ZERO WIDTH NON-JOINER` (ZWNJ) is **disallowed everywhere**. - * `200D (�) ZERO WIDTH JOINER` (ZWJ) is **only allowed** in emoji sequences. - * [ContextO](https://datatracker.ietf.org/doc/html/rfc5892#appendix-A.3): - * `B7 (·) MIDDLE DOT` is **disallowed**. - * `375 (͵) GREEK LOWER NUMERAL SIGN` is **disallowed**. - * `5F3 (׳) HEBREW PUNCTUATION GERESH` and `5F4 (״) HEBREW PUNCTUATION GERSHAYIM` are *Greek*. - * `30FB (・) KATAKANA MIDDLE DOT` is **Fenced** and *Han*, *Japanese*, *Korean*, and *Bopomofo*. - * Some [Extended Arabic Numerals](https://en.wikipedia.org/wiki/Arabic_numerals) are **mapped**: - * `6F0 (۰)` → `660 (٠) ARABIC-INDIC DIGIT ZERO` - * `6F1 (۱)` → `661 (١) ARABIC-INDIC DIGIT ONE` - * `6F2 (۲)` → `662 (٢) ARABIC-INDIC DIGIT TWO` - * `6F3 (۳)` → `663 (٣) ARABIC-INDIC DIGIT THREE` - * `6F7 (۷)` → `667 (٧) ARABIC-INDIC DIGIT SEVEN` - * `6F8 (۸)` → `668 (٨) ARABIC-INDIC DIGIT EIGHT` - * `6F9 (۹)` → `669 (٩) ARABIC-INDIC DIGIT NINE` -* [Punycode](https://datatracker.ietf.org/doc/html/rfc3492) is not decoded. -* The following ASCII characters are **valid**: - * `24 ($) DOLLAR SIGN` - * `5F (_) LOW LINE` with [restrictions](#validate) -* Only label separator is `2E (.) FULL STOP` - * No character maps to this character. - * This simplifies name detection in unstructured text. - * The following alternatives are **disallowed**: - * `3002 (。) IDEOGRAPHIC FULL STOP` - * `FF0E (.) FULLWIDTH FULL STOP` - * `FF61 (。) HALFWIDTH IDEOGRAPHIC FULL STOP` -* [Many characters](#appendix-additional-resources) are **disallowed** for various reasons: - * Nearly all punctuation are **disallowed**. - * Example: `589 (։) ARMENIAN FULL STOP` - * All parentheses and brackets are **disallowed**. - * Example: `2997 (⦗) LEFT BLACK TORTOISE SHELL BRACKET` - * Nearly all vocalization annotations are **disallowed**. - * Example: `294 (ʔ) LATIN LETTER GLOTTAL STOP` - * Obsolete, deprecated, and ancient characters are **disallowed**. - * Example: `463 (ѣ) CYRILLIC SMALL LETTER YAT` - * Combining, modifying, reversed, flipped, turned, and partial variations are **disallowed**. - * Example: `218A (↊) TURNED DIGIT TWO` - * When multiple weights of the same character exist, the variant closest to "heavy" is selected and the rest **disallowed**. - * Example: `🞡🞢🞣🞤✚🞥🞦🞧` → `271A (✚) HEAVY GREEK CROSS` - * This occasionally selects an emoji. - * Example: ✔️ or `2714 (✔︎) HEAVY CHECK MARK` is selected instead of `2713 (✓) CHECK MARK` - * Many visually confusable characters are **disallowed**. - * Example: `131 (ı) LATIN SMALL LETTER DOTLESS I` - * Many ligatures, *n*-graphs, and *n*-grams are **disallowed.** - * Example: `A74F (ꝏ) LATIN SMALL LETTER OO` - * Many esoteric characters are **disallowed**. - * Example: `2376 (⍶) APL FUNCTIONAL SYMBOL ALPHA UNDERBAR` -* Many hyphen-like characters are **mapped** to `2D (-) HYPHEN-MINUS`: - * `2010 (‐) HYPHEN` - * `2011 (‑) NON-BREAKING HYPHEN` - * `2012 (‒) FIGURE DASH` - * `2013 (–) EN DASH` - * `2014 (—) EM DASH` - * `2015 (―) HORIZONTAL BAR` - * `2043 (⁃) HYPHEN BULLET` - * `2212 (−) MINUS SIGN` - * `23AF (⎯) HORIZONTAL LINE EXTENSION` - * `23E4 (⏤) STRAIGHTNESS` - * `FE58 (﹘) SMALL EM DASH` - * `2E3A (⸺) TWO-EM DASH` → `"--"` - * `2E3B (⸻) THREE-EM DASH` → `"---"` -* Characters are assigned to **Groups** according to [Unicode Script_Extensions](https://www.unicode.org/reports/tr24/#Script_Extensions_Def). -* **Groups** may contain [multiple scripts](#appendix-additional-resources): - * Only *Latin*, *Greek*, *Cyrillic*, *Han*, *Japanese*, and *Korean* have access to *Common* characters. - * *Latin*, *Greek*, *Cyrillic*, *Han*, *Japanese*, *Korean*, and *Bopomofo* only permit specific **Combining Mark** sequences. - * *Han*, *Japanese*, and *Korean* have access to `a-z`. - * **Restricted** groups are always single-script. - * [Unicode augmented script sets](https://www.unicode.org/reports/tr39/#Mixed_Script_Detection) -* Scripts *Braille*, *Linear A*, *Linear B*, and *Signwriting* are **disallowed**. -* `27 (') APOSTROPHE` is **mapped** to `2019 (’) RIGHT SINGLE QUOTATION MARK` for convenience. -* Ethereum symbol (`39E (Ξ) GREEK CAPITAL LETTER XI`) is case-folded and *Common*. -* Emoji: - * All emoji are [fully-qualified](https://www.unicode.org/reports/tr51/#def_fully_qualified_emoji). - * Digits (`0-9`) are [not emoji](#appendix-additional-resources). - * Emoji [mapped to non-emoji by IDNA](#appendix-additional-resources) cannot be used as emoji. - * Emoji [disallowed by IDNA](#appendix-additional-resources) with default text-presentation are **disabled**: - * `203C (‼️) double exclamation mark` - * `2049 (⁉️) exclamation question mark ` - * Remaining emoji characters are marked as **disallowed** (for text processing). - * All `RGI_Emoji_ZWJ_Sequence` are **enabled**. - * All `Emoji_Keycap_Sequence` are **enabled**. - * All `RGI_Emoji_Tag_Sequence` are **enabled**. - * All `RGI_Emoji_Modifier_Sequence` are **enabled**. - * All `RGI_Emoji_Flag_Sequence` are **enabled**. - * `Basic_Emoji` of the form `[X FE0F]` are **enabled**. - * Emoji with default emoji-presentation are **enabled** as `[X FE0F]`. - * Remaining single-character emoji are **enabled** as `[X FE0F]` (explicit emoji-presentation). - * All singular Skin-color Modifiers are **disabled**. - * All singular Regional Indicators are **disabled**. - * Blacklisted emoji are **disabled**. - * Whitelisted emoji are **enabled**. -* Confusables: - * Nearly all [Unicode Confusables](https://www.unicode.org/Public/security/15.1.0/confusables.txt) - * Emoji are not confusable. - * ASCII confusables are case-folded. - * Example: `61 (a) LATIN SMALL LETTER A` confuses with `13AA (Ꭺ) CHEROKEE LETTER GO` - -## Backwards Compatibility - -* 99% of names are still valid. -* Preserves as much [Unicode IDNA](https://unicode.org/reports/tr46/) and [WHATWG URL](https://url.spec.whatwg.org/#idna) compatibility as possible. -* Only [valid emoji sequences](#appendix-additional-resources) are permitted. - -## Security Considerations - -* Unicode presentation may vary between applications and devices. - * Unicode text is ultimately subject to font-styling and display context. - * Unsupported characters (`�`) may appear unremarkable. - * Normalized single-character emoji sequences do not retain their explicit emoji-presentation and may display with [text or emoji](https://www.unicode.org/reports/tr51/#Presentation_Style) presentation styling. - * `❤︎` — text-presentation and default-color - * `❤︎` — text-presentation and green-color - * `❤️` — emoji-presentation and green-color - * Unsupported emoji sequences with ZWJ may appear indistinguishable from those without ZWJ. - * `💩💩 [1F4A9 1F4A9]` - * `💩‍💩 [1F4A9 200D 1F4A9]` → *error: Disallowed character* -* Names composed of labels with varying bidi properties [may appear differently](https://discuss.ens.domains/t/bidi-label-ordering-spoof/15824) depending on context. - * Normalization does not enforce single-directional names. - * Names may be composed of labels of different directions but normalized labels are never bidirectional. - * [LTR].[RTL] `bahrain.مصر` - * [LTR+RTL] `bahrainمصر` → *error: Illegal mixture: Latin + Arabic* -* Not all normalized names are visually unambiguous. -* This ENSIP only addresses **single-character** [confusables](https://www.unicode.org/reports/tr39/). - * There exist confusable **multi-character** sequences: - * `"ஶ்ரீ" [BB6 BCD BB0 BC0]` - * `"ஸ்ரீ" [BB8 BCD BB0 BC0]` - * There exist confusable emoji sequences: - * `🚴 [1F6B4]` and `🚴🏻 [1F6B4 1F3FB]` - * `🇺🇸 [1F1FA 1F1F8]` and `🇺🇲 [1F1FA 1F1F2]` - * `♥ [2665] BLACK HEART SUIT` and `❤ [2764] HEAVY BLACK HEART` - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). - -## Appendix: Reference Specifications - -* [EIP-137: Ethereum Domain Name Service](https://eips.ethereum.org/EIPS/eip-137) -* [ENSIP-1: ENS](./1) -* [UAX-15: Normalization Forms](https://unicode.org/reports/tr15/) -* [UAX-24: Script Property](https://www.unicode.org/reports/tr24/) -* [UAX-29: Text Segmentation](https://unicode.org/reports/tr29/) -* [UAX-31: Identifier and Pattern Syntax](https://www.unicode.org/reports/tr31/) -* [UTS-39: Security Mechanisms](https://www.unicode.org/reports/tr39/) -* [UAX-44: Character Database](https://www.unicode.org/reports/tr44/) -* [UTS-46: IDNA Compatibility Processing](https://unicode.org/reports/tr46/) -* [UTS-51: Emoji](https://www.unicode.org/reports/tr51) -* [RFC-3492: Punycode](https://datatracker.ietf.org/doc/html/rfc3492) -* [RFC-5891: IDNA: Protocol](https://datatracker.ietf.org/doc/html/rfc5891) -* [RFC-5892: The Unicode Code Points and IDNA](https://datatracker.ietf.org/doc/html/rfc5892) -* [Unicode CLDR](https://github.com/unicode-org/cldr) -* [WHATWG URL: IDNA](https://url.spec.whatwg.org/#idna) - -## Appendix: Additional Resources - -* [Supported Groups](https://github.com/adraffy/ens-normalize.js/blob/main/tools/ensip/groups.md) -* [Supported Emoji](https://github.com/adraffy/ens-normalize.js/blob/main/tools/ensip/emoji.md) -* [Additional Disallowed Characters](https://github.com/adraffy/ens-normalize.js/blob/main/tools/ensip/disallowed.csv) -* [Ignored Characters](https://github.com/adraffy/ens-normalize.js/blob/main/tools/ensip/ignored.csv) -* [Should Escape Characters ](https://github.com/adraffy/ens-normalize.js/blob/main/tools/ensip/escape.csv) -* [Combining Marks](https://github.com/adraffy/ens-normalize.js/blob/main/tools/ensip/cm.csv) -* [Non-spacing Marks](https://github.com/adraffy/ens-normalize.js/blob/main/tools/ensip/nsm.csv) -* [Fenced Characters](https://github.com/adraffy/ens-normalize.js/blob/main/tools/ensip/fenced.csv) -* [NFC Quick Check](https://github.com/adraffy/ens-normalize.js/blob/main/tools/ensip/nfc_check.csv) - -## Appendix: Validation Tests - -A list of [validation tests](https://github.com/adraffy/ens-normalize.js/blob/main/validate/tests.json) are provided with the following interpretation: - -* Already Normalized: `{name: "a"}` → `normalize("a")` is `"a"` -* Need Normalization: `{name: "A", norm: "a"}` → `normalize("A")` is `"a"` -* Expect Error: `{name: "@", error: true}` → `normalize("@")` throws - -## Annex: Beautification - -Follow [algorithm](#algorithm), except: - -* Do not strip `FE0F` from `Emoji` tokens. -* Replace `3BE (ξ) GREEK SMALL LETTER XI` with `39E (Ξ) GREEK CAPITAL LETTER XI` if the label isn't *Greek*. -* Example: `normalize("‐Ξ1️⃣") [2010 39E 31 FE0F 20E3]` is `"-ξ1⃣" [2D 3BE 31 20E3]` -* Example: `beautify("-ξ1⃣") [2D 3BE 31 20E3]"` is `"-Ξ1️⃣" [2D 39E 31 FE0F 20E3]` diff --git a/src/pages/ensip/16.mdx b/src/pages/ensip/16.mdx deleted file mode 100644 index 7713a5a4b..000000000 --- a/src/pages/ensip/16.mdx +++ /dev/null @@ -1,190 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Allows metadata to be queried on EIP-3668 enabled names', - contributors: [ - // Jeff Lau - 'jefflau', - // Makoto Inoue - 'makoto' - ], - ensip: { - status: 'draft', - created: '2022-09-22', - } -}; - -# ENSIP-16: Offchain Metadata - -## Abstract - -This ENSIP specifies APIs for querying metadata directly on the resolver for EIP-3668 (CCIP Read: Secure offchain data retrieval) enabled names. EIP-3668 will power many of the domains in the future, however since the retrieval mechanism uses wildcard + offchain resolver, there is no standardised way to retrieve important metadata information such as the owner (who can change the records), or which L2/offchain database the records are stored on. - -## Motivation - -With EIP-3668 subdomains already starting to see wide adoption, it is important that there is a way for frontend interfaces to get important metadata to allow a smooth user experience. For instance a UI needs to be able to check if the currently connected user has the right to update an EIP-3668 name. - -This ENSIP addresses this by adding a way of important metadata to be gathered on the offchain resolver, which would likely revert and be also resolved offchain, however there is an option for it to be also left onchain if there value was static and wouldn't need to be changed often. - -## Specification - -The metadata should include 2 different types of info - -- Offchain data storage location related info: `graphqlUrl` includes the URL to fetch the metadata. - -- Ownership related info: `owner`, `isApprovedForAll` defines who can own or update the given record. - -### Context - -An optional field "context" is introduced by utilizing an arbitrary bytes string to define the namespace to which a record belongs. - -For example, this "context" can refer to the address of the entity that has set a particular record. By associating records with specific addresses, users can confidently manage their records in a trustless manner on Layer 2 without direct access to the ENS Registry contract on the Ethereum mainnet. Please refer to [ENS-Bedrock-Resolver](https://github.com/corpus-io/ENS-Bedrock-Resolver#context) for the reference integration - -### Dynamic Metadata - -Metadata serves a crucial role in providing valuable insights about a node owner and their specific resolver. In certain scenarios, resolvers may choose to adopt diverse approaches to resolve data based on the node. An example of this would be handling subdomains of a particular node differently. For instance, we could resolve "optimism.foo.eth" using a contract on optimism and "gnosis.foo.eth" using a contract on gnosis. -By passing the name through metadata, we empower the resolution process, enabling CcipResolve flows to become remarkably flexible and scalable. This level of adaptability ensures that our system can accommodate a wide array of use cases, making it more user-friendly and accommodating for a diverse range of scenarios. - -## Implementation - -### L1 - -```solidity -// To be included in -// https://github.com/ensdomains/ens-contracts/blob/staging/contracts/resolvers/Resolver.sol -interface IOffChainResolver { - /** @dev Returns the owner of the resolver on L2 - * @param node - * @return owner in bytes32 instead of address to cater for non EVM based owner information - */ - owner(bytes32 node) returns (bytes owner); - - // optional. - // this returns data via l2 with EIP-3668 so that non EVM chains can also return information of which address can update the record - // The same function name exists on L2 where delegate returns address instead of bytes - function isApprovedFor(bytes context, bytes32 node, bytes delegate) returns (bool); - - /** @dev Returns the metadata of the resolver on L2 - * @return graphqlUrl url of graphql endpoint that provides additional information about the offchain name and its subdomains - */ - function metadata(bytes calldata name) - external - view - returns (string memory) - { - return (graphqlUrl); - } - - // Optional. If context is dynamic, the event won't be emitted. - event MetadataChanged( - string name, - string graphqlUrl, - ); -} -``` - -### L2 (EVM compatible chain only) - -```solidity -// To be included in the contract returned by `metadata` function `storageLocation` -interface IL2Resolver { - /** - * @dev Check to see if the delegate has been approved by the context for the node. - * - * @param context = an arbitrary bytes string to define the namespace to which a record belongs such as the name owner. - * @param node - * @param delegate = an address that is allowed to update record under context - */ - function isApprovedFor(bytes context,bytes32 node,address delegate) returns (bool); - - event Approved( - bytes context, - bytes32 indexed node, - address indexed delegate, - bool indexed approved - ); -} -``` - -```javascript -const node = namehash('ccipreadsub.example.eth') -const resolver = await ens.resolver(node) -const owner = await resolver.owner(node) -// 0x123... -const dataLocation = await.resolver.graphqlUrl() -// { -// url: 'http://example.com/ens/graphql', -// } -``` - -#### GraphQL schema - -[GraphQL](https://graphql.org) is a query language for APIs and a runtime for fulfilling those queries with onchain event data. You can use the hosted/decentralised indexing service such as [The Graph](https://thegraph.com), [Goldsky](https://docs.goldsky.com/introduction), [QuickNode](https://marketplace.quicknode.com/add-on/subgraph-hosting) or host your own using The Graph, or [ponder](https://ponder.sh) - -#### L1 - -`Metadata` is an optional schema that indexes `MetadataChanged` event. - -```graphql - -type Domain @entity{ - id - metadata: Metadata -} - -type Metadata @entity { - "l1 resolver address" - id: ID! - "Name of the Chain" - name: String - "url of the graphql endpoint" - graphqlUrl: String -} - -``` - -#### L2 - -L2 graphql URL is discoverable via `metadata` function `graphqlUrl` field. -Because the canonical ownership of the name exists on L1, some L2/offchain storage may choose to allow multiple entities to update the same node namespaced by `context`. When querying the domain data, the query should be filtered by `context` that is returned by `metadata`function `context` field - -```graphql -type Domain { - id: ID! # concatenation of context and namehash delimited by `-` - context: Bytes - name: String - namehash: Bytes - labelName: String - labelhash: Bytes - resolvedAddress: Bytes - parent: Domain - subdomains: [Domain] - subdomainCount: Int! - resolver: Resolver! - expiryDate: BigInt -} - -type Resolver @entity { - id: ID! # concatenation of node, resolver address and context delimited by `-` - node: Bytes - context: Bytes - address: Bytes - domain: Domain - addr: Bytes - contentHash: Bytes - texts: [String!] - coinTypes: [BigInt!] -} -``` - -## Backwards Compatibility - -None - -## Open Items - -- Should `owner` and `isApprovedForAll` be within graphql or should be own metadata function? - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). - diff --git a/src/pages/ensip/17.mdx b/src/pages/ensip/17.mdx deleted file mode 100644 index b7a1961d6..000000000 --- a/src/pages/ensip/17.mdx +++ /dev/null @@ -1,120 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: '', - contributors: [ - 'arachnid', - ], - ensip: { - status: 'draft', - created: '2024-02-09', - } -}; - -# ENSIP-17: Gasless DNS Resolution - -## Abstract - -This standard describes a mechanism by which users can specify ENS resolvers and resolution data as DNS TXT records, resulting in a system where DNS names are resolvable in ENS with no onchain actions required. - -## Motivation - -ENS has had DNS integration for some time, facilitated by the ability to prove the contents of a DNS TXT record onchain, and thereby claim the corresponding name in the ENS registry. This has several shortcomings, the most notable of which is the high transaction fees associated, as verifying a DNSSEC proof often costs in excess of 1,000,000 gas. - -Wildcard resolution (ENSIP-10) and CCIP-Read (EIP-3668) now permit a new approach, by which DNSSEC proofs are fetched and verified at resolution time instead. This permits users to enable ENS resolution of their names simply by setting a TXT record on their DNS name and enabling DNSSEC. - -## Specification - -A new resolver, `OffchainDNSResolver`, is deployed and set as the resolver for all DNS TLDs; this resolver will be consulted whenever resolution is attempted for a nonexistent subdomain of these TLDs. The resolver then initiates a CCIP-Read request to a gateway which fetches and returns DNSSEC proofs for TXT records on that name. In the CCIP-Read callback function, the resolver verifies the DNSSEC proofs using an updated version of the DNSSEC oracle, and if they verify correctly, decodes the address of a resolver and optional extra data from the TXT record. The resolution request is then completed by invoking the resolver, optionally passing the extra data contained in the TXT record to enable it to vary its response dynamically. - -### TXT record format - -Compliant TXT records MUST adhere to this format: - -```ts -ENS1 [context] -``` - -Where: - - `ENS1` is a fixed string, identifying this TXT record as a gasless ENS record. - - `resolver-name-or-address` is either the 0x-prefixed hexadecimal address or the ENS name of the resolver to use to resolve queries for this name. If an ENS name is supplied, the name MUST be resolvable without using ENSIP-10 - meaning that the name MUST have a resolver set in the ENS registry, and the resolver MUST implement the `addr` function, which MUST NOT initiate a CCIP-Read request using `OffchainData`. - - `context` is arbitrary additional data that may be passed to the resolver to complete the request (see below). - -### Resolution Process - -#### Summary - -The `OffchainDNSResolver` decodes or resolves the address of the resolver to use from `resolver-name-or-address`, and calls whichever of `IExtendedDNSResolver.resolve`, `IExtendedResolver.resolve` or a legacy resolution function is first supported. If either `resolve` function is invoked, nested CCIP-Read requests are handled correctly. - -#### Detailed Description - -`OffchainDNSResolver` implements `resolve` by initiating a CCIP-Read request, reverting with `OffchainLookup` and specifying the address of a CCIP-Read gateway capable of fetching and returning DNSSEC signed DNS records. The callback function for the CCIP-Read request implements the following logic: - - 1. Use the DNSSEC oracle to verify the returned RRSet. If verification fails, revert. - 2. For each record in the returned RRSet: - 1. Check if the RR name matches the name being resolved and the record type is TXT. If either check fails, continue to the next record. - 2. Check if the first field in the TXT record starts with `ENS1 `. If not, continue to the next record. - 3. Decode `resolver-name-or-address` and `context` from the text record. - 4. If `resolver-name-or-address` contains a `.` character: - 1. Compute the namehash of `resolver-name-or-address`. - 2. Call `resolver(bytes32)` on the registry, passing in the namehash. If the registry returns `0`, continue to the next TXT record. - 3. Call `addr(bytes32)` on the resolver address returned in step ii. If the resolver returns `0`, continue to the next TXT record. - 4. Treat the returned address as the resolver address to use in subsequent steps. - 5. If `resolver-name-or-address` does not contain a '.' character, treat it as a hexadecimal address and decode it. Treat the decoded address as the resolver address to use in subsequent steps. - 6. Using ERC165, check if the returned resolver supports `IExtendedDNSResolver`. If it does, call `resolve(bytes name, bytes query, bytes context)`, passing `context` from the TXT record as the last argument. The call to `resolve` may use CCIP-Read; if it does, reverts will be handled appropriately. Return the result of this call as the result of the initial resolution request and halt. - 7. Using ERC165, check if the returned resolver supporst `IExtendedResolver`. If it does, call `resolve(bytes name, bytes query)`. The call to `resolve` may use CCIP-Read; if it does, reverts will be handled appropriately. Return the result of this call as the result of the initial resolution request and halt. - 8. Otherwise, call the resolver with calldata equal to the `query` originally supplied to `OffchainDNSResolver.resolve` and return its result as the result of the initial resolution request and halt. This resolution path does NOT support nested CCIP-Read requests. - -The `IExtendedDNSResolver` interface is defined as follows: - -```go -interface IExtendedDNSResolver { - function resolve( - bytes memory name, - bytes memory data, - bytes memory context - ) external view returns (bytes memory); -``` - -This acts as an extension of `IExtendedResolver` defined in ENSIP-10, providing the additional `context` argument, containing any supplementary data from the TXT record. - -Note that a TXT record may contain multiple text fields; in this implementation only the first field of each TXT record is considered. TXT record fields are limited to a maximum of 255 bytes each. - -### DNSSEC Gateway API - -The DNSSEC Gateway implements the following API over CCIP-Read: - -```go -struct RRSetWithSignature { - bytes rrset; - bytes sig; -} - -interface IDNSGateway { - function resolve( - bytes memory name, - uint16 qtype - ) external returns (RRSetWithSignature[] memory); -} -``` - -Where: - - `name` is a DNS-encoded name to query. - - `qtype` is a DNS QTYPE as defined in RFC1034 - for example, `TXT` = 16. - -The returned `rrset`s are in the format described in section 5.3.2 of RFC4035: The RRDATA section from the RRSIG without the signature data, followed by a series of canonicalised RR records that the signature applies to. One RRSET is returned for each step in the chain of trust, starting with the DNSKEY RRSET for the DNS root `.`, and ending with the requested RRSET, if it exists. - -A Solidity DNSSEC implementation for decoding and verifying RRSET data is available at https://github.com/ensdomains/ens-contracts/blob/staging/contracts/dnssec-oracle/. - -## Backwards Compatibility - -DNS names imported using the existing functionality will continue to function as before, and new names can still be imported using the DNS import functionality. If an imported name exists, it is used to resolve the request, and any TXT records for gasless DNSSEC are ignored. If desired, the owner of the name can set the resolver to `address(0)` to cause resolution to fall back to gasless DNSSEC. - -## Security Considerations - -Gasless DNSSEC relies on a gateway and CCIP-Read to fetch cryptographic proofs of the chain of trust between the DNS root and the desired text record. It uses the same code, and hence has the same trust model, as the DNS import functionality; forging a DNS record would require access to a signing key somewhere in the chain of trust between DNS root and the record in question. - -Due to the use of a gateway service to generate responses, there is additional risk of unavailability: the gateway could be out of operation, or could choose to selectively refuse to answer (censor) certain queries. - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/18.mdx b/src/pages/ensip/18.mdx deleted file mode 100644 index 0d109914d..000000000 --- a/src/pages/ensip/18.mdx +++ /dev/null @@ -1,182 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'A standard for profile information as text records in ENS', - contributors: [ - 'TateB', - 'adraffy', - 'galligan', - ], - ensip: { - status: 'draft', - created: '2023-08-02', - } -}; - -# ENSIP-18: Profile Text Records - -## Abstract - -This ENSIP which extends [ENSIP-5: Text Records](ensip-5-text-records.md) defines a set of text records that should be used for profile information, along with the format that each should have. - -## Motivation - -ENS names have become increasingly popular to use as an identifying profile across the Ethereum ecosystem. Although many apps have started integrating ENS "profiles", the only defined global text record keys are in ENSIP-5. These global keys were defined based on the usecase of ENS names at the time, and were not created with profiles in mind. - -This specification extends the existing set of global keys, as well as creating a new subset within global keys called "profile keys". - -## Specification - -The Profile Keys are a subset of Global Keys, the newly defined global keys are specified in the "Global Keys" section. - -### Profile Keys - -#### `alias` - -**Description:** A display alias - -**Format:** Any text - -**Example:** `ENS` - -**Design Considerations:** This should be displayed near the ENS name, but should not be displayed as a replacement for it and should be below it in the visual hierarchy. You can also choose not to show the alias at all. - -#### `theme` - -**Description:** A user customised theme to use - -**Format:** An array of comma separated hex colours. -Order should be as follows: `,,,,`. -Colours can be full or half length hex codes (e.g. `FFFFFF`, or `FFF`). A colour scheme can be incomplete but still valid by skipping a value similar to CSV (e.g. `000000,,F6F6F6,FFFFFF,FFF700`) - -**Example:** `3889FF,000,F6F6F6,FFFFFF,FFF700` - -**Design Considerations:** These colours can be used wherever a profile context is used (e.g. more than just the name), but separate colour schemes should never be used together on the same page. The scheme can also be extended to site-wide themability based on the primary name of the connected wallet. Selected accent and text colours should maintain a 4.5:1 contrast ratio against the selected background colour. Contrast ratio should be validated on record submission, as well as retrieval. If on retrieval colours do not meet the required contrast ratio, they should not be used. If the context requires that colours from a specific theme be used (e.g. an app theme), you can use the closest match to a colour in the theme. - -**Other Notes:** If allowing a user to select a theme that is specific to one vendor (e.g. `com.example`), you should use a vendor specific version of this record e.g. `com.example.theme` - -#### `avatar` - -**Description:** An avatar image - -**Format:** See [ENSIP-12: Avatar Text Records](ensip-12-avatar-text-records.md) - -**Example:** See [ENSIP-12: Avatar Text Records](ensip-12-avatar-text-records.md) - -**Design Considerations:** This should be displayed next to the ENS name wherever possible. The image should be displayed with an aspect ratio of 1:1. If the source doesn't match the target ratio, the image should be cropped from the centre to fill the ratio. The image should not have any visible blank space. - -#### `header` - -**Description:** A header image - -**Format:** See [ENSIP-12: Avatar Text Records](ensip-12-avatar-text-records.md) - -**Example:** See [ENSIP-12: Avatar Text Records](ensip-12-avatar-text-records.md) - -**Design Considerations:** This should be displayed above all other profile content, or not at all. The image should be displayed with an aspect ratio of between 3:1 and 6:1. If the source doesn't match the target ratio, the image should be cropped from the centre to fill the ratio. The image should not have any visible blank space. - -#### `email` - -**Description:** An email that can be used as contact - -**Format:** Standard email address - -**Example:** `test@example.com` - -**Design Considerations:** None. - -#### `description` - -**Description:** A biography - -**Format:** Any string not exceeding 160 characters in length. - -**Example:** `Human readable names for Ethereum.` - -**Design Considerations:** None. - -#### `location` - -**Description:** A location - -**Format:** Any location, if location is layered should use `, ` for separation (e.g. `Melbourne, Australia`) - -**Example:** `Melbourne, Australia` - -**Design Considerations:** This value should not be assumed to be real coordinates or properly formatted place, as it may be a non-existent location - -#### `url` - -**Description:** A website URL - -**Format:** Any valid HTTP or HTTPS link. - -**Example:** `https://ens.domains` - -**Design Considerations:** This link should be clickable, and wherever possible shown at the bottom of the profile. - -#### `timezone` - -**Description:** A timezone - -**Format:** Any timezone name from the [tz database](https://www.iana.org/time-zones). Follows `/[/]` - -**Example:** `Australia/Melbourne` - -**Design Considerations:** None. - -#### `language` - -**Description:** A language - -**Format:** A two letter language code from [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes). - -**Example:** `en` - -**Design Considerations:** None. - -#### `primary-contact` - -**Description:** The record key for a primary contact - -**Format:** `email`, or any existing profile service key - -**Example:** `com.github` - -**Design Considerations:** When resolving `primary-contact` for a profile, the value should resolve to the service (which could be logo or name) and the corresponding value. Direct links to the service should be supported on a best-effort basis (e.g. `com.github` => `https://github.com/`) - -### Global Keys - -Profile Keys are a subset of Global Keys, therefore these global keys extend the existing global keys defined in ENSIP-5. - -- `alias` -- `theme` -- `header` -- `timezone` -- `language` -- `primary-contact` - -#### Profile Service Keys - -A profile service key is a profile key derived from the root of the service's domain. E.g. `com.github`, `org.telegram`, etc. - -When creating a profile service key record, the value should be **void of optional service-specific formatting** such as prefixes like `/u/` or `@`. - -In the case that the value is always displayed in a certain format, the formatting may be kept. However, any parsing or processing done on said value should attempt to be compatible with values that do not have the formatting applied. - -### Image files - -When **setting** an image for an avatar or header, it is **strongly recommended** to limit the file size to an absolute maximum of 10MB. The image being set should be validated against this limit, whether it is a URL, or an NFT. Ideally, if creating an image to be set on behalf of the user, the file size should be limited to 2MB. Additionally, maintainers of image endpoints should support dimensions of images to be limited via query string `?width={width}&height={height}` wherever possible. - -When **retrieving** an image for an avatar or header, images should attempt to be loaded if 10MB or less in file size. Loading images above 10MB is not required, but ideally loading should still be attempted. If retrieving an image via URL, a query string can be optionally appended to the URL to limit the dimensions via `?width={width}&height={height}`. However, the query string may have no effect. - -## Backwards Compatibility - -The `alias` key replaces the pre-existing `name` key. When displaying an alias, you should consider also resolving the `name` key and displaying it, if `alias` is not available. - -## Security Considerations - -None. - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/19.mdx b/src/pages/ensip/19.mdx deleted file mode 100644 index 58439b496..000000000 --- a/src/pages/ensip/19.mdx +++ /dev/null @@ -1,110 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Specifies reverse resolution in a cross-chain context', - contributors: [ - 'jefflau.eth', - ], - ensip: { - status: 'draft', - created: '2023-03-14', - } -}; - -# ENSIP-19: EVM-chain Reverse Resolution - -## Abstract - -This ENSIP specifies a way for reverse resolution to be used on other EVM chains. This allows setting primary names on L2s, as well as resolving any other records set on this specific reverse record, such as the avatar. - -## Motivation - -Reverse resolution has been in use since ENS's inception, however at the time Ethereum had no concrete scaling plans. In the past 5 years, we've seen layer 2s and sidechains become more prevalent and we first allowed support for these with ENSIP-9 (formerly EIP-2304) to allow addresses from other chains to be stored on ENS. To complete support for other EVM chains, reverse resolution needs to be expanded to allow reverse resolution to also exist. - -## Specification - -### Overview - -* Reverse registrars will be setup on each EVM-chain, with a corresponding registry -* Reverse registrar will only allow setting the name and text record without resolver customisability. - This is to allow a consistent storage slot that can be checked on L1. -* User can now claim their reverse on this chain and set it to their ENS name -* Their ENS name will need to set their record for the same EVM-cointype as the network, which is specified in [ENSIP-11](https://docs.ens.domains/ensip/11). -* A dapp can then detect the chainID that a user is on, convert that into coinType in hexadecimal and resolve their primary ens name by resolving the name record at `[userAddress].[coinTypeAsHex].reverse`. This will be resolved via a CCIP-read gateway and look up the reverse record on the corresponding EVM-chain. Depending on if the chain is an L2 that has state roots on L1 or sidechain, verification can be done with trusted signatures or trustlessly on Ethereum mainnet. -* Dapps will then resolve this name via ENS on L1 to check if the forward resolution matches. This forward resolution can be on L1, or the user can set up a CCIP-read resolver and records for each network and put those addresses wherever they want (such as on another L2) -* Once matched, the dapp can then also resolve any text records on the primary ENS name, such as avatar. -* Discovery of the reverse registrar on each chain will be done by looking up the `addr()` of `[coinTypeAsHex].reverse`. -* coinType in all instances will be the hex representation to reduce the length of the name - -### Deployment and discovery of EVM Reverse registrars - -When a new EVM reverse registrar is deployed, it will need to be setup by the owner of the `reverse` node, to setup a subdomain [coinTypeAsHex].reverse. It must then be setup with an Offchain resolver that has an onchain L1 address record that return the contract address of the reverse registrar for that chain. The Offchain resolver will also support wildcard of all the address subdomains with the format `[address].[coinTypeAsHex].reverse`. Additionally there must be a new EVM gateway setup to handle the CCIP-read revert errors that will go to the corresponding network to gather the chain-specific reverse record and verify this data on L1. - -### Resolving Primary ENS Names by a dapp - -Below is a step-by-step resolution process of ENS reverse resolution. A dapp must adhere to these rules to be compliant with the reverse resolution process. This reverse resolution process adds on to ENSIP-3's original reverse resolution process and will act as a replacement for applications that support Primary ENS names on multiple chains. - -#### Glossary of terms - -* `[address]` is the lowercase hexadecimal representation of an Ethereum address with prefix `0x` removed. - -* `coinType` for chain ids is derived using [ENSIP-11](https://docs.ens.domains/ensip/11) by ORing the chainId with `0x80000000` - -* `coinTypeAsHex` is the cointype converted to hexadecimal. - -* Registry refers to the ENS registry on Ethereum L1 - -* Resolver refers to the resolver of the Reverse node whether on L1 or another chain - -* Primary Name is the common name use for the reverse node's record `name` - -#### Primary Name Resolution process - -1) Let `chainId` be the chain ID of the DApp's currently connected chain. -2) If `chainId` is 1, set `reverseName = "[address].addr.reverse"` and `coinType = 60` and go to step 5. -3) Otherwise, set `coinType` using ENSIP-11: `coinType = 0x80000000 | chainId`. -4) Set `reverseName = '[address].[coinTypeAsHex].reverse'` -5) Set `node = namehash(reverseName)`. -6) Fetch the resolver for the reverse name: `resolver = registry.resolver(node)` -7) Fetch the primary name from the reverse record's resolver: `name = resolver.name(node)` -8) If the primary name is not the empty string, go to step 11. -9) If `name` is an empty string, and `coinType` is not 0, set `reverseName = '[address].default.reverse'` and `coinType = 0` and go to step 5. -10) Otherwise, no primary name exists for this account on this chain; halt and display the address instead. -11) If the dapp finds an ENS name, it MUST then check the forward resolution. This can be done by using the resolution processs in [ENSIP-10](https://docs.ens.domains/ensip/10). When constructing the ENSIP-10 `resolve()` calldata, encode a call to `addr(bytes32 node, uint256 coinType)`. Set `resolvedAddress` to the result of calling `resolve` on the resolver with this calldata. -12) If `resolvedAddress == address`, the dapp considers the Primary Name valid, and can now show this instead of the address within the application. -13) If `resolvedAddress != address` the dapp considers the Primary Name invalid and MUST show the address instead. - -Note: The dapp MUST NOT use the reverse record set for Ethereum mainnet (`[address].addr.reverse`) even if the Primary ENS name has not been set on the target chain, and must treat this identically to an address with no primary name set. - -### Resolving an avatar by a dapp on another EVM chain - -ENSIP-12 was conceived before the ENS L2 reverse resolution specification and therefore should be updated to reflect the current state of ENS primary name resolution. This means that all avatar records are able to be updated on a per-chain basis by updating the avatar record on their reverse node. - -To determine the avatar URI for a specific EVM chain address, the client can follow the resolution process above until step 6) And then do the following - -1. Perform [Ethereum address avatar text record resolution](https://docs.ens.domains/ensip/12#ethereum-address) on the reverse node. -2. If none is found, proceed to step 7) in the [Primary name resolution process](#primary-name-resolution-process) above, if no primary name is found, consider the avatar resolution a failure. -3. Perform [ENS name avatar text record resolution](https://docs.ens.domains/ensip/12#ens-name) on the ENS name. - -### Examples of valid L2 reverse resolution - -* Arbitrum: `0f32b753afc8abad9ca6fe589f707755f4df2353.8000A4B1.reverse` -* Optimism: `0f32b753afc8abad9ca6fe589f707755f4df2353.8000000A.reverse` -* Base: `0f32b753afc8abad9ca6fe589f707755f4df2353.80002105.reverse` -* Polygon ZKEVM: `0f32b753afc8abad9ca6fe589f707755f4df2353.8000044D.reverse` -* ZKSync Era: `0f32b753afc8abad9ca6fe589f707755f4df2353.80000144.reverse` - -### Deprecating use of mainnet primary ENS name on other chains - -ENS has not been explicit about how to use the mainnet `addr()` record and it is often used as a backup to a user not having an address record set. The mainnet reverse record has also historically been used on other EVM chains due to no alternative on that specific chain. There are a few reasons why it would undesirable to encourage use of mainnet primary name and/or `addr(node, 60)` record as a backup for it not being set on another EVM chain. - -An example of why this could be confusing: - -Dapp is on Arbitrum and uses mainnet primary ENS name. It resolves the ENS name's mainnet address and uses that to verify the reverse record is correct. It also uses the mainnet address to allow in-app transfers. - -Mainnet primary ENS name that has an `addr(node, 60)` that is a smart contract wallet. The smart contract wallet is only on Ethereum and the user is unable to use `CREATE2` to deploy the same smart contract wallet on arbitrum. User 2 sees this Primary ENS name and wants to send funds to User 1. User 2 resolves the `addr()` of the ENS name and sends the funds to an address that doesn't exist on arbitrum and User 1 has no way to access the counterfactual address on that chain. - -If we mandated that the address cannot use `addr(node, 60)`, but only the address of the chain in question, it would be possible to use mainnet as a backup. However the fact remains that you would still need to claim and set your Primary ENS name on mainnet, and the possibility for confusion seem to outweigh the benefits of using mainnet (high gas) as a catch-all back up for other L2 EVM chains (low gas). Additionally this would only be useful for EVM-compatible chains and would not benefit non-EVM L2s that have a different address format. - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/2.mdx b/src/pages/ensip/2.mdx deleted file mode 100644 index e443b2a16..000000000 --- a/src/pages/ensip/2.mdx +++ /dev/null @@ -1,256 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Describes the hash registrar initially used to register ENS .eth domains (formerly EIP-162).', - contributors: [ - // Nick Johnson - 'arachnid', - // Alex Van de Sande - 'alexvandesande', - 'maurelian' - ], - ensip: { - created: '2016-10-25', - status: 'obsolete', - } -}; - -# ENSIP-2: Initial Hash Registrar - -## Abstract - -This ERC describes the implementation, as deployed to the main ethereum network on 2017-05-04, of a registrar contract to govern the allocation of names in the Ethereum Name Service (ENS). The corresponding source code is [here](https://github.com/ethereum/ens/blob/mainnet/contracts/HashRegistrarSimplified.sol). - -For more background, refer to ENSIP-1. - -> Registrars are responsible for allocating domain names to users of the system, and are the only entities capable of updating the ENS; the owner of a node in the ENS registry is its registrar. Registrars may be contracts or externally owned accounts, though it is expected that the root and top-level registrars, at a minimum, will be implemented as contracts. -> -> \- ENSIP-1 - -A well designed and governed registrar is essential to the success of the ENS described in ENSIP-1, but is described separately in this document as it is external to the core ENS protocol. - -In order to maximize utility and adoption of a new namespace, the registrar should mitigate speculation and "name squatting", however the best approach for mitigation is unclear. Thus an "initial" registrar is proposed, which implements a simple approach to name allocation. During the initial period, the available namespace will be significantly restricted to the `.eth` top level domain, and subdomain shorter than 7 characters in length disallowed. This specification largely describes @alexvandesande and @arachnid's [hash registrar implementation](https://github.com/ethereum/ens/blob/mainnet/contracts/HashRegistrarSimplified.sol) in order to facilitate discussion. - -The intent is to replace the Initial Registrar contract with a permanent registrar contract. The Permanent Registrar will increase the available namespace, and incorporate lessons learned from the performance of the Initial Registrar. This upgrade is expected to take place within approximately 2 years of initial deployment. - -## Motivation - -The following factors should be considered in order to optimize for adoption of the ENS, and good governance of the Initial Registrar's namespace. - -**Upgradability:** The Initial Registrar should be safely upgradeable, so that knowledge gained during its deployment can be used to replace it with an improved and permanent registrar. - -**Effective allocation:** Newly released namespaces often create a land grab situation, resulting in many potentially valuable names being purchased but unused, with the hope of re-selling at a profit. This reduces the availability of the most useful names, in turn decreasing the utility of the name service to end users. - -Achieving an effective allocation may or may not require human intervention for dispute resolution and other forms of curation. The Initial Registrar should not aim to create to most effective possible allocation, but instead limit the cost of misallocation in the long term. - -**Security:** The registrar will hold a balance of ether without an explicit limit. It must be designed securely. - -**Simplicity:** The ENS specification itself emphasizes a separation of concerns, allowing the most essential element, the registry to be as simple as possible. The interim registrar in turn should be as simple as possible while still meeting its other design goals. - -**Adoption:** Successful standards become more successful due to network effects. The registrar should consider what strategies will encourage the adoption of the ENS in general, and the namespace it controls in particular. - -## Specification - -### Initial restrictions - -The Initial Registrar is expected to be in service for approximately two years, prior to upgrading. This should be sufficient time to learn, observe, and design an updated system. - -During the initial two year period, the available name space will be restricted to the `.eth` TLD. - -This restriction is enforced by the owner of the ENS root node who should not assign any nodes other than `.eth` to the Initial Registrar. The ENS's root node should be controlled by multiple parties using a multisig contract. - -The Initial Registrar will also prohibit registration of names 6 characters or less in length. - -### Name format for hash registration - -Names submitted to the initial registrar must be hashed using Ethereum's sha3 function. Note that the hashes submitted to the registrar are the hash of the subdomain label being registered, not the namehash as defined in ENSIP-1. - -For example, in order to register `abcdefg.eth`, one should submit `sha3('abcdefg')`, not `sha3(sha3(0, 'eth'), 'abcdefg')`. - -### Auctioning names - -The registrar will allocate the available names through a Vickrey auction: - -> A Vickrey auction is a type of sealed-bid auction. Bidders submit written bids without knowing the bid of the other people in the auction. The highest bidder wins but the price paid is the second-highest bid. This type of auction... gives bidders an incentive to bid their true value. -> -> \- [Vickrey Auction, Wikipedia](https://en.wikipedia.org/wiki/Vickrey_auction) - -The auction lifecycle of a name has 5 possible states, or Modes. - -1. **Not-yet-available:** The majority of names will be initially unavailable for auction, and will become available some time during the 8 weeks after launch. -2. **Open:** The earliest availability for a name is determined by the most significant byte of its sha3 hash. `0x00` would become available immediately, `0xFF` would become available after 8 weeks, and the availability of other names is distributed accordingly. Once a name is available, it is possible to start an auction on it. -3. **Auction:** Once the auction for a name has begun, there is a 72 hour bidding period. Bidders must submit a payment of ether, along with sealed bids as a hash of `sha3(bytes32 hash, address owner, uint value, bytes32 salt)`. The bidder may obfuscate the true bid value by sending a greater amount of ether. -4. **Reveal:** After the bidding period, a 48 hour reveal period commences. During this time, bidders must reveal the true parameters of their sealed bid. As bids are revealed, ether payments are returned according to the schedule of "refund ratios" outlined in the table below. If no bids are revealed, the name will return to the Open state. -5. **Owned:** After the reveal period has finished, the winning bidder must submit a transaction to finalize the auction, which then calls the ENS's `setSubnodeOwner` function, recording the winning bidder's address as the owner of the hash of the name. - -The following table outlines important parameters which define the Registrar's auction mechanism. - -**Registrar Parameters** - -| Name | Description | Value | -| ------------------ | --------------------------------------------------------------------------------------------------- | ---------- | -| totalAuctionLength | The full time period from start of auction to end of the reveal period. | 5 days | -| revealPeriod | The length of the time period during which bidding is no longer allowed, and bids must be revealed. | 48 hours | -| launchLength | The time period during which all names will become available for auction. | 8 weeks | -| minPrice | The minimum amount of ether which must be locked up in exchange for ownership of a name. | 0.01 ether | - -### Deeds - -The Initial Registrar contract does not hold a balance itself. All ether sent to the Registrar will be held in a separate `Deed` contracts. A deed contract is first created and funded when a sealed bid is submitted. After an auction is completed and a hash is registered, the deed for the winning bid is held in exchange for ownership of the hash. Non-winning bids are refunded. - -A deed for an owned name may be transferred to another account by its owner, thus transferring ownership and control of the name. - -After 1 year of registration, the owner of a hash may choose to relinquish ownership and have the value of the deed returned to them. - -Deeds for non-winning bids can be closed by various methods, at which time any ether held will either be returned to the bidder, burnt, or sent to someone else as a reward for actions which help the registrar. - -The following table outlines what portion of the balance held in a deed contract will be returned upon closure, and to whom. The remaining balance will be burnt. - -**Refund schedule** - -| Reason for Deed closure | Refund Recipient | Refund Percentage | -| ------------------------------------------------------ | ---------------- | ----------------- | -| A valid non-winning bid is revealed. | Bidder | 99.5% | -| A bid submitted after the auction period is revealed. | Bidder | 99.5% | -| An otherwise valid bid is revealed on an owned name. 1 | Bidder | 0.5% | -| An expired sealed bid is cancelled. 2 | Canceler | 0.5% | -| A registered hash is reported as invalid. 3 | Reporter | 50% | -| A registered hash is reported as invalid. 3 | Owner | 50% | - -**Notes:** - -1. This incentivizes all bids to be revealed in time. If bids could be revealed late, an extortion attack on the current highest bidder could be made by threatening to reveal a new second highest bid. -2. A bid which remains sealed after more than 2 weeks and 5 days may be cancelled by anyone to collect a small reward. -3. Since names are hashed before auctioning and registration, the Initial Registrar is unable to enforce character length restrictions independently. A reward is therefore provided for reporting invalid names. - -### Deployment and Upgrade process - -The Initial Registrar requires the ENS's address as a constructor, and should be deployed after the ENS. The multisig account owning the root node in the ENS should then set the Initial Registrar's address as owner of the `eth` node. - -The Initial Registrar is expected to be replaced by a Permanent Registrar approximately 2 years after deployment. The following process should be used for the upgrade: - -1. The Permanent Registrar contract will be deployed. -2. The multisig account owning the root node in the ENS will assign ownership of the `.eth` node to the Permanent Registrar. -3. Owners of hashes in the Initial Registrar will be responsible for registering their deeds to the Permanent Registrar. A couple options are considered here: - 1. Require owners to transfer their ownership prior to a cutoff date in order to maintain ownership and/or continue name resolution services. - 2. Have the Permanent Registrar query the Initial Registrar for ownership if it is lacking an entry. - -### Planned deactivation - -In order to limit dependence on the Initial Registrar, new auctions will stop after 4 years, and all ether held in deeds after 8 years will become unreachable. - -### Registrar Interface - -`function state(bytes32 _hash) constant returns (Mode)` - -- Implements a state machine returning the current state of a name - -`function entries(bytes32 _hash) constant returns (Mode, address, uint, uint, uint)` - -- Returns the following information regarding a registered name: - - state - - deed address - - registration date - - balance of the deed - - highest value bid at auction - -`function getAllowedTime(bytes32 _hash) constant returns (uint timestamp)` - -- Returns the time at which the hash will no longer be in the initial `not-yet-available` state. - -`function isAllowed(bytes32 _hash, uint _timestamp) constant returns (bool allowed)` - -- Takes a hash and a time, returns true if and only if it has passed the initial `not-yet-available` state. - -`function startAuction(bytes32 _hash);` - -- Moves the state of a hash from Open to Auction. Throws if state is not Open. - -`function startAuctions(bytes32[] _hashes);` - -- Starts multiple auctions on an array of hashes. This enables someone to open up an auction for a number of dummy hashes when they are only really interested in bidding for one. This will increase the cost for an attacker to simply bid blindly on all new auctions. Dummy auctions that are open but not bid on are closed after a week. - -`function shaBid(bytes32 hash, address owner, uint value, bytes32 salt) constant returns (bytes32 sealedBid);` - -- Takes the parameters of a bid, and returns the sealedBid hash value required to participate in the bidding for an auction. This obfuscates the parameters in order to mimic the mechanics of placing a bid in an envelope. - -`function newBid(bytes32 sealedBid);` - -- Bids are sent by sending a message to the main contract with a sealedBid hash and an amount of ether. The hash contains information about the bid, including the bidded name hash, the bid value, and a random salt. Bids are not tied to any one auction until they are revealed. The value of the bid itself can be masqueraded by sending more than the value of your actual bid. This is followed by a 48h reveal period. Bids revealed after this period will be burned and the ether unrecoverable. Since this is an auction, it is expected that most public hashes, like known domains and common dictionary words, will have multiple bidders pushing the price up. - -`function startAuctionsAndBid(bytes32[] hashes, bytes32 sealedBid)` - -- A utility function allowing a call to `startAuctions` followed by `newBid` in a single transaction. - -`function unsealBid(bytes32 _hash, address _owner, uint _value, bytes32 _salt);` - -- Once the bidding period is completed, there is a reveal period during with the properties of a bid are submitted to reveal them. The registrar hashes these properties using the `shaBid()` function above to verify that they match a pre-existing sealed bid. If the unsealedBid is the new best bid, the old best bid is returned to its bidder. - -`function cancelBid(bytes32 seal);` - -- Cancels an unrevealed bid according to the rules described in the notes on the refund schedule above. - -`function finalizeAuction(bytes32 _hash);` - -After the registration date has passed, this function can be called to finalize the auction, which then calls the ENS function `setSubnodeOwner()` updating the ENS record to set the winning bidder as owner of the node. - -`function transfer(bytes32 _hash, address newOwner);` - -- Update the owner of the ENS node corresponding to the submitted hash to a new owner. This function must be callable only by the current owner. - -`function releaseDeed(bytes32 _hash);` - -- After some time, the owner can release the property and get their ether back. - -`function invalidateName(string unhashedName);` - -- Since registration is done on the hash of a name, the registrar itself cannot validate names. This function can be used to report a name which is 6 characters long or less. If it has been registered, the submitter will earn 10% of the deed value. We are purposefully handicapping the simplified registrar as a way to force it into being restructured in a few years. - -`function eraseNode(bytes32[] labels)` - -- Allows anyone to delete the owner and resolver records for a subdomain of a name that is not currently owned in the registrar. For instance, to zero `foo.bar.eth` on a registrar that owns `.eth`, pass an array containing `[sha3('foo'), sha3('bar')]`. - -`function transferRegistrars(bytes32 _hash) onlyOwner(_hash);` - -- Used during the upgrade process to a permanent registrar. If this registrar is no longer the owner of the root node in the ENS, this function will transfer the deed to the current owner, which should be a new registrar. This function throws if this registrar still owns its root node. - -## Rationale - -### Starting with a temporary registrar - -Anticipating and designing for all the potential issues of name allocation names is unlikely to succeed. This approach chooses not to be concerned with getting it perfect, but allows us to observe and learn with training wheels on, and implement improvements before expanding the available namespace to shorter names or another TLD. - -### Valid names >= 7 characters - -Preserving the shortest, and often most valuable, domain names for the upgraded registrar provides the opportunity to implement processes for dispute resolution (assuming they are found to be necessary). - -### Delayed release of names - -A slower release allows for extra time to identify, and address any issues which may arise after launch. - -### Restricting TLD to `.eth` - -Choosing a single TLD helps to maximize network effects by focusing on one namespace. - -A three letter TLD is a pattern made familiar by it's common usage in internet domain names. This familiarity significantly increases the potential of the ENS to be integrated into pre-existing DNS systems, and reserved as a [special-use domain name](https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xhtml#special-use-domain). A recent precedent for this is the [reservation of the `.onion` domain](https://tools.ietf.org/html/rfc7686). - -### Holding ether as collateral - -This approach is simpler than the familiar model of requiring owners to make recurring payments to retain ownership of a domain name. It also makes the initial registrar a revenue neutral service. - -## Prior work - -This document borrows heavily from several sources: - -- ENSIP-1 outlines the initial implementation of the Registry Contract (ENS.sol) and associated Resolver contracts. -- [ERC-26](https://github.com/ethereum/EIPs/issues/26) was the first ERC to propose a name service at the contract layer -- @alexvandesande's current implementation of the [HashRegistrar](https://github.com/ethereum/ens/blob/mainnet/contracts/HashRegistrarSimplified.sol) - -### Edits: - -- 2016-10-26 Added link Alex's design in abstract -- 2016-11-01 change 'Planned deactivation' to h3' -- 2017-03-13 Update timelines for bidding and reveal periods - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/3.mdx b/src/pages/ensip/3.mdx deleted file mode 100644 index c09ab9dc5..000000000 --- a/src/pages/ensip/3.mdx +++ /dev/null @@ -1,227 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Specifies a TLD, registrar, and resolver interface for reverse resolution of Ethereum addresses using ENS (formerly EIP-181).', - contributors: [ - // Nick Johnson - 'arachnid' - ], - ensip: { - created: '2016-12-01', - status: 'final' - } -}; - -# ENSIP-3: Reverse Resolution - -Specifies a TLD, registrar, and resolver interface for reverse resolution of Ethereum addresses using ENS (formerly [EIP-181](https://eips.ethereum.org/EIPS/eip-181)). - -## Abstract - -This ENSIP specifies a TLD, registrar, and resolver interface for reverse resolution of Ethereum addresses using ENS. This permits associating a human-readable name with any Ethereum blockchain address. Resolvers can be certain that the reverse record was published by the owner of the Ethereum address in question. - -## Motivation - -While name services are mostly used for forward resolution - going from human-readable identifiers to machine-readable ones - there are many use-cases in which reverse resolution is useful as well: - -* Applications that allow users to monitor accounts benefit from showing the name of an account instead of its address, even if it was originally added by address. -* Attaching metadata such as descriptive information to an address allows retrieving this information regardless of how the address was originally discovered. -* Anyone can configure a name to resolve to an address, regardless of ownership of that address. Reverse records allow the owner of an address to claim a name as authoritative for that address. - -## Specification - -Reverse ENS records are stored in the ENS hierarchy in the same fashion as regular records, under a reserved domain, `addr.reverse`. To generate the ENS name for a given account's reverse records, convert the account to hexadecimal representation in lower-case, and append `addr.reverse`. For instance, the ENS registry's address at `0x112234455c3a32fd11230c42e7bccd4a84e02010` has any reverse records stored at `112234455c3a32fd11230c42e7bccd4a84e02010.addr.reverse`. - -Note that this means that contracts wanting to do dynamic reverse resolution of addresses will need to perform hex encoding in the contract. - -### Registrar - -The owner of the `addr.reverse` domain will be a registrar that permits the caller to take ownership of the reverse record for their own address. It provides the following methods: - -#### function claim(address owner) returns (bytes32 node) - -When called by account `x`, instructs the ENS registry to transfer ownership of the name `hex(x) + '.addr.reverse'` to the provided address, and return the namehash of the ENS record thus transferred. - -Allowing the caller to specify an owner other than themselves for the relevant node facilitates contracts that need accurate reverse ENS entries delegating this to their creators with a minimum of code inside their constructor: - -```solidity -reverseRegistrar.claim(msg.sender) -``` - -#### function claimWithResolver(address owner, address resolver) returns (bytes32 node) - -When called by account `x`, instructs the ENS registry to set the resolver of the name `hex(x) + '.addr.reverse'` to the specified resolver, then transfer ownership of the name to the provided address, and return the namehash of the ENS record thus transferred. This method facilitates setting up a custom resolver and owner in fewer transactions than would be required if calling `claim`. - -#### function setName(string name) returns (bytes32 node) - -When called by account `x`, sets the resolver for the name `hex(x) + '.addr.reverse'` to a default resolver, and sets the name record on that name to the specified name. This method facilitates setting up simple reverse records for users in a single transaction. - -### Resolver interface - -A new resolver interface is defined, consisting of the following method: - -```solidity -function name(bytes32 node) constant returns (string); -``` - -Resolvers that implement this interface must return a valid ENS name for the requested node, or the empty string if no name is defined for the requested node. - -The interface ID of this interface is 0x691f3431. - -Future ENSIPs may specify more record types appropriate to reverse ENS records. - -## Appendix 1: Registrar implementation - -This registrar, written in Solidity, implements the specifications outlined above. - -```solidity -pragma solidity ^0.4.10; - -import "./AbstractENS.sol"; - -contract Resolver { - function setName(bytes32 node, string name) public; -} - -/** - * @dev Provides a default implementation of a resolver for reverse records, - * which permits only the owner to update it. - */ -contract DefaultReverseResolver is Resolver { - AbstractENS public ens; - mapping(bytes32=>string) public name; - - /** - * @dev Constructor - * @param ensAddr The address of the ENS registry. - */ - function DefaultReverseResolver(AbstractENS ensAddr) { - ens = ensAddr; - } - - /** - * @dev Only permits calls by the reverse registrar. - * @param node The node permission is required for. - */ - modifier owner_only(bytes32 node) { - require(msg.sender == ens.owner(node)); - _; - } - - /** - * @dev Sets the name for a node. - * @param node The node to update. - * @param _name The name to set. - */ - function setName(bytes32 node, string _name) public owner_only(node) { - name[node] = _name; - } -} - -contract ReverseRegistrar { - // namehash('addr.reverse') - bytes32 constant ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2; - - AbstractENS public ens; - Resolver public defaultResolver; - - /** - * @dev Constructor - * @param ensAddr The address of the ENS registry. - * @param resolverAddr The address of the default reverse resolver. - */ - function ReverseRegistrar(AbstractENS ensAddr, Resolver resolverAddr) { - ens = ensAddr; - defaultResolver = resolverAddr; - } - - /** - * @dev Transfers ownership of the reverse ENS record associated with the - * calling account. - * @param owner The address to set as the owner of the reverse record in ENS. - * @return The ENS node hash of the reverse record. - */ - function claim(address owner) returns (bytes32 node) { - return claimWithResolver(owner, 0); - } - - /** - * @dev Transfers ownership of the reverse ENS record associated with the - * calling account. - * @param owner The address to set as the owner of the reverse record in ENS. - * @param resolver The address of the resolver to set; 0 to leave unchanged. - * @return The ENS node hash of the reverse record. - */ - function claimWithResolver(address owner, address resolver) returns (bytes32 node) { - var label = sha3HexAddress(msg.sender); - node = sha3(ADDR_REVERSE_NODE, label); - var currentOwner = ens.owner(node); - - // Update the resolver if required - if(resolver != 0 && resolver != ens.resolver(node)) { - // Transfer the name to us first if it's not already - if(currentOwner != address(this)) { - ens.setSubnodeOwner(ADDR_REVERSE_NODE, label, this); - currentOwner = address(this); - } - ens.setResolver(node, resolver); - } - - // Update the owner if required - if(currentOwner != owner) { - ens.setSubnodeOwner(ADDR_REVERSE_NODE, label, owner); - } - - return node; - } - - /** - * @dev Sets the `name()` record for the reverse ENS record associated with - * the calling account. First updates the resolver to the default reverse - * resolver if necessary. - * @param name The name to set for this address. - * @return The ENS node hash of the reverse record. - */ - function setName(string name) returns (bytes32 node) { - node = claimWithResolver(this, defaultResolver); - defaultResolver.setName(node, name); - return node; - } - - /** - * @dev Returns the node hash for a given account's reverse records. - * @param addr The address to hash - * @return The ENS node hash. - */ - function node(address addr) constant returns (bytes32 ret) { - return sha3(ADDR_REVERSE_NODE, sha3HexAddress(addr)); - } - - /** - * @dev An optimised function to compute the sha3 of the lower-case - * hexadecimal representation of an Ethereum address. - * @param addr The address to hash - * @return The SHA3 hash of the lower-case hexadecimal encoding of the - * input address. - */ - function sha3HexAddress(address addr) private returns (bytes32 ret) { - addr; ret; // Stop warning us about unused variables - assembly { - let lookup := 0x3031323334353637383961626364656600000000000000000000000000000000 - let i := 40 - loop: - i := sub(i, 1) - mstore8(i, byte(and(addr, 0xf), lookup)) - addr := div(addr, 0x10) - i := sub(i, 1) - mstore8(i, byte(and(addr, 0xf), lookup)) - addr := div(addr, 0x10) - jumpi(loop, i) - ret := sha3(0, 40) - } - } -} -``` - -### Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/4.mdx b/src/pages/ensip/4.mdx deleted file mode 100644 index 0f7a773d4..000000000 --- a/src/pages/ensip/4.mdx +++ /dev/null @@ -1,79 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'A mechanism for storing ABI definitions in ENS, for easy lookup of contract interfaces by callers (formerly EIP-205).', - contributors: [ - // Nick Johnson - 'arachnid' - ], - ensip: { - created: '2017-02-06', - status: 'final' - } -}; - -# ENSIP-4: Support for contract ABIs - -A mechanism for storing ABI definitions in ENS, for easy lookup of contract interfaces by callers (formerly [EIP-205](https://eips.ethereum.org/EIPS/eip-205)). - -## Abstract - -ABIs are important metadata required for interacting with most contracts. At present, they are typically supplied out-of-band, which adds an additional burden to interacting with contracts, particularly on a one-off basis or where the ABI may be updated over time. The small size of ABIs permits an alternative solution, storing them in ENS, permitting name lookup and ABI discovery via the same process. - -ABIs are typically quite compact; the largest in-use ABI we could find, that for the DAO, is 9450 bytes uncompressed JSON, 6920 bytes uncompressed CBOR, and 1128 bytes when the JSON form is compressed with zlib. Further gains on CBOR encoding are possible using a CBOR extension that permits eliminating repeated strings, which feature extensively in ABIs. Most ABIs, however, are far shorter than this, consisting of only a few hundred bytes of uncompressed JSON. - -This ENSIP defines a resolver profile for retrieving contract ABIs, as well as encoding standards for storing ABIs for different applications, allowing the user to select between different representations based on their need for compactness and other considerations such as onchain access. - -## Specification - -### ABI encodings - -In order to allow for different tradeoffs between onchain size and accessibility, several ABI encodings are defined. Each ABI encoding is defined by a unique constant with only a single bit set, allowing for the specification of 256 unique encodings in a single uint. - -The currently recognised encodings are: - -| ID | Description | -| -- | -------------------- | -| 1 | JSON | -| 2 | zlib-compressed JSON | -| 4 | CBOR | -| 8 | URI | - -This table may be extended in future through the ENSIP process. - -Encoding type 1 specifies plaintext JSON, uncompressed; this is the standard format in which ABIs are typically encoded, but also the bulkiest, and is not easily parseable onchain. - -Encoding type 2 specifies zlib-compressed JSON. This is significantly smaller than uncompressed JSON, and is straightforward to decode offchain. However, it is impractical for onchain consumers to use. - -Encoding type 4 is [CBOR](https://cbor.io). CBOR is a binary encoding format that is a superset of JSON, and is both more compact and easier to parse in limited environments such as the EVM. Consumers that support CBOR are strongly encouraged to also support the [stringref extension](http://cbor.schmorp.de/stringref) to CBOR, which provides significant additional reduction in encoded size. - -Encoding type 8 indicates that the ABI can be found elsewhere, at the specified URI. This is typically the most compact of the supported forms, but also adds external dependencies for implementers. The specified URI may use any schema, but HTTP, IPFS, and Swarm are expected to be the most common. - -### Resolver profile - -A new resolver interface is defined, consisting of the following method: - -```solidity -function ABI(bytes32 node, uint256 contentType) constant returns (uint256, bytes); -``` - -The interface ID of this interface is 0x2203ab56. - -contentType is a bitfield, and is the bitwise OR of all the encoding types the caller will accept. Resolvers that implement this interface must return an ABI encoded using one of the requested formats, or `(0, "")` if they do not have an ABI for this function, or do not support any of the requested formats. - -The `abi` resolver profile is valid on both forward and reverse records. - -### ABI lookup process - -When attempting to fetch an ABI based on an ENS name, implementers should first attempt an ABI lookup on the name itself. If that lookup returns no results, they should attempt a reverse lookup on the Ethereum address the name resolves to. - -Implementers should support as many of the ABI encoding formats as practical. - -## Rationale - -Storing ABIs onchain avoids the need to introduce additional dependencies for applications wishing to fetch them, such as swarm or HTTP access. Given the typical compactness of ABIs, we believe this is a worthwhile tradeoff in many cases. - -The two-step resolution process permits different names to provide different ABIs for the same contract, such as in the case where it's useful to provide a minimal ABI to some callers, as well as specifying ABIs for contracts that did not specify one of their own. The fallback to looking up an ABI on the reverse record permits contracts to specify their own canonical ABI, and prevents the need for duplication when multiple names reference the same contract without the need for different ABIs. - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/5.mdx b/src/pages/ensip/5.mdx deleted file mode 100644 index c48ae6a1d..000000000 --- a/src/pages/ensip/5.mdx +++ /dev/null @@ -1,110 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'A standard for storage of text records in ENS (formerly EIP-634).', - contributors: [ - 'ricmoo', - ], - ensip: { - created: '2017-05-17', - status: 'final' - } -}; - -# ENSIP-5: Text Records - -A standard for storage of text records in ENS (formerly [EIP-634](https://eips.ethereum.org/EIPS/eip-634)). - -## Abstract - -This ENSIP defines a resolver profile for ENS that permits the lookup of arbitrary key-value text data. This allows ENS name holders to associate e-mail addresses, URLs and other informational data with a ENS name. - -## Motivation - -There is often a desire for human-readable metadata to be associated with otherwise machine-driven data; used for debugging, maintenance, reporting and general information. - -In this ENSIP we define a simple resolver profile for ENS that permits ENS names to associate arbitrary key-value text. - -## Specification - -### Resolver Profile - -A new resolver interface is defined, consisting of the following method: - -```solidity -interface IERC634 { - /// @notice Returns the text data associated with a key for an ENS name - /// @param node A nodehash for an ENS name - /// @param key A key to lookup text data for - /// @return The text data - function text(bytes32 node, string key) view returns (string text); -} -``` - -The EIP-165 interface ID of this interface is `0x59d1d43c`. - -The `text` data may be any arbitrary UTF-8 string. If the key is not present, the empty string must be returned. - -### Global Keys - -Global Keys must be made up of lowercase letters, numbers and the hyphen (-). - -* **avatar** - a URL to an image used as an avatar or logo -* **description** - A description of the name -* **display** - a canonical display name for the ENS name; this MUST match the ENS name when its case is folded, and clients should ignore this value if it does not (e.g. `"ricmoo.eth"` could set this to `"RicMoo.eth"`) -* **email** - an e-mail address -* **keywords** - A list of comma-separated keywords, ordered by most significant first; clients that interpresent this field may choose a threshold beyond which to ignore -* **mail** - A physical mailing address -* **notice** - A notice regarding this name -* **location** - A generic location (e.g. `"Toronto, Canada"`) -* **phone** - A phone number as an E.164 string -* **url** - a website URL - -### Service Keys - -Service Keys must be made up of a _reverse dot notation_ for a namespace which the service owns, for example, DNS names (e.g. `.com`, `.io`, etc) or ENS name (i.e. `.eth`). Service Keys must contain at least one dot. - -This allows new services to start using their own keys without worrying about colliding with existing services and also means new services do not need to update this document. - -The following services are common, which is why recommendations are provided here, but ideally a service would declare its own key. - -* **com.github** - a GitHub username -* **com.peepeth** - a Peepeth username -* **com.linkedin** - a LinkedIn username -* **com.twitter** - a Twitter username -* **io.keybase** - a Keybase username -* **org.telegram** - a Telegram username - -This technique also allows for a service owner to specify a hierarchy for their keys, such as: - -* **com.example.users** -* **com.example.groups** -* **com.example.groups.public** -* **com.example.groups.private** - -### Legacy Keys - -The following keys were specified in earlier versions of this ENSIP. - -Their use is not likely very wide, but applications attempting maximal compatibility may wish to query these keys as a fallback if the above replacement keys fail. - -* **vnd.github** - a GitHub username (renamed to `com.github`) -* **vnd.peepeth** - a peepeth username (renamed to `com.peepeth`) -* **vnd.twitter** - a Twitter username (renamed to `com.twitter`) - -## Rationale - -### Application-specific vs general-purpose record types - -Rather than define a large number of specific record types (each for generally human-readable data) such as `url` and `email`, we follow an adapted model of DNS's `TXT` records, which allow for a general keys and values, allowing future extension without adjusting the resolver, while allowing applications to use custom keys for their own purposes. - -## Backwards Compatibility - -Not applicable. - -## Security Considerations - -None. - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/6.mdx b/src/pages/ensip/6.mdx deleted file mode 100644 index a4d958155..000000000 --- a/src/pages/ensip/6.mdx +++ /dev/null @@ -1,96 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Defines a resolver profile for ENS that provides features for storage and lookup of DNS records (formerly EIP-1185).', - contributors: [ - // Jim McDonald - 'mcdee', - ], - ensip: { - created: '2018-06-26', - status: 'obsolete' - } -}; - -# ENSIP-6: DNS-in-ENS - -Defines a resolver profile for ENS that provides features for storage and lookup of DNS records (formerly [EIP-1185](https://eips.ethereum.org/EIPS/eip-1185)). - -## Abstract - -This ENSIP defines a resolver profile for ENS that provides features for storage and lookup of DNS records. This allows ENS to be used as a store of authoritative DNS information. - -## Motivation - -ENS is a highly desirable store for DNS information. It provides the distributed authority of DNS without conflating ownership and authoritative serving of information. With ENS, the owner of a domain has full control over their own DNS records. Also, ENS has the ability (through smart contracts) for a domain's subdomains to be irrevocably assigned to another entity. - -## Specification - -The resolver profile to support DNS on ENS follows the resolver specification as defined in #137. - -Traditionally, DNS is a zone-based system in that all of the records for a zone are kept together in the same file. This has the benefit of simplicity and atomicity of zone updates, but when transposed to ENS can result in significant gas costs for simple changes. As a result, the resolver works on the basis of record sets. A record set is uniquely defined by the tuple (domain, name, resource record type), for example the tuple (example.com, www.example.com, A) defines the record set of A records for the name www.example.com in the domain example.com. A record set can contain 0 or more values, for example if www.example.com has A records 1.2.3.4 and 5.6.7.8 then the aforementioned tuple will have two values. - -The choice to work at the level of record sets rather than zones means that this specification cannot completely support some features of DNS, such as zone transfers and DNSSEC. It would be possible to build a different resolver profile that works at the zone level, however it would be very expensive to carry out updates and so is not considered further for this ENSIP. - -The DNS resolver interface consists of two functions to set DNS information and two functions to query DNS information. - -### setDNSRecords(bytes32 node, bytes data) - -`setDNSRecords()` sets, updates or clears 1 or more DNS records for a given node. It has function signature `0x0af179d7`. - -The arguments for the function are as follows: - -- node: the namehash of the fully-qualified domain in ENS for which to set the records. Namehashes are defined in #137 -- data: 1 or more DNS records in DNS wire format. Any record that is supplied without a value will be cleared. Note that all records in the same RRset should be contiguous within the data; if not then the later RRsets will overwrite the earlier one(s) - -### clearDNSZone(bytes32 node) - -`clearDNSZone()` removes all DNS records for the domain. It has function signature `0xad5780af`. - -Although it is possible to clear records individually with `setDNSRecords()` as described above this requires the owner to know all of the records that have been set (as the resolver has no methods to iterate over the records for a given domain), and might require multiple transactions. `clearDNSZone()` removes all zone information in a single operation. - -The arguments for the function is as follows: - -- node: the namehash of the fully-qualified domain in ENS for which to clear the records. Namehashes are defined in #137 - -### dnsRecords(bytes32 node, bytes32 name, uint16 resource) view returns (bytes) - -`dnsRecords()` obtains the DNS records for a given node, name and resource. It has function signature `0x2461e851`. - -The arguments for the function are as follows: - -- node: the namehash of the fully-qualified domain in ENS for which to set the records. Namehashes are defined in #137 -- name: the `keccak256()` hash of the name of the record in DNS wire format. -- resource: the resource record ID. Resource record IDs are defined in https://en.wikipedia.org/wiki/List\_of\_DNS\_record\_types - -The function returns all matching records in DNS wire format. If there are no records present the function will return nothing. - -### hasDNSRecords(bytes32 node, bytes32 name) view returns (bool) - -`hasDNSRecords()` reports if there are any records for the provided name in the domain. It has function signature `0x4cbf6ba4`. - -This function is needed by DNS resolvers when working with wildcard resources as defined in https://tools.ietf.org/html/rfc4592 - -The arguments for the function are as follows: - -- node: the namehash of the fully-qualified domain in ENS for which to set the records. Namehashes are defined in #137 -- name: the `keccak256()` hash of the name of the record in DNS wire format. - -The function returns `true` if there are any records for the provided node and name, otherwise `false`. - -## Backwards compatibility - -Not applicable. - -## Implementation - -The reference implementation of the DNS resolver is at https://github.com/wealdtech/wealdtech-solidity/blob/master/contracts/ens/DNSResolver.sol - -https://github.com/wealdtech/ethereal.git can be used to test the functionality of the resolver with the "dns set", "dns get" and "dns clear" commands. - -## Test Cases - -Test cases for the DNS resolver are at https://github.com/wealdtech/wealdtech-solidity/blob/master/test/ens/DNSResolver.js - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/7.mdx b/src/pages/ensip/7.mdx deleted file mode 100644 index 61ef412ee..000000000 --- a/src/pages/ensip/7.mdx +++ /dev/null @@ -1,129 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Introduces a field for storing content addresses and hashes in ENS (formerly EIP-1577).', - contributors: [ - // Nick Johnson - 'arachnid', - // Dean Eigenmann - 'decanus' - ], - ensip: { - created: '2018-11-13', - status: 'final' - } -}; - -# ENSIP-7: Contenthash field - -Introduces a field for storing content addresses and hashes in ENS (formerly [EIP-1577](https://eips.ethereum.org/EIPS/eip-1577)). - -## Abstract - -This ENSIP introduces the new `contenthash` field for ENS resolvers, allowing for a better defined system of mapping names to network and content addresses. Additionally the `content` and `multihash` fields are deprecated. - -## Motivation - -Multiple applications including [Metamask](https://metamask.io) and mobile clients such as [Status](https://status.im) have begun resolving ENS names to content hosted on distributed systems such as [IPFS](https://ipfs.io) and [Swarm](https://swarm-guide.readthedocs.io). Due to the various ways content can be stored and addressed, a standard is required so these applications know how to resolve names and that domain owners know how their content will be resolved. - -The `contenthash` field allows for easy specification of network and content addresses in ENS. - -## Specification - -The field `contenthash` is introduced, which permits a wide range of protocols to be supported by ENS names. Resolvers supporting this field MUST return `true` when the `supportsInterface` function is called with argument `0xbc1c58d1`. - -The fields `content` and `multihash` are deprecated. - -The value returned by `contenthash` MUST be represented as a machine-readable [multicodec](https://github.com/multiformats/multicodec). The format is specified as follows: - -```go - -``` - -protoCodes and their meanings are specified in the [multiformats/multicodec](https://github.com/multiformats/multicodec) repository. - -The encoding of the value depends on the content type specified by the protoCode. Values with protocodes of 0xe3 and 0xe4 represent IPFS and Swarm content; these values are encoded as v1 [CIDs](https://github.com/multiformats/cid) without a base prefix, meaning their value is formatted as follows: - -```go - -``` - -When resolving a `contenthash`, applications MUST use the protocol code to determine what type of address is encoded, and resolve the address appropriately for that protocol, if supported. - -### Example - -**IPFS** - -Input data: - -```go -storage system: IPFS (0xe3) -CID version: 1 (0x01) -content type: dag-pb (0x70) -hash function: sha2-256 (0x12) -hash length: 32 bytes (0x20) -hash: 29f2d17be6139079dc48696d1f582a8530eb9805b561eda517e22a892c7e3f1f -``` - -Binary format: - -```go -0xe3010170122029f2d17be6139079dc48696d1f582a8530eb9805b561eda517e22a892c7e3f1f -``` - -Text format: - -```plaintext -ipfs://QmRAQB6YaCyidP37UdDnjFY5vQuiBrcqdyoW1CuDgwxkD4 -``` - -### Swarm - -Input data: - -```go -storage system: Swarm (0xe4) -CID version: 1 (0x01) -content type: swarm-manifest (0xfa) -hash function: keccak256 (0x1b) -hash length: 32 bytes (0x20) -hash: d1de9994b4d039f6548d191eb26786769f580809256b4685ef316805265ea162 -``` - -Binary format: - -```go -0xe40101fa011b20d1de9994b4d039f6548d191eb26786769f580809256b4685ef316805265ea162 -``` - -Text format: - -```go -bzz://d1de9994b4d039f6548d191eb26786769f580809256b4685ef316805265ea162 -``` - -Example usage with swarm hash: - -```go -$ swarm hash ens contenthash d1de9994b4d039f6548d191eb26786769f580809256b4685ef316805265ea162 -> e40101fa011b20d1de9994b4d039f6548d191eb26786769f580809256b4685ef316805265ea162 -``` - -### Fallback - -In order to support names that have an IPFS or Swarm hash in their `content` field, a grace period MUST be implemented offering those name holders time to update their names. If a resolver does not support the `multihash` interface, it MUST be checked whether they support the `content` interface. If they do, the value of that field SHOULD be treated in a context dependent fashion and resolved. This condition MUST be enforced until at least March 31st, 2019. - -### Implementation - -To support `contenthash`, a new resolver has been developed and can be found [here](https://github.com/ensdomains/resolvers/blob/master/contracts/PublicResolver.sol), you can also find this smart contract deployed on: - -* Mainnet : [0xd3ddccdd3b25a8a7423b5bee360a42146eb4baf3](https://etherscan.io/address/0xd3ddccdd3b25a8a7423b5bee360a42146eb4baf3) -* Ropsten : [0xde469c7106a9fbc3fb98912bb00be983a89bddca](https://ropsten.etherscan.io/address/0xde469c7106a9fbc3fb98912bb00be983a89bddca) - -There are also implementations in multiple languages to encode and decode `contenthash`: - -* [JavaScript](https://github.com/pldespaigne/content-hash) -* [Python](https://github.com/filips123/ContentHashPy) - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/8.mdx b/src/pages/ensip/8.mdx deleted file mode 100644 index 1b8c6ce6b..000000000 --- a/src/pages/ensip/8.mdx +++ /dev/null @@ -1,69 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Defines a method of associating contract interfaces with ENS names and addresses, and of discovering those interfaces (formerly EIP-1844).', - contributors: [ - // Nick Johnson - 'arachnid' - ], - ensip: { - created: '2019-03-05', - status: 'final' - } -}; - -# ENSIP-8: Interface Discovery - -Defines a method of associating contract interfaces with ENS names and addresses, and of discovering those interfaces (formerly [EIP-1844](https://eips.ethereum.org/EIPS/eip-1844)). - -## Abstract - -This ENSIP specifies a method for exposing interfaces associated with an ENS name or an address (typically a contract address) and allowing applications to discover those interfaces and interact with them. Interfaces can be implemented either by the target contract (if any) or by any other contract. - -## Motivation - -EIP 165 supports interface discovery - determining if the contract at a given address supports a requested interface. However, in many cases it's useful to be able to discover functionality associated with a name or an address that is implemented by other contracts. - -For example, a token contract may not itself provide any kind of 'atomic swap' functionality, but there may be associated contracts that do. With ENS interface discovery, the token contract can expose this metadata, informing applications where they can find that functionality. - -## Specification - -A new profile for ENS resolvers is defined, consisting of the following method: - -```solidity -function interfaceImplementer(bytes32 node, bytes4 interfaceID) external view returns (address); -``` - -The EIP-165 interface ID of this interface is `0xb8f2bbb4`. - -Given an ENS name hash `node` and an EIP-165 `interfaceID`, this function returns the address of an appropriate implementer of that interface. If there is no interface matching that interface ID for that node, 0 is returned. - -The address returned by `interfaceImplementer` MUST refer to a smart contract. - -The smart contract at the returned address SHOULD implement EIP-165. - -Resolvers implementing this interface MAY utilise a fallback strategy: If no matching interface was explicitly provided by the user, query the contract returned by `addr()`, returning its address if the requested interface is supported by that contract, and 0 otherwise. If they do this, they MUST ensure they return 0, rather than reverting, if the target contract reverts. - -This field may be used with both forward resolution and reverse resolution. - -## Rationale - -A naive approach to this problem would involve adding this method directly to the target contract. However, doing this has several shortcomings: - -1. Each contract must maintain its own list of interface implementations. -2. Modifying this list requires access controls, which the contract may not have previously required. -3. Support for this must be designed in when the contract is written, and cannot be retrofitted afterwards. -4. Only one canonical list of interfaces can be supported. - -Using ENS resolvers instead mitigates these shortcomings, making it possible for anyone to associate interfaces with a name, even for contracts not previously built with this in mind. - -## Backwards Compatibility - -There are no backwards compatibility issues. - -## Implementation - -The PublicResolver in the [ensdomains/resolvers](https://github.com/ensdomains/resolvers/) repository implements this interface. - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/9.mdx b/src/pages/ensip/9.mdx deleted file mode 100644 index 350cb082d..000000000 --- a/src/pages/ensip/9.mdx +++ /dev/null @@ -1,219 +0,0 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Introduces new overloads for the addr field for ENS resolvers, which permit resolution of addresses for other blockchains via ENS (formerly EIP-2304).', - contributors: [ - // Nick Johnson - 'arachnid' - ], - ensip: { - created: '2019-09-09', - status: 'final' - } -}; - -# ENSIP-9: Multichain Address resolution - -Introduces new overloads for the `addr` field for ENS resolvers, which permit resolution of addresses for other blockchains via ENS (formerly [EIP-2304](https://eips.ethereum.org/EIPS/eip-2304)). - -## Motivation - -With the increasing uptake of ENS by multi-coin wallets, wallet authors have requested the ability to resolve addresses for non-Ethereum chains inside ENS. This specification standardises a way to enter and retrieve these addresses in a cross-client fashion. - -## Specification - -A new accessor function for resolvers is specified: - -```solidity -function addr(bytes32 node, uint coinType) external view returns(bytes memory); -``` - -The EIP165 interface ID for this function is 0xf1cb7e06. - -When called on a resolver, this function must return the cryptocurrency address for the specified namehash and coin type. A zero-length string must be returned if the specified coin ID does not exist on the specified node. - -`coinType` is the cryptocurrency coin type index from [SLIP44](https://github.com/satoshilabs/slips/blob/master/slip-0044.md). - -The return value is the cryptocurrency address in its native binary format. Detailed descriptions of the binary encodings for several popular chains are provided in the Address Encoding section below. - -A new event for resolvers is defined: - -```solidity -event AddressChanged(bytes32 indexed node, uint coinType, bytes newAddress); -``` - -Resolvers MUST emit this event on each change to the address for a name and coin type. - -### Recommended accessor functions - -The following function provides the recommended interface for changing the addresses stored for a node. Resolvers SHOULD implement this interface for setting addresses unless their needs dictate a different interface. - -```solidity -function setAddr(bytes32 node, uint coinType, bytes calldata addr); -``` - -`setAddr` adds or replaces the address for the given node and coin type. The parameters for this function are as per those described in `addr()` above. - -This function emits an `AddressChanged` event with the new address; see also the backwards compatibility section below for resolvers that also support `addr(bytes32)`. - -### Address Encoding - -In general, the native binary representation of the address should be used, without any checksum commonly used in the text representation. - -A table of encodings for common blockchains is provided, followed by a more detailed description of each format. In the table, 'encodings' lists the address encodings supported by that chain, along with any relevant parameters. Details of those address encodings are described in the following sections. - -| Cryptocurrency | Coin Type | Encoding | -| ---------------- | --------- | -------------------------------------------------- | -| Bitcoin | 0 | P2PKH(0x00), P2SH(0x05), SegWit('bc') | -| Litecoin | 2 | P2PKH(0x30), P2SH(0x32), P2SH(0x05), SegWit('ltc') | -| Dogecoin | 3 | P2PKH(0x1e), P2SH(0x16) | -| Monacoin | 22 | P2PKH(0x32), P2SH(0x05) | -| Ethereum | 60 | ChecksummedHex | -| Ethereum Classic | 61 | ChecksummedHex | -| Rootstock | 137 | ChecksummedHex(30) | -| Ripple | 144 | Ripple | -| Bitcoin Cash | 145 | P2PKH(0x00), P2SH(0x05), CashAddr | -| Binance | 714 | Bech32('bnb') | - -**P2PKH(version)** - -Pay to Public Key Hash addresses are [base58check](https://en.bitcoin.it/wiki/Base58Check\_encoding) encoded. After decoding, the first byte is a version byte. For example, the Bitcoin address `1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa` base58check decodes to the 21 bytes `0062e907b15cbf27d5425399ebf6f0fb50ebb88f18`. - -P2PKH addresses have a version byte, followed by a 20 byte pubkey hash. Their canonical encoding is their scriptPubkey encoding (specified [here](https://en.bitcoin.it/wiki/Transaction#Types\_of\_Transaction)) is `OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG`. - -The above example address is thus encoded as the 25 bytes `76a91462e907b15cbf27d5425399ebf6f0fb50ebb88f1888ac`. - -**P2SH(version)** - -P2SH addresses are base58check encoded in the same manner as P2PKH addresses. P2SH addresses have a version, followed by a 20 byte script hash. Their scriptPubkey encoding (specified [here](https://en.bitcoin.it/wiki/Transaction#Pay-to-Script-Hash)) is `OP_HASH160 OP_EQUAL`. A Bitcoin address of `3Ai1JZ8pdJb2ksieUV8FsxSNVJCpoPi8W6` decodes to the 21 bytes `0562e907b15cbf27d5425399ebf6f0fb50ebb88f18` and is encoded as the 23 bytes `a91462e907b15cbf27d5425399ebf6f0fb50ebb88f1887`. - -**SegWit(hrp)** - -SegWit addresses are encoded with [bech32](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki). Bech32 addresses consist of a human-readable part - 'bc' for Bitcoin mainnet - and a machine readable part. For SegWit addresses, this decodes to a 'witness version', between 0 and 15, and a 'witness program', as defined in [BIP141](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki). - -The scriptPubkey encoding for a bech32 address, as defined in BIP141, is `OP_n`, where `n` is the witness version, followed by a push of the witness program. Note this warning from BIP173: - -> Implementations should take special care when converting the address to a scriptPubkey, where witness version n is stored as OP\_n. OP\_0 is encoded as 0x00, but OP\_1 through OP\_16 are encoded as 0x51 though 0x60 (81 to 96 in decimal). If a bech32 address is converted to an incorrect scriptPubKey the result will likely be either unspendable or insecure. - -For example, the Bitcoin SegWit address `BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4` decodes to a version of `0` and a witness script of `751e76e8199196d454941c45d1b3a323f1433bd6`, and then encodes to a scriptPubkey of `0014751e76e8199196d454941c45d1b3a323f1433bd6`. - -**ChecksummedHex(chainId?)** - -To translate a text format checksummed hex address into binary format, simply remove the '0x' prefix and hex decode it. `0x314159265dD8dbb310642f98f50C066173C1259b` is hex-decoded and stored as the 20 bytes `314159265dd8dbb310642f98f50c066173c1259b`. - -A checksum format is specified by EIP-55, and extended by [RSKIP60](https://github.com/rsksmart/RSKIPs/blob/master/IPs/RSKIP60.md), which specifies a means of including the chain ID in the checksum. The checksum on a text format address must be checked. Addresses with invalid checksums that are not all uppercase or all lowercase MUST be rejected with an error. Implementations may choose whether to accept non-checksummed addresses, but the authors recommend at least providing a warning to users in this situation. - -When encoding an address from binary to text, an EIP55/RSKIP60 checksum MUST be used - so the correct encoding of the above address for Ethereum is `0x314159265dD8dbb310642f98f50C066173C1259b`. - -**Ripple** - -Ripple addresses are encoded using a version of base58check with an alternative alphabet, described [here](https://xrpl.org/base58-encodings.html). Two types of ripple addresses are supported, 'r-addresses', and 'X-addresss'. r-addresses consist of a version byte followed by a 20 byte hash, while X-addresses consist of a version byte, a 20 byte hash, and a tag, specified [here](https://github.com/xrp-community/standards-drafts/issues/6). - -Both address types should be stored in ENS by performing ripple's version of base58check decoding and storing them directly (including version byte). For example, the ripple address `rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn` decodes to and is stored as `004b4e9c06f24296074f7bc48f92a97916c6dc5ea9`, while the address `X7qvLs7gSnNoKvZzNWUT2e8st17QPY64PPe7zriLNuJszeg` decodes to and is stored as `05444b4e9c06f24296074f7bc48f92a97916c6dc5ea9000000000000000000`. - -**CashAddr** - -Bitcoin Cash defines a new address format called 'CashAddr', specified [here](https://github.com/bitcoincashorg/bitcoincash.org/blob/master/spec/cashaddr.md). This uses a variant of bech32 encoding to encode and decode (non-segwit) Bitcoin Cash addresses, using a prefix of 'bitcoincash:'. A CashAddr should be decoded using this bech32 variant, then converted and stored based on its type (P2PKH or P2SH) as described in the relevant sections above. - -**Bech32** - -[Bech32](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki) addresses consist of a human-readable part - for example, 'bnb' for Binance - and a machine readable part. The encoded data is simply the address, which can be converted to binary and stored directly. - -For example, the BNB address `bnb1grpf0955h0ykzq3ar5nmum7y6gdfl6lxfn46h2` decodes to the binary representation `40c2979694bbc961023d1d27be6fc4d21a9febe6`, which is stored directly in ENS. - -### Example - -An example implementation of a resolver that supports this ENSIP is provided here: - -```solidity -pragma solidity ^0.5.8; - -contract AddrResolver is ResolverBase { - bytes4 constant private ADDR_INTERFACE_ID = 0x3b3b57de; - bytes4 constant private ADDRESS_INTERFACE_ID = 0xf1cb7e06; - uint constant private COIN_TYPE_ETH = 60; - - event AddrChanged(bytes32 indexed node, address a); - event AddressChanged(bytes32 indexed node, uint coinType, bytes newAddress); - - mapping(bytes32=>mapping(uint=>bytes)) _addresses; - - /** - * Sets the address associated with an ENS node. - * May only be called by the owner of that node in the ENS registry. - * @param node The node to update. - * @param a The address to set. - */ - function setAddr(bytes32 node, address a) external authorised(node) { - setAddr(node, COIN_TYPE_ETH, addressToBytes(a)); - } - - /** - * Returns the address associated with an ENS node. - * @param node The ENS node to query. - * @return The associated address. - */ - function addr(bytes32 node) public view returns (address) { - bytes memory a = addr(node, COIN_TYPE_ETH); - if(a.length == 0) { - return address(0); - } - return bytesToAddress(a); - } - - function setAddr(bytes32 node, uint coinType, bytes memory a) public authorised(node) { - emit AddressChanged(node, coinType, a); - if(coinType == COIN_TYPE_ETH) { - emit AddrChanged(node, bytesToAddress(a)); - } - _addresses[node][coinType] = a; - } - - function addr(bytes32 node, uint coinType) public view returns(bytes memory) { - return _addresses[node][coinType]; - } - - function supportsInterface(bytes4 interfaceID) public pure returns(bool) { - return interfaceID == ADDR_INTERFACE_ID || interfaceID == ADDRESS_INTERFACE_ID || super.supportsInterface(interfaceID); - } -} -``` - -### Implementation - -An implementation of this interface is provided in the [ensdomains/resolvers](https://github.com/ensdomains/resolvers/) repository. - -## Backwards Compatibility - -If the resolver supports the `addr(bytes32)` interface defined in ENSIP-1, the resolver MUST treat this as a special case of this new specification in the following ways: - -1. The value returned by `addr(node)` from ENSIP-1 should always match the value returned by `addr(node, 60)` (60 is the coin type ID for Ethereum). -2. Anything that causes the `AddrChanged` event from ENSIP-1 to be emitted must also emit an `AddressChanged` event from this ENSIP, with the `coinType` specified as 60, and vice-versa. - -## Tests - -The table below specifies test vectors for valid address encodings for each cryptocurrency described above. - -| Cryptocurrency | Coin Type | Text | Onchain (hex) | -| -------------- | --------- | -------------------------------------------------------- | ---------------------------------------------------------------- | -| Bitcoin | 0 | `1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa` | `76a91462e907b15cbf27d5425399ebf6f0fb50ebb88f1888ac` | -| | | `3Ai1JZ8pdJb2ksieUV8FsxSNVJCpoPi8W6` | `a91462e907b15cbf27d5425399ebf6f0fb50ebb88f1887` | -| | | `BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4` | `0014751e76e8199196d454941c45d1b3a323f1433bd6` | -| Litecoin | 2 | `LaMT348PWRnrqeeWArpwQPbuanpXDZGEUz` | `76a914a5f4d12ce3685781b227c1f39548ddef429e978388ac` | -| | | `MQMcJhpWHYVeQArcZR3sBgyPZxxRtnH441` | `a914b48297bff5dadecc5f36145cec6a5f20d57c8f9b87` | -| | | `ltc1qdp7p2rpx4a2f80h7a4crvppczgg4egmv5c78w8` | `0014687c150c26af5493befeed7036043812115ca36c` | -| Dogecoin | 3 | `DBXu2kgc3xtvCUWFcxFE3r9hEYgmuaaCyD` | `76a9144620b70031f0e9437e374a2100934fba4911046088ac` | -| | | `AF8ekvSf6eiSBRspJjnfzK6d1EM6pnPq3G` | `a914f8f5d99a9fc21aa676e74d15e7b8134557615bda87` | -| Monacoin | 22 | `MHxgS2XMXjeJ4if2PRRbWYcdwZPWfdwaDT` | `76a9146e5bb7226a337fe8307b4192ae5c3fab9fa9edf588ac` | -| Ethereum | 60 | `0x314159265dD8dbb310642f98f50C066173C1259b` | `314159265dd8dbb310642f98f50c066173c1259b` | -| Rootstock | 137 | `0x5aaEB6053f3e94c9b9a09f33669435E7ef1bEAeD` | `5aaeb6053f3e94c9b9a09f33669435e7ef1beaed` | -| Ripple | 144 | `rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn` | `004b4e9c06f24296074f7bc48f92a97916c6dc5ea9` | -| | | `X7qvLs7gSnNoKvZzNWUT2e8st17QPY64PPe7zriLNuJszeg` | `05444b4e9c06f24296074f7bc48f92a97916c6dc5ea9000000000000000000` | -| Bitcoin Cash | 145 | `1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu` | `76a91476a04053bda0a88bda5177b86a15c3b29f55987388ac` | -| | | `bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a` | `76a91476a04053bda0a88bda5177b86a15c3b29f55987388ac` | -| | | `3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC` | `a91476a04053bda0a88bda5177b86a15c3b29f55987387` | -| | | `bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq` | `a91476a04053bda0a88bda5177b86a15c3b29f55987387` | -| Binance | 714 | `bnb1grpf0955h0ykzq3ar5nmum7y6gdfl6lxfn46h2` | `40c2979694bbc961023d1d27be6fc4d21a9febe6` | - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/pages/ensip/index.mdx b/src/pages/ensip/index.mdx index a4e7f30d7..906e0cb6f 100644 --- a/src/pages/ensip/index.mdx +++ b/src/pages/ensip/index.mdx @@ -1,14 +1,3 @@ -import { WIP } from '@/components/wip/WIP'; - -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'ENSIPs are improvement proposals to the ENS protocol.', - emoji: '🧑‍🏫', - contributors: [ - 'luc.eth' - ] -}; - # ENS Improvement Proposals This page contains a summary of all the ENS Improvement Proposals (ENSIPs) that have been proposed, and their current status. @@ -16,30 +5,12 @@ Improvement Proposals have included anything from new contract features, to text ## ENSIPs +{/* TODO: Generate this table in the ensips() plugin */} + | Title | Status | | ----- | ------ | -| [1 - ENS](/ensip/1) | ✅ Final | -| [2 - Initial Hash Registrar](/ensip/2) | 😵 Obsolete | -| [3 - Reverse Resolution](/ensip/3) | ✅ Final | -| [4 - Support for contract ABIs](/ensip/4) | ✅ Final | -| [5 - Text Records](/ensip/5) | ✅ Final | -| [6 - DNS-in-ENS](/ensip/6) | 😵 Obsolete | -| [7 - Contenthash](/ensip/7) | ✅ Final | -| [8 - Interface Discovery](/ensip/8) | ✅ Final | -| [9 - Multichain Address Resolution](/ensip/9) | ✅ Final | -| [10 - Wildcard Resolution](/ensip/10) | ✅ Final | -| [11 - EVM Compatible Chain Address Resolution](/ensip/11) | ✅ Final | -| [12 - Avatar Text Record](/ensip/12) | ✅ Final | -| [13 - SAFE Authentication for ENS](/ensip/13) | ✍️ Draft | -| [14 - On-chain Source Parameter](/ensip/14) | ✍️ Draft | -| [15 - Normalization Standard](/ensip/15) | ✍️ Draft | -| [16 - Offchain Metadata](/ensip/16) | ✍️ Draft | -| [17 - Gasless DNS Resolution](/ensip/17) | ✍️ Draft | -| [18 - Profile Text Records](/ensip/18) | ✍️ Draft | -| [19 - EVM-chain Reverse Resolution](/ensip/19) | ✍️ Draft | - -{/* ## Propose an ENSIP +| | | -Feel free to [open a github issue](https://github.com/ensdomains/docs) or pull request on [ensdomains/docs](https://github.com/ensdomains/docs). +## Propose an ENSIP - */} +Feel free to [open a pull request](https://github.com/ensdomains/ensips/pulls) on the `ensdomains/ensips` repository. diff --git a/src/pages/ensip/sidebar.json b/src/pages/ensip/sidebar.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/src/pages/ensip/sidebar.json @@ -0,0 +1 @@ +[] diff --git a/src/plugins/ensips.ts b/src/plugins/ensips.ts new file mode 100644 index 000000000..29310b3f5 --- /dev/null +++ b/src/plugins/ensips.ts @@ -0,0 +1,86 @@ +import fs from 'fs/promises' +import { Tokens, marked } from 'marked' +import path from 'path' +import { Plugin } from 'vite' +import { SidebarItem } from 'vocs' + +type DirectoryContents = { + name: string + download_url: string +}[] + +// Generate a markdown file for each ENSIP and add it to the sidebar +// Only runs once, no need for hot reloading +export async function ensips(): Promise { + const name = 'ensips' + + return { + name, + resolveId(id) { + if (id === name) return name + }, + async buildStart() { + const alreadyExists = await fs + .access('src/pages/ensip/1.md') + .then(() => true) + .catch(() => false) + + if (alreadyExists) { + return + } + + console.log('Fetching ENSIPs') + + const res = await fetch( + 'https://api.github.com/repos/ensdomains/ensips/contents/ensips' + ) + const files = (await res.json()) as DirectoryContents + + // Format files for the sidebar + const sidebar = new Array() + + await Promise.all( + files.map(async (file) => { + const res = await fetch(file.download_url) + const content = await res.text() + const ensipNumber = file.name.split('.')[0] + + // Add to sidebar array + sidebar.push({ + text: getTitle(content, ensipNumber), + link: `/ensip/${ensipNumber}`, + number: Number(ensipNumber), + }) + + // Save markdown file + await fs.writeFile( + path.join('src/pages/ensip', file.name), + content, + 'utf-8' + ) + }) + ) + + // Save sidebar file as JSON + await fs.writeFile( + path.join('src/pages/ensip', 'sidebar.json'), + JSON.stringify( + sidebar.sort((a, b) => a.number - b.number), + null, + 2 + ) + ) + + console.log('Fetched ENSIPs and generated markdown files') + }, + } +} + +function getTitle(markdown: string, ensipNumber: string) { + const tokens = marked.lexer(markdown) + const firstHeading = tokens.find( + (token) => token.type === 'heading' && token.depth === 1 + ) as Tokens.Heading | undefined + + return firstHeading?.text ?? ensipNumber +} diff --git a/vocs.config.ts b/vocs.config.ts index 3783e1274..437ce79bf 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -1,5 +1,8 @@ import { defineConfig } from 'vocs' +import ensipSidebarItems from './src/pages/ensip/sidebar.json' +import { ensips } from './src/plugins/ensips' + export default defineConfig({ title: 'ENS Documentation', titleTemplate: '%s | ENS Docs', @@ -35,6 +38,9 @@ export default defineConfig({ }, }, }, + vite: { + plugins: [ensips()], + }, sidebar: [ { text: 'Intro', @@ -354,11 +360,11 @@ export default defineConfig({ items: [ { text: 'What is an ENSIP?', - link: '', + link: '/ensip', }, { text: 'Proposals', - link: '', + items: ensipSidebarItems, }, ], }, From 0b7a9d9ec3d940afc86ca85c352ec81af99b6566 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Sat, 18 Jan 2025 19:13:18 -0500 Subject: [PATCH 13/79] Update .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6063b3c4d..2d47fa783 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ src/dist # Generated markdown files src/pages/deployments.md -src/pages/ensip/*.md \ No newline at end of file +src/pages/ensip/* +!src/pages/ensip/index.mdx \ No newline at end of file From 9f727d6d55a714218b07afbcd39f1596f9bb9364 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Sat, 18 Jan 2025 19:21:56 -0500 Subject: [PATCH 14/79] Improve generated sidebar workflow --- src/pages/ensip/sidebar.json | 1 - vocs.config.ts | 6 +++++- 2 files changed, 5 insertions(+), 2 deletions(-) delete mode 100644 src/pages/ensip/sidebar.json diff --git a/src/pages/ensip/sidebar.json b/src/pages/ensip/sidebar.json deleted file mode 100644 index fe51488c7..000000000 --- a/src/pages/ensip/sidebar.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/vocs.config.ts b/vocs.config.ts index 437ce79bf..9139f61da 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -1,8 +1,12 @@ import { defineConfig } from 'vocs' -import ensipSidebarItems from './src/pages/ensip/sidebar.json' import { ensips } from './src/plugins/ensips' +const ensipSidebarItems = new Array() +try { + ensipSidebarItems.push(...require('./src/pages/ensip/sidebar.json')) +} catch {} + export default defineConfig({ title: 'ENS Documentation', titleTemplate: '%s | ENS Docs', From 1b52de797641bde9247d97798d492c46350dbfa3 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Sat, 18 Jan 2025 23:39:47 -0500 Subject: [PATCH 15/79] Add metadata to ENSIP pages --- package.json | 1 + pnpm-lock.yaml | 77 +++++++++++++++++++++++++++++++ src/components/EnsipHeader.tsx | 21 +++++++++ src/plugins/ensips.ts | 61 +++++++++++++++++------- vocs.config.ts => vocs.config.tsx | 16 +++++++ 5 files changed, 160 insertions(+), 16 deletions(-) create mode 100644 src/components/EnsipHeader.tsx rename vocs.config.ts => vocs.config.tsx (94%) diff --git a/package.json b/package.json index 8714dcd3c..a453ed9df 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "@tanstack/react-query": "^5.64.1", "@types/react": "latest", "clsx": "^2.1.1", + "gray-matter": "^4.0.3", "marked": "^15.0.6", "react": "latest", "react-dom": "latest", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e22b163b..78117b0f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 marked: specifier: ^15.0.6 version: 15.0.6 @@ -1522,6 +1525,9 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + aria-hidden@1.2.4: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} @@ -1958,6 +1964,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + estree-util-attach-comments@3.0.0: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} @@ -2024,6 +2035,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2151,6 +2166,10 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + h3@1.13.1: resolution: {integrity: sha512-u/z6Z4YY+ANZ05cRRfsFJadTBrNA6e3jxdU+AN5UCbZSZEUwgHiwjvUEe0k1NoQmAvQmETwr+xB5jd7mhCJuIQ==} @@ -2277,6 +2296,10 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2351,6 +2374,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -2378,6 +2405,10 @@ packages: keyvaluestorage-interface@1.0.0: resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -3256,6 +3287,10 @@ packages: scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3342,6 +3377,9 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -3386,6 +3424,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -5705,6 +5747,10 @@ snapshots: arg@5.0.2: {} + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + aria-hidden@1.2.4: dependencies: tslib: 2.8.1 @@ -6146,6 +6192,8 @@ snapshots: escape-string-regexp@5.0.0: {} + esprima@4.0.1: {} + estree-util-attach-comments@3.0.0: dependencies: '@types/estree': 1.0.6 @@ -6244,6 +6292,10 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + extend@3.0.2: {} extension-port-stream@3.0.0: @@ -6374,6 +6426,13 @@ snapshots: graceful-fs@4.2.11: {} + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + h3@1.13.1: dependencies: cookie-es: 1.2.2 @@ -6576,6 +6635,8 @@ snapshots: is-decimal@2.0.1: {} + is-extendable@0.1.1: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -6636,6 +6697,11 @@ snapshots: js-tokens@4.0.0: {} + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + jsesc@3.1.0: {} json-rpc-engine@6.1.0: @@ -6661,6 +6727,8 @@ snapshots: keyvaluestorage-interface@1.0.0: {} + kind-of@6.0.3: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -7848,6 +7916,11 @@ snapshots: scheduler@0.25.0: {} + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + semver@6.3.1: {} semver@7.6.3: {} @@ -7954,6 +8027,8 @@ snapshots: split2@4.2.0: {} + sprintf-js@1.0.3: {} + statuses@2.0.1: {} stdin-discarder@0.1.0: @@ -8003,6 +8078,8 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom-string@1.0.0: {} + strip-final-newline@2.0.0: {} style-to-object@1.0.8: diff --git a/src/components/EnsipHeader.tsx b/src/components/EnsipHeader.tsx new file mode 100644 index 000000000..abf9e1b76 --- /dev/null +++ b/src/components/EnsipHeader.tsx @@ -0,0 +1,21 @@ +type Props = { + authors: string[] + created: string + status: string +} + +export function EnsipHeader({ authors, created, status }: Props) { + return ( +

+

+ Authors: {authors.join(', ')} +

+

+ Created: {created} +

+

+ Status: {status} +

+
+ ) +} diff --git a/src/plugins/ensips.ts b/src/plugins/ensips.ts index 29310b3f5..578a7dcc4 100644 --- a/src/plugins/ensips.ts +++ b/src/plugins/ensips.ts @@ -1,4 +1,5 @@ import fs from 'fs/promises' +import matter from 'gray-matter' import { Tokens, marked } from 'marked' import path from 'path' import { Plugin } from 'vite' @@ -21,7 +22,7 @@ export async function ensips(): Promise { }, async buildStart() { const alreadyExists = await fs - .access('src/pages/ensip/1.md') + .access('src/pages/ensip/1.mdx') .then(() => true) .catch(() => false) @@ -35,27 +36,51 @@ export async function ensips(): Promise { 'https://api.github.com/repos/ensdomains/ensips/contents/ensips' ) const files = (await res.json()) as DirectoryContents - - // Format files for the sidebar const sidebar = new Array() await Promise.all( files.map(async (file) => { const res = await fetch(file.download_url) - const content = await res.text() - const ensipNumber = file.name.split('.')[0] + const mdFile = await res.text() + const parsedMd = matter(mdFile) + const rawBody = parsedMd.content + const rawFrontmatter = parsedMd.matter + const ensipNumber = Number(file.name.split('.')[0]) + const titleLength = getFirstHeadingToken(mdFile)!.raw.length - // Add to sidebar array sidebar.push({ - text: getTitle(content, ensipNumber), + text: getFirstHeadingToken(mdFile)!.text, link: `/ensip/${ensipNumber}`, - number: Number(ensipNumber), + number: ensipNumber, }) + const parsedFrontMatter = parsedMd.data as { + contributors: string[] + ensip: { + status: 'draft' | 'final' | 'obsolete' + created: Date + } + } + + const authors = parsedFrontMatter.contributors.map((c) => `"${c}"`) + const created = parseDate(parsedFrontMatter.ensip.created) + const injectedMarkdown = `` + + // Reconstruct markdown file + const modifiedMarkdown = + '---' + + rawFrontmatter + + '\n---\n\n' + + 'import { EnsipHeader } from "../../components/EnsipHeader";\n' + + rawBody.slice(0, titleLength) + + injectedMarkdown + + '\n' + + rawBody.slice(titleLength) + // Save markdown file await fs.writeFile( - path.join('src/pages/ensip', file.name), - content, + path.join('src/pages/ensip', `${ensipNumber}.mdx`), + modifiedMarkdown, 'utf-8' ) }) @@ -70,17 +95,21 @@ export async function ensips(): Promise { 2 ) ) - - console.log('Fetched ENSIPs and generated markdown files') }, } } -function getTitle(markdown: string, ensipNumber: string) { - const tokens = marked.lexer(markdown) - const firstHeading = tokens.find( +function getFirstHeadingToken(description: string) { + const tokens = marked.lexer(description) + return tokens.find( (token) => token.type === 'heading' && token.depth === 1 ) as Tokens.Heading | undefined +} - return firstHeading?.text ?? ensipNumber +function parseDate(date: Date | string) { + return new Intl.DateTimeFormat('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric', + }).format(new Date(date)) } diff --git a/vocs.config.ts b/vocs.config.tsx similarity index 94% rename from vocs.config.ts rename to vocs.config.tsx index 9139f61da..2ea58453f 100644 --- a/vocs.config.ts +++ b/vocs.config.tsx @@ -45,6 +45,22 @@ export default defineConfig({ vite: { plugins: [ensips()], }, + head: { + // TODO: Ideally this should get injected into
for semantics via a remark plugin. + // Overriding styles will look the same and is easier for now. + // https://vocs.dev/docs/api/config#markdownremarkplugins + '/ensip/': ( + <> + + + ), + }, sidebar: [ { text: 'Intro', From cb06af87b87727beab3d9403cc71a11e60cce3bf Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Tue, 4 Feb 2025 16:16:04 -0500 Subject: [PATCH 16/79] Clean up components --- src/components/Libraries.tsx | 72 +++++++++++++++++------------------- src/components/ui/Button.tsx | 5 +-- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/src/components/Libraries.tsx b/src/components/Libraries.tsx index 40d889372..cf4703257 100644 --- a/src/components/Libraries.tsx +++ b/src/components/Libraries.tsx @@ -166,48 +166,42 @@ const ensLibraries: Language[] = [ }, ] +// TODO: Make this a masonry grid export function Libraries() { return ( -
-
- {ensLibraries.map((language) => ( -
-
-
{language.name}
-
- +
+ {ensLibraries.map((language) => ( +
+ + {language.name} + + - ))} -
+
+ ))}
) } diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx index da9015486..ffd5017ed 100644 --- a/src/components/ui/Button.tsx +++ b/src/components/ui/Button.tsx @@ -1,9 +1,8 @@ -/* eslint-disable sonarjs/no-duplicate-string */ -import { FC, PropsWithChildren } from 'react' +import { ComponentProps, FC, PropsWithChildren } from 'react' import { cn } from '../../lib/utils' -const ArrowIcon: FC> = (properties) => { +const ArrowIcon: FC> = (properties) => { return (
- luc.eth - ➡️ - 0x225...c3B5 -
+ + + The simplest thing you can do is start with a name, and resolve it to an address. We call this a "forward lookup". @@ -29,47 +21,48 @@ Think of places where users can enter names, such as sending transactions, chatt Note that all dot-separated strings should be treated as potential ENS names, since ENS supports [many TLDs](/dns/tlds). A common mistake is to only treat strings that end in `.eth` as ENS names. - +:::code-group -```tsx {{ title: 'Wagmi (React)', language: 'tsx', meta: 'focus=4:9', variant: 'wagmi', link: 'https://wagmi.sh/react/hooks/useEnsAddress', stackblitz: 'https://stackblitz.com/edit/ens-wagmi-use-ens-address' }} -import { useAccount, useEnsName, useEnsAvatar } from "wagmi"; +```tsx [Wagmi] +import { useAccount, useEnsAvatar, useEnsName } from 'wagmi' export const Name = () => { - const { data: ensName } = useEnsAddress({ - address: "luc.eth", // The name to lookup - chainId: 1, // The chain to start resolution on (Ethereum mainnet or testnet) - }); + const { data: ensName } = useEnsAddress({ + address: 'luc.eth', // The name to lookup + chainId: 1, // The chain to start resolution on (Ethereum mainnet or testnet) + }) - return
{ensName || address}
; -}; + return
{ensName || address}
+} ``` -```ts {{ title: 'Ethers.js (TS)', variant: 'ethers-v5' }} -const address = await provider.lookupAddress("luc.eth"); +```ts [Ethers.js] +const address = await provider.lookupAddress('luc.eth') ``` -```ts {{ title: 'Viem (TS)', variant: 'viem', link: 'https://viem.sh/docs/ens/actions/getEnsAddress.html', stackblitz: 'https://stackblitz.com/edit/ens-viem-get-ens-address' }} -import { normalize } from "viem/ens"; -import { publicClient } from "./client"; +```ts [Viem] +import { normalize } from 'viem/ens' + +import { publicClient } from './client' const ensAddress = await publicClient.getEnsAddress({ - name: normalize("luc.eth"), -}); + name: normalize('luc.eth'), +}) ``` -```py {{ title: 'web3.py (Python)', variant: 'web3py', link: 'https://web3py.readthedocs.io/en/latest/ens_overview.html#get-the-address-for-an-ens-name' }} +```py [web3.py] from ens.auto import ns address = ns.address('alice.eth') ``` -```rust {{ variant: 'ethers-rs' }} +```rust [ethers-rs] let provider = Provider::::try_from("https://mainnet.infura.io/v3/...")?; let address = provider.lookup_address("luc.eth").await?; ``` -```go {{ variant: 'go-ens' }} +```go [go-ens] package main import ( @@ -90,58 +83,44 @@ func main() { } ``` -```ts {{ title: 'Alchemy', variant: 'alchemy-sdk', link: "https://docs.alchemy.com/docs/how-to-resolve-ewallet-given-ens" }} -// Setup: npm install alchemy-sdk -import { Alchemy, Network } from "alchemy-sdk"; - -const config = { - apiKey: "<-- ALCHEMY APP API KEY -->", - network: Network.ETH_MAINNET, -}; -const alchemy = new Alchemy(config); - -alchemy.core.resolveName("vitalik.eth").then(console.log); -``` - -```ts {{ variant: 'ensjs', link: 'https://github.com/ensdomains/ensjs/blob/feat/viem/docs/basics/fetching-a-profile.md' }} -import { http } from "viem"; -import { mainnet } from "viem/chains"; -import { createEnsPublicClient } from "@ensdomains/ensjs"; +```ts [ensjs] +import { createEnsPublicClient } from '@ensdomains/ensjs' +import { http } from 'viem' +import { mainnet } from 'viem/chains' const client = createEnsPublicClient({ - chain: mainnet, - transport: http(), -}); + chain: mainnet, + transport: http(), +}) -const subgraphRecords = client.getSubgraphRecords({ name: "ens.eth" }); +const subgraphRecords = client.getSubgraphRecords({ name: 'ens.eth' }) const records = client.getRecords({ - name: "ens.eth", - records: { - coins: [...(subgraphRecords?.coins || []), "BTC", "ETH", "ETC", "SOL"], - texts: [ - ...(subgraphRecords?.texts || []), - "avatar", - "email", - "description", - ], - contentHash: true, - abi: true, - }, -}); + name: 'ens.eth', + records: { + coins: [...(subgraphRecords?.coins || []), 'BTC', 'ETH', 'ETC', 'SOL'], + texts: [ + ...(subgraphRecords?.texts || []), + 'avatar', + 'email', + 'description', + ], + contentHash: true, + abi: true, + }, +}) ``` - -```csharp {{ variant: "nethereum" }} -var ensService = new Nethereum.ENS.ENSService(web3); -var address = await ensService.ResolveAddressAsync("alice.eth"); +```csharp [nethereum] +var ensService = new Nethereum.ENS.ENSService(web3) +var address = await ensService.ResolveAddressAsync('alice.eth') ``` -
+::: To learn what happens under the hood when you do a forward lookup, read the [resolution](/resolution) section. -## Multi-Chain Addresses (BTC, LTC, etc) {{ navtitle: 'Multi-Chain Addresses', label: 'Multi-Chain', id: 'multi-chain', tag: '', }} +## Multi-Chain Addresses (BTC, LTC, etc) ENS Names aren't just limited to storing Ethereum addresses. Any blockchain address (BTC, LTC, SOL, etc.) can be queried by [SLIP-0044](https://github.com/satoshilabs/slips/blob/master/slip-0044.md) coin type or a value derived from an EVM Chain ID (specified in [ENSIP-11](/ensip/11)). This includes Ethereum L2 networks such as OP Mainnet and Base. @@ -150,62 +129,74 @@ For EVM Chains besides Mainnet Ethereum, always use its [ENSIP-11](/ensip/11) co The standardization of multichain addresses was first introduced in [ENSIP-9](/ensip/9), and also [EIP-2304](https://eips.ethereum.org/EIPS/eip-2304). - - Regardless of the chain you're resolving an address for, ENS resolution always starts from Ethereum L1. - +:::note +Regardless of the chain you're resolving an address for, ENS resolution always starts from Ethereum L1. +::: - +:::code-group -```tsx {{ variant: 'wagmi', link: 'https://wagmi.sh/react/api/hooks/useEnsAddress' }} -import { useEnsAddress } from "wagmi"; -import { arbitrum, base } from "wagmi/chains"; +```tsx [Wagmi] +// https://wagmi.sh/react/api/hooks/useEnsAddress +import { useEnsAddress } from 'wagmi' +import { arbitrum, base } from 'wagmi/chains' -const name = "gregskril.eth"; +const name = 'gregskril.eth' const evmChainIdToCoinType = (chainId: number) => { - return (0x80000000 | chainId) >>> 0; -}; + return (0x80000000 | chainId) >>> 0 +} export const MyAddresses = () => { // SLIP-0044 Coin Types (see ENSIP-9) - const { data: bitcoinAddr } = useEnsAddress({ name, coinType: 0, chainId: 1 }); - const { data: solanaAddr } = useEnsAddress({ name, coinType: 501, chainId: 1 }); + const { data: bitcoinAddr } = useEnsAddress({ name, coinType: 0, chainId: 1 }) + const { data: solanaAddr } = useEnsAddress({ + name, + coinType: 501, + chainId: 1, + }) // EVM Chain IDs (see ENSIP-11) const { data: baseAddr } = useEnsAddress({ name, coinType: evmChainIdToCoinType(base.id), chainId: 1, - }); + }) const { data: arbitrumAddr } = useEnsAddress({ name, coinType: evmChainIdToCoinType(arbitrum.id), chainId: 1, - }); + }) - return
{JSON.stringify({ bitcoinAddr, solanaAddr, baseAddr, arbitrumAddr })}
; -}; + return ( +
+ {JSON.stringify({ bitcoinAddr, solanaAddr, baseAddr, arbitrumAddr })} +
+ ) +} ``` -```ts {{ variant: 'viem', link: 'https://viem.sh/docs/ens/actions/getEnsAddress.html#cointype-optional', stackblitz: 'https://stackblitz.com/edit/ens-viem-get-ens-address' }} +```ts [Viem] +// https://viem.sh/docs/ens/actions/getEnsAddress.html#cointype-optional const ensName = await publicClient.getEnsAddress({ - name: normalize("wagmi-dev.eth"), - coinType: 0, // BTC -}); + name: normalize('wagmi-dev.eth'), + coinType: 0, // BTC +}) ``` -```ts {{ variant: 'ethers-v5', link: 'https://docs.ethers.org/v5/api/providers/provider/#EnsResolver' }} -const resolver = await provider.getResolver("luc.eth"); -const btcAddress = await resolver?.getAddress(0); +```ts [Ethers.js] +// https://docs.ethers.org/v5/api/providers/provider/#EnsResolver +const resolver = await provider.getResolver('luc.eth') +const btcAddress = await resolver?.getAddress(0) ``` -```py {{ title: 'web3.py (Python)', variant: 'web3py', link: 'https://web3py.readthedocs.io/en/latest/ens_overview.html#multichain-address-resolution' }} +```py [web3.py (Python)] +// https://web3py.readthedocs.io/en/latest/ens_overview.html#multichain-address-resolution from ens.auto import ns eth_address = ns.address('alice.eth', coin_type=60) ``` -
+::: | Network | Coin Type | | ------------ | ---------- | @@ -219,11 +210,7 @@ eth_address = ns.address('alice.eth', coin_type=60) | Base | 2147492101 | | Arbitrum One | 2147525809 | -
- ... and many many more following - [SLIP-0044](https://github.com/satoshilabs/slips/blob/master/slip-0044.md) - and [ENSIP-11](/ensip/11) -
+... and many many more following [SLIP-0044](https://github.com/satoshilabs/slips/blob/master/slip-0044.md) and [ENSIP-11](/ensip/11) ### Decoding Address Hashes @@ -232,8 +219,8 @@ ENS resolvers store all addresses in bytes, which may have to be encoded to thei ## Advanced diff --git a/vocs.config.tsx b/vocs.config.tsx index 2ea58453f..8ed4501d8 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -135,7 +135,7 @@ export default defineConfig({ items: [ { text: 'Addresses', - link: '', + link: '/web/resolution', }, { text: 'Text Records', From 55090646bb889abb80207a6cbef1bd1d12fb8257 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Tue, 4 Feb 2025 17:15:41 -0500 Subject: [PATCH 18/79] Add web/records page --- src/pages/web/records.mdx | 161 +++++++++++------------------------ src/pages/web/resolution.mdx | 2 +- vocs.config.tsx | 2 +- 3 files changed, 52 insertions(+), 113 deletions(-) diff --git a/src/pages/web/records.mdx b/src/pages/web/records.mdx index 91a738708..00d90edc6 100644 --- a/src/pages/web/records.mdx +++ b/src/pages/web/records.mdx @@ -1,46 +1,19 @@ -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Store & Retrieve information from Profiles', - emoji: '🔍', - contributors: [ - 'luc.eth' - ] -}; +--- +description: Store & Retrieve information from Profiles +--- + +import { EmbedLink } from '../../components/EmbedLink' +import { TextRecords } from '../../components/TextRecords' +import { Card } from '../../components/ui/Card' # Text Records With every name come a set of records. These records are key value pairs that can be used to store information about the profile. Think of this as a user's **digital backpack**. Utalized for storage of preferences, public details, and more. -
-
- nick.eth - ➡️ -
-
- -
-
- { - [ - ["display", "Nick.eth"], - ["description", "Lead developer of ENS"], - ["avatar", "ipfs://Qm..."], - ["com.twitter", "nicksdjohnson"], - ].map(([key, value]) => ( -
- {key} - {value} -
- )) - } -
-
-
-
+ + + Text records allow us to attach and read any key value pair from an ENS name. The most popular records have been standardised. One example of a standardised record is the [avatar record](/web/avatars) which is used to store a user's profile picture. @@ -49,50 +22,54 @@ One example of a standardised record is the [avatar record](/web/avatars) which To fetch the record for a specific name, you can use one of the following methods: - +:::code-group -```tsx {{ title: "Wagmi", variant: "wagmi", link: "https://wagmi.sh/react/api/hooks/useEnsText" }} -import { useEnsText } from "wagmi"; -import { normalize } from "viem/ens"; +```tsx [Wagmi] +// https://wagmi.sh/react/api/hooks/useEnsText +import { normalize } from 'viem/ens' +import { useEnsText } from 'wagmi' export const MyProfile: FC<{ name: string }> = ({ name }) => { - const { data } = useEnsText({ - name: normalize("luc.eth"), - key: "com.twitter", - }); - - return ( -
- Twitter: {data} -
- ); -}; + const { data } = useEnsText({ + name: normalize('luc.eth'), + key: 'com.twitter', + }) + + return ( +
+ Twitter: {data} +
+ ) +} ``` -```tsx {{ title: "Ethers", variant: "ethers", link: "https://docs.ethers.org/v5/api/providers/provider/#EnsResolver" }} -const provider = new ethers.providers.JsonRpcProvider(); +```tsx [Ethers] +// https://docs.ethers.org/v5/api/providers/provider/#EnsResolver +const provider = new ethers.providers.JsonRpcProvider() -const resolver = await provider.getResolver("luc.eth"); -const twitter = await resolver.getText("com.twitter"); +const resolver = await provider.getResolver('luc.eth') +const twitter = await resolver.getText('com.twitter') ``` -```tsx {{ title: "Viem", variant: "viem", link: "https://viem.sh/docs/ens/actions/getEnsText.html", stackblitz: 'https://stackblitz.com/edit/ens-viem-get-ens-text' }} -import { normalize } from "viem/ens"; -import { createPublicClient, http } from "viem"; -import { mainnet } from "viem/chains"; +```tsx [Viem] +// https://viem.sh/docs/ens/actions/getEnsText.html +import { createPublicClient, http } from 'viem' +import { mainnet } from 'viem/chains' +import { normalize } from 'viem/ens' const publicClient = createPublicClient({ - chain: mainnet, - transport: http(), -}); + chain: mainnet, + transport: http(), +}) const ensText = await publicClient.getEnsText({ - name: normalize("luc.eth"), - key: "com.twitter", -}); + name: normalize('luc.eth'), + key: 'com.twitter', +}) ``` -```python {{ title: "web3.py", variant: "web3.py", link: "https://web3py.readthedocs.io/en/latest/ens_overview.html#text-records" }} +```python [web3.py] +# https://web3py.readthedocs.io/en/latest/ens_overview.html#text-records from ens.auto import ns # set text @@ -103,11 +80,7 @@ url = ns.get_text('alice.eth', 'url') assert url == 'https://example.com' ``` -```tsx {{ title: "Ethers.rs", variant: "rust" }} -// TODO: Not Implemented -``` - -```go {{ title: "Go", variant: "go" }} +```go [Go] package main import ( @@ -128,7 +101,7 @@ func main() { } ``` -
+::: ## Types of Records @@ -153,51 +126,17 @@ Here are some of the most commonly used records: Currently there are a few records that have been standardised. However you are welcome to store any key value pair you desire. We generally recommend to stick to a pattern, or prefix things with your app or protocol (eg. `com.discord`, or `org.reddit`), as such to avoid collisions. -### Header/Banner Record - One of the newer standardised records is the "header" record. This header record, similar to the avatar record, accepts any IPFS, Arweave, EIP155, or regular URL to an image resource. The image is then displayed as a banner on the profile page and tends to be in a 1:3 aspect ratio. -
-
- { - ["luc.eth", "pedrouid.eth", "coltron.eth"].map(async (name) => { - const request = await fetch("https://worker.enstate.rs/n/" + name); - const data = await request.json(); - - return ( -
-
- {data?.header && ( - - )} -
-
- { - data?.avatar && - } -
-
- {name} -
-
- ) - }) - } -
-
- ## Setting Records When records are loaded they are loaded from the resolver responsible for the name. As resolvers are user controlled, we cannot guarantee a write function is available. This makes it a more in-depth process to update a users records. diff --git a/src/pages/web/resolution.mdx b/src/pages/web/resolution.mdx index 457c44288..492a4e999 100644 --- a/src/pages/web/resolution.mdx +++ b/src/pages/web/resolution.mdx @@ -190,7 +190,7 @@ const btcAddress = await resolver?.getAddress(0) ``` ```py [web3.py (Python)] -// https://web3py.readthedocs.io/en/latest/ens_overview.html#multichain-address-resolution +# https://web3py.readthedocs.io/en/latest/ens_overview.html#multichain-address-resolution from ens.auto import ns eth_address = ns.address('alice.eth', coin_type=60) diff --git a/vocs.config.tsx b/vocs.config.tsx index 8ed4501d8..63baa7241 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -139,7 +139,7 @@ export default defineConfig({ }, { text: 'Text Records', - link: '', + link: '/web/records', }, { text: 'Avatars', From 982beb60dd5cc030ab08eaf884c22e4f48b222bb Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Tue, 4 Feb 2025 17:20:04 -0500 Subject: [PATCH 19/79] Add /web/avatars page --- src/pages/web/avatars.mdx | 95 ++++++++++++++++++--------------------- vocs.config.tsx | 2 +- 2 files changed, 45 insertions(+), 52 deletions(-) diff --git a/src/pages/web/avatars.mdx b/src/pages/web/avatars.mdx index 47bc18b5e..0a11ba6d4 100644 --- a/src/pages/web/avatars.mdx +++ b/src/pages/web/avatars.mdx @@ -1,76 +1,69 @@ -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'The \'Avatar\' record is a special record that allows for user profile pictures to be stored on ENS.', - emoji: '🔍', - contributors: [ - 'luc.eth' - ] -}; +--- +description: The Avatar record is a special record that allows for user profile pictures to be stored on ENS. +--- + +import { EnsProfile } from '../../components/EnsProfile' +import { Card } from '../../components/ui/Card' # Avatars Personalization of profiles is what makes identity great. This page covers the very special **avatar** record that enables users to take their avatar with them across the web. -
-
- luc.eth - ➡️ -
- luc.eth -
-
-
- -## Getting the user's Avatar {{ navtitle: 'Getting an Avatar', id: 'avatars', tag: 'Avatar' }} + + + + +## Getting the user's Avatar Avatars are an awesome way for users to express themselves. To get the user's avatar, all you need is their **name**. If you only have their address, see [primary names](/web/reverse#get). The following code snippets let you get the avatar for a user. - +:::code-group -```tsx {{ variant: 'wagmi', link: 'https://wagmi.sh/react/hooks/useEnsAvatar', stackblitz: 'https://stackblitz.com/edit/ens-wagmi-use-ens-avatar' }} -import { useEnsAvatar } from "wagmi"; +```tsx [Wagmi] +// https://wagmi.sh/react/hooks/useEnsAvatar +import { useEnsAvatar } from 'wagmi' function App() { const { data: ensAvatar } = useEnsAvatar({ - address: "luc.eth", + address: 'nick.eth', chainId: 1, // (1 = Ethereum Mainnet, 11155111 = Sepolia) - }); + }) return ( luc.eth - ); + ) } ``` -```ts {{ variant: 'ethers-v5' }} -const ensAvatar = await provider.getAvatar("luc.eth"); +```ts [Ethers] +// https://docs.ethers.org/v5/api/providers/provider/#Provider-getAvatar +const ensAvatar = await provider.getAvatar('nick.eth') ``` -```ts {{ variant: 'viem', link: 'https://viem.sh/docs/ens/actions/getEnsAvatar.html', stackblitz: 'https://stackblitz.com/edit/ens-viem-get-ens-avatar' }} -import { normalize } from "viem/ens"; -import { publicClient } from "./client"; +```ts [Viem] +// https://viem.sh/docs/ens/actions/getEnsAvatar.html +import { normalize } from 'viem/ens' + +import { publicClient } from './client' const ensAvatar = await publicClient.getEnsAvatar({ - name: normalize("luc.eth"), -}); + name: normalize('nick.eth'), +}) ``` -```py {{ variant: 'web3py', link: 'https://web3py.readthedocs.io/en/latest/ens_overview.html#read-text-metadata-for-an-ens-record' }} +```py [Web3.py] +# https://web3py.readthedocs.io/en/latest/ens_overview.html#read-text-metadata-for-an-ens-record from ens.auto import ns avatar = ns.get_text('alice.eth', 'avatar') ``` -```go {{ title: "Go", variant: "go" }} +```go [Go] package main import ( @@ -83,7 +76,7 @@ import ( func main() { client, _ := ethclient.Dial("https://rpc.ankr.com/eth") - domain, _ := ens.Normalize("luc.eth") + domain, _ := ens.Normalize("nick.eth") resolver, _ := ens.NewResolver(client, domain) avatar, _ := resolver.Text("avatar") @@ -91,7 +84,7 @@ func main() { } ``` - +::: ### The Metadata Service @@ -99,12 +92,12 @@ The [metadata service](https://metadata.ens.domains/docs) is run by ENS Labs. It avatar of an ENS name via a web request, as opposed to adding extra logic to your application and interacting with an ethereum node. This is of course centralised and should be used if absolutely necessary. -## What exactly is an Avatar Record? {{ navtitle: 'What is it exactly?', id: 'avatar-record', tag: 'Avatar' }} +## What exactly is an Avatar Record? An avatar record is simply a [text record](/web/records) that has "avatar" as its key and a URI as its value, with some rules about what URI schemes are supported and how to process them. For more info, see [ENSIP-11](/ensip/12). -## Supported URI schemes {{ navtitle: 'Supported URI schemas', id: 'uri-schemas', tag: 'URI' }} +## Supported URI schemes Clients are expected to support a number of URI schemas, which aren't always web URIs, so the final result you see in your application will vary depending on how the library you are using has decided to handle avatar records. @@ -116,18 +109,18 @@ will vary depending on how the library you are using has decided to handle avata - `eip155:` - The URI scheme for EIP-155 identifiers for linking to NFTs on Ethereum based chains. A little complicated to resolve manually, most libraries should resolve this for you and return the underlying resource. - - For EIP-155 NFT Avatars the nft must be owned by the wallet address the ENS - name resolves to. This is done by checking the `ownerOf` method on the NFT - contract. - +:::note +For EIP-155 NFT Avatars the nft must be owned by the wallet address the ENS +name resolves to. This is done by checking the `ownerOf` method on the NFT +contract. +::: -## Common schemes that aren't officially supported {{ navtitle: 'Common schemas', id: 'common-schemas', tag: 'URI' }} +## Common schemes that aren't officially supported - `ethereum:` - The URI scheme for Ethereum addresses - `bzz:` - The URI scheme for Swarm hashes -## File Information {{ navtitle: 'File Information', id: 'files', tag: 'Metadata' }} +## File Information Avatars come in many different shapes and sizes. Not just the above URI schemas, but also in different file formats, sizes, and more. Although standards exist for some of these, files are **not required** to follow these standards. diff --git a/vocs.config.tsx b/vocs.config.tsx index 63baa7241..24e404281 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -143,7 +143,7 @@ export default defineConfig({ }, { text: 'Avatars', - link: '', + link: '/web/avatars', }, { text: 'Primary Names', From 4c8ec1ede60bc86e8a2de4c61c6d23d9f3c6d7ab Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Tue, 4 Feb 2025 20:45:28 -0500 Subject: [PATCH 20/79] Add /web/reverse page --- src/components/EnsProfile.tsx | 40 ++++-- src/components/ui/Badge.tsx | 9 ++ src/pages/web/avatars.mdx | 2 +- src/pages/web/reverse.mdx | 231 +++++++++++++++++++--------------- vocs.config.tsx | 2 +- 5 files changed, 168 insertions(+), 116 deletions(-) create mode 100644 src/components/ui/Badge.tsx diff --git a/src/components/EnsProfile.tsx b/src/components/EnsProfile.tsx index 68219dace..bd50aead3 100644 --- a/src/components/EnsProfile.tsx +++ b/src/components/EnsProfile.tsx @@ -4,33 +4,47 @@ import { useEnsAddress, useEnsAvatar, useEnsName } from 'wagmi' import { cn, truncateAddress } from '../lib/utils' type EnsProfileProps = - | { name: string; address: undefined } - | { address: Address; name: undefined } + | { name: string; address: undefined; hideAddress?: boolean } + | { address: Address; name: undefined; hideAddress?: boolean } -export function EnsProfile({ name, address }: EnsProfileProps) { +export function EnsProfile({ name, address, hideAddress }: EnsProfileProps) { return name - ? EnsProfileFromName({ name }) + ? EnsProfileFromName({ name, hideAddress }) : address - ? EnsProfileFromAddress({ address }) + ? EnsProfileFromAddress({ address, hideAddress }) : null } -function EnsProfileFromName({ name }: { name: string }) { +function EnsProfileFromName({ + name, + hideAddress, +}: { + name: string + hideAddress?: boolean +}) { const { data: address } = useEnsAddress({ name, chainId: 1 }) - return + return } -function EnsProfileFromAddress({ address }: { address: Address }) { +function EnsProfileFromAddress({ + address, + hideAddress, +}: { + address: Address + hideAddress?: boolean +}) { const { data: name } = useEnsName({ address, chainId: 1 }) - return + return } function Profile({ name, address, + hideAddress, }: { name?: string | null address?: Address | null + hideAddress?: boolean }) { const { data: avatar } = useEnsAvatar({ name: name || undefined, chainId: 1 }) @@ -44,9 +58,11 @@ function Profile({
{name || 'No name'} - - {truncateAddress(address || zeroAddress)} - + {!hideAddress && ( + + {truncateAddress(address || zeroAddress)} + + )}
diff --git a/src/components/ui/Badge.tsx b/src/components/ui/Badge.tsx new file mode 100644 index 000000000..ad751bca9 --- /dev/null +++ b/src/components/ui/Badge.tsx @@ -0,0 +1,9 @@ +import { PropsWithChildren } from 'react' + +export function Badge({ children }: PropsWithChildren) { + return ( +
+ {children} +
+ ) +} diff --git a/src/pages/web/avatars.mdx b/src/pages/web/avatars.mdx index 0a11ba6d4..f3fb6dc22 100644 --- a/src/pages/web/avatars.mdx +++ b/src/pages/web/avatars.mdx @@ -11,7 +11,7 @@ Personalization of profiles is what makes identity great. This page covers the very special **avatar** record that enables users to take their avatar with them across the web. - + ## Getting the user's Avatar diff --git a/src/pages/web/reverse.mdx b/src/pages/web/reverse.mdx index 3a5dd5016..cb5be698e 100644 --- a/src/pages/web/reverse.mdx +++ b/src/pages/web/reverse.mdx @@ -1,74 +1,77 @@ -import { WIP } from '@/components/wip/WIP'; +--- +description: To lookup the name of an address we use a reverse resolution. This allows users to indicate a primary name. +--- -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'To lookup the name of an address we use a reverse resolution. This allows users to indicate a primary name.', - emoji: '🔍', - contributors: [ - 'luc.eth' - ] -}; +import { EnsProfile } from '../../components/EnsProfile' +import { Badge } from '../../components/ui/Badge' +import { Card } from '../../components/ui/Card' # Primary Names We can all agree 42-character long machine-optimized addresses (eg. 0x225...c3b5) are not aesthetically pleasing. Fortunately, it is super easy to retrieve a user's preferred name, and this page will show you how. -
- 0x225...c3B5 - to - -
+ + 0x225...c3B5 + to + + In order to convert them to human-readable names, we use [the reverse registrar](/registry/reverse). The reverse registrar is a smart contract that allows users to register their preferred name, referred to as their "primary name" for simplicity purposes. -## Getting a Primary Name {{ navtitle: 'Getting Primary Name', id: 'get' }} +This functionality exists on Mainnet Ethereum today, and is coming soon to L2s as well (see ENSIP-19). -To get a users preferred primary name is very simple. In most libraries you will find a function to do a lookup by address as shown below. -This allows us to turn any address into a human-readable name. +## Getting a Primary Name - +:::info +**Important**: After retrieving a name from reverse resolution, you **must** verify it by performing a forward resolution on that name to confirm it still resolves to the original address. This prevents spoofing or misconfiguration. If the addresses don't match, display the original address instead of the name. +::: -```tsx {{ meta: 'focus=4:8', variant: 'wagmi', link: 'https://wagmi.sh/react/hooks/useEnsName', stackblitz: 'https://stackblitz.com/edit/ens-wagmi-use-ens-name' }} -import { useEnsName } from 'wagmi'; -import { mainnet } from 'wagmi/chains'; +Looking up a users primary name is very simple. In most web3 libraries (wagmi, viem, ethers, web3py, etc.), you will find a built-in function to do a lookup by address as shown below. In most cases, the library will handle the verification for you. + +Note that all ENS requests are made from Ethereum Mainnet, even if your application is on an L2. + +:::code-group + +```tsx [Wagmi] +// https://wagmi.sh/react/hooks/useEnsName +import { useEnsName } from 'wagmi' +import { mainnet } from 'wagmi/chains' export const Name = () => { - const { data: name } = useEnsName({ - address: '0x225f137127d9067788314bc7fcc1f36746a3c3B5', - chainId: mainnet.id, // resolution always starts from L1 - }); + const { data: name } = useEnsName({ + address: '0xb8c2C29ee19D8307cb7255e1Cd9CbDE883A267d5', + chainId: mainnet.id, // resolution always starts from L1 + }) - return
Name: {name}
; -}; + return
Name: {name}
+} ``` -```ts {{ variant: 'ethers-v5' }} -// 0x225f137127d9067788314bc7fcc1f36746a3c3B5 -> luc.eth +```ts [Ethers] const name = await provider.lookupAddress( - '0x225f137127d9067788314bc7fcc1f36746a3c3B5' -); + '0xb8c2C29ee19D8307cb7255e1Cd9CbDE883A267d5' +) ``` -```ts {{ variant: 'viem', link: 'https://viem.sh/docs/ens/actions/getEnsName.html', stackblitz: 'https://stackblitz.com/edit/ens-viem-get-ens-name' }} -// 0x225f137127d9067788314bc7fcc1f36746a3c3B5 -> luc.eth -import { publicClient } from './client'; +```ts [Viem] +// https://viem.sh/docs/ens/actions/getEnsName.html +import { publicClient } from './client' const ensName = await publicClient.getEnsName({ - address: '0x225f137127d9067788314bc7fcc1f36746a3c3B5', -}); + address: '0xb8c2C29ee19D8307cb7255e1Cd9CbDE883A267d5', +}) ``` -```py {{ variant: 'web3py', link: 'https://web3py.readthedocs.io/en/latest/ens_overview.html#get-the-ens-name-for-an-address' }} +```py [Web3.py] +# https://web3py.readthedocs.io/en/latest/ens_overview.html#get-the-ens-name-for-an-address from ens.auto import ns -# 0x225f137127d9067788314bc7fcc1f36746a3c3B5 -> luc.eth -name = ns.name('0x225f137127d9067788314bc7fcc1f36746a3c3B5') +name = ns.name('0xb8c2C29ee19D8307cb7255e1Cd9CbDE883A267d5') ``` - -```go {{ variant: 'go', title: 'Go' }} +```go [Go] package main import ( @@ -82,91 +85,115 @@ import ( func main() { client, _ := ethclient.Dial("https://rpc.ankr.com/eth") - name, _ := ens.ReverseResolve(client, common.HexToAddress("0x225f137127d9067788314bc7fcc1f36746a3c3B5")) + name, _ := ens.ReverseResolve(client, common.HexToAddress("0xb8c2C29ee19D8307cb7255e1Cd9CbDE883A267d5")) fmt.Println("Name:", name) - // Name: luc.eth + // Name: nick.eth } ``` -
+::: 🎉 And that's it! Now you can turn all your pages from this, to this: -
-
- - sent 0.1 ETH to - -
-
- turns into -
-
- - sent 0.1 ETH to - -
-
+ +
+ 0xb8c2...67d5 + send 0.1 ETH to + 0xd8dA....6045 +
+ turns into +
+ nick.eth + sent 0.1 ETH to + vitalik.eth +
+
+ +## Setting Primary Names + +In some cases you might want to encourage users to set their primary name. This might be in the event you are issuing names, or want people to be part of a community. + +To do so, you can use the `setName()` function on the [reverse registrar contract](/learn/deployments). + +## L2 Primary Names + +Currently, primary names are only supported on Ethereum Mainnet. Soon, primary names are also coming to L2s and are already available on testnets. This will make it possible for users to have an end-to-end experience with ENS on L2. + +New contracts will be deployed to popular L2s (starting with Base, OP Mainnet, Arbitrum, Linea, and Scroll) that allow users to declare a name as their primary onchain identity. The contract interface will look something like this (not finalized): + +```solidity +/// @notice Sets the `name()` record for the reverse ENS record associated with the calling account. +/// @param name The name to set +/// @return The ENS node hash of the reverse record +function setName(string memory name) external returns (bytes32); + +/// @notice Sets the `name()` record for the reverse ENS record associated with the addr provided account. +/// Can be used if the addr is a contract that is owned by an SCA. +/// @param addr The address to set the name for +/// @param name The name to set +/// @return The ENS node hash of the reverse record +function setNameForAddr( + address addr, + string memory name +) external returns (bytes32); + +/// @notice Sets the `name()` record for the reverse ENS record associated with the contract provided that is owned with `Ownable`. +/// @param contractAddr The address of the contract to set the name for (implementing Ownable) +/// @param owner The owner of the contract (via Ownable) +/// @param name The name to set +/// @param coinTypes The coin types to set. Must be inclusive of the coin type for the contract +/// @param signatureExpiry The expiry of the signature +/// @param signature The signature of an address that will return true on isValidSignature for the owner +/// @return The ENS node hash of the reverse record +function setNameForOwnableWithSignature( + address contractAddr, + address owner, + string calldata name, + uint256[] memory coinTypes, + uint256 signatureExpiry, + bytes calldata signature +) external returns (bytes32); + +/// @notice Sets the `name()` record for the reverse ENS record associated with the addr provided account using a signature. +/// @param addr The address to set the name for +/// @param name The name of the reverse record +/// @param coinTypes The coin types to set. Must be inclusive of the coin type for the contract +/// @param signatureExpiry Date when the signature expires +/// @param signature The signature from the addr +/// @return The ENS node hash of the reverse record +function setNameForAddrWithSignature( + address addr, + string calldata name, + uint256[] calldata coinTypes, + uint256 signatureExpiry, + bytes calldata signature +) external returns (bytes32); +``` -{/* ### Do's and Dont's +This provides multiple ways to set a primary name, usable for EOAs or smart contracts which is a big improvement over the current L1-only implementation. - */} +After retrieving a name from L2 reverse resolution, you must verify it by performing a forward resolution for the corresponding cointype on that name to confirm it still resolves to the original address. Let's look at an example: -## Setting Primary Names {{ navtitle: 'Setting your Name', id: 'set' }} +Say I own gregskril.eth on mainnet. The name resolves to my EOA `0x179A...9285` because I've set the ETH address for that name. I call `setName("gregskril.eth")` on the Base reverse registry, and I expect that my primary name is now `gregskril.eth` on Base. But that's actually not the case. -In some cases you might want to encourage users to set their primary name. -This might be in the event you are issuing names, or want people to be part of a community. +ENS names can resolve to [different addresses on different chains](/web/resolution), and since gregskril.eth in the example above has only specified an ETH address, the verification process will fail. In order to fix this, I need to set the Base address for gregskril.eth which is on L1 in this case. This is done by calling `setAddr(namehash("gregskril.eth"), 0x179A...9285)` on the resolver for the name. -Currently, primary names are only support on L1 mainnet. Soon, primary names are also coming to L2s and are already available on testnets. The examples below use the testnet deployments, for which the [latest code can be found here](https://github.com/ensdomains/ens-contracts/pull/379). +Now that gregskril.eth resolves to `0x179A...9285` when using the Base cointype, and `name(0x179A...9285)` on the Base reverse registry returns `gregskril.eth`, my primary name is fully set. -Deployments for the latest L2 reverse registrars, the contracts that power L2 primary names, +### L2 Reverse Registry Deployments | L2 Testnet Chain | Address | -|------------------|------------------------------------------- | +| ---------------- | ------------------------------------------ | | Base Sepolia | 0xa12159e5131b1eEf6B4857EEE3e1954744b5033A | | OP Sepolia | 0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376 | | Arbitrum Sepolia | 0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376 | | Scroll Sepolia | 0xc0497E381f536Be9ce14B0dD3817cBcAe57d2F62 | | Linea Sepolia | 0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376 | -On these chains, you can set a primary name for the sender via `setName()` most simply, or via signature. +On these chains, you can set a primary name for the sender via `setName()` most simply, or via signature. `setNameForAddrWithSignature()` can be used for EOAs or smart contracts with an ERC-1271 signature, while `setNameForAddrWithSignatureAndOwnable()` can be used when a smart contract has an explicit `owner()`. -{/* - -```tsx {{ meta: 'focus=4:9', variant: 'wagmi' }} -``` - -```ts {{ variant: 'ethers-v5' }} -``` - -```ts {{ variant: 'ensjs' }} -import { createWalletClient, custom } from 'viem'; -import { mainnet } from 'viem/chains'; - -import { addEnsContracts } from '@ensdomains/ensjs'; -import { setPrimaryName } from '@ensdomains/ensjs/wallet'; - -const wallet = createWalletClient({ - chain: addEnsContracts(mainnet), - transport: custom(window.ethereum), -}); - -const hash = await setPrimaryName(wallet, { - name: 'ens.eth', -}); -// 0x... -``` - -```py {{ variant: 'web3py', link: 'https://web3py.readthedocs.io/en/latest/ens_overview.html#link-an-address-to-a-name' }} -from ens.auto import ns - -ns.setup_name('myname.eth', my_address) -``` - - */} - ### Do's and Dont's It must be noted that under no situation is it recommended to force a user to change their primary name, nor doing so without clearly notifying the user of what the transaction they are about to execute could modify. diff --git a/vocs.config.tsx b/vocs.config.tsx index 24e404281..36330c8f2 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -147,7 +147,7 @@ export default defineConfig({ }, { text: 'Primary Names', - link: '', + link: '/web/reverse', }, { text: 'Listing Names', From 0fffb498c544ef9dabca3148babae8465e4da07a Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Tue, 4 Feb 2025 20:48:46 -0500 Subject: [PATCH 21/79] Add /web/enumerate page --- src/pages/web/enumerate.mdx | 54 +++++-------------------------------- vocs.config.tsx | 2 +- 2 files changed, 7 insertions(+), 49 deletions(-) diff --git a/src/pages/web/enumerate.mdx b/src/pages/web/enumerate.mdx index 0f6bdeeb9..8bc9342e9 100644 --- a/src/pages/web/enumerate.mdx +++ b/src/pages/web/enumerate.mdx @@ -1,11 +1,6 @@ -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'List all names a user has, owns, or might have access to.', - contributors: [ - 'luc.eth', - 'gregskril.eth' - ] -}; +--- +description: List all names a user has, owns, or might have access to. +--- # Listing a Users Names @@ -13,21 +8,7 @@ In some cases you might want to show off all names that a user owns. Due to the Fortunately, tooling has been developed to accommodate for this and to make it easier. -
- 0x225...c3B5 - ➡️ -
-
luc.eth
-
lucemans.eth
-
keukenrol.eth
-
-
- -Try it out using the widget below! - - - -## Why not all names? {{ title: "Enumeration", id: "enumeration" }} +## Why not all names? Not all ENS names exist onchain ([learn more about wildcard resolution](/ensip/10)), meaning we don't always know which names a user owns/controls. @@ -39,13 +20,13 @@ When using one of the methods described below it is important to keep in mind th It is generally recommended to allow users to input a name using an [input box](/web/design#2-resolving-input-fields) and to verify it resolves to the correct address upon user-completion. -## The Graph {{ title: "The Graph" }} +## The Graph The [ENS subgraph](/web/subgraph) indexes all events from relevant smart contracts and exposes them via a GraphQL endpoint. Note that addresses in filters must be lowercased. ENSjs makes it easy to run common queries on the subgraph with strong type safety. Docs can be found [here](https://github.com/ensdomains/ensjs/tree/main/docs/subgraph). -```graphql {{ title: 'GraphQL', language: 'gql', variant: 'gql', link: "https://thegraph.com/explorer/subgraphs/5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH?chain=arbitrum-one" }} +```graphql { domains(where: { owner: "0x225f137127d9067788314bc7fcc1f36746a3c3b5" }) { name @@ -57,26 +38,3 @@ ENSjs makes it easy to run common queries on the subgraph with strong type safet } } ``` - -## Alchemy {{ title: "Alchemy" }} - -Alchemy has several API endpoints for fetching NFTs, which we can use to query a list of names owned by a given address. - -```ts {{ title: 'Alchemy', variant: 'alchemy-sdk', link: "https://docs.alchemy.com/docs/how-to-resolve-ens-domains-given-a-wallet-address" }} -// Setup: npm install alchemy-sdk -import { Alchemy, Network } from 'alchemy-sdk' - -const config = { - apiKey: '<-- ALCHEMY APP API KEY -->', - network: Network.ETH_MAINNET, -} -const alchemy = new Alchemy(config) - -const walletAddress = '0x458d1E307CcA61C0Bea82f7663F66831175EcDe8' // replace with wallet address -const ensContractAddress = '0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85' -const nfts = await alchemy.nft.getNftsForOwner(walletAddress, { - contractAddresses: [ensContractAddress], -}) - -console.log(nfts) -``` diff --git a/vocs.config.tsx b/vocs.config.tsx index 36330c8f2..1a2d491cd 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -151,7 +151,7 @@ export default defineConfig({ }, { text: 'Listing Names', - link: '', + link: '/web/enumerate', }, ], }, From 9744abb70fd49210af774a89f108392eb307fd09 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Tue, 4 Feb 2025 20:56:56 -0500 Subject: [PATCH 22/79] Add /dweb/intro page --- src/components/ui/Badge.tsx | 20 +++++++++++-- src/pages/dweb/intro.mdx | 56 +++++++++++++++---------------------- vocs.config.tsx | 2 +- 3 files changed, 41 insertions(+), 37 deletions(-) diff --git a/src/components/ui/Badge.tsx b/src/components/ui/Badge.tsx index ad751bca9..5eb989127 100644 --- a/src/components/ui/Badge.tsx +++ b/src/components/ui/Badge.tsx @@ -1,8 +1,24 @@ import { PropsWithChildren } from 'react' -export function Badge({ children }: PropsWithChildren) { +import { cn } from '../../lib/utils' + +const variantStyles = { + primary: 'border border-grey-light text-blue font-medium', + secondary: 'text-blue bg-blue-surface', +} + +type BadgeProperties = PropsWithChildren<{ + variant?: keyof typeof variantStyles +}> + +export function Badge({ children, variant = 'primary' }: BadgeProperties) { return ( -
+
{children}
) diff --git a/src/pages/dweb/intro.mdx b/src/pages/dweb/intro.mdx index b1e5923fc..3182e86b9 100644 --- a/src/pages/dweb/intro.mdx +++ b/src/pages/dweb/intro.mdx @@ -1,64 +1,52 @@ -import { WIP } from '@/components/wip/WIP'; +import { Badge } from '../../components/ui/Badge' +import { Card } from '../../components/ui/Card' -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Introduction to hosting a decentralized website using ENS', - emoji: '🔍', - contributors: [ - 'luc.eth' - ] -}; +# Hosting a Decentralized Website [Introduction to hosting a decentralized website using ENS] -# Hosting a Decentralized Website - - - -{/* TODO: Graphic here */} - -## ContentHash {{ title: 'the \'contenthash\' field' }} +## ContentHash The ContentHash is a very popular component of an ENS name, first introduced in [ENSIP-7](/ensip/7). It can be queried by hitting the [contenthash(bytes32)](/resolvers/interfaces#0xbc1c58d1) function on a name's resolver. You can also [set the contenthash on a name](/resolvers/interfaces#0x304e6ade) if the resolver supports it. -
- { - ['ipfs://qMhx...', 'bzz:/2477', 'ar://HGa8...'].map((tag) => ( - {tag} - )) - } -
+ + {['ipfs://qMhx...', 'bzz:/2477', 'ar://HGa8...'].map((tag) => ( + + {tag} + + ))} + -## Hosting & Pinning {{ id: 'hosting' }} +## Hosting & Pinning When it comes to hosting your files there are many options to choose from. -
- { - ['IPFS / Filecoin', 'Swarm', 'Arweave'].map((tag) => ( - {tag} - )) - } -
+ + {['IPFS / Filecoin', 'Swarm', 'Arweave'].map((tag) => ( + + {tag} + + ))} + Popular options include [IPFS](https://ipfs.io), [Swarm](https://ethswarm.org), and [Arweave](https://arweave.org). Depending on what option you go with your files are either permanently stored on a network, or require to be actively stored on at least one machine, also known as "pinning". -### Deploy your site {{ id: 'deploy' }} +### Deploy your sites Several helpful tools and platforms exist that you can use to deploy your website to IPFS, Swarm, or Arweave. Most notably [fleek](https://fleek.xyz), [Pinata](https://pinata.cloud), and [Blumen](https://blumen.stauro.dev/). Helping you easily deploy your website to a decentralized storage network. -## Setting your ContentHash {{ id: 'set' }} +## Setting your ContentHash If you are using the public resolver (the default for names registered using the ENS Manager App), you can set the contenthash directly from within the [ENS Manager App](https://app.ens.domains). If you are using a custom resolver, or are writing your own resolver you will be able to have more fine grained control over the contenthash field. See [ENSIP-7](/ensip/7) for more information on the contenthash field. -## Browser Support & Gateways {{ id: 'gateway' }} +## Browser Support & Gateways In the ideal world every browser supports decentralized websites out of the box. If you are using [MetaMask](https://metamask.io) or [Brave Browser](https://brave.com) you can already access IPFS websites directly. diff --git a/vocs.config.tsx b/vocs.config.tsx index 1a2d491cd..1ca422ede 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -160,7 +160,7 @@ export default defineConfig({ items: [ { text: 'Decentralized Web', - link: '', + link: '/dweb/intro', }, { text: 'Issuing Subdomains', From 4d875b00ad05f31a69e84a5a07457f589987f6bf Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Tue, 4 Feb 2025 23:15:30 -0500 Subject: [PATCH 23/79] Add /web/subdomains page --- src/pages/web/subdomains.mdx | 43 ++++++++++++++++++------------------ vocs.config.tsx | 2 +- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/pages/web/subdomains.mdx b/src/pages/web/subdomains.mdx index 2aa830c57..5bfd46647 100644 --- a/src/pages/web/subdomains.mdx +++ b/src/pages/web/subdomains.mdx @@ -1,33 +1,32 @@ -import { WIP } from '@/components/wip/WIP' +--- +description: Issue subdomains to your users, yourself, or your friends. Program your own resolver, or use one of the many existing ones. +--- -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { -description: 'Issue subdomains to your users, yourself, or your friends. Program your own resolver, or use one of the many existing ones.', -emoji: '⚙️', -contributors: [ -'luc.eth' -] -}; +import { EmbedLink } from '../../components/EmbedLink' +import { Card } from '../../components/ui/Card' # Subdomains Names come in handy in many situations. We believe that any place an address is used, a name should be able to be used instead. The smart contracts you interact with have names, the deposit address for your favorite exchange has a name, your favorite DAO has a name, or maybe you use subnames to keep your wallets organized. -
+
- {['vault', 'domico', 'subname', 'nick', 'cold'].map((subname, i) => ( -
- {subname} -
- ))} + {['root', 'registrar', 'controller', 'resolver', 'registry'].map( + (subname, i) => ( +
+ {subname} +
+ ) + )}
-
.nick.eth
-
+
.ens.eth
+ Luckily, the ENS Protocol has so much to offer for you to play with. There are a variety of ways you can give out subdomains to your apps users, set them up for yourself, or more. @@ -35,7 +34,7 @@ If you are interested in naming smart-contracts specifically, check out the [Nam ## Pre-built Tooling -### Durin (new!) +### Durin [Durin](https://durin.dev/) is an opinionated approach to issuing ENS subnames on L2. It takes care of the L1 Resolver and offchain gateway parts of the [CCIP Read stack](/resolvers/ccip-read) for you, so you can focus on the business logic of your L2 smart contracts. diff --git a/vocs.config.tsx b/vocs.config.tsx index 1ca422ede..f29587939 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -164,7 +164,7 @@ export default defineConfig({ }, { text: 'Issuing Subdomains', - link: '', + link: '/web/subdomains', }, { text: 'Naming Smart-contracts', From 943b2ee9898ed96093557f9ba58e6dbdfb4789db Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Tue, 4 Feb 2025 23:25:19 -0500 Subject: [PATCH 24/79] Finish "Using ENS" section --- src/pages/web/multichain.mdx | 42 +++++++++++------------------- src/pages/web/naming-contracts.mdx | 32 ++++++----------------- src/pages/web/subgraph.mdx | 27 +++++++------------ vocs.config.tsx | 6 ++--- 4 files changed, 35 insertions(+), 72 deletions(-) diff --git a/src/pages/web/multichain.mdx b/src/pages/web/multichain.mdx index f6787959e..fc45242e1 100644 --- a/src/pages/web/multichain.mdx +++ b/src/pages/web/multichain.mdx @@ -1,47 +1,35 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'L2 & Crosschain Resolution', - emoji: '⛓️', - contributors: [ - 'luc.eth' - ] -}; - -# Multichain - -
- "the future is multichain" -
+# Multichain [L2 & Crosschain Resolution] ## ENS L2 -The ENS Labs team recently announced our plans and roadmap for scaling ENS to the entire internet and beyond. -You can read more [on our blog](https://blog.ens.domains/post/ensv2), [on X](https://twitter.com/ensdomains/status/1795440186513576318), and [the forums](https://discuss.ens.domains/t/technical-feedback-thread-for-ensv2/19233). +The ENS Labs team recently announced our plans and roadmap for scaling ENS to the entire internet and beyond. You can read more [on our blog](https://blog.ens.domains/post/ensv2), [on X](https://twitter.com/ensdomains/status/1795440186513576318), and [the forums](https://discuss.ens.domains/t/technical-feedback-thread-for-ensv2/19233). + The roadmap involves migrating .eth registrations to a new system, in addition to improved support for existing L2 solutions. You can findout more on the [changelog](/changelog). -## But isn't ENS on mainnet? {{ label: "ENS Multichain", navtitle: "Resolution" }} +## But isn't ENS on mainnet? Yes, technically. The resolution process always starts on mainnet. There needs to be, one source of truth after all. However, the name -resolution process can branch off to other chains, offchain gateways and much more.
+resolution process can branch off to other chains, offchain gateways and much more. + To read a more indepth explanation of how resolution works, checkout the [section dedicated to the Resolution Process](/resolution/). -## My dapp is on X but I want ENS {{ label: "dApp Multichain", navtitle: "dApps on other Chains" }} +## My dapp is on X but I want ENS The ENS Protocol can be used on/for any chain! If you are building a non-mainnet dApp and want to use ENS names simply [add a Mainnet RPC to your Wagmi config](/web/libraries) and specify `chainId: 1` in your config like so: -```tsx focus=6 -import { useAccount, useEnsName, useEnsAvatar } from 'wagmi'; +```tsx +import { useAccount, useEnsAvatar, useEnsName } from 'wagmi' const Name = () => { - const { data: ensName } = useEnsAddress({ - address: 'luc.eth', - chainId: 1, // (1 = Ethereum, 11155111 = Sepolia) - }); + const { data: ensName } = useEnsAddress({ + address: 'luc.eth', + chainId: 1, // (1 = Ethereum, 11155111 = Sepolia) // [!code hl] + }) - return
{ensName || address}
; -}; + return
{ensName || address}
+} ``` And voila! You can now resolve ENS names anywhere! 🎉 diff --git a/src/pages/web/naming-contracts.mdx b/src/pages/web/naming-contracts.mdx index 6d13a859a..e018ae81f 100644 --- a/src/pages/web/naming-contracts.mdx +++ b/src/pages/web/naming-contracts.mdx @@ -1,20 +1,6 @@ -import { WIP } from '@/components/wip/WIP'; +# Naming Contracts [Learn how to name your smart contracts with ENS] -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Learn how to name a contract', - emoji: '⚙️', - contributors: [] -}; - -# Naming Contracts - -For most regular wallets you can set your primary name from within the [Manager App](https://ens.domains). -However also smart contracts can have names, and even better they can have primary names. - -``` -governance.uniswap.eth -``` +For most regular wallets you can set your primary name from within the [Manager App](https://ens.domains). However also smart contracts can have names, and even better they can have primary names. In order for you to manage the primary name of your smart contract, you need to own the [reverse node](/terminology#reverse-node) for the contract address. There are several ways of doing this, depending on if you are actively developing your contract or if it is already deployed. @@ -37,7 +23,7 @@ contract MyContract is ReverseClaimer { When you deploy your contract it will automatically claim the reverse node for that contract address. -### Ownable (OpenZeppelin) {{ id: 'ownable' }} +### Ownable (OpenZeppelin) You can can also choose to have your smart-contract implement [Ownable](https://docs.openzeppelin.com/contracts/5.x/api/access#Ownable) from OpenZeppelin. The ReverseRegistrar supports the Ownable interface and will let the `Owner` set a Primary name. @@ -98,8 +84,6 @@ You can do so by hitting the `setNameForAddr` function on the [Reverse Registrar From your contract you can execute `setName` function on the [Reverse Registrar](/registry/reverse) - - ## L2 Contracts Primary Names are not yet supported on L2s. In the meantime, the following sections only apply to testnet ENS deployments. Mainnet support should be coming by the end of January 2025. @@ -110,14 +94,14 @@ If you want to set a primary name for a contract you are deploying on an L2 chai You will also need to locate the canonical Reverse Registry for that L2 chain. We currently do not have a way to discover those contracts, but for now, selected deployments are listed here: [Primary Names](/web/reverse#set) -Then, after you've deployed your contract, call `setNameForAddr(address addr, string name)` on the L2 Reverse Resolver from your authorized owner account. The `addr` is the address of your contract, and `name` is the ENS name to set it to. +Then, after you've deployed your contract, call `setNameForAddr(address addr, string name)` on the L2 Reverse Resolver from your authorized owner account. The `addr` is the address of your contract, and `name` is the ENS name to set it to. ### L2 - Manually Another option is to call the L2ReverseRegistry's `setName(string name)` function directly, in the constructor of your contract. However note that if you do this, you will not be able to change the primary name for that contract ever again. - - Make sure that the ENS name also resolves to your contract address for the appropriate cointype. +:::note +Make sure that the ENS name also resolves to your contract address for the appropriate cointype. - For example, if you are deploying a contract on Base, make sure you set the Base address on your ENS name to your contract address. - +For example, if you are deploying a contract on Base, make sure you set the Base address on your ENS name to your contract address. +::: diff --git a/src/pages/web/subgraph.mdx b/src/pages/web/subgraph.mdx index d1895f972..3cea54a8f 100644 --- a/src/pages/web/subgraph.mdx +++ b/src/pages/web/subgraph.mdx @@ -1,19 +1,12 @@ -import { WIP } from '@/components/wip/WIP' -import { Note } from '@/components/mdx/Note' - -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'The ENS subgraph', - emoji: '⚙️', - contributors: [ - 'luc.eth' - ] -}; +--- +description: The ENS subgraph +--- # Subgraph This is a page covering the graph's ENS subgraph. The ENS subgraph indexes on-chain events of second-level .eth names, and DNS imported names. It allows us to build a reasonable approximation of the ENS names an address owns. + To read more about why not all names (such as Offchain & Gasless Names) show up in the subgraph read the [listing names](/web/enumerate) page. ## The Graph @@ -21,11 +14,11 @@ To read more about why not all names (such as Offchain & Gasless Names) show up The Graph is a protocol for indexing and querying data from blockchains. There are multiple subgraphs that you can use to query information about ENS names. These subgraphs are available for [mainnet](https://api.thegraph.com/subgraphs/name/ensdomains/ens), [sepolia](https://api.studio.thegraph.com/query/49574/enssepolia/version/latest) and [holesky](https://api.studio.thegraph.com/query/49574/ensholesky/version/latest). - - Developers are welcome to use our rate limited API endpoints above for - testing, but it is highly encouraged to [sign up for a free account with - TheGraph](https://thegraph.com/studio/apikeys/) to get your own API key. - +:::note +Developers are welcome to use our rate limited API endpoints above for +testing, but it is highly encouraged to [sign up for a free account with +TheGraph](https://thegraph.com/studio/apikeys/) to get your own API key. +::: ## GraphQL Schema @@ -52,8 +45,6 @@ query getDomainsForAccount { } ``` - - ### Getting the top domain for an account based on the longest registry ```graphql diff --git a/vocs.config.tsx b/vocs.config.tsx index f29587939..47753ab09 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -168,15 +168,15 @@ export default defineConfig({ }, { text: 'Naming Smart-contracts', - link: '', + link: '/web/naming-contracts', }, { text: "Layer 2's & Multichain", - link: '', + link: '/web/multichain', }, { text: 'Subgraph', - link: '', + link: '/web/subgraph', }, ], }, From 9ddba3215507ad85fd28d0738e89a39c9231b20c Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Wed, 5 Feb 2025 00:01:02 -0500 Subject: [PATCH 25/79] Add a bunch of pages from Intro section --- .../content/extras/dns/DNSUsageExamples.tsx | 82 ----------------- app/local/content/extras/tld-list/DNSGrid.tsx | 58 ------------ src/components/DNSGrid.tsx | 58 ++++++++++++ src/components/DNSUsageExamples.tsx | 91 +++++++++++++++++++ src/pages/bugs.mdx | 25 +---- src/pages/changelog.mdx | 13 --- src/pages/faq.mdx | 11 +-- src/pages/learn/ccip-read.mdx | 12 +-- src/pages/learn/dns.mdx | 23 ++--- src/pages/learn/resolution.mdx | 82 ++++++++--------- src/pages/terminology.mdx | 14 +-- .../public/img/apps}/argent-logo.svg | 0 .../public/img/apps}/coinbase-wallet-logo.svg | 0 .../public/img/apps}/lens-logo.svg | 0 vocs.config.tsx | 14 +-- 15 files changed, 214 insertions(+), 269 deletions(-) delete mode 100644 app/local/content/extras/dns/DNSUsageExamples.tsx delete mode 100644 app/local/content/extras/tld-list/DNSGrid.tsx create mode 100644 src/components/DNSGrid.tsx create mode 100644 src/components/DNSUsageExamples.tsx rename {app/public/content/learn/dnssec => src/public/img/apps}/argent-logo.svg (100%) rename {app/public/content/learn/dnssec => src/public/img/apps}/coinbase-wallet-logo.svg (100%) rename {app/public/content/learn/dnssec => src/public/img/apps}/lens-logo.svg (100%) diff --git a/app/local/content/extras/dns/DNSUsageExamples.tsx b/app/local/content/extras/dns/DNSUsageExamples.tsx deleted file mode 100644 index e7b671662..000000000 --- a/app/local/content/extras/dns/DNSUsageExamples.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { FiChevronRight } from 'react-icons/fi'; - -import { LinkCard } from '../linkcard/LinkCard'; - -export const DNSUsageExamples = () => { - return ( -
- {[ - [ - 'Lens', - 'The Social Layer for Web3', - '.lens.xyz', - 'https://www.lens.xyz/', - '/content/learn/dnssec/lens-logo.svg', - 'rgb(255, 235, 184)', - 'rgb(39, 46, 41)', - ], - [ - 'Coinbase Wallet', - 'Self-custody crypto wallet built by Coinbase', - '.cb.id', - 'https://cb.id/', - '/content/learn/dnssec/coinbase-wallet-logo.svg', - 'rgb(20, 21, 25)', - 'rgb(88, 138, 245)', - ], - [ - 'Argent', - 'zk-sync & starknet powered smart-contract wallet', - '.argent.xyz', - 'https://www.argent.xyz/', - '/content/learn/dnssec/argent-logo.svg', - '#000', - '#FF875B', - ], - ].map( - ( - [title, description, domain, link, logo, bgColor, fgColor], - index - ) => ( - - ) - )} -
-
- And many more... - - See{' '} - - our integrations - - -
- -
- read more -
-
-
-
- ); -}; diff --git a/app/local/content/extras/tld-list/DNSGrid.tsx b/app/local/content/extras/tld-list/DNSGrid.tsx deleted file mode 100644 index ad7fdb68f..000000000 --- a/app/local/content/extras/tld-list/DNSGrid.tsx +++ /dev/null @@ -1,58 +0,0 @@ -export const DNSGrid = () => { - return ( -
-
- {[ - '.com', - '.xyz', - '.nl', - '.net', - '.org', - '.shop', - '.photos', - '.pizza', - '.cash', - '.money', - '.news', - '.info', - '.gold', - '.domains', - '.social', - '.de', - '.city', - '.lol', - '.rip', - '.company', - '.es', - '.network', - '.me', - '.us', - '.id', - '.fr', - '.space', - '.ninja', - '.tools', - '.wtf', - '.capital', - '.finance', - '.vision', - '.limo', - '.link', - '.uk', - '.world', - '.dev', - '.day', - '.fyi', - '.cool', - ].map((a) => ( - - {a} - - ))} - - and any other DNSSEC-compatible domain... - -
-
- ); -}; diff --git a/src/components/DNSGrid.tsx b/src/components/DNSGrid.tsx new file mode 100644 index 000000000..83a1e1d89 --- /dev/null +++ b/src/components/DNSGrid.tsx @@ -0,0 +1,58 @@ +import { Card } from './ui/Card' + +export const DNSGrid = () => { + return ( + +
+ {[ + '.com', + '.xyz', + '.nl', + '.net', + '.org', + '.shop', + '.photos', + '.pizza', + '.cash', + '.money', + '.news', + '.info', + '.gold', + '.domains', + '.social', + '.de', + '.city', + '.lol', + '.rip', + '.company', + '.es', + '.network', + '.me', + '.us', + '.id', + '.fr', + '.space', + '.ninja', + '.tools', + '.wtf', + '.capital', + '.finance', + '.vision', + '.limo', + '.link', + '.uk', + '.world', + '.dev', + '.day', + '.fyi', + '.cool', + ].map((a) => ( + {a} + ))} + + and any other DNSSEC-compatible domain... + +
+
+ ) +} diff --git a/src/components/DNSUsageExamples.tsx b/src/components/DNSUsageExamples.tsx new file mode 100644 index 000000000..8282aebb6 --- /dev/null +++ b/src/components/DNSUsageExamples.tsx @@ -0,0 +1,91 @@ +export const DNSUsageExamples = () => { + return ( +
+ {[ + [ + 'Lens', + 'The Social Layer for Web3', + '.lens.xyz', + '/img/apps/lens-logo.svg', + 'rgb(255, 235, 184)', + 'rgb(39, 46, 41)', + ], + [ + 'Coinbase Wallet', + 'Self-custody crypto wallet built by Coinbase', + '.cb.id', + '/img/apps/coinbase-wallet-logo.svg', + 'rgb(20, 21, 25)', + 'rgb(88, 138, 245)', + ], + [ + 'Argent', + 'zk-sync & starknet powered smart-contract wallet', + '.argent.xyz', + '/img/apps/argent-logo.svg', + '#000', + '#FF875B', + ], + ].map(([title, description, domain, logo, bgColor, fgColor], index) => ( + + ))} +
+ ) +} + +type Properties = { + title: string + description: string + domain?: string + logo: string + bgColor: string + fgColor: string +} + +export const LinkCard = ({ + title, + description, + domain, + logo, + bgColor, + fgColor, +}: Properties) => { + return ( +
+
+
+ {title} +
+ {domain && ( +
+ {domain} +
+ )} +
+
{title}
+
{description}
+
+ ) +} diff --git a/src/pages/bugs.mdx b/src/pages/bugs.mdx index bd33f21c0..61998a4ef 100644 --- a/src/pages/bugs.mdx +++ b/src/pages/bugs.mdx @@ -1,28 +1,10 @@ -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { -title: 'Bug Bounties', -description: 'ENS offers cash rewards to anyone who finds a bug in covered ENS smart contracts.', -emoji: '🪲', -contributors: [ -'luc.eth', -'gregskril.eth' -] -}; +import { Button } from '../components/ui/Button' # 🪲 Bug Bounty Program The ENS bug bounty program rewards anyone who finds a bug in covered ENS smart contracts and ENS Labs assets. This page provides a brief overview of the program which is operated by Immunefi and ENS Labs. -{/* TODO: add link to final bug bounty when ready */} - -
- -
+[See the full program](https://immunefi.com/bug-bounty/ens) ## Bounties 💸 @@ -33,13 +15,12 @@ Reward sizes are guided by the rules below, but are in the end, determined at th - **Critical**: up to $250,000 USD - **High**: up to $150,000 USD - **Medium**: up to $100,000 USD -- **Low**: up to $20,000 USD ### Websites and Applications - **Critical**: up to $50,000 USD - **High**: up to $20,000 USD -- **Medium**: up to $2,500 USD +- **Medium**: up to $5,000 USD - **Low**: up to $1,000 USD The ENS Labs team reserves the right to adjust bounty amounts at any time in the future. diff --git a/src/pages/changelog.mdx b/src/pages/changelog.mdx index 771b9322e..10dd8b62a 100644 --- a/src/pages/changelog.mdx +++ b/src/pages/changelog.mdx @@ -1,15 +1,3 @@ -import { WIP } from "@/components/wip/WIP"; - -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - title: 'Changelog', - description: 'A list of changes and events that happened to the protocol.', - emoji: '📝', - contributors: [ - 'luc.eth' - ] -}; - # 📝 Changelog This page contains a list of changes and events that happened to the ENS protocol & ecosystem. @@ -24,4 +12,3 @@ This integration leverages a draft ENSIP that allows for W3C Verifiable Credenti On March 28th, 2024 the ENS Labs team announced our plans and roadmap for scaling ENS to the entire internet and beyond. This involves migrating .eth registrations to a brand new system, in addition to improving support for existing L2 solutions. You can read more [on our blog](https://blog.ens.domains/post/ensv2), [on X](https://twitter.com/ensdomains/status/1795440186513576318), and [the forums](https://discuss.ens.domains/t/technical-feedback-thread-for-ensv2/19233). - diff --git a/src/pages/faq.mdx b/src/pages/faq.mdx index f2c4ef8de..6d7e6431e 100644 --- a/src/pages/faq.mdx +++ b/src/pages/faq.mdx @@ -1,8 +1,6 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { -description: 'Frequently Asked Questions about the Ethereum Name Service', -contributors: ['luc.eth'] -}; +--- +description: Frequently Asked Questions about the Ethereum Name Service +--- # FAQ @@ -101,7 +99,8 @@ Existing DNS TLDs can [reach out to us](mailto:info@ens.domains) to take control ENS complements and extends the usefulness of DNS with decentralised, trustworthy name resolution for web3 resources such as blockchain addresses and distributed content, while Namecoin and Handshake are efforts to replace all or part of DNS with a blockchain-based alternative. -## Governance Token +## Governance Token + ### Can I recover tokens accidentally sent to the wrong address? The answer depends on the address the token was sent to. If you accidentally sent the token to the token.ensdao.eth address (0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72) or the wallet.ensdao.eth address (0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7) then the tokens might be recoverable. Contact the [Meta-governance working group](/dao/stewards/) at the [ENS Forum](https://discuss.ens.domains) and explain the situation. Tokens can only be sent back to the address they were sent from, so if it was sent from an exchange, contact your exchange support to make sure the address can receive tokens. diff --git a/src/pages/learn/ccip-read.mdx b/src/pages/learn/ccip-read.mdx index a86df5710..11c7e9d8f 100644 --- a/src/pages/learn/ccip-read.mdx +++ b/src/pages/learn/ccip-read.mdx @@ -1,12 +1,6 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Using CCIP Read to take ENS resolution cross-chain, off-chain, and more.', - emoji: '🔗', - contributors: [ - 'gregskril.eth', - 'luc.eth' - ] -}; +--- +description: Using CCIP Read to take ENS resolution cross-chain, off-chain, and more. +--- # Layer 2 & Offchain Resolution diff --git a/src/pages/learn/dns.mdx b/src/pages/learn/dns.mdx index 3b8227b7c..a1f0d505f 100644 --- a/src/pages/learn/dns.mdx +++ b/src/pages/learn/dns.mdx @@ -1,17 +1,8 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'ENS supports DNS names, allowing users to import DNS names into ENS.', - emoji: '🌐', - contributors: [ - 'luc.eth' - ] -}; +import { DNSGrid } from '../../components/DNSGrid' +import { DNSUsageExamples } from '../../components/DNSUsageExamples' +import { EmbedLink } from '../../components/EmbedLink' -# DNS on ENS - -<> - {/*TODO: User-friendly explanation of the fact that DNS names also work in the ENS system.*/} - +# DNS on ENS [ENS supports DNS names, allowing users to import DNS names into ENS.] The Ethereum Name Service is so much more than just `.eth` names. It is a general-purpose naming system that can be used for any kind of name. This includes DNS names. DNS functionality was originally introduced in [ENSIP-6](/ensip/6). @@ -25,8 +16,8 @@ To import a name, simply visit the [ENS Manager](https://ens.app), type in your Additionally you can read more about the records and specifications here: ## Why DNS on ENS? @@ -47,5 +38,3 @@ In addition to allowing any DNSSEC enabled name to be imported, ENS also allows Resulting in even more seamless integration with the DNS system. A list of all supported TLDs can be found [here](/dns/tlds) - -<>{/* TODO: Insert examples of protocol.art .kred etc */} diff --git a/src/pages/learn/resolution.mdx b/src/pages/learn/resolution.mdx index adf9bd204..b21225042 100644 --- a/src/pages/learn/resolution.mdx +++ b/src/pages/learn/resolution.mdx @@ -1,19 +1,13 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'The ENS Resolution Process', - emoji: '🔍', - contributors: [ - 'luc.eth' - ] -}; +import { EnsProfile } from '../../components/EnsProfile' +import { Card } from '../../components/ui/Card' -# Resolution +# Resolution [The ENS Resolution Process] - - This document aims to provide a brief overview of how resolution works, to - read more about resolution checkout the [dedicated Resolution - Section](/resolution). - +:::note +This document aims to provide a brief overview of how resolution works, to +read more about resolution checkout the [dedicated Resolution +Section](/resolution). +::: One of the major parts of the ENS protocol is the resolution process. The Resolution process at its core is the process of converting a human-readable name to a machine-readable address. @@ -24,30 +18,30 @@ Though there is a lot of smart contract magic under the hood, the ENS system con Forwards resolution is the process of going **from name to address**. As well as to load the records associated to a name. These records include but are not limited to **discord**, **twitter**, **github**, **email**, **timezone**, and more. -
-
- -
➡️
-
-
- ETH Address: 0x225...c3B5 -
-
- BTC Address: 1JnJv...BHwB -
-
- Twitter: @lucemansnl -
-
- Discord: lucemans#2066 -
-
- ... -
-
- +{/* TODO: Turn this into a component and fetch live data */} + + +
+ + ➡️ + ⬇️ + +
+ ETH Address: 0x5555...3dCa +
+
+ BTC Address: 1RicMoo...Jyn +
+
+ Twitter: @ricmoo +
+
+ Github: @ricmoo +
+ ... +
-
+ Implementing forwards resolution in a dApp can be as simple as using a single line of code! To learn more about how to implement forwards resolution, check out the [Address Resolution](/web/resolution) documentation. @@ -57,15 +51,11 @@ To learn more about how to implement forwards resolution, check out the [Address Reverse resolution is the process of going **from address to name**. This is a crucial part of the ENS system, as it allows for any address, to be resolved into a human readable name. Instead of pages filled with addresses, you can now show the names of the people behind the addresses. -
-
-
-
0x225...c3B5
-
-
➡️
- -
-
+ + 0x225...c3B5 + to + + Implementing reverse resolution in a dApp can be as simple as using a single line of code! To learn more about how to implement reverse resolution, check out the [Address Resolution](/web/reverse) documentation. diff --git a/src/pages/terminology.mdx b/src/pages/terminology.mdx index 75c5be173..7f66dc565 100644 --- a/src/pages/terminology.mdx +++ b/src/pages/terminology.mdx @@ -1,12 +1,8 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'A technical overview of all the terminology used in the ENS documentation.', - emoji: '📓', - contributors: [ - 'luc.eth', - 'serenae.eth' - ] -}; +--- +description: A technical overview of all the terminology used in the ENS documentation. +--- + +import { EmbedLink } from '../components/EmbedLink' # Terminology diff --git a/app/public/content/learn/dnssec/argent-logo.svg b/src/public/img/apps/argent-logo.svg similarity index 100% rename from app/public/content/learn/dnssec/argent-logo.svg rename to src/public/img/apps/argent-logo.svg diff --git a/app/public/content/learn/dnssec/coinbase-wallet-logo.svg b/src/public/img/apps/coinbase-wallet-logo.svg similarity index 100% rename from app/public/content/learn/dnssec/coinbase-wallet-logo.svg rename to src/public/img/apps/coinbase-wallet-logo.svg diff --git a/app/public/content/learn/dnssec/lens-logo.svg b/src/public/img/apps/lens-logo.svg similarity index 100% rename from app/public/content/learn/dnssec/lens-logo.svg rename to src/public/img/apps/lens-logo.svg diff --git a/vocs.config.tsx b/vocs.config.tsx index 47753ab09..1f767bc23 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -79,15 +79,15 @@ export default defineConfig({ }, { text: 'Resolution', - link: '', + link: '/learn/resolution', }, { text: 'DNS Names', - link: '', + link: '/learn/dns', }, { text: 'Layer 2 & Offchain', - link: '', + link: '/learn/ccip-read', }, ], }, @@ -96,19 +96,19 @@ export default defineConfig({ items: [ { text: 'Frequently Asked Questions', - link: '', + link: '/faq', }, { text: 'Terminology', - link: '', + link: '/terminology', }, { text: 'Bug Bounties', - link: '', + link: '/bugs', }, { text: 'Changelog', - link: '', + link: '/changelog', }, ], }, From 0c51d2a067df9c6ed47233d3cbda39819a51415a Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Thu, 6 Feb 2025 02:04:57 -0500 Subject: [PATCH 26/79] Generate deployments page, finish Intro section --- .gitignore | 5 +- src/components/ContractDeployments.tsx | 76 +++++++ src/pages/learn/deployments.mdx | 77 ++++---- src/pages/learn/protocol.mdx | 89 +++------ src/plugins/deployments.ts | 262 +++++++++++++++++++++++++ vocs.config.tsx | 7 +- 6 files changed, 411 insertions(+), 105 deletions(-) create mode 100644 src/components/ContractDeployments.tsx create mode 100644 src/plugins/deployments.ts diff --git a/.gitignore b/.gitignore index 2d47fa783..a5fbee555 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,8 @@ yarn-error.log* vocs.config.ts.timestamp-* src/dist -# Generated markdown files +# Generated plugin files src/pages/deployments.md src/pages/ensip/* -!src/pages/ensip/index.mdx \ No newline at end of file +!src/pages/ensip/index.mdx +src/lib/deployments.json \ No newline at end of file diff --git a/src/components/ContractDeployments.tsx b/src/components/ContractDeployments.tsx new file mode 100644 index 000000000..1b964d003 --- /dev/null +++ b/src/components/ContractDeployments.tsx @@ -0,0 +1,76 @@ +import { + AnchorHTMLAttributes, + DetailedHTMLProps, + PropsWithChildren, +} from 'react' + +import { DeploymentsByChain } from '../plugins/deployments' + +let deploymentsByChain = new Array() + +try { + const test = (await import('../lib/deployments.json')) as any + deploymentsByChain = test?.default +} catch (error) { + console.warn('No deployments found, falling back to an empty array') +} + +export function ContractDeployments({ + chain, +}: { + chain: DeploymentsByChain['slug'] +}) { + return deploymentsByChain + .filter((c) => c.slug === chain) + .map((chain) => ( + + + + + + + + + {chain.contracts.map((contract) => ( + + + + + ))} + +
ContractAddress
+ {contract.name} +
+ + ABI + + + Source + +
+
{contract.address}
+ )) +} + +function VocsExternalLink({ + href, + children, +}: AnchorHTMLAttributes) { + return ( + + {children} + + ) +} diff --git a/src/pages/learn/deployments.mdx b/src/pages/learn/deployments.mdx index 773cda96b..8b6cac76e 100644 --- a/src/pages/learn/deployments.mdx +++ b/src/pages/learn/deployments.mdx @@ -1,60 +1,57 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'ENS is multichain, but it all starts with Ethereum Mainnet. This page contains common addresses for ENS contracts.', - emoji: '📰', - contributors: [ - 'luc.eth' - ] -}; +--- +description: ENS is multichain, but it all starts with Ethereum Mainnet. This page contains common addresses for ENS contracts. +--- + +import { ContractDeployments } from '../../components/ContractDeployments' +import { EmbedLink } from '../../components/EmbedLink' +import { Card } from '../../components/ui/Card' # Deployments -{/* - This page contains information that is only relevant to developers who would - like to interact with the contract manually. Most libraries will handle this - for you. - */} +:::note +This page contains information that is only relevant to developers who would +like to interact with the contract manually. Most libraries will handle this +for you. +::: ENS is multichain (read more [here](/web/multichain)) and can be used in any application. In addition to being able to query many address formats and record types, data can be stored [practically anywhere](/learn/ccip-read). However, resolution needs to start somewhere, so the entrypoint for resolution is Ethereum Mainnet, alongside the most popular testnets. -
-
- Ethereum Mainnet -
-
- -> -
-
-
- Optimism -
-
- Arbitrum -
-
- Offchain -
-
- ... -
-
-
+ + Ethereum Mainnet +
+
+ Base + Arbitrum + Offchain + ... +
+
## Deployments Listed below you will find a list of latest deployments of registries, resolvers, and more. - +### Mainnet + + + +### Sepolia + + + +### Holesky + + -## But what about multichain? {{ tag: "Multichain", title: "Multichain", id: "multichain" }} +## But what about multichain? The ENS Protocol can be used on/for any chain! If you are building a dApp and want to use ENS you might have to add a [Mainnet RPC to your Wagmi config](/web/libraries). This allows tools like wagmi to access mainnet, and load ENS information! diff --git a/src/pages/learn/protocol.mdx b/src/pages/learn/protocol.mdx index 965544c64..6a1aabb92 100644 --- a/src/pages/learn/protocol.mdx +++ b/src/pages/learn/protocol.mdx @@ -1,28 +1,20 @@ -import { EmbedLink } from '@/components/mdx/EmbedLink'; - -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Learn about the Ethereum Name Service (ENS) protocol and how it enables decentralized naming on the Ethereum blockchain.', - title: 'The Protocol', - emoji: '📖', - contributors: [ - 'luc.eth' - ] -}; +--- +description: Learn about the Ethereum Name Service (ENS) protocol and how it enables decentralized naming on the Ethereum blockchain. +--- + +import { DNSGrid } from '../../components/DNSGrid' +import { EmbedLink } from '../../components/EmbedLink' +import { EnsProfile } from '../../components/EnsProfile' +import { Card } from '../../components/ui/Card' # What is the Ethereum Name Service? The Ethereum Name Service (ENS) is a distributed, open, and extensible naming system based on the Ethereum blockchain. -
-
- -
➡️
-
-
0xb8c2c29ee19d8307cb7255e1cd9cbde883a267d5
-
-
-
+ + + + ENS maps human-readable names like 'alice.eth' to machine-readable identifiers such as Ethereum addresses, other cryptocurrency addresses, content hashes, metadata, and more. ENS also supports 'reverse resolution', making it possible to associate metadata such as primary names or interface descriptions with Ethereum addresses. @@ -35,60 +27,37 @@ Enabling seamless interoperability with the DNS (Domain Name System). The [ETH Registrar](/registry/eth) is the registrar for the `.eth` TLD, it allows for trustless decentralized names to be issued as tokens on the Ethereum Blockchain. Registration is done through smart-contracts, and name ownership is secured by the Ethereum blockchain. -
-
-
.eth
-
-
- ## DNS + ENS ENS has similar goals to DNS, the existing Internet's Domain Name Service, and aims to extend its capability. ENS also supports importing DNS names through the use of DNSSEC. Allowing you to take your `.com`, `.xyz`, or `.art` (and more) into the ENS ecosystem. Read more about DNSSEC names [on this page](/learn/dns). - ## Subnames -
-
- { - ["vault", "domico", "subname", "nick", "cold"].map((subname, i) => ( -
{subname}
- )) - } -
-
.nick.eth
-
+ +
+ {['root', 'registrar', 'controller', 'resolver', 'registry'].map( + (subname, i) => ( +
+ {subname} +
+ ) + )} +
+
.ens.eth
+
Because of the hierarchal nature of ENS, anyone who owns a domain at any level can take control of resolution. Users can create subdomains manually, or take matters into their own hands and write their own resolution logic. -
-
- -
-
- /|\ -
-
- { - ['vault', 'hot', 'cold'].map((subname, i) => ( -
- - {subname} - .alice.eth - - } variant="small" /> -
- )) - } -
-
- For instance, if Alice owns 'alice.eth', she can create 'pay.alice.eth' and configure it as she wishes. Or, use a [Custom Resolver](/resolvers/quickstart), and programmatically issue subdomains, for example in an App, Community, or DAO. diff --git a/src/plugins/deployments.ts b/src/plugins/deployments.ts new file mode 100644 index 000000000..33bb7ffd0 --- /dev/null +++ b/src/plugins/deployments.ts @@ -0,0 +1,262 @@ +import fs from 'fs/promises' +import path from 'path' +import { Abi, Hex, TransactionReceipt } from 'viem' +import { Plugin } from 'vite' + +type Deployment = { + name: string + address?: Hex + github: { + filename: string + srcPath: string + } +} + +export type DeploymentsByChain = { + name: string // Mainnet, Sepolia, etc. + slug: string // mainnet, sepolia, etc. + contracts: Deployment[] +} + +type DeploymentFile = { + address: Hex + abi: Abi + transactionHash: Hex + receipt: TransactionReceipt + args: unknown[] +} + +let DEPLOYMENTS: DeploymentsByChain[] = [ + { + name: 'Mainnet', + slug: 'mainnet', + contracts: [ + { + name: 'Registry', + github: { + filename: 'ENSRegistry', + srcPath: 'contracts/registry/', + }, + }, + { + name: 'Base Registrar', + github: { + filename: 'BaseRegistrarImplementation', + srcPath: 'contracts/ethregistrar/', + }, + }, + { + name: 'ETH Registrar Controller', + github: { + filename: 'ETHRegistrarController', + srcPath: 'contracts/ethregistrar/', + }, + }, + { + name: 'DNS Registrar', + github: { + filename: 'DNSRegistrar', + srcPath: 'contracts/dnsregistrar/', + }, + }, + { + name: 'Reverse Registrar', + github: { + filename: 'ReverseRegistrar', + srcPath: 'contracts/reverseRegistrar/', + }, + }, + { + name: 'Name Wrapper', + github: { + filename: 'NameWrapper', + srcPath: 'contracts/wrapper/', + }, + }, + { + name: 'Public Resolver', + github: { + filename: 'PublicResolver', + srcPath: 'contracts/resolvers/', + }, + }, + { + name: 'Universal Resolver', + github: { + filename: 'UniversalResolver', + srcPath: 'contracts/utils/', + }, + }, + ], + }, + { + name: 'Sepolia', + slug: 'sepolia', + contracts: [ + { + name: 'Registry', + github: { + filename: 'ENSRegistry', + srcPath: 'contracts/registry/', + }, + }, + { + name: 'Base Registrar', + github: { + filename: 'BaseRegistrarImplementation', + srcPath: 'contracts/ethregistrar/', + }, + }, + { + name: 'ETH Registrar Controller', + github: { + filename: 'ETHRegistrarController', + srcPath: 'contracts/ethregistrar/', + }, + }, + { + name: 'DNS Registrar', + github: { + filename: 'DNSRegistrar', + srcPath: 'contracts/dnsregistrar/', + }, + }, + { + name: 'Reverse Registrar', + github: { + filename: 'ReverseRegistrar', + srcPath: 'contracts/reverseRegistrar/', + }, + }, + { + name: 'Name Wrapper', + github: { + filename: 'NameWrapper', + srcPath: 'contracts/wrapper/', + }, + }, + { + name: 'Public Resolver', + github: { + filename: 'PublicResolver', + srcPath: 'contracts/resolvers/', + }, + }, + { + name: 'Universal Resolver', + github: { + filename: 'UniversalResolver', + srcPath: 'contracts/utils/', + }, + }, + ], + }, + { + name: 'Holesky', + slug: 'holesky', + contracts: [ + { + name: 'Registry', + github: { + filename: 'ENSRegistry', + srcPath: 'contracts/registry/', + }, + }, + { + name: 'Base Registrar', + github: { + filename: 'BaseRegistrarImplementation', + srcPath: 'contracts/ethregistrar/', + }, + }, + { + name: 'ETH Registrar Controller', + github: { + filename: 'ETHRegistrarController', + srcPath: 'contracts/ethregistrar/', + }, + }, + { + name: 'DNS Registrar', + github: { + filename: 'DNSRegistrar', + srcPath: 'contracts/dnsregistrar/', + }, + }, + { + name: 'Reverse Registrar', + github: { + filename: 'ReverseRegistrar', + srcPath: 'contracts/reverseRegistrar/', + }, + }, + { + name: 'Name Wrapper', + github: { + filename: 'NameWrapper', + srcPath: 'contracts/wrapper/', + }, + }, + { + name: 'Public Resolver', + github: { + filename: 'PublicResolver', + srcPath: 'contracts/resolvers/', + }, + }, + { + name: 'Universal Resolver', + github: { + filename: 'UniversalResolver', + srcPath: 'contracts/utils/', + }, + }, + ], + }, +] + +// Generate a JSON file with contract deployment info +// Only runs once, no need for hot reloading +export async function deployments(): Promise { + const name = 'contract-deployments' + + return { + name, + resolveId(id) { + if (id === name) return name + }, + async buildStart() { + const alreadyExists = await fs + .access('src/lib/deployments.json') + .then(() => true) + .catch(() => false) + + if (alreadyExists) { + return + } + + console.log('Fetching deployments') + + await Promise.all( + DEPLOYMENTS.map(async (chain) => { + await Promise.all( + chain.contracts.map(async (contract) => { + const res = await fetch( + `https://raw.githubusercontent.com/ensdomains/ens-contracts/staging/deployments/${chain.slug}/${contract.github.filename}.json` + ).then((res) => res.json() as Promise) + + // Add the contract address to the deployment + contract.address = res.address + }) + ) + }) + ) + + // Save deployments as JSON + await fs.writeFile( + path.join('src/lib/deployments.json'), + JSON.stringify(DEPLOYMENTS, null, 2) + ) + }, + } +} diff --git a/vocs.config.tsx b/vocs.config.tsx index 1f767bc23..dddae1795 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -1,5 +1,6 @@ import { defineConfig } from 'vocs' +import { deployments } from './src/plugins/deployments' import { ensips } from './src/plugins/ensips' const ensipSidebarItems = new Array() @@ -43,7 +44,7 @@ export default defineConfig({ }, }, vite: { - plugins: [ensips()], + plugins: [ensips(), deployments()], }, head: { // TODO: Ideally this should get injected into
for semantics via a remark plugin. @@ -71,11 +72,11 @@ export default defineConfig({ items: [ { text: 'The Protocol', - link: '', + link: '/learn/protocol', }, { text: 'Deployments', - link: '', + link: '/learn/deployments', }, { text: 'Resolution', From baad4363f93d64f749c6c8d536b0c1ae21c6f54c Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Thu, 6 Feb 2025 22:31:53 -0500 Subject: [PATCH 27/79] Start contracts section --- .../content/prose/repository/github/index.tsx | 88 ------------------- src/components/EmbedLink.tsx | 15 ++-- src/components/Repository.tsx | 25 ++++++ src/pages/contracts/index.mdx | 62 ++++++------- vocs.config.tsx | 2 +- 5 files changed, 67 insertions(+), 125 deletions(-) delete mode 100644 app/local/content/prose/repository/github/index.tsx create mode 100644 src/components/Repository.tsx diff --git a/app/local/content/prose/repository/github/index.tsx b/app/local/content/prose/repository/github/index.tsx deleted file mode 100644 index 268948e79..000000000 --- a/app/local/content/prose/repository/github/index.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { FC } from 'react'; -import { FiFolderPlus, FiGitBranch, FiGithub, FiStar } from 'react-icons/fi'; - -import { RepositoryType } from '../Repository'; -import { fetchGithubRepositoryData } from './fetch'; - -const getLanguageColor = (language: string) => { - if (language === 'TypeScript') { - return '#2b7489'; - } - - if (language === 'JavaScript') { - return '#f1e05a'; - } - - if (language === 'HTML') { - return '#e34c26'; - } - - if (language === 'Rust') { - return '#dea584'; - } - - return ''; -}; - -export const GithubRepository: FC = async ({ - src, - name, - description, -}) => { - const { - description: gh_description, - html_url, - forks_count, - is_template, - stargazers_count, - language, - } = await fetchGithubRepositoryData(src); - - name = name || src; - description = description || gh_description; - - const languageColor = getLanguageColor(language); - - return ( - - - - {is_template ? : } - - - {name} -

{description}

-
- - {language && ( - - - {language} - - )} - {stargazers_count > 10 && ( - - - - {stargazers_count} - - - )} - {forks_count > 10 && ( - - - {forks_count} - - )} - -
-
- ); -}; diff --git a/src/components/EmbedLink.tsx b/src/components/EmbedLink.tsx index 1bcf42c25..13df700c8 100644 --- a/src/components/EmbedLink.tsx +++ b/src/components/EmbedLink.tsx @@ -1,6 +1,7 @@ import { FC } from 'react' import { FiChevronRight } from 'react-icons/fi' +import { cn } from '../lib/utils' import { Card } from './ui/Card' type Props = { @@ -13,20 +14,24 @@ export const EmbedLink: FC = ({ title, description, tag, ...props }) => { return ( -
- +
+
{title} {description} - +
{tag && ( - + {tag} )} +
diff --git a/src/components/Repository.tsx b/src/components/Repository.tsx new file mode 100644 index 000000000..9538dc365 --- /dev/null +++ b/src/components/Repository.tsx @@ -0,0 +1,25 @@ +import { FC } from 'react' +import { FiGithub } from 'react-icons/fi' + +type RepositoryType = { + src: string + description?: string +} + +export const Repository: FC = ({ src, description }) => { + return ( + +
+ +
+
+ {src} +

{description}

+
+
+ ) +} diff --git a/src/pages/contracts/index.mdx b/src/pages/contracts/index.mdx index d398005b7..748d5c550 100644 --- a/src/pages/contracts/index.mdx +++ b/src/pages/contracts/index.mdx @@ -1,11 +1,9 @@ -import { WIP } from '@/components/wip/WIP'; +--- +description: The Ethereum Name Service Smart Contracts Overview +--- -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'The Ethereum Name Service Smart Contracts Overview', - emoji: '🗒️', - contributors: [] -}; +import { EmbedLink } from '../../components/EmbedLink' +import { Repository } from '../../components/Repository' # Smart Contracts @@ -18,9 +16,9 @@ The resolution process outlines how a name is resolved. This includes the process of finding a resolver, and then using that resolver to fetch information about a name. ## Resolvers @@ -31,9 +29,9 @@ Resolvers allow for programmatic control over the information associated with a There are various resolvers to choose from, such as the [Public Resolver](/resolvers/public) or [write your own](/resolvers/writing). ## Registry & Registrars @@ -41,23 +39,22 @@ There are various resolvers to choose from, such as the [Public Resolver](/resol The smart contracts can be found on github at [ensdomains/ens-contracts](https://github.com/ensdomains/ens-contracts).
-
- { - [ - ['The Registry', '/registry/ens'], - ['ETH Registrar', '/registry/eth'], - ['DNS Registrar', '/registry/dns'], - ['Reverse Registrar', '/registry/reverse'] - ].map((list, i) => ( - - )) - } -
+
+ {[ + ['The Registry', '/registry/ens'], + ['ETH Registrar', '/registry/eth'], + ['DNS Registrar', '/registry/dns'], + ['Reverse Registrar', '/registry/reverse'], + ].map((list) => ( + + ))} +
## Source Code @@ -65,5 +62,8 @@ The smart contracts can be found on github at [ensdomains/ens-contracts](https:/ The code for the ENS Smart Contracts as well as information around the latest deploys, tests, and more can be found on github.
- +
diff --git a/vocs.config.tsx b/vocs.config.tsx index dddae1795..342d901e2 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -202,7 +202,7 @@ export default defineConfig({ items: [ { text: 'Overview', - link: '', + link: '/contracts', }, { text: 'Resolution', From 668edc4cf362808e3f7e61325de958e2fe724a0d Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Thu, 6 Feb 2025 23:29:51 -0500 Subject: [PATCH 28/79] Add 2 new pages in resolution section --- src/pages/resolution/index.mdx | 93 +++++--- src/pages/resolution/names.mdx | 206 +++++++++--------- .../public/img/resolution-diagram-1.png | Bin vocs.config.tsx | 4 +- 4 files changed, 165 insertions(+), 138 deletions(-) rename app/public/content/resolution/flow1.png => src/public/img/resolution-diagram-1.png (100%) diff --git a/src/pages/resolution/index.mdx b/src/pages/resolution/index.mdx index 930dab4dd..41fbbccd2 100644 --- a/src/pages/resolution/index.mdx +++ b/src/pages/resolution/index.mdx @@ -1,18 +1,16 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: '', - emoji: '👋', - contributors: [] -}; +import { Card } from '../../components/ui/Card' # Resolution The process by which we load information about a name is called resolution. It's a simple process, but it's important to understand. Here is a diagram of some of the contracts involved when resolving a name. -
- -
+ + Diagram of the ENS resolution process + The resolution process involves multiple parts. Most notably the [Registry](/registry/ens), multiple Registrars ([ETH Registrar](/registry/eth), [DNS Registrar](/registry/dns), [Reverse Registrar](/registry/reverse), etc) and the concept of a [Resolver](/resolvers/quickstart). @@ -26,45 +24,49 @@ Here is a little peak at what happens under the hood of your favourite library w Every name has a "resolver". A resolver is simply a contract that implements the [resolver specification](/resolvers/quickstart) and can be queried for information about a name. To get the resolver responsible for a name you can query [The Registry](/registry/ens) for the `resolver` of a name. - +:::code-group -```tsx {{ variant: 'solidity' }} +```solidity [Solidity] ENS.resolver(bytes32 node) view returns (address) ``` -```tsx {{ meta: 'focus=4:9', variant: 'wagmi', link: 'https://wagmi.sh/react/api/hooks/useEnsResolver#data', stackblitz: 'https://stackblitz.com/edit/ens-wagmi-use-ens-resolver' }} -import { useEnsResolver } from "wagmi"; -import { normalize } from 'viem/ens'; +```tsx [Wagmi] +// https://wagmi.sh/react/api/hooks/useEnsResolver +import { normalize } from 'viem/ens' +import { useEnsResolver } from 'wagmi' export const MyResolver = () => { - const { data: myResolver } = useEnsResolver({ - name: normalize("luc.eth"), // The name to lookup - }); + const { data: myResolver } = useEnsResolver({ + name: normalize('luc.eth'), // The name to lookup + }) - return
{myResolver}
; -}; + return
{myResolver}
+} ``` -```ts {{ variant: 'ethers-v5' }} -const resolver = await provider.getResolver("luc.eth"); +```ts [Ethers] +const resolver = await provider.getResolver('luc.eth') ``` -```ts {{ variant: 'viem', link: 'https://viem.sh/docs/ens/actions/getEnsResolver.html' }} -import { normalize } from "viem/ens"; -import { publicClient } from "./client"; +```ts [viem] +// https://viem.sh/docs/ens/actions/getEnsResolver.html +import { normalize } from 'viem/ens' + +import { publicClient } from './client' const ensResolver = await publicClient.getEnsResolver({ - name: normalize("luc.eth"), -}); + name: normalize('luc.eth'), +}) ``` -```py {{ variant: 'web3py', link: 'https://web3py.readthedocs.io/en/latest/ens_overview.html#working-with-resolvers' }} +```py [Web3.py] +# https://web3py.readthedocs.io/en/latest/ens_overview.html#working-with-resolvers from ens.auto import ns resolver = ns.resolver('alice.eth') ``` -
+::: To verify which specifications are implemented by a resolver you can call the `supportsInterface(bytes4 interfaceID)` on the resolver with the interfaceID you would like to test for. @@ -82,18 +84,41 @@ In addition, all of the above functions can be sent to the `resolve()` function, This allows for not only multicall functionality, but also easier implementation of EIP-3668, and more. Most clients & many resolvers utilize wildcard resolution as their primary form of resolution. - - ## Reverse Resolution Due to the modular nature of how ENS is designed, it is also possible to lookup the "primary name" of an address. This process actually uses forward resolution under the hood, you read that right - its just forwards resolution. +To look up the primary name of a given address you must do a resolver lookup for `addr.reverse` and then query the `name()` field on the resolver. This name field returns the "preferred" name for the address. + ```solidity -Resolver("0x225f137127d9067788314bc7fcc1f36746a3c3B5.addr.reverse").name() -> "luc.eth" +/// @dev The starting point for all ENS resolution is the Registry +ENS ens = 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e; + +/// @dev The node hash for "addr.reverse" +bytes32 ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2; + +/// @dev Returns the node hash for a given account's reverse records, `{address}.addr.reverse` +function reverseNode(address addr) public pure returns (bytes32) { + return keccak256( + abi.encodePacked(ADDR_REVERSE_NODE, sha3HexAddress(addr)) + ); +} + +/// @dev Get the reverse record for an address +function getReverseRecord(address addr) public view returns (string) { + bytes32 reverseNodeHash = reverseNode(addr); + + // Get the resolver for the reverse node + Resolver resolver = ens.resolver(reverseNodeHash); + + // Get the address's preferred name + return resolver.name(reverseNodeHash); +} ``` -To look up the primary name of a given address you must do a resolver lookup for `addr.reverse` and then query the `name()` field on the resolver. -This name field returns the "preferred" name for the address. Note that the implementing client MUST perform a forward resolution on this name to verify the address matches the one you are looking up. +:::info +**Important**: The client MUST perform a forward resolution on a user's reverse record to verify the address matches the one you are looking up. The example above does not perform this verification. +::: -Please note that many libraries already have functionality to do this, you can read more about it in the [Getting a Primary Name](/web/reverse#get) section. +Please note that many libraries already have functionality to do this, you can read more about it in the [Getting a Primary Name](/web/reverse) section. diff --git a/src/pages/resolution/names.mdx b/src/pages/resolution/names.mdx index 71af96658..5453c889f 100644 --- a/src/pages/resolution/names.mdx +++ b/src/pages/resolution/names.mdx @@ -1,24 +1,11 @@ -import { WIP } from '@/components/wip/WIP'; - -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Normalization and recommendations for how to handle names', - emoji: '⚙️', - contributors: [ - 'luc.eth', - 'serenae.eth', - 'gregskril.eth', - ] -}; - -# Name Processing +# Name Processing [Normalization and recommendations for how to handle names] When interacting with the ENS protocol smart-contracts directly it is important to note that names are not stored in their human readable format. In fact there are a few steps a name undergoes before it can be used by a smart-contract. When building a dApp most of the time you don't have to worry about name processing, as most [libraries](/web/libraries) will handle this for you. -## Name Normalization {{ title: "Normalization", id: "normalize" }} +## Name Normalization Normalization is the process of canonicalizing a name before running it through the [Namehash](#namehash) algorithm. It is important to always normalize all input, because even one little difference (like a capital vs lowercase character) will cause the namehash to be completely different. @@ -31,54 +18,60 @@ Previously, [UTS-46](https://www.unicode.org/reports/tr46/) was used, but that i A standard implementation of the algorithm is available at [@adraffy/ens-normalize](https://github.com/adraffy/ens-normalize.js). This library is used under the hood in [viem](https://viem.sh/docs/ens/utilities/normalize), [ENSjs](https://github.com/ensdomains/ensjs/blob/main/packages/ensjs/src/utils/normalise.ts#L27), and others. ```js -import { normalize } from 'viem/ens'; +import { normalize } from 'viem/ens' + // Uses @adraffy/ens-normalize under the hood -const normalized = normalize('RaFFY🚴‍♂️.eTh'); +const normalized = normalize('RaFFY🚴‍♂️.eTh') // => "raffy🚴‍♂.eth" ``` If the name was not able to be normalized, then that method will throw an error. A name is valid if it is able to be normalized. -## Namehash {{ title: "Namehash", id: "namehash" }} +## Namehash - - You **MUST** [normalize](#normalize) a name before you attempt to create a namehash! If you don't, then the hash you get may be incorrect. Some libraries like [ensjs](https://github.com/ensdomains/ensjs) will automatically do this for you. - +:::note +You **MUST** [normalize](#normalize) a name before you attempt to create a namehash! If you don't, then the hash you get may be incorrect. Some libraries like [ensjs](https://github.com/ensdomains/ensjs) will automatically do this for you. +::: In the core ENS registry, names are stored as a hash instead of the raw string to optimize for gas, performance, and more. This hashed value is typically referred to as a `node`. The node is a hex-encoded 32-byte value that is derived from the name using the `namehash` algorithm defined in [ENSIP-1](/ensip/1). Namehash is a recursive algorithm that hashes each part of the name, then hashes the results together. Beacuse recursive functions aren't very efficient in Solidity, it's usually best to derive the namehash offchain and pass to it a contract. Luckily, there are libraries that do this for us. - -```tsx {{ title: 'Viem (TS)', language: 'ts', variant: 'viem', link: 'https://viem.sh/docs/ens/utilities/namehash' }} -import { namehash, normalize } from "viem/ens"; +:::code-group + +```tsx [Viem] +// https://viem.sh/docs/ens/utilities/namehash +import { namehash, normalize } from 'viem/ens' -const normalizedName = normalize("name.eth"); -const node = namehash(normalizedName); +const normalizedName = normalize('name.eth') +const node = namehash(normalizedName) ``` -```ts {{ title: 'Ethers.js (TS)', language: 'ts', variant: 'ethers-v6', link: 'https://docs.ethers.org/v6/api/hashing/#namehash' }} -import { ensNormalize, namehash } from "ethers/hash"; +```ts [Ethers.js] +// https://docs.ethers.org/v6/api/hashing/#namehash +import { ensNormalize, namehash } from 'ethers/hash' const normalizedName = ensNormalize('name.eth') const node = namehash(normalizedName) ``` -```python {{ title: "ens-namehash-py", variant: 'python', link: 'https://github.com/ConsenSysMesh/ens-namehash-py' }} +```python [ens-namehash-py] +# https://github.com/ConsenSysMesh/ens-namehash-py from namehash import namehash node = namehash('name.eth') ``` -```rust {{ title: "namehash-rust", link: "https://github.com/InstateDev/namehash-rust" }} +```rust [namehash-rust] +// https://github.com/InstateDev/namehash-rust fn main() { let node = &namehash("name.eth"); let s = hex::encode(&node); } ``` -```solidity {{ title: 'Solidity', variant: 'solidity' }} +```solidity [Solidity] // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; @@ -91,7 +84,8 @@ contract MyContract { } } ``` - + +::: ### Algorithm @@ -99,110 +93,117 @@ The specification for the namehash algorithm was originally defined in [EIP-137] It's a recursive algorithm that works its way down until you hit the root domain. For `ens.eth`, the algorithm works like so: - - - - - - -
`namehash('ens.eth')` = `keccak256(namehash('eth') + labelhash('ens'))`
`namehash('eth')` = `keccak256(namehash('') + labelhash('eth'))`
`namehash('')` = `0x0000000000000000000000000000000000000000000000000000000000000000`
+``` +namehash('ens.eth') = keccak256(namehash('eth') + labelhash('ens')) +namehash('eth') = keccak256(namehash('') + labelhash('eth')) +namehash('') = 0x0000000000000000000000000000000000000000000000000000000000000000 +``` That last line is a special case: The namehash for an empty string (representing the root domain) is 32 null bytes. If you plug everything in above, you'll end up with the final namehash value: -* `namehash('')` = - * `0x0000000000000000000000000000000000000000000000000000000000000000` -* `labelhash('eth')` = - * `keccak256('eth')` = - * `0x4f5b812789fc606be1b3b16908db13fc7a9adf7ca72641f84d75b47069d3d7f0` -* `namehash('eth')` = - * `keccak256(namehash('') + labelhash('eth'))` = - * `keccak256(0x00000000000000000000000000000000000000000000000000000000000000004f5b812789fc606be1b3b16908db13fc7a9adf7ca72641f84d75b47069d3d7f0)` = - * `0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae` -* `labelhash('ens')` = - * `keccak256('ens')` = - * `0x5cee339e13375638553bdf5a6e36ba80fb9f6a4f0783680884d92b558aa471da` -* `namehash('ens.eth')` = - * `keccak256(namehash('eth') + labelhash('ens'))` = - * `keccak256(0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae5cee339e13375638553bdf5a6e36ba80fb9f6a4f0783680884d92b558aa471da)` = - * **`0x4e34d3a81dc3a20f71bbdf2160492ddaa17ee7e5523757d47153379c13cb46df`** - -### Reverse Nodes {{ title: "Reverse Nodes", id: "reverse-nodes" }} +``` +namehash('') = 0x0000000000000000000000000000000000000000000000000000000000000000 + +labelhash('eth') = keccak256('eth') = 0x4f5b812789fc606be1b3b16908db13fc7a9adf7ca72641f84d75b47069d3d7f0 + +namehash('eth') = keccak256(namehash('') + labelhash('eth')) = keccak256(0x00000000000000000000000000000000000000000000000000000000000000004f5b812789fc606be1b3b16908db13fc7a9adf7ca72641f84d75b47069d3d7f0) = 0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae + +labelhash('ens') = keccak256('ens') = 0x5cee339e13375638553bdf5a6e36ba80fb9f6a4f0783680884d92b558aa471da + +namehash('ens.eth') = keccak256(namehash('eth') + labelhash('ens')) = keccak256(0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae5cee339e13375638553bdf5a6e36ba80fb9f6a4f0783680884d92b558aa471da) = 0x4e34d3a81dc3a20f71bbdf2160492ddaa17ee7e5523757d47153379c13cb46df + +``` + +This brings us to the final node for ens.eth: `0x4e34d3a81dc3a20f71bbdf2160492ddaa17ee7e5523757d47153379c13cb46df` + +### Reverse Nodes The [Reverse Node](/terminology#reverse-node) is a node in the Registry that can be claimed for any Ethereum account. The name this node represents is `[addr].addr.reverse`, where `[addr]` is the Ethereum public address (lowercase, without the "0x"). These reverse nodes are typically used to set a [Primary Name](#primary-name) for an account. To generate the namehash for a reverse node: -* Take the input address and: - * Remove the "0x" at the beginning - * Convert all characters to lowercase -* Add `.addr.reverse` to the end -* Run this result through the namehash algorithm +- Take the input address and: + - Remove the "0x" at the beginning + - Convert all characters to lowercase +- Add `.addr.reverse` to the end +- Run this result through the namehash algorithm For example, for address `0x481f50a5BdcCC0bc4322C4dca04301433dED50f0`, the name for the reverse node is: -* `481f50a5bdccc0bc4322c4dca04301433ded50f0.addr.reverse` + +- `481f50a5bdccc0bc4322c4dca04301433ded50f0.addr.reverse` And the resulting namehash for the reverse node is: -* `0x58354ffdde6ac279f3a058aafbeeb14059bcb323a248fb338ee41f95fa544c86` -## Labelhash {{ title: "Labelhash", id: "labelhash" }} +- `0x58354ffdde6ac279f3a058aafbeeb14059bcb323a248fb338ee41f95fa544c86` + +## Labelhash - - You **MUST** [normalize](#normalize) a name before you attempt to create a labelhash! If you don't, then the hash you get may be incorrect. - +:::note +You **MUST** [normalize](#normalize) a name before you attempt to create a labelhash! If you don't, then the hash you get may be incorrect. +::: Labelhash is the Keccak-256 hash of a single label (e.g. `name` in `name.eth`), used in places that don't require the full name. One example of where labelhash is used is in the [BaseRegistar](/registry/eth), since it only supports registering 2LDs (second-level domains, like `name.eth`) and not 3LDs+ (e.g. `sub.name.eth`). The token ID of a second-level .eth name in the BaseRegistar is the uint256 of the labelhash. - -```tsx {{ title: 'Viem (TS)', language: 'ts', variant: 'viem', link: 'https://viem.sh/docs/ens/utilities/labelhash' }} -import { labelhash, normalize } from "viem/ens"; +:::code-group -const normalizedLabel = normalize("label"); -const hash = labelhash(normalizedLabel); +```tsx [Viem] +// https://viem.sh/docs/ens/utilities/labelhash +import { labelhash, normalize } from 'viem/ens' + +const normalizedLabel = normalize('label') +const hash = labelhash(normalizedLabel) ``` -```tsx {{ title: 'Ethers (TS)', language: 'ts', variant: 'ethers-v6', link: 'https://docs.ethers.org/v6/api/crypto/#keccak256' }} -import { keccak256 } from "ethers/crypto"; -import { ensNormalize } from "ethers/hash"; -import { toUtf8Bytes } from "ethers/utils"; +```tsx [Ethers] +// https://docs.ethers.org/v6/api/crypto/#keccak256 +import { keccak256 } from 'ethers/crypto' +import { ensNormalize } from 'ethers/hash' +import { toUtf8Bytes } from 'ethers/utils' const normalizedLabel = ensNormalize('label') const labelhash = keccak256(toUtf8Bytes(normalizedLabel)) ``` -```ts {{ title: 'Solidity', variant: 'solidity' }} +```solidity [Solidity] string constant label = "label"; bytes32 constant labelhash = keccak256(bytes(label)); ``` - -## DNS Encoding {{ title: "DNS Encoding", id: "dns" }} +::: + +## DNS Encoding - - You **MUST** [normalize](#normalize) a name before you DNS-encode it! If you don't, then when you pass those DNS-encoded bytes into a contract method, incorrect namehashes/labelhashes may be derived. - +:::note +You **MUST** [normalize](#normalize) a name before you DNS-encode it! If you +don't, then when you pass those DNS-encoded bytes into a contract method, +incorrect namehashes/labelhashes may be derived. +::: This is a binary format for domain names, which encodes the length of each label along with the label itself. It is used by some of the ENS contracts, such as when wrapping names in the [Name Wrapper](/wrapper/overview) or resolving data with [ENSIP-10](/ensip/10). - -```tsx {{ title: 'Viem (TS)', language: 'ts', variant: 'viem', link: 'https://viem.sh/docs/ens/utilities/labelhash' }} -import { toHex } from 'viem/utils' +:::code-group + +```tsx [Viem] +// https://viem.sh/docs/ens/utilities/labelhash import { packetToBytes } from 'viem/ens' +import { toHex } from 'viem/utils' const name = 'name.eth' const dnsEncodedName = toHex(packetToBytes(name)) ``` -```tsx {{ title: 'Ethers (TS)', language: 'ts', variant: 'ethers-v6', link: 'https://docs.ethers.org/v6/api/hashing/#dnsEncode' }} +```tsx [Ethers] +// https://docs.ethers.org/v6/api/hashing/#dnsEncode import { dnsEncode } from 'ethers/lib/utils' const dnsEncodedName = dnsEncode('name.eth') ``` -```ts {{ title: 'Solidity', variant: 'solidity' }} +```solidity [Solidity] // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; @@ -215,28 +216,29 @@ contract MyContract { } } ``` - + +::: ### Algorithm To DNS-encode a name, first split the name into labels (delimited by `.`). Then for each label from left-to-right: -* One byte to denote the length of the label -* The UTF-8 encoded bytes for the label -* If this is the last label, then one final NUL (`0x00`) byte. +- One byte to denote the length of the label +- The UTF-8 encoded bytes for the label +- If this is the last label, then one final NUL (`0x00`) byte. For example, to DNS-encode `my.name.eth`: -* `0x02` (length of the label "my") -* `0x6D79` (UTF-8 encoded bytes of "my") -* `0x04` (length of the label "name") -* `0x6E616D65` (UTF-8 encoded bytes of "name") -* `0x03` (length of the label "eth") -* `0x657468` (UTF-8 encoded bytes of "eth") -* `0x00` (end of name marker) +- `0x02` (length of the label "my") +- `0x6D79` (UTF-8 encoded bytes of "my") +- `0x04` (length of the label "name") +- `0x6E616D65` (UTF-8 encoded bytes of "name") +- `0x03` (length of the label "eth") +- `0x657468` (UTF-8 encoded bytes of "eth") +- `0x00` (end of name marker) Final result: `0x026d79046e616d650365746800` - - Since the length of each label is stored in a single byte, that means that with this DNS-encoding scheme, each label is limited to being 255 UTF-8 encoded bytes in length. Because of this, names with longer labels cannot be wrapped in the [Name Wrapper](/wrapper/overview), as that contract uses the DNS-encoded name. - +:::note +Since the length of each label is stored in a single byte, that means that with this DNS-encoding scheme, each label is limited to being 255 UTF-8 encoded bytes in length. Because of this, names with longer labels cannot be wrapped in the [Name Wrapper](/wrapper/overview), as that contract uses the DNS-encoded name. +::: diff --git a/app/public/content/resolution/flow1.png b/src/public/img/resolution-diagram-1.png similarity index 100% rename from app/public/content/resolution/flow1.png rename to src/public/img/resolution-diagram-1.png diff --git a/vocs.config.tsx b/vocs.config.tsx index 342d901e2..a2ef3ece0 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -209,11 +209,11 @@ export default defineConfig({ items: [ { text: 'Resolution Process', - link: '', + link: '/resolution', }, { text: 'Name Processing', - link: '', + link: '/resolution/names', }, ], }, From b6be11ffc0ac45584511ec56000a8d5a76cd3ce1 Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Fri, 7 Feb 2025 18:01:34 -0500 Subject: [PATCH 29/79] Add a bunch of contracts pages --- app/src/components/mdx/Properties.tsx | 9 -- src/components/EnsProfile.tsx | 2 +- src/components/Properties.tsx | 32 +++++ src/pages/resolvers/ccip-read.mdx | 135 ++++++++---------- src/pages/resolvers/interacting.mdx | 40 ++---- src/pages/resolvers/public.mdx | 45 +++--- src/pages/resolvers/quickstart.mdx | 8 +- src/pages/resolvers/writing.mdx | 15 +- .../public/img/ccip-read-diagram-1.png | Bin vocs.config.tsx | 10 +- 10 files changed, 136 insertions(+), 160 deletions(-) delete mode 100644 app/src/components/mdx/Properties.tsx create mode 100644 src/components/Properties.tsx rename app/public/content/learn/ccip-read/1.png => src/public/img/ccip-read-diagram-1.png (100%) diff --git a/app/src/components/mdx/Properties.tsx b/app/src/components/mdx/Properties.tsx deleted file mode 100644 index 9b320ce1d..000000000 --- a/app/src/components/mdx/Properties.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export const Properties = ({ children }) => { - return ( -
-
    - {children} -
-
- ); -}; diff --git a/src/components/EnsProfile.tsx b/src/components/EnsProfile.tsx index bd50aead3..34724f0ab 100644 --- a/src/components/EnsProfile.tsx +++ b/src/components/EnsProfile.tsx @@ -49,7 +49,7 @@ function Profile({ const { data: avatar } = useEnsAvatar({ name: name || undefined, chainId: 1 }) return ( -
+
{ + return
    {children}
+} + +const Property = ({ + name, + type, + children, +}: PropsWithChildren<{ name: string; type: string }>) => { + return ( +
  • +
    +
    Name
    +
    + {name} +
    +
    Type
    +
    {type}
    +
    Description
    +
    + {children} +
    +
    +
  • + ) +} + +Properties.Property = Property + +export { Properties } diff --git a/src/pages/resolvers/ccip-read.mdx b/src/pages/resolvers/ccip-read.mdx index 707d2f09c..72723a5fb 100644 --- a/src/pages/resolvers/ccip-read.mdx +++ b/src/pages/resolvers/ccip-read.mdx @@ -1,44 +1,45 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - title: 'Offchain Resolvers (CCIP Read)', - description: 'Learn about how CCIP Read enables Offchain ENS Resolvers, how a gateway works, trust assumptions, and more.', - emoji: '⛓️', - contributors: ['luc.eth'], -}; +--- +description: Learn about how CCIP Read enables Offchain ENS Resolvers, how a gateway works, trust assumptions, and more. +--- -# Cross Chain / Offchain Resolvers +import { Properties } from '../../components/Properties' +import { Repository } from '../../components/Repository' +import { Card } from '../../components/ui/Card' -{/* This document covers what it takes to write a gateway resolver. */} +# Cross Chain / Offchain Resolvers The source of truth for a name and its subdomains does not always have to be on-chain or on Ethereum L1 at all. By leveraging [EIP-3668](https://eips.ethereum.org/EIPS/eip-3668), the Cross Chain Interoperability Protocol (or CCIP Read for short), we can load information by hitting a so called "Gateway". Within the context of ENS, this enables us to read names, addresses, text records and more from other chains, or even off-chain. -
    - -
    ➡️
    -
    -
    Resolver
    -
    0x1234
    -
    -
    ➡️
    -
    -
    Gateway
    -
    api.example.com
    -
    -
    ➡️
    -
    -
    Address:
    -
    0x225...c3b5
    -
    -
    + +
    +
    Name
    +
    jesse.cb.id
    +
    +
    ➡️
    +
    +
    Resolver
    +
    0x1934...BE56
    +
    +
    ➡️
    +
    +
    Gateway
    +
    api.coinbase.com
    +
    +
    ➡️
    +
    +
    Address
    +
    0x8491...8bf1
    +
    +
    ## How does it work? The Cross Chain Interoperability Protocol (CCIP Read), is a client-side implemented protocol that introduces the [OffchainLookup](https://eips.ethereum.org/EIPS/eip-3668#contract-interface) error. Once the client encounters this error, it will attempt to handle it by calling a gateway url. Most Ethereum libraries handle this for you, at no additional cost. -```c +```solidity error OffchainLookup( address sender, string[] urls, @@ -60,9 +61,10 @@ The [gateway url](https://ens-gateway.gregskril.workers.dev/lookup/{sender}/{dat The Unruggable Gateway is a gateway that allows you to load data from specific Layer 2's whose proofs are verifyable on L1. This means if you are looking to load data from Optimism or Arbitrum, the Unruggable Gateway allows you to trustlessly do so. -
    - -
    + ## CCIP Read Flow @@ -71,7 +73,7 @@ During this execution the `OffchainLookup` error is thrown, and the client will If successful the gateways results are returned to the callback function specified in the error. The output of the callback function is then returned to the client and considered the result of the original lookup. - + ## Writing a Gateway @@ -84,40 +86,47 @@ The URL for this gateway is determined by the `OffchainLookup` error, and is pas ### Template Repositories
    - - - + + +
    -### Implement Gateway Endpoint {{ navtitle: 'Implement Gateway', id: 'endpoint' }} +### Implement Gateway Endpoint There are two methods (GET and POST) you can choose to implement when writing a gateway. When your smart-contract reverts with the `OffchainLookup` error you can decide the url it returns. If `{data}` can be successfully substituted out of the URL a GET request will be made, if no `{data}` is present a POST request will be made instead, with the data instead submitted as the post body. - +:::code-group -```yaml {{ title: 'POST', variant: 'post' }} +```yaml [POST] // POST if URL does not include '{data}' parameter URL: https://example.com/gateway/{sender}.json Method: POST Body: data ``` -```yaml {{ title: 'GET', variant: 'get' }} +```yaml [GET] // GET if URL includes '{data}' parameter URL: https://example.com/gateway/{sender}/{data}.json Method: GET ``` - +::: - - Lowercased address of the contract reverting with the `OffchainLookup` error. - - + + Lowercased address of the contract reverting with the `OffchainLookup` + error. + + 0x prefixed bytes of the data passed to the `OffchainLookup` error. - + #### Trust Assumptions @@ -139,7 +148,7 @@ When reverting with an `OffchainLookup` error you can specify a callback functio The callback function is evaluated on the client side with the data returned from the gateway. This makes it a perfect place to validate proofs, signatures, or other data. -### Enabling your Resolver {{ navtitle: 'Setting Resolver', id: 'set' }} +### Enabling your Resolver Last but not least you need to instruct your name to use the resolver-gateway combo. To do this, simply visit the [ENS Manager App](https://ens.app/) and set the resolver of your name to the contract address of your resolver. @@ -152,36 +161,4 @@ An alternative option is to [set the Resolver manually](/resolvers/interacting) To test your gateway you can use the [ENS Manager App](https://ens.app/) or if you want more detail try using [enstate](https://enstate.rs/n/luc.willbreak.eth) and notice the `ccip_urls` field. If your results are loaded successfully, you have successfully implemented a gateway resolver. - A testing tool for CCIP Read functions will be available soon. - -{/* ```mermaid -sequenceDiagram - participant Client - box Ethereum L1 - participant ENS - participant Resolver - end - participant Gateway as Gateway Service* - participant L2 as L2 or Database* - - Client->>ENS: get resolver for luc.eth - ENS->>Client: - Client->>Resolver: get 'avatar' for hello.luc.eth - rect rgb(82, 152, 255) - Resolver->>Client: revert with OffchainLookup(sender, urls, callData,
    callbackFunction, extraData) - end - - Client->>Gateway: get 'avatar' for hello.luc.eth - - opt Retrieve data from L2 or Database - Gateway->>L2: - L2->>Gateway: - end - - Gateway->>Client: Return Results - - opt Verify signature of gateway results - Client->>Resolver: Do these results look right? - Resolver->>Client: - end -``` */} +A testing tool for CCIP Read functions will be available soon. diff --git a/src/pages/resolvers/interacting.mdx b/src/pages/resolvers/interacting.mdx index c04660ac0..161681ebf 100644 --- a/src/pages/resolvers/interacting.mdx +++ b/src/pages/resolvers/interacting.mdx @@ -1,15 +1,4 @@ -import { WIP } from "@/components/wip/WIP"; - -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Set Addresses, Text Records, and more', - emoji: '👉', - contributors: [ - 'luc.eth' - ] -}; - -# Interacting with a Resolver +# Interacting with a Resolver [Set Addresses, Text Records, and more] Some apps may want to allow for users to edit, update, or modify their name and its behaviour at a more advanced level. This is possible by interacting with the resolver contract of a name directly. @@ -33,19 +22,20 @@ If you want to help a user set their avatar, specify a preferred color scheme, o First we need to check if the user's resolver supports the interface we want to use (see [setText](/resolvers/interfaces#0x10f13a8c)). Afterwhich you can call the `setText()` function on the user's resolver contract. - +:::code-group -```solidity +```solidity [Solidity] interface Resolver { function setText(bytes32 node, string calldata key, string calldata value) external; } ``` -```typescript {{ variant: "ensjs", link: "https://github.com/ensdomains/ensjs/blob/feat/viem/docs/wallet/function.setRecords.md" }} -import { createWalletClient, custom } from 'viem' -import { mainnet } from 'viem/chains' +```typescript [ENSjs] +// https://github.com/ensdomains/ensjs/blob/main/docs/wallet/function.setRecords.md import { addEnsContracts } from '@ensdomains/ensjs' import { setRecords } from '@ensdomains/ensjs/wallet' +import { createWalletClient, custom } from 'viem' +import { mainnet } from 'viem/chains' const wallet = createWalletClient({ chain: addEnsContracts(mainnet), @@ -65,7 +55,7 @@ const hash = await setRecords(wallet, { // 0x... ``` - +::: Please make it clear to the user what you are doing and why. If possible please also showcase the record you are setting to the user before you do so. @@ -73,22 +63,22 @@ Please make it clear to the user what you are doing and why. If possible please Overwriting a user's resolver involves overwriting the behaviour of their ENS name. - In order to overwrite the resolver for a user you need to call the `setResolver` function on the `ENSRegistry` contract. - +:::code-group -```solidity +```solidity [Solidity] interface ENS { function setResolver(bytes32 node, address resolver) external; } ``` -```typescript {{ variant: "ensjs", link: "https://github.com/ensdomains/ensjs/blob/feat/viem/docs/wallet/function.setResolver.md" }} -import { createWalletClient, custom } from 'viem' -import { mainnet } from 'viem/chains' +```typescript [ENSjs] +// https://github.com/ensdomains/ensjs/blob/main/docs/wallet/function.setResolver.md import { addEnsContracts } from '@ensdomains/ensjs' import { setResolver } from '@ensdomains/ensjs/wallet' +import { createWalletClient, custom } from 'viem' +import { mainnet } from 'viem/chains' const wallet = createWalletClient({ chain: addEnsContracts(mainnet), @@ -102,7 +92,7 @@ const hash = await setResolver(wallet, { // 0x... ``` - +::: Please do not change the resolver for a user without their permission. Overwriting the resolver is a destructive action and will overwrite any existing resolution logic. diff --git a/src/pages/resolvers/public.mdx b/src/pages/resolvers/public.mdx index bca710e24..60c2640f3 100644 --- a/src/pages/resolvers/public.mdx +++ b/src/pages/resolvers/public.mdx @@ -1,13 +1,6 @@ -import { WIP } from "@/components/wip/WIP"; - -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { -description: 'A general purpose resolver that suits most user needs.', -emoji: '🏛️', -contributors: [ - 'luc.eth' -] -}; +--- +description: A general purpose resolver that suits most user needs. +--- # Public Resolver @@ -23,21 +16,23 @@ If you'd like to take a peek under the hood you can view the [public resolver so The public resolver supports the following features: -- [EIP-137](https://eips.ethereum.org/EIPS/eip-137) - Contract address interface (`addr()`) -- [EIP-165](https://eips.ethereum.org/EIPS/eip-165) - Interface Detection (`supportsInterface()`) -- [EIP-181](https://eips.ethereum.org/EIPS/eip-181) - Reverse Resolution (`name()`) -- [EIP-205](https://eips.ethereum.org/EIPS/eip-205) - ABI Resolution for contracts (`ABI()`) -- [EIP-619](https://eips.ethereum.org/EIPS/eip-619) - SECP256k1 public keys (`pubkey()`) -- [EIP-634](https://eips.ethereum.org/EIPS/eip-634) - Text records (`text()`) -- [EIP-1577](https://eips.ethereum.org/EIPS/eip-1577) - Content hash resolution (`contenthash()`) -- [EIP-2304](https://eips.ethereum.org/EIPS/eip-2304) - Multicoin support (`addr()`) - - - While the `PublicResolver` provides a convenient default implementation. - Many versions & variations may exist, and it is therefore not recommended to - hardcode any addresses. To ensure a safe implementation, always use the `supportsInterface()` method to check for the existence of a specific interface. - See [Interacting with a Resolver](/resolvers/interacting) for how to do this. - +- [EIP-137](https://eips.ethereum.org/EIPS/eip-137) - Contract address interface (`addr()`) +- [EIP-165](https://eips.ethereum.org/EIPS/eip-165) - Interface Detection (`supportsInterface()`) +- [EIP-181](https://eips.ethereum.org/EIPS/eip-181) - Reverse Resolution (`name()`) +- [EIP-205](https://eips.ethereum.org/EIPS/eip-205) - ABI Resolution for contracts (`ABI()`) +- [EIP-619](https://eips.ethereum.org/EIPS/eip-619) - SECP256k1 public keys (`pubkey()`) +- [EIP-634](https://eips.ethereum.org/EIPS/eip-634) - Text records (`text()`) +- [EIP-1577](https://eips.ethereum.org/EIPS/eip-1577) - Content hash resolution (`contenthash()`) +- [EIP-2304](https://eips.ethereum.org/EIPS/eip-2304) - Multicoin support (`addr()`) + +:::note +While the `PublicResolver` provides a convenient default implementation. Many +versions & variations may exist, and it is therefore not recommended to +hardcode any addresses. To ensure a safe implementation, always use the +`supportsInterface()` method to check for the existence of a specific +interface. See [Interacting with a Resolver](/resolvers/interacting) for how +to do this. +::: ## Permissions diff --git a/src/pages/resolvers/quickstart.mdx b/src/pages/resolvers/quickstart.mdx index 944bb9b97..6ccdc7c24 100644 --- a/src/pages/resolvers/quickstart.mdx +++ b/src/pages/resolvers/quickstart.mdx @@ -1,8 +1,6 @@ -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'A quickstart guide to everything about resolvers.', - showDetailsSection: false, -}; +--- +description: A quickstart guide to everything about resolvers. +--- # Resolvers Quickstart diff --git a/src/pages/resolvers/writing.mdx b/src/pages/resolvers/writing.mdx index cf3ca59b9..edfa60b82 100644 --- a/src/pages/resolvers/writing.mdx +++ b/src/pages/resolvers/writing.mdx @@ -1,10 +1,3 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'How to write your own resolver.', - emoji: '✍️', - contributors: [] -}; - # Writing a Resolver Every ENS name has a resolver, which is responsible for resolving information about a name. @@ -24,7 +17,7 @@ interface IMyResolver { function addr(bytes32 node, uint256 coinType) external view returns (bytes memory); function contenthash(bytes32 node) external view returns (bytes memory); function text(bytes32 node, string calldata key) external view returns (string memory); - + function setAddr(bytes32 node, address addr) external; function setAddr(bytes32 node, uint256 coinType, bytes calldata a) external; function setContenthash(bytes32 node, bytes calldata hash) external; @@ -37,7 +30,7 @@ interface IMyResolver { In [ENSIP-10](/ensip/10) a new `resolve()` method was added to the resolver interface to allow for wildcard resolution. ```solidity -interface IExtendedResolver { +interface IExtendedResolver { /** * @dev Performs ENS name resolution for the supplied name and resolution data. * @param name The name to resolve, in normalised and DNS-encoded form. @@ -51,9 +44,9 @@ interface IExtendedResolver { } ``` - +:::note Don't forget to add `0x9061b923` to your [EIP-165](https://eips.ethereum.org/) `supportsInterface()` implementation. - +::: ## Offchain Resolution diff --git a/app/public/content/learn/ccip-read/1.png b/src/public/img/ccip-read-diagram-1.png similarity index 100% rename from app/public/content/learn/ccip-read/1.png rename to src/public/img/ccip-read-diagram-1.png diff --git a/vocs.config.tsx b/vocs.config.tsx index a2ef3ece0..64166142b 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -222,23 +222,23 @@ export default defineConfig({ items: [ { text: 'Start Here', - link: '', + link: '/resolvers/quickstart', }, { text: 'Public Resolver', - link: '', + link: '/resolvers/public', }, { text: 'Interacting with a resolver', - link: '', + link: '/resolvers/interacting', }, { text: 'Writing your own resolver', - link: '', + link: '/resolvers/writing', }, { text: 'Cross Chain Resolvers', - link: '', + link: '/resolvers/ccip-read', }, { text: 'Universal Resolver', From 8a85e2fc157013d33dc8b11ef22adb69df20db7b Mon Sep 17 00:00:00 2001 From: Greg Skriloff <35093316+gskril@users.noreply.github.com> Date: Fri, 7 Feb 2025 19:49:48 -0500 Subject: [PATCH 30/79] Add most Registry and NameWrapper pages --- app/local/content/prose/mermaid.tsx | 7 - package.json | 1 + pnpm-lock.yaml | 2391 ++++++++++++++++- src/components/ui/Mermaid.tsx | 14 + src/pages/registry/dns.mdx | 29 +- src/pages/registry/ens.mdx | 8 +- src/pages/registry/eth.mdx | 79 +- src/pages/registry/reverse.mdx | 11 +- src/pages/resolvers/ccip-read.mdx | 2 - src/pages/wrapper/contracts.mdx | 19 +- .../wrapper/creating-subname-registrar.mdx | 46 +- src/pages/wrapper/expiry.mdx | 21 +- src/pages/wrapper/fuses.mdx | 116 +- src/pages/wrapper/overview.mdx | 116 +- src/pages/wrapper/states.mdx | 32 +- src/pages/wrapper/usecases.mdx | 95 +- .../img}/namewrapper-expiry-subnames.jpg | Bin .../img}/namewrapper-overview-subnames.jpg | Bin .../img}/namewrapper-overview-wrapped.jpg | Bin vocs.config.tsx | 22 +- 20 files changed, 2587 insertions(+), 422 deletions(-) delete mode 100644 app/local/content/prose/mermaid.tsx create mode 100644 src/components/ui/Mermaid.tsx rename {app/public/content/namewrapper => src/public/img}/namewrapper-expiry-subnames.jpg (100%) rename {app/public/content/namewrapper => src/public/img}/namewrapper-overview-subnames.jpg (100%) rename {app/public/content/namewrapper => src/public/img}/namewrapper-overview-wrapped.jpg (100%) diff --git a/app/local/content/prose/mermaid.tsx b/app/local/content/prose/mermaid.tsx deleted file mode 100644 index a752d787d..000000000 --- a/app/local/content/prose/mermaid.tsx +++ /dev/null @@ -1,7 +0,0 @@ -'use client'; - -import { Mermaid as MermaidZ } from 'mdx-mermaid/lib/Mermaid'; - -export const Mermaid = ({ chart }) => { - return ; -}; diff --git a/package.json b/package.json index a453ed9df..df377f26e 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "clsx": "^2.1.1", "gray-matter": "^4.0.3", "marked": "^15.0.6", + "mdx-mermaid": "^2.0.3", "react": "latest", "react-dom": "latest", "react-icons": "^5.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 78117b0f8..e26bc4efb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: marked: specifier: ^15.0.6 version: 15.0.6 + mdx-mermaid: + specifier: ^2.0.3 + version: 2.0.3(bufferutil@4.0.9)(mermaid@11.4.1)(react@19.0.0)(typescript@5.7.3)(unist-util-visit@5.0.0)(utf-8-validate@5.0.10) react: specifier: latest version: 19.0.0 @@ -40,7 +43,7 @@ importers: version: 5.7.3 viem: specifier: ^2.22.8 - version: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + version: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) vite: specifier: ^5.4.11 version: 5.4.11(@types/node@22.10.5) @@ -49,7 +52,7 @@ importers: version: 1.0.0-alpha.62(@types/node@22.10.5)(@types/react@19.0.6)(acorn@8.14.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(rollup@4.30.1)(typescript@5.7.3) wagmi: specifier: ^2.14.8 - version: 2.14.8(@tanstack/query-core@5.64.1)(@tanstack/react-query@5.64.1(react@19.0.0))(@types/react@19.0.6)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)) + version: 2.14.8(@tanstack/query-core@5.64.1)(@tanstack/react-query@5.64.1(react@19.0.0))(@types/react@19.0.6)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) devDependencies: '@trivago/prettier-plugin-sort-imports': specifier: ^5.2.1 @@ -74,6 +77,12 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@antfu/install-pkg@1.0.0': + resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} + + '@antfu/utils@8.1.0': + resolution: {integrity: sha512-XPR7Jfwp0FFl/dFYPX8ZjpmU4/1mIXTjnZ1ba48BLMyKOV62/tiRjdsFcPs2hsYcSud4tzk7w3a3LjX8Fu3huA==} + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -163,6 +172,24 @@ packages: resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} engines: {node: '>=6.9.0'} + '@braintree/sanitize-url@7.1.1': + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + '@clack/core@0.3.5': resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} @@ -505,6 +532,12 @@ packages: peerDependencies: hono: ^4 + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.3.0': + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -547,6 +580,9 @@ packages: peerDependencies: rollup: '>=2' + '@mermaid-js/parser@0.3.0': + resolution: {integrity: sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==} + '@metamask/eth-json-rpc-provider@1.0.1': resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} engines: {node: '>=14.0.0'} @@ -691,6 +727,11 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@puppeteer/browsers@2.3.0': + resolution: {integrity: sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==} + engines: {node: '>=18'} + hasBin: true + '@radix-ui/colors@3.0.0': resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} @@ -1274,6 +1315,9 @@ packages: peerDependencies: react: ^18 || ^19 + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@trivago/prettier-plugin-sort-imports@5.2.1': resolution: {integrity: sha512-NDZndt0fmVThIx/8cExuJHLZagUVzfGCoVrwH9x6aZvwfBdkrDFTYujecek6X2WpG4uUFsVaPg5+aNQPSyjcmw==} engines: {node: '>18.12'} @@ -1305,6 +1349,99 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.6': + resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1314,9 +1451,18 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1341,6 +1487,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@typescript/vfs@1.6.0': resolution: {integrity: sha512-hvJUjNVeBMp77qPINuUvYXj4FyWeeMMKZkxEATEU3hqBAQ7qdTBCUFT7Sp0Zu0faeEtFf+ldXxMEDr/bk73ISg==} peerDependencies: @@ -1499,6 +1648,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1528,10 +1681,17 @@ packages: argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.4: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true @@ -1554,15 +1714,47 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + + bare-fs@4.0.1: + resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} + engines: {bare: '>=1.7.0'} + + bare-os@3.4.0: + resolution: {integrity: sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA==} + engines: {bare: '>=1.6.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} @@ -1600,6 +1792,12 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -1627,6 +1825,10 @@ packages: resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -1657,6 +1859,14 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1664,6 +1874,11 @@ packages: chroma-js@2.6.0: resolution: {integrity: sha512-BLHvCB9s8Z1EV4ethr6xnkl/P2YRFOGqfgvuMG/MyCbZPrTA+NeiByY6XvgF0zP4/2deU2CXnWyMa3zu1LqQ3A==} + chromium-bidi@0.6.3: + resolution: {integrity: sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==} + peerDependencies: + devtools-protocol: '*' + cli-cursor@4.0.0: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1675,6 +1890,10 @@ packages: cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -1700,6 +1919,14 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -1724,6 +1951,21 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} @@ -1761,10 +2003,173 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.31.0: + resolution: {integrity: sha512-zDGn1K/tfZwEnoGOcHc0H4XazqAAXAuDpcYw9mUnUjATjqljyCNGJv8uEvbvxGaGHaVshxMecyl6oc6uKzRfbw==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.11: + resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -1824,6 +2229,13 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1852,9 +2264,16 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + devtools-protocol@0.0.1312386: + resolution: {integrity: sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} @@ -1869,6 +2288,9 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dompurify@3.2.4: + resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1925,6 +2347,17 @@ packages: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1964,29 +2397,50 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + estree-util-attach-comments@3.0.0: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} estree-util-build-jsx@3.0.1: resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} estree-util-scope@1.0.0: resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} estree-util-value-to-estree@3.2.1: resolution: {integrity: sha512-Vt2UOjyPbNQQgT5eJh+K5aATti0OjCIAGc9SgMdOFYbohuifsWclR74l0iZTJwePMgWYdX1hlVS+dedH9XV8kw==} + estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + estree-util-visit@2.0.0: resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} @@ -1996,6 +2450,10 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -2046,9 +2504,17 @@ packages: resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} engines: {node: '>=12.0.0'} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -2066,6 +2532,9 @@ packages: fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2132,10 +2601,18 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-uri@6.0.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} + engines: {node: '>= 14'} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -2155,6 +2632,10 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + engines: {node: '>=18'} + globby@13.2.2: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2173,6 +2654,9 @@ packages: h3@1.13.1: resolution: {integrity: sha512-u/z6Z4YY+ANZ05cRRfsFJadTBrNA6e3jxdU+AN5UCbZSZEUwgHiwjvUEe0k1NoQmAvQmETwr+xB5jd7mhCJuIQ==} + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -2194,6 +2678,12 @@ packages: hast-util-classnames@3.0.0: resolution: {integrity: sha512-tI3JjoGDEBVorMAWK4jNRsfLMYmih1BUOG3VV36pH36njs1IEl7xkNrVTD2mD2yYHmQCa5R/fj61a8IAF4bRaQ==} + hast-util-from-html@1.0.2: + resolution: {integrity: sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==} + + hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + hast-util-has-property@3.0.0: resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} @@ -2203,12 +2693,18 @@ packages: hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} hast-util-select@6.0.3: resolution: {integrity: sha512-OVRQlQ1XuuLP8aFVLYmC2atrfWHS5UD3shonxpnyrjcCkwtvmt/+N6kYJdcY4mkMJhxp4kj2EFIxQ9kvkkt/eQ==} + hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + hast-util-to-estree@3.1.1: resolution: {integrity: sha512-IWtwwmPskfSmma9RpzCappDUitC8t5jhAynHhc1m2+5trOgsrp7txscUSavc5Ic8PATyAjfrCK1wgtxh2cICVQ==} @@ -2221,9 +2717,15 @@ packages: hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + hastscript@8.0.0: resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} @@ -2244,10 +2746,22 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} @@ -2258,12 +2772,30 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -2277,6 +2809,9 @@ packages: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -2378,11 +2913,21 @@ packages: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-rpc-engine@6.1.0: resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} engines: {node: '>=10.0.0'} @@ -2398,6 +2943,10 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + katex@0.16.21: + resolution: {integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==} + hasBin: true + keccak@3.0.4: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} @@ -2405,10 +2954,30 @@ packages: keyvaluestorage-interface@1.0.0: resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + langium@3.0.0: + resolution: {integrity: sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==} + engines: {node: '>=16.0.0'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -2425,6 +2994,10 @@ packages: lit@2.8.0: resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + local-pkg@1.0.0: + resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==} + engines: {node: '>=14'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -2433,6 +3006,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} @@ -2456,6 +3032,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} @@ -2466,6 +3046,11 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked@13.0.3: + resolution: {integrity: sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==} + engines: {node: '>= 18'} + hasBin: true + marked@15.0.6: resolution: {integrity: sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==} engines: {node: '>= 18'} @@ -2481,6 +3066,9 @@ packages: mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} @@ -2505,30 +3093,58 @@ packages: mdast-util-gfm@3.0.0: resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + mdast-util-mdx-expression@2.0.1: resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + mdast-util-mdx-jsx@3.2.0: resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + mdast-util-mdx@3.0.0: resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + mdast-util-mdxjs-esm@2.0.1: resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdx-mermaid@2.0.3: + resolution: {integrity: sha512-aVLaaVbQD8KmqzEk2AdLFb02MMENWkq5QQPD25sdtiswTIWk684JoaCOmy8oV+w3pthkcy2lRp0xVKIq1sLsqg==} + peerDependencies: + mermaid: '>=8.11.0' + react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + unist-util-visit: ^4.1.0 + media-query-parser@2.0.2: resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} @@ -2539,9 +3155,15 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + mermaid@11.4.1: + resolution: {integrity: sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A==} + micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + micromark-core-commonmark@2.0.2: resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} @@ -2572,84 +3194,165 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + micromark-extension-mdx-expression@3.0.0: resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + micromark-extension-mdx-jsx@3.0.1: resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + micromark-extension-mdx-md@2.0.0: resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + micromark-extension-mdxjs-esm@3.0.0: resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + micromark-extension-mdxjs@3.0.0: resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + micromark-factory-mdx-expression@2.0.2: resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + micromark-factory-space@2.0.1: resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + micromark-factory-title@2.0.1: resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + micromark-factory-whitespace@2.0.1: resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + micromark-util-character@2.1.1: resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + micromark-util-chunked@2.0.1: resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + micromark-util-classify-character@2.0.1: resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + micromark-util-combine-extensions@2.0.1: resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + micromark-util-decode-numeric-character-reference@2.0.2: resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + micromark-util-decode-string@2.0.1: resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + micromark-util-events-to-acorn@2.0.2: resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + micromark-util-normalize-identifier@2.0.1: resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + micromark-util-resolve-all@2.0.1: resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + micromark-util-subtokenize@2.0.3: resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + micromark-util-types@2.0.1: resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + micromark@4.0.1: resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} @@ -2700,6 +3403,9 @@ packages: typescript: optional: true + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} @@ -2709,6 +3415,10 @@ packages: motion@10.16.2: resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -2730,6 +3440,10 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} @@ -2844,16 +3558,41 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + pac-proxy-agent@7.1.0: + resolution: {integrity: sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.9: + resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2879,6 +3618,9 @@ packages: pathe@2.0.1: resolution: {integrity: sha512-6jpjMpOth5S9ITVu5clZ7NOgHNsv5vRQdheL9ztp2vZmM6fRbLvyua1tiBIL4lk8SAe3ARzeXEly6siXCjDHDw==} + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2923,6 +3665,12 @@ packages: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + pony-cause@2.1.11: resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} engines: {node: '>=12.0.0'} @@ -3041,18 +3789,38 @@ packages: process-warning@1.0.0: resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + proxy-compare@2.5.1: resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + puppeteer-core@22.15.0: + resolution: {integrity: sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==} + engines: {node: '>=18'} + + puppeteer@22.15.0: + resolution: {integrity: sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==} + engines: {node: '>=18'} + hasBin: true + qrcode@1.5.3: resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} engines: {node: '>=10.13.0'} @@ -3249,6 +4017,10 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -3262,14 +4034,27 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + rollup@4.30.1: resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -3284,6 +4069,9 @@ packages: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} @@ -3347,6 +4135,10 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + socket.io-client@4.8.1: resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} engines: {node: '>=10.0.0'} @@ -3355,6 +4147,14 @@ packages: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} @@ -3362,6 +4162,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} @@ -3380,6 +4184,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -3391,6 +4198,9 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + streamx@2.22.0: + resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -3432,9 +4242,15 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -3459,6 +4275,15 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tar-fs@3.0.8: + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -3469,6 +4294,12 @@ packages: thread-stream@0.15.2: resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3489,6 +4320,10 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -3521,6 +4356,9 @@ packages: uint8arrays@3.1.0: resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -3536,24 +4374,42 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + unist-util-position-from-estree@2.0.0: resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -3626,6 +4482,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -3674,6 +4533,11 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + valtio@1.11.2: resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} engines: {node: '>=12.20.0'} @@ -3690,6 +4554,9 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + vfile-message@3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} @@ -3753,6 +4620,26 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + wagmi@2.14.8: resolution: {integrity: sha512-m7oMF/rqsTwYuBZzwyYskzhdkZxq6zJjY2le6Vz7We5Hih7hwJ7hLNU5TxMfhqjPRfsqXlWX9HLOszOipHxz8Q==} peerDependencies: @@ -3764,6 +4651,9 @@ packages: typescript: optional: true + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + webauthn-p256@0.0.10: resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} @@ -3850,6 +4740,10 @@ packages: y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -3862,10 +4756,21 @@ packages: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -3874,6 +4779,9 @@ packages: resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zustand@5.0.0: resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} engines: {node: '>=12.20.0'} @@ -3906,6 +4814,13 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 + '@antfu/install-pkg@1.0.0': + dependencies: + package-manager-detector: 0.2.9 + tinyexec: 0.3.2 + + '@antfu/utils@8.1.0': {} + '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -4025,6 +4940,25 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@braintree/sanitize-url@7.1.1': {} + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + '@clack/core@0.3.5': dependencies: picocolors: 1.1.1 @@ -4250,6 +5184,21 @@ snapshots: dependencies: hono: 3.12.12 + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.3.0': + dependencies: + '@antfu/install-pkg': 1.0.0 + '@antfu/utils': 8.1.0 + '@iconify/types': 2.0.0 + debug: 4.4.0 + globals: 15.14.0 + kolorist: 1.8.0 + local-pkg: 1.0.0 + mlly: 1.7.4 + transitivePeerDependencies: + - supports-color + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -4329,6 +5278,10 @@ snapshots: - acorn - supports-color + '@mermaid-js/parser@0.3.0': + dependencies: + langium: 3.0.0 + '@metamask/eth-json-rpc-provider@1.0.1': dependencies: '@metamask/json-rpc-engine': 7.3.3 @@ -4569,6 +5522,21 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@puppeteer/browsers@2.3.0': + dependencies: + debug: 4.4.0 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.6.3 + tar-fs: 3.0.8 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - bare-buffer + - supports-color + optional: true + '@radix-ui/colors@3.0.0': {} '@radix-ui/primitive@1.1.1': {} @@ -4956,9 +5924,9 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.30.1': optional: true - '@safe-global/safe-apps-provider@0.18.5(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)': + '@safe-global/safe-apps-provider@0.18.5(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -4966,10 +5934,10 @@ snapshots: - utf-8-validate - zod - '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)': + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.22.6 - viem: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + viem: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: - bufferutil - typescript @@ -5150,6 +6118,9 @@ snapshots: '@tanstack/query-core': 5.64.1 react: 19.0.0 + '@tootallnate/quickjs-emscripten@0.23.0': + optional: true + '@trivago/prettier-plugin-sort-imports@5.2.1(prettier@3.4.2)': dependencies: '@babel/generator': 7.26.5 @@ -5187,6 +6158,123 @@ snapshots: dependencies: '@babel/types': 7.26.5 + '@types/d3-array@3.2.1': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.1 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.6': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.7': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.6 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 @@ -5197,10 +6285,22 @@ snapshots: '@types/estree@1.0.6': {} + '@types/geojson@7946.0.16': {} + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 + optional: true + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.11 + optional: true + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -5223,6 +6323,11 @@ snapshots: '@types/unist@3.0.3': {} + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 22.10.5 + optional: true + '@typescript/vfs@1.6.0(typescript@5.7.3)': dependencies: debug: 4.4.0 @@ -5319,16 +6424,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@wagmi/connectors@5.7.4(@types/react@19.0.6)(@wagmi/core@2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10))': + '@wagmi/connectors@5.7.4(@types/react@19.0.6)(@wagmi/core@2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)': dependencies: '@coinbase/wallet-sdk': 4.2.3 '@metamask/sdk': 0.31.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.5(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) - '@wagmi/core': 2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)) + '@safe-global/safe-apps-provider': 0.18.5(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) + '@wagmi/core': 2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8)) '@walletconnect/ethereum-provider': 2.17.0(@types/react@19.0.6)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + viem: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -5358,11 +6463,11 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10))': + '@wagmi/core@2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.7.3) - viem: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + viem: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) zustand: 5.0.0(@types/react@19.0.6)(react@19.0.0)(use-sync-external-store@1.4.0(react@19.0.0)) optionalDependencies: '@tanstack/query-core': 5.64.1 @@ -5718,9 +6823,10 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 - abitype@1.0.7(typescript@5.7.3): + abitype@1.0.7(typescript@5.7.3)(zod@3.23.8): optionalDependencies: typescript: 5.7.3 + zod: 3.23.8 acorn-jsx@5.3.2(acorn@8.14.0): dependencies: @@ -5728,6 +6834,9 @@ snapshots: acorn@8.14.0: {} + agent-base@7.1.3: + optional: true + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -5751,10 +6860,18 @@ snapshots: dependencies: sprintf-js: 1.0.3 + argparse@2.0.1: + optional: true + aria-hidden@1.2.4: dependencies: tslib: 2.8.1 + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + optional: true + astring@1.9.0: {} async-mutex@0.2.6: @@ -5777,12 +6894,45 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 + b4a@1.6.7: + optional: true + bail@2.0.2: {} balanced-match@1.0.2: {} + bare-events@2.5.4: + optional: true + + bare-fs@4.0.1: + dependencies: + bare-events: 2.5.4 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.4) + transitivePeerDependencies: + - bare-buffer + optional: true + + bare-os@3.4.0: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.4.0 + optional: true + + bare-stream@2.6.5(bare-events@2.5.4): + dependencies: + streamx: 2.22.0 + optionalDependencies: + bare-events: 2.5.4 + optional: true + base64-js@1.5.1: {} + basic-ftp@5.0.5: + optional: true + bcp-47-match@2.0.3: {} binary-extensions@2.3.0: {} @@ -5818,6 +6968,15 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) + buffer-crc32@0.2.13: + optional: true + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + optional: true + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -5848,6 +7007,9 @@ snapshots: call-bind-apply-helpers: 1.0.1 get-intrinsic: 1.2.7 + callsites@3.1.0: + optional: true + camelcase-css@2.0.1: {} camelcase@5.3.1: {} @@ -5866,6 +7028,20 @@ snapshots: character-reference-invalid@2.0.1: {} + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.21 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -5880,6 +7056,14 @@ snapshots: chroma-js@2.6.0: {} + chromium-bidi@0.6.3(devtools-protocol@0.0.1312386): + dependencies: + devtools-protocol: 0.0.1312386 + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 + zod: 3.23.8 + optional: true + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 @@ -5892,6 +7076,13 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + optional: true + clsx@1.2.1: {} clsx@2.1.1: {} @@ -5908,6 +7099,10 @@ snapshots: commander@4.1.1: {} + commander@7.2.0: {} + + commander@8.3.0: {} + compressible@2.0.18: dependencies: mime-db: 1.53.0 @@ -5934,6 +7129,24 @@ snapshots: core-util-is@1.0.3: {} + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + + cosmiconfig@9.0.0(typescript@5.7.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.7.3 + optional: true + crc-32@1.2.2: {} create-vocs@1.0.0-alpha.5: @@ -5974,21 +7187,210 @@ snapshots: csstype@3.1.3: {} - date-fns@2.30.0: + cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.0): dependencies: - '@babel/runtime': 7.26.0 + cose-base: 1.0.3 + cytoscape: 3.31.0 - debug@2.6.9: + cytoscape-fcose@2.2.0(cytoscape@3.31.0): dependencies: - ms: 2.0.0 + cose-base: 2.2.0 + cytoscape: 3.31.0 - debug@4.3.7: + cytoscape@3.31.0: {} + + d3-array@2.12.1: dependencies: - ms: 2.1.3 + internmap: 1.0.1 - debug@4.4.0: + d3-array@3.2.4: dependencies: - ms: 2.1.3 + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.11: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + + data-uri-to-buffer@6.0.2: + optional: true + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.26.0 + + dayjs@1.11.13: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0: + dependencies: + ms: 2.1.3 decamelize@1.2.0: {} @@ -6012,6 +7414,17 @@ snapshots: defu@6.1.4: {} + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + optional: true + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + depd@2.0.0: {} dequal@2.0.3: {} @@ -6032,8 +7445,14 @@ snapshots: dependencies: dequal: 2.0.3 + devtools-protocol@0.0.1312386: + optional: true + didyoumean@1.2.2: {} + diff@5.2.0: + optional: true + dijkstrajs@1.0.3: {} dir-glob@3.0.1: @@ -6044,6 +7463,10 @@ snapshots: dlv@1.1.3: {} + dompurify@3.2.4: + optionalDependencies: + '@types/trusted-types': 2.0.7 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.1 @@ -6112,6 +7535,17 @@ snapshots: engine.io-parser@5.2.3: {} + entities@4.5.0: + optional: true + + env-paths@2.2.1: + optional: true + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + optional: true + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -6192,8 +7626,25 @@ snapshots: escape-string-regexp@5.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + optional: true + esprima@4.0.1: {} + estraverse@5.3.0: + optional: true + + estree-util-attach-comments@2.1.1: + dependencies: + '@types/estree': 1.0.6 + optional: true + estree-util-attach-comments@3.0.0: dependencies: '@types/estree': 1.0.6 @@ -6205,6 +7656,9 @@ snapshots: estree-util-is-identifier-name: 3.0.0 estree-walker: 3.0.3 + estree-util-is-identifier-name@2.1.0: + optional: true + estree-util-is-identifier-name@3.0.0: {} estree-util-scope@1.0.0: @@ -6212,6 +7666,13 @@ snapshots: '@types/estree': 1.0.6 devlop: 1.1.0 + estree-util-to-js@1.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.4 + optional: true + estree-util-to-js@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -6222,6 +7683,12 @@ snapshots: dependencies: '@types/estree': 1.0.6 + estree-util-visit@1.2.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 2.0.11 + optional: true + estree-util-visit@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -6233,6 +7700,9 @@ snapshots: dependencies: '@types/estree': 1.0.6 + esutils@2.0.3: + optional: true + etag@1.8.1: {} eth-block-tracker@7.1.0: @@ -6303,8 +7773,22 @@ snapshots: readable-stream: 3.6.2 webextension-polyfill: 0.10.0 + extract-zip@2.0.1: + dependencies: + debug: 4.4.0 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + optional: true + fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: + optional: true + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6325,6 +7809,11 @@ snapshots: dependencies: format: 0.2.2 + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + optional: true + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -6391,8 +7880,22 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + optional: true + get-stream@6.0.1: {} + get-uri@6.0.4: + dependencies: + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + optional: true + github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -6414,6 +7917,8 @@ snapshots: globals@11.12.0: {} + globals@15.14.0: {} + globby@13.2.2: dependencies: dir-glob: 3.0.1 @@ -6446,6 +7951,8 @@ snapshots: uncrypto: 0.1.3 unenv: 1.10.0 + hachure-fill@0.5.2: {} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -6470,6 +7977,26 @@ snapshots: '@types/hast': 3.0.4 space-separated-tokens: 2.0.2 + hast-util-from-html@1.0.2: + dependencies: + '@types/hast': 2.3.10 + hast-util-from-parse5: 7.1.2 + parse5: 7.2.1 + vfile: 5.3.7 + vfile-message: 3.1.4 + optional: true + + hast-util-from-parse5@7.1.2: + dependencies: + '@types/hast': 2.3.10 + '@types/unist': 2.0.11 + hastscript: 7.2.0 + property-information: 6.5.0 + vfile: 5.3.7 + vfile-location: 4.1.0 + web-namespaces: 2.0.1 + optional: true + hast-util-has-property@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -6482,6 +8009,11 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-parse-selector@3.1.1: + dependencies: + '@types/hast': 2.3.10 + optional: true + hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 @@ -6504,6 +8036,27 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 + hast-util-to-estree@2.3.3: + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 2.3.10 + '@types/unist': 2.0.11 + comma-separated-tokens: 2.0.3 + estree-util-attach-comments: 2.1.1 + estree-util-is-identifier-name: 2.1.0 + hast-util-whitespace: 2.0.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdxjs-esm: 1.3.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 4.0.4 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + optional: true + hast-util-to-estree@3.1.1: dependencies: '@types/estree': 1.0.6 @@ -6563,10 +8116,22 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-whitespace@2.0.1: + optional: true + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 + hastscript@7.2.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + optional: true + hastscript@8.0.0: dependencies: '@types/hast': 3.0.4 @@ -6595,18 +8160,57 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + optional: true + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + optional: true + human-signals@2.1.0: {} + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + idb-keyval@6.2.1: {} ieee754@1.2.1: {} ignore@5.3.2: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + optional: true + inherits@2.0.4: {} + inline-style-parser@0.1.1: + optional: true + inline-style-parser@0.2.4: {} + internmap@1.0.1: {} + + internmap@2.0.3: {} + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + optional: true + iron-webcrypto@1.2.1: {} is-alphabetical@2.0.1: {} @@ -6621,6 +8225,9 @@ snapshots: call-bound: 1.0.3 has-tostringtag: 1.0.2 + is-arrayish@0.2.1: + optional: true + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -6702,8 +8309,19 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + optional: true + + jsbn@1.1.0: + optional: true + jsesc@3.1.0: {} + json-parse-even-better-errors@2.3.1: + optional: true + json-rpc-engine@6.1.0: dependencies: '@metamask/safe-event-emitter': 2.0.0 @@ -6719,6 +8337,10 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + katex@0.16.21: + dependencies: + commander: 8.3.0 + keccak@3.0.4: dependencies: node-addon-api: 2.0.2 @@ -6727,8 +8349,27 @@ snapshots: keyvaluestorage-interface@1.0.0: {} + khroma@2.1.0: {} + kind-of@6.0.3: {} + kleur@4.1.5: + optional: true + + kolorist@1.8.0: {} + + langium@3.0.0: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -6749,6 +8390,11 @@ snapshots: lit-element: 3.3.3 lit-html: 2.8.0 + local-pkg@1.0.0: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -6757,6 +8403,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash-es@4.17.21: {} + lodash.isequal@4.5.0: {} lodash@4.17.21: {} @@ -6778,12 +8426,17 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@7.18.3: + optional: true + mark.js@8.11.1: {} markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} + marked@13.0.3: {} + marked@15.0.6: {} math-intrinsics@1.1.0: {} @@ -6808,6 +8461,24 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + mdast-util-from-markdown@1.3.1: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + optional: true + mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 @@ -6893,6 +8564,17 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdx-expression@1.3.2: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + optional: true + mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -6904,6 +8586,24 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdx-jsx@2.1.4: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + ccount: 2.0.1 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + transitivePeerDependencies: + - supports-color + optional: true + mdast-util-mdx-jsx@3.2.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -6921,6 +8621,17 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdx@2.0.1: + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + optional: true + mdast-util-mdx@3.0.0: dependencies: mdast-util-from-markdown: 2.0.2 @@ -6931,6 +8642,17 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdxjs-esm@1.3.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + optional: true + mdast-util-mdxjs-esm@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -6942,6 +8664,12 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-phrasing@3.0.1: + dependencies: + '@types/mdast': 3.0.15 + unist-util-is: 5.2.1 + optional: true + mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 @@ -6959,6 +8687,18 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.3 + mdast-util-to-markdown@1.5.0: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + optional: true + mdast-util-to-markdown@2.1.2: dependencies: '@types/mdast': 4.0.4 @@ -6971,10 +8711,36 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 + mdast-util-to-string@3.2.0: + dependencies: + '@types/mdast': 3.0.15 + optional: true + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 + mdx-mermaid@2.0.3(bufferutil@4.0.9)(mermaid@11.4.1)(react@19.0.0)(typescript@5.7.3)(unist-util-visit@5.0.0)(utf-8-validate@5.0.10): + dependencies: + mermaid: 11.4.1 + react: 19.0.0 + unist-util-visit: 5.0.0 + optionalDependencies: + estree-util-to-js: 1.2.0 + estree-util-visit: 1.2.1 + hast-util-from-html: 1.0.2 + hast-util-to-estree: 2.3.3 + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 + puppeteer: 22.15.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - typescript + - utf-8-validate + media-query-parser@2.0.2: dependencies: '@babel/runtime': 7.26.0 @@ -6983,8 +8749,53 @@ snapshots: merge2@1.4.1: {} + mermaid@11.4.1: + dependencies: + '@braintree/sanitize-url': 7.1.1 + '@iconify/utils': 2.3.0 + '@mermaid-js/parser': 0.3.0 + '@types/d3': 7.4.3 + cytoscape: 3.31.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.31.0) + cytoscape-fcose: 2.2.0(cytoscape@3.31.0) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.11 + dayjs: 1.11.13 + dompurify: 3.2.4 + katex: 0.16.21 + khroma: 2.1.0 + lodash-es: 4.17.21 + marked: 13.0.3 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + micro-ftch@0.3.1: {} + micromark-core-commonmark@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + optional: true + micromark-core-commonmark@2.0.2: dependencies: decode-named-character-reference: 1.0.2 @@ -7079,6 +8890,18 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.1 + micromark-extension-mdx-expression@1.0.8: + dependencies: + '@types/estree': 1.0.6 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + optional: true + micromark-extension-mdx-expression@3.0.0: dependencies: '@types/estree': 1.0.6 @@ -7090,6 +8913,20 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-extension-mdx-jsx@1.0.5: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + optional: true + micromark-extension-mdx-jsx@3.0.1: dependencies: '@types/acorn': 4.0.6 @@ -7104,9 +8941,27 @@ snapshots: micromark-util-types: 2.0.1 vfile-message: 4.0.2 + micromark-extension-mdx-md@1.0.1: + dependencies: + micromark-util-types: 1.1.0 + optional: true + micromark-extension-mdx-md@2.0.0: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-mdxjs-esm@1.0.5: + dependencies: + '@types/estree': 1.0.6 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + optional: true micromark-extension-mdxjs-esm@3.0.0: dependencies: @@ -7120,6 +8975,18 @@ snapshots: unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 + micromark-extension-mdxjs@1.0.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + optional: true + micromark-extension-mdxjs@3.0.0: dependencies: acorn: 8.14.0 @@ -7131,12 +8998,27 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.1 + micromark-factory-destination@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + optional: true + micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-factory-label@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + optional: true + micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 @@ -7144,6 +9026,18 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-factory-mdx-expression@1.0.9: + dependencies: + '@types/estree': 1.0.6 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + optional: true + micromark-factory-mdx-expression@2.0.2: dependencies: '@types/estree': 1.0.6 @@ -7156,11 +9050,25 @@ snapshots: unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + optional: true + micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-types: 2.0.1 + micromark-factory-title@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + optional: true + micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 @@ -7168,6 +9076,14 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-factory-whitespace@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + optional: true + micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 @@ -7175,30 +9091,67 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + optional: true + micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-util-chunked@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + optional: true + micromark-util-chunked@2.0.1: dependencies: micromark-util-symbol: 2.0.1 + micromark-util-classify-character@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + optional: true + micromark-util-classify-character@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-util-combine-extensions@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + optional: true + micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 micromark-util-types: 2.0.1 + micromark-util-decode-numeric-character-reference@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + optional: true + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: micromark-util-symbol: 2.0.1 + micromark-util-decode-string@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + optional: true + micromark-util-decode-string@2.0.1: dependencies: decode-named-character-reference: 1.0.2 @@ -7206,8 +9159,23 @@ snapshots: micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 + micromark-util-encode@1.1.0: + optional: true + micromark-util-encode@2.0.1: {} + micromark-util-events-to-acorn@1.2.3: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + '@types/unist': 2.0.11 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + optional: true + micromark-util-events-to-acorn@2.0.2: dependencies: '@types/acorn': 4.0.6 @@ -7219,22 +9187,50 @@ snapshots: micromark-util-types: 2.0.1 vfile-message: 4.0.2 + micromark-util-html-tag-name@1.2.0: + optional: true + micromark-util-html-tag-name@2.0.1: {} + micromark-util-normalize-identifier@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + optional: true + micromark-util-normalize-identifier@2.0.1: dependencies: micromark-util-symbol: 2.0.1 + micromark-util-resolve-all@1.1.0: + dependencies: + micromark-util-types: 1.1.0 + optional: true + micromark-util-resolve-all@2.0.1: dependencies: micromark-util-types: 2.0.1 + micromark-util-sanitize-uri@1.2.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + optional: true + micromark-util-sanitize-uri@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 + micromark-util-subtokenize@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + optional: true + micromark-util-subtokenize@2.0.3: dependencies: devlop: 1.1.0 @@ -7242,10 +9238,39 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-util-symbol@1.1.0: + optional: true + micromark-util-symbol@2.0.1: {} + micromark-util-types@1.1.0: + optional: true + micromark-util-types@2.0.1: {} + micromark@3.2.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + optional: true + micromark@4.0.1: dependencies: '@types/debug': 4.1.12 @@ -7297,6 +9322,9 @@ snapshots: optionalDependencies: typescript: 5.7.3 + mitt@3.0.1: + optional: true + mlly@1.7.4: dependencies: acorn: 8.14.0 @@ -7315,6 +9343,9 @@ snapshots: '@motionone/utils': 10.18.0 '@motionone/vue': 10.16.4 + mri@1.2.0: + optional: true + ms@2.0.0: {} ms@2.1.3: {} @@ -7331,6 +9362,9 @@ snapshots: negotiator@0.6.4: {} + netmask@2.0.2: + optional: true + node-addon-api@2.0.2: {} node-fetch-native@1.6.4: {} @@ -7409,14 +9443,14 @@ snapshots: outdent@0.8.0: {} - ox@0.6.0(typescript@5.7.3): + ox@0.6.0(typescript@5.7.3)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/curves': 1.8.0 '@noble/hashes': 1.7.0 '@scure/bip32': 1.6.0 '@scure/bip39': 1.5.0 - abitype: 1.0.7(typescript@5.7.3) + abitype: 1.0.7(typescript@5.7.3)(zod@3.23.8) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.7.3 @@ -7445,8 +9479,35 @@ snapshots: p-try@2.2.0: {} + pac-proxy-agent@7.1.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.3 + debug: 4.4.0 + get-uri: 6.0.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + optional: true + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + optional: true + package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.9: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + optional: true + parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -7457,8 +9518,23 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + optional: true + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + optional: true + parseurl@1.3.3: {} + path-data-parser@0.1.0: {} + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -7476,6 +9552,9 @@ snapshots: pathe@2.0.1: {} + pend@1.2.0: + optional: true + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -7519,6 +9598,13 @@ snapshots: pngjs@5.0.0: {} + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + pony-cause@2.1.11: {} possible-typed-array-names@1.0.0: {} @@ -7574,6 +9660,9 @@ snapshots: process-warning@1.0.0: {} + progress@2.0.3: + optional: true + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -7582,13 +9671,58 @@ snapshots: property-information@6.5.0: {} + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.1.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + optional: true + proxy-compare@2.5.1: {} + proxy-from-env@1.1.0: + optional: true + pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 + puppeteer-core@22.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@puppeteer/browsers': 2.3.0 + chromium-bidi: 0.6.3(devtools-protocol@0.0.1312386) + debug: 4.4.0 + devtools-protocol: 0.0.1312386 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - utf-8-validate + optional: true + + puppeteer@22.15.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10): + dependencies: + '@puppeteer/browsers': 2.3.0 + cosmiconfig: 9.0.0(typescript@5.7.3) + devtools-protocol: 0.0.1312386 + puppeteer-core: 22.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - typescript + - utf-8-validate + optional: true + qrcode@1.5.3: dependencies: dijkstrajs: 1.0.3 @@ -7860,6 +9994,9 @@ snapshots: require-main-filename@2.0.0: {} + resolve-from@4.0.0: + optional: true + resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -7873,6 +10010,8 @@ snapshots: reusify@1.0.4: {} + robust-predicates@3.0.2: {} + rollup@4.30.1: dependencies: '@types/estree': 1.0.6 @@ -7898,10 +10037,24 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.30.1 fsevents: 2.3.3 + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + rw@1.3.3: {} + + sade@1.8.1: + dependencies: + mri: 1.2.0 + optional: true + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -7914,6 +10067,8 @@ snapshots: safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} + scheduler@0.25.0: {} section-matter@1.0.0: @@ -7995,6 +10150,9 @@ snapshots: slash@4.0.0: {} + smart-buffer@4.2.0: + optional: true + socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@socket.io/component-emitter': 3.1.2 @@ -8013,12 +10171,30 @@ snapshots: transitivePeerDependencies: - supports-color + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + optional: true + + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + optional: true + sonic-boom@2.8.0: dependencies: atomic-sleep: 1.0.0 source-map-js@1.2.1: {} + source-map@0.6.1: + optional: true + source-map@0.7.4: {} space-separated-tokens@2.0.2: {} @@ -8029,6 +10205,9 @@ snapshots: sprintf-js@1.0.3: {} + sprintf-js@1.1.3: + optional: true + statuses@2.0.1: {} stdin-discarder@0.1.0: @@ -8037,6 +10216,14 @@ snapshots: stream-shift@1.0.3: {} + streamx@2.22.0: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.5.4 + optional: true + strict-uri-encode@2.0.0: {} string-width@4.2.3: @@ -8082,10 +10269,17 @@ snapshots: strip-final-newline@2.0.0: {} + style-to-object@0.4.4: + dependencies: + inline-style-parser: 0.1.1 + optional: true + style-to-object@1.0.8: dependencies: inline-style-parser: 0.2.4 + stylis@4.3.6: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -8131,6 +10325,29 @@ snapshots: transitivePeerDependencies: - ts-node + tar-fs@3.0.8: + dependencies: + pump: 3.0.2 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.0.1 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer + optional: true + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.0 + optional: true + + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + optional: true + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -8143,6 +10360,11 @@ snapshots: dependencies: real-require: 0.1.0 + through@2.3.8: + optional: true + + tinyexec@0.3.2: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -8157,6 +10379,8 @@ snapshots: trough@2.2.0: {} + ts-dedent@2.2.0: {} + ts-interface-checker@0.1.13: {} tslib@1.14.1: {} @@ -8183,6 +10407,12 @@ snapshots: dependencies: multiformats: 9.9.0 + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + optional: true + uncrypto@0.1.3: {} undici-types@6.20.0: {} @@ -8215,18 +10445,39 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.11 + optional: true + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-position-from-estree@1.1.2: + dependencies: + '@types/unist': 2.0.11 + optional: true + unist-util-position-from-estree@2.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-position@4.0.4: + dependencies: + '@types/unist': 2.0.11 + optional: true + unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-remove-position@4.0.2: + dependencies: + '@types/unist': 2.0.11 + unist-util-visit: 4.1.2 + optional: true + unist-util-stringify-position@3.0.3: dependencies: '@types/unist': 2.0.11 @@ -8235,11 +10486,24 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-visit-parents@5.1.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + optional: true + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.0 + unist-util-visit@4.1.2: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + optional: true + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -8267,6 +10531,9 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + urlpattern-polyfill@10.0.0: + optional: true + use-callback-ref@1.3.3(@types/react@19.0.6)(react@19.0.0): dependencies: react: 19.0.0 @@ -8308,6 +10575,14 @@ snapshots: uuid@9.0.1: {} + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + optional: true + valtio@1.11.2(@types/react@19.0.6)(react@19.0.0): dependencies: proxy-compare: 2.5.1 @@ -8318,6 +10593,12 @@ snapshots: vary@1.1.2: {} + vfile-location@4.1.0: + dependencies: + '@types/unist': 2.0.11 + vfile: 5.3.7 + optional: true + vfile-message@3.1.4: dependencies: '@types/unist': 2.0.11 @@ -8340,15 +10621,15 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10): + viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8): dependencies: '@noble/curves': 1.7.0 '@noble/hashes': 1.6.1 '@scure/bip32': 1.6.0 '@scure/bip39': 1.5.0 - abitype: 1.0.7(typescript@5.7.3) + abitype: 1.0.7(typescript@5.7.3)(zod@3.23.8) isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.6.0(typescript@5.7.3) + ox: 0.6.0(typescript@5.7.3)(zod@3.23.8) webauthn-p256: 0.0.10 ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: @@ -8468,14 +10749,31 @@ snapshots: - ts-node - typescript - wagmi@2.14.8(@tanstack/query-core@5.64.1)(@tanstack/react-query@5.64.1(react@19.0.0))(@types/react@19.0.6)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)): + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-uri@3.0.8: {} + + wagmi@2.14.8(@tanstack/query-core@5.64.1)(@tanstack/react-query@5.64.1(react@19.0.0))(@types/react@19.0.6)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8): dependencies: '@tanstack/react-query': 5.64.1(react@19.0.0) - '@wagmi/connectors': 5.7.4(@types/react@19.0.6)(@wagmi/core@2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)) - '@wagmi/core': 2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)) + '@wagmi/connectors': 5.7.4(@types/react@19.0.6)(@wagmi/core@2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + '@wagmi/core': 2.16.3(@tanstack/query-core@5.64.1)(@types/react@19.0.6)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8)) react: 19.0.0 use-sync-external-store: 1.4.0(react@19.0.0) - viem: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + viem: 2.22.8(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -8506,6 +10804,9 @@ snapshots: - utf-8-validate - zod + web-namespaces@2.0.1: + optional: true + webauthn-p256@0.0.10: dependencies: '@noble/curves': 1.8.0 @@ -8576,6 +10877,9 @@ snapshots: y18n@4.0.3: {} + y18n@5.0.8: + optional: true + yallist@3.1.1: {} yaml@2.7.0: {} @@ -8585,6 +10889,9 @@ snapshots: camelcase: 5.3.1 decamelize: 1.2.0 + yargs-parser@21.1.1: + optional: true + yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -8599,10 +10906,30 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + optional: true + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + optional: true + yocto-queue@0.1.0: {} yocto-queue@1.1.1: {} + zod@3.23.8: + optional: true + zustand@5.0.0(@types/react@19.0.6)(react@19.0.0)(use-sync-external-store@1.4.0(react@19.0.0)): optionalDependencies: '@types/react': 19.0.6 diff --git a/src/components/ui/Mermaid.tsx b/src/components/ui/Mermaid.tsx new file mode 100644 index 000000000..b6eb39d41 --- /dev/null +++ b/src/components/ui/Mermaid.tsx @@ -0,0 +1,14 @@ +import { Mermaid as MermaidZ } from 'mdx-mermaid/lib/Mermaid' +import { useEffect, useState } from 'react' + +export const Mermaid = ({ ...props }: Parameters[0]) => { + const [isMounted, setIsMounted] = useState(false) + + useEffect(() => { + setIsMounted(true) + }, []) + + if (!isMounted) return null + + return +} diff --git a/src/pages/registry/dns.mdx b/src/pages/registry/dns.mdx index 8b603fa5b..f935232fb 100644 --- a/src/pages/registry/dns.mdx +++ b/src/pages/registry/dns.mdx @@ -1,20 +1,17 @@ -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Registrar responsible for all DNSSEC enabled names', - emoji: '🗒️', - contributors: ['luc.eth', 'gregskril.eth'] -}; +--- +description: Registrar responsible for all DNSSEC enabled names +--- # DNS Registrar In [DNS on ENS](/learn/dns) we learned how ENS aims to extend the functionality of the DNS. On this page we will explore the implementation of DNSSEC, the DNSRegistrar, and the building blocks for gasless DNSSEC. - - Not all top level domains support DNSSEC, and some might have custom ENS - implementations. Please refer to the [TLD List](/dns/tlds) for TLD-specific - information. - +:::note +Not all top level domains support DNSSEC, and some might have custom ENS +implementations. Please refer to the [TLD List](/dns/tlds) for TLD-specific +information. +::: ## DNSSEC @@ -43,7 +40,7 @@ EP5.1 introduced a new DNSSECOracle and DNSRegistrar which makes it possible to It works by enabling [wildcard resolution](/ensip/10) at the DNS TLD level. During the [name resolution process](/resolution), if a name doesn't already exist onchain but has been configured for usage in ENS, the DNSSEC proof will be fetched offchain via [CCIP Read](https://eips.ethereum.org/EIPS/eip-3668) and then verified onchain with the same DNSSECOracle mentioned above. -### Import a DNS name gaslessly {{ id: 'gasless-import' }} +### Import a DNS name gaslessly To configure a DNS name for usage in ENS, simply add a `TXT` record with the following format: @@ -77,10 +74,10 @@ To help you interact with DNSSEC data and the DNSRegistrar, we provide a few lib #### Retrieving a proof ```ts -import { createPublicClient, http } from 'viem' -import { mainnet } from 'viem/chains' import { addEnsContracts } from '@ensdomains/ensjs' import { getDnsImportData } from '@ensdomains/ensjs/dns' +import { createPublicClient, http } from 'viem' +import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: addEnsContracts(mainnet), @@ -95,10 +92,10 @@ const dnsImportData = await getDnsImportData(client, { #### Submitting the proof to the DNSRegistrar ```ts -import { createPublicClient, createWalletClient, http, custom } from 'viem' -import { mainnet } from 'viem/chains' import { addEnsContracts } from '@ensdomains/ensjs' import { getDnsImportData, importDnsName } from '@ensdomains/ensjs/dns' +import { createPublicClient, createWalletClient, custom, http } from 'viem' +import { mainnet } from 'viem/chains' const mainnetWithEns = addEnsContracts(mainnet) diff --git a/src/pages/registry/ens.mdx b/src/pages/registry/ens.mdx index 36a23eebb..50105f402 100644 --- a/src/pages/registry/ens.mdx +++ b/src/pages/registry/ens.mdx @@ -1,10 +1,4 @@ -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Root Registry of the Ethereum Name Service', - contributors: [] -}; - -# The Registry +# The Registry [Root Registry of the Ethereum Name Service] The ENS registry is the core contract that lies at the heart of ENS resolution. All ENS lookups start by querying the registry. The registry maintains a list of domains, recording the owner, resolver, and TTL for each, and allows the owner of a domain to make changes to that data. diff --git a/src/pages/registry/eth.mdx b/src/pages/registry/eth.mdx index 98eee173a..498dad041 100644 --- a/src/pages/registry/eth.mdx +++ b/src/pages/registry/eth.mdx @@ -1,18 +1,11 @@ -import { WIP } from "@/components/wip/WIP"; +import { FiBookOpen, FiClock, FiHash } from 'react-icons/fi' -{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Registrar responsible for the ".eth" TLD.', - emoji: '🗒️', - contributors: ['luc.eth'] -}; +import { Card } from '../../components/ui/Card' -# ETH Registrar +# ETH Registrar [Smart contracts responsible for the ".eth" TLD] The ETH Registrar is a special registrar. It allows for trustless on-chain name registration and is in charge of the ".eth" TLD. - - ## BaseRegistrar vs Controller The ETH Registrar is split into two contracts. The [BaseRegistrar](https://github.com/ensdomains/ens-contracts/blob/staging/contracts/ethregistrar/BaseRegistrarImplementation.sol) and the [ETHRegistrarController](https://github.com/ensdomains/ens-contracts/blob/staging/contracts/ethregistrar/ETHRegistrarController.sol). @@ -57,22 +50,13 @@ The Auction is a 21 day dutch auction, meaning that the price starts high (~100 This is done to prevent sniping of names, and ensures the name goes to the highest bidder fairly. -
    -
    - - - -
    -
    + +
    + + + +
    +
    You can read more about the temporary premium in [this article](https://support.ens.domains/en/articles/7900612-temporary-premium). @@ -98,20 +82,20 @@ If you would like to register a name through a smart contract, or your own inter For the process of `.eth` name registration the ETH Registrar uses a two transaction commit reveal process. -
    -
    - - Commit -
    -
    - - Wait -
    -
    - - Reveal -
    -
    + +
    + + Commit +
    +
    + + Wait +
    +
    + + Reveal +
    +
    ### Commit Reveal @@ -141,7 +125,6 @@ makeCommitment( Once you have calculated the commitment hash you can call the `commit` function. - ```solidity ETHRegistrarController.commit(commitment bytes32) ``` @@ -156,10 +139,10 @@ Registration takes in the same parameters as the `makeCommitment` function, but Before initiating registration ensure that: -- `available(name)` == true -- `duration` >= `MIN_REGISTRATION_DURATION` -- `commitments[commitment]` is between 1 min and 24 hrs old -- `msg.value` >= `rentPrice(name, duration)` + `5-10% (slippage)` +- `available(name)` == true +- `duration` >= `MIN_REGISTRATION_DURATION` +- `commitments[commitment]` is between 1 min and 24 hrs old +- `msg.value` >= `rentPrice(name, duration)` + `5-10% (slippage)` Because the rent price may vary over time, callers are recommended to send slightly more than the value returned by `rentPrice`, a premium of 5-10% will likely be sufficient. Any excess funds sent during registration are automatically returned to the caller. @@ -180,10 +163,6 @@ register( ); ``` -If you would like to try registering a name live on a testnet you can use the live demo below. - - - ## Renewing a Name ```solidity @@ -195,8 +174,6 @@ Any user can renew a domain, not just the owner. This means that if you want to By allowing renewal for any arbitrary amount of time users can ensure their name will not expire. As per the separation between registry and controller, even with upgraded controller your name will still be yours. - - ## Other features ```solidity diff --git a/src/pages/registry/reverse.mdx b/src/pages/registry/reverse.mdx index ea6a3b932..8556b4ada 100644 --- a/src/pages/registry/reverse.mdx +++ b/src/pages/registry/reverse.mdx @@ -1,13 +1,4 @@ -import { WIP } from '@/components/wip/WIP'; - -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: 'Registrar responsible for Primary Names', - emoji: '🗒️', - contributors: [] -}; - -# Reverse Registrar +# Reverse Registrar [Registrar responsible for Primary Names] Reverse resolution in ENS - the process of mapping from an Ethereum address (eg, 0x1234...) to an ENS name - is handled using a special namespace, .addr.reverse. A special-purpose registrar controls this namespace and allocates subdomains to any caller based on their address. The reverse registrar is specified in EIP 181. diff --git a/src/pages/resolvers/ccip-read.mdx b/src/pages/resolvers/ccip-read.mdx index 72723a5fb..742407466 100644 --- a/src/pages/resolvers/ccip-read.mdx +++ b/src/pages/resolvers/ccip-read.mdx @@ -160,5 +160,3 @@ An alternative option is to [set the Resolver manually](/resolvers/interacting) To test your gateway you can use the [ENS Manager App](https://ens.app/) or if you want more detail try using [enstate](https://enstate.rs/n/luc.willbreak.eth) and notice the `ccip_urls` field. If your results are loaded successfully, you have successfully implemented a gateway resolver. - -A testing tool for CCIP Read functions will be available soon. diff --git a/src/pages/wrapper/contracts.mdx b/src/pages/wrapper/contracts.mdx index 91bd5bbc8..13adf5c8e 100644 --- a/src/pages/wrapper/contracts.mdx +++ b/src/pages/wrapper/contracts.mdx @@ -1,26 +1,15 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: '', - emoji: '🎁', - contributors: [ - 'serenae-fansubs' - ] -}; - # Name Wrapper Contract Details The Name Wrapper contract is deployed on these chains: - +- Mainnet: [wrapper.ens.eth](https://etherscan.io/address/0xD4416b13d2b3a9aBae7AcD5D6C2BbDBE25686401#code) ( `0xD4416b13d2b3a9aBae7AcD5D6C2BbDBE25686401` ) +- Sepolia: [wrapper.ens.eth](https://sepolia.etherscan.io/address/0x0635513f179D50A207757E05759CbD106d7dFcE8#code) ( `0x0635513f179D50A207757E05759CbD106d7dFcE8` ) ## Wrapping and Unwrapping When wrapping a .eth 2LD, you transfer the Owner (Registrant) of the ERC-721 NFT to the Name Wrapper contract. -The contract will then automatically take over the Manager (Controller) for the name as well. +The contract will then automatically take over the Manager (Controller) for the name as well. You can do this by calling the wrapETH2LD method. Or, you can directly transfer the ERC-721 NFT to the Name Wrapper contract. In return, the contract issues you an ERC-1155 NFT. @@ -155,7 +144,7 @@ The "Renewal Manager" does not have full control over your wrapped name, it can Further, if you burn the **`CANNOT_APPROVE`** fuse on your name, then the approved renewal manager can no longer be changed. You can use this to "lock in" that contract, so that you can guarantee to all subname owners that renewals/extensions can always be done. -This approved renewal manager will be reset if the wrapped NFT is burned or re-minted, which happens if you unwrap the name, or if an expired name gets re-registered. It will also be reset if the wrapped NFT is transferred, **unless** the **`CANNOT_APPROVE`** fuse is burned. +This approved renewal manager will be reset if the wrapped NFT is burned or re-minted, which happens if you unwrap the name, or if an expired name gets re-registered. It will also be reset if the wrapped NFT is transferred, **unless** the **`CANNOT_APPROVE`** fuse is burned. ### Example - Subname Registrar Contract diff --git a/src/pages/wrapper/creating-subname-registrar.mdx b/src/pages/wrapper/creating-subname-registrar.mdx index 4b8496c1b..a76abd711 100644 --- a/src/pages/wrapper/creating-subname-registrar.mdx +++ b/src/pages/wrapper/creating-subname-registrar.mdx @@ -1,31 +1,22 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: '', - emoji: '🕹️', - contributors: [ - 'serenae-fansubs' - ] -}; - # Creating a Subname Registrar -In the Use Cases section, we talked about the ability to stand up your own "registrar" to allow other people to register/claim subnames automatically. Maybe you want to give wrapped subnames out for free, or maybe you want to charge for them. Maybe you want to apply specific rules to the subnames, such as only allowing alphanumeric names. All of this is possible, and this article will break down what you need to do. It's recommended to first read the Use Cases section to get an overview of the decisions you'll need to make. +In the [Use Cases](/wrapper/usecases#sell-or-rent-subnames) section, we talked about the ability to stand up your own "registrar" to allow other people to register/claim subnames automatically. Maybe you want to give wrapped subnames out for free, or maybe you want to charge for them. Maybe you want to apply specific rules to the subnames, such as only allowing alphanumeric names. All of this is possible, and this article will break down what you need to do. It's recommended to first read the [Use Cases](/wrapper/usecases#sell-or-rent-subnames) section to get an overview of the decisions you'll need to make. ## Prerequisites This guide assumes that your parent name (such as `myname.eth`) is already wrapped. If you're not sure whether your name is wrapped, look at the More tab on the Manager app. If the name is unwrapped, it will say so, and it will show you a "Wrap Name" button. -If you want to issue Emancipated subnames, or subnames with any other fuses burned, then your parent name must first be Locked. You can do this on the Permissions tab in the ENS manager app. +If you want to issue [Emancipated](/wrapper/states#emancipated) subnames, or subnames with [any other fuses](/wrapper/fuses) burned, then your parent name must first be [Locked](/wrapper/states#locked). You can do this on the Permissions tab in the ENS manager app. - - Locking your name (in other words revoking the permission to unwrap) is an **irreversible** change. After you lock the name, you will no longer be able to unwrap it. This is a security guarantee for the holders of all subnames. It ensures that the owner of the parent name cannot get around the security guarantees of the Name Wrapper. +:::note +Locking your name (in other words revoking the permission to unwrap) is an **irreversible** change. After you lock the name, you will no longer be able to unwrap it. This is a security guarantee for the holders of all subnames. It ensures that the owner of the parent name cannot get around the security guarantees of the Name Wrapper. - Best to do this on a testnet (Sepolia/Holesky) name first, for development or testing purposes. - +Best to do this on a testnet (Sepolia/Holesky) name first, for development or testing purposes. +::: ## Creating and Deploying your Registrar Contract -In order to create a new subname, your contract should call call either `setSubnodeOwner` or `setSubnodeRecord` on the NameWrapper contract. Also pass in the fuses and expiry at the same time, as needed. +In order to create a new subname, your contract should call call either `setSubnodeOwner` or `setSubnodeRecord` on the [NameWrapper contract](/learn/deployments#deployments). Also pass in the fuses and expiry at the same time, as needed. ```solidity NameWrapper.setSubnodeOwner(bytes32 parentNode, string label, address owner, uint32 fuses, uint64 expiry) @@ -60,11 +51,12 @@ register(bytes32 parentNode, string calldata label) ``` Then under the hood, your contract will call `setSubnodeRecord` and fill in the rest of the parameters on behalf of the user: -* owner: Typically the caller account, `msg.sender` -* resolver: Typically the default public resolver, `resolver.eth` -* ttl: 0 -* fuses: Up to you and your goals. See the Use Cases section for a discussion on this. Typically 65536 for an enamcipated rental subname, or 327680 for an emancipated "forever" name. -* expiry: Up to you and your goals. If you are renting subnames for a particular length of time, this expiry would reflect that. If you are allowing registration of "forever" names, then you can just set the expiry equal to the parent name's current expiry. + +- owner: Typically the caller account, `msg.sender` +- resolver: Typically the default public resolver, `resolver.eth` +- ttl: 0 +- fuses: Up to you and your goals. See the [Use Cases](/wrapper/usecases#sell-or-rent-subnames) section for a discussion on this. Typically 65536 for an enamcipated rental subname, or 327680 for an emancipated "forever" name. +- expiry: Up to you and your goals. If you are renting subnames for a particular length of time, this expiry would reflect that. If you are allowing registration of "forever" names, then you can just set the expiry equal to the parent name's current expiry. Of course, if you want to give the registrant more power/convenience, you could allow some of those parameters to be passed in to your public register function as well. @@ -72,11 +64,11 @@ Of course, if you want to give the registrant more power/convenience, you could If you want your subname registrar to set records on a subname in the same registration transaction, then the flow will be slightly different. In that case, perform these steps: -* Call `setSubnodeOwner`, setting the _contract itself_ (`address(this)`) as the owner of the subname, temporarily. This first step is needed for the default Public Resolver so that the contract has the authority to set records for the subname. -* Call whatever resolver methods you need to. Perhaps these are records that you want to be pre-set on your subnames (such as an ETH address that the subname points to). Or perhaps these are records that you allow the registrant to pass in, so that they can register their subname and set whatever records they want all in one transaction. -* Call `setSubnodeRecord`, but this time set the owner to the actual intended owner of the subname. This is the point at which you should set the appropriate fuses and expiry you want to, as well. +- Call `setSubnodeOwner`, setting the _contract itself_ (`address(this)`) as the owner of the subname, temporarily. This first step is needed for the default Public Resolver so that the contract has the authority to set records for the subname. +- Call whatever [resolver methods](/resolvers/interacting) you need to. Perhaps these are records that you want to be pre-set on your subnames (such as an ETH address that the subname points to). Or perhaps these are records that you allow the registrant to pass in, so that they can register their subname and set whatever records they want all in one transaction. +- Call `setSubnodeRecord`, but this time set the owner to the actual intended owner of the subname. This is the point at which you should set the appropriate fuses and expiry you want to, as well. -In addition, you will need to make sure your contract follows the ERC-1155 Token Receiver rules. This means implementing the `onERC1155Received` and `onERC1155BatchReceived` methods, and signaling support for them in your ERC-165 `supportsInterface` method. OpenZeppelin has an easy abstract contract you can include for all this: ERC1155Holder.sol +In addition, you will need to make sure your contract follows the [ERC-1155 Token Receiver rules](https://eips.ethereum.org/EIPS/eip-1155#erc-1155-token-receiver). This means implementing the `onERC1155Received` and `onERC1155BatchReceived` methods, and signaling support for them in your ERC-165 `supportsInterface` method. OpenZeppelin has an easy abstract contract you can include for all this: [ERC1155Holder.sol](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/utils/ERC1155Holder.sol) ### Taking fees @@ -106,7 +98,7 @@ Once you have a parent name ready and a subname registrar contract deployed, the ### (If needed) Call setupDomain on your contract -This will only apply to you if you have a specific `setupDomain` method or something similar on your contract, such as the reference implementation contracts do. +This will only apply to you if you have a specific `setupDomain` method or something similar on your contract, such as the [reference implementation](/wrapper/creating-subname-registrar#reference-implementation) contracts do. Calling this method will "enable" a specific parent name in your subname registrar. It can also allow you to set or update the pricing terms or beneficiary account, if needed. @@ -124,4 +116,4 @@ Finally, the registrant will call your public registration method. Upon transact If you are allowing "forever" subnames to be registered (meaning that you've burned the `CAN_EXTEND_EXPIRY` fuse on the subnames), then the registrant can extend their own expiry at any time. Note that a subname's expiry can be set up to a maximum of whatever the parent name's expiry is. -And that's it! \ No newline at end of file +And that's it! diff --git a/src/pages/wrapper/expiry.mdx b/src/pages/wrapper/expiry.mdx index b0dbcd113..b7fc36adc 100644 --- a/src/pages/wrapper/expiry.mdx +++ b/src/pages/wrapper/expiry.mdx @@ -1,11 +1,4 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: '', - emoji: '🎁', - contributors: [ - 'serenae-fansubs' - ] -}; +import { Card } from '../../components/ui/Card' # Name Wrapper Expiry @@ -21,9 +14,9 @@ For example, say a name expires in 5 years. The owner of the name can then set t Then in turn, the owner of the subname can set the expiry of its own subnames up to a maximum of 2 years, but it could also set it to something less, like 1 year. -
    - Expiry Diagram -
    + + Expiry Diagram + The parent can set a different expiry for different subnames too, just as it can burn different fuses for different subnames. @@ -47,11 +40,11 @@ So, if you are running a subname registrar and you want to enable "unruggable re For .eth second-level names, the end of the name's grace period (from the .eth Registrar) is used for the expiry inside of the Name Wrapper. -So if the name's expiration date in the Registrar is January 1st, then the expiry in the Name Wrapper will reflect that date *plus* the grace period (currently 90 days, so approximately April 1st, depending on the year). +So if the name's expiration date in the Registrar is January 1st, then the expiry in the Name Wrapper will reflect that date _plus_ the grace period (currently 90 days, so approximately April 1st, depending on the year). -When the name's expiration date (from the .eth Registrar) has been reached, and the name is now in the grace period, all Name Wrapper operations on the name will be restricted. +When the name's expiration date (from the .eth Registrar) has been reached, and the name is now in the grace period, all Name Wrapper operations on the name will be restricted. -The owner will *not* yet lose ownership of the name, but they will also not be able to unwrap or update the name until it has been renewed. +The owner will _not_ yet lose ownership of the name, but they will also not be able to unwrap or update the name until it has been renewed. ## Expiry Implications diff --git a/src/pages/wrapper/fuses.mdx b/src/pages/wrapper/fuses.mdx index 3a956e0d7..83f04067b 100644 --- a/src/pages/wrapper/fuses.mdx +++ b/src/pages/wrapper/fuses.mdx @@ -1,12 +1,3 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: '', - emoji: '🎁', - contributors: [ - 'serenae-fansubs' - ] -}; - # Name Wrapper Fuses A "fuse" is a permission or perk that can be granted/revoked on a name. As the name implies, once the fuse is "burned", it cannot be unburned. @@ -25,79 +16,27 @@ There are parent-controlled and owner-controlled fuses: Only the owner of the parent name can burn one of these fuses on a name. These can generally be thought of as "perks" that can be granted to a name, though they can be used in other ways. - - - - - - - - - - - - - - - - - - - - - - - - - -
    Fuse nameDescription
    **`PARENT_CANNOT_CONTROL`**Allows a parent owner to **Emancipate** a child name. After this is burned, the parent will no longer be able to burn any further fuses, and will no longer be able to replace/delete the child name. This fuse must be burned in order for any owner-controlled fuses to be burned on the name.
    **`IS_DOT_ETH`**This fuse cannot be burned by users of the Name Wrapper, it is only set internally when a .eth 2LD is wrapped.
    **`CAN_EXTEND_EXPIRY`**The owner of the child name will be able to extend their own expiry. Normally, only the parent owner can extend the expiry of a child name. See the Expiry section for more information.
    **Custom Fuses**There are 13 other parent-controlled fuses that are not reserved, and can be used in any custom way you want!
    +| Fuse name | Description | +| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **`PARENT_CANNOT_CONTROL`** | Allows a parent owner to **Emancipate** a child name. After this is burned, the parent will no longer be able to burn any further fuses, and will no longer be able to replace/delete the child name. This fuse must be burned in order for any owner-controlled fuses to be burned on the name. | +| **`IS_DOT_ETH`** | This fuse cannot be burned by users of the Name Wrapper, it is only set internally when a .eth 2LD is wrapped. | +| **`CAN_EXTEND_EXPIRY`** | The owner of the child name will be able to extend their own expiry. Normally, only the parent owner can extend the expiry of a child name. See the [Expiry](/wrapper/expiry) section for more information. | +| **Custom Fuses** | There are 13 other parent-controlled fuses that are not reserved, and can be used in any custom way you want! | ## Owner-Controlled Fuses Either the owner of the name or the owner of the parent name can burn one of these fuses. These can generally be thought of as "permissions" that can be revoked on a name, though they can be used in other ways. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Fuse nameDescription
    **`CANNOT_UNWRAP`**The name will now be **Locked**, and can no longer be unwrapped. This fuse must be burned in order for any other owner-controlled fuses to be burned on the name.
    **`CANNOT_BURN_FUSES`**No further fuses can be burned on the name.
    **`CANNOT_TRANSFER`**The name (wrapped NFT) can no longer be transferred.
    **`CANNOT_SET_RESOLVER`**The resolver contract for the name can no longer be updated.
    **`CANNOT_SET_TTL`**The TTL for the name can no longer be updated.
    **`CANNOT_CREATE_SUBDOMAIN`**New subdomains can no longer be created.
    **`CANNOT_APPROVE`**The approved "subname renewal manager" for the name can no longer be updated. See the Approved Operators section for more information.
    **Custom Fuses**There are 9 other owner-controlled fuses that are not reserved, and can be used in any custom way you want!
    +| Fuse name | Description | +| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`CANNOT_UNWRAP`** | The name will now be **Locked**, and can no longer be unwrapped. This fuse must be burned in order for any other owner-controlled fuses to be burned on the name. | +| **`CANNOT_BURN_FUSES`** | No further fuses can be burned on the name. | +| **`CANNOT_TRANSFER`** | The name (wrapped NFT) can no longer be transferred. | +| **`CANNOT_SET_RESOLVER`** | The resolver contract for the name can no longer be updated. | +| **`CANNOT_SET_TTL`** | The TTL for the name can no longer be updated. | +| **`CANNOT_CREATE_SUBDOMAIN`** | New subdomains can no longer be created. | +| **`CANNOT_APPROVE`** | The approved "subname renewal manager" for the name can no longer be updated. See the [Approved Operators](#approved-operators) section for more information. | +| **Custom Fuses** | There are 9 other owner-controlled fuses that are not reserved, and can be used in any custom way you want! | ## The Emancipated and Locked States @@ -115,14 +54,11 @@ An Emancipated name is Locked when the **`CANNOT_UNWRAP`** (CU) fuse is burned. Think of the special PCC / CU fuses recursively: -
      -
    • To burn owner-controlled or subname fuses, CU must be burned.
    • -
    • To burn CU, PCC must be burned.
    • -
    • Only the parent can burn PCC on the child name, and only if CU is first burned on the parent.
    • -
    • To burn CU on the parent, PCC must be burned on the parent.
    • -
    • Only the grandparent can burn PCC on the parent name, and only if CU is first burned on the grandparent.
    • -
    • And so on...
    • -
    +- To burn owner-controlled or subname fuses, CU must be burned. +- To burn CU, PCC must be burned. +- Only the parent can burn PCC on the child name, and only if CU is first burned on the parent. +- Only the grandparent can burn PCC on the parent name, and only if CU is first burned on the grandparent. +- And so on... Follow that chain up until you hit a .eth second-level name like `name.eth`, since .eth second-level names will have PCC automatically burned when wrapping. The parent `eth` node is already in the Locked state. @@ -132,15 +68,13 @@ A parent name can burn all the fuses it needs to on a child name in one transact Currently, only .eth names support fuses, because only the `eth` node is on-chain native and completely locked beyond anyone's control. -Technically speaking, the owner of a DNS TLD has the ability to burn fuses on that TLD in the Name Wrapper, and set it to the "Locked" state. And then from there, all subnames under that DNS TLD *will* be able to use fuses. +Technically speaking, the owner of a DNS TLD has the ability to burn fuses on that TLD in the Name Wrapper, and set it to the "Locked" state. And then from there, all subnames under that DNS TLD _will_ be able to use fuses. The DNS TLD owner would need to: -
      -
    • Request the Controller of that TLD from the ENS DAO
    • -
    • Wrap the TLD node in the Name Wrapper
    • -
    • Burn the **`PARENT_CANNOT_CONTROL`** and **`CANNOT_UNWRAP`** fuses on the wrapped TLD to lock it
    • -
    +- Request the Controller of that TLD from the ENS DAO +- Wrap the TLD node in the Name Wrapper +- Burn the **`PARENT_CANNOT_CONTROL`** and **`CANNOT_UNWRAP`** fuses on the wrapped TLD to lock it However, this still does not have all the immutable guarantees that .eth names do. This is because for DNS names, the "source of truth" always lies not in the Ethereum network, but in the DNS network, and the DNS root zone governed by ICANN stakeholders. diff --git a/src/pages/wrapper/overview.mdx b/src/pages/wrapper/overview.mdx index 89cb6aae4..34357061b 100644 --- a/src/pages/wrapper/overview.mdx +++ b/src/pages/wrapper/overview.mdx @@ -1,79 +1,63 @@ -{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} -export const meta = { - description: '', - emoji: '🎁', - contributors: [ - 'serenae-fansubs' - ] -}; +import { Card } from '../../components/ui/Card' # Name Wrapper Overview - - Are you looking for user-facing guides on how to interact with the Name Wrapper in the ENS Manager App? If so, see here instead: Name Wrapper Guides - +:::note +Are you looking for user-facing guides on how to interact with the Name Wrapper in the ENS Manager App? If so, see here instead: Name Wrapper Guides +::: - +