From 8f06da232e9cc80333a0feb8fed4505425058419 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 20 Feb 2025 17:46:37 +0300 Subject: [PATCH 1/7] feat: redo docs for v3 --- astro.config.mjs | 49 +- package.json | 20 +- pnpm-lock.yaml | 3236 +++++++++-------- public/d2/docs/cross-cats/cross-cats-0.svg | 959 ----- public/d2/docs/cross-cats/cross-cats-1.svg | 959 ----- public/d2/docs/cross-cats/cross-cats-2.svg | 959 ----- public/d2/docs/cross-cats/cross-cats-3.svg | 959 ----- public/d2/docs/cross-cats/cross-cats-4.svg | 959 ----- public/d2/docs/cross-cats/cross-cats-5.svg | 959 ----- public/d2/docs/cross-cats/underwriting-0.svg | 941 ----- public/d2/docs/cross-cats/underwriting-1.svg | 941 ----- public/d2/docs/cross-cats/underwriting-2.svg | 947 ----- public/d2/docs/cross-cats/underwriting-3.svg | 947 ----- public/d2/docs/cross-cats/underwriting-4.svg | 947 ----- public/d2/docs/cross-cats/underwriting-5.svg | 947 ----- public/d2/docs/cross-cats/underwriting-6.svg | 947 ----- public/d2/docs/cross-cats/underwriting-7.svg | 953 ----- public/d2/docs/cross-cats/underwriting-8.svg | 953 ----- public/d2/docs/cross-cats/underwriting-9.svg | 953 ----- public/d2/docs/index-0.svg | 936 +++++ public/d2/docs/protocol/liquidity-pools-0.svg | 406 +-- public/d2/docs/protocol/tx-lifecycle-0.svg | 346 +- src/content/docs/cross-cats/ERC7683.md | 11 - src/content/docs/cross-cats/callbacks.md | 66 - src/content/docs/cross-cats/cross-cats.mdx | 1356 ------- src/content/docs/cross-cats/underwriting.mdx | 1551 -------- .../build-bridge-agnostic.md | 30 - .../docs/generalised-incentives/integrate.md | 169 - .../docs/implementation/1-input-settlement.md | 98 + .../implementation/2-output-settlement.mdx | 37 + .../implementation/3-validation-layers.md | 92 + src/content/docs/implementation/999-calls.mdx | 82 + src/content/docs/implementation/ERC7683.md | 32 + src/content/docs/index.mdx | 207 +- src/content/docs/introduction/UoL2.png | Bin 59605 -> 0 bytes .../docs/introduction/differentiator.md | 13 - src/content/docs/introduction/how-it-works.md | 36 - src/content/docs/introduction/vision.md | 24 - .../bitcoin-primer.mdx | 2 +- src/content/docs/knowledge/resource-locks.mdx | 8 + src/content/docs/protocol/tx-lifecycle.md | 2 +- .../docs/relayer/changelog-and-migration.md | 59 - .../docs/relayer/choosing-your-server.md | 18 - src/content/docs/relayer/relayer.md | 25 - src/content/docs/relayer/setup.md | 168 - src/content/docs/resources/api.md | 12 - .../docs/resources/audit-whitepaper.md | 26 - src/content/docs/resources/brand-assets.md | 8 - .../docs/resources/contract-addresses.mdx | 30 - src/content/docs/resources/eggs-rewards.md | 66 - src/content/docs/resources/official-links.md | 26 - src/content/docs/resources/sdk.md | 10 - src/content/docs/resources/support.md | 8 - .../btc-fulfilling.mdx | 0 .../collecting-orders.mdx | 0 .../evm-fulfilling.mdx | 0 .../init-orders.mdx | 4 +- .../introduction.mdx | 1 - .../underwriter/changelog-and-migration.md | 58 - .../docs/underwriter/server-requirements.md | 18 - src/content/docs/underwriter/setup.md | 78 - .../docs/underwriter/underwriting-swaps.md | 89 - 62 files changed, 3539 insertions(+), 21204 deletions(-) delete mode 100644 public/d2/docs/cross-cats/cross-cats-0.svg delete mode 100644 public/d2/docs/cross-cats/cross-cats-1.svg delete mode 100644 public/d2/docs/cross-cats/cross-cats-2.svg delete mode 100644 public/d2/docs/cross-cats/cross-cats-3.svg delete mode 100644 public/d2/docs/cross-cats/cross-cats-4.svg delete mode 100644 public/d2/docs/cross-cats/cross-cats-5.svg delete mode 100644 public/d2/docs/cross-cats/underwriting-0.svg delete mode 100644 public/d2/docs/cross-cats/underwriting-1.svg delete mode 100644 public/d2/docs/cross-cats/underwriting-2.svg delete mode 100644 public/d2/docs/cross-cats/underwriting-3.svg delete mode 100644 public/d2/docs/cross-cats/underwriting-4.svg delete mode 100644 public/d2/docs/cross-cats/underwriting-5.svg delete mode 100644 public/d2/docs/cross-cats/underwriting-6.svg delete mode 100644 public/d2/docs/cross-cats/underwriting-7.svg delete mode 100644 public/d2/docs/cross-cats/underwriting-8.svg delete mode 100644 public/d2/docs/cross-cats/underwriting-9.svg create mode 100644 public/d2/docs/index-0.svg delete mode 100644 src/content/docs/cross-cats/ERC7683.md delete mode 100644 src/content/docs/cross-cats/callbacks.md delete mode 100644 src/content/docs/cross-cats/cross-cats.mdx delete mode 100644 src/content/docs/cross-cats/underwriting.mdx delete mode 100644 src/content/docs/generalised-incentives/build-bridge-agnostic.md delete mode 100644 src/content/docs/generalised-incentives/integrate.md create mode 100644 src/content/docs/implementation/1-input-settlement.md create mode 100644 src/content/docs/implementation/2-output-settlement.mdx create mode 100644 src/content/docs/implementation/3-validation-layers.md create mode 100644 src/content/docs/implementation/999-calls.mdx create mode 100644 src/content/docs/implementation/ERC7683.md delete mode 100644 src/content/docs/introduction/UoL2.png delete mode 100644 src/content/docs/introduction/differentiator.md delete mode 100644 src/content/docs/introduction/how-it-works.md delete mode 100644 src/content/docs/introduction/vision.md rename src/content/docs/{cross-cats => knowledge}/bitcoin-primer.mdx (99%) create mode 100644 src/content/docs/knowledge/resource-locks.mdx delete mode 100644 src/content/docs/relayer/changelog-and-migration.md delete mode 100644 src/content/docs/relayer/choosing-your-server.md delete mode 100644 src/content/docs/relayer/relayer.md delete mode 100644 src/content/docs/relayer/setup.md delete mode 100644 src/content/docs/resources/api.md delete mode 100644 src/content/docs/resources/audit-whitepaper.md delete mode 100644 src/content/docs/resources/brand-assets.md delete mode 100644 src/content/docs/resources/contract-addresses.mdx delete mode 100644 src/content/docs/resources/eggs-rewards.md delete mode 100644 src/content/docs/resources/official-links.md delete mode 100644 src/content/docs/resources/sdk.md delete mode 100644 src/content/docs/resources/support.md rename src/content/docs/{cross-cats/Becoming a Solver => solver}/btc-fulfilling.mdx (100%) rename src/content/docs/{cross-cats/Becoming a Solver => solver}/collecting-orders.mdx (100%) rename src/content/docs/{cross-cats/Becoming a Solver => solver}/evm-fulfilling.mdx (100%) rename src/content/docs/{cross-cats/Becoming a Solver => solver}/init-orders.mdx (96%) rename src/content/docs/{cross-cats/Becoming a Solver => solver}/introduction.mdx (94%) delete mode 100644 src/content/docs/underwriter/changelog-and-migration.md delete mode 100644 src/content/docs/underwriter/server-requirements.md delete mode 100644 src/content/docs/underwriter/setup.md delete mode 100644 src/content/docs/underwriter/underwriting-swaps.md diff --git a/astro.config.mjs b/astro.config.mjs index 9365c79..1346aa3 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -10,9 +10,8 @@ import svelte from "@astrojs/svelte"; // https://astro.build/config export default defineConfig({ redirects: { - "/resources/whitepaper": "/resources/audit-whitepaper#Papers", - "/cross-cats/": "/cross-cats/cross-cats/", - "/cross-cats/solver/": "/cross-cats/becoming-a-solver/introduction/", + "/cross-cats/": "/intent/intent/", + "/cross-cats/solver/": "/intent/becoming-a-solver/introduction/", }, site: `${process.env["CF_PAGES_URL"] ?? "https://docs.catalyst.exchange"}`, markdown: { @@ -33,63 +32,47 @@ export default defineConfig({ }, social: { github: "https://github.com/catalystdao", - discord: "https://discord.gg/nvvN3XbaYG", }, customCss: ["./src/assets/landing.css", "./src/assets/math-fix.css"], favicon: "/favicon.ico", sidebar: [ { - label: "Overview", + label: "Catalyst Intent System", link: "/", }, { - label: "Introduction", + label: "Implementations", autogenerate: { - directory: "introduction", + directory: "implementation", }, }, { - label: "V1: Cross-Chain AMM", + label: "Solvers", + badge: "Outdated", autogenerate: { - directory: "protocol", - }, - }, - { - label: "CrossCats: Cross-Chain Intents", - badge: "Closed Beta", - autogenerate: { - directory: "cross-cats", - }, - }, - { - label: "Generalised Incentives", - autogenerate: { - directory: "generalised-incentives", + directory: "solver", }, }, { - label: "Relayer", + label: "Knowledge Database", + collapsed: true, autogenerate: { - directory: "relayer", + directory: "knowledge", }, }, { - label: "Underwriter", + label: "CatalystAMM", + collapsed: true, + badge: "Legacy", autogenerate: { - directory: "underwriter", - }, - }, - { - label: "Resources", - autogenerate: { - directory: "resources", + directory: "protocol", }, }, ], }), d2({ skipGeneration: !!process.env["CF_PAGES"] || !process.env["D2"], - layout: "tala", + layout: "elk", }), svelte(), ], diff --git a/package.json b/package.json index f529741..6236c23 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "catalyst-starlight", "type": "module", - "version": "0.0.1", + "version": "0.1.0", "scripts": { "dev": "astro dev", "start": "astro dev", @@ -10,18 +10,18 @@ "astro": "astro" }, "dependencies": { - "@astrojs/check": "^0.9.3", - "@astrojs/starlight": "^0.28.2", - "@astrojs/svelte": "^5.7.1", - "astro": "^4.15.9", - "astro-d2": "^0.5.2", + "@astrojs/check": "^0.9.4", + "@astrojs/starlight": "^0.32.1", + "@astrojs/svelte": "^7.0.4", + "astro": "^5.3.0", + "astro-d2": "^0.7.0", "astro-iconify": "^1.2.0", - "rehype-mathjax": "^6.0.0", + "rehype-mathjax": "^7.0.0", "remark-math": "^6.0.0", "sharp": "^0.33.5", - "starlight-links-validator": "^0.12.1", - "svelte": "^4.2.19", - "typescript": "^5.6.2" + "starlight-links-validator": "^0.14.3", + "svelte": "^5.20.2", + "typescript": "^5.7.3" }, "packageManager": "pnpm@9.11.0+sha256.1c0e33f70e5df9eede84a357bdfa0b1f9dba6e58194628d48a1055756f553754" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96f5b71..aa32555 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,26 +9,26 @@ importers: .: dependencies: '@astrojs/check': - specifier: ^0.9.3 - version: 0.9.3(typescript@5.6.2) + specifier: ^0.9.4 + version: 0.9.4(typescript@5.7.3) '@astrojs/starlight': - specifier: ^0.28.2 - version: 0.28.2(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2)) + specifier: ^0.32.1 + version: 0.32.1(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0)) '@astrojs/svelte': - specifier: ^5.7.1 - version: 5.7.1(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2))(svelte@4.2.19)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.3)) + specifier: ^7.0.4 + version: 7.0.4(@types/node@22.13.4)(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0))(svelte@5.20.2)(typescript@5.7.3)(yaml@2.7.0) astro: - specifier: ^4.15.9 - version: 4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2) + specifier: ^5.3.0 + version: 5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0) astro-d2: - specifier: ^0.5.2 - version: 0.5.2(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2)) + specifier: ^0.7.0 + version: 0.7.0(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0)) astro-iconify: specifier: ^1.2.0 version: 1.2.0 rehype-mathjax: - specifier: ^6.0.0 - version: 6.0.0 + specifier: ^7.0.0 + version: 7.0.0 remark-math: specifier: ^6.0.0 version: 6.0.0 @@ -36,14 +36,14 @@ importers: specifier: ^0.33.5 version: 0.33.5 starlight-links-validator: - specifier: ^0.12.1 - version: 0.12.1(@astrojs/starlight@0.28.2(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2)))(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2)) + specifier: ^0.14.3 + version: 0.14.3(@astrojs/starlight@0.32.1(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0))) svelte: - specifier: ^4.2.19 - version: 4.2.19 + specifier: ^5.20.2 + version: 5.20.2 typescript: - specifier: ^5.6.2 - version: 5.6.2 + specifier: ^5.7.3 + version: 5.7.3 packages: @@ -51,17 +51,14 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/install-pkg@0.4.1': - resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} + '@antfu/install-pkg@1.0.0': + resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} - '@antfu/utils@0.7.10': - resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + '@antfu/utils@8.1.1': + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} - '@asamuzakjp/dom-selector@2.0.2': - resolution: {integrity: sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==} - - '@astrojs/check@0.9.3': - resolution: {integrity: sha512-I6Dz45bMI5YRbp4yK2LKWsHH3/kkHRGdPGruGkLap6pqxhdcNh7oCgN04Ac+haDfc9ow5BYPGPmEhkwef15GQQ==} + '@astrojs/check@0.9.4': + resolution: {integrity: sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA==} hasBin: true peerDependencies: typescript: ^5.0.0 @@ -69,11 +66,11 @@ packages: '@astrojs/compiler@2.10.3': resolution: {integrity: sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==} - '@astrojs/internal-helpers@0.4.1': - resolution: {integrity: sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==} + '@astrojs/internal-helpers@0.5.1': + resolution: {integrity: sha512-M7rAge1n2+aOSxNvKUFa0u/KFn0W+sZy7EW91KOSERotm2Ti8qs+1K0xx3zbOxtAVrmJb5/J98eohVvvEqtNkw==} - '@astrojs/language-server@2.14.2': - resolution: {integrity: sha512-daUJ/+/2pPF3eGG4tVdXKyw0tabUDrJKwLzU8VTuNhEHIn3VZAIES6VT3+mX0lmKcMiKM8/bjZdfY+fPfmnsMA==} + '@astrojs/language-server@2.15.4': + resolution: {integrity: sha512-JivzASqTPR2bao9BWsSc/woPHH7OGSGc9aMxXL4U6egVTqBycB3ZHdBJPuOCVtcGLrzdWTosAqVPz1BVoxE0+A==} hasBin: true peerDependencies: prettier: ^3.0.0 @@ -84,83 +81,41 @@ packages: prettier-plugin-astro: optional: true - '@astrojs/markdown-remark@5.2.0': - resolution: {integrity: sha512-vWGM24KZXz11jR3JO+oqYU3T2qpuOi4uGivJ9SQLCAI01+vEkHC60YJMRvHPc+hwd60F7euNs1PeOEixIIiNQw==} + '@astrojs/markdown-remark@6.1.0': + resolution: {integrity: sha512-emZNNSTPGgPc3V399Cazpp5+snogjaF04ocOSQn9vy3Kw/eIC4vTQjXOrWDEoSEy+AwPDZX9bQ4wd3bxhpmGgQ==} - '@astrojs/mdx@3.1.7': - resolution: {integrity: sha512-8lGdCt+S0TrZgQpbcP3fQJc4cTeacAirtz9TpAMtHCWrQGW8slKt3WG4/0N+bhZgYRC4h5AT5drzFz+y3wvmsg==} - engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} + '@astrojs/mdx@4.0.8': + resolution: {integrity: sha512-/aiLr2yQ55W9AbpyOgfMtFXk7g2t7XoWdC2Avps/NqxAx4aYONDLneX43D79QwgqdjFhin7o3cIPp/vVppMbaA==} + engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} peerDependencies: - astro: ^4.8.0 + astro: ^5.0.0 - '@astrojs/prism@3.1.0': - resolution: {integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==} - engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} + '@astrojs/prism@3.2.0': + resolution: {integrity: sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==} + engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} - '@astrojs/sitemap@3.1.6': - resolution: {integrity: sha512-1Qp2NvAzVImqA6y+LubKi1DVhve/hXXgFvB0szxiipzh7BvtuKe4oJJ9dXSqaubaTkt4nMa6dv6RCCAYeB6xaQ==} + '@astrojs/sitemap@3.2.1': + resolution: {integrity: sha512-uxMfO8f7pALq0ADL6Lk68UV6dNYjJ2xGUzyjjVj60JLBs5a6smtlkBYv3tQ0DzoqwS7c9n4FUx5lgv0yPo/fgA==} - '@astrojs/starlight@0.28.2': - resolution: {integrity: sha512-Q1/Ujl2EzWX71qwqdt/0KP3wOyX6Rvyzcep/zD3hRCtw/Vi2TReh4Q2wLwz7mnbuYU9H7YvBKYknbkmjC+K/0w==} + '@astrojs/starlight@0.32.1': + resolution: {integrity: sha512-+GPtDzi7wkbooHnMZqGjCoV0qwkYZAFSg3FhRm8jSXXSkLJcw4rgT6vnee/LuJhbVq9kvHVcevtgK8tTxy3Xeg==} peerDependencies: - astro: ^4.14.0 + astro: ^5.1.5 - '@astrojs/svelte@5.7.1': - resolution: {integrity: sha512-VIxEdkrnGMoxjs/heI0SWAwQy9+aHxVrsK5QUmsFihXKeYB9OhbZHUzsRJEmoW3IPpKZn/DEallyr1/4a1zZxQ==} - engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} + '@astrojs/svelte@7.0.4': + resolution: {integrity: sha512-vTFhHhYNr1GkrpR63Talv8ba1HHUWoHNzBs4eJNZz4bQCihAdxw+xz/CWcWM1bfAzH3Jfc7jAKXPNAZSwN4oFg==} + engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} peerDependencies: - astro: ^4.0.0 - svelte: ^4.0.0 || ^5.0.0-next.190 + astro: ^5.0.0 + svelte: ^5.1.16 typescript: ^5.3.3 - '@astrojs/telemetry@3.1.0': - resolution: {integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==} - engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - - '@astrojs/yaml2ts@0.2.1': - resolution: {integrity: sha512-CBaNwDQJz20E5WxzQh4thLVfhB3JEEGz72wRA+oJp6fQR37QLAqXZJU0mHC+yqMOQ6oj0GfRPJrz6hjf+zm6zA==} - - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.25.4': - resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.25.6': - resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.24.7': - resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-plugin-utils@7.24.8': - resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} - engines: {node: '>=6.9.0'} + '@astrojs/telemetry@3.2.0': + resolution: {integrity: sha512-wxhSKRfKugLwLlr4OFfcqovk+LIFtKwLyGPqMsv+9/ibqqnW3Gv7tBhtKEb0gAyUAC4G9BTVQeQahqnQAhd6IQ==} + engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} - engines: {node: '>=6.9.0'} + '@astrojs/yaml2ts@0.2.2': + resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==} '@babel/helper-string-parser@7.24.8': resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} @@ -170,47 +125,15 @@ packages: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.25.6': - resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - '@babel/parser@7.25.6': resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.24.7': - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx@7.25.2': - resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/runtime@7.25.6': resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.25.6': - resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} - engines: {node: '>=6.9.0'} - '@babel/types@7.25.6': resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} @@ -243,164 +166,176 @@ packages: '@emnapi/runtime@1.2.0': resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@expressive-code/core@0.35.6': - resolution: {integrity: sha512-xGqCkmfkgT7lr/rvmfnYdDSeTdCSp1otAHgoFS6wNEeO7wGDPpxdosVqYiIcQ8CfWUABh/pGqWG90q+MV3824A==} + '@expressive-code/core@0.40.2': + resolution: {integrity: sha512-gXY3v7jbgz6nWKvRpoDxK4AHUPkZRuJsM79vHX/5uhV9/qX6Qnctp/U/dMHog/LCVXcuOps+5nRmf1uxQVPb3w==} - '@expressive-code/plugin-frames@0.35.6': - resolution: {integrity: sha512-CqjSWjDJ3wabMJZfL9ZAzH5UAGKg7KWsf1TBzr4xvUbZvWoBtLA/TboBML0U1Ls8h/4TRCIvR4VEb8dv5+QG3w==} + '@expressive-code/plugin-frames@0.40.2': + resolution: {integrity: sha512-aLw5IlDlZWb10Jo/TTDCVsmJhKfZ7FJI83Zo9VDrV0OBlmHAg7klZqw68VDz7FlftIBVAmMby53/MNXPnMjTSQ==} - '@expressive-code/plugin-shiki@0.35.6': - resolution: {integrity: sha512-xm+hzi9BsmhkDUGuyAWIydOAWer7Cs9cj8FM0t4HXaQ+qCubprT6wJZSKUxuvFJIUsIOqk1xXFaJzGJGnWtKMg==} + '@expressive-code/plugin-shiki@0.40.2': + resolution: {integrity: sha512-t2HMR5BO6GdDW1c1ISBTk66xO503e/Z8ecZdNcr6E4NpUfvY+MRje+LtrcvbBqMwWBBO8RpVKcam/Uy+1GxwKQ==} - '@expressive-code/plugin-text-markers@0.35.6': - resolution: {integrity: sha512-/k9eWVZSCs+uEKHR++22Uu6eIbHWEciVHbIuD8frT8DlqTtHYaaiwHPncO6KFWnGDz5i/gL7oyl6XmOi/E6GVg==} + '@expressive-code/plugin-text-markers@0.40.2': + resolution: {integrity: sha512-/XoLjD67K9nfM4TgDlXAExzMJp6ewFKxNpfUw4F7q5Ecy+IU3/9zQQG/O70Zy+RxYTwKGw2MA9kd7yelsxnSmw==} - '@iconify/tools@4.0.7': - resolution: {integrity: sha512-zOJxKIfZn96ZRGGvIWzDRLD9vb2CsxjcLuM+QIdvwWbv6SWhm49gECzUnd4d2P0sq9sfodT7yCNobWK8nvavxQ==} + '@iconify/tools@4.1.1': + resolution: {integrity: sha512-Hybu/HGhv6T8nLQhiG9rKx+ekF7NNpPOEQAy7JRSKht3s3dcFSsPccYzk24Znc9MTxrR6Gak3cg6CPP5dyvS2Q==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@2.1.33': - resolution: {integrity: sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==} + '@iconify/utils@2.3.0': + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} @@ -507,8 +442,8 @@ packages: cpu: [x64] os: [win32] - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': @@ -525,8 +460,8 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@mdx-js/mdx@3.0.1': - resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -543,36 +478,36 @@ packages: '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - '@pagefind/darwin-arm64@1.1.1': - resolution: {integrity: sha512-tZ9tysUmQpFs2EqWG2+E1gc+opDAhSyZSsgKmFzhnWfkK02YHZhvL5XJXEZDqYy3s1FAKhwjTg8XDxneuBlDZQ==} + '@pagefind/darwin-arm64@1.3.0': + resolution: {integrity: sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A==} cpu: [arm64] os: [darwin] - '@pagefind/darwin-x64@1.1.1': - resolution: {integrity: sha512-ChohLQ39dLwaxQv0jIQB/SavP3TM5K5ENfDTqIdzLkmfs3+JlzSDyQKcJFjTHYcCzQOZVeieeGq8PdqvLJxJxQ==} + '@pagefind/darwin-x64@1.3.0': + resolution: {integrity: sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow==} cpu: [x64] os: [darwin] - '@pagefind/default-ui@1.1.1': - resolution: {integrity: sha512-ZM0zDatWDnac/VGHhQCiM7UgA4ca8jpjA+VfuTJyHJBaxGqZMQnm4WoTz9E0KFcue1Bh9kxpu7uWFZfwpZZk0A==} + '@pagefind/default-ui@1.3.0': + resolution: {integrity: sha512-CGKT9ccd3+oRK6STXGgfH+m0DbOKayX6QGlq38TfE1ZfUcPc5+ulTuzDbZUnMo+bubsEOIypm4Pl2iEyzZ1cNg==} - '@pagefind/linux-arm64@1.1.1': - resolution: {integrity: sha512-H5P6wDoCoAbdsWp0Zx0DxnLUrwTGWGLu/VI1rcN2CyFdY2EGSvPQsbGBMrseKRNuIrJDFtxHHHyjZ7UbzaM9EA==} + '@pagefind/linux-arm64@1.3.0': + resolution: {integrity: sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ==} cpu: [arm64] os: [linux] - '@pagefind/linux-x64@1.1.1': - resolution: {integrity: sha512-yJs7tTYbL2MI3HT+ngs9E1BfUbY9M4/YzA0yEM5xBo4Xl8Yu8Qg2xZTOQ1/F6gwvMrjCUFo8EoACs6LRDhtMrQ==} + '@pagefind/linux-x64@1.3.0': + resolution: {integrity: sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ==} cpu: [x64] os: [linux] - '@pagefind/windows-x64@1.1.1': - resolution: {integrity: sha512-b7/qPqgIl+lMzkQ8fJt51SfguB396xbIIR+VZ3YrL2tLuyifDJ1wL5mEm+ddmHxJ2Fki340paPcDan9en5OmAw==} + '@pagefind/windows-x64@1.3.0': + resolution: {integrity: sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ==} cpu: [x64] os: [win32] - '@rollup/pluginutils@5.1.2': - resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} + '@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 @@ -580,115 +515,136 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.22.5': - resolution: {integrity: sha512-SU5cvamg0Eyu/F+kLeMXS7GoahL+OoizlclVFX3l5Ql6yNlywJJ0OuqTzUx0v+aHhPHEB/56CT06GQrRrGNYww==} + '@rollup/rollup-android-arm-eabi@4.34.8': + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.22.5': - resolution: {integrity: sha512-S4pit5BP6E5R5C8S6tgU/drvgjtYW76FBuG6+ibG3tMvlD1h9LHVF9KmlmaUBQ8Obou7hEyS+0w+IR/VtxwNMQ==} + '@rollup/rollup-android-arm64@4.34.8': + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.22.5': - resolution: {integrity: sha512-250ZGg4ipTL0TGvLlfACkIxS9+KLtIbn7BCZjsZj88zSg2Lvu3Xdw6dhAhfe/FjjXPVNCtcSp+WZjVsD3a/Zlw==} + '@rollup/rollup-darwin-arm64@4.34.8': + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.22.5': - resolution: {integrity: sha512-D8brJEFg5D+QxFcW6jYANu+Rr9SlKtTenmsX5hOSzNYVrK5oLAEMTUgKWYJP+wdKyCdeSwnapLsn+OVRFycuQg==} + '@rollup/rollup-darwin-x64@4.34.8': + resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.22.5': - resolution: {integrity: sha512-PNqXYmdNFyWNg0ma5LdY8wP+eQfdvyaBAojAXgO7/gs0Q/6TQJVXAXe8gwW9URjbS0YAammur0fynYGiWsKlXw==} + '@rollup/rollup-freebsd-arm64@4.34.8': + resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.8': + resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.22.5': - resolution: {integrity: sha512-kSSCZOKz3HqlrEuwKd9TYv7vxPYD77vHSUvM2y0YaTGnFc8AdI5TTQRrM1yIp3tXCKrSL9A7JLoILjtad5t8pQ==} + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.22.5': - resolution: {integrity: sha512-oTXQeJHRbOnwRnRffb6bmqmUugz0glXaPyspp4gbQOPVApdpRrY/j7KP3lr7M8kTfQTyrBUzFjj5EuHAhqH4/w==} + '@rollup/rollup-linux-arm64-gnu@4.34.8': + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.22.5': - resolution: {integrity: sha512-qnOTIIs6tIGFKCHdhYitgC2XQ2X25InIbZFor5wh+mALH84qnFHvc+vmWUpyX97B0hNvwNUL4B+MB8vJvH65Fw==} + '@rollup/rollup-linux-arm64-musl@4.34.8': + resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.22.5': - resolution: {integrity: sha512-TMYu+DUdNlgBXING13rHSfUc3Ky5nLPbWs4bFnT+R6Vu3OvXkTkixvvBKk8uO4MT5Ab6lC3U7x8S8El2q5o56w==} + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': + resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.22.5': - resolution: {integrity: sha512-PTQq1Kz22ZRvuhr3uURH+U/Q/a0pbxJoICGSprNLAoBEkyD3Sh9qP5I0Asn0y0wejXQBbsVMRZRxlbGFD9OK4A==} + '@rollup/rollup-linux-riscv64-gnu@4.34.8': + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.22.5': - resolution: {integrity: sha512-bR5nCojtpuMss6TDEmf/jnBnzlo+6n1UhgwqUvRoe4VIotC7FG1IKkyJbwsT7JDsF2jxR+NTnuOwiGv0hLyDoQ==} + '@rollup/rollup-linux-s390x-gnu@4.34.8': + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.22.5': - resolution: {integrity: sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA==} + '@rollup/rollup-linux-x64-gnu@4.34.8': + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.22.5': - resolution: {integrity: sha512-uBa2e28ohzNNwjr6Uxm4XyaA1M/8aTgfF2T7UIlElLaeXkgpmIJ2EitVNQxjO9xLLLy60YqAgKn/AqSpCUkE9g==} + '@rollup/rollup-linux-x64-musl@4.34.8': + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.22.5': - resolution: {integrity: sha512-RXT8S1HP8AFN/Kr3tg4fuYrNxZ/pZf1HemC5Tsddc6HzgGnJm0+Lh5rAHJkDuW3StI0ynNXukidROMXYl6ew8w==} + '@rollup/rollup-win32-arm64-msvc@4.34.8': + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.22.5': - resolution: {integrity: sha512-ElTYOh50InL8kzyUD6XsnPit7jYCKrphmddKAe1/Ytt74apOxDq5YEcbsiKs0fR3vff3jEneMM+3I7jbqaMyBg==} + '@rollup/rollup-win32-ia32-msvc@4.34.8': + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.22.5': - resolution: {integrity: sha512-+lvL/4mQxSV8MukpkKyyvfwhH266COcWlXE/1qxwN08ajovta3459zrjLghYMgDerlzNwLAcFpvU+WWE5y6nAQ==} + '@rollup/rollup-win32-x64-msvc@4.34.8': + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} cpu: [x64] os: [win32] - '@shikijs/core@1.20.0': - resolution: {integrity: sha512-KlO3iE0THzSdYkzDFugt8SHe6FR3qNYTkmpbdW1d6xo8juQkMjybxAw/cBi2npL2eb2F4PbbnSs5Z9tDusfvyg==} + '@shikijs/core@1.29.2': + resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} + + '@shikijs/engine-javascript@1.29.2': + resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} - '@shikijs/engine-javascript@1.20.0': - resolution: {integrity: sha512-ZUMo758uduM0Tfgzi/kd+0IKMbNdumCxxWjY36uf1DIs2Qyg9HIq3vA1Wfa/vc6HE7tHWFpANRi3mv7UzJ68MQ==} + '@shikijs/engine-oniguruma@1.29.2': + resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - '@shikijs/engine-oniguruma@1.20.0': - resolution: {integrity: sha512-MQ40WkVTZk7by33ces4PGK6XNFSo6PYvKTSAr2kTWdRNhFmOcnaX+1XzvFwB26eySXR7U74t91czZ1qJkEgxTA==} + '@shikijs/langs@1.29.2': + resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} - '@shikijs/types@1.20.0': - resolution: {integrity: sha512-y+EaDvU2K6/GaXOKXxJaGnr1XtmZMF7MfS0pSEDdxEq66gCtKsLwQvVwoQFdp7R7dLlNAro3ijEE19sMZ0pzqg==} + '@shikijs/themes@1.29.2': + resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} - '@shikijs/vscode-textmate@9.2.2': - resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==} + '@shikijs/types@1.29.2': + resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} - '@sveltejs/vite-plugin-svelte-inspector@2.1.0': - resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} - engines: {node: ^18.0.0 || >=20} + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.0 + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 - '@sveltejs/vite-plugin-svelte@3.1.2': - resolution: {integrity: sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==} - engines: {node: ^18.0.0 || >=20} + '@sveltejs/vite-plugin-svelte@5.0.3': + resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} @@ -697,18 +653,6 @@ packages: '@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/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -724,6 +668,9 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/katex@0.16.7': resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} @@ -745,11 +692,14 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + '@types/node@22.13.4': + resolution: {integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==} + '@types/node@22.7.3': resolution: {integrity: sha512-qXKfhXXqGTyBskvWEzJZPUxSslAiLaB6JGP1ic/XTH9ctGgzdgYguuLP1C601aRTSDNlLb0jbKqXjZ48GNraSA==} - '@types/picomatch@2.3.3': - resolution: {integrity: sha512-Yll76ZHikRFCyz/pffKGjrCwe/le2CDwOP5F210KQo27kpRE46U2rDnzikNlVn6/ezH3Mhn46bJMTfeVTtcYMg==} + '@types/picomatch@3.0.2': + resolution: {integrity: sha512-n0i8TD3UDB7paoMMxA3Y65vUncFJXjcUf7lQY7YyKGl6031FNjfsLs6pdLFCy2GNFxItPJG8GvvpbZc2skH7WA==} '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} @@ -769,25 +719,25 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@volar/kit@2.4.5': - resolution: {integrity: sha512-ZzyErW5UiDfiIuJ/lpqc2Kx5PHDGDZ/bPlPJYpRcxlrn8Z8aDhRlsLHkNKcNiH65TmNahk2kbLaiejiqu6BD3A==} + '@volar/kit@2.4.11': + resolution: {integrity: sha512-ups5RKbMzMCr6RKafcCqDRnJhJDNWqo2vfekwOAj6psZ15v5TlcQFQAyokQJ3wZxVkzxrQM+TqTRDENfQEXpmA==} peerDependencies: typescript: '*' - '@volar/language-core@2.4.5': - resolution: {integrity: sha512-F4tA0DCO5Q1F5mScHmca0umsi2ufKULAnMOVBfMsZdT4myhVl4WdKRwCaKcfOkIEuyrAVvtq1ESBdZ+rSyLVww==} + '@volar/language-core@2.4.11': + resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} - '@volar/language-server@2.4.5': - resolution: {integrity: sha512-l5PswE0JzCtstTlwBUpikeSa3lNUBJhTuWtj9KclZTGi2Uex4RcqGOhTiDsUUtvdv/hEuYCxGq1EdJJPlQsD/g==} + '@volar/language-server@2.4.11': + resolution: {integrity: sha512-W9P8glH1M8LGREJ7yHRCANI5vOvTrRO15EMLdmh5WNF9sZYSEbQxiHKckZhvGIkbeR1WAlTl3ORTrJXUghjk7g==} - '@volar/language-service@2.4.5': - resolution: {integrity: sha512-xiFlL0aViGg6JhwAXyohPrdlID13uom8WQg6DWYaV8ob8RRy+zoLlBUI8SpQctwlWEO9poyrYK01revijAwkcw==} + '@volar/language-service@2.4.11': + resolution: {integrity: sha512-KIb6g8gjUkS2LzAJ9bJCLIjfsJjeRtmXlu7b2pDFGD3fNqdbC53cCAKzgWDs64xtQVKYBU13DLWbtSNFtGuMLQ==} - '@volar/source-map@2.4.5': - resolution: {integrity: sha512-varwD7RaKE2J/Z+Zu6j3mNNJbNT394qIxXwdvz/4ao/vxOfyClZpSDtLKkwWmecinkOVos5+PWkWraelfMLfpw==} + '@volar/source-map@2.4.11': + resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} - '@volar/typescript@2.4.5': - resolution: {integrity: sha512-mcT1mHvLljAEtHviVcBuOyAwwMKz1ibXTi5uYtP/pf4XxoAzpdkQ+Br2IC0NPCvLCbjPZmbf3I0udndkfB1CDg==} + '@volar/typescript@2.4.11': + resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} '@vscode/emmet-helper@2.9.3': resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==} @@ -800,15 +750,16 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn-typescript@1.4.13: + resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + peerDependencies: + acorn: '>=8.9.0' + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -823,10 +774,6 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -859,30 +806,30 @@ packages: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true - astro-d2@0.5.2: - resolution: {integrity: sha512-JN5kHalh/dQIZD6JG8y+WXY/j+K9NigyW7dLa+VbPeQnoNkRbvVms6847gqU5czojR7uzpArL7ug27vKae4lQg==} + astro-d2@0.7.0: + resolution: {integrity: sha512-g+lD6xZQcCT2T35zqC9cJKWJJZGhjQUmCWEHrUTXfaQYnpt7ubHjoYHAdYPweftigFrq2S5T2jdTT/BkManqTg==} engines: {node: '>=18'} peerDependencies: - astro: '>=4.0.0' + astro: '>=5.0.0' - astro-expressive-code@0.35.6: - resolution: {integrity: sha512-1U4KrvFuodaCV3z4I1bIR16SdhQlPkolGsYTtiANxPZUVv/KitGSCTjzksrkPonn1XuwVqvnwmUUVzTLWngnBA==} + astro-expressive-code@0.40.2: + resolution: {integrity: sha512-yJMQId0yXSAbW9I6yqvJ3FcjKzJ8zRL7elbJbllkv1ZJPlsI0NI83Pxn1YL1IapEM347EvOOkSW2GL+2+NO61w==} peerDependencies: - astro: ^4.0.0-beta || ^3.3.0 + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 astro-iconify@1.2.0: resolution: {integrity: sha512-arLDiSop3DAHHS30raZysspkz5MO9moJJZ4rJk1Ty+4W1jZDa00Jme0LrnRJRDB6BB2EDTxC553fo20yz3MeYw==} - astro@4.15.9: - resolution: {integrity: sha512-51oXq9qrZ5OPWYmEXt1kGrvWmVeWsx28SgBTzi2XW6iwcnW/wC5ONm6ol6qBGSCF93tQvZplXvuzpaw1injECA==} - engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + astro@5.3.0: + resolution: {integrity: sha512-e88l/Yk/6enR/ZDddLbqtM+oblBFk5mneNSmNesyVYGL/6Dj4UA67GPAZOk79VxT5dbLlclZSyyw/wlxN1aj3A==} + engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -900,9 +847,6 @@ packages: bcp-47@2.1.0: resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -910,36 +854,28 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.0: - resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} - caniuse-lite@1.0.30001664: - resolution: {integrity: sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -967,26 +903,22 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + ci-info@4.1.0: + resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} engines: {node: '>=8'} cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} - cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -995,22 +927,13 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - code-red@1.0.4: - resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} - collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -1043,16 +966,19 @@ packages: common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + 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==} + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + crossws@0.3.4: + resolution: {integrity: sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==} + css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} @@ -1080,18 +1006,10 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - cssstyle@4.1.0: - resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} - engines: {node: '>=18'} - data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -1101,8 +1019,14 @@ packages: supports-color: optional: true - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + 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==} @@ -1114,6 +1038,9 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1122,6 +1049,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -1160,28 +1090,29 @@ packages: domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - electron-to-chromium@1.5.29: - resolution: {integrity: sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} emmet@2.4.11: resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} + 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==} - encoding-sniffer@0.2.0: resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} @@ -1192,26 +1123,47 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + 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.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} @@ -1221,6 +1173,9 @@ packages: engines: {node: '>=4'} hasBin: true + esrap@1.4.5: + resolution: {integrity: sha512-CjNMjkBWWZeHn+VX+gS8YvFwJ5+NDhg8aWZBSFJPR8qQduDNjbJodA2WcwCm7uQa5Rjqj+nZvVmceg1RbHFB9g==} + estree-util-attach-comments@3.0.0: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} @@ -1230,6 +1185,9 @@ packages: 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==} @@ -1245,12 +1203,8 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - expressive-code@0.35.6: - resolution: {integrity: sha512-+mx+TPTbMqgo0mL92Xh9QgjW0kSQIsEivMgEcOnaqKqL7qCw8Vkqc5Rg/di7ZYw4aMUSr74VTc+w8GQWu05j1g==} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + expressive-code@0.40.2: + resolution: {integrity: sha512-1zIda2rB0qiDZACawzw2rbdBQiWHBT56uBctS+ezFe5XMAaFaHLnnSYND/Kd+dVzO9HfCXRDpzH3d+3fvOWRcw==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -1267,6 +1221,10 @@ packages: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + fast-uri@3.0.2: resolution: {integrity: sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==} @@ -1308,8 +1266,8 @@ packages: debug: optional: true - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} formdata-polyfill@4.0.10: @@ -1325,9 +1283,8 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} @@ -1337,6 +1294,14 @@ packages: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + 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'} @@ -1348,20 +1313,31 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + 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==} - gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} + h3@1.15.0: + resolution: {integrity: sha512-OsjX4JW8J4XGgCgEcad20pepFQWnuKH+OwkCJjogF3C+9AZ1iYdtB4hX6vAb5DskBiu5ljEXqApINjR8CqoCMQ==} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + 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'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} hast-util-embedded@3.0.0: resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} @@ -1369,12 +1345,6 @@ packages: hast-util-format@1.1.0: resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} - hast-util-from-dom@5.0.0: - resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} - - hast-util-from-html@2.0.1: - resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} - hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} @@ -1411,6 +1381,9 @@ packages: hast-util-to-html@9.0.3: resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + hast-util-to-jsx-runtime@2.3.0: resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} @@ -1432,9 +1405,8 @@ packages: hastscript@9.0.0: resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} @@ -1451,14 +1423,6 @@ packages: http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} - i18next@23.15.1: resolution: {integrity: sha512-wB4abZ3uK7EWodYisHl/asf8UYEhrI/vj/8aoSsrj/ZDxj4/UXPOa1KvFt1Fq5hkUHquNqwFlDprmjZ8iySgYA==} @@ -1475,6 +1439,9 @@ packages: inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-absolute-url@4.0.1: resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1500,10 +1467,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true - 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'} @@ -1524,10 +1487,6 @@ packages: engines: {node: '>=14.16'} hasBin: true - 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'} @@ -1536,27 +1495,13 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - - is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} is-wsl@3.1.0: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -1565,28 +1510,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdom@23.2.0: - resolution: {integrity: sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - jsonc-parser@2.3.1: resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} @@ -1597,10 +1523,6 @@ packages: resolution: {integrity: sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==} hasBin: true - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -1609,6 +1531,10 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -1616,8 +1542,12 @@ packages: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + local-pkg@1.0.0: + resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==} engines: {node: '>=14'} locate-character@3.0.0: @@ -1630,21 +1560,17 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -1656,6 +1582,10 @@ packages: markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + mathjax-full@3.2.2: resolution: {integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==} @@ -1671,6 +1601,9 @@ packages: mdast-util-from-markdown@2.0.1: resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + mdast-util-gfm-autolink-literal@2.0.1: resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} @@ -1698,6 +1631,9 @@ packages: mdast-util-mdx-jsx@3.1.3: resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==} + 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==} @@ -1713,6 +1649,9 @@ packages: mdast-util-to-markdown@2.1.0: resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + 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==} @@ -1732,6 +1671,9 @@ packages: micromark-core-commonmark@2.0.1: resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + micromark-core-commonmark@2.0.2: + resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + micromark-extension-directive@3.0.2: resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} @@ -1777,69 +1719,129 @@ packages: micromark-factory-destination@2.0.0: resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + micromark-factory-label@2.0.0: resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + 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.0: resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + micromark-factory-title@2.0.0: resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + micromark-factory-whitespace@2.0.0: resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + micromark-util-character@2.1.0: resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + micromark-util-chunked@2.0.0: resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + micromark-util-classify-character@2.0.0: resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + micromark-util-combine-extensions@2.0.0: resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + micromark-util-decode-numeric-character-reference@2.0.1: resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + micromark-util-decode-string@2.0.0: resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + micromark-util-encode@2.0.0: resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + 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.0: resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + micromark-util-normalize-identifier@2.0.0: resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + micromark-util-resolve-all@2.0.0: resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + micromark-util-sanitize-uri@2.0.0: resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + micromark-util-subtokenize@2.0.1: resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + micromark-util-subtokenize@2.0.4: + resolution: {integrity: sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==} + micromark-util-symbol@2.0.0: resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + micromark-util-types@2.0.0: resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromark@4.0.1: + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -1852,10 +1854,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -1880,8 +1878,8 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.1: - resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} mrmime@2.0.0: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} @@ -1898,7 +1896,12 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - neotraverse@0.6.18: + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neotraverse@0.6.18: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} @@ -1912,12 +1915,15 @@ packages: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} + node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-mock-http@1.0.0: + resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -1929,34 +1935,32 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} - onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} + ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} - oniguruma-to-js@0.4.3: - resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - ora@8.1.0: - resolution: {integrity: sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==} - engines: {node: '>=18'} + oniguruma-to-es@2.3.0: + resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - p-limit@6.1.0: - resolution: {integrity: sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==} + p-limit@6.2.0: + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} engines: {node: '>=18'} p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} - p-queue@8.0.1: - resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} + p-queue@8.1.0: + resolution: {integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==} engines: {node: '>=18'} p-timeout@6.1.2: @@ -1967,21 +1971,24 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-manager-detector@0.2.0: - resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} + package-manager-detector@0.2.9: + resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} - pagefind@1.1.1: - resolution: {integrity: sha512-U2YR0dQN5B2fbIXrLtt/UXNS0yWSSYfePaad1KcBPTi0p+zRtsVjwmoPaMQgTks5DnHNbmDxyJUL5TGaLljK3A==} + pagefind@1.3.0: + resolution: {integrity: sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==} hasBin: true parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} - parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} parse5-parser-stream@7.1.2: resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} @@ -1989,6 +1996,9 @@ packages: parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} @@ -2002,15 +2012,18 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -2027,8 +2040,8 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - pkg-types@1.2.0: - resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} @@ -2044,8 +2057,12 @@ packages: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} - preferred-pm@4.0.0: - resolution: {integrity: sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + preferred-pm@4.1.1: + resolution: {integrity: sha512-rU+ZAv1Ur9jAUZtGPebQVQPzdGhNzaEiQ7VL9+cjsAWPHFYOccNXPNiev1CCDSOg/2j7UujM7ojNhpkuILEVNQ==} engines: {node: '>=18.12'} prettier@2.8.7: @@ -2064,43 +2081,61 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.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@4.3.2: - resolution: {integrity: sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==} + regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - rehype-expressive-code@0.35.6: - resolution: {integrity: sha512-pPdE+pRcRw01kxMOwHQjuRxgwlblZt5+wAc3w2aPGgmcnn57wYjn07iKO7zaznDxYVxMYVvYlnL+R3vWFQS4Gw==} + regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + + rehype-expressive-code@0.40.2: + resolution: {integrity: sha512-+kn+AMGCrGzvtH8Q5lC6Y5lnmTV/r33fdmi5QU/IH1KPHKobKr5UnLwJuqHv5jBTSN/0v2wLDS7RTM73FVzqmQ==} rehype-format@5.0.1: resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} - rehype-mathjax@6.0.0: - resolution: {integrity: sha512-SioRmn+0mRWtDc4QVKG9JG88bXhPazfhc11GQoQ68mwot2WWyfabyZ7tuJu3Z4LCf893wXkQTVTF8PUlntoDwA==} + rehype-mathjax@7.0.0: + resolution: {integrity: sha512-xdzj8L1y0Zgai/+N3wpi/xIdiHbOJSaz3FFMZLnhnizEMzcl6Zt5LmMZfQ+J5DYo5fyjKGw/pMaJonds1apo/Q==} rehype-parse@9.0.0: resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} @@ -2108,12 +2143,21 @@ packages: rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + rehype-stringify@10.0.0: resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + rehype@13.0.1: resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==} + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + remark-directive@3.0.0: resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} @@ -2153,9 +2197,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -2164,10 +2205,6 @@ packages: resolution: {integrity: sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==} engines: {node: '>=8'} - restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} - retext-latin@4.0.0: resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} @@ -2184,17 +2221,11 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.22.5: - resolution: {integrity: sha512-WoinX7GeQOFMGznEcWA1WrTQCd/tpEbMkc3nuMs9BT0CPjMdSjPMTVClwWd4pgSQwJdP65SK9mTCNvItlr5o7w==} + rollup@4.34.8: + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - - rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -2204,33 +2235,22 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - - 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 - semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + sharp@0.33.5: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shiki@1.20.0: - resolution: {integrity: sha512-MZJJ1PCFsQB1Piq+25wiz0a75yUv8Q3/fzy7SzRx5ONdjdtGdyiKwYn8vb/FnK5kjS0voWGnPpjG16POauUR+g==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + shiki@1.29.2: + resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -2238,11 +2258,15 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - sitemap@7.1.2: - resolution: {integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==} - engines: {node: '>=12.0.0', npm: '>=5.6.0'} + sitemap@8.0.0: + resolution: {integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} hasBin: true + smol-toml@1.3.1: + resolution: {integrity: sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==} + engines: {node: '>= 18'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2261,16 +2285,11 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - starlight-links-validator@0.12.1: - resolution: {integrity: sha512-LhRuGaI9Rp7c7ltwcG0BfCZuAN1d15oYbDB4jXblJ6zsiFcrSGHNlDnKXJHEJZ6XhJ+eOpd1IsHLFLh5Sq6uHg==} - engines: {node: '>=18.14.1'} + starlight-links-validator@0.14.3: + resolution: {integrity: sha512-2CvQs0ZdIVExrEQ1bn0r2aFx4n+VSOb6vDWK+gTNb5N1c+nXJ7VjUbEsQhj+9Lb7XgY6Nxqz9JXUM9364hJ3ZA==} + engines: {node: '>=18.17.1'} peerDependencies: '@astrojs/starlight': '>=0.15.0' - astro: '>=4.0.0' - - stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} stream-replace-string@2.0.0: resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} @@ -2279,10 +2298,6 @@ packages: 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@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} @@ -2298,10 +2313,6 @@ 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-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -2312,40 +2323,27 @@ packages: style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - svelte-hmr@0.16.0: - resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} - engines: {node: ^12.20 || ^14.13.1 || >= 16} - peerDependencies: - svelte: ^3.19.0 || ^4.0.0 - - svelte2tsx@0.7.20: - resolution: {integrity: sha512-cGfCQa57nqbS1f4fTFGmnrWHdvUmDJTe6/D9Aiiwpz0BuOL4gLi/PrC0X8yUZ9hevXQdIaUd7ZqAmscgKzOmJg==} + svelte2tsx@0.7.34: + resolution: {integrity: sha512-WTMhpNhFf8/h3SMtR5dkdSy2qfveomkhYei/QW9gSPccb0/b82tjHvLop6vT303ZkGswU/da1s6XvrLgthQPCw==} peerDependencies: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 - svelte@4.2.19: - resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} - engines: {node: '>=16'} + svelte@5.20.2: + resolution: {integrity: sha512-aYXJreNUiyTob0QOzRZeBXZMGeFZDch6SrSRV8QTncZb6zj0O3BEdUzPpojuHQ1pTvk+KX7I6rZCXPUf8pTPxA==} + engines: {node: '>=18'} svgo@3.3.2: resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} engines: {node: '>=14.0.0'} hasBin: true - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - tinyexec@0.3.0: - resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} @@ -2355,22 +2353,14 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - tsconfck@3.1.3: - resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==} + tsconfck@3.1.5: + resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -2382,9 +2372,9 @@ packages: tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} + type-fest@4.35.0: + resolution: {integrity: sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==} + engines: {node: '>=16'} typesafe-path@0.2.2: resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} @@ -2392,19 +2382,28 @@ packages: typescript-auto-import-cache@0.3.3: resolution: {integrity: sha512-ojEC7+Ci1ij9eE6hp8Jl9VUNnsEKzztktP5gtYNRMrTmfXVwA1PITYYAkpxCvvupdSYa/Re51B6KMcv1CTZEUA==} - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + ultrahtml@1.5.3: + resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici@6.19.8: - resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + undici@6.21.1: + resolution: {integrity: sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==} engines: {node: '>=18.17'} unified@11.0.5: @@ -2440,18 +2439,64 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} - hasBin: true + unstorage@1.14.4: + resolution: {integrity: sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg==} peerDependencies: - browserslist: '>= 4.21.0' - - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + '@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 util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -2465,22 +2510,27 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@5.4.8: - resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@6.1.1: + resolution: {integrity: sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' less: '*' lightningcss: ^1.21.0 sass: '*' sass-embedded: '*' stylus: '*' sugarss: '*' - terser: ^5.4.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: @@ -2495,49 +2545,45 @@ packages: optional: true terser: optional: true - - vitefu@0.2.5: - resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - vite: + tsx: + optional: true + yaml: optional: true - vitefu@1.0.2: - resolution: {integrity: sha512-0/iAvbXyM3RiPPJ4lyD4w6Mjgtf4ejTK6TPvTNG3H32PLwuT0N/ZjJLiXug7ETE/LWtTeHw9WRv7uX/tIKYyKg==} + vitefu@1.0.5: + resolution: {integrity: sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: vite: optional: true - volar-service-css@0.0.61: - resolution: {integrity: sha512-Ct9L/w+IB1JU8F4jofcNCGoHy6TF83aiapfZq9A0qYYpq+Kk5dH+ONS+rVZSsuhsunq8UvAuF8Gk6B8IFLfniw==} + volar-service-css@0.0.62: + resolution: {integrity: sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==} peerDependencies: '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-emmet@0.0.61: - resolution: {integrity: sha512-iiYqBxjjcekqrRruw4COQHZME6EZYWVbkHjHDbULpml3g8HGJHzpAMkj9tXNCPxf36A+f1oUYjsvZt36qPg4cg==} + volar-service-emmet@0.0.62: + resolution: {integrity: sha512-U4dxWDBWz7Pi4plpbXf4J4Z/ss6kBO3TYrACxWNsE29abu75QzVS0paxDDhI6bhqpbDFXlpsDhZ9aXVFpnfGRQ==} peerDependencies: '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-html@0.0.61: - resolution: {integrity: sha512-yFE+YmmgqIL5HI4ORqP++IYb1QaGcv+xBboI0WkCxJJ/M35HZj7f5rbT3eQ24ECLXFbFCFanckwyWJVz5KmN3Q==} + volar-service-html@0.0.62: + resolution: {integrity: sha512-Zw01aJsZRh4GTGUjveyfEzEqpULQUdQH79KNEiKVYHZyuGtdBRYCHlrus1sueSNMxwwkuF5WnOHfvBzafs8yyQ==} peerDependencies: '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-prettier@0.0.61: - resolution: {integrity: sha512-F612nql5I0IS8HxXemCGvOR2Uxd4XooIwqYVUvk7WSBxP/+xu1jYvE3QJ7EVpl8Ty3S4SxPXYiYTsG3bi+gzIQ==} + volar-service-prettier@0.0.62: + resolution: {integrity: sha512-h2yk1RqRTE+vkYZaI9KYuwpDfOQRrTEMvoHol0yW4GFKc75wWQRrb5n/5abDrzMPrkQbSip8JH2AXbvrRtYh4w==} peerDependencies: '@volar/language-service': ~2.4.0 prettier: ^2.2 || ^3.0 @@ -2547,24 +2593,24 @@ packages: prettier: optional: true - volar-service-typescript-twoslash-queries@0.0.61: - resolution: {integrity: sha512-99FICGrEF0r1E2tV+SvprHPw9Knyg7BdW2fUch0tf59kG+KG+Tj4tL6tUg+cy8f23O/VXlmsWFMIE+bx1dXPnQ==} + volar-service-typescript-twoslash-queries@0.0.62: + resolution: {integrity: sha512-KxFt4zydyJYYI0kFAcWPTh4u0Ha36TASPZkAnNY784GtgajerUqM80nX/W1d0wVhmcOFfAxkVsf/Ed+tiYU7ng==} peerDependencies: '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-typescript@0.0.61: - resolution: {integrity: sha512-4kRHxVbW7wFBHZWRU6yWxTgiKETBDIJNwmJUAWeP0mHaKpnDGj/astdRFKqGFRYVeEYl45lcUPhdJyrzanjsdQ==} + volar-service-typescript@0.0.62: + resolution: {integrity: sha512-p7MPi71q7KOsH0eAbZwPBiKPp9B2+qrdHAd6VY5oTo9BUXatsOAdakTm9Yf0DUj6uWBAaOT01BSeVOPwucMV1g==} peerDependencies: '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-yaml@0.0.61: - resolution: {integrity: sha512-L+gbDiLDQQ1rZUbJ3mf3doDsoQUa8OZM/xdpk/unMg1Vz24Zmi2Ign8GrZyBD7bRoIQDwOH9gdktGDKzRPpUNw==} + volar-service-yaml@0.0.62: + resolution: {integrity: sha512-k7gvv7sk3wa+nGll3MaSKyjwQsJjIGCHFjVkl3wjaSP2nouKyn9aokGmqjrl39mi88Oy49giog2GkZH526wjig==} peerDependencies: '@volar/language-service': ~2.4.0 peerDependenciesMeta: @@ -2621,10 +2667,6 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -2632,10 +2674,6 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -2644,69 +2682,43 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} - whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} - which-pm-runs@1.1.0: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} - which-pm@3.0.0: - resolution: {integrity: sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==} + which-pm@3.0.1: + resolution: {integrity: sha512-v2JrMq0waAI4ju1xU5x3blsxBBMgdgZve580iYMN5frDaLGjbA24fok7wKCsya8KLVO19Ju4XDc5+zTZCJkQfg==} engines: {node: '>=18.12'} wicked-good-xpath@1.3.0: resolution: {integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==} - widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} 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'} + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - 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 - - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - xmldom-sre@0.1.31: resolution: {integrity: sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==} engines: {node: '>=0.1'} - xxhash-wasm@1.0.2: - resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -2723,6 +2735,11 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -2738,10 +2755,21 @@ packages: resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} - zod-to-json-schema@3.23.3: - resolution: {integrity: sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==} + yocto-spinner@0.2.0: + resolution: {integrity: sha512-Qu6WAqNLGleB687CCGcmgHIo8l+J19MX/32UrSMfbf/4L8gLoxjpOYoiHT1asiWyqvjRZbgvOhLlvne6E5Tbdw==} + engines: {node: '>=18.19'} + + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} + + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + + zod-to-json-schema@3.24.2: + resolution: {integrity: sha512-pNUqrcSxuuB3/+jBbU8qKUbTbDqYUaG1vf5cXFjbhGgoUuA1amO/y4Q8lzfOhHU8HNPK6VFJ18lBDKj3OHyDsg==} peerDependencies: - zod: ^3.23.3 + zod: ^3.24.1 zod-to-ts@1.2.0: resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} @@ -2752,6 +2780,9 @@ packages: zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -2759,29 +2790,22 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@antfu/install-pkg@0.4.1': + '@antfu/install-pkg@1.0.0': dependencies: - package-manager-detector: 0.2.0 - tinyexec: 0.3.0 + package-manager-detector: 0.2.9 + tinyexec: 0.3.2 - '@antfu/utils@0.7.10': {} + '@antfu/utils@8.1.1': {} - '@asamuzakjp/dom-selector@2.0.2': + '@astrojs/check@0.9.4(typescript@5.7.3)': dependencies: - bidi-js: 1.0.3 - css-tree: 2.3.1 - is-potential-custom-element-name: 1.0.1 - - '@astrojs/check@0.9.3(typescript@5.6.2)': - dependencies: - '@astrojs/language-server': 2.14.2(typescript@5.6.2) - chokidar: 3.6.0 - fast-glob: 3.3.2 + '@astrojs/language-server': 2.15.4(typescript@5.7.3) + chokidar: 4.0.3 kleur: 4.1.5 - typescript: 5.6.2 + typescript: 5.7.3 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -2789,47 +2813,48 @@ snapshots: '@astrojs/compiler@2.10.3': {} - '@astrojs/internal-helpers@0.4.1': {} + '@astrojs/internal-helpers@0.5.1': {} - '@astrojs/language-server@2.14.2(typescript@5.6.2)': + '@astrojs/language-server@2.15.4(typescript@5.7.3)': dependencies: '@astrojs/compiler': 2.10.3 - '@astrojs/yaml2ts': 0.2.1 + '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@volar/kit': 2.4.5(typescript@5.6.2) - '@volar/language-core': 2.4.5 - '@volar/language-server': 2.4.5 - '@volar/language-service': 2.4.5 - '@volar/typescript': 2.4.5 + '@volar/kit': 2.4.11(typescript@5.7.3) + '@volar/language-core': 2.4.11 + '@volar/language-server': 2.4.11 + '@volar/language-service': 2.4.11 fast-glob: 3.3.2 muggle-string: 0.4.1 - volar-service-css: 0.0.61(@volar/language-service@2.4.5) - volar-service-emmet: 0.0.61(@volar/language-service@2.4.5) - volar-service-html: 0.0.61(@volar/language-service@2.4.5) - volar-service-prettier: 0.0.61(@volar/language-service@2.4.5) - volar-service-typescript: 0.0.61(@volar/language-service@2.4.5) - volar-service-typescript-twoslash-queries: 0.0.61(@volar/language-service@2.4.5) - volar-service-yaml: 0.0.61(@volar/language-service@2.4.5) + volar-service-css: 0.0.62(@volar/language-service@2.4.11) + volar-service-emmet: 0.0.62(@volar/language-service@2.4.11) + volar-service-html: 0.0.62(@volar/language-service@2.4.11) + volar-service-prettier: 0.0.62(@volar/language-service@2.4.11) + volar-service-typescript: 0.0.62(@volar/language-service@2.4.11) + volar-service-typescript-twoslash-queries: 0.0.62(@volar/language-service@2.4.11) + volar-service-yaml: 0.0.62(@volar/language-service@2.4.11) vscode-html-languageservice: 5.3.1 vscode-uri: 3.0.8 transitivePeerDependencies: - typescript - '@astrojs/markdown-remark@5.2.0': + '@astrojs/markdown-remark@6.1.0': dependencies: - '@astrojs/prism': 3.1.0 + '@astrojs/prism': 3.2.0 github-slugger: 2.0.0 hast-util-from-html: 2.0.3 hast-util-to-text: 4.0.2 import-meta-resolve: 4.1.0 + js-yaml: 4.1.0 mdast-util-definitions: 6.0.0 rehype-raw: 7.0.0 - rehype-stringify: 10.0.0 + rehype-stringify: 10.0.1 remark-gfm: 4.0.0 remark-parse: 11.0.0 remark-rehype: 11.1.1 remark-smartypants: 3.0.2 - shiki: 1.20.0 + shiki: 1.29.2 + smol-toml: 1.3.1 unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.0.0 @@ -2838,16 +2863,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@3.1.7(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2))': + '@astrojs/mdx@4.0.8(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0))': dependencies: - '@astrojs/markdown-remark': 5.2.0 - '@mdx-js/mdx': 3.0.1 - acorn: 8.12.1 - astro: 4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2) - es-module-lexer: 1.5.4 + '@astrojs/markdown-remark': 6.1.0 + '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + acorn: 8.14.0 + astro: 5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0) + es-module-lexer: 1.6.0 estree-util-visit: 2.0.0 - gray-matter: 4.0.3 - hast-util-to-html: 9.0.3 + hast-util-to-html: 9.0.5 kleur: 4.1.5 rehype-raw: 7.0.0 remark-gfm: 4.0.0 @@ -2858,35 +2882,38 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/prism@3.1.0': + '@astrojs/prism@3.2.0': dependencies: prismjs: 1.29.0 - '@astrojs/sitemap@3.1.6': + '@astrojs/sitemap@3.2.1': dependencies: - sitemap: 7.1.2 + sitemap: 8.0.0 stream-replace-string: 2.0.0 zod: 3.23.8 - '@astrojs/starlight@0.28.2(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2))': + '@astrojs/starlight@0.32.1(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0))': dependencies: - '@astrojs/mdx': 3.1.7(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2)) - '@astrojs/sitemap': 3.1.6 - '@pagefind/default-ui': 1.1.1 + '@astrojs/mdx': 4.0.8(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0)) + '@astrojs/sitemap': 3.2.1 + '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 + '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2) - astro-expressive-code: 0.35.6(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2)) + astro: 5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0) + astro-expressive-code: 0.40.2(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.2 hast-util-to-string: 3.0.1 hastscript: 9.0.0 i18next: 23.15.1 + js-yaml: 4.1.0 + klona: 2.0.6 mdast-util-directive: 3.0.0 mdast-util-to-markdown: 2.1.0 mdast-util-to-string: 4.0.0 - pagefind: 1.1.1 + pagefind: 1.3.0 rehype: 13.0.1 rehype-format: 5.0.1 remark-directive: 3.0.0 @@ -2896,21 +2923,32 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/svelte@5.7.1(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2))(svelte@4.2.19)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.3))': + '@astrojs/svelte@7.0.4(@types/node@22.13.4)(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0))(svelte@5.20.2)(typescript@5.7.3)(yaml@2.7.0)': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.3)) - astro: 4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2) - svelte: 4.2.19 - svelte2tsx: 0.7.20(svelte@4.2.19)(typescript@5.6.2) - typescript: 5.6.2 + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.20.2)(vite@6.1.1(@types/node@22.13.4)(yaml@2.7.0)) + astro: 5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0) + svelte: 5.20.2 + svelte2tsx: 0.7.34(svelte@5.20.2)(typescript@5.7.3) + typescript: 5.7.3 + vite: 6.1.1(@types/node@22.13.4)(yaml@2.7.0) transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss - supports-color - - vite + - terser + - tsx + - yaml - '@astrojs/telemetry@3.1.0': + '@astrojs/telemetry@3.2.0': dependencies: - ci-info: 4.0.0 - debug: 4.3.7 + ci-info: 4.1.0 + debug: 4.4.0 dlv: 1.1.3 dset: 3.1.4 is-docker: 3.0.0 @@ -2919,142 +2957,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/yaml2ts@0.2.1': + '@astrojs/yaml2ts@0.2.2': dependencies: yaml: 2.5.1 - '@babel/code-frame@7.24.7': - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.1.0 - - '@babel/compat-data@7.25.4': {} - - '@babel/core@7.25.2': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - convert-source-map: 2.0.0 - debug: 4.3.7 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.25.6': - dependencies: - '@babel/types': 7.25.6 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - - '@babel/helper-annotate-as-pure@7.24.7': - dependencies: - '@babel/types': 7.25.6 - - '@babel/helper-compilation-targets@7.25.2': - dependencies: - '@babel/compat-data': 7.25.4 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.24.0 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-module-imports@7.24.7': - dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-plugin-utils@7.24.8': {} - - '@babel/helper-simple-access@7.24.7': - dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color - '@babel/helper-string-parser@7.24.8': {} '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-validator-option@7.24.8': {} - - '@babel/helpers@7.25.6': - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.1.0 - '@babel/parser@7.25.6': dependencies: '@babel/types': 7.25.6 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color - '@babel/runtime@7.25.6': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.0': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 - - '@babel/traverse@7.25.6': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - debug: 4.3.7 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - '@babel/types@7.25.6': dependencies: '@babel/helper-string-parser': 7.24.8 @@ -3091,80 +3009,86 @@ snapshots: tslib: 2.7.0 optional: true - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.24.2': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm@0.24.2': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-x64@0.24.2': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/darwin-arm64@0.24.2': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-x64@0.24.2': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/freebsd-arm64@0.24.2': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-x64@0.24.2': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/linux-arm64@0.24.2': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm@0.24.2': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-ia32@0.24.2': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-loong64@0.24.2': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-mips64el@0.24.2': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-ppc64@0.24.2': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-riscv64@0.24.2': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-s390x@0.24.2': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-x64@0.24.2': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/netbsd-arm64@0.24.2': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-x64@0.24.2': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/openbsd-arm64@0.24.2': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/openbsd-x64@0.24.2': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/sunos-x64@0.24.2': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/win32-arm64@0.24.2': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-ia32@0.24.2': optional: true - '@expressive-code/core@0.35.6': + '@esbuild/win32-x64@0.24.2': + optional: true + + '@expressive-code/core@0.40.2': dependencies: '@ctrl/tinycolor': 4.1.0 hast-util-select: 6.0.2 - hast-util-to-html: 9.0.3 + hast-util-to-html: 9.0.5 hast-util-to-text: 4.0.2 hastscript: 9.0.0 postcss: 8.4.47 @@ -3172,29 +3096,29 @@ snapshots: unist-util-visit: 5.0.0 unist-util-visit-parents: 6.0.1 - '@expressive-code/plugin-frames@0.35.6': + '@expressive-code/plugin-frames@0.40.2': dependencies: - '@expressive-code/core': 0.35.6 + '@expressive-code/core': 0.40.2 - '@expressive-code/plugin-shiki@0.35.6': + '@expressive-code/plugin-shiki@0.40.2': dependencies: - '@expressive-code/core': 0.35.6 - shiki: 1.20.0 + '@expressive-code/core': 0.40.2 + shiki: 1.29.2 - '@expressive-code/plugin-text-markers@0.35.6': + '@expressive-code/plugin-text-markers@0.40.2': dependencies: - '@expressive-code/core': 0.35.6 + '@expressive-code/core': 0.40.2 - '@iconify/tools@4.0.7': + '@iconify/tools@4.1.1': dependencies: '@iconify/types': 2.0.0 - '@iconify/utils': 2.1.33 + '@iconify/utils': 2.3.0 '@types/tar': 6.1.13 - axios: 1.7.7 + axios: 1.7.9 cheerio: 1.0.0 domhandler: 5.0.3 extract-zip: 2.0.1 - local-pkg: 0.5.0 + local-pkg: 0.5.1 pathe: 1.1.2 svgo: 3.3.2 tar: 6.2.1 @@ -3204,15 +3128,16 @@ snapshots: '@iconify/types@2.0.0': {} - '@iconify/utils@2.1.33': + '@iconify/utils@2.3.0': dependencies: - '@antfu/install-pkg': 0.4.1 - '@antfu/utils': 0.7.10 + '@antfu/install-pkg': 1.0.0 + '@antfu/utils': 8.1.1 '@iconify/types': 2.0.0 - debug: 4.3.7 + debug: 4.4.0 + globals: 15.15.0 kolorist: 1.8.0 - local-pkg: 0.5.0 - mlly: 1.7.1 + local-pkg: 1.0.0 + mlly: 1.7.4 transitivePeerDependencies: - supports-color @@ -3291,7 +3216,7 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 @@ -3308,7 +3233,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@mdx-js/mdx@3.0.1': + '@mdx-js/mdx@3.1.0(acorn@8.14.0)': dependencies: '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 @@ -3316,14 +3241,15 @@ snapshots: '@types/mdx': 2.0.13 collapse-white-space: 2.1.0 devlop: 1.1.0 - estree-util-build-jsx: 3.0.1 estree-util-is-identifier-name: 3.0.0 - estree-util-to-js: 2.0.0 + estree-util-scope: 1.0.0 estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 hast-util-to-jsx-runtime: 2.3.0 markdown-extensions: 2.0.0 - periscopic: 3.1.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.0.1 remark-parse: 11.0.0 remark-rehype: 11.1.1 @@ -3334,6 +3260,7 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.3 transitivePeerDependencies: + - acorn - supports-color '@nodelib/fs.scandir@2.1.5': @@ -3350,126 +3277,142 @@ snapshots: '@oslojs/encoding@1.1.0': {} - '@pagefind/darwin-arm64@1.1.1': + '@pagefind/darwin-arm64@1.3.0': optional: true - '@pagefind/darwin-x64@1.1.1': + '@pagefind/darwin-x64@1.3.0': optional: true - '@pagefind/default-ui@1.1.1': {} + '@pagefind/default-ui@1.3.0': {} - '@pagefind/linux-arm64@1.1.1': + '@pagefind/linux-arm64@1.3.0': optional: true - '@pagefind/linux-x64@1.1.1': + '@pagefind/linux-x64@1.3.0': optional: true - '@pagefind/windows-x64@1.1.1': + '@pagefind/windows-x64@1.3.0': optional: true - '@rollup/pluginutils@5.1.2(rollup@4.22.5)': + '@rollup/pluginutils@5.1.4(rollup@4.34.8)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 - picomatch: 2.3.1 + picomatch: 4.0.2 optionalDependencies: - rollup: 4.22.5 + rollup: 4.34.8 + + '@rollup/rollup-android-arm-eabi@4.34.8': + optional: true + + '@rollup/rollup-android-arm64@4.34.8': + optional: true - '@rollup/rollup-android-arm-eabi@4.22.5': + '@rollup/rollup-darwin-arm64@4.34.8': optional: true - '@rollup/rollup-android-arm64@4.22.5': + '@rollup/rollup-darwin-x64@4.34.8': optional: true - '@rollup/rollup-darwin-arm64@4.22.5': + '@rollup/rollup-freebsd-arm64@4.34.8': optional: true - '@rollup/rollup-darwin-x64@4.22.5': + '@rollup/rollup-freebsd-x64@4.34.8': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.22.5': + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.22.5': + '@rollup/rollup-linux-arm-musleabihf@4.34.8': optional: true - '@rollup/rollup-linux-arm64-gnu@4.22.5': + '@rollup/rollup-linux-arm64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-arm64-musl@4.22.5': + '@rollup/rollup-linux-arm64-musl@4.34.8': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.22.5': + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.22.5': + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': optional: true - '@rollup/rollup-linux-s390x-gnu@4.22.5': + '@rollup/rollup-linux-riscv64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-x64-gnu@4.22.5': + '@rollup/rollup-linux-s390x-gnu@4.34.8': optional: true - '@rollup/rollup-linux-x64-musl@4.22.5': + '@rollup/rollup-linux-x64-gnu@4.34.8': optional: true - '@rollup/rollup-win32-arm64-msvc@4.22.5': + '@rollup/rollup-linux-x64-musl@4.34.8': optional: true - '@rollup/rollup-win32-ia32-msvc@4.22.5': + '@rollup/rollup-win32-arm64-msvc@4.34.8': optional: true - '@rollup/rollup-win32-x64-msvc@4.22.5': + '@rollup/rollup-win32-ia32-msvc@4.34.8': optional: true - '@shikijs/core@1.20.0': + '@rollup/rollup-win32-x64-msvc@4.34.8': + optional: true + + '@shikijs/core@1.29.2': dependencies: - '@shikijs/engine-javascript': 1.20.0 - '@shikijs/engine-oniguruma': 1.20.0 - '@shikijs/types': 1.20.0 - '@shikijs/vscode-textmate': 9.2.2 + '@shikijs/engine-javascript': 1.29.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - hast-util-to-html: 9.0.3 + hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@1.20.0': + '@shikijs/engine-javascript@1.29.2': dependencies: - '@shikijs/types': 1.20.0 - '@shikijs/vscode-textmate': 9.2.2 - oniguruma-to-js: 0.4.3 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 2.3.0 - '@shikijs/engine-oniguruma@1.20.0': + '@shikijs/engine-oniguruma@1.29.2': dependencies: - '@shikijs/types': 1.20.0 - '@shikijs/vscode-textmate': 9.2.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/types@1.20.0': + '@shikijs/langs@1.29.2': dependencies: - '@shikijs/vscode-textmate': 9.2.2 + '@shikijs/types': 1.29.2 + + '@shikijs/themes@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + + '@shikijs/types@1.29.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@9.2.2': {} + '@shikijs/vscode-textmate@10.0.2': {} - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.3)))(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.3))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.2)(vite@6.1.1(@types/node@22.13.4)(yaml@2.7.0)))(svelte@5.20.2)(vite@6.1.1(@types/node@22.13.4)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.3)) - debug: 4.3.7 - svelte: 4.2.19 - vite: 5.4.8(@types/node@22.7.3) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.20.2)(vite@6.1.1(@types/node@22.13.4)(yaml@2.7.0)) + debug: 4.4.0 + svelte: 5.20.2 + vite: 6.1.1(@types/node@22.13.4)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.3))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.2)(vite@6.1.1(@types/node@22.13.4)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.3)))(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.3)) - debug: 4.3.7 + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.2)(vite@6.1.1(@types/node@22.13.4)(yaml@2.7.0)))(svelte@5.20.2)(vite@6.1.1(@types/node@22.13.4)(yaml@2.7.0)) + debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.11 - svelte: 4.2.19 - svelte-hmr: 0.16.0(svelte@4.2.19) - vite: 5.4.8(@types/node@22.7.3) - vitefu: 0.2.5(vite@5.4.8(@types/node@22.7.3)) + magic-string: 0.30.17 + svelte: 5.20.2 + vite: 6.1.1(@types/node@22.13.4)(yaml@2.7.0) + vitefu: 1.0.5(vite@6.1.1(@types/node@22.13.4)(yaml@2.7.0)) transitivePeerDependencies: - supports-color @@ -3479,27 +3422,6 @@ snapshots: dependencies: '@types/estree': 1.0.6 - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 - '@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.25.6 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 - - '@types/babel__traverse@7.20.6': - dependencies: - '@babel/types': 7.25.6 - '@types/cookie@0.6.0': {} '@types/debug@4.1.12': @@ -3516,6 +3438,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/js-yaml@4.0.9': {} + '@types/katex@0.16.7': {} '@types/mathjax@0.0.40': {} @@ -3534,19 +3458,23 @@ snapshots: '@types/node@17.0.45': {} + '@types/node@22.13.4': + dependencies: + undici-types: 6.20.0 + '@types/node@22.7.3': dependencies: undici-types: 6.19.8 - '@types/picomatch@2.3.3': {} + '@types/picomatch@3.0.2': {} '@types/sax@1.2.7': dependencies: - '@types/node': 17.0.45 + '@types/node': 22.7.3 '@types/tar@6.1.13': dependencies: - '@types/node': 22.7.3 + '@types/node': 22.13.4 minipass: 4.2.8 '@types/unist@2.0.11': {} @@ -3555,29 +3483,29 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.7.3 + '@types/node': 22.13.4 optional: true '@ungap/structured-clone@1.2.0': {} - '@volar/kit@2.4.5(typescript@5.6.2)': + '@volar/kit@2.4.11(typescript@5.7.3)': dependencies: - '@volar/language-service': 2.4.5 - '@volar/typescript': 2.4.5 + '@volar/language-service': 2.4.11 + '@volar/typescript': 2.4.11 typesafe-path: 0.2.2 - typescript: 5.6.2 + typescript: 5.7.3 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - '@volar/language-core@2.4.5': + '@volar/language-core@2.4.11': dependencies: - '@volar/source-map': 2.4.5 + '@volar/source-map': 2.4.11 - '@volar/language-server@2.4.5': + '@volar/language-server@2.4.11': dependencies: - '@volar/language-core': 2.4.5 - '@volar/language-service': 2.4.5 - '@volar/typescript': 2.4.5 + '@volar/language-core': 2.4.11 + '@volar/language-service': 2.4.11 + '@volar/typescript': 2.4.11 path-browserify: 1.0.1 request-light: 0.7.0 vscode-languageserver: 9.0.1 @@ -3585,18 +3513,18 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - '@volar/language-service@2.4.5': + '@volar/language-service@2.4.11': dependencies: - '@volar/language-core': 2.4.5 + '@volar/language-core': 2.4.11 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - '@volar/source-map@2.4.5': {} + '@volar/source-map@2.4.11': {} - '@volar/typescript@2.4.5': + '@volar/typescript@2.4.11': dependencies: - '@volar/language-core': 2.4.5 + '@volar/language-core': 2.4.11 path-browserify: 1.0.1 vscode-uri: 3.0.8 @@ -3610,17 +3538,15 @@ snapshots: '@vscode/l10n@0.0.18': {} - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.12.1 - - acorn@8.12.1: {} + acorn: 8.14.0 - agent-base@7.1.1: + acorn-typescript@1.4.13(acorn@8.14.0): dependencies: - debug: 4.3.7 - transitivePeerDependencies: - - supports-color + acorn: 8.14.0 + + acorn@8.14.0: {} ajv@8.17.1: dependencies: @@ -3637,10 +3563,6 @@ snapshots: ansi-regex@6.1.0: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -3666,19 +3588,21 @@ snapshots: astring@1.9.0: {} - astro-d2@0.5.2(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2)): + astro-d2@0.7.0(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0)): dependencies: - astro: 4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2) + astro: 5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0) + hast-util-from-html: 2.0.3 + hast-util-to-html: 9.0.5 unist-util-visit: 5.0.0 - astro-expressive-code@0.35.6(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2)): + astro-expressive-code@0.40.2(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0)): dependencies: - astro: 4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2) - rehype-expressive-code: 0.35.6 + astro: 5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0) + rehype-expressive-code: 0.40.2 astro-iconify@1.2.0: dependencies: - '@iconify/tools': 4.0.7 + '@iconify/tools': 4.1.1 node-fetch: 3.3.2 resolve-pkg: 2.0.0 svgo: 3.3.2 @@ -3686,77 +3610,89 @@ snapshots: - debug - supports-color - astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2): + astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0): dependencies: '@astrojs/compiler': 2.10.3 - '@astrojs/internal-helpers': 0.4.1 - '@astrojs/markdown-remark': 5.2.0 - '@astrojs/telemetry': 3.1.0 - '@babel/core': 7.25.2 - '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) - '@babel/types': 7.25.6 + '@astrojs/internal-helpers': 0.5.1 + '@astrojs/markdown-remark': 6.1.0 + '@astrojs/telemetry': 3.2.0 '@oslojs/encoding': 1.1.0 - '@rollup/pluginutils': 5.1.2(rollup@4.22.5) - '@types/babel__core': 7.20.5 + '@rollup/pluginutils': 5.1.4(rollup@4.34.8) '@types/cookie': 0.6.0 - acorn: 8.12.1 + acorn: 8.14.0 aria-query: 5.3.2 axobject-query: 4.1.0 - boxen: 7.1.1 - ci-info: 4.0.0 + boxen: 8.0.1 + ci-info: 4.1.0 clsx: 2.1.1 common-ancestor-path: 1.0.1 - cookie: 0.6.0 + cookie: 0.7.2 cssesc: 3.0.0 - debug: 4.3.7 + debug: 4.4.0 deterministic-object-hash: 2.0.2 devalue: 5.1.1 diff: 5.2.0 dlv: 1.1.3 dset: 3.1.4 - es-module-lexer: 1.5.4 - esbuild: 0.21.5 + es-module-lexer: 1.6.0 + esbuild: 0.24.2 estree-walker: 3.0.3 - fast-glob: 3.3.2 - fastq: 1.17.1 + fast-glob: 3.3.3 flattie: 1.1.1 github-slugger: 2.0.0 - gray-matter: 4.0.3 html-escaper: 3.0.3 http-cache-semantics: 4.1.1 js-yaml: 4.1.0 kleur: 4.1.5 - magic-string: 0.30.11 + magic-string: 0.30.17 magicast: 0.3.5 micromatch: 4.0.8 mrmime: 2.0.0 neotraverse: 0.6.18 - ora: 8.1.0 - p-limit: 6.1.0 - p-queue: 8.0.1 - preferred-pm: 4.0.0 + p-limit: 6.2.0 + p-queue: 8.1.0 + preferred-pm: 4.1.1 prompts: 2.4.2 - rehype: 13.0.1 - semver: 7.6.3 - shiki: 1.20.0 - string-width: 7.2.0 - strip-ansi: 7.1.0 - tinyexec: 0.3.0 - tsconfck: 3.1.3(typescript@5.6.2) + rehype: 13.0.2 + semver: 7.7.1 + shiki: 1.29.2 + tinyexec: 0.3.2 + tsconfck: 3.1.5(typescript@5.7.3) + ultrahtml: 1.5.3 unist-util-visit: 5.0.0 + unstorage: 1.14.4 vfile: 6.0.3 - vite: 5.4.8(@types/node@22.7.3) - vitefu: 1.0.2(vite@5.4.8(@types/node@22.7.3)) - which-pm: 3.0.0 - xxhash-wasm: 1.0.2 + vite: 6.1.1(@types/node@22.13.4)(yaml@2.7.0) + vitefu: 1.0.5(vite@6.1.1(@types/node@22.13.4)(yaml@2.7.0)) + which-pm: 3.0.1 + xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 - zod: 3.23.8 - zod-to-json-schema: 3.23.3(zod@3.23.8) - zod-to-ts: 1.2.0(typescript@5.6.2)(zod@3.23.8) + yocto-spinner: 0.2.0 + zod: 3.24.2 + zod-to-json-schema: 3.24.2(zod@3.24.2) + zod-to-ts: 1.2.0(typescript@5.7.3)(zod@3.24.2) optionalDependencies: sharp: 0.33.5 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' - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti - less - lightningcss - rollup @@ -3766,14 +3702,17 @@ snapshots: - sugarss - supports-color - terser + - tsx - typescript + - uploadthing + - yaml asynckit@0.4.0: {} - axios@1.7.7: + axios@1.7.9: dependencies: follow-redirects: 1.15.9 - form-data: 4.0.0 + form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -3792,50 +3731,36 @@ snapshots: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 - bidi-js@1.0.3: - dependencies: - require-from-string: 2.0.2 - binary-extensions@2.3.0: {} boolbase@1.0.0: {} - boxen@7.1.1: + boxen@8.0.1: dependencies: ansi-align: 3.0.1 - camelcase: 7.0.1 + camelcase: 8.0.0 chalk: 5.3.0 cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 + string-width: 7.2.0 + type-fest: 4.35.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.0 braces@3.0.3: dependencies: fill-range: 7.1.1 - browserslist@4.24.0: - dependencies: - caniuse-lite: 1.0.30001664 - electron-to-chromium: 1.5.29 - node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.0) - buffer-crc32@0.2.13: {} - camelcase@7.0.1: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 - caniuse-lite@1.0.30001664: {} + camelcase@8.0.0: {} ccount@2.0.1: {} - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - chalk@5.3.0: {} character-entities-html4@2.1.0: {} @@ -3853,20 +3778,20 @@ snapshots: css-what: 6.1.0 domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 cheerio@1.0.0: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 encoding-sniffer: 0.2.0 htmlparser2: 9.1.0 - parse5: 7.1.2 - parse5-htmlparser2-tree-adapter: 7.0.0 + parse5: 7.2.1 + parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 6.19.8 + undici: 6.21.1 whatwg-mimetype: 4.0.0 chokidar@3.6.0: @@ -3881,18 +3806,16 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chownr@2.0.0: {} - ci-info@4.0.0: {} + ci-info@4.1.0: {} cli-boxes@3.0.0: {} - cli-cursor@5.0.0: - dependencies: - restore-cursor: 5.1.0 - - cli-spinners@2.9.2: {} - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -3901,26 +3824,12 @@ snapshots: clsx@2.1.1: {} - code-red@1.0.4: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.6 - acorn: 8.12.1 - estree-walker: 3.0.3 - periscopic: 3.1.0 - collapse-white-space@2.1.0: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} color-string@1.9.1: @@ -3947,11 +3856,15 @@ snapshots: common-ancestor-path@1.0.1: {} - confbox@0.1.7: {} + confbox@0.1.8: {} + + cookie-es@1.2.2: {} - convert-source-map@2.0.0: {} + cookie@0.7.2: {} - cookie@0.6.0: {} + crossws@0.3.4: + dependencies: + uncrypto: 0.1.3 css-select@5.1.0: dependencies: @@ -3981,22 +3894,15 @@ snapshots: dependencies: css-tree: 2.2.1 - cssstyle@4.1.0: - dependencies: - rrweb-cssom: 0.7.1 - data-uri-to-buffer@4.0.1: {} - data-urls@5.0.0: - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - debug@4.3.7: dependencies: ms: 2.1.3 - decimal.js@10.4.3: {} + debug@4.4.0: + dependencies: + ms: 2.1.3 decode-named-character-reference@1.0.2: dependencies: @@ -4006,10 +3912,14 @@ snapshots: deepmerge@4.3.1: {} + defu@6.1.4: {} + delayed-stream@1.0.0: {} dequal@2.0.3: {} + destr@2.0.3: {} + detect-libc@2.0.3: {} deterministic-object-hash@2.0.2: @@ -4046,23 +3956,31 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dset@3.1.4: {} + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 - eastasianwidth@0.2.0: {} + dset@3.1.4: {} - electron-to-chromium@1.5.29: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 emmet@2.4.11: dependencies: '@emmetio/abbreviation': 2.3.3 '@emmetio/css-abbreviation': 2.1.8 + emoji-regex-xs@1.0.0: {} + emoji-regex@10.4.0: {} emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - encoding-sniffer@0.2.0: dependencies: iconv-lite: 0.6.3 @@ -4074,44 +3992,79 @@ snapshots: entities@4.5.0: {} - es-module-lexer@1.5.4: {} + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.6.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + 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.21.5: + esbuild@0.24.2: 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 + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 escalade@3.2.0: {} - escape-string-regexp@1.0.5: {} - escape-string-regexp@5.0.0: {} + esm-env@1.2.2: {} + esm@3.2.25: {} esprima@4.0.1: {} + esrap@1.4.5: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + estree-util-attach-comments@3.0.0: dependencies: '@types/estree': 1.0.6 @@ -4125,6 +4078,11 @@ snapshots: 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 @@ -4144,22 +4102,18 @@ snapshots: eventemitter3@5.0.1: {} - expressive-code@0.35.6: - dependencies: - '@expressive-code/core': 0.35.6 - '@expressive-code/plugin-frames': 0.35.6 - '@expressive-code/plugin-shiki': 0.35.6 - '@expressive-code/plugin-text-markers': 0.35.6 - - extend-shallow@2.0.1: + expressive-code@0.40.2: dependencies: - is-extendable: 0.1.1 + '@expressive-code/core': 0.40.2 + '@expressive-code/plugin-frames': 0.40.2 + '@expressive-code/plugin-shiki': 0.40.2 + '@expressive-code/plugin-text-markers': 0.40.2 extend@3.0.2: {} extract-zip@2.0.1: dependencies: - debug: 4.3.7 + debug: 4.4.0 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -4177,6 +4131,14 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + 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 + fast-uri@3.0.2: {} fastq@1.17.1: @@ -4212,10 +4174,11 @@ snapshots: follow-redirects@1.15.9: {} - form-data@4.0.0: + form-data@4.0.2: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 mime-types: 2.1.35 formdata-polyfill@4.0.10: @@ -4229,12 +4192,30 @@ snapshots: fsevents@2.3.3: optional: true - gensync@1.0.0-beta.2: {} + function-bind@1.1.2: {} get-caller-file@2.0.5: {} get-east-asian-width@1.2.0: {} + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.2 + 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-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@5.2.0: dependencies: pump: 3.0.2 @@ -4245,18 +4226,34 @@ snapshots: dependencies: is-glob: 4.0.3 - globals@11.12.0: {} + globals@15.15.0: {} + + gopd@1.2.0: {} graceful-fs@4.2.11: {} - gray-matter@4.0.3: + h3@1.15.0: dependencies: - js-yaml: 3.14.1 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 + cookie-es: 1.2.2 + crossws: 0.3.4 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.0 + ohash: 1.1.4 + radix3: 1.1.2 + ufo: 1.5.4 + uncrypto: 0.1.3 + + has-symbols@1.1.0: {} - has-flag@3.0.0: {} + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 hast-util-embedded@3.0.0: dependencies: @@ -4273,21 +4270,6 @@ snapshots: html-whitespace-sensitive-tag-names: 3.0.1 unist-util-visit-parents: 6.0.1 - hast-util-from-dom@5.0.0: - dependencies: - '@types/hast': 3.0.4 - hastscript: 8.0.0 - web-namespaces: 2.0.1 - - hast-util-from-html@2.0.1: - dependencies: - '@types/hast': 3.0.4 - devlop: 1.1.0 - hast-util-from-parse5: 8.0.1 - parse5: 7.1.2 - vfile: 6.0.3 - vfile-message: 4.0.2 - hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.4 @@ -4410,6 +4392,20 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 + hast-util-to-html@9.0.5: + 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: 7.0.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.0: dependencies: '@types/estree': 1.0.6 @@ -4471,9 +4467,13 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 - html-encoding-sniffer@4.0.0: + hastscript@9.0.1: dependencies: - whatwg-encoding: 3.1.1 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 html-escaper@3.0.3: {} @@ -4485,25 +4485,11 @@ snapshots: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 entities: 4.5.0 http-cache-semantics@4.1.1: {} - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.5: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - i18next@23.15.1: dependencies: '@babel/runtime': 7.25.6 @@ -4518,6 +4504,8 @@ snapshots: inline-style-parser@0.2.4: {} + iron-webcrypto@1.2.1: {} + is-absolute-url@4.0.1: {} is-alphabetical@2.0.1: {} @@ -4537,8 +4525,6 @@ snapshots: is-docker@3.0.0: {} - is-extendable@0.1.1: {} - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -4553,28 +4539,18 @@ snapshots: dependencies: is-docker: 3.0.0 - is-interactive@2.0.0: {} - is-number@7.0.0: {} is-plain-obj@4.1.0: {} - is-potential-custom-element-name@1.0.1: {} - - is-reference@3.0.2: + is-reference@3.0.3: dependencies: '@types/estree': 1.0.6 - is-unicode-supported@1.3.0: {} - - is-unicode-supported@2.1.0: {} - is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 - js-tokens@4.0.0: {} - js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -4584,40 +4560,8 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@23.2.0: - dependencies: - '@asamuzakjp/dom-selector': 2.0.2 - cssstyle: 4.1.0 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - is-potential-custom-element-name: 1.0.1 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - ws: 8.18.0 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jsesc@2.5.2: {} - json-schema-traverse@1.0.0: {} - json5@2.2.3: {} - jsonc-parser@2.3.1: {} jsonc-parser@3.3.1: {} @@ -4626,12 +4570,12 @@ snapshots: dependencies: commander: 8.3.0 - kind-of@6.0.3: {} - kleur@3.0.3: {} kleur@4.1.5: {} + klona@2.0.6: {} + kolorist@1.8.0: {} load-yaml-file@0.2.0: @@ -4641,10 +4585,15 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - local-pkg@0.5.0: + local-pkg@0.5.1: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + local-pkg@1.0.0: dependencies: - mlly: 1.7.1 - pkg-types: 1.2.0 + mlly: 1.7.4 + pkg-types: 1.3.1 locate-character@3.0.0: {} @@ -4654,22 +4603,15 @@ snapshots: lodash@4.17.21: {} - log-symbols@6.0.0: - dependencies: - chalk: 5.3.0 - is-unicode-supported: 1.3.0 - longest-streak@3.1.0: {} lower-case@2.0.2: dependencies: tslib: 2.7.0 - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 + lru-cache@10.4.3: {} - magic-string@0.30.11: + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -4683,6 +4625,8 @@ snapshots: markdown-table@3.0.3: {} + math-intrinsics@1.1.0: {} + mathjax-full@3.2.2: dependencies: esm: 3.2.25 @@ -4733,6 +4677,23 @@ snapshots: transitivePeerDependencies: - supports-color + 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-gfm-autolink-literal@2.0.1: dependencies: '@types/mdast': 4.0.4 @@ -4830,6 +4791,23 @@ snapshots: 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.1 @@ -4879,6 +4857,18 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 + 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 @@ -4910,6 +4900,25 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + 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.4 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + micromark-extension-directive@3.0.2: dependencies: devlop: 1.1.0 @@ -5031,8 +5040,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + 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 @@ -5046,6 +5055,12 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + 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.0: dependencies: devlop: 1.1.0 @@ -5053,6 +5068,13 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + 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 @@ -5070,6 +5092,11 @@ snapshots: micromark-util-character: 2.1.0 micromark-util-types: 2.0.0 + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.1 + micromark-factory-title@2.0.0: dependencies: micromark-factory-space: 2.0.0 @@ -5077,6 +5104,13 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + 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.0: dependencies: micromark-factory-space: 2.0.0 @@ -5084,30 +5118,61 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + 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.0: dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + micromark-util-chunked@2.0.0: dependencies: micromark-util-symbol: 2.0.0 + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-classify-character@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + 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.0: dependencies: micromark-util-chunked: 2.0.0 micromark-util-types: 2.0.0 + 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.1: dependencies: micromark-util-symbol: 2.0.0 + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-decode-string@2.0.0: dependencies: decode-named-character-reference: 1.0.2 @@ -5115,8 +5180,17 @@ snapshots: micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 + 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.0: {} + micromark-util-encode@2.0.1: {} + micromark-util-events-to-acorn@2.0.2: dependencies: '@types/acorn': 4.0.6 @@ -5130,20 +5204,36 @@ snapshots: micromark-util-html-tag-name@2.0.0: {} + micromark-util-html-tag-name@2.0.1: {} + micromark-util-normalize-identifier@2.0.0: dependencies: micromark-util-symbol: 2.0.0 + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-resolve-all@2.0.0: dependencies: micromark-util-types: 2.0.0 + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.1 + micromark-util-sanitize-uri@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 + 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.1: dependencies: devlop: 1.1.0 @@ -5151,10 +5241,21 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-util-subtokenize@2.0.4: + 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.0: {} + micromark-util-symbol@2.0.1: {} + micromark-util-types@2.0.0: {} + micromark-util-types@2.0.1: {} + micromark@4.0.0: dependencies: '@types/debug': 4.1.12 @@ -5177,6 +5278,28 @@ snapshots: transitivePeerDependencies: - supports-color + 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.4 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -5188,8 +5311,6 @@ snapshots: dependencies: mime-db: 1.52.0 - mimic-function@5.0.1: {} - minipass@3.3.6: dependencies: yallist: 4.0.0 @@ -5207,11 +5328,11 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.7.1: + mlly@1.7.4: dependencies: - acorn: 8.12.1 - pathe: 1.1.2 - pkg-types: 1.2.0 + acorn: 8.14.0 + pathe: 2.0.3 + pkg-types: 1.3.1 ufo: 1.5.4 mrmime@2.0.0: {} @@ -5222,6 +5343,8 @@ snapshots: nanoid@3.3.7: {} + nanoid@3.3.8: {} + neotraverse@0.6.18: {} nlcst-to-string@4.0.0: @@ -5235,13 +5358,15 @@ snapshots: node-domexception@1.0.0: {} + node-fetch-native@1.6.6: {} + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-releases@2.0.18: {} + node-mock-http@1.0.0: {} normalize-path@3.0.0: {} @@ -5251,35 +5376,29 @@ snapshots: dependencies: boolbase: 1.0.0 - once@1.4.0: + ofetch@1.4.1: dependencies: - wrappy: 1.0.2 + destr: 2.0.3 + node-fetch-native: 1.6.6 + ufo: 1.5.4 - onetime@7.0.0: - dependencies: - mimic-function: 5.0.1 + ohash@1.1.4: {} - oniguruma-to-js@0.4.3: + once@1.4.0: dependencies: - regex: 4.3.2 + wrappy: 1.0.2 - ora@8.1.0: + oniguruma-to-es@2.3.0: dependencies: - chalk: 5.3.0 - cli-cursor: 5.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.2.0 - strip-ansi: 7.1.0 + emoji-regex-xs: 1.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 p-limit@2.3.0: dependencies: p-try: 2.2.0 - p-limit@6.1.0: + p-limit@6.2.0: dependencies: yocto-queue: 1.1.1 @@ -5287,7 +5406,7 @@ snapshots: dependencies: p-limit: 2.3.0 - p-queue@8.0.1: + p-queue@8.1.0: dependencies: eventemitter3: 5.0.1 p-timeout: 6.1.2 @@ -5296,15 +5415,15 @@ snapshots: p-try@2.2.0: {} - package-manager-detector@0.2.0: {} + package-manager-detector@0.2.9: {} - pagefind@1.1.1: + pagefind@1.3.0: optionalDependencies: - '@pagefind/darwin-arm64': 1.1.1 - '@pagefind/darwin-x64': 1.1.1 - '@pagefind/linux-arm64': 1.1.1 - '@pagefind/linux-x64': 1.1.1 - '@pagefind/windows-x64': 1.1.1 + '@pagefind/darwin-arm64': 1.3.0 + '@pagefind/darwin-x64': 1.3.0 + '@pagefind/linux-arm64': 1.3.0 + '@pagefind/linux-x64': 1.3.0 + '@pagefind/windows-x64': 1.3.0 parse-entities@4.0.1: dependencies: @@ -5317,6 +5436,16 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.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 + parse-latin@7.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -5326,19 +5455,23 @@ snapshots: unist-util-visit-children: 3.0.0 vfile: 6.0.3 - parse5-htmlparser2-tree-adapter@7.0.0: + parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 - parse5: 7.1.2 + parse5: 7.2.1 parse5-parser-stream@7.1.2: dependencies: - parse5: 7.1.2 + parse5: 7.2.1 parse5@7.1.2: dependencies: entities: 4.5.0 + parse5@7.2.1: + dependencies: + entities: 4.5.0 + pascal-case@3.1.2: dependencies: no-case: 3.0.4 @@ -5350,16 +5483,14 @@ snapshots: pathe@1.1.2: {} - pend@1.2.0: {} + pathe@2.0.3: {} - periscopic@3.1.0: - dependencies: - '@types/estree': 1.0.6 - estree-walker: 3.0.3 - is-reference: 3.0.2 + pend@1.2.0: {} picocolors@1.1.0: {} + picocolors@1.1.1: {} + picomatch@2.3.1: {} picomatch@4.0.2: {} @@ -5370,11 +5501,11 @@ snapshots: dependencies: find-up: 4.1.0 - pkg-types@1.2.0: + pkg-types@1.3.1: dependencies: - confbox: 0.1.7 - mlly: 1.7.1 - pathe: 1.1.2 + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 postcss-nested@6.2.0(postcss@8.4.47): dependencies: @@ -5392,11 +5523,17 @@ snapshots: picocolors: 1.1.0 source-map-js: 1.2.1 - preferred-pm@4.0.0: + postcss@8.5.3: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preferred-pm@4.1.1: dependencies: find-up-simple: 1.0.0 find-yarn-workspace-root2: 1.2.16 - which-pm: 3.0.0 + which-pm: 3.0.1 prettier@2.8.7: optional: true @@ -5410,53 +5547,86 @@ snapshots: property-information@6.5.0: {} - proxy-from-env@1.1.0: {} + property-information@7.0.0: {} - psl@1.9.0: {} + proxy-from-env@1.1.0: {} pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - punycode@2.3.1: {} - - querystringify@2.2.0: {} - queue-microtask@1.2.3: {} + radix3@1.1.2: {} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + + 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@4.3.2: {} + 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-expressive-code@0.35.6: + rehype-expressive-code@0.40.2: dependencies: - expressive-code: 0.35.6 + expressive-code: 0.40.2 rehype-format@5.0.1: dependencies: '@types/hast': 3.0.4 hast-util-format: 1.1.0 - rehype-mathjax@6.0.0: + rehype-mathjax@7.0.0: dependencies: '@types/hast': 3.0.4 '@types/mathjax': 0.0.40 - hast-util-from-dom: 5.0.0 hast-util-to-text: 4.0.2 - jsdom: 23.2.0 + hastscript: 9.0.1 mathjax-full: 3.2.2 unified: 11.0.5 unist-util-visit-parents: 6.0.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate rehype-parse@9.0.0: dependencies: @@ -5470,12 +5640,26 @@ snapshots: hast-util-raw: 9.0.4 vfile: 6.0.3 + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.0 + transitivePeerDependencies: + - supports-color + rehype-stringify@10.0.0: dependencies: '@types/hast': 3.0.4 hast-util-to-html: 9.0.3 unified: 11.0.5 + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + rehype@13.0.1: dependencies: '@types/hast': 3.0.4 @@ -5483,6 +5667,13 @@ snapshots: rehype-stringify: 10.0.0 unified: 11.0.5 + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.0 + rehype-stringify: 10.0.0 + unified: 11.0.5 + remark-directive@3.0.0: dependencies: '@types/mdast': 4.0.4 @@ -5557,19 +5748,12 @@ snapshots: require-from-string@2.0.2: {} - requires-port@1.0.0: {} - resolve-from@5.0.0: {} resolve-pkg@2.0.0: dependencies: resolve-from: 5.0.0 - restore-cursor@5.1.0: - dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 - retext-latin@4.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -5597,32 +5781,31 @@ snapshots: reusify@1.0.4: {} - rollup@4.22.5: + rollup@4.34.8: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.22.5 - '@rollup/rollup-android-arm64': 4.22.5 - '@rollup/rollup-darwin-arm64': 4.22.5 - '@rollup/rollup-darwin-x64': 4.22.5 - '@rollup/rollup-linux-arm-gnueabihf': 4.22.5 - '@rollup/rollup-linux-arm-musleabihf': 4.22.5 - '@rollup/rollup-linux-arm64-gnu': 4.22.5 - '@rollup/rollup-linux-arm64-musl': 4.22.5 - '@rollup/rollup-linux-powerpc64le-gnu': 4.22.5 - '@rollup/rollup-linux-riscv64-gnu': 4.22.5 - '@rollup/rollup-linux-s390x-gnu': 4.22.5 - '@rollup/rollup-linux-x64-gnu': 4.22.5 - '@rollup/rollup-linux-x64-musl': 4.22.5 - '@rollup/rollup-win32-arm64-msvc': 4.22.5 - '@rollup/rollup-win32-ia32-msvc': 4.22.5 - '@rollup/rollup-win32-x64-msvc': 4.22.5 + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 fsevents: 2.3.3 - rrweb-cssom@0.6.0: {} - - rrweb-cssom@0.7.1: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -5631,19 +5814,10 @@ snapshots: sax@1.4.1: {} - saxes@6.0.0: - dependencies: - xmlchars: 2.2.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: {} + semver@7.7.1: {} + sharp@0.33.5: dependencies: color: 4.2.3 @@ -5670,30 +5844,32 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 - shiki@1.20.0: + shiki@1.29.2: dependencies: - '@shikijs/core': 1.20.0 - '@shikijs/engine-javascript': 1.20.0 - '@shikijs/engine-oniguruma': 1.20.0 - '@shikijs/types': 1.20.0 - '@shikijs/vscode-textmate': 9.2.2 + '@shikijs/core': 1.29.2 + '@shikijs/engine-javascript': 1.29.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/langs': 1.29.2 + '@shikijs/themes': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - signal-exit@4.1.0: {} - simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 sisteransi@1.0.5: {} - sitemap@7.1.2: + sitemap@8.0.0: dependencies: '@types/node': 17.0.45 '@types/sax': 1.2.7 arg: 5.0.2 sax: 1.4.1 + smol-toml@1.3.1: {} + source-map-js@1.2.1: {} source-map@0.7.4: {} @@ -5708,21 +5884,21 @@ snapshots: sprintf-js@1.0.3: {} - starlight-links-validator@0.12.1(@astrojs/starlight@0.28.2(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2)))(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2)): + starlight-links-validator@0.14.3(@astrojs/starlight@0.32.1(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0))): dependencies: - '@astrojs/starlight': 0.28.2(astro@4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2)) - '@types/picomatch': 2.3.3 - astro: 4.15.9(@types/node@22.7.3)(rollup@4.22.5)(typescript@5.6.2) + '@astrojs/starlight': 0.32.1(astro@5.3.0(@types/node@22.13.4)(rollup@4.34.8)(typescript@5.7.3)(yaml@2.7.0)) + '@types/picomatch': 3.0.2 github-slugger: 2.0.0 - hast-util-from-html: 2.0.1 + hast-util-from-html: 2.0.3 hast-util-has-property: 3.0.0 is-absolute-url: 4.0.1 kleur: 4.1.5 + mdast-util-mdx-jsx: 3.2.0 mdast-util-to-string: 4.0.0 picomatch: 4.0.2 unist-util-visit: 5.0.0 - - stdin-discarder@0.2.2: {} + transitivePeerDependencies: + - supports-color stream-replace-string@2.0.0: {} @@ -5732,12 +5908,6 @@ snapshots: 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@7.2.0: dependencies: emoji-regex: 10.4.0 @@ -5757,8 +5927,6 @@ snapshots: dependencies: ansi-regex: 6.1.0 - strip-bom-string@1.0.0: {} - strip-bom@3.0.0: {} style-to-object@0.4.4: @@ -5769,37 +5937,29 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - svelte-hmr@0.16.0(svelte@4.2.19): - dependencies: - svelte: 4.2.19 - - svelte2tsx@0.7.20(svelte@4.2.19)(typescript@5.6.2): + svelte2tsx@0.7.34(svelte@5.20.2)(typescript@5.7.3): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 4.2.19 - typescript: 5.6.2 + svelte: 5.20.2 + typescript: 5.7.3 - svelte@4.2.19: + svelte@5.20.2: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 '@types/estree': 1.0.6 - acorn: 8.12.1 + acorn: 8.14.0 + acorn-typescript: 1.4.13(acorn@8.14.0) aria-query: 5.3.2 axobject-query: 4.1.0 - code-red: 1.0.4 - css-tree: 2.3.1 - estree-walker: 3.0.3 - is-reference: 3.0.2 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 1.4.5 + is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.11 - periscopic: 3.1.0 + magic-string: 0.30.17 + zimmerframe: 1.1.2 svgo@3.3.2: dependencies: @@ -5811,8 +5971,6 @@ snapshots: csso: 5.0.5 picocolors: 1.1.0 - symbol-tree@3.2.4: {} - tar@6.2.1: dependencies: chownr: 2.0.0 @@ -5822,7 +5980,7 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - tinyexec@0.3.0: {} + tinyexec@0.3.2: {} to-fast-properties@2.0.0: {} @@ -5830,28 +5988,17 @@ snapshots: dependencies: is-number: 7.0.0 - tough-cookie@4.1.4: - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - - tr46@5.0.0: - dependencies: - punycode: 2.3.1 - trim-lines@3.0.1: {} trough@2.2.0: {} - tsconfck@3.1.3(typescript@5.6.2): + tsconfck@3.1.5(typescript@5.7.3): optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.3 tslib@2.7.0: {} - type-fest@2.19.0: {} + type-fest@4.35.0: {} typesafe-path@0.2.2: {} @@ -5859,13 +6006,19 @@ snapshots: dependencies: semver: 7.6.3 - typescript@5.6.2: {} + typescript@5.7.3: {} ufo@1.5.4: {} + ultrahtml@1.5.3: {} + + uncrypto@0.1.3: {} + undici-types@6.19.8: {} - undici@6.19.8: {} + undici-types@6.20.0: {} + + undici@6.21.1: {} unified@11.0.5: dependencies: @@ -5923,18 +6076,16 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - universalify@0.2.0: {} - - update-browserslist-db@1.1.1(browserslist@4.24.0): - dependencies: - browserslist: 4.24.0 - escalade: 3.2.0 - picocolors: 1.1.0 - - url-parse@1.5.10: + unstorage@1.14.4: dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 + anymatch: 3.1.3 + chokidar: 3.6.0 + destr: 2.0.3 + h3: 1.15.0 + lru-cache: 10.4.3 + node-fetch-native: 1.6.6 + ofetch: 1.4.1 + ufo: 1.5.4 util-deprecate@1.0.2: {} @@ -5953,61 +6104,58 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@5.4.8(@types/node@22.7.3): + vite@6.1.1(@types/node@22.13.4)(yaml@2.7.0): dependencies: - esbuild: 0.21.5 - postcss: 8.4.47 - rollup: 4.22.5 + esbuild: 0.24.2 + postcss: 8.5.3 + rollup: 4.34.8 optionalDependencies: - '@types/node': 22.7.3 + '@types/node': 22.13.4 fsevents: 2.3.3 + yaml: 2.7.0 - vitefu@0.2.5(vite@5.4.8(@types/node@22.7.3)): - optionalDependencies: - vite: 5.4.8(@types/node@22.7.3) - - vitefu@1.0.2(vite@5.4.8(@types/node@22.7.3)): + vitefu@1.0.5(vite@6.1.1(@types/node@22.13.4)(yaml@2.7.0)): optionalDependencies: - vite: 5.4.8(@types/node@22.7.3) + vite: 6.1.1(@types/node@22.13.4)(yaml@2.7.0) - volar-service-css@0.0.61(@volar/language-service@2.4.5): + volar-service-css@0.0.62(@volar/language-service@2.4.11): dependencies: vscode-css-languageservice: 6.3.1 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.5 + '@volar/language-service': 2.4.11 - volar-service-emmet@0.0.61(@volar/language-service@2.4.5): + volar-service-emmet@0.0.62(@volar/language-service@2.4.11): dependencies: '@emmetio/css-parser': 0.4.0 '@emmetio/html-matcher': 1.3.0 '@vscode/emmet-helper': 2.9.3 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.5 + '@volar/language-service': 2.4.11 - volar-service-html@0.0.61(@volar/language-service@2.4.5): + volar-service-html@0.0.62(@volar/language-service@2.4.11): dependencies: vscode-html-languageservice: 5.3.1 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.5 + '@volar/language-service': 2.4.11 - volar-service-prettier@0.0.61(@volar/language-service@2.4.5): + volar-service-prettier@0.0.62(@volar/language-service@2.4.11): dependencies: vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.5 + '@volar/language-service': 2.4.11 - volar-service-typescript-twoslash-queries@0.0.61(@volar/language-service@2.4.5): + volar-service-typescript-twoslash-queries@0.0.62(@volar/language-service@2.4.11): dependencies: vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.5 + '@volar/language-service': 2.4.11 - volar-service-typescript@0.0.61(@volar/language-service@2.4.5): + volar-service-typescript@0.0.62(@volar/language-service@2.4.11): dependencies: path-browserify: 1.0.1 semver: 7.6.3 @@ -6016,14 +6164,14 @@ snapshots: vscode-nls: 5.2.0 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.5 + '@volar/language-service': 2.4.11 - volar-service-yaml@0.0.61(@volar/language-service@2.4.5): + volar-service-yaml@0.0.62(@volar/language-service@2.4.11): dependencies: vscode-uri: 3.0.8 yaml-language-server: 1.15.0 optionalDependencies: - '@volar/language-service': 2.4.5 + '@volar/language-service': 2.4.11 vscode-css-languageservice@6.3.1: dependencies: @@ -6081,38 +6229,27 @@ snapshots: vscode-uri@3.0.8: {} - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - web-namespaces@2.0.1: {} web-streams-polyfill@3.3.3: {} - webidl-conversions@7.0.0: {} - whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 whatwg-mimetype@4.0.0: {} - whatwg-url@14.0.0: - dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 - which-pm-runs@1.1.0: {} - which-pm@3.0.0: + which-pm@3.0.1: dependencies: load-yaml-file: 0.2.0 wicked-good-xpath@1.3.0: {} - widest-line@4.0.1: + widest-line@5.0.0: dependencies: - string-width: 5.1.2 + string-width: 7.2.0 wrap-ansi@7.0.0: dependencies: @@ -6120,28 +6257,20 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: + wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 - string-width: 5.1.2 + string-width: 7.2.0 strip-ansi: 7.1.0 wrappy@1.0.2: {} - ws@8.18.0: {} - - xml-name-validator@5.0.0: {} - - xmlchars@2.2.0: {} - xmldom-sre@0.1.31: {} - xxhash-wasm@1.0.2: {} + xxhash-wasm@1.1.0: {} y18n@5.0.8: {} - yallist@3.1.1: {} - yallist@4.0.0: {} yaml-language-server@1.15.0: @@ -6163,6 +6292,9 @@ snapshots: yaml@2.5.1: {} + yaml@2.7.0: + optional: true + yargs-parser@21.1.1: {} yargs@17.7.2: @@ -6182,15 +6314,25 @@ snapshots: yocto-queue@1.1.1: {} - zod-to-json-schema@3.23.3(zod@3.23.8): + yocto-spinner@0.2.0: dependencies: - zod: 3.23.8 + yoctocolors: 2.1.1 + + yoctocolors@2.1.1: {} + + zimmerframe@1.1.2: {} - zod-to-ts@1.2.0(typescript@5.6.2)(zod@3.23.8): + zod-to-json-schema@3.24.2(zod@3.24.2): dependencies: - typescript: 5.6.2 - zod: 3.23.8 + zod: 3.24.2 + + zod-to-ts@1.2.0(typescript@5.7.3)(zod@3.24.2): + dependencies: + typescript: 5.7.3 + zod: 3.24.2 zod@3.23.8: {} + zod@3.24.2: {} + zwitch@2.0.4: {} diff --git a/public/d2/docs/cross-cats/cross-cats-0.svg b/public/d2/docs/cross-cats/cross-cats-0.svg deleted file mode 100644 index f971c40..0000000 --- a/public/d2/docs/cross-cats/cross-cats-0.svg +++ /dev/null @@ -1,959 +0,0 @@ -System OverviewOrder ServerSource ChainDestination ChainBitcoinAMB UserSolverReactorOracleChallengerSPVOracleSolverSPVUserSolverUser 3. resolve() => Quote4.1. initiate()4.2. Tokens O.6.1. optimisticPayout()C.6.1. dispute()C.9.2. proveOrderFulfilment()C.9.3. payout TokensC.7.1. verify()C.7.2. proveOrderFulfilment()C.7.3. payout TokensC.7.1. completeDispute()C.7.2. RewardC.7.3. Tokens1. Sign Message2. Signed Orders5.1. fill()5.2. TokensC.7.1. submit()C.7.1: verify()C.7.2. Send fill details5.1 transfer Bitcoin HeadersBitcoin HeadersC.8.1. Collect eventC.9.1. receiveMessage() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/cross-cats-1.svg b/public/d2/docs/cross-cats/cross-cats-1.svg deleted file mode 100644 index f74c363..0000000 --- a/public/d2/docs/cross-cats/cross-cats-1.svg +++ /dev/null @@ -1,959 +0,0 @@ -Optimistic ResolutionOrder ServerSource ChainDestination ChainBitcoinAMB UserSolverReactorOracleChallengerSPVOracleSolverSPVUserSolverUser 3. resolve() => Quote4.1. initiate()4.2. Tokens O.6.1. optimisticPayout()C.6.1. dispute()C.9.2. proveOrderFulfilment()C.9.3. payout TokensC.7.1. verify()C.7.2. proveOrderFulfilment()C.7.3. payout TokensC.7.1. completeDispute()C.7.2. RewardC.7.3. Tokens5.1. fill()5.2. TokensC.7.1. submit()C.7.1: verify()C.7.2. Send fill details5.1 transfer1. Sign Message2. Signed Orders Bitcoin HeadersBitcoin HeadersC.8.1. Collect eventC.9.1. receiveMessage() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/cross-cats-2.svg b/public/d2/docs/cross-cats/cross-cats-2.svg deleted file mode 100644 index 9a8e1dc..0000000 --- a/public/d2/docs/cross-cats/cross-cats-2.svg +++ /dev/null @@ -1,959 +0,0 @@ -Challenged UncontestedOrder ServerSource ChainDestination ChainBitcoinAMB UserSolverReactorOracleChallengerSPVOracleSolverSPVUserSolverUser 3. resolve() => Quote4.1. initiate()4.2. Tokens O.6.1. optimisticPayout()C.6.1. dispute()C.9.2. proveOrderFulfilment()C.9.3. payout TokensC.7.1. verify()C.7.2. proveOrderFulfilment()C.7.3. payout Tokens C.7.1. completeDispute()C.7.2. RewardC.7.3. Tokens5.1. fill()5.2. TokensC.7.1. submit()C.7.1: verify()C.7.2. Send fill details5.1 transfer1. Sign Message2. Signed Orders Bitcoin HeadersBitcoin HeadersC.8.1. Collect eventC.9.1. receiveMessage() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/cross-cats-3.svg b/public/d2/docs/cross-cats/cross-cats-3.svg deleted file mode 100644 index eea1098..0000000 --- a/public/d2/docs/cross-cats/cross-cats-3.svg +++ /dev/null @@ -1,959 +0,0 @@ -Order Fill Proven (VM)Order ServerSource ChainDestination ChainBitcoinAMB UserSolverReactorOracleChallengerSPVOracleSolverSPVUserSolverUser 3. resolve() => Quote4.1. initiate()4.2. Tokens O.6.1. optimisticPayout()C.6.1. dispute()C.9.2. proveOrderFulfilment()C.9.3. payout TokensC.7.1. verify()C.7.2. proveOrderFulfilment()C.7.3. payout TokensC.7.1. completeDispute()C.7.2. RewardC.7.3. Tokens5.1. fill()5.2. Tokens C.7.1. submit()C.7.1: verify()C.7.2. Send fill details5.1 transfer1. Sign Message2. Signed Orders Bitcoin HeadersBitcoin HeadersC.8.1. Collect eventC.9.1. receiveMessage() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/cross-cats-4.svg b/public/d2/docs/cross-cats/cross-cats-4.svg deleted file mode 100644 index 9498d87..0000000 --- a/public/d2/docs/cross-cats/cross-cats-4.svg +++ /dev/null @@ -1,959 +0,0 @@ -Local SPV ClientOrder ServerSource ChainDestination ChainBitcoinAMB UserSolverReactorOracleChallengerSPVOracleSolverSPVUserSolverUser 3. resolve() => Quote4.1. initiate()4.2. Tokens O.6.1. optimisticPayout()C.6.1. dispute()C.9.2. proveOrderFulfilment()C.9.3. payout Tokens C.7.1. verify()C.7.2. proveOrderFulfilment()C.7.3. payout TokensC.7.1. completeDispute()C.7.2. RewardC.7.3. Tokens5.1. fill()5.2. TokensC.7.1. submit()C.7.1: verify()C.7.2. Send fill details5.1 transfer1. Sign Message2. Signed Orders Bitcoin HeadersBitcoin HeadersC.8.1. Collect eventC.9.1. receiveMessage() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/cross-cats-5.svg b/public/d2/docs/cross-cats/cross-cats-5.svg deleted file mode 100644 index e2e7e67..0000000 --- a/public/d2/docs/cross-cats/cross-cats-5.svg +++ /dev/null @@ -1,959 +0,0 @@ -Remote SPV ClientOrder ServerSource ChainDestination ChainBitcoinAMB UserSolverReactorOracleChallengerSPVOracleSolverSPVUserSolverUser 3. resolve() => Quote4.1. initiate()4.2. Tokens O.6.1. optimisticPayout()C.6.1. dispute()C.9.2. proveOrderFulfilment()C.9.3. payout TokensC.7.1. verify()C.7.2. proveOrderFulfilment()C.7.3. payout TokensC.7.1. completeDispute()C.7.2. RewardC.7.3. Tokens5.1. fill()5.2. TokensC.7.1. submit()C.7.1: verify()C.7.2. Send fill details5.1 transfer1. Sign Message2. Signed Orders Bitcoin HeadersBitcoin HeadersC.8.1. Collect eventC.9.1. receiveMessage() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/underwriting-0.svg b/public/d2/docs/cross-cats/underwriting-0.svg deleted file mode 100644 index 03a8c01..0000000 --- a/public/d2/docs/cross-cats/underwriting-0.svg +++ /dev/null @@ -1,941 +0,0 @@ -IndexUserOrder ServerSolverUnderwriterReactorSPV OracleInputOutputInputOutputInputInput 1.1 Quote1.2 Quote2.1 Send Signed Order2.2 Broadcast Signed Order3.1 Submit Signed Order3.2 Pull Input4.1 Fill Order5.1 Purchase Order5.2 Pull Inputs from underwriter to solver6.1 Submit Proof6.2 Prove Bitcoin Transaction6.3 Pay underwriter - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/underwriting-1.svg b/public/d2/docs/cross-cats/underwriting-1.svg deleted file mode 100644 index 6169ca5..0000000 --- a/public/d2/docs/cross-cats/underwriting-1.svg +++ /dev/null @@ -1,941 +0,0 @@ -SetupUserOrder ServerSolverUnderwriterReactorSPV OracleInputOutputInputOutputInputInput 1.1 Quote1.2 Quote2.1 Send Signed Order2.2 Broadcast Signed Order3.1 Submit Signed Order3.2 Pull Input4.1 Fill Order5.1 Purchase Order5.2 Pull Inputs from underwriter to solver6.1 Submit Proof6.2 Prove Bitcoin Transaction6.3 Pay underwriter - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/underwriting-2.svg b/public/d2/docs/cross-cats/underwriting-2.svg deleted file mode 100644 index e1723c8..0000000 --- a/public/d2/docs/cross-cats/underwriting-2.svg +++ /dev/null @@ -1,947 +0,0 @@ -InitiationUserOrder ServerSolverUnderwriterReactorSPV OracleInputOutputInputOutputInputInput 1.1 Quote1.2 Quote2.1 Send Signed Order2.2 Broadcast Signed Order3.1 Submit Signed Order3.2 Pull Input4.1 Fill Order5.1 Purchase Order5.2 Pull Inputs from underwriter to solver6.1 Submit Proof6.2 Prove Bitcoin Transaction6.3 Pay underwriter - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/underwriting-3.svg b/public/d2/docs/cross-cats/underwriting-3.svg deleted file mode 100644 index ed06291..0000000 --- a/public/d2/docs/cross-cats/underwriting-3.svg +++ /dev/null @@ -1,947 +0,0 @@ -CompletionUserOrder ServerSolverUnderwriterReactorSPV OracleInputOutputInputOutputInputInput 1.1 Quote1.2 Quote2.1 Send Signed Order2.2 Broadcast Signed Order3.1 Submit Signed Order3.2 Pull Input4.1 Fill Order5.1 Purchase Order5.2 Pull Inputs from underwriter to solver6.1 Submit Proof6.2 Prove Bitcoin Transaction6.3 Pay underwriter - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/underwriting-4.svg b/public/d2/docs/cross-cats/underwriting-4.svg deleted file mode 100644 index c715d78..0000000 --- a/public/d2/docs/cross-cats/underwriting-4.svg +++ /dev/null @@ -1,947 +0,0 @@ -FinalisationUserOrder ServerSolverUnderwriterReactorSPV OracleInputOutputInputOutputInputInput 1.1 Quote1.2 Quote2.1 Send Signed Order2.2 Broadcast Signed Order3.1 Submit Signed Order3.2 Pull Input4.1 Fill Order5.1 Purchase Order5.2 Pull Inputs from underwriter to solver6.1 Submit Proof6.2 Prove Bitcoin Transaction6.3 Pay underwriter - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/underwriting-5.svg b/public/d2/docs/cross-cats/underwriting-5.svg deleted file mode 100644 index 9039b2b..0000000 --- a/public/d2/docs/cross-cats/underwriting-5.svg +++ /dev/null @@ -1,947 +0,0 @@ -IndexUserDeposit AddressOrder ServerSolverUnderwriterReactorSPV OracleInputOutputOutputInputOutputInputInput 1.1 Quote1.2 Quote2. Sign message to generate key3. Send BTC4.1 Request Signed Order4.2 Request Signed Order4.3 Signed Order4.4 Signed Order5.1 Submit Signed Order5.2 Pull Input Tokens6. Send Bitcoins7.1 Purchase Order7.2 Pull Inputs from underwriter to user8.1 Submit Proof8.2 Prove Bitcoin Transaction8.3 Pay underwriter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/underwriting-6.svg b/public/d2/docs/cross-cats/underwriting-6.svg deleted file mode 100644 index c604d91..0000000 --- a/public/d2/docs/cross-cats/underwriting-6.svg +++ /dev/null @@ -1,947 +0,0 @@ -SetupUserDeposit AddressOrder ServerSolverUnderwriterReactorSPV OracleInputOutputOutputInputOutputInputInput 1.1 Quote1.2 Quote2. Sign message to generate key3. Send BTC4.1 Request Signed Order4.2 Request Signed Order4.3 Signed Order4.4 Signed Order5.1 Submit Signed Order5.2 Pull Input Tokens6. Send Bitcoins7.1 Purchase Order7.2 Pull Inputs from underwriter to user8.1 Submit Proof8.2 Prove Bitcoin Transaction8.3 Pay underwriter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/underwriting-7.svg b/public/d2/docs/cross-cats/underwriting-7.svg deleted file mode 100644 index 1a38bdc..0000000 --- a/public/d2/docs/cross-cats/underwriting-7.svg +++ /dev/null @@ -1,953 +0,0 @@ -InitiationUserDeposit AddressOrder ServerSolverUnderwriterReactorSPV OracleInputOutputOutputInputOutputInputInput 1.1 Quote1.2 Quote2. Sign message to generate key3. Send BTC4.1 Request Signed Order4.2 Request Signed Order4.3 Signed Order4.4 Signed Order5.1 Submit Signed Order5.2 Pull Input Tokens6. Send Bitcoins7.1 Purchase Order7.2 Pull Inputs from underwriter to user8.1 Submit Proof8.2 Prove Bitcoin Transaction8.3 Pay underwriter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/underwriting-8.svg b/public/d2/docs/cross-cats/underwriting-8.svg deleted file mode 100644 index 7649b04..0000000 --- a/public/d2/docs/cross-cats/underwriting-8.svg +++ /dev/null @@ -1,953 +0,0 @@ -CompletionUserDeposit AddressOrder ServerSolverUnderwriterReactorSPV OracleInputOutputOutputInputOutputInputInput 1.1 Quote1.2 Quote2. Sign message to generate key3. Send BTC4.1 Request Signed Order4.2 Request Signed Order4.3 Signed Order4.4 Signed Order5.1 Submit Signed Order5.2 Pull Input Tokens6. Send Bitcoins7.1 Purchase Order7.2 Pull Inputs from underwriter to user8.1 Submit Proof8.2 Prove Bitcoin Transaction8.3 Pay underwriter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/cross-cats/underwriting-9.svg b/public/d2/docs/cross-cats/underwriting-9.svg deleted file mode 100644 index 9784beb..0000000 --- a/public/d2/docs/cross-cats/underwriting-9.svg +++ /dev/null @@ -1,953 +0,0 @@ -FinalisationUserDeposit AddressOrder ServerSolverUnderwriterReactorSPV OracleInputOutputOutputInputOutputInputInput 1.1 Quote1.2 Quote2. Sign message to generate key3. Send BTC4.1 Request Signed Order4.2 Request Signed Order4.3 Signed Order4.4 Signed Order5.1 Submit Signed Order5.2 Pull Input Tokens6. Send Bitcoins7.1 Purchase Order7.2 Pull Inputs from underwriter to user8.1 Submit Proof8.2 Prove Bitcoin Transaction8.3 Pay underwriter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/d2/docs/index-0.svg b/public/d2/docs/index-0.svg new file mode 100644 index 0000000..7b3d48c --- /dev/null +++ b/public/d2/docs/index-0.svg @@ -0,0 +1,936 @@ +Catalyst OverviewOutput ChainInput ChainRemote OracleLocal OracleUserLockSettlerSolverSolverFillerUser 4. Relay fill0. Deposit5. Check Fill6. Unlock Funds7. Payment1. Order Fill2. Payment3. Check Fill + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/d2/docs/protocol/liquidity-pools-0.svg b/public/d2/docs/protocol/liquidity-pools-0.svg index 6d2ada1..8175722 100644 --- a/public/d2/docs/protocol/liquidity-pools-0.svg +++ b/public/d2/docs/protocol/liquidity-pools-0.svg @@ -1,9 +1,9 @@ -All Available RoutesVault ETHVault PolygonVault BSCEtherwBTCUnitsDAIMaticUnitsBNBUnitsUSDC - - - - - - - - - - - - - - -Ether to wBTCVault ETHVault PolygonVault BSCEtherwBTCUnitsDAIMaticUnitsBNBUnitsUSDC - - - - - - - - - - - - - - -DAI to USDCVault ETHVault PolygonVault BSCEtherwBTCUnitsDAIMaticUnitsBNBUnitsUSDC - - - - - - - - - - - - - - +}]]>All Available RoutesVault ETHVault PolygonVault BSCEtherwBTCUnitsDAIMaticUnitsBNBUnitsUSDC + + + + + + + + + + + + + + +Ether to wBTCVault ETHVault PolygonVault BSCEtherwBTCUnitsDAIMaticUnitsBNBUnitsUSDC + + + + + + + + + + + + + + +DAI to USDCVault ETHVault PolygonVault BSCEtherwBTCUnitsDAIMaticUnitsBNBUnitsUSDC + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/d2/docs/protocol/tx-lifecycle-0.svg b/public/d2/docs/protocol/tx-lifecycle-0.svg index 58257e2..7a96de2 100644 --- a/public/d2/docs/protocol/tx-lifecycle-0.svg +++ b/public/d2/docs/protocol/tx-lifecycle-0.svg @@ -1,23 +1,23 @@ -AMBChain AChain BSenderVault ACCI AGARP ARecipientVault BCCI BGARP B Assets to unitsPack SwapIncentives Deliver AssetsSwap ContextCollect ProofDeliver Proof - - - - - - - - - - - - - - - - - - - + .d2-3208017872 .fill-N1{fill:#0A0F25;} + .d2-3208017872 .fill-N2{fill:#676C7E;} + .d2-3208017872 .fill-N3{fill:#9499AB;} + .d2-3208017872 .fill-N4{fill:#CFD2DD;} + .d2-3208017872 .fill-N5{fill:#DEE1EB;} + .d2-3208017872 .fill-N6{fill:#EEF1F8;} + .d2-3208017872 .fill-N7{fill:#FFFFFF;} + .d2-3208017872 .fill-B1{fill:#0D32B2;} + .d2-3208017872 .fill-B2{fill:#0D32B2;} + .d2-3208017872 .fill-B3{fill:#E3E9FD;} + .d2-3208017872 .fill-B4{fill:#E3E9FD;} + .d2-3208017872 .fill-B5{fill:#EDF0FD;} + .d2-3208017872 .fill-B6{fill:#F7F8FE;} + .d2-3208017872 .fill-AA2{fill:#4A6FF3;} + .d2-3208017872 .fill-AA4{fill:#EDF0FD;} + .d2-3208017872 .fill-AA5{fill:#F7F8FE;} + .d2-3208017872 .fill-AB4{fill:#EDF0FD;} + .d2-3208017872 .fill-AB5{fill:#F7F8FE;} + .d2-3208017872 .stroke-N1{stroke:#0A0F25;} + .d2-3208017872 .stroke-N2{stroke:#676C7E;} + .d2-3208017872 .stroke-N3{stroke:#9499AB;} + .d2-3208017872 .stroke-N4{stroke:#CFD2DD;} + .d2-3208017872 .stroke-N5{stroke:#DEE1EB;} + .d2-3208017872 .stroke-N6{stroke:#EEF1F8;} + .d2-3208017872 .stroke-N7{stroke:#FFFFFF;} + .d2-3208017872 .stroke-B1{stroke:#0D32B2;} + .d2-3208017872 .stroke-B2{stroke:#0D32B2;} + .d2-3208017872 .stroke-B3{stroke:#E3E9FD;} + .d2-3208017872 .stroke-B4{stroke:#E3E9FD;} + .d2-3208017872 .stroke-B5{stroke:#EDF0FD;} + .d2-3208017872 .stroke-B6{stroke:#F7F8FE;} + .d2-3208017872 .stroke-AA2{stroke:#4A6FF3;} + .d2-3208017872 .stroke-AA4{stroke:#EDF0FD;} + .d2-3208017872 .stroke-AA5{stroke:#F7F8FE;} + .d2-3208017872 .stroke-AB4{stroke:#EDF0FD;} + .d2-3208017872 .stroke-AB5{stroke:#F7F8FE;} + .d2-3208017872 .background-color-N1{background-color:#0A0F25;} + .d2-3208017872 .background-color-N2{background-color:#676C7E;} + .d2-3208017872 .background-color-N3{background-color:#9499AB;} + .d2-3208017872 .background-color-N4{background-color:#CFD2DD;} + .d2-3208017872 .background-color-N5{background-color:#DEE1EB;} + .d2-3208017872 .background-color-N6{background-color:#EEF1F8;} + .d2-3208017872 .background-color-N7{background-color:#FFFFFF;} + .d2-3208017872 .background-color-B1{background-color:#0D32B2;} + .d2-3208017872 .background-color-B2{background-color:#0D32B2;} + .d2-3208017872 .background-color-B3{background-color:#E3E9FD;} + .d2-3208017872 .background-color-B4{background-color:#E3E9FD;} + .d2-3208017872 .background-color-B5{background-color:#EDF0FD;} + .d2-3208017872 .background-color-B6{background-color:#F7F8FE;} + .d2-3208017872 .background-color-AA2{background-color:#4A6FF3;} + .d2-3208017872 .background-color-AA4{background-color:#EDF0FD;} + .d2-3208017872 .background-color-AA5{background-color:#F7F8FE;} + .d2-3208017872 .background-color-AB4{background-color:#EDF0FD;} + .d2-3208017872 .background-color-AB5{background-color:#F7F8FE;} + .d2-3208017872 .color-N1{color:#0A0F25;} + .d2-3208017872 .color-N2{color:#676C7E;} + .d2-3208017872 .color-N3{color:#9499AB;} + .d2-3208017872 .color-N4{color:#CFD2DD;} + .d2-3208017872 .color-N5{color:#DEE1EB;} + .d2-3208017872 .color-N6{color:#EEF1F8;} + .d2-3208017872 .color-N7{color:#FFFFFF;} + .d2-3208017872 .color-B1{color:#0D32B2;} + .d2-3208017872 .color-B2{color:#0D32B2;} + .d2-3208017872 .color-B3{color:#E3E9FD;} + .d2-3208017872 .color-B4{color:#E3E9FD;} + .d2-3208017872 .color-B5{color:#EDF0FD;} + .d2-3208017872 .color-B6{color:#F7F8FE;} + .d2-3208017872 .color-AA2{color:#4A6FF3;} + .d2-3208017872 .color-AA4{color:#EDF0FD;} + .d2-3208017872 .color-AA5{color:#F7F8FE;} + .d2-3208017872 .color-AB4{color:#EDF0FD;} + .d2-3208017872 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}@media screen and (prefers-color-scheme:dark){ + .d2-3208017872 .fill-N1{fill:#CDD6F4;} + .d2-3208017872 .fill-N2{fill:#BAC2DE;} + .d2-3208017872 .fill-N3{fill:#A6ADC8;} + .d2-3208017872 .fill-N4{fill:#585B70;} + .d2-3208017872 .fill-N5{fill:#45475A;} + .d2-3208017872 .fill-N6{fill:#313244;} + .d2-3208017872 .fill-N7{fill:#1E1E2E;} + .d2-3208017872 .fill-B1{fill:#CBA6f7;} + .d2-3208017872 .fill-B2{fill:#CBA6f7;} + .d2-3208017872 .fill-B3{fill:#6C7086;} + .d2-3208017872 .fill-B4{fill:#585B70;} + .d2-3208017872 .fill-B5{fill:#45475A;} + .d2-3208017872 .fill-B6{fill:#313244;} + .d2-3208017872 .fill-AA2{fill:#f38BA8;} + .d2-3208017872 .fill-AA4{fill:#45475A;} + .d2-3208017872 .fill-AA5{fill:#313244;} + .d2-3208017872 .fill-AB4{fill:#45475A;} + .d2-3208017872 .fill-AB5{fill:#313244;} + .d2-3208017872 .stroke-N1{stroke:#CDD6F4;} + .d2-3208017872 .stroke-N2{stroke:#BAC2DE;} + .d2-3208017872 .stroke-N3{stroke:#A6ADC8;} + .d2-3208017872 .stroke-N4{stroke:#585B70;} + .d2-3208017872 .stroke-N5{stroke:#45475A;} + .d2-3208017872 .stroke-N6{stroke:#313244;} + .d2-3208017872 .stroke-N7{stroke:#1E1E2E;} + .d2-3208017872 .stroke-B1{stroke:#CBA6f7;} + .d2-3208017872 .stroke-B2{stroke:#CBA6f7;} + .d2-3208017872 .stroke-B3{stroke:#6C7086;} + .d2-3208017872 .stroke-B4{stroke:#585B70;} + .d2-3208017872 .stroke-B5{stroke:#45475A;} + .d2-3208017872 .stroke-B6{stroke:#313244;} + .d2-3208017872 .stroke-AA2{stroke:#f38BA8;} + .d2-3208017872 .stroke-AA4{stroke:#45475A;} + .d2-3208017872 .stroke-AA5{stroke:#313244;} + .d2-3208017872 .stroke-AB4{stroke:#45475A;} + .d2-3208017872 .stroke-AB5{stroke:#313244;} + .d2-3208017872 .background-color-N1{background-color:#CDD6F4;} + .d2-3208017872 .background-color-N2{background-color:#BAC2DE;} + .d2-3208017872 .background-color-N3{background-color:#A6ADC8;} + .d2-3208017872 .background-color-N4{background-color:#585B70;} + .d2-3208017872 .background-color-N5{background-color:#45475A;} + .d2-3208017872 .background-color-N6{background-color:#313244;} + .d2-3208017872 .background-color-N7{background-color:#1E1E2E;} + .d2-3208017872 .background-color-B1{background-color:#CBA6f7;} + .d2-3208017872 .background-color-B2{background-color:#CBA6f7;} + .d2-3208017872 .background-color-B3{background-color:#6C7086;} + .d2-3208017872 .background-color-B4{background-color:#585B70;} + .d2-3208017872 .background-color-B5{background-color:#45475A;} + .d2-3208017872 .background-color-B6{background-color:#313244;} + .d2-3208017872 .background-color-AA2{background-color:#f38BA8;} + .d2-3208017872 .background-color-AA4{background-color:#45475A;} + .d2-3208017872 .background-color-AA5{background-color:#313244;} + .d2-3208017872 .background-color-AB4{background-color:#45475A;} + .d2-3208017872 .background-color-AB5{background-color:#313244;} + .d2-3208017872 .color-N1{color:#CDD6F4;} + .d2-3208017872 .color-N2{color:#BAC2DE;} + .d2-3208017872 .color-N3{color:#A6ADC8;} + .d2-3208017872 .color-N4{color:#585B70;} + .d2-3208017872 .color-N5{color:#45475A;} + .d2-3208017872 .color-N6{color:#313244;} + .d2-3208017872 .color-N7{color:#1E1E2E;} + .d2-3208017872 .color-B1{color:#CBA6f7;} + .d2-3208017872 .color-B2{color:#CBA6f7;} + .d2-3208017872 .color-B3{color:#6C7086;} + .d2-3208017872 .color-B4{color:#585B70;} + .d2-3208017872 .color-B5{color:#45475A;} + .d2-3208017872 .color-B6{color:#313244;} + .d2-3208017872 .color-AA2{color:#f38BA8;} + .d2-3208017872 .color-AA4{color:#45475A;} + .d2-3208017872 .color-AA5{color:#313244;} + .d2-3208017872 .color-AB4{color:#45475A;} + .d2-3208017872 .color-AB5{color:#313244;}.appendix text.text{fill:#CDD6F4}.md{--color-fg-default:#CDD6F4;--color-fg-muted:#BAC2DE;--color-fg-subtle:#A6ADC8;--color-canvas-default:#1E1E2E;--color-canvas-subtle:#313244;--color-border-default:#CBA6f7;--color-border-muted:#CBA6f7;--color-neutral-muted:#313244;--color-accent-fg:#CBA6f7;--color-accent-emphasis:#CBA6f7;--color-attention-subtle:#BAC2DE;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-B2{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-B3{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-B4{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-B5{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B6{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-AA2{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-AA4{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-AA5{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-AB4{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-AB5{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N1{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N2{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N5{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N6{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N7{fill:url(#streaks-darker);mix-blend-mode:lighten}.light-code{display: none}.dark-code{display: block}}]]>AMBChain AChain BSenderVault ACCI AGARP ARecipientVault BCCI BGARP B Assets to unitsPack SwapIncentives Deliver AssetsSwap ContextCollect ProofDeliver Proof + + + + + + + + + + + + + + + + + + + diff --git a/src/content/docs/cross-cats/ERC7683.md b/src/content/docs/cross-cats/ERC7683.md deleted file mode 100644 index 46fb312..0000000 --- a/src/content/docs/cross-cats/ERC7683.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "ERC7863 Compatibility" -description: "CrossCats is ERC7863 compatible with a few non-breaking changes." -sidebar: - order: 1000 ---- - -Catalyst is [ERC-7683](https://eips.ethereum.org/EIPS/eip-7683)* compatible. *The implementation differs in 2 ways: - -1. A Catalyst [OrderKey](https://github.com/catalystdao/cross-cats/blob/7e07281eef10ffadc10f9f75eb42d1c2419224ca/src/interfaces/Structs.sol#L41-L65) is returned on `initiate(...)`. For implementations that wants to verify that orders were correctly collected, this adds an option for further data validation. This change is compatible with ERC-7683 since it does not change any function signatures and ERC-7683 specifies that the function has no return. For naive implementations this slightly increases gas costs as Solidity always places `RETURNDATACOPY` after external calls. -2. ERC-7683 defines the 2 elements of `Output`: `token` and `recipient` to be type `address`. The type of both elements have been changed to `bytes32`. Solidity ABI encoding encodes structs elements such that they fill 32 bytes. As a result, all returned objects of `ResolvedCrossChainOrder` remains compatible with implementations that assumes these are `address` (except when read, those values are truncated). When possible, important contextual information is placed in the 20 rightmost bytes. Off-chain listeners should always read the entire 32 bytes. diff --git a/src/content/docs/cross-cats/callbacks.md b/src/content/docs/cross-cats/callbacks.md deleted file mode 100644 index b25d056..0000000 --- a/src/content/docs/cross-cats/callbacks.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "Asset Delivery Callbacks" -description: "CrossCats supports callbacks on both output delivery and input delivery." -sidebar: - order: 101 ---- - -CrossCats supporting making external on delivery of assets. However, there are several important implementation quirks that you need to be aware of. - -```solidity -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.0; - -/** - * @notice Implement callback handling for CrossCats payouts, both outputs and inputs. - * @dev Callbacks are opt-in. If you opt-in, take care to not revert. - * Funds are likely in danger if the calls revert. Please be careful. - * - * If you don't need this functionality, stay away. - * To enable for outputs, set `remoteCall` to the calldata. recipient is called. - * To enable for inputs, use fillerData version 2. You set a hash of the data. - * The first 20 bytes of the data is called. - */ -interface ICrossCatsCallback { - /** - * @notice If configured, is called when the output is filled on the destination chain. - * @dev If the transaction reverts, 1 million gas is provided. - * If the transaction doesn't revert, only enough gas to execute the transaction is given + a buffer of 1/63'th. - * The recipient is called. - * If the call reverts, funds are still delivered to the recipient. - * Please ensure that funds are safely handled on your side. - */ - function outputFilled(bytes32 token, uint256 amount, bytes calldata executionData) external; - - /** - * @notice If configured, is called when the input is sent to the filler. - * May be called for under the following conditions: - * - The inputs is purchased by someone else (/UW) - * - The inputs are optimistically refunded. - * - Output delivery was proven. - * - * You can use this function to add custom conditions to purchasing an order / uw. - * If you revert, your order cannot be purchased. - * @dev If this call reverts / uses a ton of gas, the data has to be modified (modifyOrderFillerdata) - * This function can ONLY be called by the filler itself rather than anyone. - * If the fillerAddress is unable to call modifyOrderFillerdata, take care to ensure the function - * never reverts as otherwise the inputs are locked. - * - * executionData is never explicitly provided on chain, only a hash of it is. If this is not - * publicly known, it can act as a kind of secret and people cannot call the main functions. - * If you lose it you will have to call modifyOrderFillerdata which only the registered filler can. - * - * The address to call is the first 20 bytes of the data to execute. - * - * @param orderKeyHash Hash of the order key. Can be used for identification. - * @param executionData Custom data that the filler asked to be provided with the call. - */ - function inputsFilled(bytes32 orderKeyHash, bytes calldata executionData) external; -} -``` - -(WIP) - -## Output delivery - -## Input Delivery diff --git a/src/content/docs/cross-cats/cross-cats.mdx b/src/content/docs/cross-cats/cross-cats.mdx deleted file mode 100644 index 6d2cd2b..0000000 --- a/src/content/docs/cross-cats/cross-cats.mdx +++ /dev/null @@ -1,1356 +0,0 @@ ---- -title: "CrossCats: Solving Liquidity x Bitcoin" -description: "Catalyst v2 will support Bitcoin swaps. This is facilitated through intent based swaps that are verified through an on-chain Bitcoin SPV client. This provides: Fast settlement, Competitive rates, and near full security." -sidebar: - order: 1 ---- - -import { Tabs, TabItem } from '@astrojs/starlight/components'; - -CrossCats is an intent-based cross-chain swap protocol built with flexibility in mind. The core idea is to allow anyone to create a request for anything provable. At launch, EVM settlements and Bitcoin transactions will be part of the provable set. Bitcoin transactions are proven using a Bitcoin SPV client and allows VM chain payments to be conditional on Bitcoin transactions. - - - ```d2 target=root - style.fill: transparent - direction: right - - vars: { - default-opacity: 0.1 - } - - title: System Overview { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - Order Server: {shape: cloud} - - Source Chain: { - User: { - shape: person - } - Solver: { - style.fill-pattern: none - } - Reactor: {shape: page} - Oracle: { - style.opacity: ${default-opacity} - shape: page - } - Challenger: {style.opacity: ${default-opacity}} - SPV: { - style.opacity: ${default-opacity} - shape: page - } - - Solver -> Reactor: 3. resolve() => Quote - Solver -> Reactor: 4.1. initiate() - User -> Reactor: 4.2. Tokens - - # Optimistic Payout - Solver <-> Reactor: O.6.1. optimisticPayout() {style.opacity: ${default-opacity}} - - # Challenge Parts - Challenger -> Reactor: C.6.1. dispute() {style.opacity: ${default-opacity}} - - # - Challenged Rejected (VM) - Oracle -> Reactor: C.9.2. proveOrderFulfilment() {style.opacity: ${default-opacity}} - Reactor -> Solver: C.9.3. payout Tokens {style.opacity: ${default-opacity}} - - # - Challenged Rejected (Bitcoin) - Solver -> SPV: C.7.1. verify() {style.opacity: ${default-opacity}} - SPV -> Reactor: C.7.2. proveOrderFulfilment() {style.opacity: ${default-opacity}} - Reactor -> Solver: C.7.3. payout Tokens {style.opacity: ${default-opacity}} - - # - Challenged Accepted - Challenger -> Reactor: C.7.1. completeDispute() {style.opacity: ${default-opacity}} - Reactor -> Challenger: C.7.2. Reward {style.opacity: ${default-opacity}} - Reactor -> User: C.7.3. Tokens {style.opacity: ${default-opacity}} - } - - Source Chain.User -> Order Server: 1. Sign Message {style.animated: false} - Order Server -> Source Chain.Solver: 2. Signed Orders - - Destination Chain: { - Oracle: { - shape: page - } - Solver - SPV: { - style.opacity: ${default-opacity} - shape: page - } - User: { - shape: person - } - - # Ordinary - Solver -> Oracle: 5.1. fill() - Solver -> User: 5.2. Tokens - - # Challenged submit proof (VM) - Solver -> Oracle: C.7.1. submit() {style.opacity: ${default-opacity}} - - # Challenged submit proof (Bitcoin) - Solver -> SPV: C.7.1: verify() {style.opacity: ${default-opacity}} - SPV -> Oracle: C.7.2. Send fill details {style.opacity: ${default-opacity}} - } - - Bitcoin: { - Solver: { - style.opacity: ${default-opacity} - } - User: { - shape: person - style.opacity: ${default-opacity} - } - - Solver -> User: 5.1 transfer {style.opacity: ${default-opacity}} - style.opacity: ${default-opacity} - } - - Bitcoin -> Destination Chain.SPV: Bitcoin Headers { - style.opacity: ${default-opacity} - style.stroke-dash: 4 - } - Bitcoin -> Source Chain.SPV: Bitcoin Headers { - style.opacity: ${default-opacity} - style.stroke-dash: 4 - } - - Proof: "AMB\n" { - shape: cloud - style.opacity: ${default-opacity} - } - - Destination Chain.Oracle -> Proof: C.8.1. Collect event {style.opacity: ${default-opacity}} - Proof -> Source Chain.Oracle: C.9.1. receiveMessage() {style.opacity: ${default-opacity}} - - scenarios: { - optimistic resolution: { - title.label: Optimistic Resolution - Source Chain: { - (Solver <-> Reactor)[0].style.opacity: 1 - - (Solver <-> Reactor)[0].style.stroke-width: 3 - } - } - challenged: { - title.label: Challenged - Source Chain.Challenger.style.opacity: 1 - Source Chain.(Challenger -> Reactor)[0].style.opacity: 1 - Source Chain.(Challenger -> Reactor)[0]: C.6.1. dispute() - - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 3 - - scenarios: { - challenged uncontested: { - title.label: Challenged Uncontested - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - Source Chain.(Challenger -> Reactor)[1].style.opacity: 1 - Source Chain.(Challenger -> Reactor)[1]: C.7.1. completeDispute() - - Source Chain.(Challenger -> Reactor)[1].style.stroke-width: 3 - Source Chain.(Reactor -> Challenger)[0].style.opacity: 1 - Source Chain.(Reactor -> User)[0].style.opacity: 1 - Destination Chain.style.opacity: ${default-opacity} - Destination Chain.*.style.opacity: ${default-opacity} - Destination Chain.(* -> *)[*].style.opacity: ${default-opacity} - } - order fill proven (VM): { - title.label: Order Fill Proven (VM) - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - - Destination Chain.(Solver -> Oracle)[1].style.opacity: 1 - Destination Chain.(Solver -> Oracle)[1].style.stroke-width: 3 - Destination Chain.Oracle.style.opacity: 1 - Proof.style.opacity: 1 - (Destination Chain.Oracle -> Proof)[0].style.opacity: 1 - (Proof -> Source Chain.oracle)[0].style.opacity: 1 - Source Chain.Oracle.style.opacity: 1 - Source Chain.(Oracle -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[0].style.opacity: 1 - } - order fill proven (BTC): { - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - Destination Chain.style.opacity: ${default-opacity} - Destination Chain.*.style.opacity: ${default-opacity} - Destination Chain.(* -> *)[*].style.opacity: ${default-opacity} - Bitcoin.style.opacity: 1 - Bitcoin.*.style.opacity: 1 - Bitcoin.(* -> *)[*].style.opacity: 1 - - scenarios: { - local SPV client: { - title.label: Local SPV Client - (Bitcoin -> Source Chain.SPV)[0].style.opacity: 1 - Source Chain.SPV.style.opacity: 1 - - Source Chain.(Solver -> SPV)[0].style.opacity: 1 - Source Chain.(Solver -> SPV)[0].style.stroke-width: 3 - Source Chain.(SPV -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[1].style.opacity: 1 - } - remote SPV client: { - title.label: Remote SPV Client - (Bitcoin -> Destination Chain.SPV)[0].style.opacity: 1 - Destination Chain.SPV.style.opacity: 1 - - Destination Chain.style.opacity: 1 - Destination Chain.Solver.style.opacity: 1 - Destination Chain.(Solver -> SPV)[0].style.opacity: 1 - Destination Chain.SPV.style.opacity: 1 - - Destination Chain.Oracle.style.opacity: 1 - Destination Chain.(SPV -> Oracle)[0].style.opacity: 1 - (Destination Chain.Oracle -> Proof)[0].style.opacity: 1 - - Proof.style.opacity: 1 - Source Chain.Oracle.style.opacity: 1 - (Proof -> Source Chain.Oracle)[0].style.opacity: 1 - Source Chain.(Oracle -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[0].style.opacity: 1 - } - } - } - } - } - } - ``` - - - ```d2 target="optimistic resolution" - style.fill: transparent - direction: right - - vars: { - default-opacity: 0.1 - } - - title: System Overview { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - Order Server: {shape: cloud} - - Source Chain: { - User: { - shape: person - } - Solver: { - style.fill-pattern: none - } - Reactor: {shape: page} - Oracle: { - style.opacity: ${default-opacity} - shape: page - } - Challenger: {style.opacity: ${default-opacity}} - SPV: { - style.opacity: ${default-opacity} - shape: page - } - - Solver -> Reactor: 3. resolve() => Quote - Solver -> Reactor: 4.1. initiate() - User -> Reactor: 4.2. Tokens - - # Optimistic Payout - Solver <-> Reactor: O.6.1. optimisticPayout() {style.opacity: ${default-opacity}} - - # Challenge Parts - Challenger -> Reactor: C.6.1. dispute() {style.opacity: ${default-opacity}} - - # - Challenged Rejected (VM) - Oracle -> Reactor: C.9.2. proveOrderFulfilment() {style.opacity: ${default-opacity}} - Reactor -> Solver: C.9.3. payout Tokens {style.opacity: ${default-opacity}} - - # - Challenged Rejected (Bitcoin) - Solver -> SPV: C.7.1. verify() {style.opacity: ${default-opacity}} - SPV -> Reactor: C.7.2. proveOrderFulfilment() {style.opacity: ${default-opacity}} - Reactor -> Solver: C.7.3. payout Tokens {style.opacity: ${default-opacity}} - - # - Challenged Accepted - Challenger -> Reactor: C.7.1. completeDispute() {style.opacity: ${default-opacity}} - Reactor -> Challenger: C.7.2. Reward {style.opacity: ${default-opacity}} - Reactor -> User: C.7.3. Tokens {style.opacity: ${default-opacity}} - } - - Source Chain.User -> Order Server: 1. Sign Message {style.animated: false} - Order Server -> Source Chain.Solver: 2. Signed Orders - - Destination Chain: { - Oracle: { - shape: page - } - Solver - SPV: { - style.opacity: ${default-opacity} - shape: page - } - User: { - shape: person - } - - # Ordinary - Solver -> Oracle: 5.1. fill() - Solver -> User: 5.2. Tokens - - # Challenged submit proof (VM) - Solver -> Oracle: C.7.1. submit() {style.opacity: ${default-opacity}} - - # Challenged submit proof (Bitcoin) - Solver -> SPV: C.7.1: verify() {style.opacity: ${default-opacity}} - SPV -> Oracle: C.7.2. Send fill details {style.opacity: ${default-opacity}} - } - - Bitcoin: { - Solver: { - style.opacity: ${default-opacity} - } - User: { - shape: person - style.opacity: ${default-opacity} - } - - Solver -> User: 5.1 transfer {style.opacity: ${default-opacity}} - style.opacity: ${default-opacity} - } - - Bitcoin -> Destination Chain.SPV: Bitcoin Headers { - style.opacity: ${default-opacity} - style.stroke-dash: 4 - } - Bitcoin -> Source Chain.SPV: Bitcoin Headers { - style.opacity: ${default-opacity} - style.stroke-dash: 4 - } - - Proof: "AMB\n" { - shape: cloud - style.opacity: ${default-opacity} - } - - Destination Chain.Oracle -> Proof: C.8.1. Collect event {style.opacity: ${default-opacity}} - Proof -> Source Chain.Oracle: C.9.1. receiveMessage() {style.opacity: ${default-opacity}} - - scenarios: { - optimistic resolution: { - title.label: Optimistic Resolution - Source Chain: { - (Solver <-> Reactor)[0].style.opacity: 1 - - (Solver <-> Reactor)[0].style.stroke-width: 3 - } - } - challenged: { - title.label: Challenged - Source Chain.Challenger.style.opacity: 1 - Source Chain.(Challenger -> Reactor)[0].style.opacity: 1 - Source Chain.(Challenger -> Reactor)[0]: C.6.1. dispute() - - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 3 - - scenarios: { - challenged uncontested: { - title.label: Challenged Uncontested - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - Source Chain.(Challenger -> Reactor)[1].style.opacity: 1 - Source Chain.(Challenger -> Reactor)[1]: C.7.1. completeDispute() - - Source Chain.(Challenger -> Reactor)[1].style.stroke-width: 3 - Source Chain.(Reactor -> Challenger)[0].style.opacity: 1 - Source Chain.(Reactor -> User)[0].style.opacity: 1 - Destination Chain.style.opacity: ${default-opacity} - Destination Chain.*.style.opacity: ${default-opacity} - Destination Chain.(* -> *)[*].style.opacity: ${default-opacity} - } - order fill proven (VM): { - title.label: Order Fill Proven (VM) - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - - Destination Chain.(Solver -> Oracle)[1].style.opacity: 1 - Destination Chain.(Solver -> Oracle)[1].style.stroke-width: 3 - Destination Chain.Oracle.style.opacity: 1 - Proof.style.opacity: 1 - (Destination Chain.Oracle -> Proof)[0].style.opacity: 1 - (Proof -> Source Chain.oracle)[0].style.opacity: 1 - Source Chain.Oracle.style.opacity: 1 - Source Chain.(Oracle -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[0].style.opacity: 1 - } - order fill proven (BTC): { - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - Destination Chain.style.opacity: ${default-opacity} - Destination Chain.*.style.opacity: ${default-opacity} - Destination Chain.(* -> *)[*].style.opacity: ${default-opacity} - Bitcoin.style.opacity: 1 - Bitcoin.*.style.opacity: 1 - Bitcoin.(* -> *)[*].style.opacity: 1 - - scenarios: { - local SPV client: { - title.label: Local SPV Client - (Bitcoin -> Source Chain.SPV)[0].style.opacity: 1 - Source Chain.SPV.style.opacity: 1 - - Source Chain.(Solver -> SPV)[0].style.opacity: 1 - Source Chain.(Solver -> SPV)[0].style.stroke-width: 3 - Source Chain.(SPV -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[1].style.opacity: 1 - } - remote SPV client: { - title.label: Remote SPV Client - (Bitcoin -> Destination Chain.SPV)[0].style.opacity: 1 - Destination Chain.SPV.style.opacity: 1 - - Destination Chain.style.opacity: 1 - Destination Chain.Solver.style.opacity: 1 - Destination Chain.(Solver -> SPV)[0].style.opacity: 1 - Destination Chain.SPV.style.opacity: 1 - - Destination Chain.Oracle.style.opacity: 1 - Destination Chain.(SPV -> Oracle)[0].style.opacity: 1 - (Destination Chain.Oracle -> Proof)[0].style.opacity: 1 - - Proof.style.opacity: 1 - Source Chain.Oracle.style.opacity: 1 - (Proof -> Source Chain.Oracle)[0].style.opacity: 1 - Source Chain.(Oracle -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[0].style.opacity: 1 - } - } - } - } - } - } - ``` - - - - - ```d2 target="challenged.challenged uncontested" - style.fill: transparent - direction: right - - vars: { - default-opacity: 0.1 - } - - title: System Overview { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - Order Server: {shape: cloud} - - Source Chain: { - User: { - shape: person - } - Solver: { - style.fill-pattern: none - } - Reactor: {shape: page} - Oracle: { - style.opacity: ${default-opacity} - shape: page - } - Challenger: {style.opacity: ${default-opacity}} - SPV: { - style.opacity: ${default-opacity} - shape: page - } - - Solver -> Reactor: 3. resolve() => Quote - Solver -> Reactor: 4.1. initiate() - User -> Reactor: 4.2. Tokens - - # Optimistic Payout - Solver <-> Reactor: O.6.1. optimisticPayout() {style.opacity: ${default-opacity}} - - # Challenge Parts - Challenger -> Reactor: C.6.1. dispute() {style.opacity: ${default-opacity}} - - # - Challenged Rejected (VM) - Oracle -> Reactor: C.9.2. proveOrderFulfilment() {style.opacity: ${default-opacity}} - Reactor -> Solver: C.9.3. payout Tokens {style.opacity: ${default-opacity}} - - # - Challenged Rejected (Bitcoin) - Solver -> SPV: C.7.1. verify() {style.opacity: ${default-opacity}} - SPV -> Reactor: C.7.2. proveOrderFulfilment() {style.opacity: ${default-opacity}} - Reactor -> Solver: C.7.3. payout Tokens {style.opacity: ${default-opacity}} - - # - Challenged Accepted - Challenger -> Reactor: C.7.1. completeDispute() {style.opacity: ${default-opacity}} - Reactor -> Challenger: C.7.2. Reward {style.opacity: ${default-opacity}} - Reactor -> User: C.7.3. Tokens {style.opacity: ${default-opacity}} - } - - Source Chain.User -> Order Server: 1. Sign Message {style.animated: false} - Order Server -> Source Chain.Solver: 2. Signed Orders - - Destination Chain: { - Oracle: { - shape: page - } - Solver - SPV: { - style.opacity: ${default-opacity} - shape: page - } - User: { - shape: person - } - - # Ordinary - Solver -> Oracle: 5.1. fill() - Solver -> User: 5.2. Tokens - - # Challenged submit proof (VM) - Solver -> Oracle: C.7.1. submit() {style.opacity: ${default-opacity}} - - # Challenged submit proof (Bitcoin) - Solver -> SPV: C.7.1: verify() {style.opacity: ${default-opacity}} - SPV -> Oracle: C.7.2. Send fill details {style.opacity: ${default-opacity}} - } - - Bitcoin: { - Solver: { - style.opacity: ${default-opacity} - } - User: { - shape: person - style.opacity: ${default-opacity} - } - - Solver -> User: 5.1 transfer {style.opacity: ${default-opacity}} - style.opacity: ${default-opacity} - } - - Bitcoin -> Destination Chain.SPV: Bitcoin Headers { - style.opacity: ${default-opacity} - style.stroke-dash: 4 - } - Bitcoin -> Source Chain.SPV: Bitcoin Headers { - style.opacity: ${default-opacity} - style.stroke-dash: 4 - } - - Proof: "AMB\n" { - shape: cloud - style.opacity: ${default-opacity} - } - - Destination Chain.Oracle -> Proof: C.8.1. Collect event {style.opacity: ${default-opacity}} - Proof -> Source Chain.Oracle: C.9.1. receiveMessage() {style.opacity: ${default-opacity}} - - scenarios: { - optimistic resolution: { - title.label: Optimistic Resolution - Source Chain: { - (Solver <-> Reactor)[0].style.opacity: 1 - - (Solver <-> Reactor)[0].style.stroke-width: 3 - } - } - challenged: { - title.label: Challenged - Source Chain.Challenger.style.opacity: 1 - Source Chain.(Challenger -> Reactor)[0].style.opacity: 1 - Source Chain.(Challenger -> Reactor)[0]: C.6.1. dispute() - - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 3 - - scenarios: { - challenged uncontested: { - title.label: Challenged Uncontested - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - Source Chain.(Challenger -> Reactor)[1].style.opacity: 1 - Source Chain.(Challenger -> Reactor)[1]: C.7.1. completeDispute() - - Source Chain.(Challenger -> Reactor)[1].style.stroke-width: 3 - Source Chain.(Reactor -> Challenger)[0].style.opacity: 1 - Source Chain.(Reactor -> User)[0].style.opacity: 1 - Destination Chain.style.opacity: ${default-opacity} - Destination Chain.*.style.opacity: ${default-opacity} - Destination Chain.(* -> *)[*].style.opacity: ${default-opacity} - } - order fill proven (VM): { - title.label: Order Fill Proven (VM) - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - - Destination Chain.(Solver -> Oracle)[1].style.opacity: 1 - Destination Chain.(Solver -> Oracle)[1].style.stroke-width: 3 - Destination Chain.Oracle.style.opacity: 1 - Proof.style.opacity: 1 - (Destination Chain.Oracle -> Proof)[0].style.opacity: 1 - (Proof -> Source Chain.oracle)[0].style.opacity: 1 - Source Chain.Oracle.style.opacity: 1 - Source Chain.(Oracle -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[0].style.opacity: 1 - } - order fill proven (BTC): { - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - Destination Chain.style.opacity: ${default-opacity} - Destination Chain.*.style.opacity: ${default-opacity} - Destination Chain.(* -> *)[*].style.opacity: ${default-opacity} - Bitcoin.style.opacity: 1 - Bitcoin.*.style.opacity: 1 - Bitcoin.(* -> *)[*].style.opacity: 1 - - scenarios: { - local SPV client: { - title.label: Local SPV Client - (Bitcoin -> Source Chain.SPV)[0].style.opacity: 1 - Source Chain.SPV.style.opacity: 1 - - Source Chain.(Solver -> SPV)[0].style.opacity: 1 - Source Chain.(Solver -> SPV)[0].style.stroke-width: 3 - Source Chain.(SPV -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[1].style.opacity: 1 - } - remote SPV client: { - title.label: Remote SPV Client - (Bitcoin -> Destination Chain.SPV)[0].style.opacity: 1 - Destination Chain.SPV.style.opacity: 1 - - Destination Chain.style.opacity: 1 - Destination Chain.Solver.style.opacity: 1 - Destination Chain.(Solver -> SPV)[0].style.opacity: 1 - Destination Chain.SPV.style.opacity: 1 - - Destination Chain.Oracle.style.opacity: 1 - Destination Chain.(SPV -> Oracle)[0].style.opacity: 1 - (Destination Chain.Oracle -> Proof)[0].style.opacity: 1 - - Proof.style.opacity: 1 - Source Chain.Oracle.style.opacity: 1 - (Proof -> Source Chain.Oracle)[0].style.opacity: 1 - Source Chain.(Oracle -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[0].style.opacity: 1 - } - } - } - } - } - } - ``` - - - ```d2 target="challenged.order fill proven (VM)" - style.fill: transparent - direction: right - - vars: { - default-opacity: 0.1 - } - - title: System Overview { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - Order Server: {shape: cloud} - - Source Chain: { - User: { - shape: person - } - Solver: { - style.fill-pattern: none - } - Reactor: {shape: page} - Oracle: { - style.opacity: ${default-opacity} - shape: page - } - Challenger: {style.opacity: ${default-opacity}} - SPV: { - style.opacity: ${default-opacity} - shape: page - } - - Solver -> Reactor: 3. resolve() => Quote - Solver -> Reactor: 4.1. initiate() - User -> Reactor: 4.2. Tokens - - # Optimistic Payout - Solver <-> Reactor: O.6.1. optimisticPayout() {style.opacity: ${default-opacity}} - - # Challenge Parts - Challenger -> Reactor: C.6.1. dispute() {style.opacity: ${default-opacity}} - - # - Challenged Rejected (VM) - Oracle -> Reactor: C.9.2. proveOrderFulfilment() {style.opacity: ${default-opacity}} - Reactor -> Solver: C.9.3. payout Tokens {style.opacity: ${default-opacity}} - - # - Challenged Rejected (Bitcoin) - Solver -> SPV: C.7.1. verify() {style.opacity: ${default-opacity}} - SPV -> Reactor: C.7.2. proveOrderFulfilment() {style.opacity: ${default-opacity}} - Reactor -> Solver: C.7.3. payout Tokens {style.opacity: ${default-opacity}} - - # - Challenged Accepted - Challenger -> Reactor: C.7.1. completeDispute() {style.opacity: ${default-opacity}} - Reactor -> Challenger: C.7.2. Reward {style.opacity: ${default-opacity}} - Reactor -> User: C.7.3. Tokens {style.opacity: ${default-opacity}} - } - - Source Chain.User -> Order Server: 1. Sign Message {style.animated: false} - Order Server -> Source Chain.Solver: 2. Signed Orders - - Destination Chain: { - Oracle: { - shape: page - } - Solver - SPV: { - style.opacity: ${default-opacity} - shape: page - } - User: { - shape: person - } - - # Ordinary - Solver -> Oracle: 5.1. fill() - Solver -> User: 5.2. Tokens - - # Challenged submit proof (VM) - Solver -> Oracle: C.7.1. submit() {style.opacity: ${default-opacity}} - - # Challenged submit proof (Bitcoin) - Solver -> SPV: C.7.1: verify() {style.opacity: ${default-opacity}} - SPV -> Oracle: C.7.2. Send fill details {style.opacity: ${default-opacity}} - } - - Bitcoin: { - Solver: { - style.opacity: ${default-opacity} - } - User: { - shape: person - style.opacity: ${default-opacity} - } - - Solver -> User: 5.1 transfer {style.opacity: ${default-opacity}} - style.opacity: ${default-opacity} - } - - Bitcoin -> Destination Chain.SPV: Bitcoin Headers { - style.opacity: ${default-opacity} - style.stroke-dash: 4 - } - Bitcoin -> Source Chain.SPV: Bitcoin Headers { - style.opacity: ${default-opacity} - style.stroke-dash: 4 - } - - Proof: "AMB\n" { - shape: cloud - style.opacity: ${default-opacity} - } - - Destination Chain.Oracle -> Proof: C.8.1. Collect event {style.opacity: ${default-opacity}} - Proof -> Source Chain.Oracle: C.9.1. receiveMessage() {style.opacity: ${default-opacity}} - - scenarios: { - optimistic resolution: { - title.label: Optimistic Resolution - Source Chain: { - (Solver <-> Reactor)[0].style.opacity: 1 - - (Solver <-> Reactor)[0].style.stroke-width: 3 - } - } - challenged: { - title.label: Challenged - Source Chain.Challenger.style.opacity: 1 - Source Chain.(Challenger -> Reactor)[0].style.opacity: 1 - Source Chain.(Challenger -> Reactor)[0]: C.6.1. dispute() - - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 3 - - scenarios: { - challenged uncontested: { - title.label: Challenged Uncontested - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - Source Chain.(Challenger -> Reactor)[1].style.opacity: 1 - Source Chain.(Challenger -> Reactor)[1]: C.7.1. completeDispute() - - Source Chain.(Challenger -> Reactor)[1].style.stroke-width: 3 - Source Chain.(Reactor -> Challenger)[0].style.opacity: 1 - Source Chain.(Reactor -> User)[0].style.opacity: 1 - Destination Chain.style.opacity: ${default-opacity} - Destination Chain.*.style.opacity: ${default-opacity} - Destination Chain.(* -> *)[*].style.opacity: ${default-opacity} - } - order fill proven (VM): { - title.label: Order Fill Proven (VM) - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - - Destination Chain.(Solver -> Oracle)[1].style.opacity: 1 - Destination Chain.(Solver -> Oracle)[1].style.stroke-width: 3 - Destination Chain.Oracle.style.opacity: 1 - Proof.style.opacity: 1 - (Destination Chain.Oracle -> Proof)[0].style.opacity: 1 - (Proof -> Source Chain.oracle)[0].style.opacity: 1 - Source Chain.Oracle.style.opacity: 1 - Source Chain.(Oracle -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[0].style.opacity: 1 - } - order fill proven (BTC): { - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - Destination Chain.style.opacity: ${default-opacity} - Destination Chain.*.style.opacity: ${default-opacity} - Destination Chain.(* -> *)[*].style.opacity: ${default-opacity} - Bitcoin.style.opacity: 1 - Bitcoin.*.style.opacity: 1 - Bitcoin.(* -> *)[*].style.opacity: 1 - - scenarios: { - local SPV client: { - title.label: Local SPV Client - (Bitcoin -> Source Chain.SPV)[0].style.opacity: 1 - Source Chain.SPV.style.opacity: 1 - - Source Chain.(Solver -> SPV)[0].style.opacity: 1 - Source Chain.(Solver -> SPV)[0].style.stroke-width: 3 - Source Chain.(SPV -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[1].style.opacity: 1 - } - remote SPV client: { - title.label: Remote SPV Client - (Bitcoin -> Destination Chain.SPV)[0].style.opacity: 1 - Destination Chain.SPV.style.opacity: 1 - - Destination Chain.style.opacity: 1 - Destination Chain.Solver.style.opacity: 1 - Destination Chain.(Solver -> SPV)[0].style.opacity: 1 - Destination Chain.SPV.style.opacity: 1 - - Destination Chain.Oracle.style.opacity: 1 - Destination Chain.(SPV -> Oracle)[0].style.opacity: 1 - (Destination Chain.Oracle -> Proof)[0].style.opacity: 1 - - Proof.style.opacity: 1 - Source Chain.Oracle.style.opacity: 1 - (Proof -> Source Chain.Oracle)[0].style.opacity: 1 - Source Chain.(Oracle -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[0].style.opacity: 1 - } - } - } - } - } - } - ``` - - - - - ```d2 target="challenged.order fill proven (BTC).local SPV client" - style.fill: transparent - direction: right - - vars: { - default-opacity: 0.1 - } - - title: System Overview { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - Order Server: {shape: cloud} - - Source Chain: { - User: { - shape: person - } - Solver: { - style.fill-pattern: none - } - Reactor: {shape: page} - Oracle: { - style.opacity: ${default-opacity} - shape: page - } - Challenger: {style.opacity: ${default-opacity}} - SPV: { - style.opacity: ${default-opacity} - shape: page - } - - Solver -> Reactor: 3. resolve() => Quote - Solver -> Reactor: 4.1. initiate() - User -> Reactor: 4.2. Tokens - - # Optimistic Payout - Solver <-> Reactor: O.6.1. optimisticPayout() {style.opacity: ${default-opacity}} - - # Challenge Parts - Challenger -> Reactor: C.6.1. dispute() {style.opacity: ${default-opacity}} - - # - Challenged Rejected (VM) - Oracle -> Reactor: C.9.2. proveOrderFulfilment() {style.opacity: ${default-opacity}} - Reactor -> Solver: C.9.3. payout Tokens {style.opacity: ${default-opacity}} - - # - Challenged Rejected (Bitcoin) - Solver -> SPV: C.7.1. verify() {style.opacity: ${default-opacity}} - SPV -> Reactor: C.7.2. proveOrderFulfilment() {style.opacity: ${default-opacity}} - Reactor -> Solver: C.7.3. payout Tokens {style.opacity: ${default-opacity}} - - # - Challenged Accepted - Challenger -> Reactor: C.7.1. completeDispute() {style.opacity: ${default-opacity}} - Reactor -> Challenger: C.7.2. Reward {style.opacity: ${default-opacity}} - Reactor -> User: C.7.3. Tokens {style.opacity: ${default-opacity}} - } - - Source Chain.User -> Order Server: 1. Sign Message {style.animated: false} - Order Server -> Source Chain.Solver: 2. Signed Orders - - Destination Chain: { - Oracle: { - shape: page - } - Solver - SPV: { - style.opacity: ${default-opacity} - shape: page - } - User: { - shape: person - } - - # Ordinary - Solver -> Oracle: 5.1. fill() - Solver -> User: 5.2. Tokens - - # Challenged submit proof (VM) - Solver -> Oracle: C.7.1. submit() {style.opacity: ${default-opacity}} - - # Challenged submit proof (Bitcoin) - Solver -> SPV: C.7.1: verify() {style.opacity: ${default-opacity}} - SPV -> Oracle: C.7.2. Send fill details {style.opacity: ${default-opacity}} - } - - Bitcoin: { - Solver: { - style.opacity: ${default-opacity} - } - User: { - shape: person - style.opacity: ${default-opacity} - } - - Solver -> User: 5.1 transfer {style.opacity: ${default-opacity}} - style.opacity: ${default-opacity} - } - - Bitcoin -> Destination Chain.SPV: Bitcoin Headers { - style.opacity: ${default-opacity} - style.stroke-dash: 4 - } - Bitcoin -> Source Chain.SPV: Bitcoin Headers { - style.opacity: ${default-opacity} - style.stroke-dash: 4 - } - - Proof: "AMB\n" { - shape: cloud - style.opacity: ${default-opacity} - } - - Destination Chain.Oracle -> Proof: C.8.1. Collect event {style.opacity: ${default-opacity}} - Proof -> Source Chain.Oracle: C.9.1. receiveMessage() {style.opacity: ${default-opacity}} - - scenarios: { - optimistic resolution: { - title.label: Optimistic Resolution - Source Chain: { - (Solver <-> Reactor)[0].style.opacity: 1 - - (Solver <-> Reactor)[0].style.stroke-width: 3 - } - } - challenged: { - title.label: Challenged - Source Chain.Challenger.style.opacity: 1 - Source Chain.(Challenger -> Reactor)[0].style.opacity: 1 - Source Chain.(Challenger -> Reactor)[0]: C.6.1. dispute() - - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 3 - - scenarios: { - challenged uncontested: { - title.label: Challenged Uncontested - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - Source Chain.(Challenger -> Reactor)[1].style.opacity: 1 - Source Chain.(Challenger -> Reactor)[1]: C.7.1. completeDispute() - - Source Chain.(Challenger -> Reactor)[1].style.stroke-width: 3 - Source Chain.(Reactor -> Challenger)[0].style.opacity: 1 - Source Chain.(Reactor -> User)[0].style.opacity: 1 - Destination Chain.style.opacity: ${default-opacity} - Destination Chain.*.style.opacity: ${default-opacity} - Destination Chain.(* -> *)[*].style.opacity: ${default-opacity} - } - order fill proven (VM): { - title.label: Order Fill Proven (VM) - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - - Destination Chain.(Solver -> Oracle)[1].style.opacity: 1 - Destination Chain.(Solver -> Oracle)[1].style.stroke-width: 3 - Destination Chain.Oracle.style.opacity: 1 - Proof.style.opacity: 1 - (Destination Chain.Oracle -> Proof)[0].style.opacity: 1 - (Proof -> Source Chain.oracle)[0].style.opacity: 1 - Source Chain.Oracle.style.opacity: 1 - Source Chain.(Oracle -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[0].style.opacity: 1 - } - order fill proven (BTC): { - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - Destination Chain.style.opacity: ${default-opacity} - Destination Chain.*.style.opacity: ${default-opacity} - Destination Chain.(* -> *)[*].style.opacity: ${default-opacity} - Bitcoin.style.opacity: 1 - Bitcoin.*.style.opacity: 1 - Bitcoin.(* -> *)[*].style.opacity: 1 - - scenarios: { - local SPV client: { - title.label: Local SPV Client - (Bitcoin -> Source Chain.SPV)[0].style.opacity: 1 - Source Chain.SPV.style.opacity: 1 - - Source Chain.(Solver -> SPV)[0].style.opacity: 1 - Source Chain.(Solver -> SPV)[0].style.stroke-width: 3 - Source Chain.(SPV -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[1].style.opacity: 1 - } - remote SPV client: { - title.label: Remote SPV Client - (Bitcoin -> Destination Chain.SPV)[0].style.opacity: 1 - Destination Chain.SPV.style.opacity: 1 - - Destination Chain.style.opacity: 1 - Destination Chain.Solver.style.opacity: 1 - Destination Chain.(Solver -> SPV)[0].style.opacity: 1 - Destination Chain.SPV.style.opacity: 1 - - Destination Chain.Oracle.style.opacity: 1 - Destination Chain.(SPV -> Oracle)[0].style.opacity: 1 - (Destination Chain.Oracle -> Proof)[0].style.opacity: 1 - - Proof.style.opacity: 1 - Source Chain.Oracle.style.opacity: 1 - (Proof -> Source Chain.Oracle)[0].style.opacity: 1 - Source Chain.(Oracle -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[0].style.opacity: 1 - } - } - } - } - } - } - ``` - - - ```d2 target="challenged.order fill proven (BTC).remote SPV client" - style.fill: transparent - direction: right - - vars: { - default-opacity: 0.1 - } - - title: System Overview { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - Order Server: {shape: cloud} - - Source Chain: { - User: { - shape: person - } - Solver: { - style.fill-pattern: none - } - Reactor: {shape: page} - Oracle: { - style.opacity: ${default-opacity} - shape: page - } - Challenger: {style.opacity: ${default-opacity}} - SPV: { - style.opacity: ${default-opacity} - shape: page - } - - Solver -> Reactor: 3. resolve() => Quote - Solver -> Reactor: 4.1. initiate() - User -> Reactor: 4.2. Tokens - - # Optimistic Payout - Solver <-> Reactor: O.6.1. optimisticPayout() {style.opacity: ${default-opacity}} - - # Challenge Parts - Challenger -> Reactor: C.6.1. dispute() {style.opacity: ${default-opacity}} - - # - Challenged Rejected (VM) - Oracle -> Reactor: C.9.2. proveOrderFulfilment() {style.opacity: ${default-opacity}} - Reactor -> Solver: C.9.3. payout Tokens {style.opacity: ${default-opacity}} - - # - Challenged Rejected (Bitcoin) - Solver -> SPV: C.7.1. verify() {style.opacity: ${default-opacity}} - SPV -> Reactor: C.7.2. proveOrderFulfilment() {style.opacity: ${default-opacity}} - Reactor -> Solver: C.7.3. payout Tokens {style.opacity: ${default-opacity}} - - # - Challenged Accepted - Challenger -> Reactor: C.7.1. completeDispute() {style.opacity: ${default-opacity}} - Reactor -> Challenger: C.7.2. Reward {style.opacity: ${default-opacity}} - Reactor -> User: C.7.3. Tokens {style.opacity: ${default-opacity}} - } - - Source Chain.User -> Order Server: 1. Sign Message {style.animated: false} - Order Server -> Source Chain.Solver: 2. Signed Orders - - Destination Chain: { - Oracle: { - shape: page - } - Solver - SPV: { - style.opacity: ${default-opacity} - shape: page - } - User: { - shape: person - } - - # Ordinary - Solver -> Oracle: 5.1. fill() - Solver -> User: 5.2. Tokens - - # Challenged submit proof (VM) - Solver -> Oracle: C.7.1. submit() {style.opacity: ${default-opacity}} - - # Challenged submit proof (Bitcoin) - Solver -> SPV: C.7.1: verify() {style.opacity: ${default-opacity}} - SPV -> Oracle: C.7.2. Send fill details {style.opacity: ${default-opacity}} - } - - Bitcoin: { - Solver: { - style.opacity: ${default-opacity} - } - User: { - shape: person - style.opacity: ${default-opacity} - } - - Solver -> User: 5.1 transfer {style.opacity: ${default-opacity}} - style.opacity: ${default-opacity} - } - - Bitcoin -> Destination Chain.SPV: Bitcoin Headers { - style.opacity: ${default-opacity} - style.stroke-dash: 4 - } - Bitcoin -> Source Chain.SPV: Bitcoin Headers { - style.opacity: ${default-opacity} - style.stroke-dash: 4 - } - - Proof: "AMB\n" { - shape: cloud - style.opacity: ${default-opacity} - } - - Destination Chain.Oracle -> Proof: C.8.1. Collect event {style.opacity: ${default-opacity}} - Proof -> Source Chain.Oracle: C.9.1. receiveMessage() {style.opacity: ${default-opacity}} - - scenarios: { - optimistic resolution: { - title.label: Optimistic Resolution - Source Chain: { - (Solver <-> Reactor)[0].style.opacity: 1 - - (Solver <-> Reactor)[0].style.stroke-width: 3 - } - } - challenged: { - title.label: Challenged - Source Chain.Challenger.style.opacity: 1 - Source Chain.(Challenger -> Reactor)[0].style.opacity: 1 - Source Chain.(Challenger -> Reactor)[0]: C.6.1. dispute() - - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 3 - - scenarios: { - challenged uncontested: { - title.label: Challenged Uncontested - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - Source Chain.(Challenger -> Reactor)[1].style.opacity: 1 - Source Chain.(Challenger -> Reactor)[1]: C.7.1. completeDispute() - - Source Chain.(Challenger -> Reactor)[1].style.stroke-width: 3 - Source Chain.(Reactor -> Challenger)[0].style.opacity: 1 - Source Chain.(Reactor -> User)[0].style.opacity: 1 - Destination Chain.style.opacity: ${default-opacity} - Destination Chain.*.style.opacity: ${default-opacity} - Destination Chain.(* -> *)[*].style.opacity: ${default-opacity} - } - order fill proven (VM): { - title.label: Order Fill Proven (VM) - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - - Destination Chain.(Solver -> Oracle)[1].style.opacity: 1 - Destination Chain.(Solver -> Oracle)[1].style.stroke-width: 3 - Destination Chain.Oracle.style.opacity: 1 - Proof.style.opacity: 1 - (Destination Chain.Oracle -> Proof)[0].style.opacity: 1 - (Proof -> Source Chain.oracle)[0].style.opacity: 1 - Source Chain.Oracle.style.opacity: 1 - Source Chain.(Oracle -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[0].style.opacity: 1 - } - order fill proven (BTC): { - Source Chain.(Challenger -> Reactor)[0].style.stroke-width: 2 - Destination Chain.style.opacity: ${default-opacity} - Destination Chain.*.style.opacity: ${default-opacity} - Destination Chain.(* -> *)[*].style.opacity: ${default-opacity} - Bitcoin.style.opacity: 1 - Bitcoin.*.style.opacity: 1 - Bitcoin.(* -> *)[*].style.opacity: 1 - - scenarios: { - local SPV client: { - title.label: Local SPV Client - (Bitcoin -> Source Chain.SPV)[0].style.opacity: 1 - Source Chain.SPV.style.opacity: 1 - - Source Chain.(Solver -> SPV)[0].style.opacity: 1 - Source Chain.(Solver -> SPV)[0].style.stroke-width: 3 - Source Chain.(SPV -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[1].style.opacity: 1 - } - remote SPV client: { - title.label: Remote SPV Client - (Bitcoin -> Destination Chain.SPV)[0].style.opacity: 1 - Destination Chain.SPV.style.opacity: 1 - - Destination Chain.style.opacity: 1 - Destination Chain.Solver.style.opacity: 1 - Destination Chain.(Solver -> SPV)[0].style.opacity: 1 - Destination Chain.SPV.style.opacity: 1 - - Destination Chain.Oracle.style.opacity: 1 - Destination Chain.(SPV -> Oracle)[0].style.opacity: 1 - (Destination Chain.Oracle -> Proof)[0].style.opacity: 1 - - Proof.style.opacity: 1 - Source Chain.Oracle.style.opacity: 1 - (Proof -> Source Chain.Oracle)[0].style.opacity: 1 - Source Chain.(Oracle -> Reactor)[0].style.opacity: 1 - Source Chain.(Reactor -> Solver)[0].style.opacity: 1 - } - } - } - } - } - } - ``` - - - - - - - -## System Overview - -CrossCats is designed for cross-chain intents. Nevertheless, the majority of logic exists on the source chain. **Source Chain** here refers to the chain where the order was **Initiated** by a solver. **Remote Chain** refers to the chain (or chains) where proofs are sent from. This includes asset deliveries. - -### Initiation (order claim) - -An order is initiated by the user signing an order description. An example of an order description is _My 1 Ether (Ethereum) for 3000 USD (Base)_. The signed order is a permit2 witness allowing the solver to submit the order to the Reactor and collect the **input** (1 Ether) from the user. Importantly, during this step, some collateral is collected from the solver. This ensures the solver has some skin in the game and settles the order. The collateral is paid back when the input is released to the solver. - -To improve the user and solver experience, an order server sits between the user and solver and aids with order validation, propagation, and quoting. - -### Output Payment (to user) - -The payment pathway depends on the order intent. For a **VM to VM** swap, the solver calls the oracle contract on the destination chain, which sends & records the token payment to the user. For **VM to Bitcoin** swap, the solver makes the payment described in the order. In other words, make a Bitcoin transaction that has **a** UTXO that matches the order description. Using an SPV client, the transaction containing the UTXO can be proven to exist. - -### Input Payment (to solver) - -CrossCats has 3 payment release schemes to optimise the solver experience. - -1. Optimistic resolution. This assumes that the resolver delivered the payment to the user. After a dispute window (configured by the user), the payment will be released. If the order is disputed, the operation falls back to option 2. -2. Explicit validation. At any time, orders can be proven. This requires that someone send the proof from the remote chains to the source chain. This is more costly than optimistic resolution, but may be significantly faster than optimistic resolution. Additionally, through batch verification, the cost can be reduced at a slight increase in verification speed. -3. Underwriting. The last release scheme isn't a payment proof scheme as much as it is a responsibility delegation scheme. If configured, an order can be bought by someone else at any point prior to the release of the input. This allows the initial solver to immediately get their capital back and hand off the payment validation to a third party. - -By using these 3 schemes in conjunction with each other, solvers only have to lock liquidity for a small period of time while not sacrificing any system security. At the same time, speed, security, and cost can be rebalanced based on the specific needs of a user or chain conditions. - -## Bitcoin & Pseudo Solving - -VM to Bitcoin swaps are relatively straight forward: -1. User signs a message stating the input assets. -2. Solver claims the order, inputs assets are automatically collected. -3. Solver delivers assets. -4. Solver is paid. - -However, this flow breaks on step 2 when the user wants to go from Bitcoin to VM. (sell Bitcoin). There is no way to pull assets from a user. To solve this issue, the user becomes a **pseudo solver** & relies on release scheme 3. Pseudo solving works by asking solvers for short-lived Bitcoin short quotes. These orders are after validation & selection signed by the solver. The user then quickly claims the order. - -Say the user wants to swap 1 Bitcoin for 50000 USDC. Using the order server, they need to collect & claim a signed order of the opposite: 50000 USDC for 1 Bitcoin. Once this order is filled, they get the input (50000 USDC) which matches their desired swap. - -Important to notice, this adds a delay between when the price risk begins for the solver (issuance of signed order) to when it resolves (0-1 block confirmations of Bitcoin TXO). These values are best migrated by the following configuration: -1. Short initiation time. Using a source chain with a low block time, the initiation time can be kept to an absolute minimum. -2. Short proof time. The user may only have 1 or 2 Blocks to get their transaction confirmed. -3. Designing a compatibility layer between the UI and the Order Server that only requests binding order when it is known that the user can get their Bitcoins filled. - -In a future version, VM to Bitcoin swaps will upgrade to an oracle book scheme that further minimizes time between start of price risk to end of price risk. - -## Key differentiators - -CrossCats has been designed to optimise solver integration metrics: -- Cost of capital – Capital is only held for the duration of a swap and can be underwritten to further decrease the lock duration. -- Speed – Minimizing settlement overhead, users receive their assets immediately, while solvers can opt in to underwriting for quick input payout. -- Price Risk – Price Risk is minimized by letting solvers commit to swaps & providing strong order guarantees. - -### Locked Capital & Underwriting - -CrossCats has no concept of pre-locking liquidity. Capital is only locked during the actual order flow. Additionally, Users will immediately receive their assets as deliveries are directly from the solver to the user. - -Additionally, for routes supported by underwriters input assets will be available 1-5 minutes after asset delivery. This includes Bitcoin routes for users. - -### Price (un)Certainty - -For VM to VM swaps and VM to Bitcoin swaps, the price uncertainty window is the time it takes from the moment your system commits to the order – which may be the initiate transaction – to when the order claim arrives on-chain and is successfully mined. On fast chains this is at most 2-3 seconds but may be up-to 12 seconds. Cleverly timing the commitment can reduce the uncertainty period below the block time. - -For Bitcoin to VM swaps the price uncertainty window is from when the order is signed to when the user initiates the Bitcoin transaction and it gets your desired number of confirmations. This may vary from 30 seconds to 60 seconds. - -CrossCats has developed a user owned pseudo escrow, that allows the Order Server to give a soft commitment to solvers that a Bitcoin UTXO will be generated. Given that a solver trusts this promise, the price uncertainty window is as low as 30 seconds or shorter. diff --git a/src/content/docs/cross-cats/underwriting.mdx b/src/content/docs/cross-cats/underwriting.mdx deleted file mode 100644 index 4513e4f..0000000 --- a/src/content/docs/cross-cats/underwriting.mdx +++ /dev/null @@ -1,1551 +0,0 @@ ---- -title: "Underwriting & Purchasing Orders" -description: "Security, speed, and cost. Underwriting allows customizing these parameters exactly providing a 2 fold improvement: 1. Faster solver payouts allowing for greater capital velocity. 2. Faster user payouts improving the user experience." -sidebar: - order: 21 ---- - -import { Tabs, TabItem } from '@astrojs/starlight/components'; - -#### Glossary -- Reactor: Escrow contract for orders. -- Order: A ERC-7683 CrossChainOrder -- Signed Order: An order & its signature. -- Input: Funds pulled into the Reactor. In exchange for outputs. -- Output: Fund sent directly from filler to signer. In exchange for inputs. -- Signer: Signer of an Order. Inputs are always pulled from signer. USDC -> BTC, the signer is a User. BTC -> USDC the signer is a solver. -- Filler: Entity that sends outputs to the Signer. Will receive inputs -- Order Key: Specific order structure that is used to move storage into calldata. Contains the vast majority of all information relevant for the order. Importantly, it contains the registered inputs & outputs. -- Quote: Qualified guess for what the best order that will be accepted. -- Solver: Entity collecting order flow and completing orders. -- User: The person interacting with the CrossCats UI. Creator of Order Flow. -- Recipient: Will receive outputs. Is likely to be either a solver or a user but may be neither. - -#### CrossCats manages assets in 2 ways: -- Inputs are collected from the signer of an order. For EVM -> BTC the signer is the user while for BTC -> VM, the signer is the Solver. These outputs are held in the CrossCats reactor until the necessary resolution criteria are fulfilled. -- Outputs are sent directly from the filler to the recipient. They are never held by CrossCats. - -An important differentiator is that VM assets can be inputs and outputs while non-VM assets like Bitcoin can **only** be outputs. As a result, non-VM to non-VM swaps are not supported since they would require VM assets to be input. Since Outputs are never held by Catalyst and are directly delivered, there is no need to underwrite deliveries. The recipient is already getting their assets at the highest speed possible. - -CrossCats support underwriting inputs, this allows the filler to receive the inputs before full finality is reached. This is helpful for users going from a non-VM chain like Bitcoin to a VM chain since the Bitcoin has to be in the outputs. As a result, the user becomes the filler and has to wait for finality before they receive their tokens. For solvers, they have access to their capital faster which improves their capital utilisation. - -## Quick Overview - - - - - - ```d2 target=root - style.fill: transparent - direction: right - - title: Index { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - vars: { - default-opacity: 0.1 - } - - User: { - Input: { - style.opacity: 1 - } - Output: { - style.opacity: ${default-opacity} - } - } - - Order Server - - Solver: Solver { - style.multiple: true - Input: { - style.opacity: ${default-opacity} - style.fill: "#fbe1e3" - } - Output: { - style.opacity: 1 - style.fill: "#fbe1e3" - } - style.fill: "#fbe1e3" - } - Underwriter: { - Input: { - style.opacity: 1 - style.fill: "#e5ffe7" - } - style.fill: "#e5ffe7" - } - - # On chain: - Reactor: { - Input: {style.opacity: ${default-opacity}} - } - SPV Oracle - - # Step 1. Get a quote for the user. - User <-> Order Server: 1.1 Quote {style.opacity: ${default-opacity}} - Order Server <-> Solver: 1.2 Quote {style.opacity: ${default-opacity}} - - # Step 2. Broadcasting Signed Order. - User -> Order Server: 2.1 Send Signed Order {style.opacity: ${default-opacity}} - Order Server -> Solver: 2.2 Broadcast Signed Order {style.opacity: ${default-opacity}} - - # Step 3. Solver initiates order - Solver -> Reactor: 3.1 Submit Signed Order {style.opacity: ${default-opacity}} - User.Input -> Reactor.Input: 3.2 Pull Input {style.opacity: ${default-opacity}} - - # Step 4. Solver delivers tokens - Solver.Output -> User.Output: 4.1 Fill Order {style.opacity: ${default-opacity}} - - # Step 5. Underwrite - Underwriter -> Reactor: 5.1 Purchase Order {style.opacity: ${default-opacity}} - Underwriter.Input -> Solver.Input: 5.2 Pull Inputs from underwriter to solver {style.opacity: ${default-opacity}} - - # Step 6. Bitcoin Confirmed - Underwriter -> SPV Oracle: 6.1 Submit Proof {style.opacity: ${default-opacity}} - SPV Oracle -> Reactor: 6.2 Prove Bitcoin Transaction {style.opacity: ${default-opacity}} - Reactor.Input -> Underwriter.Input: 6.3 Pay underwriter {style.opacity: ${default-opacity}} - - scenarios: { - Setup: { - title.label: Setup - Solver: Solver {style.multiple: true} - (Order Server <-> Solver)[0].style.opacity: 1 - (User <-> Order Server)[0].style.opacity: 1 - (User -> Order Server)[0].style.opacity: 1 - (Order Server -> Solver)[0].style.opacity: 1 - } - Initiation: { - title.label: Initiation - Solver: Solver { - style.multiple: false - Input.style.fill: "#fbe1e3" - } - Reactor.Input.style.opacity: 1 - User.Input.style.opacity: ${default-opacity} - (User.Input -> Reactor.Input)[0].style.opacity: 1 - (User.Input -> Reactor.Input)[0].style.animated: true - (Solver -> Reactor)[0].style.opacity: 1 - Reactor.Input.style.fill: "#fbe1e3" - } - Completion: { - title.label: Completion - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter.Input -> Solver.Input)[0].style.opacity: 1 - (Underwriter.Input -> Solver.Input)[0].style.animated: true - User.Input.style.opacity: 1 - Underwriter.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - Reactor.Input.style.fill: "#e5ffe7" - - (Solver.Output -> User.Output)[0].style.opacity: 1 - (Solver.Output -> User.Output)[0].style.animated: true - Solver.Output.style.opacity: ${default-opacity} - User.Output.style.opacity: 1 - - (Underwriter -> Reactor)[0].style.opacity: 1 - Solver.Input.style.opacity: 1 - User.Output.style.opacity: 1 - Solver.Output.style.opacity: ${default-opacity} - User.Input.style.opacity: ${default-opacity} - } - Finalisation: { - title.label: Finalisation - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter -> SPV Oracle)[0].style.opacity: 1 - (SPV Oracle -> Reactor)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.animated: true - Underwriter.Input.style.opacity: 1 - Solver.Input.style.opacity: 1 - User.Output.style.opacity: 1 - Solver.Output.style.opacity: ${default-opacity} - User.Input.style.opacity: ${default-opacity} - } - } - ``` - - - - ```d2 target=Setup - style.fill: transparent - direction: right - - title: Index { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - vars: { - default-opacity: 0.1 - } - - User: { - Input: { - style.opacity: 1 - } - Output: { - style.opacity: ${default-opacity} - } - } - - Order Server - - Solver: Solver { - style.multiple: true - Input: { - style.opacity: ${default-opacity} - style.fill: "#fbe1e3" - } - Output: { - style.opacity: 1 - style.fill: "#fbe1e3" - } - style.fill: "#fbe1e3" - } - Underwriter: { - Input: { - style.opacity: 1 - style.fill: "#e5ffe7" - } - style.fill: "#e5ffe7" - } - - # On chain: - Reactor: { - Input: {style.opacity: ${default-opacity}} - } - SPV Oracle - - # Step 1. Get a quote for the user. - User <-> Order Server: 1.1 Quote {style.opacity: ${default-opacity}} - Order Server <-> Solver: 1.2 Quote {style.opacity: ${default-opacity}} - - # Step 2. Broadcasting Signed Order. - User -> Order Server: 2.1 Send Signed Order {style.opacity: ${default-opacity}} - Order Server -> Solver: 2.2 Broadcast Signed Order {style.opacity: ${default-opacity}} - - # Step 3. Solver initiates order - Solver -> Reactor: 3.1 Submit Signed Order {style.opacity: ${default-opacity}} - User.Input -> Reactor.Input: 3.2 Pull Input {style.opacity: ${default-opacity}} - - # Step 4. Solver delivers tokens - Solver.Output -> User.Output: 4.1 Fill Order {style.opacity: ${default-opacity}} - - # Step 5. Underwrite - Underwriter -> Reactor: 5.1 Purchase Order {style.opacity: ${default-opacity}} - Underwriter.Input -> Solver.Input: 5.2 Pull Inputs from underwriter to solver {style.opacity: ${default-opacity}} - - # Step 6. Bitcoin Confirmed - Underwriter -> SPV Oracle: 6.1 Submit Proof {style.opacity: ${default-opacity}} - SPV Oracle -> Reactor: 6.2 Prove Bitcoin Transaction {style.opacity: ${default-opacity}} - Reactor.Input -> Underwriter.Input: 6.3 Pay underwriter {style.opacity: ${default-opacity}} - - scenarios: { - Setup: { - title.label: Setup - Solver: Solver {style.multiple: true} - (Order Server <-> Solver)[0].style.opacity: 1 - (User <-> Order Server)[0].style.opacity: 1 - (User -> Order Server)[0].style.opacity: 1 - (Order Server -> Solver)[0].style.opacity: 1 - } - Initiation: { - title.label: Initiation - Solver: Solver { - style.multiple: false - Input.style.fill: "#fbe1e3" - } - Reactor.Input.style.opacity: 1 - User.Input.style.opacity: ${default-opacity} - (User.Input -> Reactor.Input)[0].style.opacity: 1 - (User.Input -> Reactor.Input)[0].style.animated: true - (Solver -> Reactor)[0].style.opacity: 1 - Reactor.Input.style.fill: "#fbe1e3" - } - Completion: { - title.label: Completion - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter.Input -> Solver.Input)[0].style.opacity: 1 - (Underwriter.Input -> Solver.Input)[0].style.animated: true - User.Input.style.opacity: 1 - Underwriter.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - Reactor.Input.style.fill: "#e5ffe7" - - (Solver.Output -> User.Output)[0].style.opacity: 1 - (Solver.Output -> User.Output)[0].style.animated: true - Solver.Output.style.opacity: ${default-opacity} - User.Output.style.opacity: 1 - - (Underwriter -> Reactor)[0].style.opacity: 1 - Solver.Input.style.opacity: 1 - User.Output.style.opacity: 1 - Solver.Output.style.opacity: ${default-opacity} - User.Input.style.opacity: ${default-opacity} - } - Finalisation: { - title.label: Finalisation - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter -> SPV Oracle)[0].style.opacity: 1 - (SPV Oracle -> Reactor)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.animated: true - Underwriter.Input.style.opacity: 1 - Solver.Input.style.opacity: 1 - User.Output.style.opacity: 1 - Solver.Output.style.opacity: ${default-opacity} - User.Input.style.opacity: ${default-opacity} - } - } - ``` - - - ```d2 target=Initiation - style.fill: transparent - direction: right - - title: Index { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - vars: { - default-opacity: 0.1 - } - - User: { - Input: { - style.opacity: 1 - } - Output: { - style.opacity: ${default-opacity} - } - } - - Order Server - - Solver: Solver { - style.multiple: true - Input: { - style.opacity: ${default-opacity} - style.fill: "#fbe1e3" - } - Output: { - style.opacity: 1 - style.fill: "#fbe1e3" - } - style.fill: "#fbe1e3" - } - Underwriter: { - Input: { - style.opacity: 1 - style.fill: "#e5ffe7" - } - style.fill: "#e5ffe7" - } - - # On chain: - Reactor: { - Input: {style.opacity: ${default-opacity}} - } - SPV Oracle - - # Step 1. Get a quote for the user. - User <-> Order Server: 1.1 Quote {style.opacity: ${default-opacity}} - Order Server <-> Solver: 1.2 Quote {style.opacity: ${default-opacity}} - - # Step 2. Broadcasting Signed Order. - User -> Order Server: 2.1 Send Signed Order {style.opacity: ${default-opacity}} - Order Server -> Solver: 2.2 Broadcast Signed Order {style.opacity: ${default-opacity}} - - # Step 3. Solver initiates order - Solver -> Reactor: 3.1 Submit Signed Order {style.opacity: ${default-opacity}} - User.Input -> Reactor.Input: 3.2 Pull Input {style.opacity: ${default-opacity}} - - # Step 4. Solver delivers tokens - Solver.Output -> User.Output: 4.1 Fill Order {style.opacity: ${default-opacity}} - - # Step 5. Underwrite - Underwriter -> Reactor: 5.1 Purchase Order {style.opacity: ${default-opacity}} - Underwriter.Input -> Solver.Input: 5.2 Pull Inputs from underwriter to solver {style.opacity: ${default-opacity}} - - # Step 6. Bitcoin Confirmed - Underwriter -> SPV Oracle: 6.1 Submit Proof {style.opacity: ${default-opacity}} - SPV Oracle -> Reactor: 6.2 Prove Bitcoin Transaction {style.opacity: ${default-opacity}} - Reactor.Input -> Underwriter.Input: 6.3 Pay underwriter {style.opacity: ${default-opacity}} - - scenarios: { - Setup: { - title.label: Setup - Solver: Solver {style.multiple: true} - (Order Server <-> Solver)[0].style.opacity: 1 - (User <-> Order Server)[0].style.opacity: 1 - (User -> Order Server)[0].style.opacity: 1 - (Order Server -> Solver)[0].style.opacity: 1 - } - Initiation: { - title.label: Initiation - Solver: Solver { - style.multiple: false - Input.style.fill: "#fbe1e3" - } - Reactor.Input.style.opacity: 1 - User.Input.style.opacity: ${default-opacity} - (User.Input -> Reactor.Input)[0].style.opacity: 1 - (User.Input -> Reactor.Input)[0].style.animated: true - (Solver -> Reactor)[0].style.opacity: 1 - Reactor.Input.style.fill: "#fbe1e3" - } - Completion: { - title.label: Completion - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter.Input -> Solver.Input)[0].style.opacity: 1 - (Underwriter.Input -> Solver.Input)[0].style.animated: true - User.Input.style.opacity: 1 - Underwriter.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - Reactor.Input.style.fill: "#e5ffe7" - - (Solver.Output -> User.Output)[0].style.opacity: 1 - (Solver.Output -> User.Output)[0].style.animated: true - Solver.Output.style.opacity: ${default-opacity} - User.Output.style.opacity: 1 - - (Underwriter -> Reactor)[0].style.opacity: 1 - Solver.Input.style.opacity: 1 - User.Output.style.opacity: 1 - Solver.Output.style.opacity: ${default-opacity} - User.Input.style.opacity: ${default-opacity} - } - Finalisation: { - title.label: Finalisation - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter -> SPV Oracle)[0].style.opacity: 1 - (SPV Oracle -> Reactor)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.animated: true - Underwriter.Input.style.opacity: 1 - Solver.Input.style.opacity: 1 - User.Output.style.opacity: 1 - Solver.Output.style.opacity: ${default-opacity} - User.Input.style.opacity: ${default-opacity} - } - } - ``` - - - ```d2 target=Completion - style.fill: transparent - direction: right - - title: Index { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - vars: { - default-opacity: 0.1 - } - - User: { - Input: { - style.opacity: 1 - } - Output: { - style.opacity: ${default-opacity} - } - } - - Order Server - - Solver: Solver { - style.multiple: true - Input: { - style.opacity: ${default-opacity} - style.fill: "#fbe1e3" - } - Output: { - style.opacity: 1 - style.fill: "#fbe1e3" - } - style.fill: "#fbe1e3" - } - Underwriter: { - Input: { - style.opacity: 1 - style.fill: "#e5ffe7" - } - style.fill: "#e5ffe7" - } - - # On chain: - Reactor: { - Input: {style.opacity: ${default-opacity}} - } - SPV Oracle - - # Step 1. Get a quote for the user. - User <-> Order Server: 1.1 Quote {style.opacity: ${default-opacity}} - Order Server <-> Solver: 1.2 Quote {style.opacity: ${default-opacity}} - - # Step 2. Broadcasting Signed Order. - User -> Order Server: 2.1 Send Signed Order {style.opacity: ${default-opacity}} - Order Server -> Solver: 2.2 Broadcast Signed Order {style.opacity: ${default-opacity}} - - # Step 3. Solver initiates order - Solver -> Reactor: 3.1 Submit Signed Order {style.opacity: ${default-opacity}} - User.Input -> Reactor.Input: 3.2 Pull Input {style.opacity: ${default-opacity}} - - # Step 4. Solver delivers tokens - Solver.Output -> User.Output: 4.1 Fill Order {style.opacity: ${default-opacity}} - - # Step 5. Underwrite - Underwriter -> Reactor: 5.1 Purchase Order {style.opacity: ${default-opacity}} - Underwriter.Input -> Solver.Input: 5.2 Pull Inputs from underwriter to solver {style.opacity: ${default-opacity}} - - # Step 6. Bitcoin Confirmed - Underwriter -> SPV Oracle: 6.1 Submit Proof {style.opacity: ${default-opacity}} - SPV Oracle -> Reactor: 6.2 Prove Bitcoin Transaction {style.opacity: ${default-opacity}} - Reactor.Input -> Underwriter.Input: 6.3 Pay underwriter {style.opacity: ${default-opacity}} - - scenarios: { - Setup: { - title.label: Setup - Solver: Solver {style.multiple: true} - (Order Server <-> Solver)[0].style.opacity: 1 - (User <-> Order Server)[0].style.opacity: 1 - (User -> Order Server)[0].style.opacity: 1 - (Order Server -> Solver)[0].style.opacity: 1 - } - Initiation: { - title.label: Initiation - Solver: Solver { - style.multiple: false - Input.style.fill: "#fbe1e3" - } - Reactor.Input.style.opacity: 1 - User.Input.style.opacity: ${default-opacity} - (User.Input -> Reactor.Input)[0].style.opacity: 1 - (User.Input -> Reactor.Input)[0].style.animated: true - (Solver -> Reactor)[0].style.opacity: 1 - Reactor.Input.style.fill: "#fbe1e3" - } - Completion: { - title.label: Completion - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter.Input -> Solver.Input)[0].style.opacity: 1 - (Underwriter.Input -> Solver.Input)[0].style.animated: true - User.Input.style.opacity: 1 - Underwriter.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - Reactor.Input.style.fill: "#e5ffe7" - - (Solver.Output -> User.Output)[0].style.opacity: 1 - (Solver.Output -> User.Output)[0].style.animated: true - Solver.Output.style.opacity: ${default-opacity} - User.Output.style.opacity: 1 - - (Underwriter -> Reactor)[0].style.opacity: 1 - Solver.Input.style.opacity: 1 - User.Output.style.opacity: 1 - Solver.Output.style.opacity: ${default-opacity} - User.Input.style.opacity: ${default-opacity} - } - Finalisation: { - title.label: Finalisation - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter -> SPV Oracle)[0].style.opacity: 1 - (SPV Oracle -> Reactor)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.animated: true - Underwriter.Input.style.opacity: 1 - Solver.Input.style.opacity: 1 - User.Output.style.opacity: 1 - Solver.Output.style.opacity: ${default-opacity} - User.Input.style.opacity: ${default-opacity} - } - } - ``` - - - ```d2 target=Finalisation - style.fill: transparent - direction: right - - title: Index { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - vars: { - default-opacity: 0.1 - } - - User: { - Input: { - style.opacity: 1 - } - Output: { - style.opacity: ${default-opacity} - } - } - - Order Server - - Solver: Solver { - style.multiple: true - Input: { - style.opacity: ${default-opacity} - style.fill: "#fbe1e3" - } - Output: { - style.opacity: 1 - style.fill: "#fbe1e3" - } - style.fill: "#fbe1e3" - } - Underwriter: { - Input: { - style.opacity: 1 - style.fill: "#e5ffe7" - } - style.fill: "#e5ffe7" - } - - # On chain: - Reactor: { - Input: {style.opacity: ${default-opacity}} - } - SPV Oracle - - # Step 1. Get a quote for the user. - User <-> Order Server: 1.1 Quote {style.opacity: ${default-opacity}} - Order Server <-> Solver: 1.2 Quote {style.opacity: ${default-opacity}} - - # Step 2. Broadcasting Signed Order. - User -> Order Server: 2.1 Send Signed Order {style.opacity: ${default-opacity}} - Order Server -> Solver: 2.2 Broadcast Signed Order {style.opacity: ${default-opacity}} - - # Step 3. Solver initiates order - Solver -> Reactor: 3.1 Submit Signed Order {style.opacity: ${default-opacity}} - User.Input -> Reactor.Input: 3.2 Pull Input {style.opacity: ${default-opacity}} - - # Step 4. Solver delivers tokens - Solver.Output -> User.Output: 4.1 Fill Order {style.opacity: ${default-opacity}} - - # Step 5. Underwrite - Underwriter -> Reactor: 5.1 Purchase Order {style.opacity: ${default-opacity}} - Underwriter.Input -> Solver.Input: 5.2 Pull Inputs from underwriter to solver {style.opacity: ${default-opacity}} - - # Step 6. Bitcoin Confirmed - Underwriter -> SPV Oracle: 6.1 Submit Proof {style.opacity: ${default-opacity}} - SPV Oracle -> Reactor: 6.2 Prove Bitcoin Transaction {style.opacity: ${default-opacity}} - Reactor.Input -> Underwriter.Input: 6.3 Pay underwriter {style.opacity: ${default-opacity}} - - scenarios: { - Setup: { - title.label: Setup - Solver: Solver {style.multiple: true} - (Order Server <-> Solver)[0].style.opacity: 1 - (User <-> Order Server)[0].style.opacity: 1 - (User -> Order Server)[0].style.opacity: 1 - (Order Server -> Solver)[0].style.opacity: 1 - } - Initiation: { - title.label: Initiation - Solver: Solver { - style.multiple: false - Input.style.fill: "#fbe1e3" - } - Reactor.Input.style.opacity: 1 - User.Input.style.opacity: ${default-opacity} - (User.Input -> Reactor.Input)[0].style.opacity: 1 - (User.Input -> Reactor.Input)[0].style.animated: true - (Solver -> Reactor)[0].style.opacity: 1 - Reactor.Input.style.fill: "#fbe1e3" - } - Completion: { - title.label: Completion - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter.Input -> Solver.Input)[0].style.opacity: 1 - (Underwriter.Input -> Solver.Input)[0].style.animated: true - User.Input.style.opacity: 1 - Underwriter.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - Reactor.Input.style.fill: "#e5ffe7" - - (Solver.Output -> User.Output)[0].style.opacity: 1 - (Solver.Output -> User.Output)[0].style.animated: true - Solver.Output.style.opacity: ${default-opacity} - User.Output.style.opacity: 1 - - (Underwriter -> Reactor)[0].style.opacity: 1 - Solver.Input.style.opacity: 1 - User.Output.style.opacity: 1 - Solver.Output.style.opacity: ${default-opacity} - User.Input.style.opacity: ${default-opacity} - } - Finalisation: { - title.label: Finalisation - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter -> SPV Oracle)[0].style.opacity: 1 - (SPV Oracle -> Reactor)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.animated: true - Underwriter.Input.style.opacity: 1 - Solver.Input.style.opacity: 1 - User.Output.style.opacity: 1 - Solver.Output.style.opacity: ${default-opacity} - User.Input.style.opacity: ${default-opacity} - } - } - ``` - - - - - - - ```d2 target=root - style.fill: transparent - direction: right - - title: Index { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - vars: { - default-opacity: 0.1 - } - - User: { - Input: { - style.opacity: ${default-opacity} - } - Output: { - style.opacity: 1 - } - } - Deposit Address: { - shape: page - Output: { - style.opacity: ${default-opacity} - } - } - - Order Server - - Solver: Solver { - style.multiple: true - Input: { - style.opacity: 1 - style.fill: "#fbe1e3" - } - Output: { - style.opacity: ${default-opacity} - style.fill: "#fbe1e3" - } - style.fill: "#fbe1e3" - } - Underwriter: { - Input: { - style.opacity: 1 - style.fill: "#e5ffe7" - } - style.fill: "#e5ffe7" - } - - # On chain: - Reactor: { - Input: {style.opacity: ${default-opacity}} - } - SPV Oracle - - # Step 1. Get a quote for the user. - User <-> Order Server: 1.1 Quote {style.opacity: ${default-opacity}} - Order Server <-> Solver: 1.2 Quote {style.opacity: ${default-opacity}} - - # Step 2. Sign a message to generate deposit address - User -> Deposit Address: 2. Sign message to generate key {style.opacity: ${default-opacity}} - - # Step 3. Send BTC - User.Output -> Deposit Address.Output: 3. Send BTC {style.opacity: 0.11} - - # Step 4. Request signed order. - User -> Order Server: 4.1 Request Signed Order {style.opacity: ${default-opacity}} - Order Server -> Solver: 4.2 Request Signed Order {style.opacity: ${default-opacity}} - Solver -> Order Server: 4.3 Signed Order {style.opacity: ${default-opacity}} - Order Server -> User: 4.4 Signed Order {style.opacity: 0.11} - - # Step 5. Submit Signed Order - User -> Reactor: 5.1 Submit Signed Order {style.opacity: ${default-opacity}} - Solver.Input -> Reactor.Input: 5.2 Pull Input Tokens {style.opacity: 0.11} - - # Step 6. Send BTC to Solver - Deposit Address.Output -> Solver.Output: 6. Send Bitcoins {style.opacity: ${default-opacity}} - - # Step 7. Underwrite - Underwriter -> Reactor: 7.1 Purchase Order {style.opacity: ${default-opacity}} - Underwriter.Input -> User.Input: 7.2 Pull Inputs from underwriter to user {style.opacity: ${default-opacity}} - - # Step 8. Bitcoin Confirmed - Underwriter -> SPV Oracle: 8.1 Submit Proof {style.opacity: ${default-opacity}} - SPV Oracle -> Reactor: 8.2 Prove Bitcoin Transaction {style.opacity: ${default-opacity}} - Reactor.Input -> Underwriter.Input: 8.3 Pay underwriter {style.opacity: ${default-opacity}} - - scenarios: { - Setup: { - title.label: Setup - Solver: Solver {style.multiple: true} - (User -> Deposit Address)[0].style.opacity: 1 - (Order Server <-> Solver)[0].style.opacity: 1 - (User <-> Order Server)[0].style.opacity: 1 - } - Initiation: { - title.label: Initiation - Solver: Solver { - style.multiple: false - Input.style.fill: "#fbe1e3" - } - Solver.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - (Solver -> Order Server)[0].style.opacity: 1 - (Order Server -> Solver)[0].style.opacity: 1 - (Order Server -> User)[0].style.opacity: 1 - (Solver.Input -> Reactor.Input)[0].style.opacity: 1 - (Solver.Input -> Reactor.Input)[0].style.animated: true - (User -> Reactor)[0].style.opacity: 1 - (User.Output -> Deposit Address.Output)[0].style.opacity: 1 - (User.Output -> Deposit Address.Output)[0].style.animated: true - (User -> Order Server)[0].style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - Deposit Address.Output.style.opacity: 1 - } - Completion: { - title.label: Completion - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter.Input -> User.Input)[0].style.opacity: 1 - (Underwriter.Input -> User.Input)[0].style.animated: true - User.Input.style.opacity: 1 - Underwriter.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - Reactor.Input.style.fill: "#e5ffe7" - (Deposit Address.Output -> Solver.Output)[0].style.opacity: 1 - (Deposit Address.Output -> Solver.Output)[0].style.animated: true - - (Underwriter -> Reactor)[0].style.opacity: 1 - Solver.Output.style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - } - Finalisation: { - title.label: Finalisation - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter -> SPV Oracle)[0].style.opacity: 1 - (SPV Oracle -> Reactor)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.animated: true - Underwriter.Input.style.opacity: 1 - User.Input.style.opacity: 1 - Solver.Output.style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - } - } - ``` - - - ```d2 target=Setup - style.fill: transparent - direction: right - - title: Index { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - vars: { - default-opacity: 0.1 - } - - User: { - Input: { - style.opacity: ${default-opacity} - } - Output: { - style.opacity: 1 - } - } - Deposit Address: { - shape: page - Output: { - style.opacity: ${default-opacity} - } - } - - Order Server - - Solver: Solver { - style.multiple: true - Input: { - style.opacity: 1 - style.fill: "#fbe1e3" - } - Output: { - style.opacity: ${default-opacity} - style.fill: "#fbe1e3" - } - style.fill: "#fbe1e3" - } - Underwriter: { - Input: { - style.opacity: 1 - style.fill: "#e5ffe7" - } - style.fill: "#e5ffe7" - } - - # On chain: - Reactor: { - Input: {style.opacity: ${default-opacity}} - } - SPV Oracle - - # Step 1. Get a quote for the user. - User <-> Order Server: 1.1 Quote {style.opacity: ${default-opacity}} - Order Server <-> Solver: 1.2 Quote {style.opacity: ${default-opacity}} - - # Step 2. Sign a message to generate deposit address - User -> Deposit Address: 2. Sign message to generate key {style.opacity: ${default-opacity}} - - # Step 3. Send BTC - User.Output -> Deposit Address.Output: 3. Send BTC {style.opacity: 0.11} - - # Step 4. Request signed order. - User -> Order Server: 4.1 Request Signed Order {style.opacity: ${default-opacity}} - Order Server -> Solver: 4.2 Request Signed Order {style.opacity: ${default-opacity}} - Solver -> Order Server: 4.3 Signed Order {style.opacity: ${default-opacity}} - Order Server -> User: 4.4 Signed Order {style.opacity: 0.11} - - # Step 5. Submit Signed Order - User -> Reactor: 5.1 Submit Signed Order {style.opacity: ${default-opacity}} - Solver.Input -> Reactor.Input: 5.2 Pull Input Tokens {style.opacity: 0.11} - - # Step 6. Send BTC to Solver - Deposit Address.Output -> Solver.Output: 6. Send Bitcoins {style.opacity: ${default-opacity}} - - # Step 7. Underwrite - Underwriter -> Reactor: 7.1 Purchase Order {style.opacity: ${default-opacity}} - Underwriter.Input -> User.Input: 7.2 Pull Inputs from underwriter to user {style.opacity: ${default-opacity}} - - # Step 8. Bitcoin Confirmed - Underwriter -> SPV Oracle: 8.1 Submit Proof {style.opacity: ${default-opacity}} - SPV Oracle -> Reactor: 8.2 Prove Bitcoin Transaction {style.opacity: ${default-opacity}} - Reactor.Input -> Underwriter.Input: 8.3 Pay underwriter {style.opacity: ${default-opacity}} - - scenarios: { - Setup: { - title.label: Setup - Solver: Solver {style.multiple: true} - (User -> Deposit Address)[0].style.opacity: 1 - (Order Server <-> Solver)[0].style.opacity: 1 - (User <-> Order Server)[0].style.opacity: 1 - } - Initiation: { - title.label: Initiation - Solver: Solver { - style.multiple: false - Input.style.fill: "#fbe1e3" - } - Solver.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - (Solver -> Order Server)[0].style.opacity: 1 - (Order Server -> Solver)[0].style.opacity: 1 - (Order Server -> User)[0].style.opacity: 1 - (Solver.Input -> Reactor.Input)[0].style.opacity: 1 - (Solver.Input -> Reactor.Input)[0].style.animated: true - (User -> Reactor)[0].style.opacity: 1 - (User.Output -> Deposit Address.Output)[0].style.opacity: 1 - (User.Output -> Deposit Address.Output)[0].style.animated: true - (User -> Order Server)[0].style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - Deposit Address.Output.style.opacity: 1 - } - Completion: { - title.label: Completion - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter.Input -> User.Input)[0].style.opacity: 1 - (Underwriter.Input -> User.Input)[0].style.animated: true - User.Input.style.opacity: 1 - Underwriter.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - Reactor.Input.style.fill: "#e5ffe7" - (Deposit Address.Output -> Solver.Output)[0].style.opacity: 1 - (Deposit Address.Output -> Solver.Output)[0].style.animated: true - - (Underwriter -> Reactor)[0].style.opacity: 1 - Solver.Output.style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - } - Finalisation: { - title.label: Finalisation - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter -> SPV Oracle)[0].style.opacity: 1 - (SPV Oracle -> Reactor)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.animated: true - Underwriter.Input.style.opacity: 1 - User.Input.style.opacity: 1 - Solver.Output.style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - } - } - ``` - - - ```d2 target=Initiation - style.fill: transparent - direction: right - - title: Index { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - vars: { - default-opacity: 0.1 - } - - User: { - Input: { - style.opacity: ${default-opacity} - } - Output: { - style.opacity: 1 - } - } - Deposit Address: { - shape: page - Output: { - style.opacity: ${default-opacity} - } - } - - Order Server - - Solver: Solver { - style.multiple: true - Input: { - style.opacity: 1 - style.fill: "#fbe1e3" - } - Output: { - style.opacity: ${default-opacity} - style.fill: "#fbe1e3" - } - style.fill: "#fbe1e3" - } - Underwriter: { - Input: { - style.opacity: 1 - style.fill: "#e5ffe7" - } - style.fill: "#e5ffe7" - } - - # On chain: - Reactor: { - Input: {style.opacity: ${default-opacity}} - } - SPV Oracle - - # Step 1. Get a quote for the user. - User <-> Order Server: 1.1 Quote {style.opacity: ${default-opacity}} - Order Server <-> Solver: 1.2 Quote {style.opacity: ${default-opacity}} - - # Step 2. Sign a message to generate deposit address - User -> Deposit Address: 2. Sign message to generate key {style.opacity: ${default-opacity}} - - # Step 3. Send BTC - User.Output -> Deposit Address.Output: 3. Send BTC {style.opacity: 0.11} - - # Step 4. Request signed order. - User -> Order Server: 4.1 Request Signed Order {style.opacity: ${default-opacity}} - Order Server -> Solver: 4.2 Request Signed Order {style.opacity: ${default-opacity}} - Solver -> Order Server: 4.3 Signed Order {style.opacity: ${default-opacity}} - Order Server -> User: 4.4 Signed Order {style.opacity: 0.11} - - # Step 5. Submit Signed Order - User -> Reactor: 5.1 Submit Signed Order {style.opacity: ${default-opacity}} - Solver.Input -> Reactor.Input: 5.2 Pull Input Tokens {style.opacity: 0.11} - - # Step 6. Send BTC to Solver - Deposit Address.Output -> Solver.Output: 6. Send Bitcoins {style.opacity: ${default-opacity}} - - # Step 7. Underwrite - Underwriter -> Reactor: 7.1 Purchase Order {style.opacity: ${default-opacity}} - Underwriter.Input -> User.Input: 7.2 Pull Inputs from underwriter to user {style.opacity: ${default-opacity}} - - # Step 8. Bitcoin Confirmed - Underwriter -> SPV Oracle: 8.1 Submit Proof {style.opacity: ${default-opacity}} - SPV Oracle -> Reactor: 8.2 Prove Bitcoin Transaction {style.opacity: ${default-opacity}} - Reactor.Input -> Underwriter.Input: 8.3 Pay underwriter {style.opacity: ${default-opacity}} - - scenarios: { - Setup: { - title.label: Setup - Solver: Solver {style.multiple: true} - (User -> Deposit Address)[0].style.opacity: 1 - (Order Server <-> Solver)[0].style.opacity: 1 - (User <-> Order Server)[0].style.opacity: 1 - } - Initiation: { - title.label: Initiation - Solver: Solver { - style.multiple: false - Input.style.fill: "#fbe1e3" - } - Solver.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - (Solver -> Order Server)[0].style.opacity: 1 - (Order Server -> Solver)[0].style.opacity: 1 - (Order Server -> User)[0].style.opacity: 1 - (Solver.Input -> Reactor.Input)[0].style.opacity: 1 - (Solver.Input -> Reactor.Input)[0].style.animated: true - (User -> Reactor)[0].style.opacity: 1 - (User.Output -> Deposit Address.Output)[0].style.opacity: 1 - (User.Output -> Deposit Address.Output)[0].style.animated: true - (User -> Order Server)[0].style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - Deposit Address.Output.style.opacity: 1 - } - Completion: { - title.label: Completion - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter.Input -> User.Input)[0].style.opacity: 1 - (Underwriter.Input -> User.Input)[0].style.animated: true - User.Input.style.opacity: 1 - Underwriter.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - Reactor.Input.style.fill: "#e5ffe7" - (Deposit Address.Output -> Solver.Output)[0].style.opacity: 1 - (Deposit Address.Output -> Solver.Output)[0].style.animated: true - - (Underwriter -> Reactor)[0].style.opacity: 1 - Solver.Output.style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - } - Finalisation: { - title.label: Finalisation - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter -> SPV Oracle)[0].style.opacity: 1 - (SPV Oracle -> Reactor)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.animated: true - Underwriter.Input.style.opacity: 1 - User.Input.style.opacity: 1 - Solver.Output.style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - } - } - ``` - - - ```d2 target=Completion - style.fill: transparent - direction: right - - title: Index { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - vars: { - default-opacity: 0.1 - } - - User: { - Input: { - style.opacity: ${default-opacity} - } - Output: { - style.opacity: 1 - } - } - Deposit Address: { - shape: page - Output: { - style.opacity: ${default-opacity} - } - } - - Order Server - - Solver: Solver { - style.multiple: true - Input: { - style.opacity: 1 - style.fill: "#fbe1e3" - } - Output: { - style.opacity: ${default-opacity} - style.fill: "#fbe1e3" - } - style.fill: "#fbe1e3" - } - Underwriter: { - Input: { - style.opacity: 1 - style.fill: "#e5ffe7" - } - style.fill: "#e5ffe7" - } - - # On chain: - Reactor: { - Input: {style.opacity: ${default-opacity}} - } - SPV Oracle - - # Step 1. Get a quote for the user. - User <-> Order Server: 1.1 Quote {style.opacity: ${default-opacity}} - Order Server <-> Solver: 1.2 Quote {style.opacity: ${default-opacity}} - - # Step 2. Sign a message to generate deposit address - User -> Deposit Address: 2. Sign message to generate key {style.opacity: ${default-opacity}} - - # Step 3. Send BTC - User.Output -> Deposit Address.Output: 3. Send BTC {style.opacity: 0.11} - - # Step 4. Request signed order. - User -> Order Server: 4.1 Request Signed Order {style.opacity: ${default-opacity}} - Order Server -> Solver: 4.2 Request Signed Order {style.opacity: ${default-opacity}} - Solver -> Order Server: 4.3 Signed Order {style.opacity: ${default-opacity}} - Order Server -> User: 4.4 Signed Order {style.opacity: 0.11} - - # Step 5. Submit Signed Order - User -> Reactor: 5.1 Submit Signed Order {style.opacity: ${default-opacity}} - Solver.Input -> Reactor.Input: 5.2 Pull Input Tokens {style.opacity: 0.11} - - # Step 6. Send BTC to Solver - Deposit Address.Output -> Solver.Output: 6. Send Bitcoins {style.opacity: ${default-opacity}} - - # Step 7. Underwrite - Underwriter -> Reactor: 7.1 Purchase Order {style.opacity: ${default-opacity}} - Underwriter.Input -> User.Input: 7.2 Pull Inputs from underwriter to user {style.opacity: ${default-opacity}} - - # Step 8. Bitcoin Confirmed - Underwriter -> SPV Oracle: 8.1 Submit Proof {style.opacity: ${default-opacity}} - SPV Oracle -> Reactor: 8.2 Prove Bitcoin Transaction {style.opacity: ${default-opacity}} - Reactor.Input -> Underwriter.Input: 8.3 Pay underwriter {style.opacity: ${default-opacity}} - - scenarios: { - Setup: { - title.label: Setup - Solver: Solver {style.multiple: true} - (User -> Deposit Address)[0].style.opacity: 1 - (Order Server <-> Solver)[0].style.opacity: 1 - (User <-> Order Server)[0].style.opacity: 1 - } - Initiation: { - title.label: Initiation - Solver: Solver { - style.multiple: false - Input.style.fill: "#fbe1e3" - } - Solver.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - (Solver -> Order Server)[0].style.opacity: 1 - (Order Server -> Solver)[0].style.opacity: 1 - (Order Server -> User)[0].style.opacity: 1 - (Solver.Input -> Reactor.Input)[0].style.opacity: 1 - (Solver.Input -> Reactor.Input)[0].style.animated: true - (User -> Reactor)[0].style.opacity: 1 - (User.Output -> Deposit Address.Output)[0].style.opacity: 1 - (User.Output -> Deposit Address.Output)[0].style.animated: true - (User -> Order Server)[0].style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - Deposit Address.Output.style.opacity: 1 - } - Completion: { - title.label: Completion - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter.Input -> User.Input)[0].style.opacity: 1 - (Underwriter.Input -> User.Input)[0].style.animated: true - User.Input.style.opacity: 1 - Underwriter.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - Reactor.Input.style.fill: "#e5ffe7" - (Deposit Address.Output -> Solver.Output)[0].style.opacity: 1 - (Deposit Address.Output -> Solver.Output)[0].style.animated: true - - (Underwriter -> Reactor)[0].style.opacity: 1 - Solver.Output.style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - } - Finalisation: { - title.label: Finalisation - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter -> SPV Oracle)[0].style.opacity: 1 - (SPV Oracle -> Reactor)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.animated: true - Underwriter.Input.style.opacity: 1 - User.Input.style.opacity: 1 - Solver.Output.style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - } - } - ``` - - - ```d2 target=Finalisation - style.fill: transparent - direction: right - - title: Index { - near: top-center - shape: text - style: { - font-size: 40 - } - } - - vars: { - default-opacity: 0.1 - } - - User: { - Input: { - style.opacity: ${default-opacity} - } - Output: { - style.opacity: 1 - } - } - Deposit Address: { - shape: page - Output: { - style.opacity: ${default-opacity} - } - } - - Order Server - - Solver: Solver { - style.multiple: true - Input: { - style.opacity: 1 - style.fill: "#fbe1e3" - } - Output: { - style.opacity: ${default-opacity} - style.fill: "#fbe1e3" - } - style.fill: "#fbe1e3" - } - Underwriter: { - Input: { - style.opacity: 1 - style.fill: "#e5ffe7" - } - style.fill: "#e5ffe7" - } - - # On chain: - Reactor: { - Input: {style.opacity: ${default-opacity}} - } - SPV Oracle - - # Step 1. Get a quote for the user. - User <-> Order Server: 1.1 Quote {style.opacity: ${default-opacity}} - Order Server <-> Solver: 1.2 Quote {style.opacity: ${default-opacity}} - - # Step 2. Sign a message to generate deposit address - User -> Deposit Address: 2. Sign message to generate key {style.opacity: ${default-opacity}} - - # Step 3. Send BTC - User.Output -> Deposit Address.Output: 3. Send BTC {style.opacity: 0.11} - - # Step 4. Request signed order. - User -> Order Server: 4.1 Request Signed Order {style.opacity: ${default-opacity}} - Order Server -> Solver: 4.2 Request Signed Order {style.opacity: ${default-opacity}} - Solver -> Order Server: 4.3 Signed Order {style.opacity: ${default-opacity}} - Order Server -> User: 4.4 Signed Order {style.opacity: 0.11} - - # Step 5. Submit Signed Order - User -> Reactor: 5.1 Submit Signed Order {style.opacity: ${default-opacity}} - Solver.Input -> Reactor.Input: 5.2 Pull Input Tokens {style.opacity: 0.11} - - # Step 6. Send BTC to Solver - Deposit Address.Output -> Solver.Output: 6. Send Bitcoins {style.opacity: ${default-opacity}} - - # Step 7. Underwrite - Underwriter -> Reactor: 7.1 Purchase Order {style.opacity: ${default-opacity}} - Underwriter.Input -> User.Input: 7.2 Pull Inputs from underwriter to user {style.opacity: ${default-opacity}} - - # Step 8. Bitcoin Confirmed - Underwriter -> SPV Oracle: 8.1 Submit Proof {style.opacity: ${default-opacity}} - SPV Oracle -> Reactor: 8.2 Prove Bitcoin Transaction {style.opacity: ${default-opacity}} - Reactor.Input -> Underwriter.Input: 8.3 Pay underwriter {style.opacity: ${default-opacity}} - - scenarios: { - Setup: { - title.label: Setup - Solver: Solver {style.multiple: true} - (User -> Deposit Address)[0].style.opacity: 1 - (Order Server <-> Solver)[0].style.opacity: 1 - (User <-> Order Server)[0].style.opacity: 1 - } - Initiation: { - title.label: Initiation - Solver: Solver { - style.multiple: false - Input.style.fill: "#fbe1e3" - } - Solver.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - (Solver -> Order Server)[0].style.opacity: 1 - (Order Server -> Solver)[0].style.opacity: 1 - (Order Server -> User)[0].style.opacity: 1 - (Solver.Input -> Reactor.Input)[0].style.opacity: 1 - (Solver.Input -> Reactor.Input)[0].style.animated: true - (User -> Reactor)[0].style.opacity: 1 - (User.Output -> Deposit Address.Output)[0].style.opacity: 1 - (User.Output -> Deposit Address.Output)[0].style.animated: true - (User -> Order Server)[0].style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - Deposit Address.Output.style.opacity: 1 - } - Completion: { - title.label: Completion - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter.Input -> User.Input)[0].style.opacity: 1 - (Underwriter.Input -> User.Input)[0].style.animated: true - User.Input.style.opacity: 1 - Underwriter.Input.style.opacity: ${default-opacity} - Reactor.Input.style.opacity: 1 - Reactor.Input.style.fill: "#e5ffe7" - (Deposit Address.Output -> Solver.Output)[0].style.opacity: 1 - (Deposit Address.Output -> Solver.Output)[0].style.animated: true - - (Underwriter -> Reactor)[0].style.opacity: 1 - Solver.Output.style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - } - Finalisation: { - title.label: Finalisation - Solver: Solver {style.multiple: false} - Solver.Input.style.opacity: ${default-opacity} - (Underwriter -> SPV Oracle)[0].style.opacity: 1 - (SPV Oracle -> Reactor)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.opacity: 1 - (Reactor.Input -> Underwriter.Input)[0].style.animated: true - Underwriter.Input.style.opacity: 1 - User.Input.style.opacity: 1 - Solver.Output.style.opacity: 1 - User.Output.style.opacity: ${default-opacity} - } - } - ``` - - - - - -In-code underwriting is called `purchaseOrder` since this is exactly what happens. Orders have a `fillerAddress` configured. The `fillerAddress` is the destination for the inputs once an order has been correctly finalized. - -Purchasing the order from the `fillerAddress` requires sending the inputs (minus a discount) to `fillerAddress`. In exchange, the underwriter gets to set `fillerAddress` to their address thus when the order is finalized they receive the inputs and they gain the discount. Any collateral is exchanged 1:1. - -```solidity -function purchaseOrder(OrderKey calldata orderKey, bytes calldata fillerData, uint256 minDiscount) external; -```` -The `purchaseOrder` function is called. - -Before an underwriter underwrites/purchases an order, it is important to validate that the outputs have been delivered. The underwriter does not gain the entirety of the outputs and won't be able to pay for delivering the outputs based on the discount. - -## Underwriting an Order - -Underwriting a BTC -> EVM swap and EVM -> BTC swap works in the same way. From an underwriter's perspective there is no difference. - -For an underwriter, the flow starts when an order is initiated. On order initiation, the event `OrderInitiated` [is emitted](https://github.com/catalystdao/cross-cats/blob/80610c30b9ffc9604a92803adf96c864be23e66c/src/reactors/BaseReactor.sol#L190). It contains the order key along with important relevant information for an underwriter. Importantly, the order key contains a description of the outputs of the order. The underwriter needs to monitor for a payment of the outputs after which they can call [purchaseOrder](https://github.com/catalystdao/cross-cats/blob/80610c30b9ffc9604a92803adf96c864be23e66c/src/reactors/BaseReactor.sol#L406) to underwrite the order. - -## Underwriting Bitcoin Outputs - -Bitcoin underwriting has 2 levels: -1. Inclusion probability. -2. Pre-confirmations - -Initially, Catalyst will operate exclusively on level 1. - -### Inclusion probability - -Bitcoin transactions have several parameters that describe how and when a transaction may be included: -- RBF: If a transaction has replace-by-fee enabled it can easily be double spent. As a result, this should always be disabled. -- Transaction fee, sat/vB: A higher fee increases the inclusion likelihood. Additionally, If RBF is disabled miners are less incentivized to cheat by including a transaction that has a higher fee since the fee is already high. -- Parents / Children: If the transaction has several children that pay for parents or unconfirmed parents it changes the inclusion likelihood. -- Age: Transactions that have been in the memory pool for longer are more likely to not be replaced. Additionally, in the first 3 minutes of a transaction's life, it miss a mined block. -- Amount: Replacing transactions has a cost and for smaller transactions, it isn't worth it. -- Propagation: By monitoring memory pools all over the world, double spending transactions can be observed. - -By evaluating these parameters over time along with pen-testing, a configuration that leads to a high likelihood of inclusion can be found. - -### Pre-confirmations - -The "public memory" pool isn't the be-all and end-all. Transactions are only included if miners include them and miners have their only memory pool that they rely on. By searching miner memory pools for double spends, it can be guaranteed to a higher degree that invalidating transactions won't be included. Excluding double spending here achieves weak pre-confirmation. - -Strong pre-confirmations are achieved when whole blocks are managed. This requires excluding blocks that include private double spends. This requires on-boarding a significant amount of miners to ensure the blockchain without double spending remains the highest and also increases miner costs because of orphaned blocks. - -## Underwriting VM Outputs. - -Most virtual machine chains have significantly faster block times than Bitcoin. As a result, there is no need to worry about pre-confirmations. Additionally, the biggest time-saving component is the delay between the delivery of outputs and to finality/messaging delay. This may be between 12 minutes, 30 minutes, and 2 hours. diff --git a/src/content/docs/generalised-incentives/build-bridge-agnostic.md b/src/content/docs/generalised-incentives/build-bridge-agnostic.md deleted file mode 100644 index 6b33ecc..0000000 --- a/src/content/docs/generalised-incentives/build-bridge-agnostic.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: "Build Bridge Agnostic" -description: "Are you building a cross-chain application and are you tired of vendor lock-in? So are we! Generalised Incentives allows you to support a wide variety of messaging bridges while standarding the user interface." -sidebar: - order: 1 ---- - -Are you building a cross-chain application and are you tired of vendor lock-in? So are we! - -At Catalyst, we have designed [Generalised Incentives](https://github.com/catalystdao/GeneralisedIncentives) to simplify cross-chain app development and let you choose the best AMB for your application using a common set of standardized incentives and interfaces. Generalised Incentives is sometimes referred to as GARP which is shorthand for General Automatic Relayer Payment. - -Currently, Generalised Incentives support the following AMBs: - -- **Wormhole**: Full support via Generalised Relayer -- **Polymer**: Full support via Polymer's Relayer - -You can read more about the benefits of [Generalised incentives on Github](https://github.com/catalystdao/GeneralisedIncentives?tab=readme-ov-file#generalised-incentive-escrow). - -### The Case of Catalyst - -Generalised Incentives allows Catalyst to be agnostic to interoperability protocols and allows us to leverage any arbitrary message bridge (AMB) to send the Unit of Liquidity across chains. This ensures that our users will experience the same consistent high-quality UX as every AMB has the same interface. As a result, Catalyst is guaranteed to be the liquidity protocol with most supported chains. - -Arbitrary message agnosticism has two main advantages: - -- The cross-chain attack surface is limited to a single message as opposed to 4-6 attack surfaces of existing solutions. -- Cross-chain pool creators can choose the best AMB depending on their use-case. - -### You here? - -Are you building with Generalised Incentives? Submit a PR and get a shoutout on this page. diff --git a/src/content/docs/generalised-incentives/integrate.md b/src/content/docs/generalised-incentives/integrate.md deleted file mode 100644 index 932b457..0000000 --- a/src/content/docs/generalised-incentives/integrate.md +++ /dev/null @@ -1,169 +0,0 @@ ---- -title: "Integrate GARP" -description: "Add Generalised Incentives to your contract today!" -sidebar: - order: 2 ---- - -For the following tutorial we are going to assume you use Foundry. If you are using other frameworks, you may need to copy the relevant interfaces into your repository. - -## Installation - -To install Generalised Incentives as a dependency in your repository, run - -```bash -forge install https://github.com/catalystdao/GeneralisedIncentives.git -``` - -This will add Generalised Incentives to your repository and you are now ready to integrate it into your contract. - -## Integration - -Start by adding import statements to your smart contract file. We need to import 2 files: - -- [ICrossChainReceiver](https://github.com/catalystdao/GeneralisedIncentives/blob/main/src/interfaces/ICrossChainReceiver.sol): This will ensure you correctly implement the interfaces for the message callbacks -- [IIncentivizedMessageEscrow](https://github.com/catalystdao/GeneralisedIncentives/blob/main/src/interfaces/IIncentivizedMessageEscrow.sol): This will ensure you correctly call the message escrow correctly. -- [Optionally] [IMessageEscrowStructs](https://github.com/catalystdao/GeneralisedIncentives/blob/main/src/interfaces/IMessageEscrowStructs.sol): To simplify struct handling. - -Adding these to your contract will look something like this: - -```solidity -//SPDX-License-Identifier: -pragma solidity ^0.Y.X; - -import { ICrossChainReceiver } from "GeneralisedIncentives/src/interfaces/ICrossChainReceiver.sol"; -import { IIncentivizedMessageEscrow } from "GeneralisedIncentives/src/interfaces/IIncentivizedMessageEscrow.sol"; -import { IMessageEscrowStructs } from "GeneralisedIncentives/src/interfaces/IMessageEscrowStructs.sol"; - -contract YourContract is ICrossChainReceiver, IMessageEscrowStructs { - ... -} -``` - -### Defining Structures - -The integration is less opinionated than other cross-chain endpoint, as we need to define some boilercode. First, lets set our escrow endpoint. Below we present 2 options - -1. Set the escrow explicitly. This defines a single escrow which you may interact in. This may be desired to reduce complexity but also introduces some vendor lock-in. -2. Define a list of escrow that are allowed. This allows you to pick and choose which AMB is best suited for a certain connection. This introduces some additional complexity but mitigates vendor lock-in. - -```solidity -contract YourContract is ICrossChainReceiver, IMessageEscrowStructs { - - // Solution 1 sets the escrow explicitly. If you don't plan on changing - // AMB in the future immutable save gas when read. However, you can also - // forgo the immutable word to be able to change the escrow. - // We recommend setting the storage or exposting it to let other people - // know which escrow this contract is using. - IIncentivizedMessageEscrow immutable public escrow; - - // Solution 2 sets a map between escrow addresses and booleans. This - // is significantly more customizable as it allows for multiple AMBs - // to be used from a single contract. With a bit further modification - // you can also set which escrows are allowed for which chain identifiers. - mapping(address => bool) approvedEscrows; - - constructor(address escrow) { - // Solution 1: Set the escrow. - escrow = IIncentivizedMessageEscrow(escrow); - // Solution 2: Store the escrow as approved. - approvedEscrows[escrow] = true; - } - - // We need to validate senders. Lets define a custom error for our modifier. - error NotApprovedEscrow(); - // Validating function inputs if most often done with modifiers as it reduces - // code reuse. We will define onlyEscrow() as a check on msg.sender. - modifier onlyEscrow() { - // Solution 1: We can simply check explicitly if there is a match. - // if the caller isn't the escrow, revert with NotApprovedEscrow - if (msg.sender != address(escrow)) revert NotApprovedEscrow(); - // Solution 2: We need to make a lookup to check if the caller is approved. - // if the caller isn't the approved, revert with NotApprovedEscrow - if (!approvedEscrows(msg.sender)) revert NotApprovedEscrow(); - _; - } -} -``` - -### Callbacks - -Generalised Incentives defines 2 callback functions we need to implement: - -- receiveAck: Called when a message has been processed on the destination. -- receiveMessage: Called when you receive a message from the source chain. - -Lets add these functions to our contract - -```solidity - -contract YourContract is ICrossChainReceiver, IMessageEscrowStructs { - error AckAlreadyDelivered(); - - event WowAck( - bytes1 status, - bytes acknowledgement, - ); - - // Generalised Incentives allows replaying acks. As a result, it is important - // that you ensure that acks cannot be delivered multiple times. - mapping(bytes => bool) ackSpent; - - // Remember to add your onlyEscrow modifier. - function receiveAck(bytes32 destinationIdentifier, bytes32 messageIdentifier, bytes calldata acknowledgement) onlyEscrow() external { - - if (ackSpent[acknowledgement]) revert AckAlreadyDelivered(); - ackSpent[acknowledgement] = true; - - // Wow, much ACK! - // IF the transaction fails, the first byte of the transaction is an error code and - // the rest of the package is your original message. Use this to your advantage. - emit WowAck(acknowledgement[0], acknowledgement[1:]); - } - - // Remember to add your onlyEscrow modifier. - function receiveMessage(bytes32 sourceIdentifierbytes, bytes32 messageIdentifier, bytes calldata fromApplication, bytes calldata message) onlyEscrow() external returns(bytes memory acknowledgement) { - // Do some processing and then return back your ack. - // Notice that we are sending back 00 before our message. - // That is because if the message fails for some reason, - // an error code is prepended to the message. - // By always sending back hex"00", we ensure that the first byte is unused. - // Alternatively, use this byte as our own failure code. - return bytes.concat( - hex"00", - keccak(message) - ); - } -} -``` - -We now implemented the reference code for Generalised incentives and is ready for processing messages sent to us. - -:::danger -Ack messages can be replayed! Ensure that acks cannot be submitted to your contract twice. In the above example we check if a message has already been delivered by looking it up in a map. There are other ways to facilitate this, like checking against a piece of data in the ack. -::: - -For more information, check the relevant [natspecs](https://github.com/catalystdao/GeneralisedIncentives/blob/main/src/interfaces/ICrossChainReceiver.sol). - -### Sending Messages - -We haven't actually sent any messages yet. Lets do that. For simplicity, this section assumes that you used solution 1. - -```solidity - -contract YourContract is ICrossChainReceiver, IMessageEscrowStructs { - // If your contract didn't inherit IMessageEscrowStructs, you may have to - // set the type of incentive to IIncentivizedMessageEscrow.IncentiveDescription. - function sendMessage(bytes32 destinationIdentifier, bytes destinationAddress, bytes calldata message, IncentiveDescription calldata incentive, uint64 deadline) payable external { - // Submit the message to the escrow. Remember to add associated value. - // If you send excess, it will be sent to incentive.refundGasTo. - escrow.submitMessage{value: msg.value}( - destinationIdentifier, - destinationAddress, - message, - incentive, - deadline - ); - } -} -``` diff --git a/src/content/docs/implementation/1-input-settlement.md b/src/content/docs/implementation/1-input-settlement.md new file mode 100644 index 0000000..eb4286c --- /dev/null +++ b/src/content/docs/implementation/1-input-settlement.md @@ -0,0 +1,98 @@ +--- +title: "Input Settlement" +slug: "input" +description: "Built with resource locks in mind, Catalyst supports a variety of input settlement schemes; TheCompact and Rhinestone both allows for first fill flows and sponsored transactions assuming the user have existing deposits." +sidebar: + order: 1 +--- + +Catalyst currently implements 2 input settlement: +1. [TheCompact](https://github.com/Uniswap/the-compact) through `CompactSettlerWithDeposit.sol` +2. [Rhinestone](https://www.rhinestone.wtf) through `CompactSettler.sol` + +Both TheCompact and Rhinestone are resource locks and thus Fill first flows. However, Catalyst also supports ordinary flows. + +Catalyst provides a base implementation for settlement schemes via `BaseSettler.sol`. Alternatively, if possible `CompactSettler.sol` can be forked with less effort. + +#### Default Output +The default output for settlement schemes is the `OutputDescription`: +```solidity +struct OutputDescription { + bytes32 remoteOracle; + bytes32 remoteFiller; + uint256 chainId; + bytes32 token; + uint256 amount; + bytes32 recipient; + bytes remoteCall; + bytes fulfillmentContext; +} +``` +To check if the [encoded output description](/#standardized-message-format) has been validated, the hashed encoded payload should be sent to th appropriate local oracle using the [Validation Layer Interface](/#validation-layer) along with relevant resolution details like who the solver was. + +## CompactSettler (TheCompact & Rhinestone) +Both Rhinestone and TheCompact works through `CompactSettler.sol`. Being able to solve for one allows you to solve the other, except signature & lock validation differs slightly. + +The Compact Settler uses the `CatalystCompactOrder`: +```solidity +struct CatalystCompactOrder { + address user; + uint256 nonce; + uint256 originChainId; + uint32 fillDeadline; + address localOracle; + uint256[2][] inputs; + OutputDescription[] outputs; +} +``` +Notice that the fillDeadline is also used as the expiry for the timelock. As a result, when filling outputs of CatalystCompactOrder ensure there is sufficient time for validation as well. + +The CompactSettler supports 5 ways to resolve locks once the outputs have been made available for verification by the validation layer: + +```solidity +function finaliseSelf(CatalystCompactOrder calldata order, bytes calldata signatures, uint32[] calldata timestamps, bytes32 solver) external; + +function finaliseTo(CatalystCompactOrder calldata order, bytes calldata signatures, uint32[] calldata timestamps, bytes32 solver, address destination, bytes calldata call) external; + +function finaliseFor( + CatalystCompactOrder calldata order, + bytes calldata signatures, + uint32[] calldata timestamps, + bytes32 solver, + address destination, + bytes calldata call, + bytes calldata orderOwnerSignature +) external; + +// -- Fallback Finalise Functions -- // + +function finaliseTo(CatalystCompactOrder calldata order, bytes calldata signatures, uint32[] calldata timestamps, bytes32[] calldata solvers, address destination, bytes calldata call) external; + +function finaliseFor( + CatalystCompactOrder calldata order, + bytes calldata signatures, + uint32[] calldata timestamps, + bytes32[] calldata solvers, + address destination, + bytes calldata call, + bytes calldata orderOwnerSignature +) external; +``` + +Notice that the fallback functions exist to fix orders that have been solved by multiple solvers. This is required because we need to hydrate the OutputDescription with the solver to check if the output has been filled on the Validation Layer. + +### Registering Intents + +For how to register intents with Rhinestone, please refer to their docs. + +For TheCompact, `CompactSettler.sol` supports the `BatchClaimWithWitness` claim type. The witness shall be the encoded `CatalystCompactOrder`. For further integration aid, refer to `TestCatalyst.t.sol::test_entire_flow`. + +#### With Deposit + +When integrating CompactSettler, if the settler uses the `withDeposit` extension, you may use the associated deposit function. This allows you to deposit & register an intent at the same time to reduce the number of user interacts by 1. + +```solidity +function depositFor(CatalystCompactOrder calldata order, ResetPeriod resetPeriod) external; +``` + +Notice that nonces can not be reused and should be unique. diff --git a/src/content/docs/implementation/2-output-settlement.mdx b/src/content/docs/implementation/2-output-settlement.mdx new file mode 100644 index 0000000..4a64055 --- /dev/null +++ b/src/content/docs/implementation/2-output-settlement.mdx @@ -0,0 +1,37 @@ +--- +title: "Output Settlement" +slug: "output" +description: "Catalyst currently supports 2 order types: simple limit orders and dutch auctions. However, the Catalyst System was designed with flexbility in mind and more can easily be added." +sidebar: + order: 2 +--- + +Catalyst's first filler – `CoinFiller.sol` – supports 2 order types: simple limit orders and dutch auctions. + +## CoinFiller + +To configure whether to use limit order or dutch auction, set the associated `fulfillmentContext` on the `OutputDescription`. + +import { Code } from '@astrojs/starlight/components'; + +export const outputDescription = ` +struct OutputDescription { + ... + bytes remoteCall; + bytes fulfillmentContext; +}`; + + + +Using the following pesudocode. + +```solidity +uint256 slope; +uint256 stopTime; +"limit" | "dutch" orderType; + +if (orderType == "limit") fulfillmentContext = "0x" || fulfillmentContext = "0x00"; +if (orderType == "dutch") fulfillmentContext = abi.encodePacked(0x01, slope, stopTime) +``` + +Specifically for dutch auction, if the order contains multiple outputs only the first one will work as an auction and the last ones will resolve to the worst price. That is because solvers are only incentivised to compete on the first output in an order since the winner of that order is the winner of the entire order _once anyone_ fills the rest of the outputs. diff --git a/src/content/docs/implementation/3-validation-layers.md b/src/content/docs/implementation/3-validation-layers.md new file mode 100644 index 0000000..a328130 --- /dev/null +++ b/src/content/docs/implementation/3-validation-layers.md @@ -0,0 +1,92 @@ +--- +title: "Validation Layers" +slug: "validation" +description: "Each Catalyst System order specifies which components are used for which aspects of the swap. Validation layers can permissionlessly chosen by the issuer of an intent and anyone can write a validation layer." +sidebar: + order: 3 +--- + +Any valdiation layer can be added to Catalyst as long as it supports validating a payload from a remote chain. + +In the simplest implementation, a validation layer needs to support the following: + +1. Some submission interface where solvers can submit their filled outputs. The submission interface should take in arbitrary packages for validation and then call the associated output settlement contract to validate whether the payloads are valid. + ```solidity + interface IPayloadCreator { + function arePayloadsValid( + bytes[] calldata payloads + ) external view returns (bool); + } + ``` + +2. Implement the associated validation interfaces, such that Input Settlement implementations can accurately verify whether outputs have been filled. + ```solidity + interface IValidationLayer { + /** + * @notice Check if some data has been attested to. + * @param remoteChainId Chain the data supposedly originated from. + * @param remoteOracle Identifier for the remote attestation. + * @param remoteApplication Identifier for the application that the attestation originated from. + * @param dataHash Hash of data. + */ + function isProven(uint256 remoteChainId, bytes32 remoteOracle, bytes32 remoteApplication, bytes32 dataHash) external view returns (bool); + + /** + * @notice Check if a series of data has been attested to. + * @dev More efficient implementation of isProven. Does not return a boolean, instead reverts if false. + * This function returns true if proofSeries is empty. + * @param proofSeries remoteOracle, remoteChainId, and dataHash encoded in chucks of 32*4=128 bytes. + */ + function efficientRequireProven( + bytes calldata proofSeries + ) external view; + } + ``` + +Importantly, the submission interface does not have to be standardized; As long as it is accurately documented for solvers to implement. + +Notice! While this has been designed for explicit verification, optimistic validations layers are also supported when they can expose the above proof interfaces. + +## Implemented Validation Interfaces + +There are 2 types of validation interfaces: +1. Self-serve: Validation interfaces where the submission of the payload generates an off-chain proof that has to be collected and submitted on the input chain. +2. Automatic: Validation interfaces where the submission of the payload automatically delivers the associated proof on the input chain. + +Currently, 2 self-serve validation interfaces are implemented while 0 automatic interfaces are supported.. + +### Wormhole (self-serve) + +The Wormhole implementation is based on the broadcast functionality of Wormhole. A group of payloads can be collected and packed into larger message: + +``` +Common Structure (Repeated 0 times) + SENDER_IDENTIFIER 0 (32 bytes) + + NUM_PAYLOADS 32 (2 bytes) +Payloads (repeated NUM_PAYLOADS times) + PAYLOAD_LENGTH M_i+0 (2 bytes3) + PAYLOAD M_i+2 (PAYLOAD_LENGTH bytes) + +where M_i = sum_0^(i-1) M_i and M_0 = 32 +``` + +To then be emitted to the Wormhole guardian set. Once the associated proof becomes available, the solver can submit the associated proof on the input chain and validate their intents. + +Notice that the Wormhole implementation uses a more efficient validation algorithm than `Implementation.sol`. + +Solvers wanting to support orders using the Wormhole validation layer needs to listen to the Guardian gossip network to collect proofs. + +### Polymer (self-serve) + +Polymer allows validating specific events. As a result, the fill event is parsed: +```solidity +event OutputFilled(bytes32 orderId, bytes32 solver, uint32 timestamp, OutputDescription output); +``` + +and converted into the appropriate payload for the input settlement layer: +```solidity +(bytes32 solver, uint32 timestamp, OutputDescription memory output) = abi.decode(unindexedData, (bytes32, uint32, OutputDescription)); +bytes32 payloadHash = _proofPayloadHash(orderId, solver, timestamp, output); +``` + +Solvers wanting to support orders using the Polymer validation layer needs to implement the Polymer API to collect relevant event proofs. \ No newline at end of file diff --git a/src/content/docs/implementation/999-calls.mdx b/src/content/docs/implementation/999-calls.mdx new file mode 100644 index 0000000..8c24c71 --- /dev/null +++ b/src/content/docs/implementation/999-calls.mdx @@ -0,0 +1,82 @@ +--- +title: "Sub-Calls via Catalyst" +description: "By default, Catalyst supports calls on delivery. While the system does not define these, the default output types contain fields to facilitate secondary execution." +sidebar: + order: 999 +--- + +The default output type of Catalyst, called `OutputDescription` supports secondary calls. This allows you to schedule calldata to be executed after the delivery of the asset. + +:::caution[Outputs are filled unorderly] +Output are filled unorderly. As a result, if you want to receive both Ether and USDC to your destination contract and then execute a call using both Ether and USDC, this may not be possible. This is because either USDC and Ether may arrive before the other and as a result the logic may not correctly execute. +::: + +Natively, Catalyst will deliver the output of `OutputDescription` and then call the destination + +```solidity +/** + * @notice Implement callback handling for Cross cats payouts, both outputs and inputs. + * @dev Callbacks are opt-in. If you opt-in, take care to not revert. + * Funds are likely in danger if the calls revert. Please be careful. + * + * If you don't need this functionality, stay away. + * + * The recipient is called. + */ +interface ICrossCatsCallback { + /** + * @dev If the transaction reverts, 1 million gas is provided. + * If the transaction doesn't revert, only enough gas to execute the transaction is given + a buffer of 1/63'th. + * The recipient is called. + * If the call reverts, funds are still delivered to the recipient. + * Please ensure that funds are safely handled on your side. + */ + function outputFilled(bytes32 token, uint256 amount, bytes calldata executionData) external; + + /** + * @notice If configured, is called when the input is sent to the filler. + */ + function inputsFilled(uint256[2][] calldata inputs, bytes calldata executionData) external; +} +``` + +Additionally, Catalyst provides a basic multicall handler with the following defines structs: + +```solidity +struct Call { + address target; + bytes callData; + uint256 value; +} + +struct Instructions { + // If set to an address (not address(0)), then the tokens sent to this contract on the call + // will be approved for this address. + address setApprovalsUsingInputsFor; + // Calls that will be attempted. + Call[] calls; + // Where the tokens go if any part of the call fails. + // Leftover tokens are sent here as well if the action succeeds. + address fallbackRecipient; +} +``` + +Which when used: `executionData = abi.encode(Instructions)`. + +For the default Catalyst `OutputDescription`: + +import { Code } from '@astrojs/starlight/components'; + +export const outputDescription = ` +struct OutputDescription { + bytes32 remoteOracle; + bytes32 remoteFiller; + uint256 chainId; + bytes32 token; + uint256 amount; + bytes32 recipient; // = addressOf(CatsMulticallHandler) + bytes remoteCall; // = abi.encode(Instructions) + bytes fulfillmentContext; +}`; + + \ No newline at end of file diff --git a/src/content/docs/implementation/ERC7683.md b/src/content/docs/implementation/ERC7683.md new file mode 100644 index 0000000..dc68f44 --- /dev/null +++ b/src/content/docs/implementation/ERC7683.md @@ -0,0 +1,32 @@ +--- +title: "ERC7863 Contributions" +description: "CrossCats is contributing to making ERC7863 more compatible with resourec locks." +sidebar: + order: 1000 +--- + +Catalyst strives to support through contributing to improving the standard to better support resource locks and make ERC-7683 more future proof. + +## General Incompatibilities + +* ERC-7683 puts a lot of focus on the open interface. This makes sense, since the initial version of ERC-7683 was conceived before resource locks. However, with resource locks, it presents a challenge as orders don’t always start with on-chain calls anymore. +* The ERC-7683 fill function is expensive since it works with memory, and not calldata, because of the transparent bytes provided. + +### Our Recommendations + +* Add address user, uint256 nonce to OnchainCrossChainOrder. + * Goal: To clear up confusion regarding who the depositor is. (Tokens should still be collected from msg.sender) +* Convert the open event into event Open(bytes32 indexed orderId, bytes resolveContext) and add resolve functions taking the original order and resolveContext to accurately produce the ResolvedCrossChainOrder from an off-chain view call. + * Goal: To reduce the cost of emitting the Open event. +* Make function open(...), openFor(...) optional. +@nambrot nambrot last week +As per above, totally possible to make the open semantics more generic + @reednaa Reply... + * Goal: Make it explicit that open should only be used for depositing. +* Make function validate(...) view returns (uint32 fillDeadline) function to easily validate whether an order is valid. + * Goal: Provide an explicit way for pure off-chain orders to be validated + +Additionally, the specification should contain a description of how to integrate the lock flow: Outputs first, inputs second. + +You can read more about our recommendations for change here: +https://github.com/ethereum/L2-interop/pull/15/files#diff-636d6bbfc9b1e613195503fdc721676aebdd4dd14eeb8d1ac5fb79cceaf2bc2eR28-R46 \ No newline at end of file diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index 226aa49..a32d474 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -1,55 +1,166 @@ --- -title: Catalyst Knowledge Hub -description: The Catalyst for Cross-Chain Applications! +title: Catalyst Intent System +description: Catalyst Intents standardizes the 3 components to an intent, the input context, the output context, and the verification layer. This allows Catalyst to be efficient, flexible, and extensive. hero: - tagline: The Catalyst for Cross-Chain Applications + tagline: Defining the components that makes intents image: light: "/src/assets/symbol_dark.svg" dark: "/src/assets/symbol_light.svg" --- -Welcome to the Catalyst docs! This guide will provide you with a simple, easy-to-understand introduction to Catalyst, explaining its purpose, key features, and benefits. - -## What Is Catalyst? - -Catalyst is the permissionless liquidity engine for the modular future. Catalyst consists of multiple complementary liquidity engines like cross-chain automated market marker (AMM) and a cross-chain intent network. The Catalyst AMM can facilitates atomic native asset swaps from different chains while the intent layer can be used on top to optimise settlement speed & provide access to an even wider variety of assets. Catalyst can be deployed on any chain and allows liquidity to be sourced from any other connected ecosystem such as Ethereum, Cosmos and L2s. - -The vision for Catalyst is to be a permissionless liquidity layer for all chains. Catalyst will have permissionless deployments, meaning that any new chain can automatically have Catalyst contracts deployed with it—connecting the chain with all the other Catalyst deployments on all other chains. The goal of Catalyst is to create an interconnected ecosystem where users can effortlessly access assets and applications across multiple chains, and developers can easily launch new blockchains and connect them to existing networks and their respective users. - -## What Is The Modular Future? - -It’s become trivially easy to launch a new chain. Modular blockchains – a relatively new concept in crypto – are blockchains that are made up of different modules that can be added or removed as needed. Each module performs a specific function, making the blockchain more flexible and adaptable to changing needs, allowing for greater customization and specialization. Modular blockchains can help increase the scalability and efficiency of blockchain networks, allowing more people to begin to adopt and use crypto technology. - -Modular blockchains are easier to configure and deploy than traditional blockchains, which will enable an explosion in the number of blockchains. As an industry, we are currently connecting chains in the same way we were in 2020, taking 2-3 weeks to establish connections. As new chains continue to launch, they remain siloed and fragmented, hindering trade between them. In fact, there’s not much to do for a modular chain after launch if they can’t connect to another blockchain. - -Catalyst introduces a new cross-chain paradigm that automatically connects chains as they launch, and efficiently shares liquidity between them – dissolving the barriers between chains as a global liquidity layer. - -## Why Is Catalyst Needed? - -Catalyst has a vision for a global liquidity layer for all chains—available automatically at launch. With an innovation called unit of liquidity, Catalyst can automatically connect to any new chain in a future of continued chain proliferation. - -1. **Permissionless Liquidity**: Catalyst democratizes access to blockchains by enabling permissionless liquidity. By allowing any new chain to connect with any desired chains (whether it be an established hub like Ethereum or a newer modular chain), Catalyst reduces overhead in expanding into new chains and accessing their liquidity, thereby providing support for the long tail of assets not found on any other on-chain venue. - -2. **Cross-Chain Interoperability**: As the number of blockchain networks continues to grow, it's essential to have a solution that enables seamless communication and liquidity movement between them. Catalyst facilitates cross-chain swaps, allowing users to access applications and assets on different chains without being restricted by their current holdings. - -3. **Simplified Integration for Developers**: Catalyst streamlines the process for developers to create new chains and connect them to existing networks. This encourages innovation and helps developers scale their projects, ultimately leading to a more diverse and robust ecosystem of applications and services for users. - -import Card from '../../components/Card.astro'; -import CardGrid from '../../components/CardGrid.astro'; - -## Our advantages - - - - New chains are integrated into Catalyst immediately as they are deployed. Cross-chain liquidity pools and cross-chain asset swaps are open for anyone to initialize. - - - Catalyst sends one single, lightning-fast cross-chain message and only leverages battle-tested, trust-minimized protocols like IBC. - - - One-click transaction experience using native assets. Capital efficient liquidity provisioning, and sustainable yield through MEV recapture. - - - By using a combination of multiple complementary systems like AMM, underwriting, intents, and more the speed can be optimised without sacrafising security. - - +All intents, whether Catalyst'tic or not, require 3 components: +1. Input settlement scheme +2. Output settlement scheme. +3. Validation layer. + +Historically, these have all been the intertwinced. This presents issues with scaling the system, as adding new validation layers, order types, virtual machine implementations, or supporting upcoming technologies may require larger rewrites of the system. + +## System Design +The Catalyst Intent System is an asset flow first system. This allows Catalyst to support varying degrees of asset technologies: fill first, user as solver, and ordinary swaps. As a result, it makes sense to move backwards through the stack, starting with the output settlement scheme. + +```d2 +style.fill: transparent +direction: right + +title: Catalyst Overview { + near: top-center + shape: text + style: { + font-size: 40 + } +} + +Output Chain.Remote Oracle -> Input Chain.Local Oracle: 4. Relay fill + +Input Chain: { + User -> Lock: 0. Deposit + Settler -> Local Oracle: 5. Check Fill + Settler -> Lock: 6. Unlock Funds + Lock -> Solver: 7. Payment + Local Oracle.shape: page + Lock.shape: page + Settler.shape: page +} + +Output Chain: { + Solver -> Filler: 1. Order Fill + Filler -> User: 2. Payment + Remote Oracle -> Filler: 3. Check Fill + Remote Oracle.shape: page + Filler.shape: page +} + +``` + +### Output Settlement +The standard imposes no interface requirements, order structure, or order type except that an interface to validate payloads is provided: +```solidity +interface IPayloadCreator { + function arePayloadsValid( + bytes[] calldata payloads + ) external view returns (bool); +} +``` +This allows the output settlement scheme to be incredible flexible, it can support any order type, on any virtual machine, as long as the filled order can be expressed as an opaque bytes array. + +For simplicity, lets assume that an output can be expressed as `[token, amount, destination]`. If this output has been filled, then a valid payload could be `bytes(solver | token | amount | destination)`. + +If the input settlement could validate this call, the inputs could be appropriately paid to the solver. However, this information only exists on the output settlement on the output chain. + +### Validation Layer + +The validation layer serves to ferry valid payloads to the input chain. As a result, it is expected that before making messages the validation layer checks if one or more payloads are valid and then ship them to the input chain: + +```solidity +function submit(address proofSource, bytes[] calldata payloads) external payable { + // Check if the payloads are valid. + if (!IPayloadCreator(proofSource).arePayloadsValid(payloads)) revert NotAllPayloadsValid(); + + // Payloads are good. We can submit them on behalf of proofSource. + _submit(proofSource, payloads); +} +``` +How validator layers pass the information to the input chain is scoped. They may be using custom message encodings, custom relaying properties, custom interfaces, or other special integration concerns. + +On the input chain, it is expected that the validator layer validates the payload(s) through a virtual machine local hash: +```solidity +interface IValidationLayer { + /** + * @notice Check if some data has been attested to. + * @param remoteChainId Chain the data supposedly originated from. + * @param remoteOracle Identifier for the remote attestation. + * @param remoteApplication Identifier for the application that the attestation originated from. + * @param dataHash Hash of data. + */ + function isProven(uint256 remoteChainId, bytes32 remoteOracle, bytes32 remoteApplication, bytes32 dataHash) external view returns (bool); + + /** + * @notice Check if a series of data has been attested to. + * @dev More efficient implementation of isProven. Does not return a boolean, instead reverts if false. + * This function returns true if proofSeries is empty. + * @param proofSeries remoteOracle, remoteChainId, and dataHash encoded in chucks of 32*4=128 bytes. + */ + function efficientRequireProven( + bytes calldata proofSeries + ) external view; +} +``` + +Using only the payload hash makes the system more efficient as less data is passed around. + +No attempt is made at [standardizing the payload](#standardized-message-format). As a result, there may be incompatibilities between the input and output settlement layer. + +### Input Settlement + +While being nesseary for an intent system, Catalyst imposes no restriction on the implementation. Input Settlements can access proven output through the validation layer by either `isProven` or `efficientRequireProven`. + +If an order contains multiple outputs and the outputs are filled by different solvers, the filler of the first output in the order specification shall be the canonical solver. + +## Unsolved Issues + +The following issues are unsolved. + +### Standardized Message Format +Currently, the input settlement scheme and the output settlement scheme has to agree on an order-type specific payload. If a new order type or settlement system requires more functionality beyond the implemented message payload, it requires deploying these components over. This also break composability between these layers. + +Assuming the output description can be represented as: +```solidity +struct OutputDescription { + bytes32 remoteOracle; + bytes32 remoteFiller; + uint256 chainId; + bytes32 token; + uint256 amount; + bytes32 recipient; + bytes remoteCall; + bytes fulfillmentContext; +} +``` +The proposed message format is the following: +``` +Encoded FillDescription + SOLVER 0 (32 bytes) + + ORDERID 32 (32 bytes) + + TIMESTAMP 64 (4 bytes) + + TOKEN 68 (32 bytes) + + AMOUNT 100 (32 bytes) + + RECIPIENT 132 (32 bytes) + + REMOTE_CALL_LENGTH 164 (2 bytes) + + REMOTE_CALL 166 (LENGTH bytes) + + FULFILLMENT_CONTEXT_LENGTH 166+RC_LENGTH (2 bytes) + + FULFILLMENT_CONTEXT 168+RC_LENGTH (LENGTH bytes) +``` + +NOTE! No assumptions are ever made on how validation layers pass messages between each other. They can pack fill descriptions however they like. + +### Atomic Swaps and HTLCs as validation layers. + +HTCLs works very differently from ordinary intent schemes as they require a round of strong commitments. This pre-bakes certain system assumptions which cannot be abstracted away through the Catalyst Intent System. As a result, these are not considered. + +### Integration Overheads + +As interfaces and validation layers are not standardized, each new order type, validation layer, or settlement scheme presents additional integration overhead. However, since components are eagerly reused the system complexity scales `O(n)` instead of `O(n^3)` with `n` roughly being equal to the number of components. + +### Optimistic Validation layers + +The current validation layers mainly support explicit validation. Optimistic validation can be implemented but requires each output to have an on-chain storage. This increases the gas cost. \ No newline at end of file diff --git a/src/content/docs/introduction/UoL2.png b/src/content/docs/introduction/UoL2.png deleted file mode 100644 index a444a9a15db317cda89bff22ef341ab20f615aef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59605 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 +VB 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 wnaN&e0bzik^&RbF|T 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 XR}{V>D;Q&_e-0UtqC}0DQQ-dpZ*Zg4 diff --git a/src/content/docs/introduction/differentiator.md b/src/content/docs/introduction/differentiator.md deleted file mode 100644 index 31636eb..0000000 --- a/src/content/docs/introduction/differentiator.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Catalyst Differentiators" -description: "1. Permissionless pool creation. 2. User experience. 3. Scalable liquidity. 4. Security by design." -sidebar: - order: 3 ---- - -The creation of the unit of liquidity enables 4 significant improvements from current solutions: - -1. **Permissionless pool creation.** Catalyst is the first protocol to allow cross-chain pools to be created permissionlessly. By having a permissionless option for liquidity connectivity, new chains are empowered like never before. Catalyst will be there to support the long tail of assets that cannot be found on any other exchange. -2. **User experience.** 1-click transaction on any supported chain, where native assets are swapped. No more excessive bridging and 3+ transactions to approve a swap, and no more reliance on wrapped assets (e.g., hETH, sETH, USDCet). -3. **Scalable liquidity.** Pools can contain any number of assets and chains, significantly reducing fragmentation compared to alternative platforms. Furthermore, all cross-chain liquidity within Catalyst is locally available! -4. **Security by design**. One bridge message per swap! No state Synchronisation, no intermediate lock & mint, no vendor lock-in, and hardcoded security limit. The only attack vector is the AMB which can be set to trust-minimized, battle-tested interoperability protocols like IBC. \ No newline at end of file diff --git a/src/content/docs/introduction/how-it-works.md b/src/content/docs/introduction/how-it-works.md deleted file mode 100644 index 43e51b2..0000000 --- a/src/content/docs/introduction/how-it-works.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: "How Does Catalyst Work?" -description: "Catalyst uses the Unit Of Liquidity as a liquidity abstraction and that allows Catalyst to evaluate liquidity asynchronously." -sidebar: - order: 2 ---- - -Catalyst is a cross-chain AMM that only needs an interoperability messaging layer to operate. This enables easy-to-use, secure, and fast cross-chain swaps. Traditional AMMs price assets based on their internal state, which means the balances of assets within the AMM. This requires the AMM to have full knowledge of all assets they use. The Catalyst innovation allows us to ease the knowledge constraint such that we can split the state of the AMM across different chains: pools of assets can be created on different chains and connected by a cross-chain messaging layer. - -Catalyst works by being lightweight and extensible enough to live on any chain—irrespective of virtual machine, consensus mechanism, etc. Catalyst uses a concept called "unit of liquidity": a value abstraction that can be easily transferred between pools asynchronously to allow for universal comprehension between any Catalyst smart contract on any chain. As a result, any chain that integrates Catalyst can automatically move value to/from any other Catalyst-enabled chain. - -## What is the Unit of Liquidity? - -The Unit of Liquidity (UoL) is an abstract representation of asset value that can be transferred between blockchains. It acts like a receipt that individuals can use to redeem assets on another chain. In simple terms, when a user deposits assets, they receive a corresponding amount of Units in return. This unit serves as a standardized accounting mechanism, indicating the ratio of value between the deposited asset and the asset available for redemption on the other chain. It enables cross-chain swaps by providing a common measurement for asset value across different blockchain networks. - -UoL allows Catalyst to scale linearly with the number of chains connected: Catalyst only requires liquidity per additional asset added, not per chain. - -### High-level explanation - -Imagine Alice wants to trade her Apples for Charlie's Citrons. Both Alice and Charlie have a certain number of values attached to their produce. If Alice has 1 million Apples and only 1 Citron, then 1 Citron is inherently worth more to Alice than 1 Apple, _how else will she get all of her C-vitamins?_ - -We imagine that Alice has some value function that she uses to evaluate if she should trade her Apples to Citrons. We call that function the marginal price function (of Alice). - -This is the idea behind constant function market-makers (CFMMs) like Uniswap. Liquidity providers have given us an explicit marginal price function and if the swap benefits liquidity providers (according to their price function), then the swap goes through. - -The issue is Alice (or liquidity providers) have to know both how many Apples and Citrons they have otherwise they can't accurately price them against each other. As a result, traditional CFMMs are constrained to single chains. - -One idea is to introduce an intermediary value that has a known value relative to both Apples and Citrons. Many would instinctively go for a stablecoin since they argue it holds a known value. However, it may not be a known value **relative** to Apples and Citrons, since their demand and supply can change. The Catalytic idea is that it is possible to define a relative value without any external token. That relative value is the Unit of Liquidity. - -#### A bit of math. - -For Uniswap v2, the marginal price equation is $P(x, y) = \frac{y}{x}$ with a resulting swap equation of $y(x) = \frac{Y \cdot x}{X +x}$ where y is output, x is input, Y is the current pool balance of output and X is current pool balance of input. - -Say we want to replicate the Uniswap AMM, one idea could be to split up the equation: $U_x(x) = \frac{x}{X + x}$ and $y(x) = Y \cdot U_x(x)$. This provides us with 2 independent equations that describe the relative value between assets without any intermediary asset transfer or Oracles. - -You can find a deep dive into the math in our whitepaper: [whitepaper.catalyst.exchange](https://whitepaper.catalyst.exchange). diff --git a/src/content/docs/introduction/vision.md b/src/content/docs/introduction/vision.md deleted file mode 100644 index b7674de..0000000 --- a/src/content/docs/introduction/vision.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "The Vision" -description: "Catalyst & The Modular Future." -sidebar: - order: 4 ---- - -Catalyst has a vision is intertwined with [The Modular Future](/#what-is-the-modular-future). We envision application chains, native multi-chain applications, and complete chain abstraction. This future requires building applications which do not differentiate between local and remote. - -We are contributing to 3 fundamental pillars: - -1. **Chains** We're building for a future where developers are empowered to create the perfect chain that is best suited for their needs—and connect them to the broader crypto ecosystem. With Catalyst, the multi-chain future is an open future—where economic trade is borderless. -2. **Tools** We're building fundamentals for native multi-chain applications. The goal is for anyone to build a cross-chain application that scales. -3. **dApps** We're building applications that facilitate the creation of new applications. Our goal is to weave the web of applications tighter by building to allow for interoperability between cross-chain applications. - -**Our first contribution** is a global liquidity layer for all chains—available automatically at launch. - -**Our second contribution** is a messaging bridge abstraction that allows anyone to use any messaging bridge. - -### Our Goals - -1. No gatekeeping. Allow any chain to move value to another chain from Day 1. -2. Superior UX. Interact with any asset on any chain. -3. Safe by design. Simple protocol design built on trust-minimised infrastructure to ensure the highest level of security. diff --git a/src/content/docs/cross-cats/bitcoin-primer.mdx b/src/content/docs/knowledge/bitcoin-primer.mdx similarity index 99% rename from src/content/docs/cross-cats/bitcoin-primer.mdx rename to src/content/docs/knowledge/bitcoin-primer.mdx index f3b93a9..81d5dde 100644 --- a/src/content/docs/cross-cats/bitcoin-primer.mdx +++ b/src/content/docs/knowledge/bitcoin-primer.mdx @@ -2,7 +2,7 @@ title: "Bitcoin Primer" description: "What is Bitcoin? What is a Bitcoin Block? What is a Bitcoin transaction? And how do CrossCats prove Bitcoin fulfillments? This page contains all information required to understand how CrossCats interact with BTC." sidebar: - order: 2 + order: 1 --- Bitcoin is regarded as the origin blockchain or cryptocurrency. While the last core upgrade to the Bitcoin network was in 2010 several smaller upgrades have been made adjacent to the core protocol, the most significant of these are [Segwit](https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki) and [Taproot](https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki). diff --git a/src/content/docs/knowledge/resource-locks.mdx b/src/content/docs/knowledge/resource-locks.mdx new file mode 100644 index 0000000..e0019fc --- /dev/null +++ b/src/content/docs/knowledge/resource-locks.mdx @@ -0,0 +1,8 @@ +--- +title: "Resource Locks" +description: "Resource locks allows users to pay after the settlement of their desired asset has taken place. This improve the user experience and makes cross-chain actions more seamless." +sidebar: + order: 2 +--- + +WIP \ No newline at end of file diff --git a/src/content/docs/protocol/tx-lifecycle.md b/src/content/docs/protocol/tx-lifecycle.md index efd50b9..c6cecb9 100644 --- a/src/content/docs/protocol/tx-lifecycle.md +++ b/src/content/docs/protocol/tx-lifecycle.md @@ -44,7 +44,7 @@ Chain A.garp -> amb: Collect Proof Chain B.garp <- amb: Deliver Proof ``` -1. **Assets to Units**. The user deposits their assets into Vault A along with the swap context. The vault converts their tokens into Units by examining the user's deposits and comparing them to the current liquidity within. For more about units read: [What Is The Unit Of Liquidity](/introduction/how-it-works#what-is-the-unit-of-liquidity). +1. **Assets to Units**. The user deposits their assets into Vault A along with the swap context. The vault converts their tokens into Units by examining the user's deposits and comparing them to the current liquidity within. 2. **Pack Swap**. The vault sends the swap context to the cross-chain interface (CCI). The CCI packs the swap context into bytes. These bytes will be compatible with any virtual machine (VM) the user may want to receive their assets on. 3. **Incentives**. Generalised Incentives (GARP) is used to both standardize AMB integration and incentivise relayers to relay Catalyst swaps. The incentive is held in escrow here until a relayer proves they correctly did their job. 4. **Collect Message** & **Deliver Proof**. Relayers collect the message emitted by the AMB so that when the AMB generates the message proof, it can be submitted to the destination. diff --git a/src/content/docs/relayer/changelog-and-migration.md b/src/content/docs/relayer/changelog-and-migration.md deleted file mode 100644 index 9c6a3b7..0000000 --- a/src/content/docs/relayer/changelog-and-migration.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: "Changelog and Migration" -description: "Changelog and steps to migrate to the latest Relayer version." -sidebar: - order: 4 ---- - -## Installing a new Relayer version -From within the Relayer's directory: -- Pull down the Relayer if it is running. - ```bash - docker compose down - ``` - :::caution - Pull down the Underwriter first if it is running in tandem with the Relayer. - ::: -- Get the codebase changes: - ```bash - git pull && git checkout main - ``` -- Pull the corresponding docker image: - ```bash - docker pull ghcr.io/catalystdao/generalised-relayer:latest - ``` -- Perform any migration steps as described on all relevant changelogs. -- Start the Relayer. - ```bash - docker compose up -d - ``` -:::tip -To install a specific Relayer version, replace `main` and `latest` on the commands above with the desired version tag. -::: - -## v0.1.0 ---- -Release: [GitHub](https://github.com/catalystdao/generalised-relayer/releases/tag/v0.1.0) -#### Changelog -- Implemented a `monitor` service to follow the latest chain blocks and keep all other services within the relayer in sync. -- Implemented a `wallet` service for transaction handling (same as the underwriter's `wallet` service). -- Recovery of past AMB messages/proofs on Wormhole. -- Improve handling of l1 and l2 block numbers for chains like Arbitrum. -- More efficient rpc queries (including `ethers` 6 upgrade). -- Fixed error logging. -- Large refactors to increase code clarity and efficiency. -- Full [changelog](https://github.com/catalystdao/generalised-relayer/commit/e7d63265b7ddfcf5b3210ae74f71659c01681f5f). - -### Migration steps: -- Update the Relayer configuration: - :::caution - It is highly recommended to rewrite the Relayer configuration from scratch using the example configuration file provided (`config.example.yaml`). - ::: - - New `monitor` configuration (within `global` and within each chain on `chains`). - - `blockDelay` moved from `global`/`chains` to here. - - `interval` moved from `getter` to here. - - New `wallet` configuration (within `global` and within each chain on `chains`). - - Configurations moved from the `submitter` section: `confirmations`, `confirmationTimeout`, `lowGasBalanceWarning` (renamed from `lowBalanceWarning`), `gasBalanceUpdateInterval` (renamed from `balanceUpdateInterval`), `maxFeePerGas`, `maxAllowedPriorityFeePerGas`, `MaxPriorityFeeAdjustmentFactor`, `maxAllowedGasPrice`, `gasPriceAdjustmentFactor`, `priorityAdjustmentFactor`. - - Optional `resolver` configuration for each chain. - - `resolver: 'arbitrum'` is now **required** for Arbitrum. - - See `config.types.ts` for further advanced configuration options added that are not present on `config.example.yaml`. diff --git a/src/content/docs/relayer/choosing-your-server.md b/src/content/docs/relayer/choosing-your-server.md deleted file mode 100644 index ee64cbe..0000000 --- a/src/content/docs/relayer/choosing-your-server.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Server Requirements" -description: "Generalised Incentives server requirements. Anyone can run the relayer with recommended specs of 2 vCPU and 2GB RAM corresponding to roughly $14 / month." -sidebar: - order: 2 ---- - -The relayer is very lightweight and intended to run on cheap VPS. Do note that while possible to run the relayer on very basic hardware, some configuration settings can increase the requirements. Generally, less but faster is better than more but slower. - -| Requirements | Minimum | Recommended | -| ------------- | ------- | --------------------------- | -| Processors | 1 vCPU | 1 fast vCPU or 2 slow vCPUs | -| Memory | 1 GB | 2 GB | -| Storage Space | 15 GB | 25 GB | - -With these specs, the monthly cost to run a relayer on a VPS is roughly \$6 to \$14. - -The relayer does not support ARM because the Wormhole Spy does not support ARM. diff --git a/src/content/docs/relayer/relayer.md b/src/content/docs/relayer/relayer.md deleted file mode 100644 index acd317d..0000000 --- a/src/content/docs/relayer/relayer.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "Generalised Relayer" -description: "Generalised Relayer is a reference relayer for Generalised Incentives. The relayer standardises communication between incentive, packet, and proof collection. This allows a single implementation to relay for many different bridges." -sidebar: - order: 1 ---- - -Catalyst uses [Generalised Incentives](https://github.com/catalystdao/GeneralisedIncentives) to standardise the user experience across messaging bridges. Generalised Incentives allow Catalyst to support a wide variety of bridges with an improved incentive scheme. - -Generalised Incentives is an open bridge incentive abstraction scheme and other applications can be used to improve their bridge support without changing the incentive scheme. It comes with a wide variety of improvements and is sure to simplify integrating bridges. - -## Generalised Relayer - -Cata Labs has built a reference relayer for Generalised Incentives called [generalised-relayer](https://github.com/catalystdao/generalised-relayer). The relayer standardises a communication medium between bridge implementations and allows one app to relay for a wide variety of bridges. - -Combining both a generalised incentive scheme and a generalised relayer creates a wide variety of benefits: - -- One implementation that makes anyone able to run a relayer improves system security. Relaying has `1/N` security assumptions. That implies if just one honest non-censoring relayer exists, then transactions can't be censored. -- Generalised Incentives is a demand based relaying incentives. As competition goes up, prices go down. As a result, users end up paying less while getting relayed faster. -- Generalised Incentives eat a lot of the bridge-specific assumptions, the result is that cross-chain dApps can be built faster and more securely. Examples of abstracts include: - - Condition relayer payments. Relayers are only paid for packages they execute rather than prepaying for relaying. - - Gas based relaying payments. Applications only pay for the gas they use rather than overpaying because gas is often estimated 10-20% high. - - Acknowledgements are sent back to tell the source application what happened at the destination. - - Deadlines can be attached (or not) to packages and won't be executed after the deadline. -- Standardising incentives and making an open reference relayer simplifies future relayer work as new bridges can use the existing incentives and relayer implementation as scaffolding for their bridge. diff --git a/src/content/docs/relayer/setup.md b/src/content/docs/relayer/setup.md deleted file mode 100644 index 26c85e8..0000000 --- a/src/content/docs/relayer/setup.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: "Setting up a Relayer" -description: "Setting up the Generalised Relayer is easy for everyone. After installing Docker, the relayer can be installed by pulling the generalised-relayer repo and then configuring the appropriate settings. Fund the relayer and you are off to the races." -sidebar: - order: 3 ---- - -To configure the relayer, we will go through the following steps: - -- [Installing Dependencies](#installing-dependencies) -- [Installing the Relayer](#installing-the-relayer) -- [Configuring the Relayer](#configuring-the-relayer) - - [Private key](#private-key) - - [RPCs](#rpcs) - - [NODE_ENV](#node_env) -- [Running the relayer](#running-the-relayer) - -## Installing Dependencies - -The only dependencies for the relayer are Docker and Docker Compose Plugin (≥v2.24.0). You can find the installation instructions here: - -https://docs.docker.com/engine/install/#supported-platforms - -Click on the operation system of choice. We recommend Ubuntu and follow the relevant instructions like "[Install using the apt repository](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)". - -Before going further, check if you have Docker installed, run: - -```bash -docker compose version -``` - -It should return: `Docker Compose version v2.24.7` or similar. -If it returns a version lower than `v2.24.0` or an error, you have done something wrong. - -## Installing the Relayer - -To install the relayer, pull the [generalised-relayer](https://github.com/catalystdao/generalised-relayer) repository. - -```bash -git clone https://github.com/catalystdao/generalised-relayer.git -cd generalised-relayer -``` - -We also need to make two copies of the configuration files. - -```bash -cp config.example.yaml config.production.yaml -cp .env.example .env -``` - -Once this has been done, we can go on to configuration. - -## Configuring the Relayer - -We need to edit `config.production.yaml` with the correct configuration values. Assuming that you initially just want to dip your toes into relaying Generalised Incentives messages, you only have to set `global.privateKey` and RPCs (`chains.[chain].rpc`). - -### Private key - -This is a sensitive operation. You will have to generate a private key that will hold the gas for the relayer and relaying rewards. If someone else gets access to this key, they can steal your funds! - -For this tutorial we will use [Foundry](https://github.com/foundry-rs/foundry) to give us a new address, however, Metamask is also suitable. Using Foundry: `cast wallet new` will produce an output like: - -```bash -Successfully created new keypair. -Address: -Private key: -``` - -If you haven’t installed Foundry, this command will not work. Instead, use Metamask. - -Remember to backup your private key. After backing up your private key add it to the config. It is line number 2: - -```bash -nano config.production.yaml -``` - -It should look something like: - -```yaml -global: - privateKey: '0xf2d04...2369' - logLevel: 'info' - blockDelay: 1 - ... -``` - -where `0xf2d04...23d9` is your privatekey. - -:::tip[Private Key Format] -A proper private key begins with **0x**. Metamask does not add 0x to the front of the privatekey and you may have to do that yourself. -The privatekey should be 64 characters long without 0x and 66 characters long with 0x. -::: - -:::caution -Do not use this private key for other applications as it could interfere with the operation of the relayer wallet. Use a dedicated private key for the relayer to ensure proper operation. -::: - -### RPCs - -The relayer comes with default public RPCs, however, these are not competitive, stable, or likely to continue working. By default, the config also contains a lot of chains. You may want to disable some chains depending on your preference. - -We recommend an RPC service like Alchemy. If you make an account with Alchemy, you can also get funds for a testnet deployment from their faucets: https://www.alchemy.com/faucets/ethereum-sepolia - -Edit the config with your chain configuration, they can be found at the bottom. - -```bash -nano config.production.yaml -``` - -It should look something like this: - -```yaml -... -chains: - - chainId: 11155111 - name: "Sepolia" - rpc: "" - ... - - - chainId: 421614 - name: "Arbitrum Sepolia" - rpc: "" - ... - - - chainId: 11155420 - name: "OP Sepolia" - rpc: "" - ... - - - chainId: 84532 - name: "Base Sepolia" - rpc: "" - ... -``` - -### NODE_ENV - -The relayer chooses the configuration file based on the env. variable `NODE_ENV`. So far we have worked with the configuration being named `config.production.yaml`. As a result, we need to set NODE_ENV appropriately. This is done by running: - -```bash -export NODE_ENV=production -``` - -For simplicity, you can set `NODE_ENV` across sessions. If you use this machine for other projects don’t do this. - -```bash -echo "export NODE_ENV=production" >> ~/.bashrc -``` - -## Running the relayer - -When everything has been set, assuming you are within the relayer folder, `~/generalised-relayer`, you can start the relayer by running: - -```bash -docker compose up -d -``` - -You can access the log by running: - -```bash -docker compose logs relayer -fn 100 -``` - -If you want to stop the relayer you can run - -```bash -docker compose stop -``` diff --git a/src/content/docs/resources/api.md b/src/content/docs/resources/api.md deleted file mode 100644 index 06073c5..0000000 --- a/src/content/docs/resources/api.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Catalyst API" -description: "Catalyst API allows for easy and abstracted interaction with the Catalyst Protocol smart contracts." -sidebar: - order: 3 ---- - -The Catalyst API and SDK abstract away the blockchain-specific complexities of the Catalyst Protocol. The Catalyst API is created by [Cata Labs, Inc.](https://catalabs.org/) as a public good to assist developers in interacting with Catalyst more easily. - -API can be accessed at [api.catalyst.exchange](https://api.catalyst.exchange/) - -Swagger UI and descriptions are accessible at [api.catalyst.exchange/swagger](https://api.catalyst.exchange/swagger) \ No newline at end of file diff --git a/src/content/docs/resources/audit-whitepaper.md b/src/content/docs/resources/audit-whitepaper.md deleted file mode 100644 index e89ea5c..0000000 --- a/src/content/docs/resources/audit-whitepaper.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "Audits & Whitepaper" -description: "Catalyst contracts have been audited a total of 6 separate times, with Generalised incentives and Catalyst both having been audited thrice. Catalyst has published 1 Whitepaper: Asynchronous Autonomous Market Making via a Unit of Liquidity" -sidebar: - order: 1 ---- - -## Audits - -Catalyst has been audited by several companies, including Veridise, Ackee Blockchain Security, and Zellic. - -### Generalised Incentives - -Generalised Incentives has been audited 3 times, twice by Veridise and once by Ackee. You can find the audit reports here: https://github.com/catalystdao/GeneralisedIncentives/tree/main/audit - -### Catalyst - -Catalyst has been audited 3 times, twice by Veridise and once by Zellic. You can find the audit reports here: https://github.com/catalystdao/catalyst/tree/main/evm/audit - -## Papers - -You can find a list of papers by the Catalyst here: - -- [Catalyst - Asynchronous Autonomous Market Making via a Unit of Liquidity: June 2023](https://whitepaper.catalyst.exchange) - -or on our Github: https://github.com/catalystdao/papers diff --git a/src/content/docs/resources/brand-assets.md b/src/content/docs/resources/brand-assets.md deleted file mode 100644 index 9995cde..0000000 --- a/src/content/docs/resources/brand-assets.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Brand Assets" -description: "Find logo, mark, and other brand assets here." -sidebar: - order: 5 ---- - -Logo, mark, and other brand assets can be found [here](https://drive.google.com/drive/folders/1npzWb1KAh6sgD1ZsWUq1mZkpfyWfvVRa?usp=sharing). diff --git a/src/content/docs/resources/contract-addresses.mdx b/src/content/docs/resources/contract-addresses.mdx deleted file mode 100644 index 839361b..0000000 --- a/src/content/docs/resources/contract-addresses.mdx +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: "Contract Deployments" -sidebar: - order: 4 ---- - -import Table from '../../../components/Table.astro'; -import SmallTable from '../../../components/SmallTable.astro'; - -All Catalyst and associated contracts are deployed using create2. This lets anyone deploy Catalyst to any chain and lets anyone verify that a deployment is authentic by only checking the associated addresses. Some contracts have dependencies outside Catalyst and those addresses may change based on other factors and as a result addresses may not be the same across-chain. - -### Generalised Incentives - -Anyone can deploy Generalised Incentives. Below known deployments are listed. - - -[Source](https://github.com/catalystdao/GeneralisedIncentives/blob/main/script/bridge_contracts.json) - -### Catalyst Core - -Anyone can deploy Catalyst to preconfigured contracts. You can find the pre-configured contracts here: - -[Source](https://github.com/catalystdao/catalyst/blob/main/evm/script/config/config_contracts.json) - -#### Cross-Chain Interfaces - -Cross-chain interfaces changes between deployments but will still deploy only to a specific address and anyone can deploy new cross-chain interfaces to new chains. Below known deployments are listed. - -
-[Source](https://github.com/catalystdao/catalyst/blob/main/evm/script/config/config_interfaces.json) diff --git a/src/content/docs/resources/eggs-rewards.md b/src/content/docs/resources/eggs-rewards.md deleted file mode 100644 index 797fbe5..0000000 --- a/src/content/docs/resources/eggs-rewards.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "Eggs (Rewards)" -description: "Find logo, mark, and other brand assets here." -sidebar: - order: 3 ---- - -Catalyst's eggs program began on May 21 at 00:00 UTC. - -Eggs are distributed weekly to Catalyst users for 10 weeks. Distribution takes place every Friday, and the first distribution will take place on May 30. Eggs are meant to reward users who contribute to the protocol’s success. - -Eggs criteria will be updated on a recurring basis. Eggs distributions are based on weekly activity ending Thursday at 11:59 UTC. Distributions take place on every Friday. Catalyst reserves the right to modify previous eggs distributions under its sole discretion. - -### Loyalty Score - -The loyalty score tracks user activity over time and is represented as a number between 0 and 100. This score is user-specific and is updated weekly — it can decrease, increase, or remain the same. Users who stay active throughout the entire season will accrue a higher loyalty score. While the loyalty score doesn't affect the number of eggs you receive, it does affect what emerges after the eggs are hatched. - -## Referrals - -### How do I refer someone to Catalyst? - -You can create a referral code on app.catalyst.exchange/rewards after connecting your wallet. You will receive a percentage of referred users' eggs based on their weekly activity. The percentage is determined by your referral tier. - -Share your referral code with other traders using a unique link: app.catalyst.exchange/join/YOURCODE. - -### How do I use a referral code? - -Click on a referral code link or input a friend's referral link on the Rewards page on Catalyst UI. - -### Kickback - -Using a referral code will give you a variable kickback determined by the referee. The kickback works exactly like a credit card cashback, meaning that you’ll get a % of your weekly eggs back. The higher your referral tier, the larger the kickback you can offer to your friends. You can check how much the kickback is when you click on a referral code link. - -Example: -Bob is Silver tier (20% referral rewards) and offers a 10% kickback. - -Alice signs up on Catalyst using Bob's code. - -At the end of the week, Alice earns 100 Eggs based on her Catalyst activity. - -Bob will earn (100 * 10%) = 10 Eggs, while Alice will receive 10 additional Eggs as a kickback. - -Note: the kickback can only be increased but not decreased over time. Referral signups are immutable. Once you sign up using a code, you won't be able to change it later on. - -## Referral Tiers - -* Iron: 10% of all eggs earned by your direct referrals. - * Default (everyone starts here) -* Bronze: 15% - * 3 unique referrals + $50k vol -* Silver: 20% - * 5 unique referrals + $150k vol -* Gold: 25% - * 10 unique referrals + $300k vol -* Platinium: 30% - * 20 unique referrals + $600k vol - -Note: only direct referrals (i.e. someone that directly uses your code) counts for tier progression. - -## Eggs for Galxe Quests - -Thank you to all individuals that completed Catalyst Missions on [Galxe](https://app.galxe.com/catalyst) during the Catalyst testnets. - -All Galxe users that completed at least 1 mission are eligible to a 5% bonus rebate on the Eggs they earn during season 1 on mainnet. The bonus is capped at 50,000 Eggs per user. - -Example: Alice earned 1000 Eggs during season 1 and she qualified for the galxe 5% bonus. At the end of the season, she will earn 1000 + (1000 * 5%) = 1050 Eggs diff --git a/src/content/docs/resources/official-links.md b/src/content/docs/resources/official-links.md deleted file mode 100644 index df2e6fa..0000000 --- a/src/content/docs/resources/official-links.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "Official Links" -description: "Find the official links for the Catalyst ecosystem here." -sidebar: - order: 5 ---- - -Catalyst: https://catalyst.exchange/ - -Catalyst UI: https://app.catalyst.exchange/ - -Catalyst Testnet: https://testnet.catalyst.exchange/ - -Catalyst Docs: https://docs.catalyst.exchange/ - -Whitepaper: https://whitepaper.catalyst.exchange/ - -Blog: https://blog.catalyst.exchange/ - -Catalyst Foundation: https://catalyst.foundation/ - -GitHub: https://github.com/catalystdao - -Twitter: https://twitter.com/CatalystAMM - -Discord: https://discord.com/invite/mSGYhwh9jv \ No newline at end of file diff --git a/src/content/docs/resources/sdk.md b/src/content/docs/resources/sdk.md deleted file mode 100644 index 9620390..0000000 --- a/src/content/docs/resources/sdk.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: "Catalyst SDK" -description: "Catalyst SDK allows for easy interaction with the Catalyst Protocol smart contracts." -sidebar: - order: 2 ---- - -The Catalyst API and SDK abstract away the blockchain-specific complexities of the Catalyst Protocol. The Catalyst SDK is a toolkit that helps developers build software on top of the Catalyst Protocol. - -Catalyst SDK modules are can be viewed and accessed at [@catalabs/catalyst-sdk](https://sdk.catalyst.exchange/). \ No newline at end of file diff --git a/src/content/docs/resources/support.md b/src/content/docs/resources/support.md deleted file mode 100644 index 682e33a..0000000 --- a/src/content/docs/resources/support.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Support" -description: "Find contact information for Catalyst team here." -sidebar: - order: 6 ---- - -For any issues, questions, comments, or concerns, please join the [Catalyst Community Discord](https://discord.gg/4BRVhgFZb4). \ No newline at end of file diff --git a/src/content/docs/cross-cats/Becoming a Solver/btc-fulfilling.mdx b/src/content/docs/solver/btc-fulfilling.mdx similarity index 100% rename from src/content/docs/cross-cats/Becoming a Solver/btc-fulfilling.mdx rename to src/content/docs/solver/btc-fulfilling.mdx diff --git a/src/content/docs/cross-cats/Becoming a Solver/collecting-orders.mdx b/src/content/docs/solver/collecting-orders.mdx similarity index 100% rename from src/content/docs/cross-cats/Becoming a Solver/collecting-orders.mdx rename to src/content/docs/solver/collecting-orders.mdx diff --git a/src/content/docs/cross-cats/Becoming a Solver/evm-fulfilling.mdx b/src/content/docs/solver/evm-fulfilling.mdx similarity index 100% rename from src/content/docs/cross-cats/Becoming a Solver/evm-fulfilling.mdx rename to src/content/docs/solver/evm-fulfilling.mdx diff --git a/src/content/docs/cross-cats/Becoming a Solver/init-orders.mdx b/src/content/docs/solver/init-orders.mdx similarity index 96% rename from src/content/docs/cross-cats/Becoming a Solver/init-orders.mdx rename to src/content/docs/solver/init-orders.mdx index ab8d643..d9b413b 100644 --- a/src/content/docs/cross-cats/Becoming a Solver/init-orders.mdx +++ b/src/content/docs/solver/init-orders.mdx @@ -172,9 +172,9 @@ If the same address is used every order, it becomes crucial to ensure that the * Bitcoin addresses are encoded in two fields: `token` and `address`. -- **`token`**: This field serves to differentiate VM tokens from Bitcoin orders, encode relevant context like confirmations and address version. Refer to the [UTXO type table](/cross-cats/bitcoin-primer/#utxo-type-table) for details on converting address types to versions. The field should consists of the bitcoin signifier (BC in the 12'th byte), number of confirmations in the 31st, UTXO type in the 32'th, and otherwise 0s. +- **`token`**: This field serves to differentiate VM tokens from Bitcoin orders, encode relevant context like confirmations and address version. Refer to the [UTXO type table](/knowledge/bitcoin-primer/#utxo-type-table) for details on converting address types to versions. The field should consists of the bitcoin signifier (BC in the 12'th byte), number of confirmations in the 31st, UTXO type in the 32'th, and otherwise 0s. -- **`address`**: This field encodes the public key hash, script hash, or witness hash. Use the decoding schemes listed in the [UTXO type table](/cross-cats/bitcoin-primer/#utxo-type-table) for various address versions. For addresses involving hashes of 20 bytes (P2PKH, P2SH, and P2WPKH), end pad the hashes with zeros (e.g., `0xabcdef...00000`). +- **`address`**: This field encodes the public key hash, script hash, or witness hash. Use the decoding schemes listed in the [UTXO type table](/knowledge/bitcoin-primer/#utxo-type-table) for various address versions. For addresses involving hashes of 20 bytes (P2PKH, P2SH, and P2WPKH), end pad the hashes with zeros (e.g., `0xabcdef...00000`). ### Quote Open Order (WIP) diff --git a/src/content/docs/cross-cats/Becoming a Solver/introduction.mdx b/src/content/docs/solver/introduction.mdx similarity index 94% rename from src/content/docs/cross-cats/Becoming a Solver/introduction.mdx rename to src/content/docs/solver/introduction.mdx index c27cc23..34c0cb9 100644 --- a/src/content/docs/cross-cats/Becoming a Solver/introduction.mdx +++ b/src/content/docs/solver/introduction.mdx @@ -7,7 +7,6 @@ sidebar: import { Tabs, TabItem } from "@astrojs/starlight/components"; -> If you are not interested in the on-chain order structure, skip to [Init Orders](/cross-cats/becoming-a-solver/init-orders). For API documentation, refer to the [API Swagger documentation](https://catalyst-order-server-0140d799e2f7.herokuapp.com/api). CrossCats utilizes three main order structures: diff --git a/src/content/docs/underwriter/changelog-and-migration.md b/src/content/docs/underwriter/changelog-and-migration.md deleted file mode 100644 index b6b76a5..0000000 --- a/src/content/docs/underwriter/changelog-and-migration.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "Changelog and Migration" -description: "Changelog and steps to migrate to the latest Underwriter version." -sidebar: - order: 4 ---- - -## Installing a new Underwriter version -From within the Underwriter's directory: -- Pull down the Underwriter if it is running. - ```bash - docker compose down - ``` -- Get the codebase changes: - ```bash - git pull && git checkout main - ``` -- Pull the corresponding docker image: - ```bash - docker pull ghcr.io/catalystdao/catalyst-underwriter:latest - ``` -- Perform any migration steps as described on all relevant changelogs. -- Start the Underwriter. - ```bash - docker compose up -d - ``` - :::tip - To install a specific Underwriter version, replace `main` and `latest` on the commands above with the desired version tag. - ::: - -## v0.1.0 ---- -Release: [GitHub](https://github.com/catalystdao/catalyst-underwriter/releases/tag/v0.1.0) -#### Changelog -- Complete overhaul of how the Underwriter determines whether to execute underwrites. Any swap that goes to a vault that has been created with an approved *vault template*, within a whitelisted *endpoint* is now allowed to be underwritten (allowed vault addresses had to be hardcoded before on the Underwriter's configuration). This means that the Underwriter now supports newly created vaults on the fly. -- The Underwriter now 'syncs' with the Relayer's `monitor` service. - - **The `blockDelay` option of the Underwriter now configures an *additional* block delay to that of the Relayer.** -- A new `minMaxGasDelivery` configuration prevents the Underwriter from executing underwrites of cross-chain packets with a too low `maxGasDelivery` that would cause the packet from never arriving at the destination chain. - - **This configuration must be defined for ALL chains individually.** -- A new `minRelayDeadlineDuration` configuration prevents an Underwriter from underwriting a cross-chain swap with a delivery deadline that is too short. -- A new `minUnderwriteDuration` configuration on the `expirer` prevents the Underwriter from auto expiring underwrites as a result of invalid configuration. -- Block reorgs are detected using the `blockDelay` configuration. -- Improve handling of l1 and l2 block numbers for chains like Arbitrum. -- Full [changelog](https://github.com/catalystdao/catalyst-underwriter/commit/03ba7a539f22cb78439ae2d9889bd705852fa454). - -### Migration steps: -- Update the Underwriter configuration: - :::caution - It is highly recommended to rewrite the Underwriter configuration from scratch using the example configuration file provided (`config.example.yaml`). - ::: - - The `pool` configuration has been removed. - - New `endpoint` configuration (see `config.example.yaml`): - - Every endpoint defines a whitelisted Catalyst *factory* + *interface* + *incentives* address combination, together with the approved *vault template* addresses and *cross-chain channels* configuration. - - `blockDelay` has been moved to the `monitor` configuration. - - `underwriteBlocksMargin` has been renamed renamed to `maxUnderwriteDelay` and is now time-based. - - Optional `resolver` configuration for each chain - - `resolver: 'arbitrum'` is now **required** for Arbitrum. - - See `config.types.ts` for further advanced configuration options added that are not present on `config.example.yaml`. diff --git a/src/content/docs/underwriter/server-requirements.md b/src/content/docs/underwriter/server-requirements.md deleted file mode 100644 index b14c47e..0000000 --- a/src/content/docs/underwriter/server-requirements.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Server Requirements" -description: "Underwriting is dependent on running a relayer and requires slightly higher specifications." -sidebar: - order: 2 ---- - -Underwriting requires running a relayer: - -1. The relayer acts as a data engine for the Underwriter. It collects everything related to relaying. It has both packages needed to get relevant underwrite information and the bounty which helps with evaluating if underwriting is worth it. -2. The underwriter is very reliant on the underwritten swaps getting relayed. As a result, it needs to be able to force some packages to be relayed. - -We recommend running the underwriter on the same VPS as the relayer. Underwriting requires a high degree of stability and as a result, the requirements are slightly higher: - -| Requirements | Minimum | Recommended | -| ------------ | ---------------------- | ---------------------- | -| Processors | 1 fast vCPU or 2 vCPUs | 2 vCPU or 3 slow vCPUs | -| Memory | 2 GB | 2 GB | diff --git a/src/content/docs/underwriter/setup.md b/src/content/docs/underwriter/setup.md deleted file mode 100644 index 66b486c..0000000 --- a/src/content/docs/underwriter/setup.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: "Setting Up An Underwriter" -description: "Underwriting is dependent on running a relayer. While adding the underwriting module to the relayer is technically easy, be aware of the associated risks." -sidebar: - order: 3 ---- - -Before setting up an underwriter, ensure that you are fully aware of the associated [risks](/underwriter/underwriting-swaps#risk-specifications) and have read the associated underwriter [README](https://github.com/catalystdao/catalyst-underwriter?tab=readme-ov-file#catalyst-underwriter). - -For this guide, it is assumed that you are running a [relayer](/relayer/setup) and have gone through the associated setup and fulfill all of the requirements for running a relayer. If the relayer isn't working, getting bountes, collecting proofs, or submitting transactions you should try to fix those issues before running an underwriter. - -It is assumed that the underwriter is running on the same VPS as the relayer AND the folder name of the relayer is `~/generalised-relayer` - -## Installing the Underwriter Module - -To install the underwrtier, pull the [catalyst-underwriter](https://github.com/catalystdao/catalyst-underwriter) repository. - -```bash -git clone https://github.com/catalystdao/catalyst-underwriter.git -cd catalyst-underwriter -``` - -Similarly to the relayer, we need to make copies of the configuration files: - -```bash -cp config.example.yaml config.production.yaml -cp .env.example .env -``` - -Once this has been done, we can go on to configuration. - -## Configuring the Underwriter - -We need to edit `config.production.yaml` with the correct configuration values. Similarly to the relayer, we need to modify the privatekey (`global.privateKey`) and RPCs (`chains.[chain].rpc`). - -Follow [the tutorial](/relayer/setup#private-key) for the relayer for these values. - -:::danger[Loss Of Funds!] -Do not use this private key for anything else! Ensure that this key is different from the relayer. -Any interference is likely to result in lost funds. -::: - -### Pools - -Currently you have to specify explicitly which pools to underwrite. For testnet, leave them as the default. - -## Funding the Underwriter - -The relayer requires 2 types of funding: - -1. Gas funding. We highly recommend filling it up with a slight excess. The underwriter will not get more gas as it is operating (unlike the relayer) and if it runs out of gas it will be unable to expire its underwriters if something goes wrong which may lead to loss of collateral. -2. Underwrite capital. The underwriter requires assets which it can front for underwrites. For testnet, these are the respective wrapped assets. You can get these by wrapping on the Catalyst UI and sending them to the associated address. - -:::tip -For Catalyst Tiger testnet, the underwriter requires wrapped gas. You can fund the underwriter account directly by wrapping via [Catalyst App](https://app.catalyst.exchange) and specifying the relayer address as the `Recipient Address`. -::: - -## Running the Underwriter - -In the future, the underwriter will go through a graceful shutdown to ensure that all of its underwrites are monitored to completion. This reduces chances for loss of funds. - -When everything has been set, assuming you are within the underwriter folder, `~/catalyst-underwriter`, you can start the relayer by running: - -```bash -docker compose up -d -``` - -You can access the log by running: - -```bash -docker compose logs underwriter -fn 100 -``` - -If you want to stop the underwriter you can run - -```bash -docker compose stop -``` diff --git a/src/content/docs/underwriter/underwriting-swaps.md b/src/content/docs/underwriter/underwriting-swaps.md deleted file mode 100644 index 2ae33d7..0000000 --- a/src/content/docs/underwriter/underwriting-swaps.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: "Fast Swaps" -description: "Catalyst supports fast swaps. Fast swaps are price and execution settled in roughly 30 seconds to 1 minute. This is done by selling the finality risk to an Underwriter." -sidebar: - order: 1 ---- - -Catalyst supports fast swaps also called underwritten swaps. Fast swaps are price and execution settled before the messaging bridge has confirmed the swap. Normal full finality swaps take around 15-30 minutes (some even longer, depending on the source chain finality) where fast swaps takes between 30 seconds and 1 minute. - -## How? - -Fast swaps work by selling the finality risk to an Underwriter. When an Underwriter determines a swap is _final_ they execute the equivalent swap. The Underwriter truly **executes** the swap, as the incoming Units will be swapped to the designated output asset. Instead of sending the newly bought assets to the user, they are escrowed and instead the underwrite will front the bought assets + a small amount of collateral. Once the swap is finalised by the messaging bridge, the Underwrite's assets is refunded along with a small incentive. - -This scheme ensures that the Underwriter does not take on any price risk and can fully focus on optimising for the finality risk. It also significantly reduces the cost, as the Underwriter does not have to manage price risks. - -### Incentive - -When underwriting, the Underwriter does not have to provide the associated underwriting incentive instead they provide `computedOutput · (1 - UW incentive)`. Once the swap finalises they get sent the full `computedOutput`. This encorages Underwriters to underwrite swaps as they get a portion of the swap as set by the user. - -## Risk Specifications - -The bought finality risk is the following: - -1. The Underwriter is underwriting the **exact** message which has been sent. If a transaction is **MOVED** since a block (reorg, double spend, or likewise) then there is a very significant chance that the message is not exact anymore. While the message does not contain any ordering information it contains an unit quote. This quote will change if the order of swaps changes within a block changes. - - If this happens the underwriter loses 100% of their fronted tokens. - - The underwriter can recover part of their collateral if they expire their own underwrite. -2. The underwriter malfunctions and underwrites invalid swaps to invalid users. - - If this happens the underwriter loses 100% of their fronted tokens. - - The underwriter can recover part of their collateral if they expire their own underwrite. -3. The underwriter also pays gas to execute the logic associated with the user’s swap. To underwrite a swap is conditional on executing the logic. There is not an associated gas payment included in the underwrite incentive and it will have to also cover the gas cost. - - If the underwriter evaluator is unable to correctly asses the profitability of underwrites, it could underwrite swaps such that it is not truly profitable. -4. The messaging bridge finalises the swap within the configured max time. If the message is not relayed within the configured max time, the underwrite may be expired. - - If this happens the underwriter loses 100% of their fronted tokens. - - The underwriter can recover part of their collateral if they expire their own underwrite. - -### Derived Risks - -Using the above list, we can list the risk factors in order of likelihood: - -1. The transaction is moved after the swap has been underwritten. - - ⇒ The result is the messaging bridge not verifying the message that was underwritten. -2. High network usage makes it impossible to relay swaps. - - ⇒ Relayers cannot submit the AMB message and someone could expire the underwrite. The swap may arrive and not match the underwrite. -3. The relayer crashes and no other relayer is relaying the AMB message - - ⇒ Someone could expire the underwrite. -4. The underwriter is incorrectly constructed such that it underwrites invalid messages. - - ⇒ The underwriter could risk its entire capital. -5. The associated messaging bridge crashes and doesn’t wake before the underwrite expires. - - ⇒ Someone could expire the underwrite. -6. The source chain crashes before a desired number of confirmations is reached. The chain does not wake before the underwrite expires. - - ⇒ Someone could expire the underwrite. -7. There is a smart contract risk in the vaults which results in the vaults capital being drainable. - - ⇒ The underwritten escrow is in the vault and could be drained. -8. The destination chain (where the underwriter underwrote the swap) crashes. - - ⇒ The underwrite cannot be expired as the underwrite is set in blocks. However, long-term instability could cause it to produce empty or fast(?) blocks which would increase the block counter and risk the underwrite expiring. - -- Ordinary meaning: RPC is working, blocks are being produced, and the associated AMB is working. For many (non-signing) AMBs the former implies the latter. - -Some of these risk factors can easily be migrated like - -(1.) can be migrated against by waiting longer before underwriting the swap. This can be configured in our underwriter but will make the underwriter less competitive or - -(7.) which is very easy to audit for and no issues has EVER been found with the escrow implementation. - -## Designing an Underwriter - -To underwrite swaps, at least 3 jobs have to be performed to underwrite swaps: - -1. Monitor newly initiated Catalyst swaps -2. Collect relevant messaging bridge packages. - -With these information, it can both validate swaps by cross-examining the package with the swap event and construct the underwriter call. - -3. Commit underwrites by calling [`underwrite(...)`](https://github.com/catalystdao/catalyst/blob/e975abcf82cdd5a0b1dc7ac768e15d4511967a11/evm/src/CatalystChainInterface.sol#L698) on the associated Cross-Chain Interface. - -:::danger[Validate!] -`underwrite(...)` is very unlikely to revert. It will generally accept any information and _underwrite_ whatever swap is proposed. But if there is not a messaging bridge hit on the underwrite the fronted tokens will not be refunded. - -It is important to thoroughly verify that swaps before underwriting to ensure the fronted underwrite capital is refunded otherwise there may be a loss of funds. -::: - -### Risk Migration implementations - -The [reference underwriter](/underwriter/setup/) has built-in risk migrations. Below is a list of the currently implemented risk management features: - -- The underwriter processes the chains' events with a configurable _block delay_ to minimize the likelihood of acting on transactions that eventually become part of a block reorg. -- Underwrites are only performed within an acceptable 'block count margin' after the block at which the swap is observed. If the _underwrite_ transaction takes too long to be submitted to the RPC (e.g. too many transactions to be processed by the underwriter), the transaction is dropped altogether. -- Underwrites executed by itself are expired **before** the expiry deadline, to make sure that at least the associated collateral is recovered. -- Stuck 'pending' transactions are automatically repriced/cancelled to make sure a stuck transaction does not stall all other transactions of the signing account. From 7f4feee42b503d2ebd971b93bd79f7bc18ae7800 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 20 Feb 2025 18:11:48 +0300 Subject: [PATCH 2/7] fix: grammer --- src/content/docs/implementation/3-validation-layers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/implementation/3-validation-layers.md b/src/content/docs/implementation/3-validation-layers.md index a328130..9285066 100644 --- a/src/content/docs/implementation/3-validation-layers.md +++ b/src/content/docs/implementation/3-validation-layers.md @@ -1,7 +1,7 @@ --- title: "Validation Layers" slug: "validation" -description: "Each Catalyst System order specifies which components are used for which aspects of the swap. Validation layers can permissionlessly chosen by the issuer of an intent and anyone can write a validation layer." +description: "Each Catalyst System order specifies which components are used for which aspects of the swap. Validation layers can be permissionlessly chosen by the issuer of an intent and anyone can write a validation layer." sidebar: order: 3 --- From 394e606b50a9e7f8e3b9e7d5d50634228cec0655 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 21 Feb 2025 11:13:35 +0300 Subject: [PATCH 3/7] feat: resource lock description and fixes --- astro.config.mjs | 2 + package.json | 4 +- .../docs/implementation/1-input-settlement.md | 2 +- .../implementation/2-output-settlement.mdx | 2 +- .../implementation/3-validation-layers.md | 2 +- src/content/docs/implementation/999-calls.mdx | 1 + ...itcoin-primer.mdx => 1-bitcoin-primer.mdx} | 3 +- .../docs/knowledge/2-resource-locks.mdx | 76 +++++++++++++++++++ src/content/docs/knowledge/resource-locks.mdx | 8 -- src/content/docs/solver/init-orders.mdx | 4 +- 10 files changed, 88 insertions(+), 16 deletions(-) rename src/content/docs/knowledge/{bitcoin-primer.mdx => 1-bitcoin-primer.mdx} (96%) create mode 100644 src/content/docs/knowledge/2-resource-locks.mdx delete mode 100644 src/content/docs/knowledge/resource-locks.mdx diff --git a/astro.config.mjs b/astro.config.mjs index 1346aa3..eb44994 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -12,6 +12,8 @@ export default defineConfig({ redirects: { "/cross-cats/": "/intent/intent/", "/cross-cats/solver/": "/intent/becoming-a-solver/introduction/", + "/validation": "/implementation/validation" + }, site: `${process.env["CF_PAGES_URL"] ?? "https://docs.catalyst.exchange"}`, markdown: { diff --git a/package.json b/package.json index 6236c23..a64eab4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "catalyst-starlight", + "name": "catalyst-documentation", "type": "module", - "version": "0.1.0", + "version": "0.1.1", "scripts": { "dev": "astro dev", "start": "astro dev", diff --git a/src/content/docs/implementation/1-input-settlement.md b/src/content/docs/implementation/1-input-settlement.md index eb4286c..ea9f7a8 100644 --- a/src/content/docs/implementation/1-input-settlement.md +++ b/src/content/docs/implementation/1-input-settlement.md @@ -1,6 +1,6 @@ --- title: "Input Settlement" -slug: "input" +slug: "implementation/input" description: "Built with resource locks in mind, Catalyst supports a variety of input settlement schemes; TheCompact and Rhinestone both allows for first fill flows and sponsored transactions assuming the user have existing deposits." sidebar: order: 1 diff --git a/src/content/docs/implementation/2-output-settlement.mdx b/src/content/docs/implementation/2-output-settlement.mdx index 4a64055..fc37818 100644 --- a/src/content/docs/implementation/2-output-settlement.mdx +++ b/src/content/docs/implementation/2-output-settlement.mdx @@ -1,6 +1,6 @@ --- title: "Output Settlement" -slug: "output" +slug: "implementation/output" description: "Catalyst currently supports 2 order types: simple limit orders and dutch auctions. However, the Catalyst System was designed with flexbility in mind and more can easily be added." sidebar: order: 2 diff --git a/src/content/docs/implementation/3-validation-layers.md b/src/content/docs/implementation/3-validation-layers.md index 9285066..83c4998 100644 --- a/src/content/docs/implementation/3-validation-layers.md +++ b/src/content/docs/implementation/3-validation-layers.md @@ -1,6 +1,6 @@ --- title: "Validation Layers" -slug: "validation" +slug: "implementation/validation" description: "Each Catalyst System order specifies which components are used for which aspects of the swap. Validation layers can be permissionlessly chosen by the issuer of an intent and anyone can write a validation layer." sidebar: order: 3 diff --git a/src/content/docs/implementation/999-calls.mdx b/src/content/docs/implementation/999-calls.mdx index 8c24c71..5dd71fb 100644 --- a/src/content/docs/implementation/999-calls.mdx +++ b/src/content/docs/implementation/999-calls.mdx @@ -1,5 +1,6 @@ --- title: "Sub-Calls via Catalyst" +slug: "implementation/calls" description: "By default, Catalyst supports calls on delivery. While the system does not define these, the default output types contain fields to facilitate secondary execution." sidebar: order: 999 diff --git a/src/content/docs/knowledge/bitcoin-primer.mdx b/src/content/docs/knowledge/1-bitcoin-primer.mdx similarity index 96% rename from src/content/docs/knowledge/bitcoin-primer.mdx rename to src/content/docs/knowledge/1-bitcoin-primer.mdx index 81d5dde..9b4d755 100644 --- a/src/content/docs/knowledge/bitcoin-primer.mdx +++ b/src/content/docs/knowledge/1-bitcoin-primer.mdx @@ -1,6 +1,7 @@ --- title: "Bitcoin Primer" -description: "What is Bitcoin? What is a Bitcoin Block? What is a Bitcoin transaction? And how do CrossCats prove Bitcoin fulfillments? This page contains all information required to understand how CrossCats interact with BTC." +slug: "knowledge/bitcoin" +description: "What is Bitcoin? What is a Bitcoin Block? What is a Bitcoin transaction? And how do Catalyst prove Bitcoin fulfillments? This page contains all information required to understand how Catalyst can interact with BTC." sidebar: order: 1 --- diff --git a/src/content/docs/knowledge/2-resource-locks.mdx b/src/content/docs/knowledge/2-resource-locks.mdx new file mode 100644 index 0000000..ab8206c --- /dev/null +++ b/src/content/docs/knowledge/2-resource-locks.mdx @@ -0,0 +1,76 @@ +--- +title: "Resource Locks" +slug: "knowledge/resource-locks" +description: "Resource locks allows users to pay after the settlement of their desired asset has taken place. This improve the user experience and makes cross-chain actions more seamless." +sidebar: + order: 2 +--- + +Resource locks allow users to commit tokens to something/someone without making an on-chain transaction to issue the lock or recover the lock after the lock's expiry. +In a resource-lock context, it is important that these tokens are at least inaccessible for a certain period of time, longer than the expected settlement time for a claim. + +In a sense, they are a form of credit account allowing users to provide guaranteed allowances to protocols. + + +## Actors + +In a resource lock flow, you have 3 actors: +1. Sponsor, user, owner; The actor that initially owns the funds in the resourec lock. +2. Allocator, manager, credible commitment; The actor that validates that no conflicting locks are issued. +3. Arbiter, validator, settlement; The actor that is capable of validating whether a lock has been resolved and can be paid. + +Depending on the resource lock system, each user chooses an allocator and each lock chooses the arbiter. When the wording *the arbiter* is used, it refers specifically to the arbiter of a lock. Not to a general single arbiter that the user has chosen. + +Think of a lock as a time-bound approval, co-signed by an allocator, to a specific protocol (arbiter). + +While resource lock flows can look very different depending on the application, they generally following X steps: + +import { Steps } from '@astrojs/starlight/components'; + + + +0. The **sponsor** makes a deposit into a resource lock, if one does not already exist. + +1. The **sponsor** signs a lock that describes a desired outcome. + +2. The **allocator** ensures that the appropriate funds exists for the lock to be valid. In other words, if the sponsor has deposited 10 tokens, no set of approved locks shall exceed 10 tokens. The allocator then co-signs the lock. + +3. Desired event takes place. + +4. The **arbiter** validates that the event has taken place and releases the token to the appropriate recipient. + + + +In this flow, 2 signatures and 1 transaction – ignoring the 0'th step – is required; The lock have to be signed by the sponsor, and co-signed by the allocator. Then the arbiter makes the final call whether the desired event took place. + + +## Resource-Locked Intents. + +In an intent system, the 3'th step – the execution of the desired event – is usually performed by a 4'th actor usually referred to as either the **solver** or the **relayer**. + +Additionally, there are generally 2 ways to build intent systems around resource locks: + +##### Intent system as *executor* (Tribunual) + +In these flows, the intent system describes how the action takes place on the destination chain. However, the system does not directly validate the resource lock completion. + +These systems instead rely on **allocators as arbiters** or resource lock support by **general message passing** (GMPs) protocols. + +The advantage of such a system is in its simplicity. The third party (whether allocator or GMP) generally handle the entire validation/settlement pipeline and thus solvers only have to concern themselves with filling orders. + +##### Intent system as *arbiter* (Catalyst) + +In these flows, the intent system is the arbiter and usually describes how the entire system is constructed: Output settlement, validation, and input settlement. This makes the system more flexible and customizable. + +While these systems may also rely on GMPs, they can also use other – potentially cheaper – validation layers like optimistic oracles, storage proofs, or secret reveals (like HTLCs). + +The advantage of such a system is indirectly its complexity. Since more logic is explicit defined by the system itself, the expresivity of intents can be greater and more specialised. + +For more on the resource locks Catalyst support, read the chapter on [Input Settlement Implementations](/implementation/input). + + +## Trust Assumptions + +In a resource lock system, the actors needs to trust each other but generally no single actor can independently access any funds. +- The sponsor needs to trust the arbiter such that **issued** locks are not fraudulently *finalised*. However, the arbiter can never access any of the sponsor's funds without a relevant signed lock. The trust assumptions between the sponsor and the arbiter is equivalent to permit/permit2 approvals. +- The arbiter/solver needs to trust that the allocator does not co-sign overlapping locks that exceed the tokens the user have deposited. Otherwise, a filled intent may not have enough tokens available to resolve the payment to the solver for the fulfillment of the lock. \ No newline at end of file diff --git a/src/content/docs/knowledge/resource-locks.mdx b/src/content/docs/knowledge/resource-locks.mdx deleted file mode 100644 index e0019fc..0000000 --- a/src/content/docs/knowledge/resource-locks.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Resource Locks" -description: "Resource locks allows users to pay after the settlement of their desired asset has taken place. This improve the user experience and makes cross-chain actions more seamless." -sidebar: - order: 2 ---- - -WIP \ No newline at end of file diff --git a/src/content/docs/solver/init-orders.mdx b/src/content/docs/solver/init-orders.mdx index d9b413b..69f8080 100644 --- a/src/content/docs/solver/init-orders.mdx +++ b/src/content/docs/solver/init-orders.mdx @@ -172,9 +172,9 @@ If the same address is used every order, it becomes crucial to ensure that the * Bitcoin addresses are encoded in two fields: `token` and `address`. -- **`token`**: This field serves to differentiate VM tokens from Bitcoin orders, encode relevant context like confirmations and address version. Refer to the [UTXO type table](/knowledge/bitcoin-primer/#utxo-type-table) for details on converting address types to versions. The field should consists of the bitcoin signifier (BC in the 12'th byte), number of confirmations in the 31st, UTXO type in the 32'th, and otherwise 0s. +- **`token`**: This field serves to differentiate VM tokens from Bitcoin orders, encode relevant context like confirmations and address version. Refer to the [UTXO type table](/knowledge/bitcoin/#utxo-type-table) for details on converting address types to versions. The field should consists of the bitcoin signifier (BC in the 12'th byte), number of confirmations in the 31st, UTXO type in the 32'th, and otherwise 0s. -- **`address`**: This field encodes the public key hash, script hash, or witness hash. Use the decoding schemes listed in the [UTXO type table](/knowledge/bitcoin-primer/#utxo-type-table) for various address versions. For addresses involving hashes of 20 bytes (P2PKH, P2SH, and P2WPKH), end pad the hashes with zeros (e.g., `0xabcdef...00000`). +- **`address`**: This field encodes the public key hash, script hash, or witness hash. Use the decoding schemes listed in the [UTXO type table](/knowledge/bitcoin/#utxo-type-table) for various address versions. For addresses involving hashes of 20 bytes (P2PKH, P2SH, and P2WPKH), end pad the hashes with zeros (e.g., `0xabcdef...00000`). ### Quote Open Order (WIP) From 3b076a4ccd5c9367785b2dd33d74ec5f691b1a85 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 21 Feb 2025 12:51:52 +0300 Subject: [PATCH 4/7] feat: solving introduction --- astro.config.mjs | 1 - ...t-settlement.md => 01-input-settlement.md} | 15 ++++ ...ettlement.mdx => 02-output-settlement.mdx} | 0 ...tion-layers.md => 03-validation-layers.md} | 0 .../{999-calls.mdx => 99-calls.mdx} | 2 +- .../docs/knowledge/2-resource-locks.mdx | 19 ++-- src/content/docs/solver/01-introduction.mdx | 90 +++++++++++++++++++ ...ng-orders.mdx => 02-collecting-orders.mdx} | 6 +- ...m-fulfilling.mdx => 20-evm-fulfilling.mdx} | 6 +- ...c-fulfilling.mdx => 29-btc-fulfilling.mdx} | 6 +- ...init-orders.mdx => 90-settling-orders.mdx} | 8 +- src/content/docs/solver/introduction.mdx | 90 ------------------- 12 files changed, 138 insertions(+), 105 deletions(-) rename src/content/docs/implementation/{1-input-settlement.md => 01-input-settlement.md} (88%) rename src/content/docs/implementation/{2-output-settlement.mdx => 02-output-settlement.mdx} (100%) rename src/content/docs/implementation/{3-validation-layers.md => 03-validation-layers.md} (100%) rename src/content/docs/implementation/{999-calls.mdx => 99-calls.mdx} (99%) create mode 100644 src/content/docs/solver/01-introduction.mdx rename src/content/docs/solver/{collecting-orders.mdx => 02-collecting-orders.mdx} (99%) rename src/content/docs/solver/{evm-fulfilling.mdx => 20-evm-fulfilling.mdx} (98%) rename src/content/docs/solver/{btc-fulfilling.mdx => 29-btc-fulfilling.mdx} (98%) rename src/content/docs/solver/{init-orders.mdx => 90-settling-orders.mdx} (99%) delete mode 100644 src/content/docs/solver/introduction.mdx diff --git a/astro.config.mjs b/astro.config.mjs index eb44994..27d5c6a 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -50,7 +50,6 @@ export default defineConfig({ }, { label: "Solvers", - badge: "Outdated", autogenerate: { directory: "solver", }, diff --git a/src/content/docs/implementation/1-input-settlement.md b/src/content/docs/implementation/01-input-settlement.md similarity index 88% rename from src/content/docs/implementation/1-input-settlement.md rename to src/content/docs/implementation/01-input-settlement.md index ea9f7a8..000e6f5 100644 --- a/src/content/docs/implementation/1-input-settlement.md +++ b/src/content/docs/implementation/01-input-settlement.md @@ -81,6 +81,21 @@ function finaliseFor( Notice that the fallback functions exist to fix orders that have been solved by multiple solvers. This is required because we need to hydrate the OutputDescription with the solver to check if the output has been filled on the Validation Layer. +There are 3 ways to finalise an intent: +1. Self-serve, called by the solver with the tokens paid to the solver. `finaliseSelf` +2. Self-serve, custom delivery. Called by the solver with the tokens paid to a specific address. `FinaliseTo` +3. External finalisation with signed message by the solver designating where assets are to be delivered. `finaliseFor` + +To use external finalisation, the struct, `AllowOpen` have to be EIP712 signed: +```solidity +struct AllowOpen { + bytes32 orderId; + address originSettler; + address destination; + bytes call; +} +``` + ### Registering Intents For how to register intents with Rhinestone, please refer to their docs. diff --git a/src/content/docs/implementation/2-output-settlement.mdx b/src/content/docs/implementation/02-output-settlement.mdx similarity index 100% rename from src/content/docs/implementation/2-output-settlement.mdx rename to src/content/docs/implementation/02-output-settlement.mdx diff --git a/src/content/docs/implementation/3-validation-layers.md b/src/content/docs/implementation/03-validation-layers.md similarity index 100% rename from src/content/docs/implementation/3-validation-layers.md rename to src/content/docs/implementation/03-validation-layers.md diff --git a/src/content/docs/implementation/999-calls.mdx b/src/content/docs/implementation/99-calls.mdx similarity index 99% rename from src/content/docs/implementation/999-calls.mdx rename to src/content/docs/implementation/99-calls.mdx index 5dd71fb..d817cdd 100644 --- a/src/content/docs/implementation/999-calls.mdx +++ b/src/content/docs/implementation/99-calls.mdx @@ -3,7 +3,7 @@ title: "Sub-Calls via Catalyst" slug: "implementation/calls" description: "By default, Catalyst supports calls on delivery. While the system does not define these, the default output types contain fields to facilitate secondary execution." sidebar: - order: 999 + order: 99 --- The default output type of Catalyst, called `OutputDescription` supports secondary calls. This allows you to schedule calldata to be executed after the delivery of the asset. diff --git a/src/content/docs/knowledge/2-resource-locks.mdx b/src/content/docs/knowledge/2-resource-locks.mdx index ab8206c..eb33734 100644 --- a/src/content/docs/knowledge/2-resource-locks.mdx +++ b/src/content/docs/knowledge/2-resource-locks.mdx @@ -23,23 +23,26 @@ Depending on the resource lock system, each user chooses an allocator and each l Think of a lock as a time-bound approval, co-signed by an allocator, to a specific protocol (arbiter). -While resource lock flows can look very different depending on the application, they generally following X steps: +While resource lock flows can look very different depending on the application, they generally follow 4 steps: +import { Card } from '@astrojs/starlight/components'; import { Steps } from '@astrojs/starlight/components'; - + + -0. The **sponsor** makes a deposit into a resource lock, if one does not already exist. + 0. The **sponsor** makes a deposit into a resource lock, if one does not already exist. -1. The **sponsor** signs a lock that describes a desired outcome. + 1. The **sponsor** signs a lock that describes a desired outcome. -2. The **allocator** ensures that the appropriate funds exists for the lock to be valid. In other words, if the sponsor has deposited 10 tokens, no set of approved locks shall exceed 10 tokens. The allocator then co-signs the lock. + 2. The **allocator** ensures that the appropriate funds exists for the lock to be valid. In other words, if the sponsor has deposited 10 tokens, no set of approved locks shall exceed 10 tokens. The allocator then co-signs the lock. -3. Desired event takes place. + 3. Desired event takes place. -4. The **arbiter** validates that the event has taken place and releases the token to the appropriate recipient. + 4. The **arbiter** validates that the event has taken place and releases the token to the appropriate recipient. - + + In this flow, 2 signatures and 1 transaction – ignoring the 0'th step – is required; The lock have to be signed by the sponsor, and co-signed by the allocator. Then the arbiter makes the final call whether the desired event took place. diff --git a/src/content/docs/solver/01-introduction.mdx b/src/content/docs/solver/01-introduction.mdx new file mode 100644 index 0000000..f9c25e6 --- /dev/null +++ b/src/content/docs/solver/01-introduction.mdx @@ -0,0 +1,90 @@ +--- +title: "Solving Catalyst" +slug: "solver/intro" +description: "All Catalyst orders are permissionlessly solvable. This page introduces you how to being solving for Catalyst." +sidebar: + order: 1 +--- + +Catalyst is an entirely permissionless system. Since the system is componentized and components have no inherient trust elements to other components, they can be mixed and matched as wanted by users. As a result, it is important that you validate orders in their entirety once received. + +The general Catalyst flow is as follows: + +import { Steps } from '@astrojs/starlight/components'; + + + +1. The sponsor signs a Catalyst compatible lock and sends it to the Catalyst order server. + +2. The Catalyst order server preliminarily validates the order and gets the allocator co-signature for the order. It is then broadcasted to solvers. + +3. A solver submits the order's output to the output settlement contract, starting the verification layer. + + :::note[[Output Settlement](/implementation/output)] + The output settlement is denoted as the `remoteFiller` in the order struct. + ::: + +4. The proof is delivered to the input chain through the validation layer. + + :::note[[Validation layer](/implementation/validation)] + The validation layer is denoted as the `localOracle` and `remoteOracle` in the order struct. + ::: + +5. The solver submits the order to the input settlement contract, verifying the delivery and unlocking the associated input tokens. + + + + +### Orders +The Catalyst system does not define a strict order type and as a result there will be differences between how orders are expressed in various systems. Currently only 1 order description is supported across all VMs: + +```solidity +struct CatalystCompactOrder { + address user; + uint256 nonce; + uint256 originChainId; + uint32 fillDeadline; + address localOracle; + uint256[2][] inputs; + OutputDescription[] outputs; +} +``` + +Where `uint256[2][] inputs === [uint256 tokenId, uint256 amount][]` and `OutputDescription`: + +```solidity +struct OutputDescription { + bytes32 remoteOracle; + bytes32 remoteFiller; + uint256 chainId; + bytes32 token; + uint256 amount; + bytes32 recipient; + bytes remoteCall; + bytes fulfillmentContext; +} +``` + +The `CatalystCompactOrder` will be used to interface all functions on the input chain. Additionally, once hydrated with a signature it allows one to verify the validity of an order. + +The `CatalystCompactOrder` struct will be signed and stored as a witness in the appropriate lock/claim structure. For TheCompact this is: + +```solidity +struct BatchCompact { + address arbiter; // Associated settlement contract + address sponsor; // CatalystCompactOrder.user + uint256 nonce; // CatalystCompactOrder.nonce + uint256 expires; // CatalystCompactOrder.fillDeadline + uint256[2][] idsAndAmounts; // CatalystCompactOrder.inputs + CatalystWitness witness; +} + +struct CatalystWitness { + uint32 fillDeadline; // CatalystCompactOrder.fillDeadline + address localOracle; // CatalystCompactOrder.localOracle + OutputDescription[] outputs; // CatalystCompactOrder.outputs +} +``` + +To validate an order, ensure that the sponsor and allocator signatures are valid for this EIP-712 signed structure. + diff --git a/src/content/docs/solver/collecting-orders.mdx b/src/content/docs/solver/02-collecting-orders.mdx similarity index 99% rename from src/content/docs/solver/collecting-orders.mdx rename to src/content/docs/solver/02-collecting-orders.mdx index 5076177..b844c85 100644 --- a/src/content/docs/solver/collecting-orders.mdx +++ b/src/content/docs/solver/02-collecting-orders.mdx @@ -1,8 +1,12 @@ --- title: "Collecting Orders" +slug: "solver/orderflow" description: "CrossCats allows solvers to collect order flow to and from various VM chains and to and from Bitcoin. Compared to competing solution, capital hungry solvers can improve their capital turnaround by using the underwriting network to their advantage." sidebar: - order: 4 + order: 2 + badge: + text: Outdated + variant: note --- import { Tabs, TabItem } from "@astrojs/starlight/components"; diff --git a/src/content/docs/solver/evm-fulfilling.mdx b/src/content/docs/solver/20-evm-fulfilling.mdx similarity index 98% rename from src/content/docs/solver/evm-fulfilling.mdx rename to src/content/docs/solver/20-evm-fulfilling.mdx index d666c17..ff3bb09 100644 --- a/src/content/docs/solver/evm-fulfilling.mdx +++ b/src/content/docs/solver/20-evm-fulfilling.mdx @@ -1,8 +1,12 @@ --- title: "Fulfilling EVM Orders" +slug: "solver/evm" description: "CrossCats allows solvers to collect order flow to and from various VM chains and to and from Bitcoin. Compared to competing solution, capital hungry solvers can improve their capital turnaround by using the underwriting network to their advantage." sidebar: - order: 6 + order: 20 + badge: + text: Outdated + variant: note --- import { Tabs, TabItem } from "@astrojs/starlight/components"; diff --git a/src/content/docs/solver/btc-fulfilling.mdx b/src/content/docs/solver/29-btc-fulfilling.mdx similarity index 98% rename from src/content/docs/solver/btc-fulfilling.mdx rename to src/content/docs/solver/29-btc-fulfilling.mdx index b5516a3..f8dd18a 100644 --- a/src/content/docs/solver/btc-fulfilling.mdx +++ b/src/content/docs/solver/29-btc-fulfilling.mdx @@ -1,8 +1,12 @@ --- title: "Fulfilling BTC Orders" +slug: "solver/btc" description: "CrossCats allows solvers to collect order flow to and from various VM chains and to and from Bitcoin. Compared to competing solution, capital hungry solvers can improve their capital turnaround by using the underwriting network to their advantage." sidebar: - order: 7 + order: 29 + badge: + text: Outdated + variant: note --- import { Tabs, TabItem } from "@astrojs/starlight/components"; diff --git a/src/content/docs/solver/init-orders.mdx b/src/content/docs/solver/90-settling-orders.mdx similarity index 99% rename from src/content/docs/solver/init-orders.mdx rename to src/content/docs/solver/90-settling-orders.mdx index 69f8080..2ee0132 100644 --- a/src/content/docs/solver/init-orders.mdx +++ b/src/content/docs/solver/90-settling-orders.mdx @@ -1,8 +1,12 @@ --- -title: "Initiating Orders" +title: "Settling Orders" +slug: "solver/settlement" description: "CrossCats allows solvers to collect order flow to and from various VM chains and to and from Bitcoin. Compared to competing solution, capital hungry solvers can improve their capital turnaround by using the underwriting network to their advantage." sidebar: - order: 5 + order: 90 + badge: + text: Outdated + variant: note --- import { Tabs, TabItem } from "@astrojs/starlight/components"; diff --git a/src/content/docs/solver/introduction.mdx b/src/content/docs/solver/introduction.mdx deleted file mode 100644 index 34c0cb9..0000000 --- a/src/content/docs/solver/introduction.mdx +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: "Solving for CrossCats" -description: "CrossCats allows solvers to collect order flow to and from various VM chains and to and from Bitcoin. Compared to competing solution, capital hungry solvers can improve their capital turnaround by using the underwriting network to their advantage." -sidebar: - order: 3 ---- - -import { Tabs, TabItem } from "@astrojs/starlight/components"; - - -CrossCats utilizes three main order structures: - -1. [**CrossChainOrder**](https://github.com/catalystdao/cross-cats/blob/7e07281eef10ffadc10f9f75eb42d1c2419224ca/src/interfaces/ISettlementContract.sol#L6-L27) is a generic input order with an ERC-7683 compatible structure. The key component here is orderData, which contains the core functionality and varies significantly across ERC-7683 supporting implementations. -2. [**ResolvedCrossChainOrder**](https://github.com/catalystdao/cross-cats/blob/7e07281eef10ffadc10f9f75eb42d1c2419224ca/src/interfaces/ISettlementContract.sol#L29-L52) provides a quote description, detailing the value of a cross-chain order at a specific point in time. It is also ERC-7683 compliant\*, allowing solvers to efficiently compare the resolution of orders across various protocols. -3. [**OrderKey**](https://github.com/catalystdao/cross-cats/blob/7e07281eef10ffadc10f9f75eb42d1c2419224ca/src/interfaces/Structs.sol#L41-L65) is used to monitor a Catalyst order throughout its lifecycle. It includes Catalyst-specific context and provides an in-depth description of an order. - -Below is the generic ERC-7683 CrossChainOrder structure. The `CrossChainOrder.orderData` field is an ABI-encoded order struct. - -```solidity -struct CrossChainOrder { - address settlementContract; - address swapper; - uint256 nonce; - uint32 originChainId; - uint32 initiateDeadline; - uint32 fillDeadline; - bytes orderData; -} -``` - -The `orderData` field is uniquely encoded by CrossCats. Currently, two orderdata structs are supported: - -```solidity -/// @notice Simpler and slightly cheaper for order types with fixed inputs and outputs. -struct CatalystLimitOrderData { - uint32 proofDeadline; - uint32 challengeDeadline; - address collateralToken; - uint256 fillerCollateralAmount; - uint256 challengerCollateralAmount; - address localOracle; - Input[] inputs; - OutputDescription[] outputs; -} -/// @notice Supports Dutch Auctions on both input and output and support for additional custom order verification. -struct CatalystDutchOrderData { - bytes32 verificationContext; - address verificationContract; - uint32 proofDeadline; - uint32 challengeDeadline; - address collateralToken; - uint256 fillerCollateralAmount; - uint256 challengerCollateralAmount; - address localOracle; - uint32 slopeStartingTime; - /** @dev Input rate of change. */ - int256[] inputSlopes; - /** @dev Output rate of change. */ - int256[] outputSlopes; - Input[] inputs; - OutputDescription[] outputs; -} - -// With the input and output structs defined as: -struct Input { - address token; - uint256 amount; -} - -struct OutputDescription { - /** @dev Contract on the destination that tells whether an order was filled. - * Format is bytes32() slice of the encoded bytearray from the messaging protocol. - * If local: bytes32(uint256(uint160(address(localOracle)))). */ - bytes32 remoteOracle; - /** @dev The address of the token on the destination chain. */ - bytes32 token; - /** @dev The amount of the token to be sent. */ - uint256 amount; - /** @dev The address to receive the output tokens. */ - bytes32 recipient; - /** @dev The destination chain for this output. */ - uint32 chainId; - /** @dev Additional data that is relevant for the caller. */ - bytes remoteCall; -} -``` - -Users generate a `CrossChainOrder` with the appropriate order data and sign it as a Permit2 witness, thereby approving both the order description and its associated inputs with a single signature. The signed struct will be a new structure where `orderData` is an ABI-encoded order type. - -CrossCats has directionality. That means the ways orders are initiated depends on the initiating chain (where the user is swapping out of). In the current iteration, there are 2 important origin types: EVM and Bitcoin. In the future, all virtual machine chains (including EVM) will generally be initiated similarly and all non-VM chains (including Bitcoin) will be initiated similarly but different from VM chains. From 9b1cffec69929ffa076dc95a42adf4479c486eef Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 21 Feb 2025 14:54:54 +0300 Subject: [PATCH 5/7] feat: solving Bitcoin orders --- .../implementation/01-input-settlement.md | 9 +- src/content/docs/solver/01-introduction.mdx | 2 +- .../docs/solver/02-collecting-orders.mdx | 317 +++++++----------- ...{20-evm-fulfilling.mdx => 20-evm-fill.mdx} | 4 +- src/content/docs/solver/29-btc-fill.mdx | 179 ++++++++++ src/content/docs/solver/29-btc-fulfilling.mdx | 109 ------ .../docs/solver/90-settling-orders.mdx | 2 +- 7 files changed, 306 insertions(+), 316 deletions(-) rename src/content/docs/solver/{20-evm-fulfilling.mdx => 20-evm-fill.mdx} (98%) create mode 100644 src/content/docs/solver/29-btc-fill.mdx delete mode 100644 src/content/docs/solver/29-btc-fulfilling.mdx diff --git a/src/content/docs/implementation/01-input-settlement.md b/src/content/docs/implementation/01-input-settlement.md index 000e6f5..90ef091 100644 --- a/src/content/docs/implementation/01-input-settlement.md +++ b/src/content/docs/implementation/01-input-settlement.md @@ -110,4 +110,11 @@ When integrating CompactSettler, if the settler uses the `withDeposit` extension function depositFor(CatalystCompactOrder calldata order, ResetPeriod resetPeriod) external; ``` -Notice that nonces can not be reused and should be unique. +When this function is called, the Deposit event will be emitted for permissionless discovery. +```solidity +event Deposited(bytes32 orderId, CatalystCompactOrder order); +``` + +:::note +Nonces can not be reused and should be unique. +::: \ No newline at end of file diff --git a/src/content/docs/solver/01-introduction.mdx b/src/content/docs/solver/01-introduction.mdx index f9c25e6..da71229 100644 --- a/src/content/docs/solver/01-introduction.mdx +++ b/src/content/docs/solver/01-introduction.mdx @@ -6,7 +6,7 @@ sidebar: order: 1 --- -Catalyst is an entirely permissionless system. Since the system is componentized and components have no inherient trust elements to other components, they can be mixed and matched as wanted by users. As a result, it is important that you validate orders in their entirety once received. +Catalyst is an entirely permissionless system. Since the system is componentized and components have no inherent trust elements to other components, they can be mixed and matched as wanted by users. As a result, it is important that you validate orders in their entirety once received. The general Catalyst flow is as follows: diff --git a/src/content/docs/solver/02-collecting-orders.mdx b/src/content/docs/solver/02-collecting-orders.mdx index b844c85..f4ca365 100644 --- a/src/content/docs/solver/02-collecting-orders.mdx +++ b/src/content/docs/solver/02-collecting-orders.mdx @@ -1,232 +1,137 @@ --- title: "Collecting Orders" slug: "solver/orderflow" -description: "CrossCats allows solvers to collect order flow to and from various VM chains and to and from Bitcoin. Compared to competing solution, capital hungry solvers can improve their capital turnaround by using the underwriting network to their advantage." +description: "Catalyst has 2 ways of emitting orders: 1. On-chain through the deposit interface or through the Catalyst order server. For ease of integration and to ensure you receive all orders, it is recommended that you connect to the Catalyst order server for events." sidebar: order: 2 badge: - text: Outdated + text: in progress variant: note --- import { Tabs, TabItem } from "@astrojs/starlight/components"; -On VM chains, assets can be pulled from users via approvals – a feature not available on non-VM chains – instead the sequence of operation has been modified to allow the user to push assets to the solver. The easiest routes originate from a VM chain – these routes are generally permissionless – while routes originating from BTC are more difficult – these routes are generally permissioned. +The Catalyst order server is the recommended integration surface. However, if you are interested in the lowest latency, decentralised, and permissionless order discovery, you can read some orders on-chain. -## Pulling Orders - -The simplest way to collect orderflow from EVM is via polling. The order server stores orders in a dictionary format, allowing for straightforward parsing by integrators and provides a high level of transparency in the implementation. - -:::tip[Only order originating from VM chains can be pulled] -The order server only stores user signed orders. Since users can only sign order originating from VM chains, orders originating from non-vm chains – including from Bitcoin – cannot be pulled. -::: - - - - - ```typescript - // The type parameter (DutchAuctionData.type) is not be submitted on-chain but is used to differentiate order types. - type DutchAuctionData = { - type: "DutchAuction"; // Not to be submitted - verificationContext: string; - verificationContract: string; - proofDeadline: number; - challengeDeadline: number; - collateralToken: string; - fillerCollateralAmount: string; - challengerCollateralAmount: string; - localOracle: string; - slopeStartingTime: number; - inputSlopes: string[]; - outputSlopes: string[]; - inputs: {}[]; - outputs: {}[]; - }; - - type LimitOrderData = { - type: "LimitOrder"; // Not to be submitted - proofDeadline: number; - challengeDeadline: number; - collateralToken: string; - fillerCollateralAmount: string; - challengerCollateralAmount: string; - localOracle: string; - inputs: {}[]; - outputs: {}[]; - }; - - // With the CrossChainOrder defined as such: - type CrossChainOrder = { - settlementContract: string; - swapper: string; - nonce: string; - originChainId: number; - initiateDeadline: number; - fillDeadline: number; - orderData: DutchAuctionData | LimitOrderData; - }; - - type OrderDto = { - order: CrossChainOrder; - quote: { - fromAsset: string; - toAsset: string; - toPrice: string; - fromPrice: string; - intermediary: "USD" | "EUR" | "BTC" | string; // explicit string types here are examples. - discount: string; - }; - signature: string; - submitTime: number; - }; - - type PaginationMeta = { - total: number; - limit: number; - offset: number; - }; - - type GetOrdersResponse = { - data: OrderDto[]; - pagination: PaginationMeta; - }; - - async function getOrders(): GetOrdersResponse { - const API_URI = "https://crosscats-api-staging.catalyst.exchange"; - const API_KEY = "your_api_key_here"; - - const orderServerResponse = await fetch( - API_URI + "/orders", - { - headers: { - "x-api-key": API_KEY, - Accept: "application/json", - }, - } - ); - if (!orderServerResponse.ok) { - throw new Error(`HTTP error! status: ${orderServerResponse.status}`); - } - - const fetchedOrders = await orderServerResponse.json(); - return fetchedOrders; - } - ``` - - - - - ```python - import requests - - def get_orders(): - response = requests.get(API_URL + "orders/") - fetched_orders = response.json() - return fetched_orders - ``` - - - +### Types +```typescript +type OutputDescription = { + bytes32 remoteOracle: string; + bytes32 remoteFiller: string; + uint256 chainId: number; + bytes32 token: string; + uint256 amount: string; + bytes32 recipient: string; + bytes remoteCall: string; + bytes fulfillmentContext: string; +}; + +type CatalystCompactOrder = { + user: string; + nonce: number; + originChainId: number; + fillDeadline: number; + localOracle: string; + inputs: [string, string][]; + outputs: OutputDescription[]; +}; + +type OrderDto = { + order_type: "CatalystCompactOrder" | ...; + order: CatalystCompactOrder | ...; + quote: { + fromAsset: string; + toAsset: string; + toPrice: string; + fromPrice: string; + intermediary: "USD" | "EUR" | "BTC" | string; // explicit types as example + discount: string; + }[]; + sponsorSignature: string | ""; + allocatorSignature: string | ""; + submitTime: number; +}; +``` -## Subscribing to Orders +## Websocket Subscription -Subscribing to orders allow you to listen directly to the order flow. This section outlines how to subscribe to new orders using a WebSocket connection, allowing for real-time updates without the need to continuously poll the order server. By leveraging WebSocket, the Catalyst order server broadcasts new orders as they arrive, offering a significant reduction in latency but at the cost of increased complexity due to the need for a persistent connection and local filtering of incoming data. +The Catalyst order server deliveres orders through a websocket subscription aallowing for real-time updates without the need to continuously poll the order server. By leveraging WebSocket, the Catalyst order server broadcasts new orders as they arrive, offering a significant reduction in latency but at the cost of solvers having to locally filter incoming data. -Instead of polling for new orders, you can establish a WebSocket connection to the Catalyst order server. The server provides a WebSocket endpoint that pushes new order data to subscribers in real time. However, unlike polling, the data received through WebSocket is not pre-filtered. This means every order event will be pushed to your application, and it’s up to your implementation to manage and filter these events locally. +:::note +The data received through WebSocket is not pre-filtered. This means every order event will be pushed to your +application, and it is up to your implementation to manage and filter these events locally. +::: Below is a simplified implementation in pure JavaScript that demonstrates how to connect to the WebSocket server, handle incoming messages, respond to ping events, and automatically attempt to reconnect if the connection is lost. -:::caution[Quote requests are optional but required for BTC to USDC] -It is optional to handle `quote-request` and `quote-request-binding` event, however, if you want to solve BTC to USDC you have to respond to the `quote-request-binding` event. The response you make to this event is binding for 30 seconds. If you receive a message with the event `non-vm-order` you have to fill it – by correcting empty slots & signing it – or you may get blacklisted. -::: (TODO update typescript block) ```typescript - const WebSocket = require("ws"); - - // Configuration variables - const wsUri = process.env.ORDER_SERVER_WS_URI; // Set your WebSocket server URI - const apiKey = process.env.ORDER_SERVER_API_KEY; // Set your API key - const reconnectInterval = 5000; // Reconnect interval in milliseconds - - let ws; - - // Function to connect to the WebSocket server - function connectToOrderServer() { - ws = new WebSocket(wsUri, { - headers: { - "x-api-key": apiKey, - }, - }); - - ws.on("open", () => { - console.log("Connected to WebSocket server"); - }); - - ws.on("message", (data) => { - try { - const parsedData = JSON.parse(data.toString()); - console.log("Received message:", parsedData); - - switch (parsedData.event) { - case "ping": - handleReceivePing(); - break; - case "quote-request": - handleReceiveQuoteRequest(parsedData, ws); - break; - case "order": - handleReceiveOrder(parsedData, ws); - break; - default: - console.log("Unknown message type:", parsedData); - } - } catch (error) { - console.error("Error parsing JSON:", error); +const WebSocket = require("ws"); + +// Configuration variables +const wsUri = process.env.ORDER_SERVER_WS_URI; // Set your WebSocket server URI +const apiKey = process.env.ORDER_SERVER_API_KEY; // Set your API key +const reconnectInterval = 5000; // Reconnect interval in milliseconds + +// Function to connect to the WebSocket server +function connectToOrderServer() { + const ws = new WebSocket(wsUri, { + headers: { + "x-api-key": apiKey, + }, + }); + + ws.on("open", () => { + console.log("Connected to WebSocket server"); + }); + + ws.on("message", (data) => { + try { + const parsedData = JSON.parse(data.toString()); + console.log("Received message:", parsedData); + + switch (parsedData.event) { + case "ping": + // You will be automatically disconnected if you don't respond to ping messages + ws.send(JSON.stringify({ event: "pong" })); + break; + case "order": + handleReceiveOrder(parsedData, ws); + break; + default: + console.log("Unknown message type:", parsedData); } - }); - - ws.on("error", (error) => { - console.error("WebSocket error:", error); - }); - - ws.on("close", () => { - console.log("Disconnected from WebSocket"); - reconnect(); - }); - } - - // Function to handle ping messages, you will be automatically disconnected if you don't respond to ping messages - function handleReceivePing() { - ws.send(JSON.stringify({ event: "pong" })); - } - - // Function to handle quote requests - function handleReceiveQuoteRequest(data, ws) { - console.log("Handling quote request:", data); - // Add your custom handling logic here - } - - // Function to handle orders - function handleReceiveOrder(data, ws) { - console.log("Handling order:", data); - // Add your custom handling logic here - } - - // Function to attempt reconnection - function reconnect() { + } catch (error) { + console.error("Error parsing JSON:", error); + } + }); + + ws.on("error", (error) => { + console.error("WebSocket error:", error); + }); + + ws.on("close", () => { + console.log("Disconnected from WebSocket"); + console.log("Attempting to reconnect..."); setTimeout(() => { ws.close(); // Close any existing connection connectToOrderServer(); // Attempt to reconnect }, reconnectInterval); - } + }); +} - // Start listening to the order server - connectToOrderServer(); -``` +// Function to handle orders +function handleReceiveOrder(data, ws) { + console.log("Handling order:", data); + // Add your custom handling logic here +} +// Start listening to the order server +connectToOrderServer(); +``` ## Evaluating Orders @@ -234,8 +139,16 @@ After fetching an order, the solver must thoroughly evaluate it to determine its 1. **Quote Validation**: Use the `OrderDto.quote` field to access the price context, which provides the pricing details for the inputs and outputs of the order. If you trust the order server, you can primarily rely on this quote to validate the order’s pricing. However, it’s crucial to verify that the solver supports the specific origin chain (`OrderDto.order.originChainId`) and output chains (`OrderDto.order.orderData.outputs[...].chainId`) as well as their respective tokens (`input[].token` and `output[].token`). These parameters are guaranteed to be present across all order types. -2. **Solver-Exclusive Orders**: Some orders may initially be restricted to specific solvers. This is indicated by the `OrderDto.order.orderData.verificationContract` field. If this field is defined and not equal to `address(0)`, the order is exclusive to the designated solver until the `slopeStartingTime` elapses, after which the order becomes available for anyone to fulfill. +Evaluating orders carefully ensures that solvers can accurately determine the feasibility of executing an order, adhere to exclusivity rules, and avoid conflicts, thereby maintaining the integrity and efficiency of the order fulfillment process. -3. **Mutually Exclusive Orders**: Be aware of potential conflicts between orders. If you encounter two orders with the same `OrderDto.order.swapper` and `OrderDto.order.nonce`, these orders are mutually exclusive, meaning only one of them can be submitted on-chain. This mechanism prevents double submissions and ensures the integrity of the order processing. +## On-chain Order Broadcast -Evaluating orders carefully ensures that solvers can accurately determine the feasibility of executing an order, adhere to exclusivity rules, and avoid conflicts, thereby maintaining the integrity and efficiency of the order fulfillment process. +Output settlement schemes supporting on-chain orders like [`CompactSettlerWithDeposit.sol`](/implementation/input/#with-deposit) allows anyone to broadcast and collect orders on-chain through the `Deposit` event: + +```solidity +event Deposited(bytes32 orderId, CatalystCompactOrder order); +``` + +:::caution +When collecting permissionless orders, ensure they are properly validated and co-signed. The order server aids with validation but on-chain potential fraudulent messages can be emitted. +::: \ No newline at end of file diff --git a/src/content/docs/solver/20-evm-fulfilling.mdx b/src/content/docs/solver/20-evm-fill.mdx similarity index 98% rename from src/content/docs/solver/20-evm-fulfilling.mdx rename to src/content/docs/solver/20-evm-fill.mdx index ff3bb09..0c2b2e7 100644 --- a/src/content/docs/solver/20-evm-fulfilling.mdx +++ b/src/content/docs/solver/20-evm-fill.mdx @@ -1,12 +1,12 @@ --- -title: "Fulfilling EVM Orders" +title: "Filling EVM Orders" slug: "solver/evm" description: "CrossCats allows solvers to collect order flow to and from various VM chains and to and from Bitcoin. Compared to competing solution, capital hungry solvers can improve their capital turnaround by using the underwriting network to their advantage." sidebar: order: 20 badge: text: Outdated - variant: note + variant: caution --- import { Tabs, TabItem } from "@astrojs/starlight/components"; diff --git a/src/content/docs/solver/29-btc-fill.mdx b/src/content/docs/solver/29-btc-fill.mdx new file mode 100644 index 0000000..81fea41 --- /dev/null +++ b/src/content/docs/solver/29-btc-fill.mdx @@ -0,0 +1,179 @@ +--- +title: "Filling BTC Orders" +slug: "solver/btc" +description: "Catalyst supports Bitcoin orders. Filling Bitcoin orders is more complicated than EVM orders. If you are interested in filling Bitcoin orders, reach out and we will hook you up." +sidebar: + order: 1000 + badge: + text: Not Live + variant: danger +--- + +Catalyst supports a Bitcoin validation layer. However, filling Bitcoin swaps is technically more involved than EVM swaps. If you are already filling EVM swaps and interested in filling BTC swaps or interested in adding Bitcoin swaps to your app through Catalyst, reach out and we can get you onboarded. + +import { Tabs, TabItem } from "@astrojs/starlight/components"; + +To determine whether an order involves a Bitcoin transaction, check the `orderDto.order.outputs[].token` field. If the token indicates Bitcoin, ensure the following conditions are met: + +- The first 30 bytes of the token should be `0x000000000000000000000000BC0000000000000000000000000000000000`. + The 13th byte is `0xBC`. + +- The 31st byte indicates the number of confirmations required before the order can be verified on-chain. + - `0x00` and `0x01` represent 1 confirmation. + - `0x02` represents 2 confirmations. + - `0x03` represents 3 confirmations, and so on. + +- The 32nd byte contains an address version identifier, which should be decoded as `uint8`. + +If the transaction is directed to Bitcoin, the address (`orderDto.order.outputs[].recipient`) will contain a relevant destination hash or witness, not the address itself. This value must be used along with the address version identifier – 32nd byte of token – to decode the address. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersionNameEncoding SchemePrefixHash Length
0UnknownIgnore
1P2PKHBase58Check(00+PKH)1*20
2P2SHBase58Check(05+SH)3*20
3P2WPKHBech32bc1q**20
4P2WSHBech32bc1q**32
5P2TRBech32mbc1p**32
+\* Prefixes are determined by the encoding scheme. +\ +\*\* Part of the prefix – 1q/1p – is determined by the encoding scheme. + +You can use the below script to get inspiration for how to decode the Bitcoin address from an output description. + +```typescript +import bs58check from 'bs58check'; +import { bech32, bech32m } from 'bech32'; + +const hexStringToUint8Array = (hexString: string) => + Uint8Array.from( + hexString.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16)) + ); + +function decodeBitcoinAddress( + version: number, + recipientHash: string, + testnet = false, +): string { + if (version === 1) { + const prefix = !testnet ? '00' : '6F'; + const bytes = hexStringToUint8Array( + prefix + recipientHash.replace('0x', '').slice(0, 40) + ); + return bs58check.encode(bytes); + } + if (version === A2) { + const prefix = !testnet ? '05' : 'C4'; + const bytes = hexStringToUint8Array( + prefix + recipientHash.replace('0x', '').slice(0, 40) + ); + return bs58check.encode(bytes); + } + const prefix = !testnet ? 'bc' : 'tb'; + if (version === 3) { + const bytes = hexStringToUint8Array( + recipientHash.replace('0x', '').slice(0, 40) + ); + const words = bech32.toWords(bytes); + words.unshift(0x00); + return bech32.encode(prefix, words); + } + const bytes = hexStringToUint8Array( + recipientHash.replace('0x', '').slice(0, 64) + ); + if (version === 4) { + const words = bech32.toWords(bytes); + words.unshift(0x00); + return bech32.encode(prefix, words); + } + if (version === 5) { + const words = bech32m.toWords(bytes); + words.unshift(0x01); + return bech32m.encode(prefix, words); + } + + throw Error(`Unsupported Address Type ${version}`); +} +``` + +Once the address is generated, create a Bitcoin transaction with at least one output that **exactly** matches the described output from the initiated order. The transaction can have any number of inputs and outputs, as long as one output precisely matches the one specified by the order's output. This flexibility allows for batch filling, consolidation, and more. + +If the calldata is set on the output description, the Bitcoin transaction needs a second output which is exactly the next output index after the output filling the order: + +```typescript +// Assuming you use BitcoinJS PSBT: +import * as bitcoin from 'bitcoinjs-lib'; +... +bitcoin.initEccLib(ecc); // For Taproot support. + +const mainnet: bool; +const psbt = new bitcoin.Psbt({ + network: mainnet ? bitcoin.networks.bitcoin : bitcoin.networks.testnet; +}); + +// ... add inputs + +// Add the solving output. +psbt.addOutput({ address: to, value: outputValue }); + +// The very next output should be an OP_RETURN +const opReturnData = returnData.replace("0x", ""); +if (opReturnData.length > 0) { + const data_embed = bitcoin.payments.embed({ + data: [hexStringToUint8Array(opReturnData)], + }); + psbt.addOutput({ + script: data_embed.output!, + value: 0n, + }); +} + +// ... complete transaction +``` \ No newline at end of file diff --git a/src/content/docs/solver/29-btc-fulfilling.mdx b/src/content/docs/solver/29-btc-fulfilling.mdx deleted file mode 100644 index f8dd18a..0000000 --- a/src/content/docs/solver/29-btc-fulfilling.mdx +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: "Fulfilling BTC Orders" -slug: "solver/btc" -description: "CrossCats allows solvers to collect order flow to and from various VM chains and to and from Bitcoin. Compared to competing solution, capital hungry solvers can improve their capital turnaround by using the underwriting network to their advantage." -sidebar: - order: 29 - badge: - text: Outdated - variant: note ---- - -import { Tabs, TabItem } from "@astrojs/starlight/components"; - -To determine whether an order involves a Bitcoin transaction, check the `GetOrderData.order.orderData.outputs[].token` field. If the token indicates Bitcoin, ensure the following conditions are met: - -- The first 30 bytes of the token should be `0x000000000000000000000000BC0000000000000000000000000000000000`. The 13th byte is `0xBC`. -- The 31st byte indicates the number of confirmations required before the order can be verified on-chain. For example: - - `0x00` and `0x01` represent 1 confirmation. - - `0x02` represents 2 confirmations. - - `0x03` represents 3 confirmations, and so on. -- The 32nd byte contains an address version identifier, which should be decoded as `uint8`. - -If the transaction is directed to Bitcoin, the address (`GetOrderData.order.orderData.outputs[].recipient`) will contain a relevant destination hash or witness, not the address itself. This value must be used along with the address version identifier to decode the address. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VersionNameEncoding SchemePrefixHash Length
0UnknownIgnore
1P2PKHBase58Check(00+PKH)1*20
2P2SHBase58Check(05+SH)3*20
3P2WPKHBech32bc1q**20
4P2WSHBech32bc1q**32
5P2TRBech32mbc1p**32
-\* Prefixes are determined by the encoding scheme. -\ -\*\* Part of the prefix – 1q/1p – is determined by the encoding scheme. - -The following guidelines assume you are implementing this from the perspective of a solver. You need to convert the expected output script into a Bitcoin address that can be used with your wallet: - -- **P2PKH (Pay-to-PubKey-Hash)**: - - - The recipient is the public key hash. Encode the first 20 bytes with [Base58Check](https://rosettacode.org/wiki/Base58Check_encoding). Prepend with `00`, and encode with Base58Check. - -- **P2SH (Pay-to-Script-Hash)**: - - - The recipient is the script hash. Encode the first 20 bytes with [Base58Check](https://rosettacode.org/wiki/Base58Check_encoding). Prepend with `05`, and encode with Base58Check. - -- **P2WPKH (Pay-to-Witness-PubKey-Hash)**: - - - The recipient is the witness. Encode the first 20 bytes with [Bech32](https://github.com/bitcoinjs/bech32). Prepend with `bc1q`. - -- **P2WSH (Pay-to-Witness-Script-Hash)**: - - - The recipient is the witness hash. Encode the first 32 bytes with [Bech32](https://github.com/bitcoinjs/bech32). Prepend with `bc1q`. - -- **P2TR (Pay-to-Taproot)**: - - - The recipient is the witness hash. Encode the first 32 bytes with [Bech32m](https://en.bitcoin.it/wiki/BIP_0350#Bech32m). Prepend with `bc1p`. - -- **Nested Witness Addresses/Outputs**: - - These are **P2SH** addresses and should be treated like any other **P2SH** address. - -Once the address is generated, create a Bitcoin transaction with at least one output that **exactly** matches the described output from the initiated order. The transaction can have any number of inputs and outputs, as long as one output precisely matches the one specified by the order's output. This flexibility allows for batch filling, consolidation, and more. diff --git a/src/content/docs/solver/90-settling-orders.mdx b/src/content/docs/solver/90-settling-orders.mdx index 2ee0132..aa88940 100644 --- a/src/content/docs/solver/90-settling-orders.mdx +++ b/src/content/docs/solver/90-settling-orders.mdx @@ -6,7 +6,7 @@ sidebar: order: 90 badge: text: Outdated - variant: note + variant: caution --- import { Tabs, TabItem } from "@astrojs/starlight/components"; From a4b8a8c518cb000b26cde5ad80de9549bee174c6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 21 Feb 2025 15:11:03 +0300 Subject: [PATCH 6/7] feat: reorganise all files --- astro.config.mjs | 8 ++++---- .../101-input-settlement.md} | 0 .../102-output-settlement.mdx} | 0 .../103-validation-layers.md} | 0 .../99-calls.mdx => 1-implementation/199-calls.mdx} | 0 .../{implementation => 1-implementation}/ERC7683.md | 0 .../201-introduction.mdx} | 0 .../202-collecting-orders.mdx} | 2 +- .../20-evm-fill.mdx => 2-solver/220-evm-fill.mdx} | 0 .../29-btc-fill.mdx => 2-solver/229-btc-fill.mdx} | 2 +- .../290-settling-orders.mdx} | 0 .../701-bitcoin-primer.mdx} | 0 .../702-resource-locks.mdx} | 0 .../tx-lifecycle.md => 9-amm/901-tx-lifecycle.md} | 5 +++-- .../902-liquidity-pools.md} | 5 +++-- .../swaps-types.md => 9-amm/903-swaps-types.md} | 1 + .../904-liquidity-swaps.md} | 1 + .../905-permisisonless-deployments.md} | 1 + src/content/docs/protocol/protocol-fees.md | 12 ------------ 19 files changed, 15 insertions(+), 22 deletions(-) rename src/content/docs/{implementation/01-input-settlement.md => 1-implementation/101-input-settlement.md} (100%) rename src/content/docs/{implementation/02-output-settlement.mdx => 1-implementation/102-output-settlement.mdx} (100%) rename src/content/docs/{implementation/03-validation-layers.md => 1-implementation/103-validation-layers.md} (100%) rename src/content/docs/{implementation/99-calls.mdx => 1-implementation/199-calls.mdx} (100%) rename src/content/docs/{implementation => 1-implementation}/ERC7683.md (100%) rename src/content/docs/{solver/01-introduction.mdx => 2-solver/201-introduction.mdx} (100%) rename src/content/docs/{solver/02-collecting-orders.mdx => 2-solver/202-collecting-orders.mdx} (93%) rename src/content/docs/{solver/20-evm-fill.mdx => 2-solver/220-evm-fill.mdx} (100%) rename src/content/docs/{solver/29-btc-fill.mdx => 2-solver/229-btc-fill.mdx} (99%) rename src/content/docs/{solver/90-settling-orders.mdx => 2-solver/290-settling-orders.mdx} (100%) rename src/content/docs/{knowledge/1-bitcoin-primer.mdx => 7-knowledge/701-bitcoin-primer.mdx} (100%) rename src/content/docs/{knowledge/2-resource-locks.mdx => 7-knowledge/702-resource-locks.mdx} (100%) rename src/content/docs/{protocol/tx-lifecycle.md => 9-amm/901-tx-lifecycle.md} (98%) rename src/content/docs/{protocol/liquidity-pools.md => 9-amm/902-liquidity-pools.md} (99%) rename src/content/docs/{protocol/swaps-types.md => 9-amm/903-swaps-types.md} (99%) rename src/content/docs/{protocol/liquidity-swaps.md => 9-amm/904-liquidity-swaps.md} (99%) rename src/content/docs/{protocol/permisisonless-deployments.md => 9-amm/905-permisisonless-deployments.md} (98%) delete mode 100644 src/content/docs/protocol/protocol-fees.md diff --git a/astro.config.mjs b/astro.config.mjs index 27d5c6a..ebc8ca3 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -45,20 +45,20 @@ export default defineConfig({ { label: "Implementations", autogenerate: { - directory: "implementation", + directory: "1-implementation", }, }, { label: "Solvers", autogenerate: { - directory: "solver", + directory: "2-solver", }, }, { label: "Knowledge Database", collapsed: true, autogenerate: { - directory: "knowledge", + directory: "7-knowledge", }, }, { @@ -66,7 +66,7 @@ export default defineConfig({ collapsed: true, badge: "Legacy", autogenerate: { - directory: "protocol", + directory: "9-amm", }, }, ], diff --git a/src/content/docs/implementation/01-input-settlement.md b/src/content/docs/1-implementation/101-input-settlement.md similarity index 100% rename from src/content/docs/implementation/01-input-settlement.md rename to src/content/docs/1-implementation/101-input-settlement.md diff --git a/src/content/docs/implementation/02-output-settlement.mdx b/src/content/docs/1-implementation/102-output-settlement.mdx similarity index 100% rename from src/content/docs/implementation/02-output-settlement.mdx rename to src/content/docs/1-implementation/102-output-settlement.mdx diff --git a/src/content/docs/implementation/03-validation-layers.md b/src/content/docs/1-implementation/103-validation-layers.md similarity index 100% rename from src/content/docs/implementation/03-validation-layers.md rename to src/content/docs/1-implementation/103-validation-layers.md diff --git a/src/content/docs/implementation/99-calls.mdx b/src/content/docs/1-implementation/199-calls.mdx similarity index 100% rename from src/content/docs/implementation/99-calls.mdx rename to src/content/docs/1-implementation/199-calls.mdx diff --git a/src/content/docs/implementation/ERC7683.md b/src/content/docs/1-implementation/ERC7683.md similarity index 100% rename from src/content/docs/implementation/ERC7683.md rename to src/content/docs/1-implementation/ERC7683.md diff --git a/src/content/docs/solver/01-introduction.mdx b/src/content/docs/2-solver/201-introduction.mdx similarity index 100% rename from src/content/docs/solver/01-introduction.mdx rename to src/content/docs/2-solver/201-introduction.mdx diff --git a/src/content/docs/solver/02-collecting-orders.mdx b/src/content/docs/2-solver/202-collecting-orders.mdx similarity index 93% rename from src/content/docs/solver/02-collecting-orders.mdx rename to src/content/docs/2-solver/202-collecting-orders.mdx index f4ca365..0088168 100644 --- a/src/content/docs/solver/02-collecting-orders.mdx +++ b/src/content/docs/2-solver/202-collecting-orders.mdx @@ -56,7 +56,7 @@ type OrderDto = { ## Websocket Subscription -The Catalyst order server deliveres orders through a websocket subscription aallowing for real-time updates without the need to continuously poll the order server. By leveraging WebSocket, the Catalyst order server broadcasts new orders as they arrive, offering a significant reduction in latency but at the cost of solvers having to locally filter incoming data. +The Catalyst order server delivers orders through a websocket subscription aallowing for real-time updates without the need to continuously poll the order server. By leveraging WebSocket, the Catalyst order server broadcasts new orders as they arrive, offering a significant reduction in latency but at the cost of solvers having to locally filter incoming data. :::note The data received through WebSocket is not pre-filtered. This means every order event will be pushed to your diff --git a/src/content/docs/solver/20-evm-fill.mdx b/src/content/docs/2-solver/220-evm-fill.mdx similarity index 100% rename from src/content/docs/solver/20-evm-fill.mdx rename to src/content/docs/2-solver/220-evm-fill.mdx diff --git a/src/content/docs/solver/29-btc-fill.mdx b/src/content/docs/2-solver/229-btc-fill.mdx similarity index 99% rename from src/content/docs/solver/29-btc-fill.mdx rename to src/content/docs/2-solver/229-btc-fill.mdx index 81fea41..a34a665 100644 --- a/src/content/docs/solver/29-btc-fill.mdx +++ b/src/content/docs/2-solver/229-btc-fill.mdx @@ -3,7 +3,7 @@ title: "Filling BTC Orders" slug: "solver/btc" description: "Catalyst supports Bitcoin orders. Filling Bitcoin orders is more complicated than EVM orders. If you are interested in filling Bitcoin orders, reach out and we will hook you up." sidebar: - order: 1000 + order: 100 badge: text: Not Live variant: danger diff --git a/src/content/docs/solver/90-settling-orders.mdx b/src/content/docs/2-solver/290-settling-orders.mdx similarity index 100% rename from src/content/docs/solver/90-settling-orders.mdx rename to src/content/docs/2-solver/290-settling-orders.mdx diff --git a/src/content/docs/knowledge/1-bitcoin-primer.mdx b/src/content/docs/7-knowledge/701-bitcoin-primer.mdx similarity index 100% rename from src/content/docs/knowledge/1-bitcoin-primer.mdx rename to src/content/docs/7-knowledge/701-bitcoin-primer.mdx diff --git a/src/content/docs/knowledge/2-resource-locks.mdx b/src/content/docs/7-knowledge/702-resource-locks.mdx similarity index 100% rename from src/content/docs/knowledge/2-resource-locks.mdx rename to src/content/docs/7-knowledge/702-resource-locks.mdx diff --git a/src/content/docs/protocol/tx-lifecycle.md b/src/content/docs/9-amm/901-tx-lifecycle.md similarity index 98% rename from src/content/docs/protocol/tx-lifecycle.md rename to src/content/docs/9-amm/901-tx-lifecycle.md index c6cecb9..aea2d00 100644 --- a/src/content/docs/protocol/tx-lifecycle.md +++ b/src/content/docs/9-amm/901-tx-lifecycle.md @@ -1,5 +1,6 @@ --- title: "Transaction Lifecycle" +slug: "amm/tx-lifecycle" description: "A cross-chain Catalyst transaction lifecycle is spread across multiple chains. Lets examine a user swapping a token from Chain A to Chain B." sidebar: order: 1 @@ -7,7 +8,7 @@ sidebar: A cross-chain Catalyst transaction lifecycle is spread across multiple chains. Lets examine a user swapping a token from Chain A to Chain B. -```d2 + 1. **Assets to Units**. The user deposits their assets into Vault A along with the swap context. The vault converts their tokens into Units by examining the user's deposits and comparing them to the current liquidity within. 2. **Pack Swap**. The vault sends the swap context to the cross-chain interface (CCI). The CCI packs the swap context into bytes. These bytes will be compatible with any virtual machine (VM) the user may want to receive their assets on. diff --git a/src/content/docs/protocol/liquidity-pools.md b/src/content/docs/9-amm/902-liquidity-pools.md similarity index 99% rename from src/content/docs/protocol/liquidity-pools.md rename to src/content/docs/9-amm/902-liquidity-pools.md index 60c5fda..a2917d9 100644 --- a/src/content/docs/protocol/liquidity-pools.md +++ b/src/content/docs/9-amm/902-liquidity-pools.md @@ -1,5 +1,6 @@ --- title: "Liquidity Pools" +slug: "amm/liquidity-pools" description: "Catalyst liquidity pools can replicate any type of AMM pool such as Curve stableswap, UNI v2, and Balancer all while being natively cross-chain." sidebar: order: 2 @@ -10,7 +11,7 @@ Catalyst is extensible and can replicate any type of AMM pool such as Curve stab Catalyst keeps liquidity on-chain in Vaults without partitions. This allows anyone to use the complete liquidity in a Catalyst vault for any pair locally (ETH to USDC) or cross-chain (MATIC to BNB). Each Vault contains 1 or more assets and can be connected to none, one or more other vaults to allow swaps between their assets. When vaults are connected, they form a pool. Within a pool, any asset can be exchanged for any other asset. Below is an example of a 6 asset pool consisting of 3 vaults. - + Any asset within the pool can be exchanged into any other asset in the pool. This is facilitated by swapping into Units as an intermediary. Units are pricing using an internal price curve which defined a constant operation space. For local swaps within the same vaults, swap can be converted into and out of units in a single transaction allowing for full local utilisation of all liquidity contains the in vault. Using a cross-chain messaging layer, Units can be transferred to other connected vaults, where they can be converted into the desired output token. diff --git a/src/content/docs/protocol/swaps-types.md b/src/content/docs/9-amm/903-swaps-types.md similarity index 99% rename from src/content/docs/protocol/swaps-types.md rename to src/content/docs/9-amm/903-swaps-types.md index acf19fa..2c8708c 100644 --- a/src/content/docs/protocol/swaps-types.md +++ b/src/content/docs/9-amm/903-swaps-types.md @@ -1,5 +1,6 @@ --- title: "Swaps Types" +slug: "amm/swap-types" description: "Catalyst supports 4 different types of swaps: Local Swaps, Cross-Chain Swaps, Underwritten Cross-chain swaps, and Logic Dependent Swaps. This allows Catalyst to bring the forefront of cross-chain innovation anywhere." sidebar: order: 3 diff --git a/src/content/docs/protocol/liquidity-swaps.md b/src/content/docs/9-amm/904-liquidity-swaps.md similarity index 99% rename from src/content/docs/protocol/liquidity-swaps.md rename to src/content/docs/9-amm/904-liquidity-swaps.md index b05c9ab..3e23d52 100644 --- a/src/content/docs/protocol/liquidity-swaps.md +++ b/src/content/docs/9-amm/904-liquidity-swaps.md @@ -1,5 +1,6 @@ --- title: "Liquidity Swaps" +slug: "amm/liquidity-swaps" description: "Catalyst has a brand new deposit innovation called liquidity swaps that allow for an even easier cross-chain deposit experience." sidebar: order: 4 diff --git a/src/content/docs/protocol/permisisonless-deployments.md b/src/content/docs/9-amm/905-permisisonless-deployments.md similarity index 98% rename from src/content/docs/protocol/permisisonless-deployments.md rename to src/content/docs/9-amm/905-permisisonless-deployments.md index 1162ac56..bbc9cbc 100644 --- a/src/content/docs/protocol/permisisonless-deployments.md +++ b/src/content/docs/9-amm/905-permisisonless-deployments.md @@ -1,5 +1,6 @@ --- title: "Permissionless Deployments" +slug: "amm/deployments" description: "Anyone can deploy Catalyst to any chain that supports either EVM or CosmWasm." sidebar: order: 5 diff --git a/src/content/docs/protocol/protocol-fees.md b/src/content/docs/protocol/protocol-fees.md deleted file mode 100644 index fa0f095..0000000 --- a/src/content/docs/protocol/protocol-fees.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Protocol Fees" -description: "The distribution of fees for using Catalyst." -sidebar: - order: 6 ---- - -## Catalyst Transaction Fees - -To begin, each swap through the Catalyst protocol incurs a transaction fee of 5 bps (i.e., 0.05%). This can be configured by governance in the near future. - -Of the 5 bps, Liquidity Providers (LPs) will receive all 5 bps, and the Catalyst Protocol Treasury will 0 bps. This distribution of the transaction fee can also be later configured by governance. \ No newline at end of file From 8cf1b8983e207c9a5acd7ca2324cc43c28e5b4ea Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 21 Feb 2025 16:17:36 +0300 Subject: [PATCH 7/7] feat: last solving comments --- .../1-implementation/103-validation-layers.md | 54 ++- src/content/docs/2-solver/220-evm-fill.mdx | 163 ++++----- .../docs/2-solver/290-settling-orders.mdx | 320 ++---------------- 3 files changed, 146 insertions(+), 391 deletions(-) diff --git a/src/content/docs/1-implementation/103-validation-layers.md b/src/content/docs/1-implementation/103-validation-layers.md index 83c4998..b11430d 100644 --- a/src/content/docs/1-implementation/103-validation-layers.md +++ b/src/content/docs/1-implementation/103-validation-layers.md @@ -89,4 +89,56 @@ and converted into the appropriate payload for the input settlement layer: bytes32 payloadHash = _proofPayloadHash(orderId, solver, timestamp, output); ``` -Solvers wanting to support orders using the Polymer validation layer needs to implement the Polymer API to collect relevant event proofs. \ No newline at end of file +Solvers wanting to support orders using the Polymer validation layer needs to implement the Polymer API to collect relevant event proofs. + + +### Bitcoin (self-serve) + +Catalyst has a Bitcoin Simplified Payment Validation (SPV) client implementation. The implementation works both as a Output Settlement implementation and as a validation layer. + +The Bitcoin SPV client requires constant upkeep – the block chain has to be updated ~once every 10 minutes or whenever a transaction needs to be proven – to properly validate transaction. + +To generate a transaction proof refer to the below code: + +```typescript +import mempoolJS from "@catalabs/mempool.js"; +const mainnet: bool; +const { + bitcoin: { transactions, blocks }, +} = mempoolJS({ + hostname: "mempool.space", + network: mainnet ? undefined : "testnet4", +}); + +export async function generateProof( + txid: string, +): Promise<{ blockHeader: string; proof: Proof; rawTx: string }> { + const tx = await transactions.getTx({ txid }); + + const merkleProof = await transactions.getTxMerkleProof({ txid }); + // TODO: serialisation version 1. + const rawTx = await transactions.getTxHex({ txid }); + + const blockHash = await blocks.getBlockHeight({ + height: merkleProof.block_height, + }); + + // !: Most endpoints proide transactions witness encoded. + // The following function serve to strip the witness data. + const rawTxWitnessStripped = removeWitnesses(rawTx); + + const blockHeader = await blocks.getBlockHeader({ hash: blockHash }); + + return { + blockHeader, + proof: { + txId: txid, + txIndex: merkleProof.pos, + siblings: merkleProof.merkle.reduce( + (accumulator, currentValue) => accumulator + currentValue, + ), + }, + rawTx: rawTxWitnessStripped, + }; +} +``` \ No newline at end of file diff --git a/src/content/docs/2-solver/220-evm-fill.mdx b/src/content/docs/2-solver/220-evm-fill.mdx index 0c2b2e7..dc4349f 100644 --- a/src/content/docs/2-solver/220-evm-fill.mdx +++ b/src/content/docs/2-solver/220-evm-fill.mdx @@ -1,115 +1,76 @@ --- title: "Filling EVM Orders" slug: "solver/evm" -description: "CrossCats allows solvers to collect order flow to and from various VM chains and to and from Bitcoin. Compared to competing solution, capital hungry solvers can improve their capital turnaround by using the underwriting network to their advantage." +description: "To fill Catalyst orders requires supporting Output Settlement interfaces. Each Output Settlement interface is different but most support the generic OutputDescription types and allows filling orders through a shared context." sidebar: order: 20 - badge: - text: Outdated - variant: caution --- import { Tabs, TabItem } from "@astrojs/starlight/components"; -The delivery of assets varies based on the destination type: VM chains or Bitcoin. - -### EVM deliveries - -For EVM (Ethereum Virtual Machine) chains, you must interact with the specified oracle on the destination chain. Use the following details from the order to make the necessary call: - -- **Oracle Address**: Found in `OrderDto.order.orderData.outputs[].remoteOracle`. -- **Destination Chain**: Identified by `OrderDto.order.orderData.outputs[].chainId`. - - - - -```typescript -// It is assumed you are continuing from the above steps. -import { ethers } from "ethers"; - -const oracleAbi = "..."; - -// The oracle allows filling multiple outputs from different orders -// in a single transaction. They do have to go to the same chain. -// For simplicity, this function assumes that all outputs goes to -// the same chain but it may not be the case. -async function fillSingleChainOrder(order: CrossChainOrder) { - let recordedChain; - let recordedOracle; - for (const output of order.orderData.outputs) { - if (recordedChain === undefined) recordedChain = output.chainId; - if (recodedOracle === undefined) recodedOracle = output.remoteOracle; - if (recordedChain !== output.chainId) - throw Error( - `Mixed ChainIds, seen ${recordedChain} and ${output.chainId}` - ); - if (recodedOracle !== output.remoteOracle) - throw Error( - `Mixed Oracles, seen ${recodedOracle} and ${output.remoteOracle}` - ); - } - const oracle = new ethers.Contract(recordedOracle, oracleAbi, signer); - - // TODO: Set approvals for the oracleAddress for the value of the output. - - // We need to provide fill times. These have to be set to proofTime. - // These are used to ensure you can't reuse fills. - const fillTimes = order.orderData.outputs.map( - (_) => order.orderData.proofDeadline - ); - - // Call the reactor to initiate the order. - return oracle.fill(outputs, fillTimes); +The delivery of assets depends on the Output Settlement Interface associated with an order. The Output Settlement Interface can be read from the order: `orderDto.order.remoteFiller`. + +### BaseFiller based (CoinFiller) + +The CoinFiller is the simplest Output Settlement implementation and allows specifying limit orders and dutch auctions. + +:::caution +Support is not provided for dutch auctions yet. +::: + +To fill an output using Output Settlements based on `BaseFiller` use the associated fill interfaces: + +```solidity +function fill(bytes32 orderId, OutputDescription calldata output, bytes32 proposedSolver) external returns (bytes32) { + return _fill(orderId, output, proposedSolver); } + +function fillThrow(bytes32[] calldata orderIds, OutputDescription[] calldata outputs, bytes32 filler) external { + _fillThrow(orderIds, outputs, filler); +} + +function fillSkip(bytes32[] calldata orderIds, OutputDescription[] calldata outputs, bytes32 filler) external { + _fillSkip(orderIds, outputs, filler); +} +``` + +Filling a single output description is most efficient with `fill(...)` since it does not contain a for loop. However, it is limited to a single output at a time. + +For batch filling, `fillThrow` or `fillSkip` may be better. +- `fillThrow` fills all outputs but if one has been already been filled by another solver the whole call will revert. + + Use it when an output has multiple outputs and you are filling all outputs of an order or none. + +- `fillSkip` fills all outputs but if some has already been filled, those will be skipped silently. + + Use it when you are batch filling multiple orders. This allows you to claim as many outputs as possible in one go since even if one order got filled by another solver you will still fill the rest. + +## Validation Layers + +Once orders have been filled on the output settlement contract, they need to be submitted to the validation layer to be ferried to the input chain. The first step is to generate the associated payload. The [reference payload encoding format](/#standardized-message-format) is: + +``` +Encoded FillDescription + SOLVER 0 (32 bytes) + + ORDERID 32 (32 bytes) + + TIMESTAMP 64 (4 bytes) + + TOKEN 68 (32 bytes) + + AMOUNT 100 (32 bytes) + + RECIPIENT 132 (32 bytes) + + REMOTE_CALL_LENGTH 164 (2 bytes) + + REMOTE_CALL 166 (LENGTH bytes) + + FULFILLMENT_CONTEXT_LENGTH 166+RC_LENGTH (2 bytes) + + FULFILLMENT_CONTEXT 168+RC_LENGTH (LENGTH bytes) ``` - - - -```python -# It is assumed you are continuing from the above steps. - -oracleAbi = "..."; - -# The oracle allows filling multiple outputs from different orders in a single transaction. -# They do have to go to the same chain. -# For simplicity, this function assumes that all outputs goes to the same chain but it may not be the case. -def fill_single_chain_order(order): - oracle_address = order['orderData']['remoteOracle'] - - recordedChain = ""; - recordedOracle = ""; - for (output in order['orderData']['outputs']): - if (recordedChain == ""): - recordedChain = output.chainId - if (recordedOracle == ""): - recordedOracle = output.remoteOracle - if (recordedChain != output.chainId): - raise Exception(f"Mixed ChainIds, seen {recordedChain} and {output.chainId}"); - if (recordedOracle != output.remoteOracle): - raise Exception(f"Mixed Oracles, seen {recordedOracle} and {output.remoteOracle}"); - - oracle = web3.eth.contract(address=recordedOracle, abi=oracle_abi) - - # TODO: Set approvals for the oracleAddress for the value of the output. - - # We need to provide fill times. These have to be set to proofTime. - # These are used to ensure you can't reuse fills. - fillTimes = [order.orderData.proofDeadline for _ in order.orderData.outputs] - - # Build the transaction - txn = oracle.functions.fill(order.orderData.outputs, fillTimes).build_transaction({ - 'from': signer_address, - 'nonce': web3.eth.get_transaction_count(signer_address) - }) - # Sign the transaction - signed_txn = web3.eth.account.sign_transaction(txn, private_key=signer_private_key) - # Send the transaction - tx_hash = web3.eth.send_raw_transaction(signed_txn.rawTransaction) - # Wait for the transaction receipt - receipt = web3.eth.wait_for_transaction_receipt(tx_hash) - return receipt +It may be beneficial to batch multiple proven outputs to the validation layer. + +### Simple Broadcast Interfaces (Wormhole) + +For messaging protocols supporting simple broadcast interfaces like Wormhole, the following interface is used: + +```solidity +function submit(address proofSource, bytes[] calldata payloads) public payable returns (uint256 refund); ``` - - +Where `proofSource = orderDto.order.remoteFiller` and `payloads` is the encoded OutputDescriptions. \ No newline at end of file diff --git a/src/content/docs/2-solver/290-settling-orders.mdx b/src/content/docs/2-solver/290-settling-orders.mdx index aa88940..ba5f8c3 100644 --- a/src/content/docs/2-solver/290-settling-orders.mdx +++ b/src/content/docs/2-solver/290-settling-orders.mdx @@ -1,314 +1,56 @@ --- title: "Settling Orders" slug: "solver/settlement" -description: "CrossCats allows solvers to collect order flow to and from various VM chains and to and from Bitcoin. Compared to competing solution, capital hungry solvers can improve their capital turnaround by using the underwriting network to their advantage." sidebar: order: 90 - badge: - text: Outdated - variant: caution --- import { Tabs, TabItem } from "@astrojs/starlight/components"; -There are 2 different initiation paths, EVM and Bitcoin. Generally, all orders have to be initiated on a VM using a reactor. This allows the reactor to pull the input funds while awaiting proof of the output. Since Bitcoin does not these spending conditions, the order flow is reversed coma and the solver is responsible for signing the VM order. We shall start by going over EVM initiation. +To settle Catalyst orders may requires up to 2 transactions: +1. Submission of self-serve message validation +2. Finalising the order on the resource lock. -## EVM initiation - -After collecting an order – either through pulling or websockets – and verifying it, the next step is to submit it on-chain. Catalyst Orders are accompanied by a user signature (`OrderDto.signature`) that serves a dual purpose: - -1. **Permit2 Signature**: This signature acts as a Permit2 allowance, authorizing the Catalyst contracts to withdraw the submitter's tokens directly. This streamlines the process by eliminating the need for separate approval transactions. - -2. **User Order Authorization**: The signature also confirms that the user has approved the order, ensuring consent and alignment with the terms of execution. - -Orders are processed on a first-come, first-served basis, emphasizing the importance of swift submission to secure the desired transaction. By leveraging the Permit2 signature mechanism, Catalyst simplifies the initiation process, reducing overhead and ensuring seamless order execution. - - - - - ```typescript - // This tutorial uses ethersjs but you can easily replace it by similar libraries. - import { ethers } from "ethers"; - - const reactorAbi = "..."; - const signer = "ethers.signer..."; - - async function initiateOrder() { - // Get an order - const orders = await getOrders(); - const order = orders.orders[0]; - - // Define the reactor we will call. You can get the reactor address from the order - const reactorAddress = order.order.settlementContract; - const reactor = new ethers.Contract(reactorAddress, reactorAbi, signer); - - // TODO: Set approvals for the reactorAddress for all inputs & collateral. - - // The order arrives almost ready to use, - // we just need to remove the type from the orderdata. - const { type: _, ...cleanedOrderData } = order.order.orderData; - const cleanedOrder = { ...order.order, orderData: cleanedOrderData }; - const signature = order.signature; - const fillerData = "0x"; // #custom-fillerdata--underwriting - - // Call the reactor to initiate the order. - return reactor.initiate(cleanedOrder, signature, fillerData); - } - ``` - - - - - ```python - from web3 import Web3 - - rpc_url = "" - web3 = Web3(Web3.HTTPProvider(eth_node_url)) - - # Your ABI and signer details - reactor_abi = "..." - signer_private_key = "your_private_key_here" - signer_address = web3.eth.account.from_key(signer_private_key).address - - def initiate_order(): - # Get an order - orders = get_orders() - order = orders['orders'][0] - - # Define the reactor we will call. You can get the reactor address from the order - reactor_address = order['order']['settlementContract'] - reactor = web3.eth.contract(address=reactor_address, abi=reactor_abi) - - # TODO: Set approvals for the reactorAddress for all inputs & collateral. - # This will depend on the specific ERC20 tokens you're using, - # you need to call approve() on the ERC20 token contracts - - # Clean the order data by removing the type field - cleaned_order_data = order['order']['orderData'].copy() - cleaned_order_data.pop('type') - cleaned_order = {**order['order'], 'orderData': cleaned_order_data} - signature = order['signature'] - filler_data = "0x" # #custom-fillerdata--underwriting - - # Build the transaction - txn = reactor.functions.initiate(cleaned_order, signature, filler_data).build_transaction({ - 'from': signer_address, - 'nonce': web3.eth.get_transaction_count(signer_address) - }) - # Sign the transaction - signed_txn = web3.eth.account.sign_transaction(txn, private_key=signer_private_key) - # Send the transaction - tx_hash = web3.eth.send_raw_transaction(signed_txn.rawTransaction) - # Wait for the transaction receipt - receipt = web3.eth.wait_for_transaction_receipt(tx_hash) - return receipt - ``` - - - - -#### Custom FillerData & Underwriting - -By default, if `fillerData` is not specified, the input assets (provided by the user) are sent directly to the caller (`msg.sender`). This behavior is generally suitable for most use cases, eliminating the need for additional customization. - -However, if there is a need to direct the input assets to another address or to enable underwriting, a customized `fillerData` must be utilized. Currently, only one custom version (`v1`) is supported. The `v1` structure includes: - -- **Version Byte (0x01)**: Identifies the custom data version. -- **fillerAddress**: The address that will receive the input assets and collateral. -- **orderPurchaseDeadline**: A timestamp that allows an alternative buyer to purchase the order before this time. "Buying" the order in this context means transferring all of the input assets and collateral to the `fillerAddress`. -- **orderDiscount**: Provides buyers with a discount on the inputs, represented as a fraction of 2^16 - 1. For example, to offer a 1% discount, the value would be calculated as `0.01 * (2^16 - 1) = 655`. This feature is particularly useful for chains with slower block confirmations (e.g., Bitcoin), enabling the solver to be paid after 0-1 confirmations while assuring the user of higher finality (3-6 confirmations). - -Another version (`v2`) allows for adding additional logic when the inputs are paid. You can find more information on `v2` in our smart contracts or by reaching out. - - - - - ```typescript - const fillerDataVersion = "0x01"; - const fillerAddress = "0x....".replace("0x", ""); - // fillerAddress.length === 20*2; - const orderPurchaseDeadline = Number(1723199919) - .toString(16) - .padStart("0", 4 * 2); - //orderPurchaseDeadline.length === 4*2 - const orderDiscount = Math.floor(0.01 * (2 ** 16 - 1)) - .toString(16) - .padStart("0", 2 * 2); - // orderDiscount.length === 2*2 - - const fillerData = - fillerDataVersion + fillerAddress + orderPurchaseDeadline + orderDiscount; - ``` - - - - - ```python - fillerDataVersion = "0x01"; - fillerAddress = '0x....'.replace("0x", ""); - # len(fillerAddress) === 20*2; - orderPurchaseDeadline = hex(1723199919).replace("0x", "").zfill(4*2); - # len(orderPurchaseDeadline) === 4*2 - const orderDiscount = hex(int(0.01*(2**16-1))).replace("0x", "").zfill(2*2); - # len(orderDiscount) === 2*2 - - fillerData = fillerDataVersion + fillerAddress + orderPurchaseDeadline + orderDiscount; - ``` - - - - -## Bitcoin Initiation - -Bitcoin operates differently from VM chains in terms of script functionality. Bitcoin scripts only define spending conditions, meaning that, unlike VM chains, we cannot pull funds from a user after they have signed a message. Consequently, the order flow is reversed, and the solver is responsible for signing the VM order. - -Additionally, as previous chapters have described you cannot pull for BTC -> EVM orders. Instead you have to respond to the `quote-request-binding` event and get selected for a `non-vm-order` event. - -### Encode your Bitcoin address - -Your solver must be capable of generating 1 or multiple Bitcoin deposit address. CrossCats supports all 5 address types in common use: P2PKH, P2SH, P2WPKH, P2WSH, and P2TR. We recommend using either P2WPKH, P2TR, or P2WSH. - -:::caution[Ensure that amount + address is unique] -To prove if an output has been paid, we look for an exact amount of Bitcoin sent to a specific address. Any transaction that matches both and is included in a block 3 days before the `fillDeadline` allows the order to be proven. - -If the same address is used every order, it becomes crucial to ensure that the **amount** is unique. It is generally recommended to use different addresses for each order. Bitcoin does not impose additional fees for collecting UTXOs from multiple addresses. -::: - -Bitcoin addresses are encoded in two fields: `token` and `address`. - -- **`token`**: This field serves to differentiate VM tokens from Bitcoin orders, encode relevant context like confirmations and address version. Refer to the [UTXO type table](/knowledge/bitcoin/#utxo-type-table) for details on converting address types to versions. The field should consists of the bitcoin signifier (BC in the 12'th byte), number of confirmations in the 31st, UTXO type in the 32'th, and otherwise 0s. - -- **`address`**: This field encodes the public key hash, script hash, or witness hash. Use the decoding schemes listed in the [UTXO type table](/knowledge/bitcoin/#utxo-type-table) for various address versions. For addresses involving hashes of 20 bytes (P2PKH, P2SH, and P2WPKH), end pad the hashes with zeros (e.g., `0xabcdef...00000`). - -### Quote Open Order (WIP) - -For solvers handling BTC to VM conversions, quoting orders for comparison with other solvers is essential. To begin quoting: - -1. **Subscription**: Solvers must subscribe to quote requests from the order server. -2. **Response**: When a quote request is received, the solver must respond with a quote that remains valid for at least 60 seconds. If a signed order is requested within 30 seconds of the quote, the solver should provide a signed order with a lifetime of 30 seconds. The 60 seconds is the sum of these. - -Failure to respond with a signed order that matches or improves upon the quote within the 30-second window may result in blacklisting of the solver. - -Ensure your quoting mechanism is robust and timely to maintain competitive standing and avoid potential blacklisting. - -```typescript -export interface CatalystEvent { - event: string; - data: T; -} - -export interface CatalystQuoteRequestData { - quoteRequestId: string; - fromChain: string; - toChain: string; - fromAsset: string; - toAsset: string; - expirationTime: string; - amount: string; -} - -async function handleReceiveQuoteRequest( - parsedData: CatalystEvent, - ws: WebSocket -) { - try { - // an example of your custom function that will get the quote - const quote = await getSolverQuote( - parsedData.data.fromAsset, - parsedData.data.toAsset, - parsedData.data.amount - ); - - ws.send( - JSON.stringify({ - event: "solver-quote", - data: { - origin: "your_identifier", // required - quoteRequestId: parsedData.data.quoteRequestId, // required - ...quote, - }, - }) - ); - } catch (error) { - console.error("Error simulating quote:", error); - } -} +If the validation layer is not self-serve or is being sponsored, only 1 transactions is needed. You can listen to the `OutputProven` event to discover when your [payload](/solver/evm#validation-layers) has been verified. +``` +event OutputProven(uint256 chainid, bytes32 remoteIdentifier, bytes32 application, bytes32 payloadHash); ``` -### Return Signed Orders (WIP) - -Once the Order Server has evaluated all quotes from solvers, it selects the most favorable quote. After the user's deposit is confirmed, the Order Server will request the selected solver to provide a signed order. - -### Responsibilities of the Solver: +## Self-serve (in-progress) -1. **Provide a Signed Order**: The solver must return a signed order that aligns with the quoted terms and remains valid within the specified expiry period. +For how to relay proof for self-serve systems, please refer to their section in [validation](/implementation/validation). -2. **Order Exclusivity**: It is crucial that the signed order is exclusive to the user and the Order Server’s executor. This exclusivity ensures that the order cannot be fulfilled by other solvers or reused. (TODO) +## Finalising Orders -3. **Asset Delivery Assurance**: The CrossCats Order Server guarantees asset delivery through a Bitcoin address controlled by the Order Server but owned by the user. This setup ensures that the assets are securely delivered as promised. +The finalise call depends on the [Input Settlement](/implementation/input) but generally there are multiple interfaces available: -Ensuring these conditions helps maintain the integrity and efficiency of the order fulfillment process. It is essential that solvers adhere strictly to these requirements to ensure smooth operations and avoid any potential issues. +1. finaliseSelf: A self serve interface to withdraw the claim to the solver address. +2. finaliseTo: A self serve interface that allows you to send tokens elsewhere. +3. finaliseFor: An interface to allow someone to finalise for you, requiring a signature from you. -```typescript -export interface CatalystEvent { - event: string; - data: T; -} -export interface CrossChainOrder { - settlementContract: string; - swapper: string; - nonce: string; - originChainId: number; - initiateDeadline: number; - fillDeadline: number; - orderData: DutchOrderData | LimitOrderData; -} +### CompactSettler -export interface QuoteContext { - toAsset: string; - toPrice: string; - discount: string; - fromAsset: string; - fromPrice: string; - intermediary: string; -} +For the CompactSettler (and compliant settlers) you need to deliver the order as you originally received it `CatalystCompactOrder`, the attached signatures as `bytes.concat(sponsor, allocator)`, the timestamps of the fills (can be read from the OutputFilled event), and the solver's identifier / address. If there are multiple outputs, always index lists by their position in the order. -export interface CatalystOrderData { - order: CrossChainOrder; - quote: QuoteContext; - signature: string; -} +Then finalise can be called: -async function signOrderRequest(signOrderRequest: any): any | undefined { - const evaluationResponse = orderEvaluations(signOrderRequest); - if (evaluationResponse === undefined) return undefined; - ... -} +```solidity +function finaliseSelf(CatalystCompactOrder calldata order, bytes calldata signatures, uint32[] calldata timestamps, bytes32 solver) external; -async function handleReceiveOrder( - parsedData: CatalystEvent, - ws: WebSocket -) { - try { - // an example of your custom function that will get the quote - const signedOrder = await signOrderRequest(...); +function finaliseTo(CatalystCompactOrder calldata order, bytes calldata signatures, uint32[] calldata timestamps, bytes32 solver, address destination, bytes calldata call) external; - ws.send( - JSON.stringify({ - event: "solver-order-signed", - data: { - origin: "your_identifier", // required - ...signedOrder, // TODO: determine shape of signed order - }, - }) - ); - } catch (error) { - console.error("Error signing order:", error); - } -} +function finaliseFor( + CatalystCompactOrder calldata order, + bytes calldata signatures, + uint32[] calldata timestamps, + bytes32 solver, + address destination, + bytes calldata call, + bytes calldata orderOwnerSignature +) external; ``` -Once the signedOrder is sent & it correctly matches the expected quote, the vast vast majority of orders will be filled. - -TODO: The Order Server may respond back with a transaction hash. +:::note +If an order contains multiple outputs and two solvers filled different outputs, then the solver of the 0'th (or first) output is the canonical solver. However, the associated backup functions should be called instead with a list of the solvers as indexed by order.outputs +::: \ No newline at end of file