From 61e2e30a95f5e59e3d063f4e4b6162e8c78021c0 Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 07:31:58 +0800 Subject: [PATCH 01/20] Add Chinese translation for documentation --- docusaurus.config.js | 24 +- .../current/core-production.mdx | 5 + .../deploy-hyperlane-troubleshooting.mdx | 100 + .../current/deploy-hyperlane.mdx | 195 ++ .../current/faq.mdx | 109 + .../current/guides/avs-operator-guide.mdx | 73 + .../guides/create-custom-hook-and-ism.mdx | 205 ++ .../guides/deploy-hyperlane-local-agents.mdx | 413 ++++ .../current/guides/deploy-svm-warp-route.mdx | 149 ++ .../current/guides/deploy-warp-route-UI.mdx | 139 ++ .../guides/deploy-warp-route-UI.mdx.new | 139 ++ .../current/guides/deploy-warp-route.mdx | 130 ++ .../guides/developer-tips/unit-testing.mdx | 130 ++ .../guides/explorer/configuring-pi-chains.mdx | 61 + .../current/guides/explorer/explorer.mdx | 37 + .../current/guides/explorer/graphql-api.mdx | 171 ++ .../current/guides/extending-warp-route.mdx | 174 ++ .../current/guides/implementation-guide.mdx | 236 ++ .../current/guides/local-testnet-setup.mdx | 147 ++ .../current/guides/message-debugging.mdx | 149 ++ .../current/guides/quickstart-relayer.mdx | 164 ++ .../current/guides/quickstart-validator.mdx | 237 ++ .../current/guides/remove-trusted-relayer.mdx | 113 + .../current/guides/token-faucets.mdx | 26 + .../guides/transfer-mailbox-ownership.mdx | 102 + .../guides/transfer-warp-route-ownership.mdx | 120 + .../guides/update-mailbox-default-ism.mdx | 133 ++ .../current/intro.mdx | 19 + .../current/operate/agent-config.mdx | 62 + .../current/operate/config-reference.mdx | 1982 +++++++++++++++++ .../current/operate/deploy-with-terraform.mdx | 203 ++ .../current/operate/docker-quickstart.mdx | 157 ++ .../current/operate/overview-agents.mdx | 65 + .../operate/relayer/message-filtering.mdx | 66 + .../operate/relayer/monitoring-alerting.mdx | 48 + .../current/operate/relayer/run-relayer.mdx | 216 ++ .../current/operate/run-docker-compose.mdx | 53 + .../current/operate/set-up-agent-keys.mdx | 122 + .../validators/monitoring-alerting.mdx | 30 + .../operate/validators/run-validators.mdx | 244 ++ .../validators/validator-signatures-aws.mdx | 77 + .../core/_prerequisites-config-artifacts.mdx | 6 + .../core/commands/_core-apply-chain.mdx | 3 + .../core/commands/_core-read-chain.mdx | 3 + .../partials/deploy-hyperlane/_cli-chains.mdx | 13 + .../deploy-hyperlane/_deploy-contracts.mdx | 85 + .../deploy-hyperlane/_send-test-messages.mdx | 8 + .../partials/deploy-hyperlane/_setup-keys.mdx | 52 + .../deploy-hyperlane/_terminology.mdx | 5 + .../current/partials/ts-sdk-placeholder.mdx | 3 + .../_prerequisites-config-symbol.mdx | 8 + .../_warp-apply-symbol-config-default.mdx | 5 + .../commands/_warp-read-symbol-chain.mdx | 3 + .../current/production.mdx | 15 + .../current/protocol/ISM/aggregation-ISM.mdx | 33 + .../current/protocol/ISM/ccip-read-ISM.mdx | 146 ++ .../current/protocol/ISM/custom-ISM.mdx | 108 + .../current/protocol/ISM/modular-security.mdx | 45 + .../current/protocol/ISM/multisig-ISM.mdx | 73 + .../current/protocol/ISM/routing-ISM.mdx | 29 + .../current/protocol/ISM/sequence-diagram.mdx | 27 + .../ISM/third-party-ISMs/OPStack-ISM.mdx | 3 + .../arbitrum-L2-to-L1-ISM.mdx | 3 + .../ISM/third-party-ISMs/optimistic-ISM.mdx | 13 + .../ISM/third-party-ISMs/polygon-POS-ISM.mdx | 3 + .../ISM/third-party-ISMs/wormhole-ISM.mdx | 13 + .../current/protocol/agents.mdx | 8 + .../current/protocol/agents/relayer.mdx | 43 + .../current/protocol/agents/validators.mdx | 62 + .../economic-security/economic-security.mdx | 27 + .../economic-security/hyperlane-avs.mdx | 246 ++ .../protocol/interchain-gas-payment.mdx | 99 + .../current/protocol/mailbox.mdx | 108 + .../protocol/non-evm-implementations.mdx | 27 + .../current/protocol/protocol-overview.mdx | 38 + .../warp-routes-custom-gas-fast-native.mdx | 158 ++ .../warp-routes/warp-routes-example-usage.mdx | 96 + .../warp-routes/warp-routes-overview.mdx | 31 + .../warp-routes/warp-routes-types.mdx | 105 + .../warp-routes/warp-routes-yield-routes.mdx | 81 + .../applications/interchain-account.mdx | 213 ++ .../reference/applications/warp-routes.mdx | 38 + .../current/reference/audits.mdx | 50 + .../current/reference/cli.mdx | 49 + .../current/reference/domains.mdx | 23 + .../current/reference/glossary.mdx | 111 + .../reference/hooks/arbitrum-L2-to-L1.mdx | 91 + .../reference/hooks/interchain-gas.mdx | 218 ++ .../current/reference/hooks/op-stack.mdx | 53 + .../current/reference/hooks/overview.mdx | 290 +++ .../current/reference/hooks/polygon-pos.mdx | 47 + .../current/reference/latencies.mdx | 18 + .../reference/libraries/mailboxclient.mdx | 14 + .../current/reference/libraries/router.mdx | 14 + .../current/reference/libraries/typecasts.mdx | 4 + .../current/reference/messaging/receive.mdx | 137 ++ .../current/reference/messaging/send.mdx | 180 ++ .../current/reference/registries.mdx | 64 + .../current/warp-production.mdx | 5 + .../current/your-first-message.mdx | 47 + .../core/_prerequisites-config-artifacts.mdx | 6 + .../HomepageFeatures.js | 55 + .../docusaurus-plugin-content-pages/index.js | 40 + .../index.module.css | 31 + .../docusaurus-theme-classic/footer.json | 34 + .../docusaurus-theme-classic/navbar.json | 18 + i18n/zh-Hans/technical-glossary.md | 74 + package.json | 4 +- 108 files changed, 10781 insertions(+), 6 deletions(-) create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/core-production.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/deploy-hyperlane-troubleshooting.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/deploy-hyperlane.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/faq.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/avs-operator-guide.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/create-custom-hook-and-ism.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-hyperlane-local-agents.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-svm-warp-route.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route-UI.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route-UI.mdx.new create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/developer-tips/unit-testing.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/explorer/configuring-pi-chains.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/explorer/explorer.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/explorer/graphql-api.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/extending-warp-route.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/implementation-guide.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/local-testnet-setup.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/message-debugging.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/quickstart-relayer.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/quickstart-validator.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/remove-trusted-relayer.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/token-faucets.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/transfer-mailbox-ownership.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/transfer-warp-route-ownership.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/update-mailbox-default-ism.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/intro.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/agent-config.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/config-reference.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/deploy-with-terraform.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/docker-quickstart.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/overview-agents.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/relayer/message-filtering.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/relayer/monitoring-alerting.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/relayer/run-relayer.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/run-docker-compose.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/set-up-agent-keys.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/validators/monitoring-alerting.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/validators/run-validators.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/validators/validator-signatures-aws.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/core/_prerequisites-config-artifacts.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/core/commands/_core-apply-chain.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/core/commands/_core-read-chain.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_cli-chains.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_deploy-contracts.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_send-test-messages.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_setup-keys.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_terminology.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/ts-sdk-placeholder.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/warp-routes/_prerequisites-config-symbol.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/warp-routes/commands/_warp-apply-symbol-config-default.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/warp-routes/commands/_warp-read-symbol-chain.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/production.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/aggregation-ISM.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/ccip-read-ISM.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/custom-ISM.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/modular-security.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/multisig-ISM.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/routing-ISM.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/sequence-diagram.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/OPStack-ISM.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/arbitrum-L2-to-L1-ISM.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/optimistic-ISM.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/polygon-POS-ISM.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/wormhole-ISM.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/agents.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/agents/relayer.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/agents/validators.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/economic-security/economic-security.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/economic-security/hyperlane-avs.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/interchain-gas-payment.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/mailbox.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/non-evm-implementations.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/protocol-overview.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-custom-gas-fast-native.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-example-usage.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-overview.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-types.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-yield-routes.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/applications/interchain-account.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/applications/warp-routes.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/audits.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/domains.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/glossary.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/arbitrum-L2-to-L1.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/interchain-gas.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/op-stack.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/overview.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/polygon-pos.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/latencies.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/libraries/mailboxclient.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/libraries/router.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/libraries/typecasts.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/messaging/receive.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/messaging/send.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/registries.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/warp-production.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/your-first-message.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/partials/core/_prerequisites-config-artifacts.mdx create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-pages/HomepageFeatures.js create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-pages/index.js create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-pages/index.module.css create mode 100644 i18n/zh-Hans/docusaurus-theme-classic/footer.json create mode 100644 i18n/zh-Hans/docusaurus-theme-classic/navbar.json create mode 100644 i18n/zh-Hans/technical-glossary.md diff --git a/docusaurus.config.js b/docusaurus.config.js index 859f563a..f6699920 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -34,7 +34,17 @@ const config = { // to replace "en" with "zh-Hans". i18n: { defaultLocale: "en", - locales: ["en"], + locales: ["en", "zh-Hans"], + localeConfigs: { + en: { + label: 'English', + htmlLang: 'en-US', + }, + 'zh-Hans': { + label: '简体中文', + htmlLang: 'zh-Hans', + }, + }, }, plugins: [ @@ -397,12 +407,16 @@ const config = { respectPrefersColorScheme: true, }, navbar: { - title: "Hyperlane", + title: "Hyperlane Docs", logo: { - alt: "Hyperlane logo", + alt: "Hyperlane Logo", src: "img/logo.svg", }, items: [ + { + type: "localeDropdown", + position: "right", + }, { type: "docSidebar", sidebarId: "getstartedSidebar", @@ -496,9 +510,9 @@ const config = { ], }, ], - copyright: `Copyright © ${new Date().getFullYear()} Abacus Works, core developer for Hyperlane + copyright: `Copyright Š ${new Date().getFullYear()} Abacus Works, core developer for Hyperlane
- Built IRL in New York 🗽 and London 💂🏼‍♂️`, + Built IRL in New York ✨ and London ðŸ§â€â‚️`, }, prism: { additionalLanguages: ["solidity", "diff", "bash"], diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/core-production.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/core-production.mdx new file mode 100644 index 00000000..5f5ae4e3 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/core-production.mdx @@ -0,0 +1,5 @@ +# 如何将 Hyperlane 核心部署投入生产 + +为了将你的 Hyperlane 核心部署投入生产,你必须[更新邮箱的默认 ISM](/guides/update-mailbox-default-ism.mdx)。此外,你还需要[转移邮箱的所有权](/guides/transfer-mailbox-ownership.mdx)。 + +请继续阅读以下指南,将你的核心部署投入生产。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deploy-hyperlane-troubleshooting.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deploy-hyperlane-troubleshooting.mdx new file mode 100644 index 00000000..691822a9 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deploy-hyperlane-troubleshooting.mdx @@ -0,0 +1,100 @@ +# 如何排查 Hyperlane 部署问题 + +## 日志记录 + +可以使用以下两个环境变量配置 Hyperlane 工具的日志级别和格式: +- `LOG_LEVEL`:要过滤的日志级别。默认为 `info`。选项:`debug | info | warn | error | off` +- `LOG_FORMAT`:日志输出的格式。默认为 `pretty`。选项:`pretty | json` + +[Hyperlane CLI](/docs/reference/cli.mdx) 也允许通过 `--log` 和 `--verbosity` 标志配置日志。 + +## 链配置 + +在你的工作目录中,你可能会找到按链名称组织的 `chains/` yaml 文件。这些 `metadata.yaml` 文件描述了在 Hyperlane 部署和应用程序中使用链所需的信息。 + +你可以在此文件中为任何新链定义完整配置。可以配置的元数据在这个[示例配置](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/chain-config.yaml)中定义。你还可以在 [chainMetadataTypes.ts](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts) 中找到链元数据模式。 + +这是两个本地 anvil 链的配置示例: + +```yaml +--- +anvil1: + chainId: 31337 + domainId: 31337 + name: anvil1 + protocol: ethereum + rpcUrls: + - http: http://localhost:8545 + nativeToken: + name: Ether + symbol: ETH + decimals: 18 +anvil2: + chainId: 31338 + domainId: 31338 + name: anvil2 + protocol: ethereum + rpcUrls: + - http: http://localhost:8555 +``` + +你也可以通过提供要覆盖的字段来扩展核心链配置: + +```yaml +--- +sepolia: + blocks: + confirmations: 2 +``` + +### 覆盖 RPC URL + +你可以通过扩展核心链配置来覆盖 RPC URL。 + +在下面的示例中,你可以看到如何定义 RPC 数组以及如何调整其中任何一个的重试参数。 + +```yaml +--- +demochain: + name: demochain + chainId: 123456 + domainId: 123456 + protocol: ethereum + rpcUrls: + - http: https://rpc-testnet.demochain.gg +sepolia: + rpcUrls: + - http: https://rpc2.sepolia.org + - http: https://some-other-sepolia-rpc.gg + retry: + maxRequests: 10 +``` + +### 覆盖交易设置 + +交易覆盖是在形成交易请求时要包含的任何属性。例如: + +- `gasPrice`:数字 | 字符串 +- `maxFeePerGas`:数字 | 字符串 +- `maxPriorityFeePerGas`:数字 | 字符串 +- `nonce`:数字 | 字符串 +- `type`:数字 +- `ccipReadEnabled`:布尔值 + +在下面的示例中,我们使用 7 gwei 的 gas 价格,硬编码 nonce,并为基础费用和优先级费用设置最大值。 + +```yaml +--- +sepolia: + transactionOverrides: + gasPrice: 7000000000 # 7 gwei + maxFeePerGas: 150000000000 # 150 gwei + maxPriorityFeePerGas: 40000000000 # 40 gwei + nonce: 1337 +``` + +:::warning + +如果你在链配置中覆盖 nonce,请确保在交易成功时更新该值。 + +::: diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deploy-hyperlane.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deploy-hyperlane.mdx new file mode 100644 index 00000000..fa502c83 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deploy-hyperlane.mdx @@ -0,0 +1,195 @@ +# 如何将您的链与 Hyperlane 连接 + +:::info +本指南将帮助您尽快将 Hyperlane 部署到您的新链上以进行测试,而不是生产环境。这包括核心邮箱和 ISM 合约以及您要桥接的资产的 warp route 合约。 + +要查看已支持的链,请访问 [Registry](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains)。 + +如果您需要任何帮助,请在 Discord 上的 #developers 频道联系我们或[联系我们](https://forms.gle/KyRTaWvo4XNmNvrq6)。 +::: + +## 先决条件 + +任何人只要具备以下工件和资产就可以开始这个快速入门指南: +- 一个新的、自定义的或预先存在的网络,包括以下元数据: + - 链名称,例如 `ethereum` + - 链 ID,例如 `1` + - RPC URL,例如 `https://eth.llamarpc.com` +- 部署者钱包/EOA 私钥或助记词 + - 这个 EOA 应该在您的自定义链和任何您将要传递消息的链上都有资金 +- [Hyperlane CLI](/docs/reference/cli.mdx) + +## 1) Registry + +让我们创建一个自定义链配置,运行: + +```bash +hyperlane registry init +``` + +按照提示设置您的链元数据。设置区块或 gas 属性是可选的。 + +现在,在 `$HOME/.hyperlane/chains` 下,您会找到一个以您的自定义链名称命名的新文件夹,以及该文件夹中名为 `metadata.yaml` 的文件。 + +
+ + `$HOME/.hyperlane/chains/yourchain/metadata.yaml` 中的配置示例内容 + + + ```yaml + # yaml-language-server: $schema=../schema.json + blockExplorers: + - apiUrl: https://explorer.yourchain.com/api + apiKey: XXXX # 有助于避免合约验证 API 的速率限制 + family: etherscan #您使用的浏览器,也支持 routescan 或 blockscout + name: Chainscan + url: https://explorer.yourchain.com + chainId: 171717 + displayName: Chain Name + domainId: 171717 + isTestnet: true # 可选 + name: yourchain + nativeToken: + name: Ether + symbol: ETH + decimals: 18 + protocol: ethereum + rpcUrls: + - http: https://hyper-lane-docs.rpc.caldera.xyz/http + ``` +
+ +## 2) Core + +接下来,让我们配置、部署和测试您的自定义链的核心合约。 + +### 初始化配置 + +1. 从您的本地环境,将您的已有资金的部署者地址的私钥或助记词设置为 `HYP_KEY`。例如:`export HYP_KEY=''` +2. 从同一个终端实例,运行: + + ```bash + hyperlane core init + ``` +
+ + 部署配置将被写入 `./configs/core-config.yaml` + + + ```yaml + owner: "0x16F4898F47c085C41d7Cc6b1dc72B91EA617dcBb" + defaultIsm: + type: trustedRelayerIsm + relayer: "0x16F4898F47c085C41d7Cc6b1dc72B91EA617dcBb" + defaultHook: + type: merkleTreeHook + requiredHook: + owner: "0x16F4898F47c085C41d7Cc6b1dc72B91EA617dcBb" + type: protocolFee + beneficiary: "0x16F4898F47c085C41d7Cc6b1dc72B91EA617dcBb" + maxProtocolFee: "100000000000000000" + protocolFee: "0" + ``` + +
+ + +### 部署合约 + +要部署合约,运行: + +```bash +hyperlane core deploy +``` + +使用箭头和回车键从主网列表底部选择您的自定义链。 +所有合约部署需要几分钟时间。 +
+ + 在 `$HOME/.hyperlane/chains` 下,您会找到一个以您的自定义链名称命名的新文件夹,以及该文件夹中名为 `addresses.yaml` 的文件 + + ```yaml + staticMerkleRootMultisigIsmFactory: "0x6906cb4741d3E2322E9f9aA645DfC8AB6F122c47" + staticMessageIdMultisigIsmFactory: "0x3CE97a32d9C8294691cBd2baC09B078EDa75c429" + staticAggregationIsmFactory: "0x81f969fDBF48278Ce09685Ce48e03388B6785aF4" + staticAggregationHookFactory: "0x3d864A3c25F61E3c3A7d02e980453A6E1f0a92A6" + domainRoutingIsmFactory: "0xC4c01f7B03f0fFa77A0265C600dEF7Ad28BCa5A2" + proxyAdmin: "0xABb7175d5F123172E7B7Fa467CC9fE4C2FEdb942" + mailbox: "0x5F58d75A9caDE4e2b191313223978dF049f93b81" + interchainAccountRouter: "0x43c0745b0dE9Cb780816a24ddE63d79Ca99B5dE8" + interchainAccountIsm: "0x9C96dC8f4257413225d6B5C47d1afbafc39B269F" + validatorAnnounce: "0xE3bd39BF92DB385dE6313D6070b035bD934378CB" + testRecipient: "0xa58462b1943Be1469Ed58db690C78583BA34Fd2E" + ``` +
+ +### 发送测试消息 + +要发送测试消息,运行: + +```bash +hyperlane send message --relay +``` + +`--relay` 标志是可选的,它将消息传递到目标链。 + +您也可以在后台运行一个中继器: + +```bash +hyperlane relayer --chains yourchain,sepolia +``` + +:::note +**🎉 恭喜!您已成功向您的自定义链发送了消息** +::: + + +## 3) Warp Route + +现在您的链上已经有了 Hyperlane 邮箱和核心合约,是时候在您的链和任何其他 Hyperlane 链之间设置代币桥接了。 + +继续查看 [部署 Warp Route](/docs/guides/deploy-warp-route.mdx) 文档了解更多详情。 + +## 4) 提交到 Registry + +如果您希望其他链也能与您连接并将其投入生产,请提交 registry PR。 + +### 确保信息完整 +确保您的元数据完整: +- 在文件夹内添加 `logo.svg` 文件 +- 包含标识部署团队的 `Deployer` 信息 +- 如果链是测试网,则指示 `isTestnet` 为 `true` +- 如果您有 gnosis safe 服务,添加 api url `gnosisSafeTransactionServiceUrl` +- 对 yaml 文件进行 lint 处理并按字母顺序排序 + +### 提交到 Github + +首先,导航到您的 registry 本地实例并提交更改 + +```bash +cd ~/.hyperlane && git init && git add . && git commit +``` + +然后,将本地 registry 与规范 registry 同步 + +```bash +git remote add canonical git@github.com:hyperlane-xyz/hyperlane-registry.git +git pull canonical main --rebase +``` + +最后,将本地 registry 推送到 github fork 并提交 PR。请在您的 PR 中包含一个 [changeset](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)。 + +:::note +**恭喜!您已成功将 Hyperlane 部署到您的链并将您的工作添加到 Hyperlane registry** + +感谢您为无需许可的互操作性的未来做出贡献 🫡 +::: + +### 投入生产 +#### 社区运行的基础设施 +作为公共产品,Hyperlane 的核心开发团队 - Abacus Works - 可以免费帮助您将主网链投入生产。您可以在 PR 中请求这个服务,每两周添加一批新链。 + +这包括运行一个将您的链连接到网络的中继器,将您的链添加到 [Explorer](https://explorer.hyperlane.xyz/),并在您的链的默认验证器集中运行一个验证器。没有持续的成本或锁定 - 您可以随时选择将中继器迁移到自托管选项或更改验证器集。 + +#### 自托管基础设施 +像 Stride 这样具有 devops 经验的链选择运行自己的中继器。虽然这确实有一些运营负担,但这允许他们按照自己的节奏更快地添加新链。此外,他们可以选择设置或补贴与中继相关的跨链 gas 成本。有关更多信息,请参阅 [运营](/docs/operate/relayer/run-relayer.mdx) 文档。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/faq.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/faq.mdx new file mode 100644 index 00000000..ce261621 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/faq.mdx @@ -0,0 +1,109 @@ +# 常见问题 + +
+ **什么是 Hyperlane?** +
+
Hyperlane 是第一个为模块化区块链架构构建的通用且无需许可的互操作性框架。任何人都可以将 [Hyperlane 部署](./deploy-hyperlane.mdx)到任何区块链环境中,无论是第一层区块链、扩容层还是应用链,使该链能够与任何其他已部署 Hyperlane 的链进行无缝通信。
+
+
+ +
+ **使用 Hyperlane 对区块链开发者有什么好处?** +
+
Hyperlane 为区块链和 dapp 开发者都提供了好处。 +对于区块链开发者来说,Hyperlane 部署扩展了对其他已部署 Hyperlane 的连接区块链上的用户、资产和有价值状态的可访问性。 +对于 dapp 开发者来说,Hyperlane 提供了跨多个区块链的无缝连接,使开发者能够创建跨链网络效应和流动性,用户可以从他们偏好的链上与应用程序交互。
+
+
+ +
+ **Hyperlane 如何保证安全?** +
+
Hyperlane 通过其具有跨链安全模块(ISM)的模块化安全堆栈来保证安全。开发者可以配置各种预构建的 ISM,将它们相互组合,甚至根据应用程序的需求创建自定义 ISM。 +模块化的安全方法确保 Hyperlane 将继续跟上安全模型的最新行业进展。
+
+
+ +
+ **谁是 Hyperlane 的验证者?** +
+
Hyperlane 通过具有 ISM 的模块化安全堆栈来保证安全。没有协议规定的安全模型,更不用说验证者集合了。也就是说,大多数 Hyperlane 部署都配置了默认 ISM,如果消息接收者没有指定 ISM 覆盖,则指定要使用的安全模型。
+
+
+ +
+ **我可以用 Hyperlane 构建什么?** +
+
Hyperlane 的[消息接口](./reference/messaging/messaging-interface.mdx)允许 dapp 开发者在不同链上的智能合约之间发送任意字节。这可以用来创建跨链应用程序,即跨多个链的 dapp。作为灵感,看看一些基于 Hyperlane 构建的预构建应用程序,包括:Warp Routes,让用户可以将代币从一个链转移到另一个链;跨链账户:让用户可以进行跨链函数调用;跨链查询:让用户可以进行跨链视图调用
+
+
+ +
+ **Hyperlane 部署在哪里?** +
+
已知部署的列表可以在[合约地址](./reference/contract-addresses.mdx)页面找到
+
+
+ +
+ **当我在 Hyperlane 上发送消息时会发生什么?** +
+
更多详情请参见[发送](./reference/messaging/send.mdx)和[接收](./reference/messaging/receive.mdx)页面。简而言之,应用程序在源链上调用 `dispatch()` 函数,将消息插入到邮箱的 Merkle 树中。Hyperlane 中继器观察已发送的消息,并为接收者的跨链安全模块(ISM)组装元数据。中继器通过调用 `Mailbox.process()` 将消息传递给接收者。邮箱使用接收者的 ISM 验证消息,并调用 `recipient.handle()` 来传递消息。
+
+
+ +
+ **如何查看我发送的消息的状态?** +
+
将地址或交易哈希粘贴到 [Hyperlane 消息浏览器](https://explorer.hyperlane.xyz/)的搜索栏中,查看消息的状态和历史详情。如果消息由于某种原因发送失败,将会有错误消息指示可能出现了什么问题。有关如何调试未传递消息的更多信息,请参见[浏览器调试](/docs/guides/explorer/explorer-debugging.mdx)
+
+
+ +
+ **使用 Hyperlane 发送跨链消息是否意味着实时聊天和文本?** +
+
Hyperlane 是一个旨在让不同链上的智能合约相互交互的协议。当我们提到消息传递时,是指在智能合约之间发送任意字节,而不是点对点或文本消息。有几个 web3 项目适合聊天用例;考虑使用 [XMTP](https://xmtp.org/)、[Push](https://push.org/) 或 [Orbis](https://useorbis.com/) 进行这类消息传递。
+
+
+ +
+ **Hyperlane 是代币桥吗?** +
+
不完全是。Hyperlane 是一个通用消息传递(GMP)协议,允许区块链之间的通信。代币桥只是可以在 Hyperlane 之上构建的众多应用类型之一!
+
+
+ +
+ **我是开发者。我的团队如何使用 Hyperlane 构建?** +
+
如果你正在阅读这个 FAQ,你已经找到了文档,这是一个很好的起点。也就是说,我们知道在实施过程中会出现问题,我们很乐意帮助你。Hyperlane 社区在 [Discord](http://discord.gg/hyperlane) 中经常活跃。开发者的反馈直接影响产品路线图。
+
+
+ +
+ **什么是 Abacus Works?** +
+
Abacus Works 是致力于 Hyperlane 的法律实体的名称。你可能在较早的帖子和存储库中遇到一些对 Abacus 的引用。Hyperlane 在 2022 年秋季从 Abacus 更名为 Hyperlane。
+
+
+ +
+ **如何加入 Hyperlane 社区?** +
+
你可以加入 [Discord](http://discord.gg/hyperlane) 或关注 Hyperlane [Twitter](http://twitter.com/hyperlane),在那里你可以找到一个不断成长的开发者和爱好者社区,讨论跨链的未来。
+
+
+ +
+ **我对在 Hyperlane 工作感兴趣,在哪里可以看到职位空缺?** +
+
在[这里](https://jobs.lever.co/Hyperlane)查看我们的空缺职位。
+
+
+ +
+ **如何为改进此文档做出贡献?** +
+
你可以通过[文档仓库](https://github.com/hyperlane-xyz)直接提交 PR 来编辑此文档。
+
+
diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/avs-operator-guide.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/avs-operator-guide.mdx new file mode 100644 index 00000000..4ca4c9ae --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/avs-operator-guide.mdx @@ -0,0 +1,73 @@ +# Hyperlane AVS 运营商指南 + +## 概述 + +Hyperlane 验证器是负责安全的轻量级链下代理 - 它们观察源链上的 [Mailbox](../protocol/mailbox.mdx) 中的消息,并在需要时签署一个证明邮箱当前状态的默克尔根。 + +这个签名被存储并公开可用(例如在 S3 存储桶中),然后被链下的中继器和链上的跨链安全模块使用。验证器之间_不_需要联网,也不需要达成共识。 + +按照本指南,您将在协议运行的[**任何链**](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains)上运行 Hyperlane 验证器,包括 Arbitrum、Optimism、BSC、Base、Blast、Linea、Mode 和 Polygon。之后,您将通过与以太坊主网或 Holesky 上的 AVS 合约交互,将您的验证器与您的 EigenLayer 运营商关联。这个过程,就像整个 Hyperlane 框架一样,是开源和无需许可的 - 不需要白名单或质押最低限额。 + +## 1. 安装 CLI + +使用 `npm install -g @hyperlane-xyz/cli` 安装最新版本的 `@hyperlane-xyz/cli` 包。详细的 CLI 安装说明可在[此处](https://docs.hyperlane.xyz/docs/reference/cli)获得。 + +## 2. 运行验证器 + +想要使用 Docker Compose 和 AWS 快速部署生产就绪环境的运营商可以参考 [Docker Compose 快速入门指南](../operate/docker-quickstart.mdx)。 + +按照[此处](../operate/validators/run-validators.mdx)的验证器指南,使用 AWS 设置在 Hyperlane 网络内的[任何链](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains)上运行验证器。您也可以轻松地推广到其他存储提供商,如 [GCP](https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3156) 和 Azure,或其他密钥管理解决方案。 + +确保您的 KMS 密钥在该链上有资金以宣布自己。 + +### 监控 + +您可以通过在验证器配置中指定的 `--metrics` 端口监控 EigenLayer 特定的端点。在[此处](https://docs.eigenlayer.xyz/eigenlayer/avs-guides/spec/api/)阅读更多关于示例端点和预期内容的信息。 + +支持的端点包括: + +| 端点 | 描述 | +| ---------------------------- | ------------------------------------------ | +| **GET /eigen/node** | 用于节点信息 | +| **GET /eigen/node/health** | 用于节点健康状况 | +| **GET /eigen/node/services** | 用于列出节点正在运行的服务 | + +您需要验证器地址(签名密钥的地址)用于下一步。 + +## 3. 设置密钥 + +运营商密钥和 AVS 签名密钥之间有区别。运营商密钥仅用于与 AVS 合约交互,而 AVS 签名密钥用于主动操作,在我们的情况下将用于使用 Hyperlane 验证器签署检查点。 + +## 4. 注册您的运营商 + +首先,确保您已在主网或 Holesky 上[作为 EigenLayer 运营商](https://docs.eigenlayer.xyz/eigenlayer/operator-guides/operator-installation#operator-configuration-and-registration)使用您的运营商密钥注册。您只需要 ECDSA 密钥。 + +接下来,要注册您的运营商到 Hyperlane AVS,您可以使用 Hyperlane CLI。通过创建 ECDSA 签名并将其与 AVS 签名密钥(即您上面的 Hyperlane 验证器地址,而不是私钥)一起提交,来注册您的运营商密钥(通过 EigenLayer CLI 生成)。 + +```bash + hyperlane avs register --operatorKeyPath \ + --chain \ + --avsSigningKeyAddress +``` + +`AVS_NETWORK` 是您注册的网络,可以是 `Ethereum` 或 `Holesky`。 + +您的 AVS 签名密钥可以在多个验证器之间重复使用,不需要为每个验证器额外注册。如果您为每个验证器使用不同的 AVS 签名密钥,则需要将每个密钥注册为运营商。 + +### 确认注册 + +要确认您在主网上已注册,请使用 Hyperlane CLI 运行 `hyperlane avs check --chain ethereum --operatorAddress ` 并查看您的验证器地址是否在那里。此查询可能需要几分钟才能完成。 + +此外,您可以在 [Etherscan](https://etherscan.io/address/0x272CF0BB70D3B4f79414E0823B426d2EaFd48910#readProxyContract#F12) 上的 `operatorRegistry` 函数下搜索您的地址,或在 EigenLayer 的 UI 上查看 [Ethereum](https://app.eigenlayer.xyz/avs/0xe8e59c6c8b56f2c178f63bcfc4ce5e5e2359c8fc) 或 [Holesky](https://holesky.eigenlayer.xyz/avs/0xc76e477437065093d353b7d56c81ff54d167b0ab)。 + +:::success + +恭喜您注册了 Hyperlane AVS! + +现在任何 Hyperlane 消息接收者都可以利用您的验证器签名,帮助确保 rollup 互操作的安全。 + +::: + +## 了解更多 + +您可以在[此处](/docs/protocol/economic-security/hyperlane-avs.mdx)阅读更多关于 AVS 协议设计的信息。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/create-custom-hook-and-ism.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/create-custom-hook-and-ism.mdx new file mode 100644 index 00000000..875ea25b --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/create-custom-hook-and-ism.mdx @@ -0,0 +1,205 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +import { MultiLanguageExample } from "@site/src/components/InteractiveExample"; + +# 创建自定义 Hook 和 ISM + +Hook 和 ISM 具有互补关系:您可以在源链上自定义行为,并在目标链上使用成对的 ISM 合约来验证您的自定义 hook 行为。 + +您可以根据需求实现和使用自己的 hook 和 ISM 模式。您可以通过在源链上实现 `IPostDispatchHook` 接口和在目标链上实现 `IInterchainSecurityModule` 来使用 Wormhole 或 Chainlink 的 CCIP 等外部桥接提供商。 + +
+`IPostDispatchHook` 接口 + + + + +```solidity file=/node_modules/@hyperlane-xyz/core/contracts/interfaces/hooks/IPostDispatchHook.sol#L16-L63 +interface IPostDispatchHook { + /** + * @notice Returns the amount of native tokens that should be provided when calling + * postDispatch for a given message + * @dev The hook may charge an additional fee on top of the base Hyperlane fee + * @param metadata Metadata provided to mailbox dispatch call + * @param message The message being dispatched + * @return The amount of native tokens that should be provided when calling postDispatch + */ + function quoteDispatch(bytes calldata metadata, bytes calldata message) + external + view + returns (uint256); + + /** + * @notice Called by a Mailbox after dispatching a message + * @dev msg.value must equal the amount specified by quoteDispatch + * @param metadata Metadata provided to mailbox dispatch call + * @param message The message being dispatched + */ + function postDispatch(bytes calldata metadata, bytes calldata message) + external + payable; +} +``` + + + +
+ +
+`IInterchainSecurityModule` 接口 + + + + +```solidity file=/node_modules/@hyperlane-xyz/core/contracts/interfaces/IInterchainSecurityModule.sol#L4-L35 +interface IInterchainSecurityModule { + /** + * @notice Returns whether the message is verified + * @dev Called by a router before message processing + * @param metadata Metadata provided to mailbox dispatch call + * @param message The message being dispatched + * @return True if the message is verified + */ + function verify(bytes calldata metadata, bytes calldata message) + external + payable + returns (bool); +} +``` + + + +
+ +:::info +Hook 目前需要使用 [`StandardHookMetadata` 库](../reference/libraries/hookmetadata.mdx)格式化元数据。 +::: + +您还可以继承我们的 `AbstractMessageIdAuthorizedIsm`,它允许对中间的 `verifyMessageId` 函数调用进行访问控制,如果从授权的 `AbstractMessageIdAuthHook` hook 接收到消息,该函数会在存储中将 messageId 设置为 true。这种模式目前用于 [`OpStackHook`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/ef2ece300e71a30e8f4f59e5b26e21eea012d43b/solidity/contracts/hooks/OPStackHook.sol#L33C8-L33C8) [`OpStackIsm`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/ef2ece300e71a30e8f4f59e5b26e21eea012d43b/solidity/contracts/isms/hook/OPStackIsm.sol#L31) 模式。 + +### 工作流程 + +```mermaid +flowchart TB + subgraph Origin Chain + Sender + M_O[(Mailbox)] + E_B_O[(ExternalBridgeOrigin)] + + C_H[AbstractMessageIdAuthorizedIsm] + Sender -- "dispatch(..., metadata){value}" --> M_O + + M_O -. "postDispatch(metadata, ...)\n{value - fee}" ..-> C_H + C_H -- "externalCall(metadata, message)" --> E_B_O + + end + + E_B_O -. "crosschainCall(metadata,message)" ..-> E_B_D + M_O -. "relay" ..-> M_D + + subgraph Destination Chain + Recipient + M_D[(Mailbox)] + E_B_D[(ExternalBridgeDestination)] + ISM{AbstractMessageIdAuthorizedIsm} + + M_D -- "handle(origin,sender,message)" --> Recipient + M_D -- "verify(metadata, message)" --> ISM + ISM -. "interchainSecurityModule()" .- Recipient + + E_B_D -- "verifiedMessageId(message)" --> ISM + end + + style E_B_O fill: #FF0099 + style E_B_D fill: #FF0099 +``` + +### 接口 + +实现上述接口后,您可以通过使用我们的 mailbox 中的重载 `dispatch` 调用来覆盖默认 hook 和 hook 元数据: + + + + +```solidity +/** + * @notice Dispatches a message to the destination domain & recipient. + * @param _destinationDomain Domain of destination chain + * @param _recipientAddress Address of recipient on destination chain as bytes32 + * @param _messageBody Raw bytes content of message body + * @param _metadata Metadata used by the post dispatch hook + * @param _hook Custom hook to use instead of the default + * @return The message ID inserted into the Mailbox's merkle tree + */ + +``` + + + + +### 示例 + + + + + `\ +// 从 ${originChain} 发送消息到 ${destinationChain} TestRecipient +IMailbox mailbox = IMailbox("${mailbox}"); +IPostDispatchHook merkleTree = IPostDispatchHook("${merkleTreeHook}"); +mailbox.dispatch( + ${destinationDomain}, + "${paddedRecipient}", + bytes("${body}"), + "0x", // empty metadata + merkleTree +);`} +/> + + + + +- 在源链上, + + - `mailbox.dispatch()` 通过 `AbstractMessageIdAuthHook.postDispatch()` 调用您的自定义 hook。 + - `_postDispatch` 检查 `latestDispatchedId` 是否是从 hook 分发的 ID,以确保 mailbox 是调用 hook 的合约(因为调用 `postDispatch` 不受访问控制)。 + - `_sendMessageId` 调用您的自定义外部桥接逻辑,比如调用 CCIP 路由器合约。 + +- 在目标链上, + - 外部桥接器将调用 `verifyMessageId` 函数(该函数受访问控制)并将 `messageId` 在 `verifiedMessages` 映射中设置为 true。 + - 在接收到中继器的消息时,mailbox 将调用您的 ISM 合约(在您的接收者地址中指定),该合约检查 `verifiedMessages` 映射中的 messageId 是否为 true,并相应地向 mailbox 返回 true 或 false。 + +:::warning +`AbstractMessageIdAuthorizedIsm` 可以通过 `postDispatch` 调用发送 `msg.value`,我们使用 `verifiedMessages` 的小端序 255 位来存储 `msg.value`,最高位用于实际的 messageId 传递接收。因此,您可以从源链发送最多 2^255 数量的原生代币,目标链上的 ISM 只能接收 2^255 数量的原生代币。 +::: + +### 访问控制 + +如果 `postDispatch` 只能使用刚刚分发的 `message` 调用,可以使用 Mailbox 上的 `latestDispatchedId` 函数来验证消息是否实际被分发。 + +:::info +这是用来代替 `require(mailbox == msg.sender)` 的方式,以支持**组合**,其中一个 hook 可能会将 `message` 传递给另一个 hook。 +::: + + + + +为了方便起见,[`MailboxClient` 库](../reference/libraries/mailboxclient.mdx)提供了以下实用工具。 + +```solidity +* @notice Sets the address of the application's custom interchain security module. +* @param _module The address of the interchain security module contract. +*/ +``` + + + diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-hyperlane-local-agents.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-hyperlane-local-agents.mdx new file mode 100644 index 00000000..cffdf1a2 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-hyperlane-local-agents.mdx @@ -0,0 +1,413 @@ +import TerminologyPartial from "@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_terminology.mdx"; +import SetupKeysPartial from "@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_setup-keys.mdx"; +import DeployContractsPartial from "@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_deploy-contracts.mdx"; +import SendTestMessagesPartial from "@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_send-test-messages.mdx"; + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# 使用本地代理部署 Hyperlane + +:::tip + +本指南面向可能最终打算在类生产环境中运行 Hyperlane 代理的高级用户。它将介绍如何手动配置和运行代理的基础知识,但**这不是生产环境设置指南**。 + +::: + + + +## 概述 + +本指南包含六个步骤: + +1. [设置密钥](#1-设置密钥) - 用于部署合约以及运行验证器和中继器。 +2. [部署合约](#2-部署合约) - 将合约部署到本地链和所有将要与本地链进行消息收发的远程链。 +3. [运行验证器](#3-运行验证器) - 为您部署的跨链安全模块提供所需的签名。 +4. [运行中继器](#4-运行中继器) - 在您部署了合约的链之间发送和接收消息。 +5. [发送测试消息](#5-发送测试消息) - 确认您的中继器能够在每对链之间传递消息。 +6. [部署 Warp 路由](#6-可选-部署-warp-路由) - 跨链传输代币价值,而不仅仅是消息。 + +## 入门 + +## 1. 设置密钥 + + + +## 2. 部署合约 + + + +## 3. 运行验证器 + +验证器为从您的链发送到远程链的消息提供安全性。它们仅在使用 [多重签名 ISM](docs/protocol/ISM/multisig-ISM.mdx) 时才需要。了解更多关于验证器的作用 [这里](../protocol/agents/validators.mdx)。 + +### 设置目录 + +首先,将 `CONFIG_FILES` 环境变量设置为在 [部署合约](#2-部署合约) 步骤中生成的代理配置文件的路径。例如: + +```bash +export CONFIG_FILES=/full/path/to/configs/agent-config-{timestamp}.json +``` + +接下来,创建一个本地目录用于您的验证器写入签名。记住该路径,因为您将在配置验证器时需要它。 + +:::danger +验证器签名路径将作为 [验证器公告交易](docs/guides/implementation-guide.mdx#validator-announce) 的一部分写入链上。**请小心不要泄露任何安全敏感或个人信息!** +::: + +```sh +# 选择一个与您要验证的链相关的有意义的名称 +export VALIDATOR_SIGNATURES_DIR=/tmp/hyperlane-validator-signatures- + +# 创建目录 +mkdir -p $VALIDATOR_SIGNATURES_DIR +``` + +:::warning + +在 Mac 上运行 Docker 时,您无法在 `/tmp` 中挂载任何内容。为此,请创建一个本地 `tmp` 目录来代替挂载。 + +```sh +# 创建一个可以被 Docker 访问的本地 tmp 目录 +mkdir tmp + +# 选择一个与您要验证的链相关的有意义的名称 +export VALIDATOR_SIGNATURES_DIR=tmp/hyperlane-validator-signatures- + +# 创建目录 +mkdir -p $VALIDATOR_SIGNATURES_DIR +``` + +::: + +### 配置 + +有许多参数可以配置验证器。对于本指南,我们只关心其中的几项: + +| 参数 | 描述 | +| ------------------------- | ------------------------------------------------------------------------------------------------------------- | +| `--db` | 将持久数据写入磁盘的路径。 | +| `--originChainName` | 被验证链的名称(例如 `ethereum`)。 | +| `--checkpointSyncer.type` | 设置为 `localStorage`。 | +| `--checkpointSyncer.path` | 验证器签名将被写入的本地目录的路径。与 `$VALIDATOR_SIGNATURES_DIR` 相同。 | +| `--validator.key` | 您的验证器的十六进制私钥。 | + +:::info + +确保验证器密钥与您在设置多重签名 ISM 配置时提供的地址相对应。否则,您在前一步中部署的多重签名 ISM 将无法验证从您的链发送的消息。 + +::: + +要了解更多关于可以更改的所有参数,请阅读 [代理配置参考](docs/operate/config-reference.mdx)。 + + + + +**更新代理配置** + +除非您在 Linux 上运行 Docker,否则您还需要更新代理配置以适应您的网络。这是因为 Docker 不支持在 Mac、Windows 或 Windows Server 上使用 [`host` 网络模式](https://docs.docker.com/network/drivers/host/)。 + +为此,请导航到 `$CONFIG_FILES` 处的代理配置,并将所有实例中的 "localhost" 或 "127.0.0.1" 替换为 `host.docker.internal`。例如: + +```json +... +"localnet1": { + ... + "rpcUrls": [ + { + // "http": "http://localhost:8545" + // "http": "http://127.0.0.1:8545" + "http": "http://host.docker.internal:8545" + } + ], + ... +}, +... +``` + +**挂载目录** + +使用 Docker 运行时会增加一层复杂性,因为配置文件需要从容器内访问,而验证器签名需要从容器外访问,以便中继器可以构造消息验证所需的元数据。 + +为此,您可以将文件系统上的目录挂载到容器中。在下面的参数中,我们: + +1. 将 `$CONFIG_FILES` 环境变量设置为容器内的固定路径。 +2. 将代理配置文件挂载到此固定路径并将其设置为只读。 +3. 将持久数据目录挂载到容器内的固定路径。 +4. 将验证器签名目录挂载到容器内的固定路径并将其设置为只读。 + +```sh +... +-e CONFIG_FILES=/config/agent-config.json \ +--mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ +--mount type=bind,source="$(pwd)"/hyperlane_db_validator_,target=/hyperlane_db \ +--mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures,readonly \ +... +``` + +硬编码这些路径可以在运行不同链的验证器的 Docker 实例之间消除配置。这样可以更容易地在运行容器时传递正确的参数。请参见下面的示例,其中唯一需要为不同链配置的项目是链名和验证器密钥。 + +```sh +... +./validator \ +--db /hyperlane_db \ +--originChainName \ +--checkpointSyncer.type localStorage \ +--checkpointSyncer.path /tmp/validator-signatures \ +--validator.key +... +``` + + + + +**克隆和设置** + +首先,克隆 Hyperlane monorepo: + +```sh +git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git +``` + +然后按照 `rust` 目录中的 [设置说明](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md) 进行设置。这应该会设置 `rustup` 以及 Apple Silicon 上的 Rosetta 2。 + +```sh +# 安装 rustup +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + +# (仅限 Apple Silicon) 安装 Rosetta 2 +softwareupdate --install-rosetta --agree-to-license +``` + + + + +### 运行 + + + +现在您已经了解了更多关于配置验证器参数的信息,请拉取最新的 Docker 镜像: + +```sh +docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 +``` + +在运行之前,请确保您需要挂载的所有目录都存在。这可能涉及创建 `hyperlane_db_validator_` 如果它尚不存在。 + +```sh +mkdir -p hyperlane_db_validator_ +``` + +最后,运行验证器: + +```sh +docker run \ + -it \ + -e CONFIG_FILES=/config/agent-config.json \ + --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ + --mount type=bind,source="$(pwd)"/hyperlane_db_validator_,target=/hyperlane_db \ + --mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures,readonly \ + gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 \ + ./validator \ + --db /hyperlane_db \ + --originChainName \ + --checkpointSyncer.type localStorage \ + --checkpointSyncer.path /tmp/validator-signatures \ + --validator.key +``` + + + + +在按照设置说明之后,您现在应该能够使用 `cargo` 运行验证器: + +```sh +cargo run --release --bin validator -- \ + --db ./hyperlane_db_validator_ \ + --originChainName \ + --checkpointSyncer.type localStorage \ + --checkpointSyncer.path $VALIDATOR_SIGNATURES_DIR \ + --validator.key +``` + +:::note (可选) 直接运行二进制文件 + +您可以选择构建代理: + +```sh +cargo build --release --bin validator +``` + +并直接运行二进制文件: + +```sh +./target/release/validator \ + --db ./hyperlane_db_validator_ \ + --originChainName \ + --checkpointSyncer.type localStorage \ + --checkpointSyncer.path $VALIDATOR_SIGNATURES_DIR \ + --validator.key +``` + +::: + + + + +有关更多信息,请参阅 [验证器指南](docs/operate/validators/run-validators.mdx)。 + +## 4. 运行中继器 + +中继器在您部署了合约的链之间发送和接收消息。了解更多关于中继器的作用 [这里](docs/protocol/agents/relayer.mdx)。 + +您应该已经将 `CONFIG_FILES` 环境变量设置为在 [代理配置](#代理配置) 步骤中生成的代理配置文件的路径。如果没有,请现在进行设置。 + +```bash +export CONFIG_FILES=/full/path/to/configs/agent-config.json +``` + +### 配置 + +有许多参数可以配置中继器。对于本指南,我们只关心其中的几项: + +| 参数 | 描述 | +| ------------------------------- | ---------------------------------------------------------------------------------------- | +| `--db` | 将持久数据写入磁盘的路径。 | +| `--relayChains` | 逗号分隔的链名列表,用于在这些链之间中继消息。例如 `ethereum,polygon,avalanche`。 | +| `--allowLocalCheckpointSyncers` | 允许中继器在本地文件系统上查找验证器签名。 | +| `--defaultSigner.key` | 用于签名所有链的交易的十六进制私钥。 | +| `--metrics-port` | 可选。暴露 Prometheus 指标的端口,默认为 `9090`。 | + +:::tip +您的中继链集应该包括源链和目标链。 +::: + +要了解更多关于可以更改的所有参数,请阅读 [代理配置参考](docs/operate/config-reference.mdx)。 + + + + +**挂载目录** + +对于中继器,我们提供几乎与验证器相同的参数给 Docker: + +1. 将 `$CONFIG_FILES` 环境变量设置为容器内的固定路径。 +1. 将代理配置文件挂载到此固定路径并将其设置为只读。 +1. 将持久数据目录挂载到容器内的固定路径。 +1. 将验证器签名目录挂载到容器内的固定路径并将其设置为只读。 + +```sh +... +-e CONFIG_FILES=/config/agent-config.json \ +--mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ +--mount type=bind,source="$(pwd)"/hyperlane_db_relayer,target=/hyperlane_db \ +--mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures,readonly \ +... +``` + +硬编码这些路径可以在运行不同链集的中继器的 Docker 实例之间消除配置。这样可以更容易地在运行容器时传递正确的参数。请参见下面的示例,其中唯一需要为不同链配置的项目是中继链列表和中继器密钥。 + + + + +**克隆和设置** + +如果您尚未这样做,请克隆 Hyperlane monorepo 并按照 `rust` 目录中的 [设置说明](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md) 进行设置。 + +```sh +# 克隆 Hyperlane monorepo +git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git + +# 安装 rustup +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + +# (仅限 Apple Silicon) 安装 Rosetta 2 +softwareupdate --install-rosetta --agree-to-license +``` + + + + +### 运行 + + + + +如果您尚未拉取 Docker 镜像,请现在进行拉取: + +```sh +docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 +``` + +在运行之前,请确保您需要挂载的所有目录都存在。这可能涉及创建 `hyperlane_db_relayer` 如果它尚不存在。 + +```sh +mkdir -p hyperlane_db_relayer +``` + +最后,运行中继器: + +```sh +docker run \ + -it \ + -e CONFIG_FILES=/config/agent-config.json \ + --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ + --mount type=bind,source="$(pwd)"/hyperlane_db_relayer,target=/hyperlane_db \ + --mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures,readonly \ + gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 \ + ./relayer \ + --db /hyperlane_db \ + --relayChains , \ + --allowLocalCheckpointSyncers true \ + --defaultSigner.key \ +``` + + + + +在按照设置说明之后,您现在应该能够使用 `cargo` 运行中继器: + +```sh +cargo run --release --bin relayer -- \ + --db ./hyperlane_db_relayer \ + --relayChains , \ + --allowLocalCheckpointSyncers true \ + --defaultSigner.key \ + --metrics-port 9091 +``` + +指标端口被覆盖以避免与验证器冲突。 + +:::note (可选) 直接运行二进制文件 + +您可以选择构建代理: + +```sh +cargo build --release --bin relayer +``` + +并直接运行二进制文件: + +```sh +./target/release/relayer \ + --db ./hyperlane_db_relayer \ + --relayChains , \ + --allowLocalCheckpointSyncers true \ + --defaultSigner.key \ + --metrics-port 9091 +``` + +::: + + + + +有关更多信息,请参阅 [中继器指南](docs/operate/relayer/run-relayer.mdx)。 + +## 5. 发送测试消息 + + + +## 6. (可选) 部署 Warp 路由 + +要使用您的新 Hyperlane 部署连接代币,请参阅 [Warp 路由部署指南](/docs/guides/deploy-warp-route.mdx)。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-svm-warp-route.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-svm-warp-route.mdx new file mode 100644 index 00000000..cc9ac393 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-svm-warp-route.mdx @@ -0,0 +1,149 @@ +# 部署 SVM Warp Route + +## 结果 + +您将为您选择的资产在两个具有现有 Hyperlane 核心部署的 SVM 链之间部署 Warp Route。撰写本文档时,支持的 SVM 链是 Solana 和 Eclipse,但您可以在[这里](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/sealevel/environments/mainnet3)找到最新列表(所有具有 `core` 子目录的链目录名称)。 + +:::info +**如果您希望您的 SVM rollup 作为核心 Hyperlane 部署得到支持,或者希望设置 EVM 到 SVM 的 Warp Route,请[联系我们](https://forms.gle/KyRTaWvo4XNmNvrq6)!** +::: + +## Warp Route 类型 + +使用的代币类型决定了 Warp Route 类型,因此了解可用的不同 Warp Route 合约很重要: +- [原生](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-types#native-token-warp-routes):处理原生 gas 代币的转移(例如 Solana 上的 SOL,Eclipse 上的 ETH)。 +- [抵押](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-types#collateral-backed-erc20-warp-routes):处理现有 [Token-2022](https://spl.solana.com/token-2022) 或 [Token](https://spl.solana.com/token) 代币(SVM 上的 ERC20 等效物)的转移。 +- [合成](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-types#synthetic-erc20-warp-routes):处理合成代币,这些代币在通过 Warp Route 进行转移时被铸造和销毁,以代表其原始链上的代币。在这种情况下,本指南中的工具将部署一个新的 Token-2022 代币,其权限设置为部署者密钥。 + +以下是常见的 Warp Route 设置(您可以在[这里](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-example-usage)找到更多详细信息): +- 原生到合成:在原始链上锁定原生代币以在目标链上铸造合成代币。返回转移时,合成代币被销毁。一个示例是 Solana 和 Eclipse 之间的 SOL Warp Route。 +- 抵押到合成:在原始链上锁定抵押代币以在目标链上铸造合成代币。返回转移时,合成代币被销毁。一个示例是 Solana 和 Eclipse 之间的 USDC Warp Route。 +- 其他:如果代币已经存在于原始链和目标链上,也可以实现原生到原生(例如 Optimism 和 Arbitrum 之间的 ETH)以及抵押到抵押。在这种情况下,重新平衡流动性是一个重要的考虑因素。 + +## 在您开始之前 + +部署 Warp Route 需要有一个核心 Hyperlane 部署,该部署已连接(即积极中继和安全)到 Hyperlane 生态系统的其余部分。本指南中使用的核心 Hyperlane 部署是 Solana([核心工件](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/environments/mainnet3/solanamainnet/core/program-ids.json))和 Eclipse([核心工件](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/environments/mainnet3/eclipsemainnet/core/program-ids.json))。您可能需要在指南中参考这些核心工件。 + +## 部署 Sealevel Warp Route + +1. 安装 `solana-cli 1.14.20` 以构建 Warp Route 程序。注意,您**必须**使用这个版本,否则部署可能会失败。 + ```bash + sh -c "$(curl -sSfL https://release.solana.com/v1.14.20/install)" + ``` + +1. 在您的机器上构建 Warp Route 程序 + - 克隆 [hyperlane-monorepo](https://github.com/hyperlane-xyz/hyperlane-monorepo) + - 进入 `./hyperlane-monorepo/rust/sealevel/programs/` + ```bash + # 从 rust/sealevel/programs/ 开始 + cd hyperlane-sealevel-token + cargo build-sbf + cd ../hyperlane-sealevel-token-collateral + cargo build-sbf + cd ../hyperlane-sealevel-token-native + cargo build-sbf + ``` + +1. 要部署合约,请安装 `solana-cli 1.18.18`。注意,您**必须**使用这个版本,否则部署可能会失败。 + ```bash + sh -c "$(curl -sSfL https://release.solana.com/v1.18.18/install)" + ``` + +1. 在 monorepo 的 `rust/sealevel/environments/mainnet3/warp-routes` 中,创建一个新目录,目录名为您想要的 Warp Route 部署名称。例如,Solana 和 Eclipse 之间现有的 SOL Warp Route 位于 `rust/sealevel/environments/mainnet3/warp-routes/eclipsesol`。 + +1. 如果您的 warp route 创建了合成代币,您可以向 `hyperlane-registry` 提交 PR,其中包含与此代币关联的元数据(示例 PR 在[这里](https://github.com/hyperlane-xyz/hyperlane-registry/pull/142))。`hyperlane-registry` 还可以让您的 Warp Route 在 Hyperlane 生态系统中可见。 + +1. 在名为 `token-config.json` 的 JSON 文件中配置 Warp Route 的参数,该文件基于 [TokenConfig](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/a5afd20f3ae69ccb3289d845d44b99dbdcde2c62/rust/sealevel/client/src/warp_route.rs#L114) Rust 结构的 `serde_json` 序列化。`interchainGasPaymaster` 的值可以在[核心部署工件](#在您开始之前)中找到。 + - 下面的示例显示了一个测试网原生到合成的 Warp Route,它从 Solana 转移 SOL 并在 Eclipse 上铸造合成 SOL。您也可以查看[这个配置](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/a5afd20f3ae69ccb3289d845d44b99dbdcde2c62/rust/sealevel/environments/mainnet3/warp-routes/eclipsesol/token-config.json),这是一个生产环境的 SOL Warp Route。 + ```json + { + "solanatestnet": { + "type": "native", + "decimals": 9, + "interchainGasPaymaster": "<从核心程序地址中选择 overhead igp>" + }, + "eclipsetestnet": { + "type": "synthetic", + "decimals": 9, + "name": "Solana (testnet)", + "symbol": "SOL", + "uri": "<您合并到 hyperlane-registry 中的 metadata.json 文件的永久链接>" + "interchainGasPaymaster": "<从核心程序地址中选择 overhead igp>" + } + } + ``` + +1. 创建 Solana 私钥文件。此密钥用于支付部署费用,并将成为已部署程序的所有者。如果您愿意,也可以使用现有的已有资金的密钥。 + ```bash + solana-keygen new --outfile ./warp-route-deployer-key.json + ``` + +1. 在要部署 Warp Route 的两个网络上为新密钥提供资金。公钥应该在所有 SVM 网络上都相同,但请通过将私钥加载到每个链推荐的钱包中进行双重检查。 + - 资金应足以支付与 Warp Route 相关的所有账户的租金、交易费用,并为 [ATA](https://www.alchemy.com/overviews/associated-token-account) 支付者账户提供资金(下面会详细介绍)。作为参考,一个 Hyperlane Warp Route 账户在 Solana 上观察到的租金是 `2.35 SOL`,在 Eclipse 上是 `0.025 ETH`,所以建议为密钥提供至少 `5 SOL` / `0.05 ETH` 的资金。 + - 要读取您刚创建的公钥: + ```bash + solana-keygen pubkey ./warp-route-deployer-key.json + ``` + +1. 部署 warp route + :::info + 请注意,由于我们的目标是尽快让这些工具可供开发人员使用,它的可靠性还不如我们希望的那样高。如果遇到问题,请通过 [GitHub issue](https://github.com/hyperlane-xyz/hyperlane-monorepo/issues) 或通过 [Discord](https://discord.gg/2BYk6kV7) 上的 `developers` 频道与我们联系。 + ::: + - CLI 标志概述: + - `--warp-route-name` - 应与之前为 Warp Route 选择的目录名称相匹配 + - `--environment` - 保持为 `mainnet3` + - `--environments-dir ../environments` - 保持为 `../environments` + - `--built-so-dir` - 保持为 `../../target/deploy`,因为它指向 Warp Route 程序的编译输出目录 + - `--token-config-file` - 指向之前创建的 `token-config.json` 文件 + - `--chain-config-file` - 保持为 `../environments/mainnet3/chain-config.json`,因为该文件已预先填充了所有 Hyperlane 支持链的链设置 + - `--ata-payer-funding-amount` - 此标志指定要在部署发生的两个链上为 Warp Route [ATA](https://www.alchemy.com/overviews/associated-token-account) 支付账户提供多少资金。它以最低货币面额表示,这意味着在 Solana 上解释为 Lamports,在 Eclipse 上解释为 Gwei(因为它使用 ETH 作为其原生货币)。在下面的命令中,值 `10000000` 相当于 `0.001` ETH 和 `0.001` SOL,这足以进行初始部署。ATA 支付账户以后总是可以充值的,所以选择一个小的值是可以的。作为参考,每个 Warp Route 转账在目标链上会花费 ATA 支付账户 `0.000000001 SOL`(在 Solana 上)和 `0.000021 ETH`(在 Eclipse 上)。 + - 由于网络拥塞和程序大小,脚本不太可能在第一次尝试时就能工作,但脚本应该是幂等的,并跳过已经部署/初始化的合约。像 `Error: 11 write transactions failed` 或 `Error: Custom: Invalid blockhash` 这样的错误总是可以通过重新运行命令来重试。如果可重试的错误持续存在,考虑在[这里](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/44e0ff0733baf0da4d2b0304915f5f6cce92ffc7/rust/sealevel/client/src/cmd_utils.rs#L76)增加计算单位价格。 + - 对于其他类型的错误,你可能需要关闭部署者密钥的缓冲区和程序,并从头开始重新部署所有内容。要显示缓冲区和程序并一个一个地关闭它们,请按照下面的命令操作。关闭程序也有助于恢复它们的租金存款。 + + ```bash + solana program show --programs --keypair ./warp-route-deployer-key.json --url + + solana program show --buffers --keypair ./warp-route-deployer-key.json --url + + # 关闭程序账户时(与关闭缓冲区不同),你需要添加 `--bypass-warning` 标志 + solana program close --url + ``` + - 要提高部署更快成功的几率,你可以在传递给脚本的 `--chain-config-file` 中设置私有 RPC url。(例如在 `solanamainnet.rpcUrls.http` 中) + - 如果部署合成代币,下面的命令将创建一个新的代币铸造账户,并使用元数据代币扩展来设置代币名称、符号和元数据 json,使用 `--token-config-file` 文件中的字段 + + - 运行 `warp-route deploy` + ```bash + # 从 `rust/sealevel/client` 运行 + cargo run -- -k ./warp-route-deployer-key.json warp-route deploy --warp-route-name eclipsesol --environment mainnet3 --environments-dir ../environments --built-so-dir ../../target/deploy --token-config-file ../environments/mainnet3/warp-routes/eclipsesol/token-config.json --chain-config-file ../environments/mainnet3/chain-config.json --ata-payer-funding-amount 10000000 + ``` + +## 与 Warp Route 交互 +1. 让我们查询一个 Warp Route 程序,从你上面创建的目录中自动生成的 `program-ids.json` 获取程序 ID(`token-config.json` 也在该目录中)。此命令打印铸造账户、铸造权限和 ATA 支付者账户。 + + ```bash + # 从 `rust/sealevel/client` 运行 + cargo run -- -k ./warp-route-deployer-key.json -u token query --program-id synthetic + ``` + + - 如果部署合成代币,查询铸造权限账户以检查元数据 + ```bash + solana account --url + ``` +1. 尝试转移代币! + - 你需要要发送到的链的域 ID,可以在 [hyperlane-registry](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains) 中该链的 `metadata.yaml` 条目中找到。 + ```bash + # 从 `rust/sealevel/client` 运行 + cargo run -- -u -k ./warp-route-deployer-key.json token transfer-remote ./warp-route-deployer-key.json <最低面额的数量> <目标链域 ID> <接收者地址> <源链上的 WARP 代币类型:native|synthetic|collateral> --program-id + ``` +1. 通过查询铸造账户地址来查看接收者在目标链上的余额 + ```bash + spl-token balance --owner ./warp-route-deployer-key.json -u + ``` + + - 这里的最后一个参数是 SPL 代币 ID。因此,如果你想要检查合成 warp route 的余额,你需要使用几步前查询时获得的铸造地址。 + - 你也可以在区块浏览器中查看接收者账户的最后一笔交易 +1. 本指南大量使用了来自 `hyperlane-monorepo` 的 `hyperlane-sealevel-client` CLI。你可能会发现它的各种命令对于配置 Warp Route、进行状态查询、发送转账等都很有用。查看它提供的其他实用工具,特别是 `token` 子命令下的工具。 + ```bash + # 从 `rust/sealevel/client` 运行 + cargo run -- --help + ``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route-UI.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route-UI.mdx new file mode 100644 index 00000000..afb53885 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route-UI.mdx @@ -0,0 +1,139 @@ +import TypescriptSdkPlaceholder from "/docs/partials/ts-sdk-placeholder.mdx"; + +# 部署 Hyperlane Warp Routes 的桥接 UI + +在您成功[部署 Warp Route](/docs/guides/deploy-warp-route.mdx) 之后,您有两个开箱即用的选项来设置前端 UI 以支持跨链代币转账: + +1. **[分叉、自定义和部署 Hyperlane Warp UI 模板](#fork--customize-the-ui)** +2. **[使用托管的 Superbridge 实例](#superbridge)** + +## 1. Hyperlane Warp UI 模板 + +[Hyperlane Warp UI 模板](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template)是一个预构建的 Next.JS 应用程序,您可以轻松自定义和部署。 + +- **配置**:按照[配置说明](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/blob/main/README.md)了解如何配置 Warp UI Web 应用程序并在本地运行。 +- **自定义**:按照[自定义说明](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/blob/main/CUSTOMIZE.md)了解如何配置 UI 的代币和更改默认品牌资产/主题。 + +### 注册表 + +默认情况下,应用程序将使用发布在 NPM 上的规范 Hyperlane 注册表。要使用不同的注册表,您可以使用 `NEXT_PUBLIC_REGISTRY_URL` 环境变量设置 URL。 + +### Warp Route 配置示例 + +这是一个连接 Sepolia 上的 USDC 到 Alfajores 的 Warp Route 配置示例。您可以使用 Typescript 或 YAML 作为路由配置。 + +```typescript +{ + tokens: [ + { + // 代币的链名称 + chainName: "sepolia", + // 参见 https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/token/TokenStandard.ts + standard: TokenStandard.EvmHypCollateral, + // 代币元数据(小数位数、符号、名称) + decimals: 6, + symbol: "USDC", + name: "USD Coin", + // 路由器地址 + addressOrDenom: "YOUR_ROUTER_ADDRESS_1", + // 底层抵押代币的地址 + collateralAddress: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238", + // 代币 logo 图片的路径 + logoURI: "/logos/usdc.png", + // 此代币连接到的代币列表 + connections: [{ token: "ethereum|alfajores|YOUR_ROUTER_ADDRESS_2" }], + }, + { + chainName: "alfajores", + standard: TokenStandard.EvmHypSynthetic, + decimals: 6, + symbol: "USDC", + name: "USD Coin", + addressOrDenom: "YOUR_ROUTER_ADDRESS_2", + logoURI: "/logos/usdc.png", + connections: [{ token: "ethereum|alfajores|YOUR_YOUR_ROUTER_ADDRESS_2" }], + }, + ]; +} +``` + +#### 链配置示例 + +链元数据也可以根据需要配置。这些配置与 CLI 用于其任何部署或发送命令的配置相同(例如,来自[部署指南](/docs/deploy-hyperlane.mdx)的配置)。 + +```typescript +{ +anvil1: { + chainId: 31337, + name: 'anvil1', + displayName: 'Anvil 1 Local', + nativeToken: { name: 'Ether', symbol: 'ETH', decimals: 18 }, + publicRpcUrls: [{ http: 'http://127.0.0.1:8545' }], + blocks: { + confirmations: 1, + reorgPeriod: 0, + estimateBlockTime: 10, + }, + logoURI: '/logo.svg' + } +} +``` + +### 部署 UI + +由于 UI 是一个 Next.js 应用程序,您可以使用您喜欢的托管服务来托管它。我们推荐 [Vercel](https://vercel.com),它与 Next 配合得很好。[AWS Amplify](https://aws.amazon.com/amplify) 是另一个流行的选择。 + +1. 注册 [Vercel](https://vercel.com/) +2. 创建一个新项目并将其连接到您的 GitHub 仓库 +3. 点击部署! + +就是这样!现在您和您的用户可以使用 UI 从抵押链向远程链发送代币,从一个远程链到另一个远程链,以及从任何远程链返回到抵押链。 + +:::tip +如果这些链没有生产中继器在运行,您可以在后台运行一个轻量级的 CLI 中继器,该中继器仅为您的 warp route 提供服务: +```bash +hyperlane relayer --symbol TOKEN +``` +这将允许您在本地测试 warp UI 或进行快速演示,而无需在云中运行完整的生产中继器。 +::: + +### 返回 gas + +像 Warp Routes 这样的代币桥的一个常见问题是,用户可能将 USDC 等代币转移到新链上,但之后才意识到他们没有原生 gas 代币来移动这些代币,包括返回。 + +为了改善用户体验,除了 UI 警告外,您还可以通过水龙头提供一些原生 gas 代币。要创建水龙头,请修改 Warp Route 合约以持有原生代币余额,与接收者共享。 + +:::tip + + + +::: + +## 2. Superbridge + +[Superbridge](https://superbridge.app) 是一个自定义桥接提供商,他们为数百个 rollups、各种代币和不同生态系统管理桥接前端。 + +为您的 warp route 获取一个托管的 Superbridge 是操作您的桥接的无忧方法。他们一些最受欢迎的 Hyperlane 支持的桥接包括 [Renzo 的 ezETH 桥接](https://renzo.superbridge.app) 和 [Elixir 的 deUSD 桥接](https://elixir.superbridge.app)。通过托管桥接实例,Superbridge 将为您的 warp route 处理托管、主题设置、升级和用户支持请求。 + +他们还构建了一个方便的功能,允许对最近部署的 warp routes 进行自助测试。 + +### 测试您的 warp route + +1. 导航到 [Superbridge Hyperlane Playground](https://hyperlane.superbridge.app) +2. 点击设置齿轮,然后点击自定义 ![](/img/deploy-warp-ui/superbridge-settings.png) +3. 粘贴您在部署 warp routes 时生成的 YAML 文件 ![](/img/deploy-warp-ui/superbridge-paste-yaml.png) +4. 指定的代币和网络现在将可用于桥接。 + +:::tip + +如果粘贴 YAML 文件后缺少任何代币或网络,可能是 Superbridge 尚未在此网络上支持 Hyperlane。[联系](mailto:support@superbridge.app) Superbridge 了解添加支持的时间表。 + +::: + +### 桥接小部件 + +除了托管 UI 外,Superbridge 还提供桥接小部件,因此您可以将桥接嵌入到您自己的网站中。查看他们的[小部件演示](https://widget-demos.superbridge.app/)网站,了解所有可用的配置选项。 + +### 投入生产 + +要使用 Superbridge 将您的 warp route 投入生产,请[联系 Superbridge 团队](mailto:alex@superbridge.app)。他们通常可以在大约一天内让前端运行起来。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route-UI.mdx.new b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route-UI.mdx.new new file mode 100644 index 00000000..31b52dd2 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route-UI.mdx.new @@ -0,0 +1,139 @@ +import TypescriptSdkPlaceholder from "/docs/partials/ts-sdk-placeholder.mdx"; + +# 为 Hyperlane Warp Routes 部署桥接 UI + +在您成功[部署 Warp Route](/docs/guides/deploy-warp-route.mdx) 之后,您有两个开箱即用的选项来设置前端 UI 以支持跨链代币转账: + +1. **[分叉、自定义和部署 Hyperlane Warp UI 模板](#fork--customize-the-ui)** +2. **[使用托管的 Superbridge 实例](#superbridge)** + +## 1. Hyperlane Warp UI 模板 + +[Hyperlane Warp UI 模板](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template)是一个预构建的 Next.JS 应用程序,您可以轻松自定义和部署。 + +- **配置**:按照[配置说明](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/blob/main/README.md)了解如何配置 Warp UI Web 应用程序并在本地运行。 +- **自定义**:按照[自定义说明](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/blob/main/CUSTOMIZE.md)了解如何配置 UI 的代币和更改默认品牌资产/主题。 + +### 注册表 + +默认情况下,应用程序将使用发布在 NPM 上的规范 Hyperlane 注册表。要使用不同的注册表,您可以使用 `NEXT_PUBLIC_REGISTRY_URL` 环境变量设置 URL。 + +### Warp Route 配置示例 + +这是一个连接 Sepolia 上的 USDC 到 Alfajores 的 Warp Route 配置示例。您可以使用 Typescript 或 YAML 作为路由配置。 + +```typescript +{ + tokens: [ + { + // 代币的链名称 + chainName: "sepolia", + // 参见 https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/token/TokenStandard.ts + standard: TokenStandard.EvmHypCollateral, + // 代币元数据(小数位数、符号、名称) + decimals: 6, + symbol: "USDC", + name: "USD Coin", + // 路由器地址 + addressOrDenom: "YOUR_ROUTER_ADDRESS_1", + // 底层抵押代币的地址 + collateralAddress: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238", + // 代币 logo 图片的路径 + logoURI: "/logos/usdc.png", + // 此代币连接到的代币列表 + connections: [{ token: "ethereum|alfajores|YOUR_ROUTER_ADDRESS_2" }], + }, + { + chainName: "alfajores", + standard: TokenStandard.EvmHypSynthetic, + decimals: 6, + symbol: "USDC", + name: "USD Coin", + addressOrDenom: "YOUR_ROUTER_ADDRESS_2", + logoURI: "/logos/usdc.png", + connections: [{ token: "ethereum|alfajores|YOUR_YOUR_ROUTER_ADDRESS_2" }], + }, + ]; +} +``` + +#### 链配置示例 + +链元数据也可以根据需要配置。这些配置与 CLI 用于其任何部署或发送命令的配置相同(例如,来自[部署指南](/docs/deploy-hyperlane.mdx)的配置)。 + +```typescript +{ +anvil1: { + chainId: 31337, + name: 'anvil1', + displayName: 'Anvil 1 Local', + nativeToken: { name: 'Ether', symbol: 'ETH', decimals: 18 }, + publicRpcUrls: [{ http: 'http://127.0.0.1:8545' }], + blocks: { + confirmations: 1, + reorgPeriod: 0, + estimateBlockTime: 10, + }, + logoURI: '/logo.svg' + } +} +``` + +### 部署 UI + +由于 UI 是一个 Next.js 应用程序,您可以使用您喜欢的托管服务来托管它。我们推荐 [Vercel](https://vercel.com),它与 Next 配合得很好。[AWS Amplify](https://aws.amazon.com/amplify) 是另一个流行的选择。 + +1. 注册 [Vercel](https://vercel.com/) +2. 创建一个新项目并将其连接到您的 GitHub 仓库 +3. 点击部署! + +就是这样!现在您和您的用户可以使用 UI 从抵押链向远程链发送代币,从一个远程链到另一个远程链,以及从任何远程链返回到抵押链。 + +:::tip +如果这些链没有生产中继器在运行,您可以在后台运行一个轻量级的 CLI 中继器,该中继器仅为您的 warp route 提供服务: +```bash +hyperlane relayer --symbol TOKEN +``` +这将允许您在本地测试 warp UI 或进行快速演示,而无需在云中运行完整的生产中继器。 +::: + +### 返回 gas + +像 Warp Routes 这样的代币桥的一个常见问题是,用户可能将 USDC 等代币转移到新链上,但之后才意识到他们没有原生 gas 代币来移动这些代币,包括返回。 + +为了改善用户体验,除了 UI 警告外,您还可以通过水龙头提供一些原生 gas 代币。要创建水龙头,请修改 Warp Route 合约以持有原生代币余额,与接收者共享。 + +:::tip + + + +::: + +## 2. Superbridge + +[Superbridge](https://superbridge.app) 是一个自定义桥接提供商,他们为数百个 rollups、各种代币和不同生态系统管理桥接前端。 + +为您的 warp route 获取一个托管的 Superbridge 是操作您的桥接的无忧方法。他们一些最受欢迎的 Hyperlane 支持的桥接包括 [Renzo 的 ezETH 桥接](https://renzo.superbridge.app) 和 [Elixir 的 deUSD 桥接](https://elixir.superbridge.app)。通过托管桥接实例,Superbridge 将为您的 warp route 处理托管、主题设置、升级和用户支持请求。 + +他们还构建了一个方便的功能,允许对最近部署的 warp routes 进行自助测试。 + +### 测试您的 warp route + +1. 导航到 [Superbridge Hyperlane Playground](https://hyperlane.superbridge.app) +2. 点击设置齿轮,然后点击自定义 ![](/img/deploy-warp-ui/superbridge-settings.png) +3. 粘贴您在部署 warp routes 时生成的 YAML 文件 ![](/img/deploy-warp-ui/superbridge-paste-yaml.png) +4. 指定的代币和网络现在将可用于桥接。 + +:::tip + +如果粘贴 YAML 文件后缺少任何代币或网络,可能是 Superbridge 尚未在此网络上支持 Hyperlane。[联系](mailto:support@superbridge.app) Superbridge 了解添加支持的时间表。 + +::: + +### 桥接小部件 + +除了托管 UI 外,Superbridge 还提供桥接小部件,因此您可以将桥接嵌入到您自己的网站中。查看他们的[小部件演示](https://widget-demos.superbridge.app/)网站,了解所有可用的配置选项。 + +### 投入生产 + +要使用 Superbridge 将您的 warp route 投入生产,请[联系 Superbridge 团队](mailto:alex@superbridge.app)。他们通常可以在大约一天内让前端运行起来。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route.mdx new file mode 100644 index 00000000..8de212ea --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route.mdx @@ -0,0 +1,130 @@ +import CliChainsPartial from "../partials/deploy-hyperlane/_cli-chains.mdx"; + +# 如何使用 Hyperlane Warp Routes 创建代币桥 + +本节将提供一个分步指南,介绍如何通过部署 Hyperlane Warp Route 合约来创建跨链代币桥。 + +## 前提条件 + +- [Hyperlane CLI](/docs/reference/cli.mdx) +- 用于签署合约交易的私钥 + +## 1. 配置 + +### Warp Route 部署配置 + +要部署路由,你需要一个 Warp Route 部署配置文件。有效的配置需要指定: + +- 这个 Warp Route 是为哪个链上的哪个代币创建的? +- _可选:_ Hyperlane 连接详情,包括 [mailbox](/docs/reference/messaging/messaging-interface.mdx)、[跨链 gas](/docs/reference/hooks/interchain-gas.mdx) 和 [跨链安全模块](/docs/reference/ISM/specify-your-ISM.mdx) 的合约地址。 +- _可选:_ 代币标准 - 包括使用 ERC20 的同质化代币或使用 ERC721 的非同质化代币,以及使用 ERC4626 的收益代币。注意 ERC721 支持目前还处于实验阶段,某些 Hyperlane 工具可能暂不支持 NFT。 + +创建配置最简单的方法是使用 CLI 的配置命令: + +```bash +hyperlane warp init +``` + +此命令提供了一个交互式向导,直接在终端中提示你进行配置选择。你需要为配置的每个部分选择具体选项,如网络类型、要连接的链、代币类型以及是否使用可信 ISM。 + +:::tip + +- 如果你的配置看起来正确,现在可以跳转到 [步骤 2:部署](#2-部署)。 + 或者继续阅读下面的内容,了解如何手动定义配置。 +- 如果你在设置代币桥时需要任何帮助,请在 Discord 的 #developers 频道寻求帮助或[联系我们](https://forms.gle/KyRTaWvo4XNmNvrq6)。 + ::: + +#### 部署配置模式 + +你的配置由链名称到部署配置的映射组成。每个配置都设置了你要创建 Warp Route 的代币的详细信息。 + +- **type**: + - 设置为 `collateral` 可为 ERC20/ERC721 代币创建基本的 Warp Route + - 设置为 `collateralVault` 可为将存入现有 ERC4626 金库的 ERC20 代币创建收益型 Warp Route + - 设置为 `native` 可为原生代币(如以太币)创建 Warp Route +- **address:** + - 如果使用 `collateral`,则为要创建路由的 ERC20/ERC721 合约地址 + - 如果使用 `collateralVault`,则为要存入抵押品的现有 ERC4626 金库地址 +- **isNft:** 如果为 ERC721 合约使用 `collateral`,设置为 `true`。 + +#### 可选字段 + +你可以在配置条目中指定以下可选值。如果未提供值,部署器将尝试从其他地方获取这些值。对于元数据(符号、名称、小数位),它将查询合约。对于地址(mailbox、ISM),它将检查注册表,可以是你的注册表(如果提供)或[默认注册表](/docs/reference/registries#default-registry)。 + +- **symbol:** 代币符号 +- **name:** 代币名称 +- **decimals:** 代币的小数位数 +- **mailbox:** 用于发送和接收消息的 [mailbox](/docs/reference/messaging/messaging-interface.mdx) 合约地址 +- **interchainSecurityModule:** 用于验证跨链消息的[跨链安全模块](/docs/reference/ISM/specify-your-ISM.mdx)地址 + +#### 示例 + +有关使用本地 anvil 链的最小 Warp 部署配置示例,请参见 [`warp-route-deployment.yaml`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/warp-route-deployment.yaml)。 + +### 链配置 + + + +:::warning + +在可能的情况下,请确保在 warp route 配置中**重用注册表/CLI 中的任何现有链**,而不是设置新的 mailbox。 + +::: + +## 2. 部署 Warp Route + +配置就绪后,使用以下命令启动 Warp Route 部署: + +```bash +hyperlane warp deploy +``` + +在部署期间,CLI 需要访问你的私钥来签署交易。你可以通过以下两种方式之一进行设置: + +1. **环境变量**:将你的私钥设置为 HYP_KEY,以避免每次都输入: + + ```bash + export HYP_KEY= + ``` + +2. **手动输入**:或者,你可以在部署过程中收到提示时直接输入私钥。 + +`hyperlane warp deploy` 命令将创建两个新的工件文件: + +1. `otherchain-yourchain-addresses.yaml`:包含新部署的 Warp Route 合约的地址。 +2. `otherchain-yourchain-config.yaml`:用于通过 CLI 和 Warp UI 与 Warp Route 交互的配置文件。 + +这些文件将位于 `$HOME/.hyperlane/deployments/warp_routes/` 下。 + +## 3. 测试 + +你可以使用以下命令发起一个单位(wei)的测试转账: + +```bash +hyperlane warp send --relay --symbol TOKEN +``` + +`--relay` 标志是可选的,它将中继消息到目标链。 + +你也可以在后台运行一个仅为你的 warp route 传递消息的中继器: +```bash +hyperlane relayer --symbol TOKEN +``` + +你可以在设置了 warp route 的任意方向进行测试。但是,如果你部署了 `native` 和 `synthetic` warp routes,你必须选择部署了 `native` route 的源链。默认情况下,发送的金额是代币最小单位的 `1`。 + +:::tip + +**下一步** + +- 如果你正在按照[将 Hyperlane 部署到新链](/docs/deploy-hyperlane#3-warp-route)指南操作,并想要连接其他链或使用 Abacus Works 转移到生产环境,请继续阅读[提交到注册表](/docs/deploy-hyperlane#4-submit-to-registry)指南。 + +- 要通过 UI 与 Warp Routes 交互,请继续阅读 [Warp UI 文档](/docs/guides/deploy-warp-route-UI.mdx)。 + +::: + +## 了解更多 + +- 查看 [Warp Route](/docs/reference/applications/warp-routes) 参考页面,了解更多关于 Warp Route 接口和安全含义的信息。[接口](/docs/reference/applications/warp-routes#interface)部分介绍了如何调用 `transferRemote` 将代币转移到目标链上的指定接收者。注意,在调用 `transferRemote` 之前,你需要先进行代币授权。 + +- Warp Route 是一种[路由器](docs/reference/libraries/router.mdx)应用程序,这种模式使你能够将多个链上的合约连接在一起。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/developer-tips/unit-testing.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/developer-tips/unit-testing.mdx new file mode 100644 index 00000000..e00c17ef --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/developer-tips/unit-testing.mdx @@ -0,0 +1,130 @@ +# 单元测试 - EVM + +在 Foundry 中对多链设置进行单元测试可能具有挑战性。因此,我们为您提供了一个轻量级的测试环境 `MockHyperlaneEnvironment`,让您可以对跨链应用程序进行单元测试,而无需分叉多个网络。 + +大多数多链应用程序都将基于我们的 Mailbox 合约构建。因此,我们使用 `MockMailbox` 抽象了已部署邮箱的细节,我们的环境在同一条链上包含 `originMailbox` 和 `destinationMailbox`。在内部,我们将到达目标的消息存储在目标邮箱的 `inboundMessages` 映射中。我们通过将消息入队并使用 `MockMailbox.processNextInboundMessage()` 增加 `inboundProcessedNonce` 来模拟消息传递。 + +简单消息传递 forge 测试的设置如下: + +### 发送消息 + +```solidity +contract SimpleMessagingTest is Test { + // 源和目标域(建议使用链ID) + uint32 origin = 1; + uint32 destination = 2; + + // 两个邮箱将在同一条链上但地址不同 + MockMailbox originMailbox; + MockMailbox destinationMailbox; + + // 可以接收消息的合约 + TestRecipient receiver; + + function setUp() public { + originMailbox = new MockMailbox(origin); + destinationMailbox = new MockMailbox(destination); + originMailbox.addRemoteMailbox(destination, destinationMailbox); + + receiver = new TestRecipient(); + } + + function testSendMessage() public { + string _message = "Aloha!"; + originMailbox.dispatch( + destination, + TypeCasts.addressToBytes32(address(receiver)), + bytes(_message) + ); + // 模拟消息传递到目标邮箱 + destinationMailbox.processNextInboundMessage(); + assertEq(string(receiver.lastData()), _message); + } +} +``` + +### 测试基于 Router 的应用程序 + +假设您正在测试继承自 `Router` 的 `TestCrosschainApp`: + +```solidity +contract CrosschainAppTest is Test { + // 源和目标域(建议使用链ID) + uint32 origin = 1; + uint32 destination = 2; + + function setUp() public { + environment = new MockHyperlaneEnvironment(origin, destination); + + // 您的跨链应用程序 + TestCrosschainApp originTelephone = new TestCrosschainApp(environment.mailboxes(origin)); + TestCrosschainApp destinationTelephone = new TestCrosschainApp(environment.mailboxes(destination)); + + // 假设您正在继承来自 https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/client/Router.sol 的 Router 模式 + originTelephone.enrollRemoteRouter(destinationTelephone); + destinationTelephone.enrollRemoteRouter(originTelephone); + } +} +``` + +调用 `processNextPendingMessage()` 和 `processNextPendingMessageFromDestination()` 分别处理目标和源邮箱的入站消息。现在,您可以从源到目标以及从目标到源进行跨链调用: + +```solidity + function testRemoteTelephoneCallFromOrigin() public { + // 检查源上的行为 + vm.expectEmit(true, true, true, false); + emit TelephoneRinging(destination, TypeCasts.bytes32ToAddress(destinationTelephone), "Hello!"); // 源上的示例事件 + originTelephone.callRemote(destination, TypeCasts.bytes32ToAddress(destinationTelephone), "Hello!"); + + // 模拟消息传递 源 -> 目标 + environment.processNextPendingMessage(); + + // 检查目标上的行为 + assertEq(destinationTelephone.latestMessage(originTelephone) == "Hello!"); + } + + function testRemoteTelephoneCallFromDestination() public { + // 检查目标上的行为 + vm.expectEmit(true, true, true, false); + emit TelephoneRinging(origin, TypeCasts.bytes32ToAddress(originTelephone), "Howdy!"); // 目标上的示例事件 + destinationTelephone.callRemote(origin, TypeCasts.bytes32ToAddress(originTelephone), "Howdy!"); + + // 模拟消息传递 目标 -> 源 + environment.processNextPendingMessageFromDestination(); + + // 检查源上的行为 + assertEq(originTelephone.latestMessage(destinationTelephone) == "Howdy!"); + } +``` + +如果您想为您的应用程序使用自己的 ISM,您可以通过将其传递给 Router 的 `initialize` 方法来覆盖邮箱提供的 `defaultIsm`,如下所示: + +```solidity +contract CrosschainAppTest is Test { + // 源和目标域(建议使用链ID) + uint32 origin = 1; + uint32 destination = 2; + + function setUp() public { + ... + + TestIgp igp = new TestIgp(); // 作为钩子传递的示例 InterchainGasPaymaster + + // 部署您自己的 ISM 合约以验证 originTelephone 和 destinationTelephone 之间的消息 + TelephoneISM originIsm = new TelephoneISM(); // 源的本地 ISM + TelephoneISM destinationIsm = new TelephoneISM(); // 目标的本地 ISM + + + originTelephone.initialize(address(igp), address(originIsm), msg.sender); + originTelephone.initialize(address(igp), address(destinationIsm), msg.sender); + + ... + } +} +``` + +:::tip + +您可以在这里找到我们的单元测试设置示例:[InterchainAccountRouterTest](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/dae8b26ed65383844e4fbed7585deeb52da4e454/solidity/test/InterchainAccountRouter.t.sol#L38) + +::: diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/explorer/configuring-pi-chains.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/explorer/configuring-pi-chains.mdx new file mode 100644 index 00000000..aa0bce24 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/explorer/configuring-pi-chains.mdx @@ -0,0 +1,61 @@ +# 在 Hyperlane Explorer 中配置新链 + +Hyperlane 可以被任何人[部署](/docs/deploy-hyperlane.mdx)到任何链上,这种开放访问被称为无许可互操作性(PI)。然而,默认的 Hyperlane 代理无法识别 PI 链上的消息。要查看来自 PI 链的消息详情,首先需要使用该链的元数据配置浏览器。 + +## 向 Hyperlane Explorer 添加链元数据 + +1. 在浏览器的主页上,点击"源"或"目标"按钮打开链选择。这将打开链选择模态框。在那里,点击右上角的加号图标。 + +![](/img/explorer-debugging/explorer-add-metadata.png) + +2. 在出现的表单中,使用符合 [ChainMetadata 模式](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts)的 JSON 或 YAML 输入链的元数据。 + +3. 如果提供了有效的基于 Etherscan 的区块浏览器配置,Hyperlane Explorer 将使用它来查找所需的消息。如果没有,它将使用 RPC URL。注意,带有 API 密钥的浏览器(即使只是免费层级的密钥)运行更快且更可靠。 + +### 链元数据示例 + +**JSON 格式的最小示例:** + +```json +{ + "chainId": 11155111, + "name": "sepolia", + "protocol": "ethereum", + "rpcUrls": [{ "http": "https://foobar.com" }] +} +``` + +**YAML 格式的详细示例:** + +```yaml +# Yaml 元数据示例 +blockExplorers: + - apiUrl: https://api-sepolia.etherscan.io/api + family: etherscan + name: Etherscan + url: https://sepolia.etherscan.io +blocks: + confirmations: 1 + estimateBlockTime: 13 + reorgPeriod: 2 +chainId: 11155111 +deployer: + name: Abacus Works + url: https://www.hyperlane.xyz +displayName: Sepolia +domainId: 11155111 +isTestnet: true +name: sepolia +nativeToken: + decimals: 18 + name: Ether + symbol: ETH +protocol: ethereum +rpcUrls: + - http: https://ethereum-sepolia.publicnode.com + - http: https://ethereum-sepolia.blockpi.network/v1/rpc/public +``` + +:::info +如果您消息中的源或目标 `domainId` 与其 `chainId` 不匹配,那么您必须在链配置中包含 `domainId` 字段。 +::: diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/explorer/explorer.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/explorer/explorer.mdx new file mode 100644 index 00000000..a4ebdfa8 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/explorer/explorer.mdx @@ -0,0 +1,37 @@ +# 如何使用 Hyperlane Explorer + +[Hyperlane Explorer](https://explorer.hyperlane.xyz/) 可用于在任何部署了 Hyperlane 的网络上查找消息。深入了解消息以获取有关其属性和状态的更多详细信息。 + +对于[核心链](/docs/reference/domains.mdx)的收发消息,可以通过交易哈希、消息 ID 或发送者/接收者地址进行搜索。对于其他链,可以通过提供链配置来配置浏览器以搜索消息。 + +### 搜索消息 + +[Hyperlane Explorer](https://explorer.hyperlane.xyz/) 支持使用以下任何值搜索消息: + +- 发起消息的交易哈希(源交易) +- 传递消息的交易哈希(目标交易) +- 发送源交易的账户地址 +- 发送目标交易的账户地址 +- 消息发送者的地址 +- 消息接收者的地址 +- 消息的 ID + +要搜索,请在顶部搜索栏中输入您的查询。您可以使用源链、目标链和时间筛选选项来缩小搜索范围。 + +![Explorer 搜索栏](/img/explorersearchbar.png) + +:::info + +请注意,默认情况下,浏览器只会在[核心 Hyperlane 链](/docs/reference/domains.mdx)上查找消息。 + +要查看发送到和/或来自其他链的消息,请参阅[配置 PI 链](./configuring-pi-chains.mdx)。 + +::: + +### 无许可互操作性 + +可以配置浏览器以搜索任何部署了 Hyperlane 的链上的消息。有关详细信息,请参阅[配置 PI 链](./configuring-pi-chains.mdx)。 + +### 调试消息 + +如果您正在尝试调试消息传递问题,[浏览器调试](./explorer-debugging.mdx)页面有一些有用的提示。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/explorer/graphql-api.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/explorer/graphql-api.mdx new file mode 100644 index 00000000..f2694feb --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/explorer/graphql-api.mdx @@ -0,0 +1,171 @@ +# GraphQL API + +Hyperlane 代理收集系统活动的有用信息,包括所有消息。这些数据可以通过 API 查询。这些 API 目前免费提供,无需任何身份验证。连接您首选的 GraphQL 客户端或库到 [https://api.hyperlane.xyz/v1/graphql](https://api.hyperlane.xyz/v1/graphql) 即可查询数据! + +### 示例查询 + +以下查询将检索有关消息的有用信息: + +```graphql +query MyQuery { + message_view(limit: 10, where: {msg_id: {_eq: "\xYOUR_MSG_ID"}}) { + msg_id + nonce + sender + recipient + is_delivered + message_body + origin_mailbox + origin_domain_id + origin_chain_id + origin_block_id + origin_block_height + origin_block_hash + origin_tx_sender + origin_tx_recipient + origin_tx_nonce + origin_tx_max_priority_fee_per_gas + origin_tx_max_fee_per_gas + origin_tx_id + origin_tx_hash + origin_tx_gas_used + origin_tx_gas_price + origin_tx_gas_limit + origin_tx_effective_gas_price + origin_tx_cumulative_gas_used + destination_block_id + destination_block_hash + destination_block_height + destination_chain_id + destination_domain_id + destination_mailbox + destination_tx_cumulative_gas_used + destination_tx_effective_gas_price + destination_tx_gas_limit + destination_tx_gas_price + destination_tx_gas_used + destination_tx_hash + destination_tx_id + destination_tx_max_fee_per_gas + destination_tx_max_priority_fee_per_gas + destination_tx_nonce + destination_tx_recipient + destination_tx_sender + send_occurred_at + delivery_occurred_at + delivery_latency + num_payments + total_payment + total_gas_amount + } +} +``` + +### GraphQL Schema 类型 + +```graphql +type message_view { + msg_id: bytea + nonce: Int! + sender: bytea + recipient: bytea + is_delivered: Boolean! + message_body: bytea + origin_mailbox: bytea + origin_domain_id: Int! + origin_chain_id: Int! + origin_block_id: Int! + origin_block_height: Int! + origin_block_hash: bytea + origin_tx_sender: bytea + origin_tx_recipient: bytea + origin_tx_nonce: Int! + origin_tx_max_priority_fee_per_gas: Int! + origin_tx_max_fee_per_gas: Int! + origin_tx_id: Int! + origin_tx_hash: bytea + origin_tx_gas_used: Int! + origin_tx_gas_price: Int! + origin_tx_gas_limit: Int! + origin_tx_effective_gas_price: Int! + origin_tx_cumulative_gas_used: Int! + destination_block_id: Int! + destination_block_hash: bytea + destination_block_height: Int! + destination_chain_id: Int! + destination_domain_id: Int! + destination_mailbox: bytea + destination_tx_cumulative_gas_used: Int! + destination_tx_effective_gas_price: Int! + destination_tx_gas_limit: Int! + destination_tx_gas_price: Int! + destination_tx_gas_used: Int! + destination_tx_hash: bytea + destination_tx_id: Int! + destination_tx_max_fee_per_gas: Int! + destination_tx_max_priority_fee_per_gas: Int! + destination_tx_nonce: Int! + destination_tx_recipient: bytea + destination_tx_sender: bytea + send_occurred_at: timestamp! + delivery_occurred_at: timestamp! + delivery_latency: Int! + num_payments: Int! + total_payment: Int! + total_gas_amount: Int! +} + +type block { + domain: Int! + domainByDomain: domain! + hash: String! + height: bigint! + id: bigint! + time_created: timestamp! + timestamp: timestamp! +} + +type domain { + chain_id: bigint + id: Int! + is_deprecated: Boolean! + is_test_net: Boolean! + name: String! + native_token: String! + time_created: timestamp! + time_updated: timestamp! +} + +type gas_payment { + amount: numeric! + domain: Int! + domainByDomain: domain! + id: bigint! + msg_id: String + time_created: timestamp! + transaction: transaction! + tx_id: bigint! +} + +type transaction { + block: block! + block_id: bigint! + checkpoint_updates: [checkpoint_update!]! + cumulative_gas_used: float8! + delivered_messages: [delivered_message!]! + effective_gas_price: float8 + gas_limit: float8! + gas_payments: [gas_payment!]! + gas_price: float8 + gas_used: float8! + hash: String! + id: bigint! + max_fee_per_gas: float8 + max_priority_fee_per_gas: float8 + messages: [message!]! + nonce: bigint! + recipient: String + sender: String! + time_created: timestamp! +} +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/extending-warp-route.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/extending-warp-route.mdx new file mode 100644 index 00000000..d62f37bf --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/extending-warp-route.mdx @@ -0,0 +1,174 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import PrerequisitesPartial from '/docs/partials/warp-routes/_prerequisites-config-symbol.mdx' +import WarpReadSymbolChainPartial from '/docs/partials/warp-routes/commands/_warp-read-symbol-chain.mdx' +import WarpApplySymbolConfigDefaultPartial from '/docs/partials/warp-routes/commands/_warp-apply-symbol-config-default.mdx' +import WarpApplySymbolConfigDefaultStrategyPartial from '/docs/partials/warp-routes/commands/_warp-apply-symbol-config-default-strategy.mdx' +import WarpReadSymbolSelectPartial from '/docs/partials/warp-routes/_warp-read-symbol-selection.mdx' + +# 如何扩展现有的 Warp Route + +# 使用 Hyperlane CLI + +部署 warp route 后,你可能想要将其扩展到新的链上。扩展 warp route 涉及在目标链上部署新的代币合约并将现有代币与其关联。 + +你可以使用 [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli) 扩展现有的 warp route。 + + + +:::warning +Gnosis Safe 用户:拥有 warp route 的 EOA 必须是 Safe 签名者或[代理人](https://docs.safe.global/core-api/transaction-service-guides/delegates)才能提议更新交易。 +::: + +如果你已经有 warp 配置,可以跳到[步骤 1](#step-1-configuration)。 + +要使用 Hyperlane CLI 生成 warp route 配置,请在已部署的链上定位你的代币符号: + + + + + +然后你可以选择要扩展的 warp route。 + +运行 `hyperlane warp read` 后,CLI 将显示类似以下的配置: + +```yaml +basesepolia: + mailbox: "0x6966b0E55883d49BFB24539356a2f8A673E02039" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: "1" + remoteRouters: + "11155111": "0x8A73F6E36735d8C4b9A00Af910746173050B754E" + type: "synthetic" +sepolia: + mailbox: "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: 0 + remoteRouters: + "84532": "0x26243aaD2d03AAbafaCE785808Ae64fc32aFB8A1" + type: "native" +``` + +这个特定的配置有 2 个链:basesepolia 和 sepolia。这意味着消息可以在两个链之间中继。 + +默认情况下,`warp read` 会将输出保存到 `CURRENT_DIR/configs/warp-route-deployment.yaml`。按照以下步骤将链添加到现有的 warp route。 + +## 步骤 1:配置 +通过添加新链的配置来更新 `warp-route-deployment.yaml`。 + +```diff title="warp-route-deployment.yaml" +sepolia: + mailbox: "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: 0 + remoteRouters: + "84532": "0x26243aaD2d03AAbafaCE785808Ae64fc32aFB8A1" + type: "native" +basesepolia: + mailbox: "0x6966b0E55883d49BFB24539356a2f8A673E02039" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: "1" + remoteRouters: + "11155111": "0x8A73F6E36735d8C4b9A00Af910746173050B754E" + type: "synthetic" ++ holesky: ++ mailbox: "0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc" ++ owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" ++ name: "Ether" ++ symbol: "ETH" ++ decimals: 18 ++ totalSupply: "1" ++ type: "synthetic" +``` + +:::warning +EOA 用户:扩展配置的 `owner` 必须与前置条件步骤中的 EOA 地址匹配,以避免部署失败。 +::: + +## 步骤 2:应用 + +使用 CLI,执行适用于你的 warp route 所有者设置的命令: + + + + + + + 使用此模板定义并保存 Gnosis Safe 策略: + ```yaml + basesepolia: + submitter: + type: "gnosisSafe" + chain: "basesepolia" + safeAddress: "0x518489F9ed41Fc35BCD23407C484F31897067ff0" + sepolia: + submitter: + type: "gnosisSafe" + chain: "sepolia" + safeAddress: "0x518489F9ed41Fc35BCD23407C484F31897067ff0" + holesky: + submitter: + type: "gnosisSafe" + chain: "holesky" + safeAddress: "0x1f9090aaE28b8a3dCeaDf281B0F12828e676c326" + ``` + 在这种情况下,每个链都是一个带有各自 Safe 地址的 Gnosis Safe 策略。必须**接受** Safe 提议才能完成 warp route 扩展。 + + + + +执行后,你应该看到在链上执行了一批交易,以及一条表示 warp 配置已更新的最终消息。 + +## 步骤 3:确认 + +要使用 Hyperlane CLI 确认 warp route 已成功扩展,请在已部署的链上运行以下命令,使用你的代币符号: + + + +运行 `warp read` 后,确认 warp route 已扩展: +```yaml {23-34} +basesepolia: + mailbox: "0x6966b0E55883d49BFB24539356a2f8A673E02039" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: 0 + remoteRouters: + "17000": "0x9B18AfD7aB869C6B011F44638ff71786447B785B" + "11155111": "0x4e63147e72d029Eb8b37F375B3837B2644622686" + type: native +sepolia: + mailbox: "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: "0" + remoteRouters: + "17000": "0x9B18AfD7aB869C6B011F44638ff71786447B785B" + "84532": "0xB38cc797Ccc6D8763439a07CEa052AF253281de6" + type: "synthetic" +holesky: + mailbox: "0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: "0" + remoteRouters: + "84532": "0xB38cc797Ccc6D8763439a07CEa052AF253281de6" + "11155111": "0x4e63147e72d029Eb8b37F375B3837B2644622686" + type: "synthetic" diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/implementation-guide.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/implementation-guide.mdx new file mode 100644 index 00000000..3ca69367 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/implementation-guide.mdx @@ -0,0 +1,236 @@ +# 实现指南 + +针对新的链架构的 Hyperlane 实现包括以下内容: + +1. [合约](#1-合约):为应用程序开发者提供发送和接收消息的接口 +2. [代理](#2-代理):通过添加安全性和中继消息来运行协议 +3. [应用程序](#3-应用程序):使用协议并展示其功能的应用程序 + +在开始之前,建议先查看协议文档。 + +:::info + +如果您想深入了解,请查看一些当前可用的 Hyperlane 实现: + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/solidity) +- [CosmWasm](https://github.com/many-things/cw-hyperlane) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/sealevel) +- [Cairo](https://github.com/astraly-labs/hyperlane_starknet) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts) +- [Move](https://github.com/movementlabsxyz/hyperlane-monorepo/tree/v3-aptos) + +::: + +## 1. 合约 + +以下描述了 Hyperlane 协议的链上合约规范。它使用 solidity 类型以便于理解,但所有内容都应该可以推广到其他语言。 + +- `address` 应解释为本地链的地址类型。 +- `payable` 描述了允许调用者传递原生代币的函数。 +- 确保为所有重要的状态更改正确发出事件。 +- 清楚地记录任何与参考实现的偏差及其理由。 + +### 需要考虑的事项 + +**字节表示:** + +- 请注意,不同的链可能有不同的原生类型来表示字节。例如,StarkNet 使用 felt252 作为合约地址,这可能无法完全容纳其他链中使用的 32 字节地址。 +- 在处理跨链地址时,实现适当的转换和验证机制。 + +**序列化:** + +- 特别注意消息字段的序列化方式,尤其是像消息体这样的可变长度数据。 +- 确保所使用的序列化方法(例如,abi.encodePacked 等效物)在不同的链实现中行为一致。 + +### 消息 + +消息是 Hyperlane 协议使用的核心数据结构。它是一个打包的数据结构,包含了将消息从一个域路由到另一个域所需的所有信息。 + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/hyperlane-message/src/main.sw) +- [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/types/message.rs) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/types/message.rs) +- [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/libs/message.cairo) + +```solidity +struct Message { + // 源和目标邮箱的版本 + uint8 version, + // 在源邮箱上唯一标识消息的 nonce + uint32 nonce, + // 源链的域 + uint32 origin, + // 源链上的发送者地址 + bytes32 sender, + // 目标链的域 + uint32 destination, + // 目标链上的接收者地址 + bytes32 recipient, + // 消息体的原始字节 + bytes body +} +``` + +### 邮箱 + +邮箱是开发者用来发送和接收消息的入口点。确保 `localDomain` 是不可变的,以防止可能危及跨链安全的未授权更改。 + +- [Solidity 接口](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IMailbox.sol) + +实现: + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/Mailbox.sol) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/hyperlane-mailbox/src/main.sw) +- [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/contracts/core/mailbox/src/execute.rs) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs/mailbox/src/processor.rs) +- [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/mailbox.cairo) + +:::info + +除了默认和自定义钩子外,Hyperlane 还引入了**必需钩子**的概念,用于对所有调度进行后处理。确保在默认或自定义钩子之前调用必需钩子。 + +::: + +#### dispatch + +将消息调度到目标域和接收者。 + +```solidity +function dispatch( + // 目标链的域 + uint32 destination, + // 目标链上的接收者地址(作为 bytes32) + bytes32 recipient, + // 消息体的原始字节内容 + bytes body +) returns ( + // 插入到邮箱的默克尔树中的消息 ID + bytes32 messageId +); +``` + +将消息调度到目标域和接收者,并为默认钩子提供元数据。 + +```solidity +function dispatch( + // 目标链的域 + uint32 destination, + // 目标链上的接收者地址(作为 bytes32) + bytes32 recipient, + // 消息体的原始字节内容 + bytes body, + // 默认后调度钩子使用的元数据 + bytes defaultHookMetadata +) returns ( + // 插入到邮箱的默克尔树中的消息 ID + bytes32 messageId +); +``` + +将消息调度到目标域和接收者,并为自定义钩子提供元数据以替代默认钩子。 + +```solidity +function dispatch( + // 目标链的域 + uint32 destination, + // 目标链上的接收者地址(作为 bytes32) + bytes32 recipient, + // 消息体的原始字节内容 + bytes body, + // 自定义后调度钩子使用的元数据 + bytes customHookMetadata, + // 用于替代默认钩子的自定义钩子 + IPostDispatchHook customHook +) returns ( + // 插入到邮箱的默克尔树中的消息 ID + bytes32 messageId +); +``` + +#### process + +尝试将 `message` 传递给其接收者。使用提供的 `metadata` 通过接收者的 ISM 验证 `message`。 + +```solidity +function process( + // ISM 用于验证消息的元数据 + bytes metadata, + // 字节打包的消息 + bytes message +); +``` + +#### latestDispatchedId + +返回用于后调度钩子认证的最新调度消息 ID。 + +```solidity +function latestDispatchedId() public view returns (bytes32); +``` + +### 消息接收者 + +想要接收消息的合约必须暴露以下处理程序。 + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IMessageRecipient.sol) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/hyperlane-interfaces/src/lib.sw) +- [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/core/mod.rs) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/libraries/message-recipient-interface/src/lib.rs) +- [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/c0dbded927f340715bef8f6a8c6262f520ff3f1a/cairo/crates/contracts/src/interfaces.cairo#L131) + +```solidity +function handle( + // 源链的域 + uint32 origin, + // 源链上的发送者地址 + bytes32 sender, + // 消息体的原始字节内容 + bytes body +); +``` + +他们可以选择指定一个安全模块来在消息被处理之前验证消息。 + +```solidity +function interchainSecurityModule() returns (address); +``` + +:::info + +在实现这三个合约之后,您可以通过调用 `Mailbox` 的 `dispatch` 函数来发送消息给接收者并断言接收者收到了消息,从而达到第一个里程碑来测试模拟消息传输。请参见[这里的 Foundry 测试用例](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/59e89afc5cbdec5362da5e13327eab4cb640b6b5/solidity/test/Messaging.t.sol#L29)。 + +### 验证器公告 + +验证器公告合约允许验证器注册其地址,以便中继器可以检索它们。这对于多重签名 ISM 的正常运行至关重要。 + +:::info + +**静态模块管理** - 我们的 Solidity 实现将 MultisigISMs 定义为静态的并作为字节码的一部分,这在其他链上可能不可行。您可能需要为 ISM 实现动态模块。 + +::: + +### 跨链气体支付 + +跨链气体支付合约允许用户为消息传递支付气体费用。它还允许中继器收集这些付款。 + +:::info + +实现对足够气体支付的稳健检查,考虑特定链的代币处理。我们的 solidity 实现收取原生消息值,但对于其他链,您可能需要收取特定代币并相应地调整气体开销和 `tokenExchangeRate`。 + +::: + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/hooks/igp/InterchainGasPaymaster.sol) + +### 代理 + +代理是运行 Hyperlane 协议的链下进程。它们负责消息传递和安全性。 + +#### 中继器 + +中继器负责将消息从源链传递到目标链。它们还负责收集和提供安全元数据。 + +每个模块类型都意味着消息验证成功所需的不同元数据格式。中继器需要实现每个模块特征(例如[多重签名](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/multisig_ism.rs))。 + +#### 消息处理器 + +中继器将尝试在目标邮箱上处理消息(参见[消息处理器](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/fa424826c0132c135511e5316a6e559b574b3a8f/rust/main/agents/relayer/src/msg/processor.rs#L28))。如果消息处理失败,它们将重试。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/local-testnet-setup.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/local-testnet-setup.mdx new file mode 100644 index 00000000..7e1f22e0 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/local-testnet-setup.mdx @@ -0,0 +1,147 @@ +# Hyperlane 本地设置指南:在 Anvil 节点之间发送消息 + +本指南将指导你使用 Hyperlane CLI 在两个本地 Anvil 节点之间发送跨链消息。 + +## 前提条件 + +- **[Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli):** 确保你已安装最新版本的 Hyperlane CLI。 + + ```bash + npm install -g @hyperlane-xyz/cli + ``` + +- **[Anvil (foundry)](https://book.getfoundry.sh/getting-started/installation):** 用于运行本地链。通过以下命令安装: + ```bash + curl -L https://foundry.paradigm.xyz | bash + ``` +- **Node.js**(v18 或更高版本) +- **部署钱包私钥**:你需要一个有资金的钱包来部署合约。这将作为 HYP_KEY 使用。 + ```bash + export HYP_KEY=<你的私钥> + ``` + +## 分步指南 + +### 1. 环境设置:创建 Hyperlane 配置的工作目录: + +```bash +mkdir hyperlane-local-test && cd hyperlane-local-test +``` + +### 2. 启动两个不同的 Anvil 节点 + +我们将运行两个具有唯一链 ID 的 Anvil 节点。 + +- 在第一个终端中,启动第一个 Anvil 节点: + + ```bash + anvil --port 8545 --chain-id 31337 + ``` + + - 运行在 `http://localhost:8545` + - 链 ID:`31337` + +- 在新的终端中,启动第二个 Anvil 节点: + + ```bash + anvil --port 8546 --chain-id 31338 + ``` + + - 运行在 `http://localhost:8546` + - 链 ID:`31338` + +### 3. 初始化 Hyperlane 注册表 + +在新的终端中,使用 Hyperlane CLI 为两个 Anvil 节点创建配置: + +```bash +hyperlane registry init +``` + +按照提示设置 `anvilnode1`。CLI 将询问你的链的详细信息,包括链 ID 和 RPC URL。对 `anvilnode2` 重复此过程。 + +此过程将在 `$HOME/.hyperlane/chains/anvilnode1` 和 `$HOME/.hyperlane/chains/anvilnode2` 下创建 `metadata.yaml` 文件。 + +示例元数据: + +- **anvilnode1** + +```yaml +chainId: 31337 +displayName: Anvilnode1 +domainId: 31337 +isTestnet: true +name: anvilnode1 +nativeToken: + decimals: 18 + name: ETH + symbol: ETH +protocol: ethereum +rpcUrls: + - http: http://localhost:8545 +``` + +- **anvilnode2** + +```yaml +chainId: 31338 +displayName: Anvilnode2 +domainId: 31338 +isTestnet: true +name: anvilnode2 +nativeToken: + decimals: 18 + name: ETH + symbol: ETH +protocol: ethereum +rpcUrls: + - http: http://localhost:8546 +``` + +### 4. 部署核心合约 + +我们将配置并部署 Hyperlane 核心合约。 + +:::tip +你需要部署钱包私钥来部署核心合约。你可以使用 `export HYP_KEY='<你的私钥>'` 将私钥设置为环境变量。 +::: + +```bash +hyperlane core init +``` + +部署配置将保存到 `./configs/core-config.yaml`。 + +接下来,部署核心合约: + +```bash +hyperlane core deploy +``` + +按照提示选择 `anvilnode1`。CLI 将部署 Mailbox、跨链安全模块(ISM)和其他必需的合约。对 `anvilnode2` 重复此过程。 + +完成后,你会在 `$HOME/.hyperlane/chains/anvilnode1` 和 `$HOME/.hyperlane/chains/anvilnode2` 中找到 `addresses.yaml`,其中包含已部署的合约地址。 + +:::tip +你应该能够在运行本地节点的终端上看到合约部署的消息。 +::: + +### 5. 发送测试消息 + +使用 Hyperlane CLI 从 `anvilnode1` 向 `anvilnode2` 发送消息。 + +```bash +hyperlane send message --relay +``` + +CLI 将提示你提供源链(`anvilnode1`)和目标链(`anvilnode2`)。 + +:::tip + +对于本地测试,`--relay` 标志会自动将消息中继到目标链。 + +::: + +查看 `anvilnode1` 和 `anvilnode2` 上的日志,确认消息已发送和接收。 + +🎉 就是这样,你已经使用 Hyperlane 在两个本地 Anvil 节点之间发送了消息! diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/message-debugging.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/message-debugging.mdx new file mode 100644 index 00000000..943d1c6b --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/message-debugging.mdx @@ -0,0 +1,149 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +import CosmosMessageDelivered from "@site/src/components/CosmosMessageDelivered"; + +# 消息调试 + +### + +
+ **从源交易中查找消息 ID** +
+ + + 如果你的链受支持,最简单的方法是使用 [Hyperlane 浏览器](https://explorer.hyperlane.xyz)。如果你的链不受支持,可以通过查看源交易来找到消息 ID。 + + 在源链的区块浏览器上查看源交易时,导航到 **Logs** 标签页。 + + **`DispatchId`** 日志包含消息 ID,作为主题编号 1(第二个主题)。 + + 有时,链区块浏览器不会显示人类友好的 "DispatchId" 名称。在这种情况下,你可以通过它的主题 0 找到日志:`0x788dbc1b7152732178210e7f4d9d010ef016f9eafbe66786bd7169f56e0c353a`。 + +
+ ![](/img/message-debugging/dispatch-id-log-evm.png) +
Arbiscan 上显示源交易 DispatchId 日志的示例。
+
+ +
+ + 在源链的区块浏览器上查看源交易时,导航到 **Event Logs** 标签页。 + + **Wasm Mailbox Dispatch Id** 日志包含消息 ID。 + +
+ ![](/img/message-debugging/dispatch-id-log-cosmos.png) +
Mintscan 上显示源交易日志的示例。
+
+
+
+
+
+ +
+ **调试发送到 Cosmos 链的消息** +
+ 目前,[Hyperlane 浏览器](https://explorer.hyperlane.xyz)不支持非 EVM 链。 + + 要检查你的消息是否已送达,请选择目标链并在下面输入你的消息 ID: + + +
+
+ +
+ **我的 warp route 转账显示已送达,但我看不到它** +
+ 我们可以通过两个步骤来调试这个问题: + + **验证是否收到资金:** + + + + 1. 打开目标链的区块浏览器,导航到你预期的接收地址。 + 2. 如果你期望收到代币(例如 ERC-20),检查代币转账标签页中是否有代币转入你的地址。 + 3. 如果你期望收到原生代币(例如以太坊上的 ETH),检查"内部交易"标签页中是否有原生代币转入你的地址。 + + + 1. 打开目标链的区块浏览器,导航到你预期的接收地址。 + 2. 查看你的"Coins"或"Tokens"标签页,查找预期的余额。 + 3. 如果不清楚你的余额是否符合预期,请检查交易列表。寻找包含"Process"的任何交易。 + + + + **验证你的转账接收者** + + + + 在源链的区块浏览器上查看源交易时,导航到 **Logs** 标签页。 + + **`SentTransferRemote`** 日志包含接收者,作为主题编号 1(第二个主题)。 + + 有时,链区块浏览器不会显示人类友好的 "SentTransferRemote" 名称。在这种情况下,你可以通过它的主题 0 找到日志:`0xd229aacb94204188fe8042965fa6b269c62dc5818b21238779ab64bdd17efeec`。 + + 接收者地址是将接收 warp 代币的目标链上的账户。如果需要,地址左侧会填充零。 + + 如果你的目标链是 EVM 链,日志将显示 `0x0000000000000000000000ffffffffffffffffffffffffffffffffffffffff`,表示 `0xffffffffffffffffffffffffffffffffffffffff` 是转账接收者。 + + 如果你的目标链是 Cosmos 链,你可以使用[这样的工具](https://www.bech32converter.com)将十六进制内容转换为 bech32 地址。一些 Cosmos 链有不同的地址长度,所以要注意复制多少个字符。 + +
+ ![](/img/message-debugging/transfer-remote-evm.png) +
Arbiscan 上显示源交易 DispatchId 日志的示例。
+
+ +
+ + + 在源链的区块浏览器上查看源交易时,导航到 **Event Logs** 标签页。 + + 包含 **Transfer Remote** 的日志包含消息 ID,例如:`Wasm Hpl Warp Native Transfer Remote`。 + + 接收者地址是将接收 warp 代币的目标链上的账户。如果需要,地址左侧会填充零。 + + 如果你的目标链是 EVM 链,你可以将十六进制内容转换为 EVM 地址。 + + 如果你的目标链是 Cosmos 链,你可以使用[这样的工具](https://www.bech32converter.com)将十六进制内容转换为 bech32 地址。一些 Cosmos 链有不同的地址长度,所以要注意复制多少个字符。 + +
+ ![](/img/message-debugging/transfer-remote-cosmos.png) +
Mintscan 上显示源交易日志的示例。
+
+
+
+
+
+ +
+ **我的 Warp Route 转账接收者不是我想要的地址** +
+ 有时浏览器扩展钱包可能会相互竞争,你不常用的钱包地址可能会优先于你想要使用的钱包。我们已经看到这种情况在 **OKX 钱包**上发生过几次。请检查你所有钱包地址中的接收者地址。 +
+
+ +
+ **自己中继 EVM → EVM 消息** +
+ 使用 [Hyperlane CLI](/docs/reference/cli.mdx),如果消息是在两个 EVM 链之间传递,你可以自己中继消息。 + + 1. 按照[这些说明](/docs/reference/cli.mdx)在本地设置 CLI。 + 2. 按照[上述说明](#finding-a-message-id-from-an-origin-transaction)找到你的消息 ID。 + 3. 获取目标链上有资金账户的私钥。 + 3. 运行命令中继消息: + ``` + HYP_KEY=<你的私钥> hyperlane status --relay --origin <源链> --destination <目标链> --id <消息ID> + ``` + + 例如: + ``` + HYP_KEY=0xffff00000000000000000000000000000000000000000000000000000000ffff hyperlane status --relay --origin base --destination blast --id 0xabcd00000000000000000000000000000000000000000000000000000000abcd + ``` +
+
+ +
+ **我的消息未送达,仍需帮助** +
+ 如果上述步骤没有帮助,你可以加入我们的 [Discord](https://discord.com/invite/hyperlane) 并在 **#support-forum** 频道创建新帖子。 +
+
diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/quickstart-relayer.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/quickstart-relayer.mdx new file mode 100644 index 00000000..3ba8b5c7 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/quickstart-relayer.mdx @@ -0,0 +1,164 @@ +import TerminologyPartial from "/docs/partials/deploy-hyperlane/_terminology.mdx"; +import SetupKeysPartial from "/docs/partials/deploy-hyperlane/_setup-keys.mdx"; +import DeployContractsPartial from "/docs/partials/deploy-hyperlane/_deploy-contracts.mdx"; +import SendTestMessagesPartial from "/docs/partials/deploy-hyperlane/_send-test-messages.mdx"; + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# 快速入门:运行中继器 + +:::tip + +- 本指南面向可能最终打算在类生产环境中运行 Hyperlane 代理的高级用户。它将介绍如何手动配置和运行代理的基础知识,但**这不是生产环境设置指南**。 +- 有关更详细的指南,请查看[中继器指南](docs/operate/relayer/run-relayer.mdx)。 + +::: + + + +## 运行中继器 + +中继器在本地链和远程链之间传递跨链消息。在[这里](docs/protocol/agents/relayer.mdx)了解更多关于中继器的工作原理。 + +你应该已经在[代理配置](#agent-configs)步骤中将 `CONFIG_FILES` 环境变量设置为生成的代理配置的路径。如果没有,请现在设置。 + +```bash +export CONFIG_FILES=/full/path/to/configs/agent-config.json +``` + +### 配置 + +中继器可以配置多个参数。对于本指南,我们只关注其中几个: + +| 参数 | 描述 | +| ------------------------------- | ---------------------------------------------------------------------------------------- | +| `--db` | 将持久数据写入磁盘的路径。 | +| `--relayChains` | 要在其间中继的链的名称,用逗号分隔。例如 `ethereum,polygon,avalanche`。 | +| `--allowLocalCheckpointSyncers` | 允许中继器在本地文件系统上查找验证者签名。 | +| `--defaultSigner.key` | 用于为所有链签署交易的十六进制私钥。 | +| `--metrics-port` | 可选。用于暴露 prometheus 指标的端口,默认为 `9090`。 | + +:::tip +你的中继链集应该包括源链和目标链。 +::: + +要了解更多关于可以更改的所有参数,请阅读[代理配置参考](docs/operate/config-reference.mdx)。 + + + + +**挂载目录** + +对于中继器,我们为 Docker 提供了几乎与验证者相同的参数: + +1. 将 `$CONFIG_FILES` 环境变量设置为容器内的固定路径。 +2. 将代理配置文件挂载到此固定路径并设为**只读**。 +3. 将持久数据目录挂载到容器内的固定路径。 +4. 将验证者签名目录挂载到容器内的固定路径并设为**只读**。 + +```sh +... +-e CONFIG_FILES=/config/agent-config.json \ +--mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ +--mount type=bind,source="$(pwd)"/hyperlane_db_relayer,target=/hyperlane_db \ +--mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures,readonly \ +... +``` + +硬编码这些路径可以在为不同链集运行中继器的 docker 实例之间去重配置。这使得运行容器时更容易传递正确的参数。请参见下面的示例,其中对于不同的链,只需要配置不同的中继链列表和中继器密钥。 + + + + +**克隆和设置** + +如果你还没有这样做,克隆 Hyperlane monorepo 并按照 `rust` 目录中的[设置说明](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md)进行操作。 + +```sh +# 克隆 hyperlane monorepo +git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git + +# 安装 rustup +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + +# (仅限 apple silicon) 安装 rosetta 2 +softwareupdate --install-rosetta --agree-to-license +``` + + + + +### 运行 + + + + +如果你还没有拉取 Docker 镜像,现在通过运行以下命令来拉取: + +```sh +docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 +``` + +在运行之前,确保所有需要挂载的目录都存在。这可能需要创建 `hyperlane_db_relayer`(如果它还不存在)。 + +```sh +mkdir -p hyperlane_db_validator_<你的链名称> +``` + +最后,运行中继器: + +```sh +docker run \ + -it \ + -e CONFIG_FILES=/config/agent-config.json \ + --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ + --mount type=bind,source="$(pwd)"/hyperlane_db_relayer,target=/hyperlane_db \ + --mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures,readonly \ + gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 \ + ./relayer \ + --db /hyperlane_db \ + --relayChains <链1名称>,<链2名称> \ + --allowLocalCheckpointSyncers true \ + --defaultSigner.key <你的中继器密钥> \ +``` + + + + +按照设置说明后,你现在应该可以使用 `cargo` 运行中继器: + +```sh +cargo run --release --bin relayer -- \ + --db ./hyperlane_db_relayer \ + --relayChains <链1名称>,<链2名称> \ + --allowLocalCheckpointSyncers true \ + --defaultSigner.key <你的中继器密钥> \ + --metrics-port 9091 +``` + +指标端口被覆盖以避免与验证者冲突。 + +:::note (可选) 直接运行二进制文件 + +你也可以构建代理: + +```sh +cargo build --release --bin relayer +``` + +并直接运行二进制文件: + +```sh +./target/release/relayer \ + --db ./hyperlane_db_relayer \ + --relayChains <链1名称>,<链2名称> \ + --allowLocalCheckpointSyncers true \ + --defaultSigner.key <你的中继器密钥> \ + --metrics-port 9091 +``` + +::: + + + diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/quickstart-validator.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/quickstart-validator.mdx new file mode 100644 index 00000000..009c5881 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/quickstart-validator.mdx @@ -0,0 +1,237 @@ +import TerminologyPartial from "/docs/partials/deploy-hyperlane/_terminology.mdx"; +import SetupKeysPartial from "/docs/partials/deploy-hyperlane/_setup-keys.mdx"; +import DeployContractsPartial from "/docs/partials/deploy-hyperlane/_deploy-contracts.mdx"; +import SendTestMessagesPartial from "/docs/partials/deploy-hyperlane/_send-test-messages.mdx"; + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# 快速入门:运行验证者 + +:::tip + +- 本指南面向可能最终打算在类生产环境中运行 Hyperlane 代理的高级用户。它将介绍如何手动配置和运行代理的基础知识,但**这不是生产环境设置指南**。 +- 有关更详细的指南,请查看[验证者指南](docs/operate/validators/run-validators.mdx) + +::: + + + +## 运行验证者 + +验证者为从你的链发送到远程链的消息提供安全保障。只有在使用[多重签名 ISM](docs/protocol/ISM/multisig-ISM.mdx)时才需要它们。在[这里](../protocol/agents/validators.mdx)了解更多关于验证者的工作原理。 + +### 设置目录 + +首先,将 `CONFIG_FILES` 环境变量设置为在[部署合约](#2-deploy-contracts)步骤中生成的代理配置的路径。例如: + +```bash +export CONFIG_FILES=/full/path/to/configs/agent-config-{timestamp}.json +``` + +接下来,为你的验证者创建一个本地目录,用于写入其签名。记住这个路径,因为在配置验证者时你会需要它。 + +:::danger +验证者签名路径将作为[验证者公告交易](docs/guides/implementation-guide.mdx#validator-announce)的一部分写入链上。**注意不要泄露任何安全敏感或个人信息!** +::: + +```sh +# 为你要验证的链选择一个有意义的名称 +export VALIDATOR_SIGNATURES_DIR=/tmp/hyperlane-validator-signatures-<你的链名称> + +# 创建目录 +mkdir -p $VALIDATOR_SIGNATURES_DIR +``` + +:::warning + +在 Mac 上通过 Docker 运行代理时,你将无法挂载 `/tmp` 中的任何内容。为了解决这个问题,创建一个本地 `tmp` 目录来代替挂载。 + +```sh +# 创建一个可以被 docker 访问的本地 tmp 目录 +mkdir tmp + +# 为你要验证的链选择一个有意义的名称 +export VALIDATOR_SIGNATURES_DIR=tmp/hyperlane-validator-signatures-<你的链名称> + +# 创建目录 +mkdir -p $VALIDATOR_SIGNATURES_DIR +``` + +::: + +### 配置 + +验证者可以配置多个参数。对于本指南,我们只关注其中几个: + +| 参数 | 描述 | +| ------------------------- | ------------------------------------------------------------------------------------------------------------- | +| `--db` | 将持久数据写入磁盘的路径。 | +| `--originChainName` | 被验证的链的名称(例如 `ethereum`)。 | +| `--checkpointSyncer.type` | 在本指南中设置为 `localStorage`。 | +| `--checkpointSyncer.path` | 验证者签名将被写入的本地目录路径。与 `$VALIDATOR_SIGNATURES_DIR` 相同。 | +| `--validator.key` | 你的验证者的十六进制私钥。 | + +:::info + +确保验证者密钥对应于设置 MultisigIsmConfig 时提供的地址。否则,你在上一步部署的多重签名 ISM 将无法验证从你的链发送的消息。 + +::: + +要了解更多关于可以更改的所有参数,请阅读[代理配置参考](docs/operate/config-reference.mdx)。 + + + + +**更新代理配置** + +除非你在 Linux 上运行 Docker,否则你还需要更新网络的代理配置。这是因为 Docker 在 Mac、Windows 或 Windows Server 上不支持[`host` 网络模式](https://docs.docker.com/network/drivers/host/)。 + +为此,导航到 `$CONFIG_FILES` 的代理配置,并将所有 "localhost" 或 "127.0.0.1" 的实例替换为 `host.docker.internal`。例如: + +```json +... +"localnet1": { + ... + "rpcUrls": [ + { + // "http": "http://localhost:8545" + // "http": "http://127.0.0.1:8545" + "http": "http://host.docker.internal:8545" + } + ], + ... +}, +... +``` + +**挂载目录** + +使用 Docker 运行会增加一层复杂性,因为配置文件需要从 Docker 容器内部访问,而验证者签名需要从容器外部访问以供中继器读取。这是为了让中继器可以构建消息被多重签名 ISM 成功验证所需的元数据。 + +要解决这个问题,你可以将文件系统上的目录挂载到容器中。在下面的参数中,我们: + +1. 将 `$CONFIG_FILES` 环境变量设置为容器内的固定路径。 +2. 将代理配置文件挂载到此固定路径并设为只读。 +3. 将持久数据目录挂载到容器内的固定路径。 +4. 将验证者签名目录挂载到容器内的固定路径。 + +```sh +... +-e CONFIG_FILES=/config/agent-config.json \ +--mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ +--mount type=bind,source="$(pwd)"/hyperlane_db_validator_<你的链名称>,target=/hyperlane_db \ +--mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures \ +... +``` + +硬编码这些路径可以在为不同源链运行验证者的 docker 实例之间去重配置。这使得运行容器时更容易传递正确的参数。请参见下面的示例,其中对于不同的链,只需要配置不同的链名称和验证者密钥。 + +```sh +... +./validator \ +--db /hyperlane_db \ +--originChainName <你的链名称> \ +--checkpointSyncer.type localStorage \ +--checkpointSyncer.path /tmp/validator-signatures \ +--validator.key <你的验证者密钥> +... +``` + + + + +**克隆和设置** + +首先,克隆 Hyperlane monorepo: + +```sh +git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git +``` + +然后按照 `rust` 目录中的[设置说明](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md)进行操作。这应该会设置 `rustup` 以及 Rosetta 2(如果你使用的是 Apple Silicon)。 + +```sh +# 安装 rustup +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + +# (仅限 apple silicon) 安装 rosetta 2 +softwareupdate --install-rosetta --agree-to-license +``` + + + + +### 运行 + + + + +现在你已经更好地理解了验证者参数的配置,拉取最新的 docker 镜像: + +```sh +docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 +``` + +在运行之前,确保所有需要挂载的目录都存在。这可能需要创建 `hyperlane_db_validator_<你的链名称>`(如果它还不存在)。 + +```sh +mkdir -p hyperlane_db_validator_<你的链名称> +``` + +最后,运行验证者: + +```sh +docker run \ + -it \ + -e CONFIG_FILES=/config/agent-config.json \ + --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ + --mount type=bind,source="$(pwd)"/hyperlane_db_validator_<你的链名称>,target=/hyperlane_db \ + --mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures \ + gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 \ + ./validator \ + --db /hyperlane_db \ + --originChainName <你的链名称> \ + --checkpointSyncer.type localStorage \ + --checkpointSyncer.path /tmp/validator-signatures \ + --validator.key <你的验证者密钥> +``` + + + + + +按照设置说明后,你现在应该可以使用 `cargo` 运行验证者: + +```sh +cargo run --release --bin validator -- \ + --db ./hyperlane_db_validator_<你的链名称> \ + --originChainName <你的链名称> \ + --checkpointSyncer.type localStorage \ + --checkpointSyncer.path $VALIDATOR_SIGNATURES_DIR \ + --validator.key <你的验证者密钥> +``` + +:::note (可选) 直接运行二进制文件 + +你也可以构建代理: + +```sh +cargo build --release --bin validator +``` + +并直接运行二进制文件: + +```sh +./target/release/validator \ + --db ./hyperlane_db_validator_<你的链名称> \ + --originChainName <你的链名称> \ + --checkpointSyncer.type localStorage \ + --checkpointSyncer.path $VALIDATOR_SIGNATURES_DIR \ + --validator.key <你的验证者密钥> +``` + +::: + + + diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/remove-trusted-relayer.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/remove-trusted-relayer.mdx new file mode 100644 index 00000000..58d8eecf --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/remove-trusted-relayer.mdx @@ -0,0 +1,113 @@ +import PrerequisitesPartial from '../partials/warp-routes/_prerequisites-config-symbol.mdx' +import WarpReadSymbolChainPartial from '../partials/warp-routes/commands/_warp-read-symbol-chain.mdx' +import WarpApplySymbolConfigDefaultPartial from '../partials/warp-routes/commands/_warp-apply-symbol-config-default.mdx' + +# 如何从 Warp Route 中移除可信中继器 ISM + +# 使用 Hyperlane CLI + +首次使用 CLI 部署时,新的 warp routes 会默认使用可信中继器 ISM,这样您就不需要运行中继器或验证器。 + +为了投入生产环境,您需要使用 [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli) 移除这个 ISM。 + + + +:::info +如果您按照[部署 Warp Route](https://docs.hyperlane.xyz/docs/guides/deploy-warp-route) 指南进行操作,您很可能部署了一个将可信中继器设置为签名者地址的 warp route。 +::: + +要使用 Hyperlane CLI 进行确认,请找到您的代币符号和部署它的链: + + + +然后,您可以选择要移除可信中继器的 warp route。 + +运行 `warp read` 后,您应该在 `interchainSecurityModule` 下看到类似的配置,其中包含一个 `trustedRelayerIsm`: + +```yaml {7-9} +yourchain: + ... + interchainSecurityModule: + address: "0xd54d32cD6a62482497252D59E6cCC1445fF0b92d" + type: "staticAggregationIsm" + modules: + - address: "0x50b6dA835D9b8b20523891410a2E042855B465C8" + relayer: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + type: "trustedRelayerIsm" + - owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + address: "0xcE512189fF1BD41186E9eDda02BF321Fb1FC6eAc" + type: "defaultFallbackRoutingIsm" + domains: {} + threshold: 1 +``` + +这个特定的配置在 `staticAggregationIsm` 中包含一个 `trustedRelayerIsm`。 + +这意味着 `relayer` 地址将被允许调用 Warp Route 的 `handle()` 函数。换句话说,`relayer` 可以在 Warp Route 上执行任意消息。在自我中继功能之外的情况下,这可能是不希望的。 + +默认情况下,`warp read` 会将输出保存到 `CURRENT_DIR/configs/warp-route-deployment.yaml`。按照以下步骤使用 CLI 更新配置。 + +## 步骤 1:配置 + +通过从 `modules` 中**移除** `trustedRelayerIsm` 块来更新 `warp-route-deployment.yaml`。或者,您也可以根据需要配置整个 `modules` 块。 + +```diff title="warp-route-deployment.yaml" +yourchain: + mailbox: '0x979Ca5202784112f4738403dBec5D0F3B9daabB9' + owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' + interchainSecurityModule: + address: '0xd54d32cD6a62482497252D59E6cCC1445fF0b92d' + type: 'staticAggregationIsm' + modules: +- - address: '0x50b6dA835D9b8b20523891410a2E042855B465C8' +- relayer: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' +- type: trustedRelayerIsm + - owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' + address: '0xcE512189fF1BD41186E9eDda02BF321Fb1FC6eAc' + type: 'defaultFallbackRoutingIsm' + domains: {} + threshold: 1 + name: Ether + symbol: ETH + decimals: 18 + totalSupply: 0 + type: native +``` + +## 步骤 2:应用更改 + +使用 CLI 执行以下命令: + + + +您应该会看到一系列链上交易被执行,最后会有一条消息表明 warp 配置已更新。 + +## 步骤 3:确认 + +要使用 Hyperlane CLI 确认可信中继器已成功移除,请使用您的代币符号和部署链运行以下命令: + + + +运行 `warp read` 后,确认可信中继器 ISM 已从您的 warp route 中移除(在本例中,应该只包含剩余的 `defaultFallbackRoutingIsm`)。您应该在 `interchainSecurityModule` 下看到类似的配置: + +```yaml {8-11} +yourchain: + mailbox: "0x979Ca5202784112f4738403dBec5D0F3B9daabB9" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + interchainSecurityModule: + address: "0x8af9445d8A3FbFBd1D5dF185B8a4533Ab060Cf36" + type: "staticAggregationIsm" + modules: + - owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + address: "0xBe0232d5d45f9aD8322C2C4F84c39e64302Cd996" + type: "defaultFallbackRoutingIsm" + domains: {} + threshold: 1 + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: 0 + type: "native" +``` + +完成这些步骤后,您已成功从 Warp Route 中移除了可信中继器 ISM,并增强了 warp route 设置的安全性。您的 warp route 现在已准备好用于生产环境。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/token-faucets.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/token-faucets.mdx new file mode 100644 index 00000000..d926410a --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/token-faucets.mdx @@ -0,0 +1,26 @@ +# 代币来源和水龙头 + +## 主网代币来源 + +| 网络 | ​你真的需要问吗? | +| --------- | ---------------------------- | +| Avalanche | 大多数主要交易所 | +| BSC | 币安、FTX、库币 | +| Polygon | 大多数主要交易所 | +| Celo | 币安、Coinbase、库币 | +| Arbitrum | 大多数主要交易所或官方桥 | +| Optimism | 大多数主要交易所或官方桥 | +| Ethereum | 大多数主要交易所 | +| Moonbeam | 币安、Coinbase、库币 | + +## 测试网代币来源 + +| 测试网 | ​水龙头链接 | ​数量 | +| -------------- | ------------------------------------------------------------------------------- | ---------------------------- | +| Alfajores | [​​Alfrajores 代币水龙头](https://faucet.celo.org/) | 5 CELO | +| Mumbai | [​​Polygon 水龙头](https://faucet.polygon.technology/) | 使用 alchemy 账户可获得 2 MATIC | +| Fuji | [Avalanche 水龙头​​](https://faucet.avax.network/) | 2 AVAX | +| BSC Testnet | [​​BNB Smart Chain 水龙头](https://testnet.bnbchain.org/faucet-smart) | 0.5 BNB | +| Moonbase Alpha | [​​Moonbase Alpha 水龙头](https://apps.moonbeam.network/moonbase-alpha/faucet/) | 1 DEV | +| Calibration | [Filecoin 水龙头](https://faucet.calibnet.chainsafe-fil.io/) | 5 tFIL | +| Sepolia | [Sepolia 水龙头](https://sepoliafaucet.com/) | 0.5 ETH | diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/transfer-mailbox-ownership.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/transfer-mailbox-ownership.mdx new file mode 100644 index 00000000..1bcf2ece --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/transfer-mailbox-ownership.mdx @@ -0,0 +1,102 @@ +import PrerequisitesPartial from '../partials/core/_prerequisites-config-artifacts.mdx' +import CoreReadChainPartial from '../partials/core/commands/_core-read-chain.mdx' +import CoreApplyChainPartial from '../partials/core/commands/_core-apply-chain.mdx' + +# 如何转移 Hyperlane Mailbox 的所有权 + +# 使用 Hyperlane CLI + +转移 mailbox 所有权最快的方法之一是使用 [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli)。 + + + +:::info +如果您按照[如何使用 Hyperlane 连接您的链](/docs/deploy-hyperlane)指南进行操作,您可能使用单个私钥作为所有者部署了 mailbox。在生产环境中,建议使用多重签名钱包。 +::: + +要使用 Hyperlane CLI 进行确认,请执行以下命令,将 `--chain` 设置为您部署 mailbox 的链的名称: + + + +运行 `core read` 后,您应该看到类似的配置,其中 `owner` 设置为私钥的地址: + +```yaml {8} +defaultHook: + address: "0xE71AC7A1ccB822423576EfFdb0B74564C49BEcBA" + type: merkleTreeHook +defaultIsm: + address: "0x89842f40928f81FC4415b39bfBFC3205eB6161cB" + relayer: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + type: trustedRelayerIsm +owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" +requiredHook: + address: "0x390d29a822C21F57B163F1173cD43382bd643401" + beneficiary: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + maxProtocolFee: "100000000000000000" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + protocolFee: "0" + type: protocolFee +``` + +输出将保存到 `CURRENT_DIR/configs/core-config.yaml`。 + +按照以下步骤使用 CLI 将现有所有权转移到另一个地址。 + +## 步骤 1:更新配置 + +在 `core-config.yaml` 中更新 `owner` 地址: + +```diff title="core-config.yaml" +defaultHook: + address: "0xE71AC7A1ccB822423576EfFdb0B74564C49BEcBA" + type: merkleTreeHook +defaultIsm: + address: "0x89842f40928f81FC4415b39bfBFC3205eB6161cB" + relayer: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + type: trustedRelayerIsm +- owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" ++ owner: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" +requiredHook: + address: "0x390d29a822C21F57B163F1173cD43382bd643401" + beneficiary: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + maxProtocolFee: "100000000000000000" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + protocolFee: "0" + type: protocolFee +``` + +## 步骤 2:应用更改 + +使用 CLI 执行以下命令: + + + +您应该会看到一系列链上交易被执行,最后会有一条消息表明 mailbox 已更新。 + +## 步骤 3:确认 + +要使用 Hyperlane CLI 进行确认,请执行以下命令: + + + +运行 `core read` 后,您应该看到类似的配置,其中显示了更新后的 `owner`: + +```yaml {8} +defaultHook: + address: "0x67F8c06Fd2915728E9D21451E33FbDFbCcd63c44" + type: "merkleTreeHook" +defaultIsm: + address: "0xac7D6df90fa937ADEfE7aD2d4905f0AEa170c467" + relayer: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + type: "trustedRelayerIsm" +owner: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" +requiredHook: + address: "0x1Cd94b4D9B5f0e3474a6bDB8b9503Ca84F53e548" + beneficiary: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + maxProtocolFee: "100000000000000000" + owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + protocolFee: "0" + type: "protocolFee" +``` + +完成这些步骤后,您已成功将 mailbox 的所有权转移并验证到新的地址。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/transfer-warp-route-ownership.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/transfer-warp-route-ownership.mdx new file mode 100644 index 00000000..c95df7a5 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/transfer-warp-route-ownership.mdx @@ -0,0 +1,120 @@ +import PrerequisitesPartial from "../partials/warp-routes/_prerequisites-config-symbol.mdx"; +import WarpReadSymbolChainPartial from "../partials/warp-routes/commands/_warp-read-symbol-chain.mdx"; +import WarpApplySymbolConfigDefaultPartial from "../partials/warp-routes/commands/_warp-apply-symbol-config-default.mdx"; + +# 如何转移 Hyperlane Warp Route 的所有权 + +本指南提供了转移 Hyperlane Warp Route 所有权的分步指导。同时也解释了拥有 Warp Route 所涉及的责任、安全考虑因素和配置选项。 + +## Warp Route 所有权概述 + +在转移 Warp Route 的所有权之前,理解这种所有权的含义很重要。所有权授予对配置设置的控制权,如跨链安全模块(ISM)、验证器选项以及其他关键安全参数。 + +:::info +一旦在链上设置了 mailbox,任何人都可以部署 Warp Route。Warp Routes 通常由几个不同的群体部署 - Abacus Works 团队、资产发行方、链团队或应用程序团队。 +::: + +### 所有权概述 + +- **责任:** 作为所有者,您需要承担管理安全配置的责任,包括 ISM 和验证器设置,以满足您特定的安全和运营目标。 +- **安全性和自主性**:所有权的选择通常取决于安全性和控制偏好。我们强烈建议在任何生产环境中使用多重签名钱包(如 Gnosis Safe)。团队可以选择**完全所有权**以获得完全自主权,或在多重签名钱包上选择**共同所有权**以共享安全管理。共同所有权能够在关键更新上实现协作决策,这可以增加用户和开发者的信任。 + +### ISM、验证器和中继器选项 + +在配置或转移 Warp Route 时,所有者在管理 ISM、验证器和中继器设置方面具有灵活性: + +- **ISM 自定义**:每个 Warp Route 可能需要根据安全需求定制 ISM 配置。所有者可以设置自定义 ISM 或使用 Hyperlane 的默认设置。 +- **验证器选项**:所有权允许您选择或管理验证器集。Hyperlane 可以处理验证器职责,因此运行自己的验证器是可选的。 +- **中继器支持**:Hyperlane 默认提供中继器服务,但团队可以运行自己的中继器以获得更多对安全性、可靠性和性能的控制。这种定制化使团队能够根据特定的性能、合规性或运营要求来调整消息处理。 + +## Warp Route 所有权转移指南 + +## 使用 Hyperlane CLI + +转移 warp route 所有权最快的方法之一是使用 [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli)。 + + + +:::info +如果您按照[部署 Warp Route](https://docs.hyperlane.xyz/docs/guides/deploy-warp-route) 指南操作,您可能使用单个私钥部署了 warp route。在生产环境中,建议使用多重签名钱包。 +::: + +要使用 Hyperlane CLI 进行确认,请找到您的代币符号和部署它的链: + + + +您应该能够选择要更新所有权的 warp route。 + +运行 `warp read` 后,您应该看到类似的配置,其中 `owner` 设置为私钥地址: + +```yaml {3} +yourchain: + mailbox: "0x979Ca5202784112f4738403dBec5D0F3B9daabB9" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + ... +``` + +默认情况下,`warp read` 会将输出保存到 `CURRENT_DIR/configs/warp-route-deployment.yaml`。按照以下步骤使用 CLI 将现有所有权转移到另一个地址。 + +## 步骤 1:配置 + +在 `warp-route-deployment.yaml` 中更新 `owner` 地址 + +```diff title="warp-route-deployment.yaml" +yourchain: + mailbox: '0x979Ca5202784112f4738403dBec5D0F3B9daabB9' +- owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' ++ owner: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045' + interchainSecurityModule: + address: '0xd54d32cD6a62482497252D59E6cCC1445fF0b92d' + type: staticAggregationIsm + modules: + - owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' + address: '0xcE512189fF1BD41186E9eDda02BF321Fb1FC6eAc' + type: defaultFallbackRoutingIsm + domains: {} + threshold: 1 + name: Ether + symbol: ETH + decimals: 18 + totalSupply: 0 + type: native +``` + +## 步骤 2:应用 + +使用 CLI,通过提供代币符号和 warp route 配置来执行: + + + +您应该会看到一系列链上交易被执行,最后会有一条消息表明 warp 配置已更新。 + +## 步骤 3:确认 + +要使用 Hyperlane CLI 确认所有者已成功更新,请使用您的代币符号和部署链运行以下命令: + + + +运行 `warp read` 后,您应该看到类似的配置,其中 `owner` 已更新: + +```yaml {3} +yourchain: + mailbox: "0x979Ca5202784112f4738403dBec5D0F3B9daabB9" + owner: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" + interchainSecurityModule: + address: "0x8af9445d8A3FbFBd1D5dF185B8a4533Ab060Cf36" + type: staticAggregationIsm + modules: + - owner: "0xe738d6e51aad88F6F4ce6aB8827279cffFb94876" + address: "0xBe0232d5d45f9aD8322C2C4F84c39e64302Cd996" + type: defaultFallbackRoutingIsm + domains: {} + threshold: 1 + name: Ether + symbol: ETH + decimals: 18 + totalSupply: 0 + type: native +``` + +完成这些步骤后,您已成功将 Warp Route 的所有权转移并验证到新地址。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/update-mailbox-default-ism.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/update-mailbox-default-ism.mdx new file mode 100644 index 00000000..ae5e62bf --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/update-mailbox-default-ism.mdx @@ -0,0 +1,133 @@ +import PrerequisitesPartial from '../partials/core/_prerequisites-config-artifacts.mdx' +import CoreReadChainPartial from '../partials/core/commands/_core-read-chain.mdx' +import CoreApplyChainPartial from '../partials/core/commands/_core-apply-chain.mdx' + +# 如何更新 Mailbox 默认 ISM + +# 使用 Hyperlane CLI + +首次使用 CLI 部署时,新的 mailbox 会默认使用可信中继器 ISM,这样您就不需要运行中继器或验证器。 + +为了投入生产环境,您需要使用 Hyperlane CLI 移除这个 ISM。 + + + +:::info +如果您按照[如何使用 Hyperlane 连接您的链](/docs/deploy-hyperlane)指南进行操作,您可能使用单个私钥作为所有者部署了 mailbox。在生产环境中,建议使用多重签名钱包。 +::: + +要使用 Hyperlane CLI 进行确认,请执行以下命令,将 `--chain` 设置为您部署 mailbox 的链的名称: + + + +运行 `core read` 后,您应该看到类似的配置,其中 `owner` 设置为私钥的地址: + +```yaml {4-7} +defaultHook: + address: "0xC2E88eC0aB5FDB9756CD3EFEE40D24120fFa6E57" + type: "merkleTreeHook" +defaultIsm: + address: "0xF37395A79f56268FD0040E1f5711e9Af974a545A" + relayer: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + type: "trustedRelayerIsm" +owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" +requiredHook: + address: "0x390d29a822C21F57B163F1173cD43382bd643401" + beneficiary: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + maxProtocolFee: "100000000000000000" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + protocolFee: "0" + type: "protocolFee" +``` + +输出将保存到 `CURRENT_DIR/configs/core-config.yaml`。 + +这个特定的配置有一个 `trustedRelayerIsm`。这意味着回退到 mailbox 的 `defaultIsm` 的合约(例如 warp routes)将授权给 `relayer` 地址执行任意消息的权限。在自我中继功能之外的情况下,这可能是不希望的。 +按照以下步骤使用 CLI 将现有的默认 ISM 更新为不同的配置。 + +## 步骤 1:更新配置 + +您可以选择将 `relayer` 地址更新为其他地址(例如,通过将其设置为不可访问的地址来"销毁"它)。 + +```diff title="core-config.yaml" +defaultHook: + address: "0xC2E88eC0aB5FDB9756CD3EFEE40D24120fFa6E57" + type: merkleTreeHook +defaultIsm: + address: "0xF37395A79f56268FD0040E1f5711e9Af974a545A" +- relayer: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" ++ relayer: "0x0000000000000000000000000000000000000001" + type: trustedRelayerIsm +owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" +requiredHook: + address: "0x4f54055C94DCbC2b502146D46909A2cC7461c5D8" + beneficiary: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + maxProtocolFee: "100000000000000000" + owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + protocolFee: "0" + type: protocolFee +``` + +或者,您也可以将 `defaultIsm` 配置更新为不同的 ISM 配置。如下所示,它被更新为 `messageIdMultisigIsm`。 + +:::warning +配置 ISM 是一个高级功能,需要了解不同 ISM 类型以及它们如何在拓扑结构中协同工作。 +::: + +```diff title="core-config.yaml" +defaultHook: + address: "0xC2E88eC0aB5FDB9756CD3EFEE40D24120fFa6E57" + type: merkleTreeHook +defaultIsm: +- address: "0xF37395A79f56268FD0040E1f5711e9Af974a545A" +- relayer: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" +- type: trustedRelayerIsm ++ threshold: 1 ++ type: messageIdMultisigIsm ++ validators: ++ - "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" +owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" +requiredHook: + address: "0x4f54055C94DCbC2b502146D46909A2cC7461c5D8" + beneficiary: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + maxProtocolFee: "100000000000000000" + owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + protocolFee: "0" + type: protocolFee +``` + +## 步骤 2:应用更改 + +使用 CLI 执行以下命令: + + + +您应该会看到一系列链上交易被执行,最后会有一条消息表明 mailbox 已更新。 + +## 步骤 3:确认 + +要使用 Hyperlane CLI 进行确认,请执行以下命令: + + + +运行 `core read` 后,您应该看到类似的配置,其中显示了更新后的默认 ISM: + +```yaml {6} +defaultHook: + address: "0x67F8c06Fd2915728E9D21451E33FbDFbCcd63c44" + type: "merkleTreeHook" +defaultIsm: + address: "0xac7D6df90fa937ADEfE7aD2d4905f0AEa170c467" + relayer: "0x0000000000000000000000000000000000000001" + type: "trustedRelayerIsm" +owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" +requiredHook: + address: "0x1Cd94b4D9B5f0e3474a6bDB8b9503Ca84F53e548" + beneficiary: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + maxProtocolFee: "100000000000000000" + owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + protocolFee: "0" + type: "protocolFee" +``` + +完成这些步骤后,您已成功更新了 mailbox 默认 ISM 并增强了 mailbox 的安全性。您的 mailbox 现在已准备好用于生产环境。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/intro.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/intro.mdx new file mode 100644 index 00000000..4c0b8662 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/intro.mdx @@ -0,0 +1,19 @@ +# Hyperlane 简介 + +## 什么是 Hyperlane? + +Hyperlane 是一个无需许可的跨链通信互操作协议。它支持在不同区块链之间进行消息传递和资产转移,无需依赖中心化中介,也无需任何许可。 + +## 为什么选择 Hyperlane? + +Hyperlane 的无需许可设计意味着任何人都可以将 Hyperlane [部署](https://docs.hyperlane.xyz/docs/deploy-hyperlane)到任何区块链环境中,无论是第一层区块链、扩容层还是应用链,都可以立即开始构建跨链应用程序——无需审批,无需中介。这使开发者能够完全控制其 dApp 在多链环境中的运作方式,消除瓶颈并实现可扩展性。 + +Hyperlane 的设计注重模块化,其[跨链安全模块(ISM)](https://docs.hyperlane.xyz/docs/protocol/ISM/modular-security)允许开发者根据应用程序的需求来配置、组合和自定义其安全模型。 + +## 开始使用 Hyperlane 构建 + +一些可以直接部署的预构建示例包括: + +1. [Warp Routes](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-overview),允许原生代币和 `ERC20` 代币在链间无缝移动 +2. [跨链账户](https://docs.hyperlane.xyz/docs/reference/applications/interchain-account),允许一个链上的账户(例如 DAO)在远程链上进行智能合约调用 +3. 跨链查询,允许一个链上的账户在远程链上进行视图调用 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/agent-config.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/agent-config.mdx new file mode 100644 index 00000000..7625be34 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/agent-config.mdx @@ -0,0 +1,62 @@ +# 代理配置 + +所有代理都使用相同的配置方法,这是一种多层配置方法,允许轻松覆盖默认配置。每一层都会覆盖前一层中重叠的值。 + +## 配置层级 + +1. 来自"默认部署"的基础配置位于[代码库](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/main/config)中,所有这些配置都会自动加载。 +2. 通过 `CONFIG_FILES` 环境变量传入的配置文件会在下一步加载;这个环境变量应该是一个逗号分隔的 JSON 文件路径列表,这些文件将按照从前到后的顺序加载。 +3. 接下来会读取带有 `HYP_` 前缀的环境变量。 +4. 然后读取带有 `HYP__` 前缀的环境变量,这些变量仅适用于当前代理。例如,`RELAYER`、`VALIDATOR` 和 `SCRAPER` 只会读取它们各自的前缀。 +5. 最后读取命令行参数。 + +## 命令行参数 + +命令行参数在应用程序名称后添加,例如 `./relayer --originChainNames="test1,test2,test3"` + +支持以下格式: + +* `--argName argValue` +* `--argName "argValue"` +* `--argName 'argValue'` +* `--argName=argValue` +* `--argName="argValue"` +* `--argName='argValue'` + +参数名称不区分大小写,所以在本指南中我们可能会以驼峰式显示它们以便于阅读,但 `--argName` 等同于 `--ARGNAME` 和 `--argname`。 + +示例: + +* `{ "db": "/path/to/dir" }` 可以通过 `--db "/path/to/dir"` 设置 +* `{ "chains": { "ethereum": { "name": "ethereum" } } }` (简写为 `chains.ethereum.name` 或 `chains..name`)可以通过 `--chains.ethereum.name ethereum` 设置 +* `{ "chains": { "avalanche": { "customRpcUrls": "https://some-url.com" } } }` (简写为 `chains..customrpcurls`)可以通过 `--chains.avalanche.customrpcurls "https://some-url.com"` 设置 + +## 环境变量 + +对于不需要保密且不需要每次运行时更改的内容,配置文件格式是首选的设置方式,因为它是最容易检查和编辑的格式。文件中的每个配置值都可以作为环境变量设置,只要使用正确的名称,但是有一些环境变量(如 `CONFIG_FILES`)不能在配置文件中设置。 + +`HYP_` 和 `HYP__` 是等效的前缀,唯一的区别是它们的加载顺序,它们可以引用配置文件中的所有配置值。 + +环境变量名称将是这两个前缀之一,然后是由下划线分隔的大写路径组件,指向配置值。 + +例如: + +* `{ "db": "/path/to/dir" }` 可以通过 `HYP_DB="/path/to/dir"` 或 `HYP_RELAYER_DB="/path/to/dir"` 设置 +* `{ "chains": { "ethereum": { "name": "ethereum" } } }` (简写为 `chains.ethereum.name` 或 `chains..name`)可以通过 `HYP_CHAINS_ETHEREUM_NAME="ethereum"` 或 `HYP_VALIDATOR_CHAINS_ETHEREUM_NAME="ethereum"` 或 `HYP_RELAYER_CHAINS_ETHEREUM_NAME="ethereum"` 等设置 +* `{ "chains": { "avalanche": { "customRpcUrls": "https://some-url.com" } } }` (简写为 `chains..customrpcurls`)可以通过 `HYP_CHAINS_AVALANCHE_CUSTOMRPCURLS="https://some-url.com"` 或 `HYP_VALIDATOR_AVALANCHE_CUSTOMRPCURLS="https://some-url.com"` 等设置 + +## Docker 中的配置文件 + +在 Docker 中运行代理会增加一层复杂性,因为配置文件需要在 Docker 容器内可访问。可以在[代码库](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/main/config)中找到的基础配置已经是提供的 Docker 镜像的一部分,默认情况下会加载所有这些配置。 + +挂载单个配置文件可以使用标志 `--mount type=bind,source=$LOCAL_CONFIG_PATH,target=/config/$CONFIG_NAME,readonly`,然后将配置文件添加到 `CONFIG_FILES` 中以便加载。 + +挂载整个目录可以使用标志 `--mount source=$LOCAL_CONFIG_DIR_PATH,target=/config,readonly`,然后将你想要加载的单个配置文件添加到 `CONFIG_FILES` 中。 + +例如,假设你在本地机器的路径 `/home/workspace/ethereum.json` 有一个配置文件,并想用它运行验证者。 + +```bash +docker run -it --mount type=bind,source=/home/workspace/ethereum.json,target=/config/ethereum.json,readonly -e CONFIG_FILES=/config/ethereum.json $DOCKER_IMAGE ./validator +``` + +`source` 路径是你本地机器上的路径,`target` 路径是源路径内容在 Docker 容器内可用的位置,`CONFIG_FILES` 应该指定来自目标路径的配置。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/config-reference.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/config-reference.mdx new file mode 100644 index 00000000..c61b5d66 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/config-reference.mdx @@ -0,0 +1,1982 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# 配置参考 + +## CONFIG_FILES + +**描述:**(仅环境变量)按顺序加载的额外配置文件路径列表(例如 `hyperlane-monorepo/rust/main/config` 中的文件)。它们将按照从前到后的顺序合并,所以如果第一个和最后一个文件都指定了特定的配置路径,将使用最后列出的文件中设置的值。 + +这些文件必须在你的代理能够访问的文件系统中。如果你在 Docker 中运行,请参阅[代理配置指南](./agent-config.mdx#config-files-with-docker)以了解如何将配置文件挂载到 Docker 容器中的提示。 + +**可选:** 是 + +**代理:** 所有 + +**类型:** `string`(逗号分隔的文件路径列表) + + + +不支持作为参数 + + + +```bash +export CONFIG_FILES='./config/ethereum/my-config.json,./config/ethereum/my-validator-config.json' +``` + + + +不支持在配置文件中使用 + + + +## chains + +**描述:** 代理必须使用的每个链的配置。 + +**可选:** 否 + +**代理:** 所有 + +**类型:** `Map`(参见 `chains.*` 了解 `ChainSetup` 值) + + + +```bash +--chains.${CHAIN_NAME}.* +``` + + + +```bash +export HYP_CHAINS_${CHAIN_NAME}_*="...." +export HYP_CHAINS_ETHEREUM_*="...." +``` + + + +```json +{ + "chains": { + "``": {}, + "ethereum": {} + } +} +``` + + + +## chains.``.name + +**描述:** 域的名称。允许为域指定一个不同于链的真实名称。这_几乎总是_应该与 `chain_name` 相同。 + +**要求:** 如果是已知的域名,需要与域 ID 对齐。 + +**可选:** 否 + +**代理:** 所有 + +**类型:** `string` + + + +```sh +--chains.${CHAIN_NAME}.name $DOMAIN_NAME +--chains.ethereum.name ethereum +``` + + + +```bash +export HYP_CHAINS_${CHAIN_NAME}_NAME="$DOMAIN_NAME" +export HYP_CHAINS_ETHEREUM_NAME="ethereum" +``` + + + +```json +{ + "chains": { + "``": { + "name": "" + }, + "ethereum": { + "name": "ethereum" + } + } +} +``` + + + +## chains.``.domain + +**描述:** 用于唯一标识域的 Hyperlane 域 ID。参见:[域标识符](../reference/domains.mdx)。 + +**要求:** 如果是已知域,需要与域名对齐。 + +**可选:** 否 + +**代理:** 所有 + +**类型:** `Numeric (string | number)` + + + +```bash +--chains.${CHAIN_NAME}.domain $DOMAIN_ID +--chains.ethereum.domain 1 +``` + + + +```sh +export HYP_CHAINS_${CHAIN_NAME}_DOMAIN="$DOMAIN_NAME" +export HYP_CHAINS_ETHEREUM_DOMAIN=1 +``` + + + +```json +{ + "chains": { + "``": { + "domain": "" + }, + "ethereum": { + "domain": 1 + } + } +} +``` + + + +## chains.``.mailbox + +**描述:** 链上邮箱合约的地址。参见[合约地址](../reference/contract-addresses.mdx)。 + +**可选:** 否 + +**代理:** 所有 + +**类型:** `Hash (string)` + + + +```bash +--chains.${CHAIN_NAME}.mailbox "$MAILBOX_ADDRESS" +--chains.ethereum.mailbox "0x35231d4c2D8B8ADcB5617A638A0c4548684c7C70" +``` + + + +```sh +export HYP_CHAINS_${CHAIN_NAME}_MAILBOX="$MAILBOX_ADDRESS" +export HYP_CHAINS_ETHEREUM_MAILBOX="0x35231d4c2D8B8ADcB5617A638A0c4548684c7C70" +``` + + + +```json +{ + "chains": { + "``": { + "addresses": { + "mailbox": "" + } + }, + "ethereum": { + "addresses": { + "mailbox": "0x35231d4c2D8B8ADcB5617A638A0c4548684c7C70" + } + } + } +} +``` + + + +## chains.``.interchainGasPaymaster + +**描述:** 链上跨链 gas 支付合约的地址。参见[合约地址](../reference/contract-addresses.mdx)。 + +**可选:** 否 + +**代理:** 所有 + +**类型:** `Hash (string)` + + + +```bash +--chains.${CHAIN_NAME}.interchainGasPaymaster "$IGP_ADDRESS" +--chains.ethereum.interchainGasPaymaster "0x6cA0B6D22da47f091B7613223cD4BB03a2d77918" +``` + + + +```sh +export HYP_CHAINS_${CHAIN_NAME}_INTERCHAINGASPAYMASTER="$IGP_ADDRESS" +export HYP_CHAINS_ETHEREUM_INTERCHAINGASPAYMASTER="0x6cA0B6D22da47f091B7613223cD4BB03a2d77918" +``` + + + +```json +{ + "chains": { + "``": { + "addresses": { + "interchainGasPaymaster": "" + } + }, + "ethereum": { + "addresses": { + "interchainGasPaymaster": "0x6cA0B6D22da47f091B7613223cD4BB03a2d77918" + } + } + } +} +``` + + + +## chains.``.validatorAnnounce + +**描述:** 链上验证者公告合约的地址。参见[合约地址](../reference/contract-addresses.mdx)。 + +**可选:** 否 + +**代理:** 所有 + +**类型:** `Hash (string)` + + + +```bash +--chains.${CHAIN_NAME}.validatorAnnounce "$VALIDATOR_ANNOUNCE_ADDRESS" +--chains.ethereum.validatorAnnounce "0x9bBdef63594D5FFc2f370Fe52115DdFFe97Bc524" +``` + + + +```sh +export HYP_CHAINS_${CHAIN_NAME}_VALIDATORANNOUNCE="$VALIDATOR_ANNOUNCE_ADDRESS" +export HYP_CHAINS_ETHEREUM_VALIDATORANNOUNCE="0x9bBdef63594D5FFc2f370Fe52115DdFFe97Bc524" +``` + + + +```json +{ + "chains": { + "``": { + "addresses": { + "validatorAnnounce": "" + } + }, + "ethereum": { + "addresses": { + "validatorAnnounce": "0x9bBdef63594D5FFc2f370Fe52115DdFFe97Bc524" + } + } + } +} +``` + + + +## chains.``.merkleTreeHook + +**描述:** 链上 merkle 树钩子合约的地址。参见[合约地址](../reference/contract-addresses.mdx)。 + +**可选:** 否 + +**代理:** 所有 + +**类型:** `Hash (string)` + + + +```bash +--chains.${CHAIN_NAME}.merkleTreeHook "$MERKLE_TREE_HOOK_ADDRESS" +--chains.ethereum.merkleTreeHook "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA" +``` + + + +```sh +export HYP_CHAINS_${CHAIN_NAME}_MERKLETREEHOOK="$MERKLE_TREE_HOOK_ADDRESS" +export HYP_CHAINS_ETHEREUM_MERKLETREEHOOK="0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA" +``` + + + +```json +{ + "chains": { + "``": { + "addresses": { + "merkleTreeHook": "" + } + }, + "ethereum": { + "addresses": { + "merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA" + } + } + } +} +``` + + + +## chains.``.signer + +**描述:** 应该用于此链的签名者 + +**可选:** 是(如果未指定,将使用 `defaultsigner`) + +**代理:** 所有 + +**类型:** `SignerConf (Object)` + + + +```bash +--chains.${CHAIN_NAME}.signer.* +``` + + + +```bash +export HYP_CHAINS_${CHAIN_NAME}_SIGNER_*="...." +``` + + + +```json +{ + "chains": { + "``": { + "signer": {} + }, + "ethereum": { + "signer": {} + } + } +} +``` + + + +## chains.``.signer.type + +**描述:** 定义的签名者类型。`HexKey` 签名者使用私钥,`Aws` 签名者使用基于 AWS 的 KMS,而 `Node` 假定本地节点将签署 RPC 调用。 + +**可选:** 是;默认为 `node`,除非指定了 `key`,在这种情况下默认为 `hexKey` + +**代理:** 所有 + +**类型:** `枚举 ("hexKey" | "aws" | "cosmosKey" | "node")` + +不同 VM 接受的值: +- EVM:`hexKey`(ECDSA)或 `aws`(ECDSA) +- sealevel:`hexKey`(ED25519) +- cosmos:`cosmosKey` + + + +```bash +--chains.${CHAIN_NAME}.signer.type hexKey +--chains.ethereum.signer.type node +``` + + + +```bash +export HYP_CHAINS_${CHAIN_NAME}_SIGNER_TYPE="hexKey" +export HYP_CHAINS_ETHEREUM_SIGNER_TYPE="node" +``` + + + +```json +{ + "chains": { + "``": { + "signer": { + "type": "hexKey" + } + }, + "ethereum": { + "signer": { + "type": "node" + } + } + } +} +``` + + + +## chains.``.signer.key + +**描述:** 十六进制密钥。私钥的十六进制字符串。 + +**要求:** `chains..signer.type = "hexKey" | undefined` + +**可选:** 否(如果满足要求) + +**代理:** 所有 + +**类型:** `string` + + + +```bash +--chains.${CHAIN_NAME}.signer.key "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" +``` + + + +```bash +export HYP_CHAINS_${CHAIN_NAME}_SIGNER_KEY="8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" +``` + + + +```json +{ + "chains": { + "``": { + "signer": { + "key": "" + } + }, + "ethereum": { + "signer": { + "key": "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" + } + } + } +} +``` + + + +## chains.``.signer.id + +**描述:** 标识 AWS KMS 密钥的 UUID + +**要求:** `chains..signer.type = "aws"` + +**可选:** 否(如果满足要求) + +**代理:** 所有 + +**类型:** `string` + + + +```bash +--chains.ethereum.signer.type "alias/validator-signer-ethereum" +``` + + + +```bash +export HYP_CHAINS_${CHAIN_NAME}_SIGNER_ID="alias/validator-signer-ethereum" +``` + + + +```json +{ + "chains": { + "ethereum": { + "signer": { + "type": "aws", + "id": "alias/validator-signer-ethereum" + } + } + } +} +``` + + + +## chains.``.signer.region + +**描述:** AWS 区域 + +**要求:** `chains..signer.type = "aws"` + +**可选:** 否(如果满足要求) + +**代理:** 所有 + +**类型:** `string` + + + +```bash +--chains.${CHAIN_NAME}.signer.region us-east-1 +``` + + + +```bash +export HYP_CHAINS_${CHAIN_NAME}_SIGNER_REGION="us-east-1" +``` + + + +```json +{ + "chains": { + "``": { + "signer": { + "type": "aws", + "region": "us-east-1" + } + } + } +} +``` + + + +## chains.``.protocol + +**描述:** 要使用的连接协议。 + +**可选:** 默认为 `"ethereum"` + +**代理:** 所有 + +**类型:** `枚举 ("ethereum" | "fuel")` + + + +```bash +--chains.${CHAIN_NAME}.protocol ethereum +--chains.ethereum.protocol ethereum +``` + + + +```sh +export HYP_CHAINS_${CHAIN_NAME}_PROTOCOL="ethereum" +export HYP_CHAINS_ARBITRUM_PROTOCOL="ethereum" +``` + + + +```json +{ + "chains": { + "``": { + "protocol": "" + }, + "arbitrum": { + "protocol": "ethereum" + } + } +} +``` + + + +## chains.``.rpcConsensusType + +:::info + +**共识类型目前仅适用于 EVM 链。** + +非 EVM 链的连接仅支持单个 RPC URL。如果在 [rpcUrls](#chainschain_namerpcurls) 中指定了多个 RPC URL,则只会使用第一个。 + +::: + +**描述:** 指定如何处理多个 RPC URL 的共识类型。 + +- `single`:只使用第一个可用的 RPC URL。 +- `quorum`:使用所有 RPC URL,并等待法定人数(超过一半)的响应一致。 +- `fallback`:按顺序尝试每个 RPC URL,直到获得成功响应。 + +**要求:** 必须指定 [rpcUrls](#chainschain_namerpcurls) + +**可选:** 默认为 `"single"` + +**代理:** 所有 + +**类型:** `枚举 ("single" | "quorum" | "fallback")` + + + +```bash +--chains.${CHAIN_NAME}.rpcConsensusType "single" +--chains.ethereum.rpcConsensusType "single" +``` + + + +```sh +export HYP_CHAINS_${CHAIN_NAME}_RPCCONSENSUSTYPE="single" +export HYP_CHAINS_ETHEREUM_RPCCONSENSUSTYPE="single" +``` + + + +```json +{ + "chains": { + "``": { + "rpcConsensusType": "single" + }, + "ethereum": { + "rpcConsensusType": "single" + } + } +} +``` + + + +## chains.``.customRpcUrls + +:::info + +非 EVM 链的连接仅支持单个 RPC URL。如果指定了多个 RPC URL,则只会使用第一个。 + +::: + +**描述:** 用于连接提供者的逗号分隔 URL。`customRpcUrls` 和 [rpcUrls](#chainschain_namerpcurls) 的区别在于 `customRpcUrls` 允许从命令行或环境变量中使用更友好的输入方式(逗号分隔而不是数组)。 + +**类型:** `string`(不带空格的逗号分隔 URL 列表) + + + +```bash +--chains.${CHAIN_NAME}.customrpcurls "$CONNECTION_URLS" +--chains.ethereum.customrpcurls "http://127.0.0.1:8545,http://127.0.0.1:8546,http://127.0.0.1:8547" +``` + + + +```sh +export HYP_CHAINS_${CHAIN_NAME}_CUSTOMRPCURLS="$CONNECTION_URLS" +export HYP_CHAINS_ETHEREUM_RPCURLS_2_HTTPS="http://127.0.0.1:8545,http://127.0.0.1:8546,http://127.0.0.1:8547" +``` + + + +```json +{ + "chains": { + "``": { + "rpcUrls": "" + }, + "ethereum": { + "rpcUrls": "http://127.0.0.1:8545,http://127.0.0.1:8546,http://127.0.0.1:8547" + } + } +} +``` + + + +## chains.``.rpcUrls + +:::info + +非 EVM 链的连接仅支持单个 RPC URL。如果在 [rpcUrls](#chainschain_namerpcurls) 中指定了多个 RPC URL,则只会使用第一个。 + +::: + +**描述:** 用于连接提供者的 URL 数组。 + +**要求:** 必须指定 [rpcConsensusType](#chainschain_namerpcconsensustype) + +**可选:** 否 + +**代理:** 所有 + +**类型:** `string[]` + + + +```bash +--chains.${CHAIN_NAME}.rpcurls.0.https "$CONNECTION_URL_0" +--chains.${CHAIN_NAME}.rpcurls.1.https "$CONNECTION_URL_1" +--chains.${CHAIN_NAME}.rpcurls.2.https "$CONNECTION_URL_2" +--chains.ethereum.rpcurls.0.https "http://127.0.0.1:8545" +--chains.ethereum.rpcurls.1.https "http://127.0.0.1:8546" +--chains.ethereum.rpcurls.2.https "http://127.0.0.1:8547" +``` + + + +```sh +export HYP_CHAINS_${CHAIN_NAME}_RPCURLS_0_HTTPS="$CONNECTION_URL_0" +export HYP_CHAINS_${CHAIN_NAME}_RPCURLS_1_HTTPS="$CONNECTION_URL_1" +export HYP_CHAINS_${CHAIN_NAME}_RPCURLS_2_HTTPS="$CONNECTION_URL_2" +export HYP_CHAINS_ETHEREUM_RPCURLS_0_HTTPS="http://127.0.0.1:8545" +export HYP_CHAINS_ETHEREUM_RPCURLS_1_HTTPS="http://127.0.0.1:8546" +export HYP_CHAINS_ETHEREUM_RPCURLS_2_HTTPS="http://127.0.0.1:8547" +``` + + + +```json +{ + "chains": { + "``": { + "rpcUrls": [ + { + "http": "" + }, + { + "http": "" + } + ], + }, + "ethereum": { + "rpcUrls": [ + { + "http": "http://127.0.0.1:8545" + }, + { + "http": "http://127.0.0.1:8546" + } + ], + } + } +} +``` + + + +## chains.``.index.from + +**描述:** 开始索引合约的区块高度。 + +**可选:** 默认为 `0` + +**代理:** 中继者 & 抓取器 + +**类型:** `数值 (string | number)` + + + +```bash +--chains.${CHAIN_NAME}.index.from 0 +--chains.ethereum.index.from 16271503 +``` + + + +```sh +export HYP_CHAINS_${CHAIN_NAME}_INDEX_FROM=0 +export HYP_CHAINS_ETHEREUM_INDEX_FROM=16271503 +``` + + + +```json +{ + "chains": { + "``": { + "index": { + "from": 0 + } + }, + "ethereum": { + "index": { + "from": 16271503 + } + } + } +} +``` + + + +## chains.``.index.chunk + +**描述:** 索引合约时一次查询的区块数量。注意,配置的提供者必须支持设置的任何值。默认值应该适用于几乎所有提供者。 + +**可选:** 默认为 `1999` + +**代理:** 中继者 & 抓取器 + +**类型:** `数值 (string | number)` + + + +```bash +--chains.${CHAIN_NAME}.index.chunk 1999 +--chains.ethereum.index.chunk 1999 +``` + + + +```sh +export HYP_CHAINS_${CHAIN_NAME}_INDEX_CHUNK=1999 +export HYP_CHAINS_ETHEREUM_INDEX_CHUNK=1999 +``` + + + +```json +{ + "chains": { + "``": { + "index": { + "chunk": 1999 + } + }, + "ethereum": { + "index": { + "chunk": 1999 + } + } + } +} +``` + + + +## defaultsigner + +:::info + +由于每个虚拟机支持不同的签名者类型,默认签名者只能支持单一虚拟机类型。例如,如果默认签名者是 ECDSA 类型的,它将只能在 EVM 链上签名。 + +::: + +**描述:** 所有未指定自己的签名者的链应该使用的默认签名者。 + +**可选:** 是 + +**代理:** 所有 + +**类型:** `SignerConf (对象)` + + + +``` +--defaultSigner.* +``` + + + +```bash +export HYP_DEFAULTSIGNER_*="...." +``` + + + +```json +{ + "defaultsigner": {} +} +``` + + + +## defaultsigner.type + +**描述:** 定义的签名者类型。`HexKey` 签名者使用私钥,`Aws` 签名者使用基于 AWS 的 KMS,而 `Node` 则假定本地节点将签名 RPC 调用。 + +**可选:** 是;默认为 `node`,除非指定了 `key`,在这种情况下默认为 `hexKey` + +**代理:** 所有 + +**类型:** `枚举 ("hexKey" | "aws" | "cosmosKey" | "node")` + + + +``` +--defaultSigner.type hexKey +``` + + + +```bash +export HYP_DEFAULTSIGNER_TYPE="hexKey" +``` + + + +```json +{ + "defaultsigner": { + "type": "hexKey" + } +} +``` + + + +## defaultsigner.key + +**描述:** 十六进制密钥。私钥的十六进制字符串。 + +**要求:** `defaultsigner.type = "hexKey" | undefined` + +**可选:** 否(如果满足要求) + +**代理:** 所有 + +**类型:** `string` + + + +```bash +--defaultSigner.key "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" +``` + + + +```bash +export HYP_DEFAULTSIGNER_KEY="8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" +``` + + + +```json +{ + "defaultsigner": { + "type": "hexKey", + "key": "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" + } +} +``` + + + +## defaultsigner.id + +**描述:** 标识 AWS KMS 密钥的 UUID + +**要求:** `defaultsigner.type = "aws"` + +**可选:** 否(如果满足要求) + +**代理:** 所有 + +**类型:** `string` + + + +```bash +--defaultSigner.id "alias/validator-signer-ethereum" +``` + + + +```bash +export HYP_DEFAULTSIGNER_ID="alias/validator-signer-ethereum" +``` + + + +```json +{ + "defaultsigner": { + "type": "aws", + "id": "alias/validator-signer-ethereum" + } +} +``` + + + +## defaultsigner.region + +**描述:** AWS 区域 + +**要求:** `defaultsigner.type = "aws"` + +**可选:** 否(如果满足要求) + +**代理:** 所有 + +**类型:** `string` + + + +```bash +--defaultSigner.region us-east-1 +``` + + + +```bash +export HYP_DEFAULTSIGNER_REGION="us-east-1" +``` + + + +```json +{ + "defaultsigner": { + "type": "aws", + "region": "us-east-1" + } +} +``` + + + +## metricsport + +**描述:** 用于暴露 Prometheus 指标的端口 + +**可选:** 默认为 `9090` + +**代理:** 所有 + +**类型:** `数值 (string | number)` + + + +```bash +--metrics-port 9090 +``` + + + +```sh +export HYP_METRICSPORT=9090 +``` + + + +```json +{ + "metrics": 9090 +} +``` + + + +## log.fmt + +**描述:** 日志模块的配置。这控制着日志记录。 + +**可选:** 默认为 `pretty` + +**代理:** 所有 + +**类型:** `枚举 ("pretty" | "json" | "full" | "compact")` + + + +```bash +--log.fmt pretty +``` + + + +```bash +export HYP_LOG_FMT="pretty" +``` + + + +```json +{ + "log": { + "fmt": "pretty" + } +} +``` + + + +## log.level + +**描述:** 日志模块的配置。这控制着日志记录。要获得完整的详细程度(包括依赖项),请使用 `dependencyTrace`。 + +**可选:** 默认为 `info` + +**代理:** 所有 + +**类型:** `枚举 ("dependencyTrace" | "trace" | "debug" | "info" | "warn" | "error" | "off")` + + + +```bash +--log.level info +``` + + + +```bash +export HYP_LOG_LEVEL="info" +``` + + + +```json +{ + "log": { + "level": "info" + } +} +``` + + + +## originchainname + +**描述:** 验证者应该验证的链的名称,以及中继者应该从中中继消息的链的名称。**对于中继者已弃用,请改用** [#relaychains](#relaychains)。 + +**可选:** 否 - 验证者;是 - 中继者 + +**代理:** 验证者 & 中继者 + +**类型:** `string` + + + +```bash +--originChainName ethereum +``` + + + +```sh +export HYP_ORIGINCHAINNAME="ethereum" +``` + + + +```json +{ + "originchainname": "ethereum" +} +``` + + + +## validator + +**描述:** 验证者应该使用的签名者。 + +**可选:** 是 + +**代理:** 所有 + +**类型:** `SignerConf (对象)` + + + +```bash +--validator.* +``` + + + +```bash +export HYP_VALIDATOR_*="...." +``` + + + +```json +{ + "validator": {} +} +``` + + + +## validator.type + +**描述:** 定义的 EVM 签名者类型。请注意,无论验证者在哪种 VM 上运行,检查点始终使用 EVM ECDSA 曲线进行签名。`HexKey` 签名者使用私钥,`Aws` 签名者使用基于 AWS 的 KMS,而 `Node` 则假定本地节点将签署 RPC 调用。 + +**可选:** 是;默认为 `node`,除非指定了 `key`,在这种情况下默认为 `hexKey` + +**代理:** 所有 + +**类型:** `枚举 ("hexKey" | "aws" | "node")` + + + +```bash +--validator.type hexKey +``` + + + +```bash +export HYP_VALIDATOR_TYPE="hexKey" +``` + + + +```json +{ + "validator": { + "type": "hexKey" + } +} +``` + + + +## validator.key + +**描述:** 十六进制密钥。私钥的十六进制字符串。 + +**要求:** `validator.type = "hexKey" | undefined` + +**可选:** 否(如果满足要求) + +**代理:** 所有 + +**类型:** `string` + + + +```bash +--validator.key 8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61 +``` + + + +```bash +export HYP_VALIDATOR_KEY="8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" +``` + + + +```json +{ + "validator": { + "type": "hexKey", + "key": "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" + } +} +``` + + + +## validator.id + +**描述:** 标识 AWS KMS 密钥的 UUID + +**要求:** `validator.type = "aws"` + +**可选:** 否(如果满足要求) + +**代理:** 所有 + +**类型:** `string` + + + +```bash +--validator.id "alias/validator-signer-ethereum" +``` + + + +```bash +export HYP_VALIDATOR_ID="alias/validator-signer-ethereum" +``` + + + +```json +{ + "validator": { + "type": "aws", + "id": "alias/validator-signer-ethereum" + } +} +``` + + + +## validator.region + +**描述:** AWS 区域 + +**要求:** `validator.type = "aws"` + +**可选:** 否(如果满足要求) + +**代理:** 所有 + +**类型:** `string` + + + +```bash +--validator.region us-east-1 +``` + + + +```bash +export HYP_VALIDATOR_REGION="us-east-1" +``` + + + +```json +{ + "validator": { + "type": "aws", + "region": "us-east-1" + } +} +``` + + + +## checkpointsyncer.type + +:::info + +**检查点同步器类型** + +检查点同步器类型目前仅适用于验证者。 + +::: + +**描述:** 定义同步检查点的方法 + +**可选:** 否 + +**代理:** 验证者 + +**类型:** `枚举 ("localStorage" | "s3")` + + + +```bash +--checkpointSyncer.type localStorage +``` + + + +```sh +export HYP_CHECKPOINTSYNCER_TYPE="localStorage" +``` + + + +```json +{ + "checkpointsyncer": { + "type": "localStorage" + } +} +``` + + + +## checkpointsyncer.path + +**描述:** 本地存储类型检查点同步器配置在本地磁盘上的路径。 + +**要求:** `checkpointsyncer.type = "localStorage"` + +**可选:** 否(如果满足条件) + +**代理:** 验证者 + +**类型:** `string` + + + +```bash +--checkpointSyncer.path "/tmp/syncer" +``` + + + +```bash +export HYP_CHECKPOINTSYNCER_PATH="/tmp/syncer" +``` + + + +```json +{ + "checkpointsyncer": { + "type": "localStorage", + "path": "/tmp/syncer" + } +} +``` + + + +## checkpointsyncer.bucket + +**描述:** S3 存储桶名称 + +**要求:** `checkpointsyncer.type = "s3"` + +**可选:** 否(如果满足条件) + +**代理:** 验证者 + +**类型:** `string` + + + +```bash +--checkpointSyncer.bucket signatures-ethereum +``` + + + +```sh +export HYP_CHECKPOINTSYNCER_BUCKET="signatures-ethereum" +``` + + + +```json +{ + "checkpointsyncer": { + "type": "s3", + "bucket": "signatures-ethereum" + } +} +``` + + + +## checkpointsyncer.folder + +**描述:** S3 存储桶中的文件夹 + +**要求:** `checkpointsyncer.type = "s3"` + +**可选:** 否(如果满足条件) + +**代理:** 验证者 + +**类型:** `string` + + + +```bash +--checkpointSyncer.folder signatures-ethereum +``` + + + +```sh +export HYP_CHECKPOINTSYNCER_FOLDER="signatures-ethereum" +``` + + + +```json +{ + "checkpointsyncer": { + "type": "s3", + "folder": "signatures-ethereum" + } +} +``` + + + +## checkpointsyncer.region + +**描述:** S3 存储桶区域 + +**要求:** `checkpointsyncer.type = "s3"` + +**可选:** 否(如果满足条件) + +**代理:** 验证者 + +**类型:** `string` + + + +```bash +--checkpointSyncer.region us-east-1 +``` + + + +```sh +export HYP_CHECKPOINTSYNCER_REGION="us-east-1" +``` + + + +```json +{ + "checkpointsyncer": { + "type": "s3", + "region": "us-east-1" + } +} +``` + + + +## interval + +**描述:** 验证者应该每隔多少秒检查新的检查点。另请参阅[延迟](../reference/latencies.mdx)。 + +**可选:** 否 + +**代理:** 验证者 + +**类型:** `数值 (string | number)` + + + +```bash +--interval 30 +``` + + + +```sh +export HYP_INTERVAL=30 +``` + + + +```json +{ + "interval": 30 +} +``` + + + +## db + +**描述:** 这是代理在磁盘上存储相关数据的本地文件系统路径。**每个代理必须是唯一的!**多个代理必须有不同的路径。如果路径不是以系统定义的根路径(如 Unix 上的 `/`)开头,则该路径相对于当前工作目录。使用 docker 镜像时,请确保此文件夹在运行之间得到持久化。 + +对于抓取器,这是连接到 postgresql 数据库的连接字符串。 + +**可选:** 对于验证者和中继者,它是可选的,默认为当前工作目录中包含 `originchainname` 的路径。对于抓取器,它是必需的。 + +**代理:** 所有 + +**类型:** `string` + + + +```bash +# 验证者 +--db "/tmp/hyp/validator/ethereum-cache" + +# 中继者 +--db "/tmp/hyp/relayer/ethereum-cache" + +# 抓取器 +--db "postgresql://postgres:password@localhost:5432/dbname" +``` + + + +```sh +# 验证者 +export HYP_DB="/tmp/hyp/validator/ethereum-cache" + +# 中继者 +export HYP_DB="/tmp/hyp/relayer/ethereum-cache" + +# 抓取器 +export HYP_DB="postgresql://postgres:password@localhost:5432/dbname" +``` + + + +```json +{ + "db": "/tmp/hyp/validator/ethereum-cache" +} +``` + + + +## relaychains + +**描述:** 用于传递消息的链列表。 + +**可选:** 否 + +**代理:** 中继者 + +**类型:** `string`(逗号分隔的链列表) + + + +```bash +--relayChains "arbitrum,ethereum,bsc" +``` + + + +```sh +export HYP_RELAYCHAINS="arbitrum,ethereum,bsc" +``` + + + +```json +{ + "relaychains": "arbitrum,ethereum,bsc" +} +``` + + + +## gaspaymentenforcement + +**描述:** JSON 字符串化的 gas 支付执行配置数组,按优先级从高到低排序。最后一个策略应该是一个全面的策略,用于处理任何未匹配前面策略的消息。 + +**可选:** 默认为无执行(`[{"type": "none"}]`) + +**代理:** 中继者 + +**类型:** `JSON (string)` + +```typescript +type gaspaymentenforcement = Array; + +type GasPaymentEnforcementPolicy = +( // 每种类型特有的字段... + // 无要求 - 所有消息都会被处理,无论 gas 支付情况如何 + { type: "none" } + // 已支付最低金额的消息将被处理 + & { type: "minimum", payment: U256 } + // 根据链上费用报价,已在外部链上支付所需 gas 数量。 + // `gasfraction` 默认为 "1 / 2"。 + & { type: "onChainFeeQuoting", gasfraction?: GasFraction } +) | { // 所有类型都具有以下字段... + // 如果消息匹配,将使用此策略。 + // 如果未指定匹配列表,所有消息都将匹配。 + matchingList?: MatchingList +}; + +// 匹配规则列表。如果列表中任何元素匹配消息,则该消息匹配。 +type MatchingList = Array; + +// 如果提供的任何值匹配,则匹配消息。 +interface MatchingListElement { + originDomain?: NumericFilter + senderAddress?: HashFilter + destinationDomain?: NumericFilter + recipientAddress?: HashFilter +} + +type NumericFilter = Wildcard | U32 | Array; +type HashFilter = Wildcard | H256 | Array; + +// 32位无符号整数 +type U32 = number | string; +// 256位无符号整数;注意:`number` 类型精度有限。 +type U256 = string | number; +// 256位哈希(也可以更少)以十六进制编码 +type H256 = string; +// 匹配任何内容 +type Wildcard = "*"; +// 形如 `{分子} / {分母}` 的数字字符串,例如 "1 / 2" +type GasFraction = string; +``` + + + +```bash +--gasPaymentEnforcement '[{"type": "none", "matchingList": [{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272"}]}, {"type": "minimum", "payment": 100000}]' +``` + + + +```sh +export HYP_GASPAYMENTENFORCEMENT='[{"type": "none", "matchingList": [{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272"}]}, {"type": "minimum", "payment": 100000}]' +``` + + + +```json +{ + "gaspaymentenforcement": "[{"type": "none", "matchingList": [{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272"}]}, {"type": "minimum", "payment": 100000}]" +} +``` + + + +## whitelist + +**描述:** 定义允许哪些消息的匹配列表。任何不匹配此列表的消息都不会被中继。如果未提供白名单,则允许所有消息。 + +另请参阅 [消息过滤](./relayer/message-filtering.mdx) + +**可选:** 是 + +**代理:** 中继者 + +**类型:** `JSON (string)` + +```typescript +// 匹配规则列表。如果列表中任何元素匹配消息,则该消息匹配。 +type MatchingList = Array; + +// 如果提供的任何值匹配,则匹配消息。 +interface MatchingListElement { + originDomain?: NumericFilter + senderAddress?: HashFilter + destinationDomain?: NumericFilter + recipientAddress?: HashFilter +} + +type NumericFilter = Wildcard | U32 | Array; +type HashFilter = Wildcard | H256 | Array; + +// 32位无符号整数 +type U32 = number | string; +// 256位哈希(也可以更少)以十六进制编码 +type H256 = string; +// 匹配任何内容 +type Wildcard = "*"; +``` + + + +```bash +--whitelist '[{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, {"destinationDomain": 1}]' +``` + + + +```sh +export HYP_WHITELIST='[{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, {"destinationDomain": 1}]' +``` + + + +```json +{ + "whitelist": "[{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, {"destinationDomain": 1}]" +} +``` + + + +## blacklist + +**描述:** 定义应忽略哪些消息的匹配列表。任何匹配此列表的消息都不会被中继。如果未提供黑名单,则允许所有消息。 + +另请参阅 [消息过滤](./relayer/message-filtering.mdx) + +**可选:** 是 + +**代理:** 中继者 + +**类型:** `JSON (string)` + +```typescript +// 匹配规则列表。如果列表中任何元素匹配消息,则该消息匹配。 +type MatchingList = Array; + +// 如果提供的任何值匹配,则匹配消息。 +interface MatchingListElement { + originDomain?: NumericFilter + senderAddress?: HashFilter + destinationDomain?: NumericFilter + recipientAddress?: HashFilter +} + +type NumericFilter = Wildcard | U32 | Array; +type HashFilter = Wildcard | H256 | Array; + +// 32位无符号整数 +type U32 = number | string; +// 256位哈希(也可以更少)以十六进制编码 +type H256 = string; +// 匹配任何内容 +type Wildcard = "*"; +``` + + + +```bash +--blacklist '[{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, {"destinationDomain": 1}]' +``` + + + +```sh +export HYP_BLACKLIST='[{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, {"destinationDomain": 1}]' +``` + + + +```json +{ + "blacklist": "[{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, {"destinationDomain": 1}]" +} +``` + + + +## transactiongaslimit + +**描述:** 中继交易允许的最大 gas 限制。 + +**可选:** 默认无限制 + +**代理:** 中继者 + +**类型:** `数值 (string | number)` + + + +```bash +--transactionGasLimit 250000000 +``` + + + +```sh +export HYP_TRANSACTIONGASLIMIT="250000000" +``` + + + +```json +{ + "transactiongaslimit": "250000000" +} +``` + + + +## skiptransactiongaslimitfor + +**描述:** 跳过应用 `transactiongaslimit` 的域 ID 列表。 + +**可选:** 默认对所有域使用 `transactiongaslimit` + +**代理:** 中继者 + +**类型:** `string`(逗号分隔的域 ID 列表) + + + +```bash +--skipTransactionGasLimitFor "43114,10,42220" +``` + + + +```sh +export HYP_SKIPTRANSACTIONGASLIMITFOR="43114,10,42220" +``` + + + +```json +{ + "skiptransactiongaslimitfor": "43114,10,42220" +} +``` + + + +## allowlocalcheckpointsyncers + +**描述:** 是否允许本地 `checkpointsyncer` 类型,如果为 `false` 则会忽略它们。 + +**可选:** 默认为 `false` + +**代理:** 中继者 + +**类型:** `boolean` + + + +```bash +--allowLocalCheckpointSyncers false +``` + + + +```sh +export HYP_ALLOWLOCALCHECKPOINTSYNCERS=false +``` + + + +```json +{ + "allowlocalcheckpointsyncers": false +} +``` + + + +## AWS_ACCESS_KEY_ID + +**描述:** (仅环境变量)验证者的 AWS IAM 用户的访问密钥 ID。 + +**可选:** 如果任何签名者配置使用 `aws`,则必需 + +**代理:** 中继者和验证者 + +**类型:** `string` + + + +不支持作为参数 + + + +```bash +export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE" +``` + + + +不支持在配置文件中使用 + + + +## AWS_SECRET_ACCESS_KEY + +**描述:** (仅环境变量)验证者的 AWS IAM 用户的秘密访问密钥。 + +**可选:** 如果任何签名者配置使用 `aws`,则必需 + +**代理:** 中继者和验证者 + +**类型:** `string` + + + +不支持作为参数 + + + +```bash +export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" +``` + + + +不支持在配置文件中使用 + + diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/deploy-with-terraform.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/deploy-with-terraform.mdx new file mode 100644 index 00000000..eb662f55 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/deploy-with-terraform.mdx @@ -0,0 +1,203 @@ +# 使用 Terraform 部署 + +对于那些更熟悉使用基础设施即代码(Infrastructure-as-Code)工具(如 Terraform)部署到 AWS 的用户,我们在 [**Github 上提供了示例配置**](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/main/terraform),用于在 AWS 上设置 Hyperlane 验证者所需的基础设施。它自动创建运行验证者代理所需的资源,如 ECS 集群、VPC、子网和安全组。 + +:::caution + +提供的配置仅作为运行核心支持网络验证者的_示例_。你可能需要修改验证者模块以支持更高级的配置。建议在生产环境中使用此设置之前进行彻底测试。 + +::: + +## 概述 + +提供的 terraform 配置包含几个关键部分: + +- IAM/KMS 模块:自动为你完成[代理密钥](set-up-agent-keys.mdx)配置。 +- S3 模块:自动为你完成 [AWS 签名存储桶](validators/validator-signatures-aws.mdx)配置。 +- EFS 模块:设置可以挂载到验证者的持久卷。 +- 验证者模块:使用上述模块来运行验证者实例。 +- `global.tf`:验证者可以运行的集群的顶层网络配置。 +- `main.tf`:配置验证者以进行部署。 + +下图展示了它们是如何组合在一起的。 + +```mermaid +graph LR + subgraph VPC_Network ["VPC 网络"] + Subnet -- 受保护于 --> SG[AWS 安全组] + + subgraph SG ["AWS 安全组"] + NATG[AWS NAT 网关] + IGW[AWS 互联网网关] + end + end + + subgraph ECS_Validator ["验证者模块"] + ECSTask[ECS 任务: 验证者] -- 执行于 --> Subnet + end + + subgraph S3_Subgraph ["S3 模块"] + S3Bucket[AWS S3 存储桶] -- 被访问于 --> ECSTask + ECSTask -- 写入到 --> S3Bucket[验证者签名] + end + + subgraph EFS_Subgraph ["EFS 模块"] + EFS[AWS EFS] -- 挂载于 --> ECSTask + end + + subgraph IAM_KMS ["IAM / KMS 模块"] + IAMUser[验证者 IAM 用户] + KMSKey[KMS 密钥] + end + + Internet -- 访问指标 --> IGW + NATG -- RPC 调用 --> Internet + + %% 额外的互连 + ECSTask -- 使用签名 --> KMSKey + ECSTask -- 权限来自 --> IAMUser + +``` + +## 使用方法 + +作为先决条件,你需要安装 Terraform 并配置好带有你的凭证的 AWS CLI。 + +要初始化 terraform 状态: + +```bash +terraform init +``` + +要生成基础设施变更计划: + +```bash +terraform plan +``` + +要预览并应用基础设施变更: + +```bash +terraform apply +``` + +要列出 KMS、IAM 或 S3 等信息的输出,你需要解析 JSON 输出: + +```bash +terraform output -json +``` + +## 模块 + +存在几个模块,你可以选择由 terraform 管理验证者设置的哪些部分。 + +### IAM / KMS + +`iam_kms` 模块创建一个 IAM 用户和一个用于安全签名操作的 KMS 密钥。它还设置 IAM 策略和附件,以授予使用 KMS 密钥和其他 AWS 服务(如 S3、EFS 和 ECS)所需的权限。 + +### S3 + +`s3` 模块创建一个用于存储验证者相关数据(如签名)的 S3 存储桶。它还设置存储桶策略来管理访问和权限,包括公共访问限制和版本控制。 + +### EFS + +`efs` 模块定义了一个 EFS 文件系统和访问点,允许验证者应用程序在 EFS 上存储和访问数据。它还设置一个挂载目标,用于将 EFS 文件系统连接到网络。 + +:::note +此模块仅在使用 `validator` 模块时需要。 +::: + +### 验证者 + +`validator` 模块使用上述所有模块来集成 EFS、IAM/KMS 和 S3 配置。 + +除了: +- 创建新的 IAM 用户和相关角色以运行验证者。 +- 创建验证者可以写入签名的 S3 存储桶。 +- 创建 EFS 卷以在服务中持久化数据。 + +此模块还: +- 定义用于运行验证者应用程序的 ECS 任务定义,包括容器定义、卷配置和日志记录。 +- 创建 ECS 服务以管理验证者任务的部署和扩展。 + +## 主要配置 + +根级配置设置 VPC、子网、互联网网关、NAT 网关、路由表和网络基础设施的安全组。它还提供了 `validator` 模块的示例用法。 + +```terraform +module "your_validator_name" { + source = "./modules/validator" + + validator_name = "your-validator-name" + origin_chain_name = "originChainName" + + aws_region = var.aws_region + validator_cluster_id = aws_ecs_cluster.validator_cluster.id + validator_subnet_id = aws_subnet.validator_subnet.id + validator_sg_id = aws_security_group.validator_sg.id + validator_nat_gateway_id = aws_nat_gateway.validator_nat_gateway.id + + # 禁用验证者任务允许你设置所有必需的基础设施,而无需立即运行实际的验证者。 + # 这在首次设置验证者时很有用,这样你可以在它执行公告交易之前找到验证者的地址并为其提供资金。 + # validator_task_disabled = true +} +``` + +### 输出 + +根级别的 `outputs.tf` 转发 `main.tf` 中配置的所有验证者的输出。**当你添加、修改或删除验证者时,你需要更新这个文件。** + +### 示例架构 + +下图显示了验证者 ECS 集群如何适配顶层网络基础设施。 + +```mermaid +graph TD + subgraph VPC_Network ["VPC 网络"] + VPC[AWS VPC] + Public_Subnet[AWS 公共子网] + Private_Subnet[AWS 私有子网] + VPC -- 连接到 --> IGW[AWS 互联网网关] + VPC -- 包含 --> SG[AWS 安全组] + Public_Subnet -- 通过互联网网关访问互联网 --> IGW + Private_Subnet -- 通过 NAT 访问互联网 --> NAT_Gateway[AWS NAT 网关] + NAT_Gateway -- 使用 --> EIP[AWS 弹性 IP] + NAT_Gateway -- 位于 --> Public_Subnet + + subgraph Routing ["路由"] + Public_Subnet -- 关联 --> Public_Route_Table[AWS 公共路由表] + Public_Route_Table -- 路由互联网流量 --> IGW + Private_Subnet -- 关联 --> Private_Route_Table[AWS 私有路由表] + Private_Route_Table -- 路由流量到 --> NAT_Gateway + end + end + + subgraph ECS_Infrastructure ["ECS 基础设施"] + VPC -- 托管 --> ECS_Cluster[AWS ECS 集群] + SG -- 保护 --> ECS_Cluster + end + + %% 额外细节 + SG -- 保护 --> Public_Subnet + SG -- 保护 --> Private_Subnet + + %% 互联网节点 + Internet[互联网] + IGW -- 连接到 --> Internet + EIP -- 连接到 --> Internet +``` + +## 已知问题 + +### PI 配置 + +为 PI 链设置自定义配置值(例如你自己部署 Hyperlane 的链)并不简单。 +目前你可能必须传递一长串环境变量或命令行参数。 + +### 单个代理日志 + +目前所有代理都记录到同一个日志组 - `DefaultLogGroup`。要按代理分离它们,你可能需要调整日志组名称并使用新的组名更新代理的日志策略。 + +### 中继器模块 + +Docker 镜像支持运行两种类型的代理。因此,如果你选择这样做,你可以使用验证器模块作为新的中继器模块的起点。 \ No newline at end of file diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/docker-quickstart.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/docker-quickstart.mdx new file mode 100644 index 00000000..35f485b5 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/docker-quickstart.mdx @@ -0,0 +1,157 @@ +# 使用 Docker Compose 和 AWS 快速入门 + +有时候不依赖长长的 docker 命令会更好。使用 Docker compose 运行与使用原始 Docker 非常相似,你可以在 [Docker 文档](https://docs.Docker.com/compose/compose-file/)中找到完整的格式规范。 + +## 1. 设置验证者密钥 + +按照[此处](set-up-agent-keys.mdx#2-aws-kms)的指南使用 AWS KMS 创建代理密钥。 + +## 2. 创建用于签名的 S3 存储桶 + +按照[此处](./validators/validator-signatures-aws.mdx)的指南创建和配置 S3 存储桶,供你的验证者写入签名。 + +## 3. (仅限 AVS 运营者) 在 Hyperlane AVS 中注册 + +如果你是 AVS 运营者,请按照[此处](../guides/avs-operator-guide.mdx#4-register-your-operator)的指南在 Hyperlane AVS 中注册。 + +## 4. 设置验证者环境 + +### 创建配置文件 + +在这个例子中,我们将运行三个链。 + +```bash +mkdir -p ethereum/hyperlane_db optimism/hyperlane_db base/hyperlane_db && \ +touch ethereum/config.json optimism/config.json base/config.json docker-compose.yml .env.ethereum .env.optimism .env.base +``` + +### 编辑每个 config.json + +你可以在[这里](./agent-config.mdx)阅读更多关于代理配置的信息。 + +| 参数 | 描述 | +|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `customRpcUrls` | 你想要支持的链的高性能 RPC 端点的逗号分隔列表。我们建议使用付费提供商以避免速率限制。 | +| `chains.ethereum` | 在 base/config.json 中应改为 `chains.base`,在 optimism/config.json 中应改为 `chains.optimism`。 | +| `signer.region` | 应调整为你的 AWS 区域。 | +| `validator.region` | 应调整为你的 AWS 区域。 | +| `signer.id` | 应调整为你在步骤 3 中配置的 AWS KMS ID,前缀为 `alias/`。 | +| `validator.id` | 应调整为你在步骤 3 中配置的 AWS KMS ID,前缀为 `alias/`。 | +| `originChainName` | 应该是你正在验证的链。 | +| `checkpointSyncer.bucket`| 应反映 S3 存储桶的名称。 | +| `checkpointSyncer.folder`| 验证者将在存储桶中使用的文件夹名称。你可以为多个验证者使用相同的存储桶,但确保每个验证者的文件夹名称是唯一的。 | +| `reorgPeriod` | 每个链可能不同。[查找 reorgPeriods](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains)。 | + +这是一个代理配置示例。 + +```json +{ + "chains": { + "ethereum": { + "customRpcUrls": "https://eth.llamarpc.com,https://rpc.mevblocker.io", + "signer": { + "region": "us-east-1", + "type": "aws", + "id": "alias/hyperlane-validator-signer" + } + } + }, + "originChainName": "ethereum", + "db": "/mnt/hyperlane_db", + "validator": { + "id": "alias/hyperlane-validator", + "type": "aws", + "region": "us-east-1" + }, + "checkpointSyncer": { + "bucket": "hyperlane-validator-signatures", + "region": "us-east-1", + "type": "s3", + "folder": "ethereum" + }, + "reorgPeriod": 14, + "metricsPort": "9090" +} +``` + +### 编辑每个 .env 文件 + +你应该为每个链更改服务名称和 aws 凭证 + +``` +AWS_ACCESS_KEY_ID=<你的 AWS 访问密钥 ID> +AWS_SECRET_ACCESS_KEY=<你的 AWS 秘密访问密钥> +SERVICE_NAME=ethereum +``` + +## 5. 配置 Docker Compose (docker-compose.yml) + +```yaml +x-common-attributes: &common-validator + image: gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 + command: ./validator + container_name: ${SERVICE_NAME}-validator + environment: + CONFIG_FILES: /config.json + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + volumes: + - ./${SERVICE_NAME}/hyperlane_db:/mnt/hyperlane_db + - ./${SERVICE_NAME}/config.json:/config.json + restart: unless-stopped + +services: + ethereum-validator: + <<: *common-validator + ports: + - "9091:9090/tcp" + + optimism-validator: + <<: *common-validator + ports: + - "9092:9090/tcp" + + base-validator: + <<: *common-validator + ports: + - "9093:9090/tcp" +``` + +你的目录结构应该类似于这样: + +```bash +. +├── base +│ ├── config.json +│ └── hyperlane_db +├── docker-compose.yml +├── ethereum +│ ├── config.json +│ └── hyperlane_db +├── .env.base +├── .env.ethereum +├── .env.optimism +└── optimism + ├── config.json + └── hyperlane_db +``` + +## 6. 运行 Hyperlane 验证者 + +启动容器: + +记得为你的验证者地址提供资金,以便验证者可以进行公告。 + +```bash +docker compose --env-file .env.ethereum up ethereum-validator -d +docker compose --env-file .env.optimism up optimism-validator -d +docker compose --env-file .env.base up base-validator -d +``` + +确保没有错误: + +```bash +docker logs -f ethereum-validator +docker logs -f optimism-validator +docker logs -f base-validator +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/overview-agents.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/overview-agents.mdx new file mode 100644 index 00000000..0eec715d --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/overview-agents.mdx @@ -0,0 +1,65 @@ +# 概述 + +Hyperlane 协议将跨链消息传递的传输层与安全层解耦。要运行一个部署,它依赖于观察链上活动并执行协议的传输或安全方面的链下代理。 + +1. Hyperlane [验证者](#validator)是负责安全的轻量级链下代理 - 它们观察源链上的 [Mailbox](docs/protocol/mailbox.mdx) 并在需要时签署一个 merkle 根来证明邮箱的当前状态。 +2. [中继者](#relayer)满足协议的消息传输要求。它们为 [`IInterchainSecurityModule` 接口](/docs/protocol/ISM/modular-security.mdx)聚合链下安全元数据并将消息传递给接收者。 + +## 验证者 {#validators} + +[验证者](docs/protocol/agents/validators.mdx)作为[多重签名 ISM](docs/protocol/ISM/multisig-ISM.mdx)或 [Hyperlane AVS](docs/protocol/economic-security/hyperlane-avs.mdx)的一部分,通过验证 [Mailbox](docs/protocol/mailbox.mdx) 消息的有效性并将其签名提供给中继者来满足协议的安全要求。 + +这个签名被存储并公开可用(例如在 S3 存储桶中),然后由链下中继者和链上跨链安全模块使用。验证者之间_不_需要网络连接,也不需要达成共识;他们也不需要定期提交链上交易。 + +如果社区运营者希望帮助保护源链的安全,这就是他们需要运行的代理,这也是帮助去中心化 Hyperlane 消息传递最重要的职责。**请注意,仅仅运行一个验证者并不意味着它正在积极地为消息安全做出贡献:**目标链上的多重签名 ISM 必须已经注册了验证者的检查点签名密钥,并且消息接收者必须使用该 ISM。 + +这些代理使用 Rust 实现,并以 Docker 镜像和二进制文件的形式分发。 + +👉 在[这里](docs/protocol/agents/validators.mdx)了解更多关于验证者的信息。 + +## 中继者 {#relayer} + +Hyperlane [中继者](docs/protocol/agents/relayer.mdx)负责将跨链消息传递给接收者。 + +中继是无需许可的,在一对链之间只需要一个诚实的中继者就足以确保活性。运行中继者:1) 在操作上比验证者复杂得多;2) 对网络安全不是必需的;3) 仅推荐用于无需许可的 Hyperlane 部署。 + +Hyperlane 中继者被配置为在一个或多个源链和目标链之间中继消息。 +每个 Hyperlane 消息涉及两个交易: + +1. 在源链上[`dispatch`](docs/reference/messaging/send.mdx)并发送消息。 +2. 在目标链上[`process`](docs/reference/messaging/receive.mdx)并传递消息。 + +中继者的工作是在目标链上传递消息。为了完成这个责任: + +- 中继者跟踪源链上出现的新消息。 +- 它检查接收者指定的[跨链安全模块 (ISM)](/docs/protocol/ISM/modular-security.mdx)以收集保护消息所需的元数据。例如,它可能从验证者检查点存储中检索多重签名 ISM 签名。 +- 在组装安全元数据后,中继者将消息发送给目标链上的接收者。 + +如果消息传递失败(例如由于缺乏流动性从 Warp Route 合约转出),中继者会使用指数退避机制重试传递,直到成功。 + +中继者在 Hyperlane 中没有特殊权限。如果中继者密钥被泄露,只有这些密钥持有的代币面临风险。 + +```mermaid +flowchart LR + subgraph Origin Chain + Sender + M_O[(Mailbox)] + IGP[InterchainGasPaymaster] + Sender -- "dispatch(...)\n{value}" --> M_O + M_O -- "postDispatch(..., gasLimit)\n{value}" --> IGP + end + + Relayer((Relayer)) + + M_O -. "indexing" .-> Relayer + IGP -. "value" .- Relayer + + subgraph Destination Chain + M_D[(Mailbox)] + M_D -- "handle(...)" --> Recipient + end + + Relayer -- "process{gasLimit}(...)" --> M_D +``` + +👉 在[这里](docs/protocol/agents/relayer.mdx)了解更多关于中继者的信息。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/relayer/message-filtering.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/relayer/message-filtering.mdx new file mode 100644 index 00000000..ed570789 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/relayer/message-filtering.mdx @@ -0,0 +1,66 @@ +# 消息过滤 +_配置要中继的消息和要忽略的消息_ + +默认情况下,中继器将尝试将从其源链发送的消息传递到任何已配置的目标链。 + +中继器可能希望进一步过滤它们尝试传递的消息。例如,构建跨链应用程序的开发者可能希望运行一个中继器,该中继器只传递发送到该应用程序的消息。同样,一些中继器可能希望只将消息中继到可用链的子集。 + +中继器可以**可选地**通过设置 `--whitelist` 或 `--blacklist` 环境变量来过滤它们传递的消息。另请参阅[配置参考](../config-reference.mdx)的白名单部分。 + +这些配置是具有以下格式的字符串化 JSON 对象: + +```typescript +// 匹配规则列表。如果列表中的任何元素与消息匹配, +// 则该消息匹配。 +type MatchingList = Array; + +// 如果提供的任何值匹配,则匹配消息。 +interface ListElement { + originDomain?: NumericFilter + senderAddress?: HashFilter + destinationDomain?: NumericFilter + recipientAddress?: HashFilter +} + +type NumericFilter = Wildcard | U32 | Array; +type HashFilter = Wildcard | H256 | Array; + +// 32位无符号整数 +type U32 = number | string; +// 256位哈希(也可以更少)以十六进制编码 +type H256 = string; +// 匹配任何内容 +type Wildcard = "*"; +``` + +白名单和黑名单都具有"任意"语义。换句话说,中继器将传递匹配白名单过滤器中_任何一个_的消息,并忽略匹配黑名单过滤器中_任何一个_的消息。 + +例如,以下用作白名单的配置将确保中继器会中继任何发送到以太坊的消息,从地址 `0xca7f632e91B592178D83A70B404f398c0a51581F` 发送到 Celo 或 Avalanche 的任何消息,以及发送到 Arbitrum 或 Optimism 上地址 `0xca7f632e91B592178D83A70B404f398c0a51581F` 的任何消息。 + +```json +[ + { + "senderAddress": "*", + "destinationDomain": ["1"], + "recipientAddress": "*" + }, + { + "senderAddress": "0xca7f632e91B592178D83A70B404f398c0a51581F", + "destinationDomain": ["42220", "43114"], + "recipientAddress": "*" + }, + { + "senderAddress": "*", + "destinationDomain": ["42161", "420"], + "recipientAddress": "0xca7f632e91B592178D83A70B404f398c0a51581F" + } +] +``` + +一个有效的配置可能如下所示: + +```bash +--whitelist='[{"senderAddress":"*","destinationDomain":["1"],"recipientAddress":"*"},{"senderAddress":"0xca7f632e91B592178D83A70B404f398c0a51581F","destinationDomain":["42220","43114"],"recipientAddress":"*"},{"senderAddress":"*","destinationDomain":["42161","420"],"recipientAddress":"0xca7f632e91B592178D83A70B404f398c0a51581F"}]' +``` + +黑名单优先于白名单,即如果一条消息同时匹配白名单_和_黑名单,它将不会被传递。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/relayer/monitoring-alerting.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/relayer/monitoring-alerting.mdx new file mode 100644 index 00000000..c4e85c65 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/relayer/monitoring-alerting.mdx @@ -0,0 +1,48 @@ +# 监控和告警 + +中继器在由参数 `--metrics` 指定的端口号上公开指标。默认端口为 `9090`,但可以选择任何有效的端口。 + +我们建议使用 Prometheus 来抓取这些指标,并使用 Grafana 来可视化它们,使用[此仪表板 JSON 模板](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/2f7f714c5b698fedcead9825f52da6ef95f96be1/tools/grafana/easy-relayer-dashboard-template.json),如下所示。这个仪表板的优点是它可以同时显示多个验证器。截图显示了按链或按 kubernetes pod 分组的指标。 + +![中继器 Grafana 仪表板模板](/img/dashboard-template-relayer.png) + +:::info + +如果作为 Docker 镜像运行,请确保端口转发指标端点端口。例如,要在本地端口 80 上转发端口 9090,请在 `docker run` 命令中添加以下标志:`-p 9090:80` + +::: + +## 指标 + +仪表板模板包含以下指标。 +| 指标 | 描述 | +|----------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `hyperlane_messages_processed_count` | 中继器处理的消息,按源链和目标链分类("已处理消息")。 | +| `hyperlane_submitter_queue_length{queue_name="prepare_queue"}` | 提交者的准备队列长度("准备队列")。每个目标链都有一个提交者在运行,所有待处理/可重试的消息都会进入准备队列,等待(重新)提交。此队列的增加可能意味着消息量超过了中继器的处理吞吐量,或者由于各种原因(RPC 不良、余额不足)导致提交失败。 | +| `hyperlane_submitter_queue_length{queue_name="submit_queue"}` | 提交者的提交队列长度("提交队列")。这些是已准备但尚未提交的消息。 | +| `hyperlane_submitter_queue_length{queue_name="confirm_queue"}` | 提交者的确认队列长度("确认队列")。这些是已提交但尚未确认(最终确定)的消息。 | + +其他相关指标包括: +| 指标 | 描述 | +|--------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `hyperlane_request_count` | 记录成功或失败的 RPC 数量,使用以下标签:`chain`(链)、`status`(失败或成功)、`provider_node`(负责的基础 RPC URL)和 RPC `method`(方法)。适用于所有代理,但目前仅支持 EVM 链。 +| `hyperlane_wallet_balance{agent="relayer"}` | 中继器在每个链上的余额,以最小面额单位表示 | +| `hyperlane_critical_error` | 链上关键错误的布尔标记,表示活跃度丢失。 | +| `hyperlane_block_height` | 代理连接到的 RPC 节点的区块高度。如果此指标没有增加,RPC 可能不健康并需要更改。 | +| `hyperlane_span_events_total{agent="relayer", event_level="error"}` | 记录的错误总数。如果在过去一小时内此指标的导数超过 1,则至少需要低严重性告警。请注意,仪表板查询按 kubernetes pod 名称分组指标,因此如果您不在 kubernetes 环境中运行,可能需要调整此查询。 | +| `hyperlane_span_events_total{agent="relayer", event_level="warn"}` | 记录的警告总数。如果在过去一小时内此指标的导数超过 1,则至少需要低严重性告警。请注意,仪表板查询按 kubernetes pod 名称分组指标,因此如果您不在 kubernetes 环境中运行,可能需要调整此查询。 | + + +## 告警 +可以组合上述指标来创建最小化误报的告警。一些示例关键告警: + +### 适用于所有代理: +- 任何链的 `hyperlane_block_height` 在过去 15 分钟内没有增加 +- 过去 10 分钟内 `hyperlane_request_count{status="failure"}` 的比率 > `hyperlane_request_count{status=~"success|failure"}` 的 60%。大多数代理问题都是由于 RPC 不良造成的,这很可能会捕获到这些问题。 + +### 适用于中继器: +- 某个链的 `hyperlane_critical_error` 为 `1`,意味着中继器在该链上失去了活跃度。虽然其他链上的操作不受此影响,但这是一个高严重性告警 - 通常与受影响链的 RPC 不可靠有关。 +- 使用 `hyperlane_submitter_queue_length{queue_name="prepare_queue"}`,在过去 30 分钟内,准备队列长度一直在增加,确认队列长度为零,且错误/警告计数差异一直在增加。这可能意味着中继器已耗尽余额无法支付 gas 费用,或者目标链 RPC url 工作不正常,或者只是所有新消息都无法处理 +- `hyperlane_wallet_balance` 已降至某个阈值以下。例如,当前余额除以过去 24 小时的差值小于 2,意味着必须在两天内充值 + +如果收到告警,请始终检查日志以了解可能的问题所在。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/relayer/run-relayer.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/relayer/run-relayer.mdx new file mode 100644 index 00000000..b02a56ce --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/relayer/run-relayer.mdx @@ -0,0 +1,216 @@ +# 运行中继器 + +:::tip + +- 关于 Hyperlane 中中继器的介绍,您可以查看[概述部分](/docs/operate/overview-agents.mdx)。 +- 我们建议您在尝试运行生产环境中继器之前,先阅读[**部署 Hyperlane 本地代理**](../../guides/deploy-hyperlane-local-agents.mdx)指南,了解如何在本地配置和运行中继器,以及[**运行验证器**](../validators/run-validators.mdx)文档。 + +::: + +## 要求 + +- RPC 节点 + - 中继器使用 RPC 节点来读取源链和传递消息到目标链。中继器必须为所有源链和目标链配置 RPC 节点。 +- 一个或多个签名密钥 + - 为了传递消息,中继器必须配置签名密钥以在每个目标链上提交交易(因此需要在这些链上有资金)。 + - 中继器使用此密钥来签署 `Mailbox.process()` 交易。Hyperlane 中继器代理目前支持通过 API 密钥/密钥访问的 AWS KMS 密钥或原始十六进制私钥的配置。 +- 运行机器 + - 中继器运营者可以自己编译 Rust 二进制文件,或运行 Abacus Works 提供的 Docker 镜像。二进制文件可以使用您喜欢的云服务运行。 + +## 指南 + +:::info + +- 本地代理设置展示了如何在您的_本地机器_上运行中继器,这**仅用于测试和开发目的**。 +- 我们强烈建议您遵循[本地代理指南](../../guides/deploy-hyperlane-local-agents.mdx)来了解如何在本地配置和运行中继器。 + +::: + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +### 密钥 + +中继器需要能够向多个目标链提交交易,因此需要访问用于签署交易的密钥。支持两种密钥类型:十六进制私钥(用于内存中签名)和基于 AWS KMS 的密钥(生产环境的最佳实践)。 + +#### 十六进制密钥 + +中继器可以使用十六进制私钥进行内存中签名来签署交易。这是测试或开发目的的推荐设置,但也可以在生产环境中使用。 + +#### AWS KMS 密钥 + +中继器可以使用 AWS KMS 密钥来签署交易。这是生产环境中继器的推荐设置。 + +:::tip +请参阅[代理密钥](../set-up-agent-keys.mdx)页面来设置您的十六进制或 AWS KMS 密钥。 +::: + +### 配置 + +与本地设置一样,在配置中继器时应提供一些基本参数。 + +| 参数 | 描述 | +| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--relayChains` | 在源链和目标链之间中继消息的链名称,用逗号分隔。例如:`ethereum,polygon,avalanche`。 | +| `--db` | 中继器应将持久数据写入磁盘的路径。在使用云设置时确保此路径持久存在。使用 Docker 时,确保将持久路径/卷挂载到容器中。更多信息请参见[配置参考](../config-reference.mdx#db)。 | +| `--allowLocalCheckpointSyncers` | 如果为 `true`,将允许中继器在中继器的本地文件系统中查找验证器签名。在生产环境中,此值应为 `false`。如果您按照验证器本地设置说明在同一台机器上运行验证器,请将此值设置为 `true`,以便中继器可以访问本地验证器签名。 | + +:::info + +您的中继器同时接受命令行参数和环境变量作为配置。查看[代理配置](../agent-config.mdx)页面和[配置参考](../config-reference.mdx)以获取完整的配置可能性列表。 + +::: + +当然,您也可以使用 [`CONFIG_FILES` 环境变量](../config-reference.mdx#config_files)提供额外配置文件的路径,以逗号分隔列表的形式。如果您选择在 Docker 中运行,请参阅[代理配置](../agent-config.mdx)的 docker 部分,了解如何将配置文件挂载到 Docker 容器中的提示。 + +### 特定设置配置 + +这些配置要求因您设置的环境而异。 + + + +如果您创建了[十六进制密钥](../set-up-agent-keys.mdx),请按如下方式配置默认签名者: + +| 参数 | 描述 | +| --------------------- | -------------------------------------------------------------------------------------------------- | +| `--defaultSigner.key` | 用于为所有链签署交易的十六进制私钥。例如:`1b3dead...beef`。 | + + + +如果您创建了 [AWS KMS 密钥](../set-up-agent-keys.mdx),请按如下方式配置默认签名者: + +| 参数 | 描述 | +| ------------------------ | ---------------------------------------------------------------------------------------------------------- | +| `--defaultSigner.type` | 设置为 `aws`。 | +| `--defaultSigner.id` | 您的中继器的 AWS KMS 密钥别名,前缀为 `alias/`。例如:`alias/hyperlane-relayer-1`。 | +| `--defaultSigner.region` | 您的 AWS KMS 密钥的区域。例如:`us-east-1`。 | + + + + +对于特定链的签名者(即为每个链自定义要使用的密钥),请查看[配置参考](../config-reference.mdx)。 + +## 开始中继 + +### 设置 + +生产环境的推荐安装方法是使用 Docker 镜像。 + + + + +首先下载 docker 镜像: + +```bash +docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 +``` + + + + +**克隆和设置** + +首先,克隆 Hyperlane monorepo: + +```sh +git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git +``` + +然后按照 `rust` 目录中的[设置说明](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md)进行操作。这将设置 `rustup`,如果您使用的是 Apple Silicon,还会设置 Rosetta 2。 + +```sh +# 安装 rustup +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + +# (仅限 apple silicon)安装 rosetta 2 +softwareupdate --install-rosetta --agree-to-license +``` + +构建中继器: + +```sh +cargo build --release bin relayer +``` + + + + +### 运行代理 + +如果中继器的密钥已使用 AWS KMS 配置,您必须将 AWS 访问密钥和密钥作为环境变量提供。 + +| 环境变量 | 描述 | +| ----------------------- | ----------------------------------------------------- | +| `AWS_ACCESS_KEY_ID` | 您的中继器的 AWS IAM 用户的访问密钥 ID。 | +| `AWS_SECRET_ACCESS_KEY` | 您的中继器的 AWS IAM 用户的秘密访问密钥。 | + +如需复习,请查看[代理密钥](../set-up-agent-keys.mdx)指南。 + + + + +然后使用相关参数启动容器。例如,您的 AWS 配置: + +```sh +docker run \ + -it \ + -e AWS_ACCESS_KEY_ID=ABCDEFGHIJKLMNOP \ + -e AWS_SECRET_ACCESS_KEY=xX-haha-nice-try-Xx \ + --mount ... \ + gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 \ + ./relayer \ + --db /hyperlane_db \ + --relayChains , \ + --defaultSigner.type aws \ + --defaultSigner.id alias/hyperlane-relayer-1 \ + --defaultSigner.region us-east-1 \ +``` + +:::info + +如果您在同一台机器上使用本地设置运行验证器,并运行本地中继器来访问这些验证器签名,请确保将您的本地验证器的签名目录[挂载](https://docs.docker.com/storage/bind-mounts/)到您的中继器中,使用与您[宣布验证器](../validators/run-validators.mdx#Announcing-your-validator)时相同的路径。 + +例如,如果您的本地验证器正在将签名写入 `/tmp/hyperlane-validator-signatures-ethereum`,您应该为 Docker 容器挂载一个目录: + +```sh +docker run \ + -it \ + -e CONFIG_FILES=/config/agent-config.json \ + --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ + --mount type=bind,source="$(pwd)"/hyperlane-validator-signatures-ethereum,target=/tmp/hyperlane-validator-signatures-ethereum,readonly \ + --mount type=bind,source="$(pwd)"/hyperlane_db,target=/hyperlane_db \ + gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 \ + ./relayer \ + --db /hyperlane_db \ + --relayChains ethereum,polygon \ + --defaultSigner.type aws \ + --defaultSigner.id alias/hyperlane-relayer-1 \ + --defaultSigner.region us-east-1 +``` + +::: + + + + +使用相关参数运行二进制文件。例如,您的 AWS 配置: + +```sh +export AWS_ACCESS_KEY_ID=ABCDEFGHIJKLMNOP +export AWS_SECRET_ACCESS_KEY=xX-haha-nice-try-Xx + +# 运行中继器 +./target/release/relayer \ + --db /hyperlane_db \ + --relayChains , \ + --defaultSigner.type aws \ + --defaultSigner.id alias/hyperlane-relayer-1 \ + --defaultSigner.region us-east-1 \ +``` + + + + +### 索引 + +中继器需要为源链索引所有历史消息。这些信息存储在磁盘上的本地数据库中(在配置中通过 `db` 设置)。这意味着首次运行中继器可能需要额外的时间来赶上当前状态。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/run-docker-compose.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/run-docker-compose.mdx new file mode 100644 index 00000000..4d70367f --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/run-docker-compose.mdx @@ -0,0 +1,53 @@ +# 使用 Docker Compose 运行 + +有时候不依赖长长的 docker 命令会更好。使用 Docker compose 运行与使用原始 Docker 非常相似,你可以在 [Docker 文档](https://docs.Docker.com/compose/compose-file/)中找到完整的格式规范。 + +这是一个运行验证者的 `docker-compose` 文件示例,它应该能满足你大部分需求。 + +```json +{ + "chains": { + "ethereum": { + "customRpcUrls": "https://node1.com,https://node2.com,https://node3.com" + } + }, + "originChainName": "ethereum", + "validator": { + "id": "alias/validator-signer-ethereum", + "type": "aws", + "region": "us-east-1" + }, + "checkpointSyncer": { + "bucket": "signatures-ethereum", + "region": "us-east-1", + "type": "s3" + }, + "reorgPeriod": 1, + "interval": 30, + "metricsPort": "9090" +} +``` + +```yaml +services: + ethereum-validator: + image: gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.0.0 + command: ./validator + ports: + - "9090:9090/tcp" + environment: + CONFIG_FILES: /ethereum_validator.json + AWS_ACCESS_KEY_ID: somesecretkey + AWS_SECRET_ACCESS_KEY: somesecretkey + configs: + - ethereum_validator.json +configs: + ethereum_validator.json: + file: ./ethereum_validator.json +``` + +上面的配置包含了很多占位值,你当然需要用真实的值来替换它们。 + +你还可以指定多个服务,所以如果你正在运行多个验证者,可以在 `services` 下指定每一个。 + +要运行 compose 配置,使用 `docker compose up` 命令,使用 `docker compose down` 命令进行清理。完整的命令行文档可以在 [docker 网站](https://docs.docker.com/engine/reference/commandline/compose/)上找到。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/set-up-agent-keys.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/set-up-agent-keys.mdx new file mode 100644 index 00000000..ab209fd0 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/set-up-agent-keys.mdx @@ -0,0 +1,122 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# 代理密钥 + +Hyperlane 代理 - 验证者和中继者 - 必须配置私钥才能运行。验证者使用私钥签署[消息检查点](../reference/glossary.mdx#checkpoint),中继者使用私钥签署传递消息的交易。 + +Hyperlane 代理目前支持以下两种方式之一配置私钥。 + +## 1. 十六进制密钥 + +用于内存中签名的原始十六进制私钥。这是最简单和最快的设置方式。 + +:::warning + +十六进制密钥的安全性低于 AWS KMS 密钥。 + +::: + +### 生成十六进制密钥 + +记录下你的地址和私钥以供代理使用。不要丢失或泄露它。 + + + +使用 [Foundry 的 cast](https://book.getfoundry.sh/cast/),你可以创建一个新的密钥对: + +```sh +cast wallet new +``` + +输出将类似于: + +``` +Successfully created new keypair. +Address: 0x32e6d32E7b1C8691Ef4ad3841003371214a0eebC +Private Key: 0x2958f0eb2ab71bbfb5ea1422835e20e488778b61e3c107f369572e2b53b578f9 +``` + + + +你可以访问 [https://privatekeys.pw/keys/ethereum/random](https://privatekeys.pw/keys/ethereum/random),它会自动显示一个十六进制私钥列表及其对应的地址。 + +:::warning + +请注意,由于这些密钥是由网站生成的,这些私钥应该被视为不安全的,不应该用于测试以外的任何用途! + +::: + + + + +## 2. AWS KMS + +由 AWS 生成并存储在 CloudHSM 中的密钥。这是生产环境代理的推荐设置。 + +### 创建 IAM 用户 + +这个 IAM 用户将被授予使用你稍后配置的 KMS 密钥进行签名的权限。你的 Hyperlane 代理将在签署交易时使用这个身份。 + +1. 在 [AWS 控制台](https://us-east-1.console.aws.amazon.com/iamv2/home)中进入 AWS 的身份和访问管理(IAM)。 +2. 在左侧的"访问管理"下,点击"用户"。 +3. 点击橙色按钮"添加用户"。 +4. 选择一个友好且信息丰富的用户名,如 `hyperlane-validator-${chain_name}` 或 `hyperlane-relayer-${chain_name}`。这个用户名将在后续步骤中被引用,所以如果你选择了不同的用户名,请确保在将来使用你的正确用户名。 +5. 点击"下一步",你不需要为用户分配任何权限。 +6. 点击"创建用户"。 +7. 点击进入你刚刚创建的用户 +8. 点击"安全凭证"标签 +9. 滚动到"访问密钥"并点击"创建访问密钥" +10. 选择"在 AWS 外部运行的应用程序"并点击"下一步" +11. 点击"下一步",无需添加描述标签 +12. 点击"创建访问密钥" +13. 将"访问密钥 ID"和"秘密访问密钥"复制到安全的地方。这些将作为环境变量传递给你的 Hyperlane 中继者。 + +### 创建 KMS 密钥 + +这个密钥将被你的代理用于签名。 + +1. 在 AWS 控制台中进入 AWS 的密钥管理服务(KMS)。 +2. 确保你在想要创建密钥的区域中。这可以通过查看控制台右上角的区域来确认,或者通过在 URL 的子域名中找到名称(例如 `us-west-2.console.aws.amazon.com` 表示你在 `us-west-2` 区域中操作)。 +3. 在左侧,点击"客户托管密钥"。 +4. 点击"创建密钥"。 +5. 选择"非对称"密钥类型。 +6. 选择"签名和验证"密钥用途。 +7. 选择 `ECC_SECG_P256K1` 密钥规格。 +8. 点击"下一步"。 +9. 设置别名为一个友好且信息丰富的名称,如 `hyperlane-validator-signer-${chain_name}` 或 `hyperlane-relayer-signer-${chain_name}` +10. 虽然不是必需的,但你可以随意写一个描述并添加任何你认为有用的标签。 +11. 点击"下一步"。 +12. 不需要密钥管理员,但如果你想要,可以选择一个。 +13. 点击"下一步"。 +14. 将使用权限授予你在第 1 节中创建的 IAM 用户。 +15. 点击"下一步"。 +16. 在审核页面中,滚动到"密钥策略"。生成的密钥策略是可接受的,但如果你愿意,可以通过以下方式使访问权限更加受限: + 1. 从"Sid"为"Allow use of the key"的语句中删除 `kms:DescribeKey` 和 `kms:Verify` 操作 + 2. 删除"Sid"为"Allow attachment of persistent resources"的整个语句。 +17. 点击"完成" + +:::tip + +高级用户可以考虑使用 [IAM/KMS Terraform 模块](deploy-with-terraform.mdx#iam--kms)来创建 IAM 用户和 KMS 密钥。 + +::: + +### 获取 KMS 密钥的地址 + +在某些情况下,你可能需要知道与生成的 KMS 密钥相关联的地址。 + + + + +``` +AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_KMS_KEY_ID=alias/your-key-alias cast wallet address --aws +``` + + + + +以下仓库中的脚本将允许你查询此地址:[https://github.com/tkporter/get-aws-kms-address](https://github.com/tkporter/get-aws-kms-address) + + + diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/validators/monitoring-alerting.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/validators/monitoring-alerting.mdx new file mode 100644 index 00000000..171b5a77 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/validators/monitoring-alerting.mdx @@ -0,0 +1,30 @@ +# 监控和告警 + +验证器在由参数 `--metrics` 指定的端口号上暴露指标。默认端口为 `9090`,但可以选择任何有效的端口。 + +我们建议使用 Prometheus 来抓取这些指标,并使用 Grafana 来可视化它们,使用[此仪表板 JSON 模板](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/2f7f714c5b698fedcead9825f52da6ef95f96be1/tools/grafana/validator-dashboard-template.json),如下所示。这个仪表板的优点是它可以同时显示多个验证器。截图显示了按链或按 kubernetes pod 分组的指标。 + +![验证器 Grafana 仪表板模板](/img/dashboard-template-validator.png) + +:::info + +如果以 Docker 镜像方式运行,请确保端口转发指标端点端口。例如,要将本地端口 80 转发到端口 9090,在您的 `docker run` 命令中添加以下标志:`-p 9090:80` + +::: + +## 指标 + +仪表板模板包含以下指标。 +| 指标 | 描述 | +|---------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `hyperlane_latest_checkpoint` | 验证器观察到的最新检查点,以30分钟增量可视化("已签名的检查点差异")。如果尽管 `hyperlane_block_height` 在增加,但该指标不为正,可能意味着要么没有新消息,要么验证器停止签名检查点。 | +| `hyperlane_block_height` | 代理正在使用的 RPC 节点的区块高度,以30分钟增量可视化("最新区块差异")。如果此指标不增加,RPC 可能不健康需要更改。 | +| `hyperlane_span_events_total{agent="validator", event_level="error"}` | 记录的错误总数,以30分钟增量可视化("错误日志计数差异")。如果该指标在最后一小时内的导数超过1,至少应该发出低严重性警报。请注意,仪表板查询按 kubernetes pod 名称对指标进行分组,因此如果您不在 kubernetes 环境中运行,可能需要调整此查询。 | +| `hyperlane_span_events_total{agent="validator", event_level="warn"}` | 记录的警告总数,以30分钟增量可视化("警告日志计数差异")。如果该指标在最后一小时内的导数超过1,至少应该发出低严重性警报。请注意,仪表板查询按 kubernetes pod 名称对指标进行分组,因此如果您不在 kubernetes 环境中运行,可能需要调整此查询。 | + +## 告警 +上述所有指标都可以组合使用来创建最小化误报的告警。一些关键告警示例: +- 在过去6小时内,`hyperlane_latest_checkpoint` 停止增加,但 `hyperlane_block_height` 仍在增加,且 `error` 和 `warn` 日志计数也在增加 +- `hyperlane_block_height` 在过去30分钟内没有增加 + +如果您收到告警,请务必检查日志以确定可能的问题所在。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/validators/run-validators.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/validators/run-validators.mdx new file mode 100644 index 00000000..d97fa0d7 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/validators/run-validators.mdx @@ -0,0 +1,244 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# 运行验证器 + +:::tip + +- 关于 Hyperlane 中验证器的介绍,您可以查看[概述部分](/docs/operate/overview-agents.mdx)。 +::: + +按照本指南,您可以在协议已部署的任何现有[链](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains)上运行 Hyperlane 验证器。Hyperlane 验证器是基于每个源链运行的,这些说明是针对单个链编写的。 + +## 要求 + +- 安全的签名密钥 + + - 验证器使用此密钥对 `Mailbox` 的最新默克尔根进行签名。保护此密钥的安全非常重要。如果密钥被泄露,攻击者可能会尝试伪造消息,导致验证器被惩罚。 + - Hyperlane 验证器代理目前支持使用通过 API 密钥/密钥访问的 AWS KMS 密钥以及十六进制明文密钥进行签名。更多信息请参见[代理密钥](../set-up-agent-keys.mdx)。 + +- 公开可读的存储 + + - 验证器将其签名写入公开可访问、高可用性的存储中,以便[中继器](../../protocol/agents/relayer.mdx)可以聚合这些签名。 + - Hyperlane 验证器代理目前支持使用上述相同的 AWS API 密钥将签名存储在 AWS S3 上,以及将签名存储在本地文件系统中用于测试。 + +- 该设计是[开源的](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/56be527d691a11a1ff2de4a390fd0dae8bb77347/typescript/infra/src/agents),并且可以推广到其他存储和密钥解决方案。目前有一个社区提交的[GCS PR](https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3156)正在进行中。 + +- 运行机器 + + - 验证器可以自己编译 Rust 二进制文件,或运行 Abacus Works 提供的 Docker 镜像。二进制文件可以使用您喜欢的云服务运行。您甚至可以在不同地区运行多个实例以实现高可用性,因为 Hyperlane 没有"双重签名"的概念。 + - 硬件要求和成本很低 - 验证器通常从 2核 / 2GB RAM / 4GB 存储的配置开始,典型成本约为每月75美元。 + +- RPC 节点 + - 验证器会进行简单的视图调用,以从他们正在验证的链上的 [Mailbox](../../protocol/mailbox.mdx) 合约中读取默克尔根。您必须使用自己的 RPC URL,而不是任何公共的 URL。 + +:::caution + +运行 Polygon 主网的验证器需要访问归档节点。这是因为验证器应该只在根被最终确定后才签名,而 Polygon 需要 256 个区块确认才能达到最终性。 + +::: + +## 指南 + +作为回顾 - 在运行生产验证器之前,您需要: + +1. 为您的验证器创建用于签名的密钥,请参阅[代理密钥](../set-up-agent-keys.mdx)文档。 +2. 设置验证器签名的发布目标位置,请参阅 [AWS 签名存储桶设置](validator-signatures-aws.mdx)指南。 + +## 配置 + +:::tip + +经验丰富的运营者可能更喜欢使用 [Terraform 部署代理](../deploy-with-terraform.mdx)或社区提交的 [Ansible playbook](https://github.com/polkachu/hyperlane)。这个过程将自动创建代理密钥、验证器存储桶、权限以及在 AWS 上运行验证器集群所需的任何其他辅助设置。 + +::: + +与本地设置一样,在配置验证器时应提供一些基本参数。 + +| 参数 | 描述 | +| --------------------------------------------- | ------------------------------------------------------------------ | +| `--db` | 将持久数据写入磁盘的路径。 | +| `--originChainName` | 被验证的链的名称。例如:`ethereum`。 | +| `--chains.[originChainName].customRpcUrls` | 覆盖验证器用于源链的默认 RPC URL。 | +| `--chains.[originChainName].blocks.reorgPeriod` | 验证器在签署 `Mailbox` 默克尔根之前需要等待的区块确认数。 | + +:::info + +您的验证器可以同时接受命令行参数和环境变量作为配置。查看[代理配置](../agent-config.mdx)页面和[配置参考](../config-reference.mdx)以获取完整的配置可能性列表。 + +::: + +当然,您也可以使用 [`CONFIG_FILES` 环境变量](../config-reference.mdx#config_files)提供以逗号分隔的其他配置文件路径列表。如果您选择在 Docker 中运行,请参阅[代理配置](../agent-config.mdx)的 docker 部分,了解如何将配置文件挂载到 Docker 容器中的提示。 + +### 特定设置配置 + +这些配置要求因设置环境的不同而异。 + +**检查点签名者配置** + + + + +| 参数 | 描述 | +| --------------------------------------- | ---------------------------------------------------------------------------------------- | +| `--validator.key` | 您的验证器的私钥,用于签署默克尔根。 | +| `--chains.${localChainName}.signer.key` | 您的验证器的私钥,将用于提交链上交易,公开宣布您的验证器的检查点同步器。 | + + + + +| 参数 | 描述 | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| `--validator.region` | 您的 AWS KMS 密钥所在的区域。例如:`us-east-1`。 | +| `--validator.type` | 设置为 `aws` 字面值。 | +| `--validator.id` | 您的验证器的 AWS KMS 密钥的别名,前缀为 `alias/`。例如:`alias/hyperlane-validator-signer-${originChainName}`。 | + + + + +**交易签名者配置** + +此步骤中配置的密钥需要少量资金来发送初始公告交易。 + + + +这与检查点签名者的本地配置相同。 + +| 参数 | 描述 | +| --------------------------------------- | ---------------------------------------------------------------------------------------- | +| `--chains.${localChainName}.signer.key` | 您的验证器的私钥,将用于提交链上交易,公开宣布您的验证器的检查点同步器。 | + + + + +| 参数 | 描述 | +| ------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| `--chains.${originChainName}.signer.type` | 设置为 `aws` 字面值。 | +| `--chains.${originChainName}.signer.region` | 您的 AWS KMS 密钥所在的区域。例如:`us-east-1`。 | +| `--chains.${originChainName}.signer.id` | 您的验证器的 AWS KMS 密钥的别名,前缀为 `alias/`。例如:`alias/hyperlane-validator-signer-${originChainName}`。 | + + + + +| 参数 | 描述 | +| ------------------------------------------- | -------------------------------------------------------------------------------------------- | +| `--chains.${originChainName}.signer.type` | 设置为 `cosmosKey` 字面值。 | +| `--chains.${originChainName}.signer.prefix` | 设置为与链的地址格式相关联的前缀字面值。例如:`osmo`。 | +| `--chains.${originChainName}.key` | 您的验证器的十六进制私钥,将用于提交链上交易,公开宣布您的验证器的检查点同步器。 | + + + + +**检查点同步器配置** + + + + +| 参数 | 描述 | +| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--checkpointSyncer.type` | 设置为 `localStorage`。 | +| `--checkpointSyncer.path` | 您的本地目录的路径,其中验证器签名将被写入。这应该是 `$MY_VALIDATOR_SIGNATURES_DIRECTORY` 的值来自本地设置。例如:`--checkpointSyncer.path='/tmp/hyperlane-validator-signatures-ethereum'`。 | + +:::warning + +注意,中继器**必须**配置为 `--allowLocalCheckpointSyncers` 才能从此验证器读取签名。 + +::: + + + + +| 参数 | 描述 | +| ----------------------- | ---------------------------------------------------------------------------------------------- | +| `--checkpointSyncer.type` | 设置为 `s3` 字面值。 | +| `--checkpointSyncer.bucket` | 您的 AWS S3 存储桶的名称,其中验证器签名将被写入。例如:`hyperlane-validator-signatures-${originChainName}`。 | +| `--checkpointSyncer.region` | 您的 AWS S3 存储桶所在的区域。例如:`us-east-1`。 | + + + + +## 运行验证器 + +### 使用 Docker + +您可以使用以下命令运行验证器: + +```bash +docker run \ + -it \ + -e AWS_ACCESS_KEY_ID=ABCDEFGHIJKLMNOP \ + -e AWS_SECRET_ACCESS_KEY=xX-haha-nice-try-Xx \ + --mount type=bind,source=/path/to/hyperlane_db,target=/hyperlane_db \ + gcr.io/abacus-labs-dev/hyperlane-validator:2f7c0c9-20230808 \ + --db /hyperlane_db \ + --originChainName ethereum \ + --validator.region us-east-1 \ + --validator.type aws \ + --validator.id alias/hyperlane-validator-signer-ethereum \ + --checkpointSyncer.type s3 \ + --checkpointSyncer.bucket hyperlane-validator-signatures-ethereum \ + --checkpointSyncer.region us-east-1 +``` + +### 使用二进制文件 + +您可以使用以下命令运行验证器: + +```bash +./target/release/validator \ + --db /hyperlane_db \ + --originChainName ethereum \ + --validator.region us-east-1 \ + --validator.type aws \ + --validator.id alias/hyperlane-validator-signer-ethereum \ + --checkpointSyncer.type s3 \ + --checkpointSyncer.bucket hyperlane-validator-signatures-ethereum \ + --checkpointSyncer.region us-east-1 +``` + +## 设计参考 + +```mermaid +flowchart TB + V(("验证器")) + Relayer((中继器)) + + subgraph Origin + Sender + M_O[(邮箱)] + POS[权益证明] + + Sender -- "dispatch(destination, recipient, body)" --> M_O + end + + subgraph Cloud + aws[(元数据\n数据库)] + end + + M_O -. "索引" .-> Relayer + M_O -. "索引" .-> V + POS == "质押" === V + + V -- "签名" --> aws + + subgraph Destination + Recipient + M_D[(邮箱)] + ISM[MultisigISM] + + M_D -- "verify(metadata, [origin, sender, body])" --> ISM + M_D -- "handle(origin, sender, body)" --> Recipient + ISM -. "interchainSecurityModule()" .- Recipient + end + + Relayer -- "process()" --> M_D + + aws -. "元数据" .-> Relayer + aws -. "moduleType()" .- ISM + + POS -. "validators()" .- ISM + + click ISM https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/MultisigIsm.sol + + style Sender fill:#efab17 + style Recipient fill:#efab17 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/validators/validator-signatures-aws.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/validators/validator-signatures-aws.mdx new file mode 100644 index 00000000..b704f46d --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/operate/validators/validator-signatures-aws.mdx @@ -0,0 +1,77 @@ +# AWS 签名存储桶设置 + +配置您的签名密钥和 S3 存储桶 + +:::info + +这些说明适用于验证器密钥存在于 AWS 密钥管理服务(KMS)中,且验证器签名公开发布在 S3 存储桶中的生产环境。 + +如果您只打算运行验证器用于测试或开发目的,请考虑改为遵循[本地设置指南](../../guides/deploy-hyperlane-local-agents.mdx)。 + +::: + +### 1. 创建 AWS IAM 用户和签名密钥 + +按照[代理密钥](../set-up-agent-keys.mdx)中的说明创建 AWS IAM 用户和 KMS 或十六进制密钥。您将在后续步骤中使用此密钥的凭证。 + +### 2. 创建 S3 存储桶 + +:::info +请注意,步骤 1(创建 IAM 用户)是设置 S3 存储桶所必需的,因此无论使用何种类型的密钥都是必需的。 +::: + +您的验证器将把他们的签名发布到这个存储桶。 + +1. 在 AWS 控制台中转到 AWS 的 S3。 +2. 在右侧,点击橙色的"创建存储桶"按钮 +3. 选择一个信息丰富的存储桶名称,例如 `hyperlane-validator-signatures-${validator_name}-${chain_name}` +4. 考虑选择与您在上一步创建的 KMS 密钥相同的区域。 +5. 保持对象所有权的推荐设置"ACL 已禁用"。 +6. 配置公共访问设置,以便中继器可以读取您的签名 + 1. 取消选中"阻止所有公共访问" + 2. 选中前两个通过访问控制列表阻止访问的选项 + 3. 保持最后两个选项未选中,我们将通过存储桶策略授予公共读取访问权限 + 4. 确认这些设置可能会导致您的存储桶公开访问 +7. 其余默认设置可以保持不变,点击底部的橙色"创建存储桶"按钮 + +### 3. 配置 S3 存储桶权限 + +您的验证器 IAM 用户需要写入权限,并且应该可以被中继器公开读取。 + +1. 在 AWS 控制台中导航回"身份和访问管理(IAM)" +2. 在"IAM 资源"下,您应该至少看到一个"用户",点击进入 +3. 点击您之前配置的用户名(例如 `hyperlane-validator-${chain_name}`) +4. 复制"用户 ARN"到剪贴板,它应该看起来像 `arn:aws:iam::791444913613:user/hyperlane-validator-${chain_name}` +5. 导航回 AWS 控制台中的"S3" +6. 点击您刚刚创建的存储桶的名称 +7. 在存储桶名称下方,点击"权限" +8. 滚动到"存储桶策略"并点击"编辑" +9. 输入以下内容。存储桶 ARN 显示在输入策略的位置上方 + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": "*", + "Action": ["s3:GetObject", "s3:ListBucket"], + "Resource": ["${BUCKET_ARN}", "${BUCKET_ARN}/*"] + }, + { + "Effect": "Allow", + "Principal": { + "AWS": "${USER_ARN}" + }, + "Action": ["s3:DeleteObject", "s3:PutObject"], + "Resource": "${BUCKET_ARN}/*" + } + ] +} +``` + +:::tip + +高级用户可以考虑使用 [S3 Terraform 模块](../deploy-with-terraform.mdx#iam--kms)来创建具有正确权限的 S3 存储桶。 + +::: diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/core/_prerequisites-config-artifacts.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/core/_prerequisites-config-artifacts.mdx new file mode 100644 index 00000000..b7b39418 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/core/_prerequisites-config-artifacts.mdx @@ -0,0 +1,6 @@ +## 前置条件 + +- 由 `hyperlane core init` 生成的核心配置。 + - 此配置用于部署包括 mailbox 在内的核心合约。默认情况下,它使用 `CURRENT_DIR/configs/core-config.yaml` 作为文件路径。 +- 部署 mailbox 的目标链。 +- 对当前拥有 mailbox 的私钥的访问权限。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/core/commands/_core-apply-chain.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/core/commands/_core-apply-chain.mdx new file mode 100644 index 00000000..3413f5f9 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/core/commands/_core-apply-chain.mdx @@ -0,0 +1,3 @@ +```bash +hyperlane core apply --chain +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/core/commands/_core-read-chain.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/core/commands/_core-read-chain.mdx new file mode 100644 index 00000000..d96a00f7 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/core/commands/_core-read-chain.mdx @@ -0,0 +1,3 @@ +```bash +hyperlane core read --chain +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_cli-chains.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_cli-chains.mdx new file mode 100644 index 00000000..963e955e --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_cli-chains.mdx @@ -0,0 +1,13 @@ +部署需要了解将要交互的所有链的基本信息。如果目标链尚未在 [Hyperlane 注册表](https://github.com/hyperlane-xyz/hyperlane-registry)中,您必须为它们指定链元数据。详细信息请参见 [CLI 参考](/docs/reference/cli.mdx)。 + +要查看当前已知的链,运行以下命令: +```bash +hyperlane registry list +``` + +要为其他链创建链元数据配置,运行以下命令: +```bash +hyperlane registry init +``` + +或者您可以手动定义配置。有关其模式,请参见 [ChainMetadata 类型](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts#L62)。示例请参见 [chain-config.yaml](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/chain-config.yaml)。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_deploy-contracts.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_deploy-contracts.mdx new file mode 100644 index 00000000..2e051d79 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_deploy-contracts.mdx @@ -0,0 +1,85 @@ +import CliChainsPartial from "/docs/partials/deploy-hyperlane/_cli-chains.mdx"; + +在设置好部署者、验证器和中继器密钥后,是时候使用 Hyperlane CLI 将智能合约部署到本地和远程链上了。 + +在本地链上,我们将部署: + +- 核心合约,包括可用于发送和接收消息的 [Mailbox](/docs/reference/messaging/messaging-interface)。 + +在所有链上,我们将部署: + +- 一个多重签名 ISM,用于验证来自其他本地和远程链的入站消息。 +- 一个 `InterchainGasPaymaster`,用于向我们的中继器支付跨链消息传递费用。 +- 一个 `TestRecipient`,我们将向其发送消息以测试一切是否正常工作。 + +### 设置 + +首先,安装 [Hyperlane CLI](/docs/reference/cli.mdx)。 + +```bash +npm install -g @hyperlane-xyz/cli +``` + +#### 链配置 + + + +#### 使用多重签名 ISM 的核心部署 + +现在 CLI 知道如何与所有链进行交互,但它还需要知道如何配置您的跨链安全模块(ISM)。 + +要使用多重签名 ISM 配置初始化核心配置,您可以使用 JSON 或 YAML 手动定义(参见[示例配置](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/core-config.yaml)),或使用以下命令创建: + +```bash +hyperlane core init --advanced +``` + +当询问 ISM 类型时,选择 `messageIdMultisigIsm`。在本指南中,我们将使用 1/1 多重签名,因此选择阈值为 `1` 并输入您的密钥地址。 + +当询问默认钩子类型和所需钩子类型时,选择 `merkleTreeHook`。 + +### 进行核心部署的预演 + +:::note + +要执行预演,您需要在单独的终端实例中运行 Anvil 节点。 +要启动 Anvil 节点,运行 `anvil`。 +有关 Anvil 和安装的更多信息,请查看 [Foundry 的 Anvil 文档](https://book.getfoundry.sh/anvil/)。 + +::: + +在执行部署之前,您可以通过 `--dry-run ` 或 `-d ` 进行预演,以确保部署将成功,并提供部署的 gas 成本分析。这不会触发任何实际交易,而是模拟部署以显示所需合约及其各自的 gas 成本。 + +除了验证即将进行的部署外,您还可以通过 `--from-address` 或 `-f` 选项提供您打算用于部署的 EOA 地址。 +这将确保您有足够的资金完成部署。 + +```bash +hyperlane core deploy --dry-run chain1 \ + --from-address $YOUR_DEPLOYER_ADDRESS \ # (可选) 通过 Anvil 模拟的账户地址;默认为 HYP_KEY 环境变量 + --registry \ # (可选) 主注册表的路径;默认为 Hyperlane github 注册表 + --overrides # (可选) 覆盖注册表的路径;默认为本地 ./ 路径 +``` + +### 部署 + +我们现在准备使用 `core deploy` 命令来部署 Hyperlane 合约。为了支付交易费用,该命令需要步骤 1 中的合约部署者密钥,可以通过 `HYP_KEY` 环境变量或命令参数提供。 + +```bash +hyperlane core deploy +``` + +### 验证 + +部署合约的构件将写入配置的注册表中。默认情况下,您可以在运行命令的本地目录中找到新地址(例如 `./chains/chain1/addresses.yaml`)。 + +### 代理配置 + +现在我们准备使用已部署的合约生成代理配置,该配置将在后续步骤中被代理(验证器和中继器)使用。 + +```bash +hyperlane registry agent-config --chains chain1 +``` + +将 `CONFIG_FILES` 环境变量设置为生成的代理配置路径。 +```bash +export CONFIG_FILES=/full/path/to/configs/agent-config.json diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_send-test-messages.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_send-test-messages.mdx new file mode 100644 index 00000000..0341db60 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_send-test-messages.mdx @@ -0,0 +1,8 @@ +您可以通过在链对之间发送测试消息来检查一切是否正常工作。 +使用 CLI 发起消息。 + +```bash +hyperlane send message --key $PRIVATE_KEY +``` + +`send message` 命令会在消息被分发时通知您。稍等片刻后,将显示传递确认。如果消息传递超时,很可能是上述步骤中的验证器或中继器设置存在问题。要进行故障排除,请首先查看源链中继器日志。如果您需要进一步帮助,请在 [Discord](https://discord.gg/hyperlane) 上联系我们。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_setup-keys.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_setup-keys.mdx new file mode 100644 index 00000000..151ac3ab --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_setup-keys.mdx @@ -0,0 +1,52 @@ +您需要设置和提供资金的三个密钥。 + +:::tip + +开始时,您可以简化操作,对所有三个角色使用相同的十六进制密钥。 + +::: + + + + + + + + + + + + + + + + + + + + + + + + + + +
密钥角色描述资金需求
合约部署者32 字节十六进制私钥需要在所有要部署合约的链上提供资金。
验证器账户 + 用于签署来自本地链的出站消息的验证器地址列表。开始时只需要一个验证器即可。 + + 需要少量资金,以便验证器可以通过一次性交易在链上公布其签名的位置 +
中继器账户 + 您将运行的单个中继器需要在其将传递消息的每个链上都有一个账户 + + 中继器必须在其所有中继消息的链上都有余额。 +
+ +有关如何生成密钥的说明,请参阅 [代理密钥](/docs/operate/set-up-agent-keys) 部分。您的部署者密钥**必须**是十六进制密钥,而验证器和中继器密钥可以是十六进制或 AWS KMS。 + +如果在使用 [Foundry 的 Anvil](https://github.com/foundry-rs/foundry/tree/master/crates/anvil) 的本地网络上部署,请使用以下命令为您新生成的账户提供资金。它使用预先提供资金的私钥之一向 `$YOUR_TARGET_ADDRESS` 环境变量中的地址转账 1 ETH。 + +```bash +cast send --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ + $YOUR_TARGET_ADDRESS \ + --value 1000000000000000000 +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_terminology.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_terminology.mdx new file mode 100644 index 00000000..8f19c242 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/deploy-hyperlane/_terminology.mdx @@ -0,0 +1,5 @@ +## 术语 + +"**本地链**"是您要部署 Hyperlane 的新链。 + +"**远程链**"是已有 Hyperlane 部署的链,您希望您的本地链能够与其进行消息的收发。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/ts-sdk-placeholder.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/ts-sdk-placeholder.mdx new file mode 100644 index 00000000..78e6c67a --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/ts-sdk-placeholder.mdx @@ -0,0 +1,3 @@ +对于希望进一步为自己的项目定制 Warp UI 或构建自己的跨链应用程序的开发者,我们建议您探索 [Typescript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk)。 + +SDK 包含一组不断增长的实用工具和抽象,用于在不同协议(EVM、Cosmos、Solana)中与 Hyperlane 进行交互。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/warp-routes/_prerequisites-config-symbol.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/warp-routes/_prerequisites-config-symbol.mdx new file mode 100644 index 00000000..40b9e652 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/warp-routes/_prerequisites-config-symbol.mdx @@ -0,0 +1,8 @@ +## 前置条件 + +- warp route 配置。 + - 对于新部署,此配置可能使用 `CURRENT_DIR/configs/warp-route-deployment.yaml` 作为文件路径。 + - 对于现有部署,如果存在于注册表中,可以使用 `hyperlane warp read` 生成配置。 +- warp route 代币符号。 + - 代币符号可以在链上找到,或在您的本地 Hyperlane 注册表中找到。默认情况下,它被写入到 `$HOME/.hyperlane/deployments/warp_routes/`。 +- 访问当前拥有 warp route 的私钥。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/warp-routes/commands/_warp-apply-symbol-config-default.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/warp-routes/commands/_warp-apply-symbol-config-default.mdx new file mode 100644 index 00000000..4ffbe047 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/warp-routes/commands/_warp-apply-symbol-config-default.mdx @@ -0,0 +1,5 @@ +```bash +hyperlane warp apply \ + --symbol \ + --config $(pwd)/configs/warp-route-deployment.yaml +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/warp-routes/commands/_warp-read-symbol-chain.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/warp-routes/commands/_warp-read-symbol-chain.mdx new file mode 100644 index 00000000..80ba3924 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/warp-routes/commands/_warp-read-symbol-chain.mdx @@ -0,0 +1,3 @@ +```bash +hyperlane warp read --symbol +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/production.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/production.mdx new file mode 100644 index 00000000..8876a2c2 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/production.mdx @@ -0,0 +1,15 @@ +# 如何将 Hyperlane 部署投入生产 + +要将你的 Hyperlane 部署投入生产环境,请按照以下步骤设置链的核心部署并配置 warp route 部署。 + +### 1. 核心部署 + +首先,你需要设置和生产化 Hyperlane 部署的核心组件。 + +- [更新邮箱默认 ISM](/guides/update-mailbox-default-ism.mdx):更新与邮箱合约关联的跨链安全模块(ISM)。ISM 作为关键的安全层,验证链之间的消息。确保默认 ISM 设置符合你的安全要求。 +- [转移邮箱所有权](/guides/transfer-mailbox-ownership.mdx):将邮箱合约的所有权转移给生产就绪的所有者账户。这一步通过确保只有受信任的方可以控制其配置来保护邮箱。 + +### 2. Warp Route 部署 + +- [移除受信任的中继器](/guides/remove-trusted-relayer.mdx):移除可能最初配置的任何测试或开发中继器。在生产环境中,确保只使用受信任的安全中继器,以防止未经授权的消息中继。 +- [转移 Warp Route 所有权](/guides/transfer-warp-route-ownership.mdx):将 Warp Route 的所有权转移给指定的生产所有者。这一步确保只有受信任的方可以控制关键的 Warp Route 设置,如 ISM 配置、验证者选项和中继器设置。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/aggregation-ISM.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/aggregation-ISM.mdx new file mode 100644 index 00000000..295a8dff --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/aggregation-ISM.mdx @@ -0,0 +1,33 @@ +# 聚合 ISM + +开发者可以使用 `AggregationISM` 来组合多个 ISM 的安全性。简单来说,`AggregationISM` 要求 `n` 个 ISM 中的 `m` 个验证特定的跨链消息。 + +开发者可以为每个源链配置一组 `n` 个 ISM,以及验证消息所需的 ISM 数量。 + +`AggregationISM` 可以聚合任何 ISM 的安全性。例如,用户可以部署一个带有自己验证者集合的[多重签名 ISM](multisig-ISM.mdx),并部署一个 `AggregationISM` 来聚合该 ISM 和 Hyperlane 默认 ISM。 + +## 接口 + +`AggregationISM` 必须实现 `IAggregationIsm` 接口。 + +```solidity file=/node_modules/@hyperlane-xyz/core/contracts/interfaces/isms/IAggregationIsm.sol + +``` + +## 配置 + +[Hyperlane monorepo](https://github.com/hyperlane-xyz/hyperlane-monorepo) 包含一个 `AggregationISM` 实现,应用开发者可以直接使用这个实现,指定他们想要的配置。 + +开发者可以为每个源链配置一组 `n` 个 ISM,以及验证消息所需的 ISM 数量。 + +`AggregationISM` 可以聚合任何 ISM 的安全性。例如,用户可以部署一个带有自己验证者集合的[多重签名 ISM](./multisig-ISM.mdx),并部署一个 `AggregationISM` 来聚合该 ISM 和 Hyperlane 默认 ISM。 + +## 定制 + +hyperlane-monorepo 包含一个抽象的 `AggregationISM` 实现,应用开发者可以分叉它。 + +开发者只需要实现 `modulesAndThreshold()` 函数。 + +通过创建自定义实现,应用开发者可以根据其应用的需求定制 `AggregationISM` 提供的安全性。 + +例如,自定义实现可以要求低价值消息由[多重签名 ISM](./multisig-ISM.mdx)验证,而高价值消息_还需要_由 Wormhole ISM 验证。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/ccip-read-ISM.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/ccip-read-ISM.mdx new file mode 100644 index 00000000..8e42e2e0 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/ccip-read-ISM.mdx @@ -0,0 +1,146 @@ +# CCIP Read ISM + +使用 `CcipReadIsm` 为开发者提供了验证跨链消息的极大灵活性。最终,其他所有类型的 ISM 都可以实现为 CCIP Read ISM,因此在构建新类型的 ISM 时,建议构建 CCIP Read ISM,因为所有中继器集成工作都已完成。 + +在使用 CCIP Read ISM 时需要注意一点:它们确实引入了对外部(相对于区块链而言)但可自托管的 API 的依赖。如果这对您的用例来说是一个严重的阻碍,您可能需要考虑其他消息验证技术。 + +在构建 CCIP Read ISM 之前,值得熟悉一下 [CCIP Read 规范](https://eips.ethereum.org/EIPS/eip-3668)。该规范描述了一个通用协议,允许 EVM 兼容链上的智能合约查询和使用链下数据。 + +## 工作原理 + +中继器会持续监听从 Hyperlane [Mailbox](../../protocol/mailbox.mdx) 发出的 `Dispatch` 事件。当消息被发送并被中继器接收时,中继器将查询目标 ISM 以获取有关如何处理消息以及传递是否会成功的信息。 + +:::info +需要在您的 ISM 上正确设置 `moduleType` 变量,以便中继器知道这是一个 CCIP Read ISM。为确保配置正确,您可以继承 `@hyperlane-xyz/core` 中的 `AbstractCcipReadIsm`。 +::: + +中继器将使用要传递的消息内容调用 ISM 上的 `getOffchainVerifyInfo(bytes)` 函数。该函数应该以下面[接口](#接口)部分描述的 `OffchainLookup` 错误回滚。 + +中继器将查询此回滚消息中指定的端点,并将提供的响应和原始消息传递给目标 `Mailbox` 的 `process(bytes,bytes)` 函数。 + +## 接口 + +`CcipReadIsm` 必须实现 `ICcipReadIsm` 接口,并应该扩展 `AbstractCcipReadIsm`,这是一个正确设置 `moduleType` 的便利合约。 + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.8.0; + +import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol"; + +interface ICcipReadIsm is IInterchainSecurityModule { + /// @dev https://eips.ethereum.org/EIPS/eip-3668 + /// @param sender 发起调用的合约地址,通常是 address(this) + /// @param urls 用于查询链下数据的 URL + /// @param callData 链下服务需要的上下文来服务请求 + /// @param callbackFunction 用链下信息调用的函数选择器 + /// @param extraData 传递给 callbackFunction 的额外信息 + error OffchainLookup( + address sender, + string[] urls, + bytes callData, + bytes4 callbackFunction, + bytes extraData + ); + + /** + * @notice 回滚并提供查询链下信息所需的数据, + * 通过源 mailbox 提交 + * @dev 更多信息请参见 https://eips.ethereum.org/EIPS/eip-3668 + * @param _message 帮助构建链下查询的数据 + */ + function getOffchainVerifyInfo(bytes calldata _message) external view; +} +``` + +## 配置 + +[ChainlinkISM](https://github.com/AlexBHarley/permissionless-chainlink-feeds) 是开发 CCIP Read ISM 时的一个很好的参考示例。`ChainlinkISM` 使用一组 Chainlink 预言机进行初始化,并验证提供的价格数据是否已被某些签名者子集签名。 + +### API + +根据 CCIP Read,链下 API 需要返回以下形式的 JSON 数据: + +```json +{ + "data": "..." +} +``` + +中继器将把这个 `data` 属性作为 `metadata` 参数传递给 `Mailbox.process(bytes metadata, bytes message)`。 + +注意,在 Chainlink ISM 的情况下,数据接收者也作为验证 ISM,`data` 只是带有相关签名的原始交易,用于提交价格数据。`message` 属性在某种程度上是冗余的。 + +### 合约 + +在设置 ISM 时,`getOffchainVerifyInfo` 和 `verify` 函数是需要指定的重要函数。 + +- `getOffchainVerifyInfo` 函数应该以 `OffchainLookup` 错误回滚,该错误指示中继器查询给定的 API 端点。`OffchainLookup` 错误允许提供一组 API 端点,因此您可以强制执行任何级别的冗余 + +- `verify` 必须验证提供的 `metadata` 的合法性。同样,[ChainlinkISM 实现](https://github.com/AlexBHarley/permissionless-chainlink-feeds/blob/main/apps/contracts/contracts/ChainlinkAggregator.sol#L114)在为您自己的 ISM 开发此逻辑时可以作为有用的参考点。 + +以下是 CCIP Read ISM 的基本框架,其中 ISM 也是消息的接收者,就像 Chainlink ISM 一样。 + +```solidity +pragma solidity ^0.8.13; + +import {AbstractCcipReadIsm} from "@hyperlane-xyz/core/contracts/isms/ccip-read/AbstractCcipReadIsm.sol"; +import {IInterchainSecurityModule, ISpecifiesInterchainSecurityModule} from "@hyperlane-xyz/core/contracts/interfaces/IInterchainSecurityModule.sol"; +import {IMailbox} from "@hyperlane-xyz/core/contracts/interfaces/IMailbox.sol"; +import {Message} from "@hyperlane-xyz/core/contracts/libs/Message.sol"; + +contract MyCcipReadIsm is AbstractCcipReadIsm, ISpecifiesInterchainSecurityModule { + using Message for bytes; + IMailbox mailbox; + + ... + + /** + * 无操作,所有操作都在 verify 函数中进行 + */ + function handle(uint32, bytes32, bytes calldata _report) public {} + + + /** + * @param _metadata ABI 编码的模块元数据 + * @param _message 格式化的 Hyperlane 消息(参见 Message.sol) + */ + function verify( + bytes calldata _metadata, + bytes calldata _message + ) external returns (bool) { + ... + } + + function interchainSecurityModule() + external + view + returns (IInterchainSecurityModule) + { + return IInterchainSecurityModule(address(this)); + } + + function getOffchainVerifyInfo( + bytes calldata _message + ) external view override { + revert OffchainLookup( + address(this), + offchainUrls, + _message, + MyCcipReadIsm.process.selector, + _message + ); + } + + /** + * 为完全兼容 CCIP Read 规范而提供。无论在 `OffchainLookup` 错误中 + * 指定了什么选择器,中继器都会直接调用 Mailbox + */ + function process( + bytes calldata _metadata, + bytes calldata _message + ) external { + mailbox.process(_metadata, _message); + } +} +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/custom-ISM.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/custom-ISM.mdx new file mode 100644 index 00000000..c3c805c0 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/custom-ISM.mdx @@ -0,0 +1,108 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# 覆盖默认 ISM + +开发者可以通过在其应用中实现 `ISpecifiesInterchainSecurityModule` 接口来指定或覆盖默认的 ISM。 + +:::info +如果没有指定 ISM,或者指定的 ISM 是空地址,将使用目标链 Mailbox 上配置的默认 ISM。 +::: + +## ISM 接口 + +ISM 必须实现 `IInterchainSecurityModel()` 接口。这个实现可以根据应用的需求进行配置、组合和定制。 + +具体来说,这个接口必须在实现 `handle()` 的同一个智能合约中实现。 + +该接口包含两个函数:`verify` 和 `moduleType`。 + +
+`IInterchainSecurityModule` 接口 + + + + +```solidity +interface IInterchainSecurityModule { + /** + * @notice Returns the security model's type + * @dev Called by the Mailbox contract when dispatching a message + * @return The security model type ID + */ + function moduleType() external view returns (uint8); + + /** + * @notice Verifies interchain messages + * @dev Called by a Mailbox contract before delivering a message + * @param _metadata ABI encoded metadata needed for verification + * @param _message Hyperlane formatted interchain message + * @return True if the message was verified + */ + function verify(bytes calldata _metadata, bytes calldata _message) + external + returns (bool); +} +``` + + + +
+ +### Verify + +ISM 必须实现的主要函数是 `verify()`。[Mailbox](../mailbox.mdx) 在将消息传递给接收者之前会调用 `IInterchainSecurityModule.verify()`。如果 `verify()` 回滚或返回 `false`,消息将不会被传递。 + +#### 参数: + +- `_metadata`:由[中继器](../agents/relayer.mdx)提供的任意字节。通常,这些字节是特定于 ISM 的。例如,[多重签名 ISM](multisig-ISM.mdx) 的 `_metadata` 必须包含验证者签名。 + +- `_message`:由待验证的 Hyperlane 消息组成。ISM 可以使用它来检查被验证消息的详细信息。例如,[多重签名 ISM](multisig-ISM.mdx) 可以根据消息的源链更改验证者集合。 + +:::warning +有关传递给 `verify()` 的 Hyperlane 消息格式的更多信息,请参见 [`Message.sol`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) 库。 +::: + +```solidity +/** + * @notice Verifies interchain messages + * @dev Called by a Mailbox contract before delivering a message + * @param _metadata ABI encoded metadata needed for verification + * @param _message Hyperlane formatted interchain message + * @return True if the message was verified + */ +function verify(bytes calldata _metadata, bytes calldata _message) + external + returns (bool); +``` + +### 模块类型 + +ISM 必须实现的第二个函数是 `moduleType()`。 + +```solidity +/** + * @notice Returns the security model's type + * @dev Called by the Mailbox contract when dispatching a message + * @return The security model type ID + */ +function moduleType() external view returns (uint8); +``` + +这用于向[中继器](../agents/relayer.mdx)指示在 `_metadata` 中应包含什么。ISM **必须**返回支持的模块类型之一。 + +```solidity +enum Types { + UNUSED, + ROUTING, + AGGREGATION, + LEGACY_MULTISIG, + MERKLE_ROOT_MULTISIG, + MESSAGE_ID_MULTISIG, + NULL, // 用于中继器不携带元数据的情况 + CCIP_READ, + ARB_L2_TO_L1, + WEIGHTED_MERKLE_ROOT_MULTISIG, + WEIGHTED_MESSAGE_ID_MULTISIG, + OP_L2_TO_L1 +} diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/modular-security.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/modular-security.mdx new file mode 100644 index 00000000..e5337870 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/modular-security.mdx @@ -0,0 +1,45 @@ +import IsmDiagram from "@site/src/diagrams/messaging-isms.md"; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# 模块化安全 + +Hyperlane 由**跨链安全模块**(Interchain Security Modules,简称 ISMs)保护。ISMs 是智能合约,负责验证在目标链上传递的跨链消息是否_确实_在源链上发送。 + + + +## 核心概念 + +### 默认 ISM vs 自定义 ISM + +开发者可以使用 [Mailbox](../mailbox.mdx) 的默认 ISM,也可以指定自己的应用特定 ISM。应用特定的 ISM 可以是: + +- **配置型**:使用预构建的 ISM 并设置自定义参数 +- **组合型**:像安全"乐高"一样组合多个 ISM +- **定制型**:创建全新的、针对特定需求定制的 ISM + +#### 配置 + +Hyperlane 定义了一组预构建的 ISM。开发者可以"开箱即用"地部署这些合约,并使用自己的参数进行配置。 + +例如,想要增加跨链安全主权的应用开发者可以部署一个 [多重签名 ISM](multisig-ISM.mdx),并配置来自其社区的验证者。 + +#### 组合 + +ISM 就像安全["乐高"](https://en.wikipedia.org/wiki/Lego)。开发者可以混搭不同的 ISM,构建最适合其需求的安全模型。 + +例如,需要额外安全性的应用开发者可以部署一个[聚合 ISM](aggregation-ISM.mdx),该 ISM 要求同时通过以下验证: +1. 由 Hyperlane 社区验证者配置的[多重签名 ISM](multisig-ISM.mdx)的验证 +2. Wormhole ISM 的验证,确保 [Wormhole](https://wormhole.com/) 验证者集合中的法定人数已验证该消息 + +#### 定制 + +ISM 是完全可定制的。开发者可以编写自己的 ISM,根据应用需求进行定制。 + +例如,应用开发者可以构建基于消息内容调整安全模型的 ISM。对于高价值和低频消息(如治理),可以使用优先考虑安全性而非延迟和 gas 成本的安全模型进行验证。对于低价值和高频消息,可以使用优先考虑延迟和 gas 成本而非安全性的安全模型进行验证。 + +:::tip + +- 了解如何[覆盖默认 ISM](./custom-ISM.mdx) + +::: diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/multisig-ISM.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/multisig-ISM.mdx new file mode 100644 index 00000000..fe63c191 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/multisig-ISM.mdx @@ -0,0 +1,73 @@ +# 多重签名 ISM + +_通过验证者共识验证消息_ + +`MultisigISM` 是最常用的 ISM 类型之一。这些 ISM 验证 `n` 个[验证者](../agents/validators.mdx)中的 `m` 个是否已证明特定跨链消息的有效性。 + +## 多重签名模块类型 + +有两种类型的 `MultisigISM` 模块: + +```solidity + enum Types { + ... + MERKLE_ROOT_MULTISIG, + MESSAGE_ID_MULTISIG, + ... + } +``` + +### MerkleRootMultisigIsmMetadata + +**类型:`Types.MERKLE_ROOT_MULTISIG`** + +**元数据格式:** + +| **组件** | **长度(字节)** | **描述** | +| ------------------------------------ | --------------- | -------------------------------------- | +| 第 1 组件 | 32 | 源 Merkle 树地址 | +| 第 2 组件 | 4 | 消息 ID 在 Merkle 树中的索引 | +| 第 3 组件 | 32 | 已签名的检查点消息 ID | +| 第 4 组件 | 1024 | Merkle 证明 | +| 第 5 组件 | 4 | 已签名的检查点索引(从证明和索引计算得出) | +| 第 6 组件(长度 = 阈值 * 65 字节) | 阈值 * 65 | 验证者签名 | + +### MessageIdMultisigIsmMetadata + +**类型:`Types.MESSAGE_ID_MULTISIG`** + +**元数据格式:** + +| **组件** | **长度(字节)** | **描述** | +| ------------------------------------ | --------------- | ----------------- | +| 第 1 组件 | 32 | 源 Merkle 树地址 | +| 第 2 组件 | 32 | 已签名的检查点根 | +| 第 3 组件 | 4 | 已签名的检查点索引 | +| 第 4 组件(长度 = 阈值 * 65 字节) | 阈值 * 65 | 验证者签名 | + + + +## 接口 + +`MultisigISM` 必须实现 `IMultisigIsm` 接口。 + +```solidity file=/node_modules/@hyperlane-xyz/core/contracts/interfaces/isms/IMultisigIsm.sol + +``` + +## 配置 + +hyperlane-monorepo 包含 [`MultisigISM` 实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/solidity/contracts/isms/multisig)(包括一个[旧版本](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/multisig/LegacyMultisigIsm.sol)和更多通过工厂部署的[gas 高效版本](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/multisig/StaticMultisigIsm.sol)),应用开发者可以直接使用这些实现,指定他们想要的配置。 + +要配置 `MultisigISM` 实例: + +1. 开发者在每个源链上定义 `n` 个验证者集合。 +2. 设置一个阈值,指定确认消息所需的验证者签名数量(`m`)。 + +验证者签名**不**特定于某个 ISM。换句话说,开发者可以配置他们的 `MultisigISM` 使用在 Hyperlane 上运行的**任何**验证者。 + +## 定制 + +对于更具体的用例,开发者可以分叉 Hyperlane monorepo 中提供的抽象 `MultisigISM` 实现。主要的定制涉及实现 `validatorsAndThreshold()` 函数。 + +自定义实现允许开发者调整安全模型以满足其应用的需求。例如,自定义实现可以根据被验证消息的内容来改变所需的签名数量。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/routing-ISM.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/routing-ISM.mdx new file mode 100644 index 00000000..21c047d2 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/routing-ISM.mdx @@ -0,0 +1,29 @@ +# 路由 ISM + +开发者可以使用 `RoutingISM` 将消息验证委托给不同的 ISM。这允许开发者根据消息内容或应用上下文更改安全模型。 + +这个 ISM 只是根据消息的源链切换安全模型。一个简单的用例是为每个链使用不同的[多重签名 ISM](multisig-ISM.mdx)验证者集合。 + +最终,你可以想象一个 `DomainRoutingIsm` 根据源链使用的共识协议类型,路由到不同的基于轻客户端的 ISM。 + +## 接口 + +`RoutingISM` 必须实现 `IRoutingIsm` 接口。 + +```solidity file=/node_modules/@hyperlane-xyz/core/contracts/interfaces/isms/IRoutingIsm.sol + +``` + +## 配置 + +hyperlane-monorepo 包含一个 `RoutingISM` 实现,即 `DomainRoutingIsm` 和 `DefaultFallbackRoutingIsm`,应用开发者可以直接使用这些实现,指定他们想要的配置。 + +## 定制 + +hyperlane-monorepo 包含一个抽象的 `RoutingISM` 实现,应用开发者可以分叉它。 + +开发者只需要实现 `route()` 函数。 + +通过创建自定义实现,应用开发者可以根据其应用的需求定制 `RoutingISM` 提供的安全性。 + +例如,自定义实现可以根据消息的内容或接收消息的应用状态来更改安全模型。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/sequence-diagram.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/sequence-diagram.mdx new file mode 100644 index 00000000..cd548356 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/sequence-diagram.mdx @@ -0,0 +1,27 @@ +# 时序图 + +以下是跨链消息在目标链上被验证和传递的简化时序图。 + +:::info + +- 如果接收者没有实现 `ISpecifiesInterchainSecurityModule` 或 `recipient.interchainSecurityModule()` 返回 `address(0)`,将使用 [Mailbox](../mailbox.mdx) 上配置的默认 ISM 来验证消息。 +- 为了清晰起见,这部分内容在时序图中被省略。 + +::: + +```mermaid +sequenceDiagram + participant Relayer as 中继器 + participant Mailbox as 邮箱 + participant ISM as ISM + participant Recipient as 接收者 + + Relayer-->>ISM: moduleType() + ISM-->>Relayer: ISM 类型 + Relayer->>Mailbox: process(metadata, message) + Mailbox-->>Recipient: interchainSecurityModule() + Recipient-->>Mailbox: ISM 地址 + Mailbox->>ISM: verify(metadata, message) + ISM-->>Mailbox: true + Mailbox->>Recipient: handle(origin, sender, body) +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/OPStack-ISM.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/OPStack-ISM.mdx new file mode 100644 index 00000000..81a1f76f --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/OPStack-ISM.mdx @@ -0,0 +1,3 @@ +# OP Stack ISM + +OP Stack ISM 与 OP Stack hook 一起使用,利用 OP Stack rollup 的[结算层](https://stack.optimism.io/docs/understand/landscape/#execution)安全性来处理以太坊和 rollup 之间传递的消息。更多信息请参见 [OP Stack Hook](/docs/reference/hooks/op-stack.mdx)。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/arbitrum-L2-to-L1-ISM.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/arbitrum-L2-to-L1-ISM.mdx new file mode 100644 index 00000000..f97d8a22 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/arbitrum-L2-to-L1-ISM.mdx @@ -0,0 +1,3 @@ +# Arbitrum L2 到 L1 ISM + +Arbitrum L2 到 L1 ISM 与 Arbitrum L2 到 L1 hook 一起使用,利用 Arbitrum rollup 的安全性来处理从 Arbitrum L2 到以太坊的消息传递。更多信息请参见 [Arbitrum L2 到 L1 Hook](/docs/reference/hooks/arbitrum-L2-to-L1.mdx)。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/optimistic-ISM.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/optimistic-ISM.mdx new file mode 100644 index 00000000..fee917ec --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/optimistic-ISM.mdx @@ -0,0 +1,13 @@ +# Optimistic ISM + +优先考虑安全性而非活性 + +:::warning +`OptimisticISM` 即将推出,尚未实现。此页面仅供参考。随着设计的成熟,具体细节可能会发生变化。 +::: + +`OptimisticISM` 编码了由 [Optics](https://docs.celo.org/protocol/bridge/optics) 开创并被 [Synapse](https://docs.synapseprotocol.com/synapse-interchain-network-sin/synapse-interchain-network/deep-dive-optimistic-pos)、[Nomad](https://docs.nomad.xyz/the-nomad-protocol/verification-mechanisms/optimistic-verification) 和 [Connext](https://blog.connext.network/optimistic-bridges-fb800dc7b0e0) 采用的 optimistic 验证安全模型。 + +`OptimisticISM` 依赖于消息验证后的欺诈窗口期,在此期间,配置在 `OptimisticISM` 上的 `n` 个 **watchers** 中的 `m` 个有机会将消息标记为欺诈,从而防止消息被传递给接收者。 + +**这种安全模型优先考虑安全性而非活性;**增加的消息延迟允许添加第二层安全性(watchers),而不会显著增加 gas 成本。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/polygon-POS-ISM.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/polygon-POS-ISM.mdx new file mode 100644 index 00000000..60eb750b --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/polygon-POS-ISM.mdx @@ -0,0 +1,3 @@ +# Polygon PoS ISM + +Polygon PoS ISM 与 Polygon PoS hook 一起使用,利用 Polygon 的[状态同步机制](https://docs.polygon.technology/pos/architecture/bor/state-sync/)安全性来处理以太坊和 Polygon PoS 链之间传递的消息。更多信息请参见 [Polygon PoS Hook](/docs/reference/hooks/polygon-pos.mdx)。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/wormhole-ISM.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/wormhole-ISM.mdx new file mode 100644 index 00000000..5da50920 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/ISM/third-party-ISMs/wormhole-ISM.mdx @@ -0,0 +1,13 @@ +# Wormhole ISM + +:::warning +`WormholeISM` 即将推出,尚未实现。此页面仅供参考。随着设计的成熟,具体细节可能会发生变化。 +::: + +`WormholeISM` 编码了 [Wormhole](https://wormhole.com/) 跨链通信协议使用的安全模型。 + +此 ISM 要求 19 个 [Wormhole 守护者](https://wormhole.com/network/#guardians) 中的 13 个证明 Hyperlane 消息的有效性。 + +## 组合 + +开发者可以使用 [聚合 ISM](../aggregation-ISM.mdx) 将 Wormhole ISM 与 [多重签名 ISM](../multisig-ISM.mdx) 组合,要求 n 个 Hyperlane 验证者中的 m 个**和** 19 个 Wormhole 守护者中的 13 个验证消息。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/agents.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/agents.mdx new file mode 100644 index 00000000..8dc6b435 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/agents.mdx @@ -0,0 +1,8 @@ +# 代理 + +Hyperlane 协议将跨链消息传递的传输层与安全层解耦。要运行部署,它依赖于观察链上活动并执行协议的传输或安全方面的链下代理。 + +这些代理使用 Rust 实现,并以 Docker 镜像和二进制文件的形式分发。 + +1. [中继器](./agents/relayer.mdx)完成协议的消息传输要求。它们为[`IInterchainSecurityModule` 接口](../reference/ISM/specify-your-ISM)聚合链下安全元数据,并将消息传递给接收者。 +2. [验证器](./agents/validators.mdx)作为[多重签名 ISM](./ISM/multisig-ISM.mdx)或[Hyperlane AVS](./economic-security/hyperlane-avs.mdx)的一部分,通过验证[邮箱](./mailbox.mdx)消息的有效性并使其签名对中继器可用来完成协议的安全要求。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/agents/relayer.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/agents/relayer.mdx new file mode 100644 index 00000000..c3be840b --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/agents/relayer.mdx @@ -0,0 +1,43 @@ +# 中继器 + +## 概述 + +### 核心功能 + +中继器运行 Hyperlane 协议的传输层,负责将消息从源链传递到目标链。根据接收方指定的[跨链安全模块 (ISM)](../../reference/ISM/specify-your-ISM),可能需要元数据来证明消息的安全性,例如用于[多重签名 ISM](../ISM/multisig-ISM.mdx)的验证者签名、默克尔证明、零知识证明等。因此,在尝试传递之前,中继器会收集任何 ISM 特定的元数据。 + +:::tip +中继器将定期重试元数据收集和消息提交。这对于提高对各种中断的恢复能力很重要,比如:没有支付传递的 gas 费用、中继器余额不足、目标链上交易费用临时激增、验证者停机等情况。 +::: + +### 中继器激励 + +消息发送者在源链上支付传递费用,中继器运营者有责任将收入重新平衡到目标链账户,以便始终能够支付传递交易费用。中继器不会从协议中直接获得代币激励,但运营者可以为其提供的关键服务配置费用结构。更多信息,请查看[跨链 Gas 支付 (IGPs)](../interchain-gas-payment.mdx)。 + +### 运行中继器 + +中继器可以轻松配置他们希望处理的消息。目前,中继器将支持: + +1. 发送者/接收者白名单。 +2. 发送者/接收者黑名单。 +3. 能够接受[源链上的支付](../../reference/messaging/send.mdx#quote-dispatch)以处理目标链上的消息。 + +虽然运行是无需许可的,但由消息发送者来选择支付哪个中继器进行传递。[邮箱](../mailbox.mdx)集成通常默认总是支付同一个中继器,但消息发送者可以选择退出。为了方便起见,Hyperlane 将运行一个开源且可配置的中继器代理,以 Rust 二进制文件的形式实现。如果您想运行自己的中继器,我们已经开源了[二进制文件](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/main/agents/relayer)。 + +运行自己的中继器涉及部署一个 [IGP 合约](../interchain-gas-payment.mdx)并在其中维护代币汇率和 gas 价格,以准确收取消息传递费用。 + +:::info +想要运行中继器?请参考[中继器](../../operate/relayer/run-relayer.mdx)指南。 +::: + +## 更多细节 + +中继器由两个主要任务组成:每个源链的索引器和每个目标链的提交器。 + +![高级中继器架构](/img/relayer-architecture-high-level.png) + +### 索引器 + +通过使用 RPC 查询[邮箱](../mailbox.mdx)合约事件来索引新的和历史消息。同时也会索引[gas 支付](../interchain-gas-payment.mdx)以确认发送者支付了传递费用,某些 ISM 使用额外的源链数据。这种情况适用于多重签名 ISM,它依赖 Merkle Tree Hook 合约来告知中继器哪个验证者签名对应哪个消息。每种事件类型(消息、IGP、Merkle Tree 插入)都会生成一个独立的索引任务。 + +索引器将数据写入本地数据库(RocksDB)作为缓存,并与提交器任务通信 - 后者定期轮询数据库以检查是否有新消息被调度。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/agents/validators.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/agents/validators.mdx new file mode 100644 index 00000000..c47b89a8 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/agents/validators.mdx @@ -0,0 +1,62 @@ +# 验证器 + +## 概述 + +验证器作为[多重签名 ISM](../ISM/multisig-ISM.mdx)或[经济安全模块](../economic-security/economic-security.mdx)的一部分运行,负责完成 Hyperlane 协议的安全层。如果使用其他 ISM,则不需要验证器。他们负责通过在[邮箱](../mailbox.mdx)中发生新的调度时签署默克尔根(也称为检查点)来证明消息。签名必须对任何人(通常是中继器)都可用,以便获取并随消息一起提交到目标链。 + +与许多其他协议不同,Hyperlane **没有**固定的验证器集合。任何人都可以运行自己的验证器,只要接收方合约指定了包含其验证器的[多重签名 ISM](../ISM/multisig-ISM.mdx)即可。 + +验证器检查点是公开的。这确保了传输层是无需许可的,因为任何人都可以获取签名并调用 `Mailbox.process()` 来传递消息。中继器仅为消息发送者提供便利服务。 + +验证器只签署已最终确定的检查点,这一点很重要,以避免损害协议的安全性。签署被重组出去的消息会导致在经济安全模块中被惩罚。验证器代理连接到单个链以检查新消息。如果验证多个链,必须运行此代理的多个实例。 + +Hyperlane 正在开发一个用 Rust 实现的验证器二进制文件,任何人都可以轻松运行。在运营方面,验证器需要运行这个二进制文件,并能够访问他们正在验证的链的 RPC 提供商或节点。我们希望大多数 Hyperlane 验证器将来自每个链的现有节点运营者社区。 + +:::info +想要运行验证器?请参考[验证器指南](../../operate/validators/run-validators.mdx)。 +::: + +## 更多细节 + +验证器代理使用两种密钥类型:一种用于在其验证的区块链上签署交易,另一种用于在以太坊兼容的 ECDSA 曲线上签署检查点。由于检查点是公开的,当验证器首次开始运营时,必须通过链上的 `announce` 交易宣布其检查点位置。这是验证器代理提交的唯一交易;区块链特定的密钥在其他情况下完全不使用。还可以选择手动宣布新的验证器,以避免配置区块链特定的密钥。验证器可以由任何人宣布。 + +对于使用[多重签名 ISM](../../reference/ISM/multisig-ISM-interface.mdx)的消息,验证器通过调用 `MerkleTreeHook.latestCheckpoint()` 读取当前的默克尔根。 + +### 多重签名 ISM 先决条件 + +要验证来自源链的消息,验证器的检查点签名密钥必须在目标链接收方指定的[多重签名 ISM](../../reference/ISM/multisig-ISM-interface.mdx)中注册。这只能在部署 ISM 合约时完成,但可以通过在任何 [StaticThresholdAddressSetFactory](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/be4617b18ba638e0ef5a5326614bc4f8c58d25f9/solidity/contracts/libs/StaticAddressSetFactory.sol#L10) 实现上发送 `deploy(validatorAddresses, threshold)` 交易来轻松完成。 + +### AVS 运营者先决条件 + +要为 EigenLayer AVS 运行验证器并提供[经济安全性](../economic-security/economic-security.mdx),验证器必须注册为 AVS 运营者。更多详细信息请参见 [AVS 运营者指南](../../guides/avs-operator-guide.mdx)。 + +## 架构 + +验证器由两个主要任务组成:源链的索引器和用于发布签名默克尔根的检查点提交器。 + +### 索引器 + +验证器索引的唯一事件类型是来自 Merkle Tree Hook [合约](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/be4617b18ba638e0ef5a5326614bc4f8c58d25f9/solidity/contracts/hooks/MerkleTreeHook.sol#L32)的 `InsertedIntoTree`,[邮箱](../mailbox.mdx)在每次调度新消息时都会调用该合约。这通过 RPC 发生,代理根据默克尔插入事件构建内存中的默克尔树,这些事件也缓存到本地 RocksDB 数据库中以便快速启动。每当调度新消息时,检查点提交器从内存树生成检查点并将其添加到处理队列中。 + +### 检查点提交器 + +检查点提交器使用 ECDSA 密钥来签署检查点并将其发布到高可用性存储。检查点的模式如下: + +```rust +pub struct Checkpoint { + /// 默克尔树 hook 地址 + pub merkle_tree_hook_address: H256, + /// 邮箱 / 默克尔树 hook 域 + pub mailbox_domain: u32, + /// 检查点的根 + pub root: H256, + /// 检查点的索引 + pub index: u32, +} +``` + +代理实现当前仅支持 AWS S3 作为检查点存储。Google Cloud Storage 已集成但存在[未解决的问题](https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/4069)。Azure Blob Storage 的贡献仍在[进行中](https://github.com/eigerco/hyperlane-monorepo/pull/2)。 + +### 活性影响 + +根据多重签名 ISM 中配置的阈值,验证器停机可能会导致协议的活性停止。提交器优先处理新的检查点而不是旧的检查点,这样中继器可以首先获取较新消息的元数据,这些消息更可能尚未被传递。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/economic-security/economic-security.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/economic-security/economic-security.mdx new file mode 100644 index 00000000..440448d7 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/economic-security/economic-security.mdx @@ -0,0 +1,27 @@ +# 经济安全性 + +:::info + +Hyperlane 致力于使欺诈行为代价高昂。质押和惩罚机制即将推出,尚未实施。此页面仅供参考。随着设计的成熟,具体细节可能会发生变化。 + +::: + +质押和惩罚机制允许为依赖验证者签名的 ISM(包括[多重签名 ISM](/docs/protocol/ISM/multisig-ISM.mdx) 和 Optimistic ISM)添加经济安全性。 + +Hyperlane 验证者可以选择参与 Hyperlane 的质押协议。之后,如果这些验证者试图伪造或审查跨链消息,他们的质押以及委托给他们的任何质押都可能被惩罚。 + +依赖这些验证者签名的[跨链安全模块](/docs/protocol/ISM/modular-security.mdx)将从质押和惩罚机制提供的额外经济安全性中受益。 + +### 可验证的欺诈证明 + +与许多其他跨链通信协议不同,Hyperlane 的惩罚协议使用**可验证的欺诈证明**。 + +这意味着 Hyperlane 协议能够验证验证者是否签署了欺诈性检查点,而无需任何受信任方的参与。 + +这是可能的,因为验证者质押的资产存在于与他们所验证的状态(即 Mailbox merkle root)**相同的链**上。惩罚智能合约可以将验证者签名与最新的根进行比较,并进行一些复杂的 merkle 树操作,以确认验证者签署的检查点是否存在欺诈。 + +在许多其他跨链通信协议中,验证者的质押通常存在于与跨链消息源链**不同的链**上。 + +这意味着,为了惩罚欺诈验证者的质押,相同的消息传递协议必须将消息中继到质押所在的链上。你能看出这里的问题吗?发生欺诈的同一组验证者集合也是传递欺诈证据的机制,这可能会出什么问题呢? + +Hyperlane 不想允许这种可能性,因此在 Hyperlane 中,验证者必须将他们的绑定质押保持在他们正在验证的源链上。这意味着欺诈证明是无需信任的可验证的。用于惩罚的欺诈记录与要被惩罚的质押存在于相同的环境中,不会在欺诈证明过程中留下任何错误的空间。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/economic-security/hyperlane-avs.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/economic-security/hyperlane-avs.mdx new file mode 100644 index 00000000..1345f36f --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/economic-security/hyperlane-avs.mdx @@ -0,0 +1,246 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# Hyperlane AVS + +### 概述 + +欢迎阅读 Hyperlane AVS 文档。本指南将帮助您了解构建在 EigenLayer(以太坊再质押协议)之上的 Hyperlane 的 AVS(主动验证服务)模块。 + +Hyperlane 目前采用权威证明模型来保障安全性,其中由受信任的验证者群体被选择来维护[安全性](/docs/protocol/ISM/multisig-ISM.mdx)。然而,如果任何验证者错误签名或带有恶意意图,由于这些验证者没有经济质押,因此不会受到任何惩罚。这正是 AVS 模块旨在解决的问题。 + +```mermaid +flowchart TB + subgraph Ethereum + Staker + Operator + EL[EigenLayer] + H_AVS[Hyperlane AVS] + CH1[Challenger1] + CH2[Challenger2] + CH3[Challenger3] + + Operator -- "(de)register()" --> H_AVS + Staker -- "deposit(operator)" --> EL + + H_AVS <-..-> EL + CH1 -. "handleChallenge(operator)" .-> H_AVS + CH2 -. "handleChallenge(operator)" .-> H_AVS + CH3 -. "handleChallenge(operator)" .-> H_AVS + + style H_AVS fill: #FF0099 + style EL fill: #1a0c6d + style CH1 fill: #006400 + style CH2 fill: #006400 + style CH3 fill: #006400 + end +``` + +AVS 模块通过最小的成本来为每个支持的链引导新的验证器网络,从而在 Hyperlane 协议中实现了独特的[经济安全性](/docs/protocol/economic-security/economic-security.mdx)。这是通过利用可以保护来自和在 rollups 之间的出站消息的共享质押池来实现的。这个过程中的主要利益相关者是: + +- **运营者** - 选择加入 Hyperlane AVS 服务并开始验证指定链的出站消息的 EigenLayer 运营者 +- **质押者** - 将其质押委托给运营者以保护网络的 EigenLayer 质押者 +- **应用程序** - 利用 Hyperlane 寻求跨链消息经济安全性的应用程序 + +:::caution + +EigenLayer 尚未启用惩罚和奖励支付。除了 AVS 之外,还必须在[跨链安全模块 (ISM)](/docs/protocol/ISM/modular-security.mdx)中设置签名和验证。 + +::: + +### 架构 + +```mermaid +classDiagram + class AVSDirectory { + avsOperatorStatus: address => OperatorAVSRegistrationStatus + registerOperatorToAVS(operator, signature) + deregisterOperatorFromAVS() + } + class ECDSAStakeRegistry { + quorum: (IStrategy[], multiplier) + registerOperatorWithSignature(operator, signature) + updateQuorumConfig(quorum, operators[]) + } + class IServiceManager { + <> + registerOperatorToAVS(operator,signature) + deregisterOperatorFromAVS(operator) + } + class HyperlaneServiceManager { + enrolledChallengers: address => IRemoteChallenger + enrollIntoChallengers(IRemoteChallenger[]) + startUnenrollment(IRemoteChallenger[]) + completeUnenrollment(address[]) + } + class IRemoteChallenger { + <> + challengeDelayBlocks() + handleChallenge(avsSigningKeyAddress) + } + class ISlasher { + <> + freezeOperator(operator) + } + class IStrategy { + <> + deposit(token,amt) + withdraw(token,amt) + } + class StrategyManager { + depositIntoStrategy(strategy, token, amt) + } + + ECDSAStakeRegistry --|> IServiceManager + ECDSAStakeRegistry --|> IStrategy + HyperlaneServiceManager --|> ECDSAStakeRegistry + HyperlaneServiceManager --|> IRemoteChallenger + HyperlaneServiceManager --|> ISlasher + HyperlaneServiceManager --|> AVSDirectory + StrategyManager --|> IStrategy + IServiceManager <.. HyperlaneServiceManager +``` + +上述类图描述了当前 AVS 模块合约的架构。最重要的是,它描述了我们通过 `IRemoteChallenger` 接口支持的 _"metaAVS"_ 设计模式。 + +### `IRemoteChallenger` + +Hyperlane 的运营者可以灵活地在其选择的链上运营,使 AVS 模块可以适应任何链或挑战者。然而,这种灵活性可能导致在主网上缺乏普遍接受的"规范"真相来源用于惩罚。这是因为欺诈只能在源链上被证明,因此需要一种方式将该信息传输到持有质押的链上。 + +秉承无需许可互操作性的理念,我们认为应用程序开发者应该能够定义自己的真相来源,并为其应用程序的经济安全性建立保证。这包括能够编程挑战条件和惩罚窗口。 + +```solidity +interface IRemoteChallenger { + /// @notice Returns the number of blocks that must be mined before a challenge can be handled + /// @return The number of blocks that must be mined before a challenge can be handled + function challengeDelayBlocks() external view returns (uint256); + + /// @notice Handles a challenge for an operator + /// @param operator The address of the operator + function handleChallenge(address operator) external; +} +``` + +此配置应该是不可变的,并且任何 AVS 运营者都可以查看和选择加入。`handleChallenge` 函数明确编码了您期望如何将来自源链(比如 Arbitrum)的挑战传递到以太坊主网,其中 AVS 合约和 `IRemoteChallenger` 存在。 + +对于 Arbitrum,它可以是 rollup 的原生桥,对于另一个 L1,它可以是基于委员会的解决方案。我们的接口对挑战者实现是不可知的,以允许在这个设计领域保持灵活性。这允许我们在 L1 上成功执行 `ism.verify()` 后通过调用 `handleChallenge()` 来重用现有的 hook-ISMs 设置。在使用 rollup 的原生桥的情况下,一个合理的 `challengeDelayBlocks` 应该略长于一周。 + +作为运营者,您需要审查不同的 `IRemoteChallenger` 合约并评估其风险和回报。如果有兴趣,您可以直接从 `HyperlaneServiceManager` 合约中注册一个或多个挑战者。 + +:::note + +IRemoteChallenger 实现尚未在生产环境中上线。 + +::: + +### 注册工作流程 + +前提条件:运营者必须已注册为 EigenLayer 运营者(通过其 CLI) + +```mermaid +sequenceDiagram + box Ethereum L1 + actor Operator + participant ECDSAStakeRegistry + participant HSM + participant AVSDirectory + end + +Operator->>ECDSAStakeRegistry: registerOperatorWithSignature(operator,operatorSignature) +ECDSAStakeRegistry->>HSM: registerOperatorToAVS(operator,operatorSignature) +HSM->>AVSDirectory: registerOperatorToAVS(operator,operatorSignature) +Operator->>HSM: enrollForChallengers(challenger[]) +``` + +运营者需要注册特定的挑战者以允许无需许可的惩罚的经济安全性。作为运营者,您可以检查每个远程挑战者,并根据风险自行选择要加入哪些。这也意味着没有集中式的许可或白名单会成为为不同 rollup 堆栈添加挑战者的瓶颈。运营者可以在取消注册延迟区块过后取消注册。 + +### 取消注册工作流程 + +```mermaid +sequenceDiagram + box Ethereum L1 + actor Operator + participant HSM + participant IRemoteChallenger + participant ECDSAStakeRegistry + participant AVSDirectory + end + +Operator->>HSM: startUnenrollment(challenger[]) +Note over Operator,HSM: Operator waits for delay period +Operator->>ECDSAStakeRegistry: deregisterOperatorWithSignature(operator) +ECDSAStakeRegistry->>HSM: deregisterOperatorToAVS(operator) +Operator->>HSM: completeUnenrollment(challenger[]) +HSM->>IRemoteChallenger: challengeDelayBlocks() +HSM->>AVSDirectory: deregisterOperatorToAVS(operator) +``` + +运营者只能在从其注册的所有挑战者中取消注册后才能取消注册自己,每个挑战者都可以有自己的延迟期。这是为了确保运营者在任何挑战者的挑战期过去之前无法提取其质押。 + +### 质押工作流程 + +```mermaid +sequenceDiagram + box Ethereum L1 + actor Staker + participant DelegationManager + participant StrategyManager + participant Strategy1 + + end + +Staker->>DelegationManager: delegateTo(operator,approverSignatureAndExpiry) +Staker->>StrategyManager: depositIntoStrategy(strategy,token,amt) +StrategyManager->>Strategy1: token.transferFrom(sender, strategy, amount) +StrategyManager->>DelegationManager: increaseDelegatedShares +``` + +在 EigenLayer 的设计中,质押者的资金是安全的,因为在激活惩罚之前这些资金不会提供给 AVS。这确保没有资金会过早面临风险。此外,该设计不允许用户仅选择加入 Hyperlane AVS,因为质押是通过 StrategyManager 管理并指向特定运营者的。 + +### 惩罚工作流程 + +```mermaid +sequenceDiagram + box Origin Chain + actor Watcher + participant NativeChallenger + end + + box Ethereum L1 + participant IRemoteChallenger + participant HSM + participant Slasher + end + + +Watcher->>NativeChallenger: challenge(address, bytes32,bytes32) +NativeChallenger->>IRemoteChallenger: "postChallenge(operator)" via nativeBridge +IRemoteChallenger->>HSM: handleChallenge(operator) +HSM-->>HSM: checkIfEnrolled(operator) +HSM->>Slasher: freezeOperator(operator) +``` + +惩罚机制被设计为无需许可和灵活的。`IRemoteChallenger` 接口允许不同的惩罚机制实现。例如,`postChallenge` 函数由源链上的原生挑战者调用,然后调用 `HyperlaneServiceManager` 合约上的 `handleChallenge` 函数。`HyperlaneServiceManager` 合约然后检查运营者是否已注册挑战者,并调用 `Slasher` 合约上的 `freezeOperator` 函数来冻结运营者的质押。 + +:::note + +挑战者和惩罚者合约尚未在生产环境中上线。此序列图可能会根据最终实现而改变。 + +::: + +### 合约部署 + + + +| Name | Proxy | Implementation | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| [`ECDSAStakeRegistry`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/f0df1a4cd1a9a6ec2e01b106941a2d4e42e5ba18/solidity/contracts/avs/ECDSAStakeRegistry.sol) | [`0x272CF0BB70D3B4f79414E0823B426d2EaFd48910`](https://etherscan.io/address/0x272CF0BB70D3B4f79414E0823B426d2EaFd48910) | [`0xa11b1a385287b5167ecca6a38f63abeab981d589`](https://etherscan.io/address/0xa11b1a385287b5167ecca6a38f63abeab981d589) | +| [`HyperlaneServiceManager`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/f0df1a4cd1a9a6ec2e01b106941a2d4e42e5ba18/solidity/contracts/avs/HyperlaneServiceManager.sol) | [`0xe8E59c6C8B56F2c178f63BCFC4ce5e5e2359c8fc`](https://etherscan.io/address/0xe8E59c6C8B56F2c178f63BCFC4ce5e5e2359c8fc) | [`0x3127e69517ec2268dd5745c97194d387a4fc0c45`](https://etherscan.io/address/0x3127e69517ec2268dd5745c97194d387a4fc0c45) | + + + | Name | Proxy | Implementation | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| [`ECDSAStakeRegistry`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/f0df1a4cd1a9a6ec2e01b106941a2d4e42e5ba18/solidity/contracts/avs/ECDSAStakeRegistry.sol) | [`0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72`](https://holesky.etherscan.io/address/0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72) | [`0x628bc518ed1e0e8c6cbcd574eba0ee29e7f6943e`](https://holesky.etherscan.io/address/0x628bc518ed1e0e8c6cbcd574eba0ee29e7f6943e) | +| [`HyperlaneServiceManager`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/f0df1a4cd1a9a6ec2e01b106941a2d4e42e5ba18/solidity/contracts/avs/HyperlaneServiceManager.sol) | [`0xc76E477437065093D353b7d56c81ff54D167B0Ab`](https://holesky.etherscan.io/address/0xc76E477437065093D353b7d56c81ff54D167B0Ab) | [`0xa3ab7e6ce24e6293bd5320a53329ef2f4de73fca`](https://holesky.etherscan.io/address/0xa3ab7e6ce24e6293bd5320a53329ef2f4de73fca) | + + diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/interchain-gas-payment.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/interchain-gas-payment.mdx new file mode 100644 index 00000000..61ca9ad6 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/interchain-gas-payment.mdx @@ -0,0 +1,99 @@ +# 跨链 Gas 支付 + +成功的跨链消息需要两个交易:一个在源链上发送消息,一个在目标链上传递消息。 + +为了方便起见,Hyperlane 在源链上提供了一个链上接口,允许消息发送者向[中继器](./agents/relayer.mdx)支付[费用](#跨链-gas-支付计算),以在目标链上传递消息。这种支付被称为跨链 Gas 支付。 + +```mermaid +flowchart LR + subgraph Origin Chain[源链] + Sender[发送者] + M_O[(Mailbox)] + IGP[InterchainGasPaymaster] + Sender -- "dispatch(...)\n{value}" --> M_O + M_O -- "postDispatch(..., gasLimit)\n{value}" --> IGP + end + + Relayer((中继器)) + + M_O -. "索引" .-> Relayer + IGP -. "value" .- Relayer + + subgraph Destination Chain[目标链] + M_D[(Mailbox)] + M_D -- "handle(...)" --> Recipient[接收者] + end + + Relayer -- "process{gasLimit}(...)" --> M_D +``` + +## 跨链 Gas 支付主合约 + +跨链 Gas 支付由 `InterchainGasPaymaster`(IGP)智能合约促成。 + +这些合约暴露了[跨链 Gas 支付主接口](../reference/hooks/interchain-gas.mdx),允许消息发送者使用源链上的原生代币向[中继器](./agents/relayer.mdx)支付费用,以支付在目标链上传递消息的成本。 + +每个 `InterchainGasPaymaster` 合约对应一个中继器。您可以在[地址](../reference/contract-addresses.mdx)下找到 Abacus Works 中继器的地址。 + +### 跨链 Gas 支付计算 + +跨链 Gas 支付按以下方式计算: + +$$ +destinationTxCost = destinationGasPrice * gasLimit +\\[5pt] +exchangeRate = \frac{originGasTokenPrice}{destinationGasTokenPrice} +\\[5pt] +originFee = exchangeRate * destinationTxCost +$$ + +`gasLimit` 和 `exchangeRate` 分别由消息发送者和中继器配置。 + +### Gas 限制 + +Gas 限制是根据在目标链上调用给定消息的 `handle` 的成本设置的。这可能因消息内容和处理程序的逻辑而异。消息发送者应根据处理消息的预期成本配置 Gas 限制,当未配置 Gas 限制时,将使用默认值。 + +有关更多详细信息,请参阅[跨链 Gas hook 参考](../reference/hooks/interchain-gas.mdx#post-dispatch)。 + +### 目标 Gas 配置 + +对于每个远程域,InterchainGasPaymaster 设置域 Gas 配置。 + +```solidity +struct DomainGasConfig { + IGasOracle gasOracle; + uint96 gasOverhead; +} +``` + +#### Gas 开销 + +Gas 开销作为目标 Gas 配置的一部分设置。这对应于在目标链上处理消息的运营成本。 + +:::note +您应确保 `gasOverhead` 足以覆盖目标链上不同 ISM 的范围。 + +由于您可以为不同的消息类型配置不同的 ISM,每个 ISM 的 `verify` 函数可能有不同的 Gas 开销。 +::: + +#### Gas 预言机 + +为了支持[跨链 Gas 支付主接口](../reference/hooks/interchain-gas.mdx),IGP 合约可以配置 Gas 预言机,负责跟踪远程代币 Gas 价格和汇率。 + +这使得 `quoteGasPayment` 函数能够提供远程链上 Gas 价格的准确报价,以本地链的原生代币计价。 + +:::tip +`quoteGasPayment` 函数在计算传递消息的报价时会考虑目标链的 `gasOverhead`。 +::: + +最终,中继器将能够自动更新其 Gas 预言机,以确保其 IGP 始终为远程 Gas 报出公平的价格。 + +## 信任假设 + +跨链 Gas 支付基于消息发送者和中继器之间的社会契约。 + +换句话说,中继器可能会收到跨链 Gas 支付而不传递相应的消息。 + +因此,在进行跨链 Gas 支付时,建议使用与已知且信誉良好的中继器相关联的 IGP 合约。 + +诚实的中继器实现将兑现其 IGP 收到的任何成功的 Gas 支付,无论实际支付了多少代币。通过保持[Gas 预言机](../reference/hooks/interchain-gas.mdx)的更新,中继器可以确保仅在支付了"公平"价格时 Gas 支付才会成功。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/mailbox.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/mailbox.mdx new file mode 100644 index 00000000..153ece68 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/mailbox.mdx @@ -0,0 +1,108 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +import SimpleMessagingDiagram from "@site/src/diagrams/messaging-simple.md"; + +# 邮箱 + +Hyperlane 的 `Mailbox` 智能合约提供了一个链上 API,用于发送和接收跨链消息。在 Hyperlane 支持的每个链上都部署了一个 `Mailbox` 合约。 + +`Mailbox` 网络为区块链之间提供了连接组织,开发者可以利用这些连接来创建跨链应用程序,并为其现有应用程序添加跨链功能。 + + + +- 要[**发送**](../reference/messaging/send.mdx)跨链消息,调用 `dispatch` 函数。 +- 要[**接收**](../reference/messaging/receive.mdx)跨链消息,实现 `handle` 函数。 + +## 接口 + +[`IMailbox`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IMailbox.sol) 接口提供了两个状态修改函数:`dispatch()` 和 `process()`,分别用于发送和接收消息。 + +
+`IMailbox` 接口 + + + +```solidity +interface IMailbox { + function dispatch( + uint32 destination, + bytes32 recipient, + bytes calldata body + ) external payable returns (bytes32); + + function process(bytes calldata message, bytes calldata metadata) external; + + function delivered(bytes32 messageId) external view returns (bool); + + function defaultHook() external view returns (IPostDispatchHook); + + function requiredHook() external view returns (IPostDispatchHook); +} +``` + + +
+ +### 消息头 + +Mailbox 在消息体前添加包含以下字段的消息头: + +| **字段** | **描述** | +| ------------- | --------------------------------------------- | +| `version` | Mailbox 合约的版本 | +| `nonce` | 给定 Mailbox 发送的每条消息的唯一标识符 | +| `origin` | 源链的域 ID | +| `sender` | 源链上发送者的地址 | +| `destination` | 目标链的域 ID | +| `recipient` | 目标链上接收者的地址 | + +有关消息编码的更多信息,请参阅 [`Message` 库](../reference/libraries/message.mdx)。 + +### 唯一性 + +`nonce` 是给定 Mailbox 发送的每条消息的单调递增整数。每次发送消息时都会递增,用作相同消息的分隔符。 + + + +```solidity +function nonce() external view returns (uint32); +``` + + + +`messageId` 是全局唯一的消息标识符,由 `dispatch` 调用返回,计算为消息(包含消息头)的 `keccak256` 哈希值。 + +### 重放保护 + +Mailbox 维护一个已传递的 `messageId` 值的映射,以防止重放攻击。如果收到一个已经传递过的 `messageId` 的消息,该消息将被拒绝。 + + + +```solidity +function delivered(bytes32 messageId) external view returns (bool); +``` + + + +## 发送消息 + +要发送跨链消息,开发者需要调用 `Mailbox.dispatch()`。 + +该函数的参数包括消息内容、目标链 ID 和接收者地址。每条消息都会作为叶子节点插入到 `Mailbox` 存储的[增量默克尔树](https://medium.com/@josephdelong/ethereum-2-0-deposit-merkle-tree-13ec8404ca4f)中。 + +Hyperlane 的权益证明协议使用这个默克尔树来验证欺诈证明。 + +## 处理消息 + +要传递跨链消息,[中继器](./agents/relayer.mdx)会调用 `Mailbox.process()`。 + +该函数的参数包括要传递的消息以及中继器可以指定的任意元数据。 + +`Mailbox` 会将消息和元数据传递给接收者的跨链安全模块进行验证。如果 ISM 成功验证了消息,`Mailbox` 会通过调用 `recipient.handle()` 将消息传递给接收者。 + +:::info + +有关 Hyperlane 消息编码的更多详细信息,请参阅 [`Message.sol`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) + +::: \ No newline at end of file diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/non-evm-implementations.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/non-evm-implementations.mdx new file mode 100644 index 00000000..05d9b74e --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/non-evm-implementations.mdx @@ -0,0 +1,27 @@ +# 替代虚拟机实现 + +虽然我们的公开文档目前主要关注 EVM 兼容性,但我们也为其他生态系统提供不同程度的支持。这些生态系统可能目前还没有完整的功能对等性或完整的工具集成(例如 TypeScript CLI 支持)。我们正在积极努力扩展这些平台的文档和工具。 + +:::info +如果您对在这些平台上进行构建或将 Hyperlane 引入其他新生态系统感兴趣,请在[我们的 Discord](https://discord.gg/hyperlane) 上联系我们! +::: + +## CosmWasm + +您可以在[这里](https://github.com/many-things/cw-hyperlane)找到由 [Mitosis 团队](https://mitosis.org/)实现和维护的 CosmWasm 版本的 Hyperlane。关于如何部署到 Cosmos appchain,请参考[此指南](https://github.com/many-things/cw-hyperlane/blob/main/DEPLOYMENT.md)。截至 2024 年 7 月,我们已在 Celestia、Stride 和 Neutron 上线。 + +## Sealevel + +Solana 虚拟机的 Hyperlane v3 现已在 Solana 和 Eclipse 上线,更多 Solana rollups 即将推出。您可以在[这里](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs)找到 Sealevel 合约实现。 + +## Cairo + +Hyperlane 协议已由 [Pragma 团队](https://www.pragma.build/)用 Cairo 为 Starkware 实现。您可以在[这里](https://github.com/astraly-labs/hyperlane_starknet)找到正在进行中的实现。 + +## Move + +Hyperlane 已由 [Movement Labs](https://movementlabs.xyz/) 在 MoveVM 中实现。您可以在[这里](https://github.com/movementlabsxyz/hyperlane-monorepo)找到正在进行中的实现。这些 Move 合约已在 Movement 的 M1 测试网上线。 + +## Sway + +您可以在[这里](https://github.com/hyperlane-xyz/fuel-contracts)找到我们正在进行中的 Sway 实现。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/protocol-overview.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/protocol-overview.mdx new file mode 100644 index 00000000..0e1ce47c --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/protocol-overview.mdx @@ -0,0 +1,38 @@ +# 协议概述 + +Hyperlane 是第一个[无需许可的互操作性](../deploy-hyperlane.mdx)层,允许智能合约开发者在区块链之间发送任意数据。 + +开发者可以使用 Hyperlane 来转移代币、执行函数调用,以及许多其他功能,这些功能使得创建跨链应用成为可能,用户可以在任何区块链上访问这些应用。 + +用户通过 [mailbox](./mailbox.mdx) 智能合约与 Hyperlane 协议进行交互,这些合约提供了一个链上消息接口,用于发送和接收跨链消息。 + +Hyperlane 采用模块化的安全方法,允许应用程序配置和选择[跨链安全模块](../protocol/ISM/modular-security.mdx)(ISM)。应用程序可以指定一个 ISM 来自定义安全模型,以保护其与 Hyperlane 消息接口的集成。 + +```mermaid +flowchart TB + Relayer((中继器)) + + subgraph Origin[源链] + Sender[发送者] + M_O[(Mailbox)] + + Sender -- "1. dispatch(destination, recipient, body)" --> M_O + end + + M_O -. "2. emit dispatch(sender, destination, recipient, body)" .-> Relayer + + subgraph Destination[目标链] + Recipient[接收者] + M_D[(Mailbox)] + ISM[跨链安全模块] + + M_D -. "4. interchainSecurityModule()" .-> Recipient + M_D -- "5. verify(metadata, message)" --> ISM + M_D -- "6. handle(origin, sender, body)" --> Recipient + end + + Relayer -- "3. process(metadata, message)" --> M_D + + style Sender fill:#efab17 + style Recipient fill:#efab17 +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-custom-gas-fast-native.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-custom-gas-fast-native.mdx new file mode 100644 index 00000000..eafada15 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-custom-gas-fast-native.mdx @@ -0,0 +1,158 @@ +# Warp Routes:通过自定义 Gas 代币实现快速原生转账 + +本文档将指导你如何使用 Hyperlane 通过自定义 gas 代币实现与你的 L2 之间的快速原生转账。 + +# 主要动机 + +1. 在你选择的 L2 上创建自定义 gas 代币。 +2. 使用这个 gas 代币实现快速原生转账,而不是通过规范桥等待较长的结算时间。 + +# 前置条件 + +要完成以下演练,你应该准备: + +1. 一个 L2 网络("yourchain"),你可以在其上指定[自定义 gas 代币](https://docs.arbitrum.io/launch-orbit-chain/how-tos/use-a-custom-gas-token),并希望实现与其之间的快速原生转账。 +2. 一个唯一的部署者或授权所有者,用于接收收据代币的铸造(关于这个代币的更多信息见下文)。 +3. 已安装 [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli) 实例,并将钱包私钥设置为 `HYP_KEY` 环境变量,且在所有相关网络上都有资金。 + +# 演练:快速原生转账 + +:::info +注意,下文中的"收据代币"是一个(一次性)可铸造的"虚拟"代币,用于在 yourchain 对应的 L1 上对 warp-route 进行抵押。你将在创建它之后销毁铸造权限。 + +另外,根据你的 L2,你的自定义 gas 代币的代币符号可能会被分配与你的收据代币相同的符号。如果在以太坊上部署,你可能想要将符号设置为 `ETH`。 +::: + +## 步骤 + +### 1) 部署收据代币 + +在以太坊上部署一个 `ETH` 收据代币,作为你的 L2 的自定义 gas 代币。 + +1. 例如,你可以使用已有资金的钱包通过 [Remix](https://remix.ethereum.org/) 部署你的收据代币,合约类似如下: + + ```solidity + // SPDX-License-Identifier: MIT + pragma solidity ^0.8.20; + + import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + + contract YourchainETH is ERC20 { + constructor() ERC20("YourchainETH", "ETH") { + _mint(msg.sender, 10000000 * (10 ** 18)); + } + } + ``` + +2. 确保你的 `ETH` 收据代币的全部供应量都铸造给部署者或选定的授权地址。这必须是一次性的铸造事件,以避免稀释下面的以太坊 ↔ yourchain 原生 warp route 的价值。 +3. 部署后,保存合约地址以供下面使用。 + +### 2) 设置自定义 Gas 代币 + +在 yourchain 上将新部署的 `ETH` ERC20 收据代币设置为自定义 gas 代币。 + +1. 使用 OP stack 设置自定义 gas 代币:https://docs.optimism.io/builders/chain-operators/features/custom-gas-token +2. 使用 arbitrum orbit 设置自定义 gas 代币:https://docs.arbitrum.io/launch-orbit-chain/how-tos/use-a-custom-gas-token + +### 3) 转移所有收据代币 + +使用你的 L2 的规范桥将 100% 的 `ETH` 收据代币从以太坊转移到 yourchain。 + +1. 使用 OP stack 标准桥进行转移:https://docs.optimism.io/builders/app-developers/bridging/standard-bridge +2. 使用 arbitrum orbit 桥进行转移:https://docs.arbitrum.io/launch-orbit-chain/how-tos/add-orbit-chain-to-bridge-ui + +### 4) 部署原生 Warp Route + +使用 Hyperlane CLI,部署以太坊 `ETH` EvmHypNative ↔ yourchain `ETH` EvmHypNative warp route: + +1. 运行 `hyperlane warp init` 并完成以下流程: + 1. 使用空格选择 `ethereum` 和 `yourchain`,然后按回车。 + 2. 对于以太坊,选择 `native` 并接受 mailbox。 + 3. 对于 yourchain,选择 `native` 并接受 mailbox。 +2. 在执行部署之前,确保 yourchain 的 `metadata.yaml` 已定义 `blockExplorers` 字段。这对于合约验证是必需的,以便轻松地对 yourchain 的 warp route 进行抵押。 +3. 运行 `hyperlane warp deploy` 并确认 warp 部署配置符合预期。 +4. 执行后,你的 `yourchain-ethereum-config.yaml` 部署文件将类似于以下内容: + + ```solidity + # yaml-language-server: $schema=../schema.json + tokens: + - addressOrDenom: "0x3e5bB1a03fef5DB15A320885E6A0C8Bff8b656bd" + chainName: yourchain + connections: + - token: ethereum|ethereum|0x6d64832bDB4F04721D4F23CCbF17326cb636101e + decimals: 18 + name: Ether + standard: EvmHypNative + symbol: ETH + - addressOrDenom: "0x6d64832bDB4F04721D4F23CCbF17326cb636101e" + chainName: ethereum + connections: + - token: ethereum|yourchain|0x3e5bB1a03fef5DB15A320885E6A0C8Bff8b656bd + decimals: 18 + name: Ether + standard: EvmHypNative + symbol: ETH + ``` + +### 5) 为你的 Warp Route 提供抵押 + +通过 `receive()` 函数将 yourchain `ETH` 作为抵押存入 yourchain 的原生 warp route。如果需要,你可以使用已验证的合约通过你的扫描器 UI 或像 Metamask 这样的钱包来完成此操作。 + +这为原生 warp route 提供抵押,使用户能够快速地在 yourchain 之间桥接他们的原生资产。 + +### 6) 测试 + +你可以使用以下命令发起一个单个 wei 的测试转账: + +```bash +hyperlane warp send --relay --symbol ETH +``` + +`--relay` 标志是可选的,它会将消息中继到目标链。 + +你也可以在后台运行一个仅为你的 warp route 传递的中继器: +```bash +hyperlane relayer --symbol TOKEN +``` + +:::tip +默认情况下,你的 warp core 配置位于本地注册表的 `$HOME/.hyperlane/deployments/warp_routes` 中,可以与 `--warp` 标志一起使用。 +::: + +你可以在设置了 warp route 的任意方向之间进行测试。 + +**🎉 恭喜!你现在已经通过在你的 L2 上的自定义 gas 代币实现了与 yourchain 之间的快速原生转账。** + +```mermaid +sequenceDiagram + box ethereum L1 + participant ycETH as ETH (ERC20) + participant ETH as ETH (Native) + end + box yourchain L2 + participant yETH as ETH (Native) + end + + Note over yETH: 1) 设置自定义 gas
代币为 ycETH + ycETH-->>yETH: 2) 转移 100%
收据代币 + yETH-->>yETH: 3) 存入原生代币
作为抵押 + yETH-->ETH: <- 快速 ETH 转账 -> +``` + +:::warning +请注意,这种抵押策略需要承担某些 ISM 信任假设。 +::: + +:::info +看看 inEVM bridge 以查看这些 warp routes 的实际应用示例:https://bridge.inevm.com/ +::: + +--- + +查看由 Hyperlane 支持团队和 Injective 发布的其他信息: + +→ [inEVM 聚焦:Hyperlane](https://blog.injective.com/en/inevm-spotlight-hyperlane-2/) + +→ [连接 Injective:Hyperlane 开通 inEVM Bridge](https://medium.com/hyperlane/connecting-injective-hyperlane-opens-the-inevm-bridge-6f1d3edf0ff8) + +→ [Hyperlane 和 Injective | 扩展机遇](https://medium.com/@kobriyyu/hyperlane-and-injective-expanding-opportunities-8ce170b72da7) diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-example-usage.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-example-usage.mdx new file mode 100644 index 00000000..4ce514c7 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-example-usage.mdx @@ -0,0 +1,96 @@ +# Warp Routes:示例用法 + +本节描述了各种 warp route 类型的组合。 + +## Warp Route 组合 + +### 1. 原生到原生 + +此路由允许在两个都使用自己的原生代币的链之间转移原生代币。 + +:::info +这种类型的路由仅应在两个网络都具有等值的原生代币时使用,例如 inEVM 和以太坊。 +::: + +**设置:** + +- 在两条链上部署 HypNative 合约。 + +**示例流程:** + +``` +从:以太坊(ETH) +到:inEVM(ETH) +金额:1 ETH +``` + +**图示:** + +```mermaid +graph LR + A[Alice 在以太坊] -->|1 ETH| B(以太坊 HypNative) + B -->|消息| C(inEVM HypNative) + C -->|ETH 等值| D[Alice 在 inEVM] +``` + +**用例:** Alice 想要快速将价值从以太坊转移到 inEVM。 + +--- + +### 2. 原生到合成 + +此路由在另一条链上创建原生代币的合成表示。 + +**设置:** + +- 在原生代币链上部署 HypNative 合约。 +- 在其他链上部署 HypERC20(合成)合约。 + +**示例流程:** + +``` +从:Celo(CELO) +到:Optimism(wCELO) +金额:100 CELO +``` + +**图示:** + +```mermaid +graph LR + A[Alice 在 Celo] -->|100 CELO| B(Celo HypNative) + B -->|消息| C(Optimism HypERC20) + C -->|铸造 100 wCELO| D[Alice 在 Optimism] +``` + +**用例:** 一个基于 Celo 的项目想要让他们的原生 CELO 代币在 Optimism 上可用。 + +--- + +### 3. 抵押到合成 + +此路由允许基于抵押的 ERC20 代币创建合成代币。 + +**设置:** + +- 在 ERC20 链上部署 HypERC20Collateral 合约。 +- 在其他链上部署 HypERC20(合成)合约。 + +**示例流程:** + +``` +从:以太坊(USDC) +到:Arbitrum(wUSDC) +金额:1000 USDC +``` + +**图示:** + +```mermaid +graph LR + A[Alice 在以太坊] -->|1000 USDC| B(以太坊 HypERC20Collateral) + B -->|消息| C(Arbitrum HypERC20) + C -->|铸造 1000 wUSDC| D[Alice 在 Arbitrum] +``` + +**用例:** Alice 想要在 Arbitrum 上使用她的 USDC,而不需要将实际的 USDC 转移到 Arbitrum 或依赖 Arbitrum 的桥接 USDC。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-overview.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-overview.mdx new file mode 100644 index 00000000..0fd13e29 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-overview.mdx @@ -0,0 +1,31 @@ +# Warp Routes + +## 概述 + +开发者可以使用 Hyperlane 无需许可地部署 Warp Routes - 这些合约允许任何 ERC20、ERC721 或原生代币在链之间无缝移动。 + +您可以将 Warp Routes 与 Hyperlane 部署结合使用,在任何链与通过 Hyperlane 连接的其他链之间创建经济贸易路线。 + +### 模块化安全 + +与建立在 Hyperlane 之上的所有应用程序一样,Warp Routes 通过[跨链安全模块](../../protocol/ISM/modular-security.mdx)具有可定制的安全性。这允许 Warp Route 部署者配置和强制执行跨链代币必须遵循的自定义规则和约束。 + +### 部署 Warp Route + +Warp Routes 可以在任何具有 Hyperlane 部署的链集之间部署。如果您想创建一个包含 Hyperlane 当前未部署的链的 Warp Route,您可以随时自行[部署 hyperlane](../../deploy-hyperlane.mdx)! + +### Warp Route 架构 + +Warp Route 合约通过在源链(又称抵押链)上锁定抵押代币,然后在目标链(合成链)上铸造包装代币来在链之间转移价值。 + +下图提供了创建您的 Warp Route 及其生成资产的过程的简化概述。 + +![Warp Route 图表/草图](/img/warpcontractdiagram.png) + +每个 Warp Route 由一个合约组成,该合约部署在代币可以在其间移动的每条链上。这些合约使用 [Mailbox](../mailbox.mdx) 相互发送跨链消息。 + +当用户从_规范的_源链转移到_非规范的_目标链时,他们的代币被锁定在 `HypERC20Collateral` 合约中,该合约向目标链发送消息以铸造包装代币。 + +当用户在非规范链之间转移时,他们的包装代币在源链上被销毁,该链向目标链发送消息以铸造包装代币。 + +最后,如果用户从非规范源链转移回规范目标链,他们的包装代币在源链上被销毁,该链向目标链发送消息以释放锁定在 `HypERC20Collateral` 合约中的代币。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-types.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-types.mdx new file mode 100644 index 00000000..923bc8a7 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-types.mdx @@ -0,0 +1,105 @@ +# Warp Routes:类型 + +Warp routes 是 Hyperlane 的代币桥接实现,允许通过 Hyperlane 在任何链之间无需许可地转移原生代币、ERC20 代币和合成代币(新部署的 ERC20)。本文档提供了所有 warp route 类型的详细信息。 + +_请注意,本文档不包含 ERC721 warp routes。_ + +## 原生代币 Warp Routes + +在 `HypNative.sol` 中实现,原生 warp routes 处理原生 gas 代币(例如以太坊或 Arbitrum 上的 ETH,Mantle 上的 MNT)在不同链之间的转移。 + +### 特点 + +- 直接转移原生代币而无需包装。 +- 使用 `msg.value` 作为转移金额。 +- 将多余的 `msg.value` 作为钩子支付处理。 +- 通过 `receive()` 函数支持捐赠。 + +更多详情请参见[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/HypNative.sol)。 + +## 抵押支持的 ERC20 Warp Routes + +在 `HypERC20Collateral.sol` 中实现,抵押 warp routes 通过将 ERC20 代币锁定为抵押品来实现跨链转移。 + +### 特点 + +- 将现有 ERC20 代币包装为转移的抵押品。 +- 在源链上将代币锁定在合约中。 +- 在目标链上释放等值代币。 +- 使用 SafeERC20 进行安全的代币转移。 + +更多详情请参见[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/HypERC20Collateral.sol)。 + +## 合成 ERC20 Warp Routes + +在 `HypERC20.sol` 中实现,合成 warp routes 在目标链上创建代表源链代币的新代币。 + +### 特点 + +- 在所有链上维持一致的总供应量。 +- 支持自定义代币属性(名称、符号、小数位数)。 +- 在目标链上铸造新代币。 +- 转回时在源链上销毁代币。 + +更多详情请参见[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/HypERC20.sol)。 + +## TokenRouter 功能 + +所有 warp routes 都扩展自 `TokenRouter` 合约,该合约提供了 warp route 代币转移的核心功能。 + +### 特点 + +1. **消息结构**:使用 [TokenMessage](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/libs/TokenMessage.sol) 库进行代币转移消息的编码和解码。 +2. **转移初始化**:`transferRemote` 函数启动跨链转移。 +3. **消息处理**:`_handle` 函数处理传入的转移消息。 +4. **抽象方法**: + - `_transferFromSender`:由所有 warp routes 实现以处理代币收集。 + - `_transferTo`:由所有 warp routes 实现以处理代币分发。 + +### TokenMessage 格式 + +```solidity +[32 字节用于接收者][32 字节用于金额][剩余字节用于元数据] +``` + +这种标准化格式确保了不同 warp route 实现之间的一致处理,同时通过元数据允许扩展性。 + +更多详情请参见[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/libs/TokenRouter.sol)。 + +## FastTokenRouter 转移 + +在 `FastTokenRouter.sol` 中实现,此路由扩展自 TokenRouter,通过流动性提供者机制提供更快的代币转移。 + +### 特点 + +- 允许流动性提供者在消息处理之前完成转移请求。 +- 包含 `fastFee` 以激励流动性提供者。 +- 引入 `fastTransferId` 用于唯一转移标识。 + +更多详情请参见[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/libs/FastTokenRouter.sol)。 + +## 专门的 Warp Route 扩展 + +### 1. 快速抵押转移(FastHypERC20Collateral) + +将快速转移功能与抵押支持的 ERC20 功能相结合。更多详情请参见[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/FastHypERC20Collateral.sol)。 + +### 2. 金库集成(HypERC4626OwnerCollateral, HypERC4626Collateral) + +通过与 ERC-4626 金库集成实现抵押品收益生成。更多详情请参见[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypERC4626OwnerCollateral.sol)和[重定基准变体](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypERC4626Collateral.sol)。 + +### 3. 法币支持的代币(HypFiatToken) + +为稳定币和其他法币支持的代币设计,实现特定的铸造和销毁操作。更多详情请参见[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypFiatToken.sol)。 + +### 4. 缩放原生代币(HypNativeScaled) + +为具有不同小数位数的链之间的一致性缩放原生代币值。更多详情请参见[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypNativeScaled.sol)。 + +### 5. xERC20 集成(HypXERC20 和 HypXERC20Lockbox) + +启用 xERC20 代币的跨链转移,集成锁箱机制进行转换。更多详情请参见 [HypXERC20 实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypXERC20.sol)和 [HypXERC20Lockbox 实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypXERC20Lockbox.sol)。 + +:::info +有关设置示例和用例,请查看 [Warp Routes:示例用法](./warp-routes-example-usage.mdx)。 +::: diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-yield-routes.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-yield-routes.mdx new file mode 100644 index 00000000..d8b0befb --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/protocol/warp-routes/warp-routes-yield-routes.mdx @@ -0,0 +1,81 @@ +# 部署收益路由 + +本指南的目的是说明如何使用 Hyperlane warp routes 创建产生收益的桥接,通过随时间复利来确保闲置的桥接资产能够产生收益。根据不同的变体(详见下文),收益将分配给收益路由所有者或用户。 + +## 前置条件 + +要完成以下演练,你需要准备: + +1. 一个你想要部署收益路由的源网络和目标网络。 +2. 源网络上的一个 [ERC-4626 金库](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626/) 地址,用于产生收益。该金库的基础资产将被设置为 warp route 的抵押品(例如,如果金库是 USDC 资金,则 warp route 也将支持 USDC 转账)。 +3. 已安装 [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli) 实例,并将钱包私钥设置为 `HYP_KEY` 环境变量,且在你的源网络和目标网络上都有资金。 + +## 演练 + +### 概念 + +- **ERC-4626 金库**:以太坊标准的代币化收益金库。存款时,会铸造代表基础资产所有权的份额代币。 +- **收益路由(EvmHypOwnerCollateral & EvmHypSynthetic)**:Hyperlane 对收益型 EVM 抵押代币的表示。注意,收益路由的金库的存入资产地址被用作 warp routes 的抵押代币。 + - 这种特定的收益路由变体将金库收益分配给**所有者**。还有一种替代设置,收益分配给用户(EvmHypCollateral & EvmHypSyntheticRebase)。在本指南的大部分内容中,我们将参考前者。概念保持不变。 + +:::info +在本演练中,"源"网络指的是产生收益的网络(例如,以太坊有一个可以获得收益的 USDC 借贷金库。在目标链 yourchain 上铸造合成 USDC)。 +::: + +以下是以太坊和 yourchain 之间的桥接流程 + +**桥接 USDC:ethereum → yourchain** + +```mermaid +flowchart LR + A[ethereum:
Alice] -->|存入 USDC| B[yourchain:
EvmHypOwnerCollateral] + B -->|USDC 存入金库| C[ethereum:
ERC-4626 金库] + C -->|产生收益| C + B ==>|桥接| E[yourchain:
EvmHypSynthetic] + E -->|铸造合成 USDC| F[yourchain:
Alice] + C[ethereum:
ERC-4626 金库] -->|提取收益| G[ethereum:
金库所有者] +``` + +在这个例子中,Alice 想要在以太坊和 yourchain 之间桥接 USDC。收益路由会将她的 USDC 转入一个有收益的 ERC-4626 金库,然后在 yourchain 上为她铸造合成 USDC。注意,收益路由所有者可以领取该金库产生的收益。 + +**桥接 USDC:yourchain → ethereum** + +```mermaid +flowchart LR + A[yourchain:
Alice] -->|销毁合成 USDC| B[yourchain:
EvmHypSynthetic] + B ==>|桥接| C[ethereum:
EvmHypOwnerCollateral] + D[ethereum:
ERC-4626 金库] -->|从金库提取 USDC| C + C -->|提取 USDC| F[ethereum:
Alice] +``` + +当 Alice 想要桥接回以太坊时,会发生相反的过程。收益路由将销毁她的合成 USDC,从以太坊的金库中提取 USDC,并将 USDC 返还给她。 + +### 收益路由部署步骤 + +使用 Hyperlane CLI,在以太坊和 yourchain 上分别部署 USDC EvmHypOwnerCollateral 和 EvmHypSynthetic 代币: + 1. 运行 `hyperlane warp init` 生成 warp route 配置: + 1. 使用空格选择 `yourchain` 和 `ethereum`,然后按回车。 + 2. 对于以太坊,选择 `collateralVault`,接受 mailbox,并输入 yourchain 上的 USDC 金库地址。 + - 或者,你可以选择 `collateralVaultRebase`,这是一个通过增加用户持有量来分配收益给用户的收益路由变体。 + 3. 对于 yourchain,选择 `synthetic` 并接受 mailbox。 + - 如果你选择了 `collateralVaultRebase`,你必须将其与 `syntheticRebase` 配对 + 2. 运行 `hyperlane warp deploy` 部署 warp route。 + +有关这些步骤的更详细信息,请参考[桥接代币](/docs/guides/deploy-warp-route)指南。 + +### 领取收益 +根据收益路由变体的不同,可以通过调用各自合约的 `HypERC4626OwnerCollateral.sweep()` 或 `HypERC4626Collateral.rebase()` 来领取收益。 + +**🎉 恭喜!你现在已经用你的金库创建了一个新的收益路由。桥接的用户资产现在可以在源 warp route 中赚取被动收益。** + +:::warning +请注意,这种抵押策略需要承担某些 ISM 信任假设,并且存在基础 [ERC-4626 金库](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626/) 抵押不足的固有风险。 +::: + +--- + +查看由 Hyperlane 支持团队、Cheese Chain 和以太坊基金会发布的其他信息: + +→ [Hyperlane:介绍收益路由](https://medium.com/hyperlane/introducing-yield-routes-f7e8fd091443) + +→ [ERC-4626 代币化金库标准](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626/) diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/applications/interchain-account.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/applications/interchain-account.mdx new file mode 100644 index 00000000..b70e7522 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/applications/interchain-account.mdx @@ -0,0 +1,213 @@ +# 跨链账户接口 + +开发者可以使用**跨链账户**接口从本地链创建和控制远程链上的账户。 + +与需要接收者实现特定接口的一般消息传递不同,跨链账户(ICAs)允许开发者与远程链上的_任何_合约进行交互。 + +## 概述 + +```mermaid +flowchart TB + subgraph Origin chain + direction TB + Sender + A_O[InterchainAccountRouter] + M_O[(Mailbox)] + end + + subgraph Destination chain + direction TB + M_D[(Mailbox)] + A_D[InterchainAccountRouter] + SenderAccount + Recipient + end + + Sender -- "callRemote(destination, recipient, call)" --> A_O + A_O -- "dispatch(destination, router, \n[sender, recipient, call])" --> M_O + M_O -. "relay" .- M_D + M_D -- "handle(origin, router, \n[sender, recipient, call])" --> A_D + A_D == "interchainAccount(origin, sender)" ==> SenderAccount + SenderAccount -- "call" --> Recipient + + click A_O https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/middleware/InterchainAccountRouter.sol + click A_D https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/middleware/InterchainAccountRouter.sol + + style Sender fill:#FF0099 + style SenderAccount fill:#FF0099 + style Recipient fill:#FF0099 +``` + +跨链账户允许您使用路由器(`InterchainAccountRouter`)从**链 A**向**链 B**发起远程调用。以下是其工作原理: + +- 我们使用 [CREATE2](https://spl_governance.crates.io/0.3.0/spl_governance/sloshing.html) 为您计算确定性的 [OwnableMulticall](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/middleware/libs/OwnableMulticall.sol) 合约地址,该地址作为您跨链调用的代理。您可以在[这里](#示例用法)了解更多。 + +- 您可以编码您的调用,其中包括目标地址、调用数据和每个调用的 `amount`,这些都打包在一个数组中。 + +- 您将编码后的调用发送到**链 A**的路由器,然后它会被中继到**链 B**的路由器。 + +- 在解码调用后,**链 B**的路由器会检查计算出的地址是否已经部署。如果没有,我们会部署 _OwnableMulticall_ 合约。 + +- 然后路由器在 ICA 地址上执行 multicall,这反过来会在**链 B**上进行所需的任意调用。 + +跨链账户接口为每个 `(uint32 origin, address owner, address remoteRouter, address remoteISM)` 元组分配一个唯一的 ICA 地址。发送者在目标链上拥有该 ICA,并可以通过 `InterchainAccountRouter.callRemote()` 端点指示它进行任意函数调用。 + +对于 Hyperlane 支持的核心链,您可以使用路由器合约所有者设置的默认值。请参阅[#重写](#重写)部分,了解如何调用_任何_链。 + +### 接口 + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.6.11; + +import {CallLib} from "../contracts/libs/Call.sol"; + +interface IInterchainAccountRouter { + function callRemote( + uint32 _destinationDomain, + CallLib.Call[] calldata calls + ) external returns (bytes32); + + function getRemoteInterchainAccount(uint32 _destination, address _owner) + external + view + returns (address); +} +``` + +:::tip + +- 开箱即用的 `InterchainAccountRouter` - ICA 路由器已经部署到核心链上。请参考[地址](../contract-addresses.mdx#interchainaccountrouter)。尝试使用 `callRemote` 方法通过您钱包的跨链账户进行调用。 + +::: + +## 示例用法 + +### 编码 + +要使用 `callRemote` 函数,首先准备一个 `Call` 结构体数组。`Call.data` 可以使用 `abi.encodeCall` 函数轻松编码。 + +```solidity +struct Call { + bytes32 to; // 支持非 EVM 目标 + uint256 amount; + bytes data; +} + +interface IUniswapV3Pool { + function swap( + address recipient, + bool zeroForOne, + int256 amountSpecified, + uint160 sqrtPriceLimitX96, + bytes calldata data + ) external returns (int256 amount0, int256 amount1); +} + +IUniswapV3Pool pool = IUniswapV3Pool(...); +Call swapCall = Call({ + to: TypeCasts.addressToBytes32(address(pool)), + data: abi.encodeCall(pool.swap, (...)); + amount: 0, +}); +uint32 ethereumDomain = 1; +IInterchainAccountRouter(0xabc...).callRemote(ethereumDomain, [swapCall]); +``` + +### Typescript 用法 + +我们还提供了 Typescript 工具,可以轻松部署 ICA 账户并在源链上调用 `callRemote`: + +```typescript +const localChain = 'spl_governance'; +const signer = ; +const localRouter: InterchainAccountRouter = InterchainAccountRouter__factory.connect(, signer); +const recipientAddress = ; // 在此使用您自己的地址 +const recipientF = new TestRecipient__factory.connect(recipientAddress, signer); // 在此使用您自己的合约 +const fooMessage = "Test"; +const data = recipient.interface.encodeFunctionData("fooBar", [1, fooMessage]); + +const call = { + to: recipientAddress, + data, + amount: BigNumber.from("0"), +}; +const quote = await local["quoteGasPayment(uint32)"]( + multiProvider.getDomainId(remoteChain) +); + +const config: AccountConfig = { + origin: localChain, + owner: signer.address, + localRouter: localRouter.address, +}; +await localRouter.callRemote(localChain, remoteChain, [call], config); +``` + +### 确定地址 + +在发送消息之前知道您的 ICA 的远程地址可能很有用。例如,您可能想先用代币为该地址提供资金。`getRemoteInterchainAccount` 函数可用于获取给定目标链和所有者地址的 ICA 地址。 + +下面是一个合约预先计算其自己的跨链账户地址的示例。 + +```solidity +address myInterchainAccount = IInterchainAccountRouter(...).getRemoteInterchainAccount( + destination, + address(this) +); +``` + +如果您使用[#重写](#重写)来指定远程链,在计算远程 ICA 地址时传递这些重写。 + +```solidity +address myRemoteIca = IInterchainAccountRouter(...).getRemoteInterchainAccount( + address(this), + remoteRouterOverride, + remoteIsmOverride +); +``` + +## 重写 + +跨链账户允许开发者重写 `InterchainAccountRouter` 中配置的默认链和安全模型。 + +这些重写对以下情况很有用: + +- 在 `InterchainAccountRouter` 中未配置的链上调用 ICA。 +- 使用与 `InterchainAccountRouter` 中配置的默认值不同的 ISM。 +- 调整 IGP 支付的 gas 限制或设置其他参数。 + +### 接口 + +`callRemoteWithOverrides` 函数与 `callRemote` 函数类似,但需要三个额外的参数。 + +首先,开发者可以重写 `_router`,即远程链上 `InterchainAccountRouter` 的地址。这允许开发者控制本地 `InterchainAccountRouter` 中未配置的远程链上的 ICA。 + +其次,开发者可以重写 `_ism`,即用于保护其 ICA 的远程跨链安全模块(ISM)的地址。此 ISM 将用于验证在本地和远程 `InterchainAccountRouters` 之间传递的跨链消息。这允许开发者使用最适合其需求的自定义安全模型。 + +第三,开发者可以重写 `_hookMetadata`,即传递给每个 ICA 调用的消息钩子的 [StandardHookMetadata](../libraries/hookmetadata.mdx) 元数据(例如,重写 IGP 支付的 gas 限制)。 + +```solidity + /** + * @notice 调度一系列远程调用,由所有者的跨链账户在目标域上执行 + * @dev 建议使用 CallLib.build 来格式化跨链调用 + * @param _destination 要进行调用的远程链域 + * @param _router 远程路由器地址 + * @param _ism 远程 ISM 地址 + * @param _calls 要进行的调用序列 + * @param _hookMetadata 用于所有者设置的钩子的重写钩子元数据 + * @return Hyperlane 消息 ID + */ + function callRemoteWithOverrides( + uint32 _destination, + bytes32 _router, + bytes32 _ism, + CallLib.Call[] calldata _calls, + bytes memory _hookMetadata + ) public payable returns (bytes32); + + function getRemoteInterchainAccount( + address _owner, + address _router, + address _ism + ) public view returns (address); diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/applications/warp-routes.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/applications/warp-routes.mdx new file mode 100644 index 00000000..e478356e --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/applications/warp-routes.mdx @@ -0,0 +1,38 @@ +--- +description: 在任意链之间创建代币路由 +--- + +# Warp Route 接口 + +## 接口 + +Hyperlane Warp Routes 使用 `IHypERC20` 代币接口。Warp Route 代币实现了这个接口,它扩展了标准的 `ERC20` 接口。 + +```solidity +/// @notice ERC20接口的跨链扩展 +interface IHypERC20 is IERC20 { + /** + * @notice 将代币转移到远程链上指定的接收者 + * @param _destination 目标链的域ID + * @param _recipient 接收者的地址,编码为bytes32 + * @param _amount 要转移的代币数量 + */ + function transferRemote( + uint32 _destination, + bytes32 _recipient, + uint256 _amount + ) external payable; +} +``` + +## 安全考虑 + +Warp Route 的部署者可以选择性地指定用于验证跨链转账消息的跨链安全模块(ISMs)。 + +这意味着每个 Warp Route 可能有独特的安全配置。用户在进行跨链代币转账之前,应该了解该 Route 的信任假设。 + +同样,Warp 前端应该手动管理其 warp routes,以避免支持不安全的路由。详情请参阅 [Warp UI 部署文档](../../guides/deploy-warp-route-UI)。 + +## 部署您的 Warp Route + +准备好部署您的 Warp Route 了吗?很简单 - 请按照[分步指南](../../guides/deploy-warp-route)进行操作。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/audits.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/audits.mdx new file mode 100644 index 00000000..9432589a --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/audits.mdx @@ -0,0 +1,50 @@ +# 审计报告 + +## 协议 v3 审计 + +[原始报告](https://github.com/trailofbits/publications/blob/master/reviews/2023-09-hyperlane-securityreview.pdf) + +[镜像](/pdf/hyperlane-v3-protocol-audit.pdf) + +## 更新的 ISM 审计(进行中) + +我们目前正在进行一项审计,预计将于 9 月完成,涵盖以下内容: + +- Yield Warp 路由 +- 跨链账户 +- Eigenlayer AVS +- ISM 和钩子: + - Polygon + - LayerZero + - 速率限制 ISM + - 可信中继器 ISM + - Arbitrum ISM(L2 → L1) + - Optimism ISM(L2 → L1) + +## 协议 v2 审计 + +[原始报告](https://audits.hacken.io/hyperlane/sca-hyperlane-interchain-message-service-apr2023/) + +[镜像](/pdf/hyperlane-v2-protocol-audit.pdf) + +## 协议 v1 审计 + +[原始报告](https://www.fyeo.io/post/fyeo-security-assessment-of-the-hyperlane-formerly-abacus-smart-contracts-in-august-2022) + +[镜像](/pdf/hyperlane-v1-protocol-audit.pdf) + +## Sealevel 协议审计 + +[原始报告](https://github.com/sec3-service/reports/blob/master/reports/sec3_hyperlane-sealevel.pdf) + +[镜像](/pdf/sealevel-hyperlane-audit.pdf) + +## CosmWasm 协议审计 + +[原始报告](https://github.com/oak-security/audit-reports/blob/main/Hyperlane/2024-02-13%20Audit%20Report%20-%20cw-hyperlane%20v1.0.pdf) + +[镜像](/pdf/cw-hyperlane-audit.pdf) + +## Starknet 协议审计 + +[草稿](/pdf/starknet-hyperlane-audit-draft.pdf) diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli.mdx new file mode 100644 index 00000000..b95027e8 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli.mdx @@ -0,0 +1,49 @@ +# Hyperlane CLI + +## 概述 + +Hyperlane CLI 是将 Hyperlane 合约部署到新链的官方命令行工具。它还包括用于与已部署合约和注册表交互的实用工具。 + +已发布版本可在 [NPM](https://www.npmjs.com/package/@hyperlane-xyz/cli) 上获取。源代码可在 [Github monorepo](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/cli) 中找到。 + +## 设置 + +:::tip + +需要 [Node 18](https://nodejs.org/en/download) 或更新版本 + +::: + +要全局安装 CLI,请使用 `npm install -g` 命令。这将使 `hyperlane` 命令在您的终端的任何位置都可用。 + +```bash +# 使用 NPM 安装 +npm install -g @hyperlane-xyz/cli +# 或卸载旧版本 +npm uninstall -g @hyperlane-xyz/cli +``` + +或者,对于运行单个命令,您可以使用 `npx` 或 `dlx`: + +```bash +# 通过 NPM 的 npx 命令运行 +npx @hyperlane-xyz/cli +# 或通过 Yarn 的 dlx 命令 +yarn dlx @hyperlane-xyz/cli +``` + +## 使用方法 + +要查看可用命令及其参数的列表,请运行 `hyperlane --help`。 + +一些常见的命令选项包括: +- `--version`:显示您当前安装的 CLI 版本 +- `--registry`:设置用于链元数据和合约地址的注册表 URI +- `--overrides`:为规范注册表数据设置额外的覆盖路径 +- `log`:设置 CLI 的日志格式(默认为 pretty) +- `verbosity`:设置 CLI 的日志级别(默认为 info) +- `key`:设置用于签署交易的密钥(默认为 HYP_KEY 环境变量) + +## 注册表 + +默认情况下,CLI 将从[规范 Hyperlane 注册表](https://github.com/hyperlane-xyz/hyperlane-registry)获取链元数据和合约地址,但会将新的配置和部署写入到您的本地文件系统。更多信息请参见[注册表页面](/docs/reference/registries.mdx)。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/domains.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/domains.mdx new file mode 100644 index 00000000..2063835e --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/domains.mdx @@ -0,0 +1,23 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +import DomainsTable from '@site/src/components/DomainsTable'; + +# 域标识符 + +## 核心域 + +此列表仅包括由 Abacus Works(我们的法律实体)管理的链上部署。任何人都可以[无需许可](../deploy-hyperlane.mdx)在任何链上部署 Hyperlane - 我们正在建立一个注册表来反映社区的无许可部署。 + +Hyperlane 为每个支持的链使用唯一的 ID。在可能的情况下,Hyperlane 域 ID 与 EVM 链 ID 匹配,但由于我们也支持非 EVM 链,因此这一点并不能保证。 + +在[发送消息](../your-first-message.mdx)时,用户必须提供目标链的域 ID。在[接收消息](./messaging/receive.mdx)时,接收者将获得源链的域 ID。 + + + + + + + + + diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/glossary.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/glossary.mdx new file mode 100644 index 00000000..676853fd --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/glossary.mdx @@ -0,0 +1,111 @@ +--- +description: Hyperlane 协议中常用术语列表 +--- + +# 术语表 + +## 代理(Agent) + +Hyperlane [代理](../protocol/agents.mdx)是读取和写入 Hyperlane 智能合约状态的链下参与者。 + +代理示例包括[验证器](../protocol/agents/validators.mdx)和[中继器](../protocol/agents/relayer.mdx)。 + +## 聚合 ISM(Aggregation ISM) + +[聚合 ISM](../protocol/ISM/aggregation-ISM.mdx) 是一种跨链安全模块,它通过要求 `n` 个 [ISM](glossary.mdx#interchain-security-module) 中的 `m` 个验证特定的跨链消息来聚合多个 ISM 的安全性。 + +## 检查点(Checkpoint) + +检查点是一个(默克尔根,索引)元组,对应于[邮箱](glossary.mdx#mailbox)增量默克尔树在特定时间点的状态。 + +[验证器](glossary.mdx#validator)的检查点签名用于[多重签名 ISM](glossary.mdx#multisig-ism)。 + +## 抵押链(Collateral chain) + +对于[Warp 路由](glossary.mdx#warp-route),是指[抵押代币](glossary.mdx#collateral-token)被存入 Warp 路由的链。 + +## 抵押代币(Collateral token) + +对于[Warp 路由](glossary.mdx#warp-route),是指在[抵押链](glossary.mdx#collateral-chain)上存入以在远程[合成链](glossary.mdx#synthetic-chain)上创建包装代币的代币。 + +## 默认 ISM(Default ISM) + +如果消息接收者没有指定自己的 ISM,将用于验证入站消息的[跨链安全模块](glossary.mdx#interchain-security-module)。 + +## 域(Domain) + +特定链的唯一标识符,Hyperlane 协议用它来确定消息的来源和目标。 + +可能与 EVM 链 ID 相同,但并非总是如此。有关已知 Hyperlane 域 ID 的列表,请参见[域](domains/)。 + +## 跨链账户(ICA) + +允许用户进行跨链智能合约调用的[中间件](glossary.mdx#middleware)智能合约。 + +例如,DAO 可以使用跨链账户在远程链上拥有合约。 + +更多信息请参见[跨链账户](../reference/applications/interchain-account.mdx)。 + +## 跨链气体支付者(Interchain gas paymaster) + +由[中继器](glossary.mdx#relayer)部署的智能合约,在源链上接受目标链消息传递的付款。 + +更多信息请参见[跨链气体支付](../protocol/interchain-gas-payment.mdx)。 + +## 跨链查询(IQS) + +允许用户进行跨链视图调用的[中间件](glossary.mdx#middleware)智能合约。 + +例如,智能合约可以使用跨链查询来查找来自远程链的预言机汇率或代币余额。 + +## 跨链安全模块(ISM) + +[跨链安全模块](../protocol/ISM/modular-security.mdx)(ISM)是为 Hyperlane 的跨链[邮箱](../protocol/mailbox.mdx)提供安全性的智能合约。 + +ISM 负责验证在目标链上传递的跨链消息是否_确实_在源链上发送。 + +## 邮箱(Mailbox) + +可以说是最重要的 Hyperlane 智能合约,[邮箱](../protocol/interchain-gas-payment.mdx)提供了一个开发者可以用来[发送](./messaging/send.mdx)和[接收](./messaging/receive.mdx)跨链消息的接口。 + +## 中间件(Middleware) + +发送和接收消息并提供面向开发者 API 的智能合约。开发者应使用此 API 而不是直接与[邮箱](glossary.mdx#mailbox)交互。 + +中间件示例包括[跨链账户-ICA](glossary.mdx#interchain-accounts-ica)和[跨链查询-IQS](glossary.mdx#interchain-queries-iqs)。 + +## 多重签名 ISM(Multisig ISM) + +[多重签名 ISM](../protocol/ISM/multisig-ISM.mdx) 是一种[跨链安全模块](glossary.mdx#interchain-security-module),它使用 `n` 个[验证器](glossary.mdx#validator)中的 `m` 个的签名来验证特定的跨链消息。 + +## 无许可互操作性(Permissionless Interoperability) + +任何人都可以将 Hyperlane 部署到任何链上,无论是第 1 层、rollup 还是应用链,使该链能够无缝通信。Hyperlane 协议的开放设计被称为无许可互操作性(PI)。由 Hyperlane 核心团队以外的机构部署的链被称为"PI 链"。 + +## 中继器(Relayer) + +[中继器](../protocol/agents/relayer.mdx)是负责将消息从其源链传递到目标链的 Hyperlane [代理](glossary.mdx#agent)。 + +中继器是不受信任的,任何人都可以运营中继器。 + +## 路由 ISM(Routing ISM) + +[路由 ISM](../protocol/ISM/routing-ISM.mdx) 是一种[跨链安全模块](glossary.mdx#interchain-security-module),它根据正在传递的消息委托给不同的 ISM。 + +例如,路由 ISM 可以根据发送消息的源链使用不同的 ISM。 + +## 合成链(Synthetic chain) + +对于[Warp 路由](glossary.mdx#warp-route),是指铸造包装代币的链。这些包装代币由在[抵押链](glossary.mdx#collateral-chain)上锁定的[抵押代币](glossary.mdx#collateral-token)支持。 + +## 验证器(Validator) + +[验证器](../protocol/agents/validators.mdx)是负责验证源链发送的消息的 Hyperlane [代理](glossary.mdx#agent)。 + +[多重签名 ISM](glossary.mdx#multisig-ism) 使用验证器签名为入站消息提供安全性。 + +## Warp 路由(Warp Route) + +[Warp 路由](applications/warp-routes.mdx#overview)是 Hyperlane 对代币桥接概念的实现,允许您通过 Hyperlane 无需许可地将任何类 ERC20 资产转移到任何链。 + +阅读更多关于如何[部署 Warp 路由](../guides/deploy-warp-route.mdx)的信息。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/arbitrum-L2-to-L1.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/arbitrum-L2-to-L1.mdx new file mode 100644 index 00000000..c4a89f72 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/arbitrum-L2-to-L1.mdx @@ -0,0 +1,91 @@ +# Arbitrum L2 到 L1 Hook + +Arbitrum 的 Outbox 系统允许在乐观挑战期后进行任意的 L2 到 L1 合约调用,即在 L2 链上发起的消息最终会在 L1 上执行。更多详情请参见[此处](https://docs.arbitrum.io/how-arbitrum-works/arbos/l2-l1-messaging)。Hyperlane 可以包装 Outbox 系统,利用 Arbitrum L2 的乐观安全性(7 天提款期和运营欺诈证明)来保护来自任何 Arbitrum Nitro rollups 的 L2 到 L1 消息的安全。我们已经实现了 [ArbL2ToL1Hook](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/hooks/ArbL2ToL1Hook.sol) 和 [ArbL2ToL1Ism](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/hook/ArbL2ToL1Ism.sol)。 + +## 工作原理 + +:::note + +来自 L2 的外发消息无法提供协议内的自动 L1 执行,因为以太坊不通过 L1 节点提供计划执行功能。 + +::: + +`ArbL2ToL1Hook` 将带有 `messageId` 的编码函数调用发送到 L2 上的 `ArbSys` 预编译合约。在等待提款期后,您可以在 L2 上调用 `getOutboxProof()` 来获取消息的默克尔证明。从这里开始,您有两个选择: + +- **选项 A:** 您可以通过 `mailbox.process()` 调用来调用 `ArbL2ToL1Ism` 的验证函数,并附带证明和其他编码数据,这反过来会调用 `outbox.executeTransaction()`,检查消息发送者和消息数据的有效性。 +- **选项 B:** 您可以直接使用证明和其他编码数据调用 `outbox.executeTransaction()`。但是,您需要再次调用 `ArbL2ToL1Ism` 的验证函数来传递消息。这个选项也允许向接收者合约传递消息值。 + +### 选项 A + +```mermaid +flowchart TB + subgraph Origin L2[源 L2] + Sender[发送者] + M_O[(Mailbox)] + Hook[ArbL2ToL1Hook] + L_2[(ArbSys)] + + Sender -- "dispatch(...)" --> M_O + M_O -- "postDispatch(message)" --> Hook + Hook -- "sendMessage(messageId)" --> L_2 + end + + M_O -. "process (中继器) + 7 天后" .-> M_D + L_2 -. "exeuteTransaction(第三方中继器) + 7 天后" .-> L_1 + + subgraph Destination L1[目标 L1] + Recipient[接收者] + M_D[(Mailbox)] + ISM{ArbL2ToL1Ism} + L_1[(ArbOutbox)] + + M_D -- "verify(..., message)" --> ISM + M_D -- "handle(...)" --> Recipient + ISM -. "interchainSecurityModule()" .- Recipient + + L_1 + end + + style L_1 fill:#162c4f + style L_2 fill:#162c4f +``` + +### 选项 B + +注意:在这里,中继器负责从 `arbSys.getOutboxProof()` 编码消息证明并调用 `outbox.executeTransaction()` 函数。 + +```mermaid +flowchart TB + subgraph Origin L2[源 L2] + Sender[发送者] + M_O[(Mailbox)] + Hook[ArbL2ToL1Hook] + L_2[(ArbSys)] + + Sender -- "dispatch(...)" --> M_O + M_O -- "postDispatch(message)" --> Hook + Hook -- "sendMessage(messageId)" --> L_2 + end + + M_O -. "process(中继器) + 7 天后" .-> M_D + M_O -. "getOutboxProof()" .-> L_2 + + subgraph Destination L1[目标 L1] + Recipient[接收者] + M_D[(Mailbox)] + ISM{ArbL2ToL1Ism} + L_1[(ArbOutbox)] + + M_D -- "verify(..., message)" --> ISM + M_D -- "handle(...)" --> Recipient + ISM -. "interchainSecurityModule()" .- Recipient + + L_1 -- "verifyMessageId(messageId)" --> ISM + end + + style L_1 fill:#162c4f + style L_2 fill:#162c4f +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/interchain-gas.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/interchain-gas.mdx new file mode 100644 index 00000000..2c182d8b --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/interchain-gas.mdx @@ -0,0 +1,218 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# 跨链 Gas 支付 + +要[传递消息](../messaging/receive.mdx),必须在目标链上包含一个交易,该交易使用编码的消息和 ISM 元数据调用 Mailbox 的 `process` 函数。 + +```mermaid +flowchart LR + subgraph Origin Chain[源链] + Sender[发送者] + M_O[(Mailbox)] + IGP[InterchainGasPaymaster] + Sender -- "dispatch(...)\n{value}" --> M_O + M_O -- "postDispatch(..., gasLimit)\n{value}" --> IGP + end + + Relayer((中继器)) + + M_O -. "索引" .-> Relayer + IGP -. "value" .- Relayer +``` + +为了方便起见,[中继器](../../operate/relayer/run-relayer.mdx)会监视已发送的消息,如果在源链上收到足够的支付,就会代表消息发送者提交处理交易。我们将此称为*跨链 gas 支付*。 + +```mermaid +flowchart LR + Relayer((中继器)) + + subgraph Destination Chain[目标链] + M_D[(Mailbox)] + M_D -- "handle(...)" --> Recipient[接收者] + end + + Relayer -- "process{gasLimit}(...)" --> M_D +``` + +由于消息可以触发任意代码执行,中继器必须使用 `gasLimit` 来限制 [`handle` 调用](../messaging/receive.mdx#handle),以便在消息发送时适当收费。 + +$$ +destinationTxCost = destinationGasPrice * gasLimit +\\[5pt] +exchangeRate = \frac{originGasTokenPrice}{destinationGasTokenPrice} +\\[5pt] +originFee = exchangeRate * destinationTxCost +$$ + +## 目标链 Gas 配置 + +对于每个远程域,您可以设置域 gas 配置。 + +```solidity +struct DomainGasConfig { + IGasOracle gasOracle; + uint96 gasOverhead; +} +``` + +### gasOracle + +`gasOracle` 是一个包含支持的源链和目标链之间汇率的合约。 + +### gasOverhead + +`gasOverhead` 是在目标链上处理消息的运营成本。当返回发送消息的成本报价时,IGP 合约会将此 `gasOverhead` 添加到 `gasLimit` 中。 + +## 发送后处理 + +在发送后 hook 期间,如果支付不足以支付中继器的*预期*成本,`InterchainGasPaymaster` 合约将回滚。中继器将遵守 `dispatch` 时的报价。 + +### Gas 限制 + +当未指定时,用于限制 `handle` 调用的 `gasLimit` 使用静态默认值 `50_000`。 + +:::tip +我们建议开发者在单元测试中对其 [`handle` 实现](../messaging/receive.mdx#handle)进行基准测试,以确定合理的 `gasLimit`。 +::: + +如果您预计 `handle` 函数将消耗超过此默认值的 gas,您应该在[元数据中覆盖默认 `gasLimit`](#metadata)。 + +### 元数据 + +此 hook 期望元数据采用 `StandardHookMetadata` 的**打包编码**。有关如何传递元数据覆盖,请参见 Mailbox 的[dispatch 重载](../messaging/send.mdx#overriding-default-hook-metadata)。 + + + + +```solidity +struct StandardHookMetadata { + uint16 variant; + uint256 msgValue; + uint256 gasLimit; + address refundAddress; +} +``` + +#### 示例 + +```solidity +bytes memory metadata = abi.encodePacked( + StandardHookMetadata({ + variant: 1, // 此 hook 仅支持此变体 + msgValue: 0, // 此 hook 未使用 + gasLimit: 100000, // 覆盖默认 gas 限制 + refundAddress: msg.sender // 覆盖默认退款地址 + }) +); +``` + + + + +## Gas 预言机 + +跨链 gas 支付要求使用预言机化的 gas 价格和支持的源链与目标链之间的汇率来计算。 + +:::info +汇率和 gas 价格由中继器决定。可能会收取价差以应对价格波动和运营成本。 +::: + + + + +```solidity +function getExchangeRateAndGasPrice( + uint32 _destinationDomain +) + public + view + override + returns (uint128 tokenExchangeRate, uint128 gasPrice) +{ + IGasOracle _gasOracle = destinationGasConfigs[_destinationDomain] + .gasOracle; + + if (address(_gasOracle) == address(0)) { + revert( + string.concat( + "Configured IGP doesn't support domain ", + Strings.toString(_destinationDomain) + ) + ); + } + return _gasOracle.getExchangeRateAndGasPrice(_destinationDomain); +} +``` + +**参数** + +- `destinationDomain`:消息的目标域 + +**返回值** +- `tokenExchangeRate`:源链和目标链 gas 代币之间的汇率 +- `gasPrice`:目标链的 gas 价格 + + + + +`quoteGasPayment` 函数计算中继器预期成本的费用。 + + + + +```solidity +function quoteGasPayment( + uint32 _destinationDomain, + uint256 _gasLimit +) public view virtual override returns (uint256) { + // 获取目标域的 gas 数据 + ( + uint128 _tokenExchangeRate, + uint128 _gasPrice + ) = getExchangeRateAndGasPrice(_destinationDomain); + + // 以目标链原生代币计价的总成本 + uint256 _destinationGasCost = _gasLimit * uint256(_gasPrice); + + // 转换为本地原生代币 + return + (_destinationGasCost * _tokenExchangeRate) / + TOKEN_EXCHANGE_RATE_SCALE; +} +``` + +**参数** +- `destinationDomain`:消息的目标域 +- `gasLimit`:用于限制 `handle` 调用的 gas 限制 + +**返回值** +- `fee`:`postDispatch` 成功所需的支付金额 + + + + +## 重试 + +如果 `handle` 调用消耗的 gas 超过报价,中继器将不会提交处理交易。在这种情况下,可以使用 `payForGas` 函数支付额外的 gas。 + + + + +```solidity +function payForGas( + bytes32 _messageId, + uint32 _destinationDomain, + uint256 _gasAmount, + address _refundAddress +) external payable; +``` + +**参数** +- `messageId`:从 `dispatch` 调用返回的消息标识符 +- `destinationDomain`:消息的目标域 +- `gasAmount`:要支付的额外 gas 数量 +- `refundAddress`:退还多余支付的地址 + + + diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/op-stack.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/op-stack.mdx new file mode 100644 index 00000000..05e0571e --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/op-stack.mdx @@ -0,0 +1,53 @@ +# OP Stack Hook + +Optimism 和其他 [OP Stack](https://stack.optimism.io/) rollups 有自己的 L1 和 L2 之间的消息传递接口,称为 `CrossDomainMessenger`。通过此接口传递的消息受益于 rollup [结算层](https://stack.optimism.io/docs/understand/landscape/#execution)的安全性。 + +```solidity +function sendMessage( + address _target, + bytes calldata _message, + uint32 _gasLimit +) external payable; +``` + +为了在 Hyperlane 中提供这种安全性选项,我们创建了一个 Hook 和 ISM 组合,可以透明地配置以重用原生 OP Stack 接口。 + +有关 Hook 和 ISM 地址,请参见[地址](../contract-addresses.mdx)页面。 + +## 工作原理 + +OPStackHook 将 messageId 发送到 L1CrossDomainMessenger,后者将其注册为带有 ETH 存款和消息数据的 Optimism `TransactionDeposited` 事件,这些数据会被 rollup 节点获取。 +rollup 节点调用预编译合约 `L2CrossDomainMessenger` 的 relayMessage 函数,该函数反过来调用配置的 OptimismISM 合约,将 messageId 设置在 verifiedMessageId 映射中,指向原始的 L1 发送者(即用户)。中继器只携带消息而没有元数据,等待 Optimism 节点进行获取并对 Optimism 进行存储写入,然后消息传递就得到验证。 + +```mermaid +flowchart TB + subgraph Origin L1[源 L1] + Sender[发送者] + M_O[(Mailbox)] + Hook[OPStackHook] + L_1[(L1CrossDomainMessenger)] + + Sender -- "dispatch(...)" --> M_O + M_O -- "postDispatch(message)" --> Hook + Hook -- "sendMessage(messageId)" --> L_1 + end + + M_O -. "中继" .-> M_D + L_1 -. "rollup 节点" .-> L_2 + + subgraph Destination L2[目标 L2] + Recipient[接收者] + M_D[(Mailbox)] + ISM{OPStackISM} + L_2[(L2CrossDomainMessenger)] + + M_D -- "verify(..., message)" --> ISM + M_D -- "handle(...)" --> Recipient + ISM -. "interchainSecurityModule()" .- Recipient + + L_2 -- "verifyMessageId(messageId)" --> ISM + end + + style L_1 fill:#ff0402 + style L_2 fill:#ff0402 +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/overview.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/overview.mdx new file mode 100644 index 00000000..e9a2a2a3 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/overview.mdx @@ -0,0 +1,290 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +import { MultiLanguageExample } from "@site/src/components/InteractiveExample"; + +# 发送后 Hook + +发送后 hook 允许开发者为通过 Mailbox 发送的消息内容配置额外的源链行为。 + +```mermaid +flowchart TB + subgraph Origin[源链] + Sender[发送者] + M_O[(Mailbox)] + Hook[IPostDispatchHook] + + Sender -- "dispatch(..., metadata, hook)\n{value}" --> M_O + M_O -- "postDispatch(message, metadata)\n{value}" --> Hook + end +``` + +这允许开发者集成第三方/原生桥接、进行额外的链上承诺或要求自定义费用,同时保持一致的单一调用 Mailbox 接口。 + +
+`IPostDispatchHook` 接口 + + + + +```solidity +interface IPostDispatchHook { + /** + * @notice Returns a unique identifier for the hook implementation. + * @dev Called by the Mailbox contract when dispatching a message. + * @return An identifier for the hook implementation. + */ + function hookType() external pure returns (uint8); + + /** + * @notice Called by the Mailbox contract after dispatching a message. + * @dev The hook may revert to disallow message dispatch. + * @param metadata Arbitrary metadata passed by the dispatcher + * @param message The message being dispatched + */ + function postDispatch(bytes calldata metadata, bytes calldata message) + external + payable; + + /** + * @notice Returns the fee required to dispatch a message with the hook. + * @param metadata Arbitrary metadata passed by the dispatcher + * @param message The message being dispatched + * @return The fee required to dispatch the message + */ + * @notice Post action after a message is dispatched via the Mailbox +* function quoteDispatch( + bytes calldata metadata, + bytes calldata message + ) external view returns (uint256); +} + +``` + + + +
+ +## 发送后处理 + +除了通过 Mailbox 发送的 `message` 外,`postDispatch` 函数还接收一个 `metadata` 参数。`metadata` 参数从 `dispatch` 调用中未经修改地传递到 hook。这允许开发者将任何所需的上下文传递给 hook。 + + + + +```solidity +* @notice Post action after a message is dispatched via the Mailbox +* @param metadata The metadata required for the hook +* @param message The message passed from the Mailbox.dispatch() call +*/ +``` + + + + +如果 `postDispatch` 函数收到的支付不足,它可能会回滚。 + +:::info +发送后 Hook 可能是可重放的。创建自定义 hook 的开发者应该实现安全检查以防止这种行为。[这里](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/b69bc23239ecfc8f8a6277bb0f9bc248cffea234/solidity/contracts/hooks/warp-route/RateLimitedHook.sol#L16)有一个示例实现。 +::: + +### 查询发送费用 + +在 `postDispatch` 中经常收取费用以支付目标链交易提交和安全保障等成本。要获取相应 `postDispatch` 调用的报价,您可以查询 `quoteDispatch` 函数。 + + + + +```solidity +* @param metadata The metadata required for the hook +* @param message The message passed from the Mailbox.dispatch() call +* @return Quoted payment for the postDispatch call +*/ +``` + + + + +Mailbox 有一个 `quoteDispatch` 函数,它返回使 `dispatch` 调用成功所需的总费用。 + +```mermaid +flowchart TB + subgraph Origin[源链] + Sender[发送者] + M_O[(Mailbox)] + R_H[必需Hook] + Hook[Hook] + + Sender -- "quoteDispatch(..., metadata, hook)" --> M_O + M_O -- "required = quoteDispatch(message, metadata)" --> R_H + M_O -- "fee = hook.quoteDispatch(message, metadata)" --> Hook + M_O -- "required + fee" --> Sender + end +``` + +转到[这里](../../guides/create-custom-hook-and-ism.mdx)查看实现 hook 的指南。 + +### 覆盖默认 Hook 元数据 + +要覆盖默认元数据,有一个带有可选 `metadata` 参数的 `dispatch` 重载。 + +:::info +Hook 目前期望元数据使用 [`StandardHookMetadata` 库](../libraries/hookmetadata.mdx)进行格式化。 +::: + + + + +```solidity +/** + * @notice Dispatches a message to the destination domain & recipient. + * @param destinationDomain Domain of destination chain + * @param recipientAddress Address of recipient on destination chain as bytes32 + * @param messageBody Raw bytes content of message body + * @param hookMetadata Metadata used by the post dispatch hook +``` + + + + +自定义 `metadata` 将传递给必需 hook 的 `quoteDispatch` 和 `postDispatch` 函数,然后传递给默认 hook 的 `postDispatch` 函数。 + +```mermaid +flowchart LR + subgraph Origin Chain[源链] + Sender[发送者] + M_O[(Mailbox)] + R_H[必需Hook] + D_H[默认Hook] + Sender -- "dispatch(..., metadata){value}" --> M_O + + M_O -. "fee = quoteDispatch(...)" .- R_H + M_O -- "postDispatch(metadata, ...)\n{fee}" --> R_H + M_O -. "postDispatch(metadata, ...)\n{value - fee}" ..-> D_H + end +``` + +#### 示例 + +
+`StandardHookMetadata` 库 + + + + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.8.0; + +library StandardHookMetadata { + // ============ Constants ============ + uint8 internal constant STANDARD_HOOK_VERSION = 0; + + // ============ Metadata formatting ============ + function formatMetadata( + uint256 gasLimit, + uint256 gasPrice, + uint256 refundAddress + ) internal pure returns (bytes memory) { + return + abi.encodePacked( + STANDARD_HOOK_VERSION, + uint64(gasLimit), + uint64(gasPrice), + uint160(refundAddress) + ); + } + + function overrideGasLimit(uint256 gasLimit) internal pure returns (bytes memory) { + return formatMetadata(gasLimit, 0, 0); + } + + // ============ Metadata parsing ============ + function gasLimit(bytes calldata metadata) internal pure returns (uint256) { + require(metadata.length >= 9, "Metadata too short"); + require(metadata[0] == STANDARD_HOOK_VERSION, "Unsupported hook metadata version"); + return uint64(bytes8(metadata[1:9])); + } + + function gasPrice(bytes calldata metadata) internal pure returns (uint256) { + require(metadata.length >= 17, "Metadata too short"); + require(metadata[0] == STANDARD_HOOK_VERSION, "Unsupported hook metadata version"); + return uint64(bytes8(metadata[9:17])); + } + + function refundAddress(bytes calldata metadata) internal pure returns (address) { + require(metadata.length >= 37, "Metadata too short"); + require(metadata[0] == STANDARD_HOOK_VERSION, "Unsupported hook metadata version"); + return address(uint160(bytes20(metadata[17:37]))); + } +} +``` + + + +
+ + `\ +// 从 ${originChain} 发送消息到 ${destinationChain} TestRecipient +IMailbox mailbox = IMailbox("${mailbox}"); +mailbox.dispatch{value: msg.value}( + ${destinationDomain}, + "${paddedRecipient}", + bytes("${body}"), + StandardHookMetadata.overrideGasLimit(200000) +); +`} +/> + +### 自定义 hook 和元数据 + +实现上述接口后,您可以使用我们 mailbox 中的重载 `dispatch` 调用来覆盖默认 hook 和 hook 元数据: + + + + +```solidity +* @notice Dispatches a message to the destination domain & recipient. +* @param destinationDomain Domain of destination chain +* @param recipientAddress Address of recipient on destination chain as bytes32 +* @param messageBody Raw bytes content of message body +* @param metadata Metadata used by the post dispatch hook +* @param hook Custom hook to use instead of the default +* @return The message ID inserted into the Mailbox's merkle tree +``` + + + + +### 示例 + + `\ +// 从 ${originChain} 发送消息到 ${destinationChain} TestRecipient +IMailbox mailbox = IMailbox("${mailbox}"); +IPostDispatchHook merkleTree = IPostDispatchHook("${merkleTreeHook}"); +mailbox.dispatch( + ${destinationDomain}, + "${paddedRecipient}", + bytes("${body}"), + "0x", // 空元数据 + merkleTree +); +`} +/> diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/polygon-pos.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/polygon-pos.mdx new file mode 100644 index 00000000..314228d0 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/hooks/polygon-pos.mdx @@ -0,0 +1,47 @@ +# Polygon PoS Hook + +Polygon PoS 有自己的以太坊和 Polygon 之间的消息传递接口,称为 [`fx portal`](https://github.com/0xPolygon/fx-portal)。通过此接口传递的消息受益于 Polygon [状态同步机制](https://docs.polygon.technology/pos/architecture/bor/state-sync/)的安全性。 + +为了在 Hyperlane 中提供这种安全性选项,我们创建了一个 Hook 和 ISM 组合,可以透明地配置以重用 fx-portal 接口。 + +有关 Hook 和 ISM 地址,请参见[地址](../contract-addresses.mdx)页面。 + +## 工作原理 + +Polygon FX-Portal 提供 FxChild (FxChild.sol) 和 FxRoot (FxRoot.sol) 作为桥接工作的主要合约。它可以调用并将数据传递到另一条链上的用户定义方法,而无需映射。 + +FxChild/FxRoot 合约由 polygon 团队提供和维护。您可以在 Polygon 的 [Fx-Portal 仓库](https://github.com/0xPolygon/fx-portal)中找到此合约的地址。 +PolygonPosHook 通过 FxRoot 发送有效负载。验证者将获取消息并将其传递到另一条链。您可以在[文档](https://docs.polygon.technology/pos/how-to/bridging/l1-l2-communication/state-transfer/)中找到详细的状态同步机制。位于 `0x0000000000000000000000000000000000001001` 的 `StateReceiver` 被允许在 FxChild 合约中调用 `onStateReceive`。FxChild 在抽象的 `CrossChainEnabledPolygonChild` 中调用 `processMessageFromRoot`,PolygonPosISM 实现了该抽象合约。`CrossChainEnabledPolygonChild` 由 [OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/api/crosschain#) 维护。 + +```mermaid +flowchart TB + subgraph Origin Ethereum[源以太坊] + Sender[发送者] + M_O[(Mailbox)] + Hook[PolygonPosHook] + Eth[(FxRoot)] + + Sender -- "dispatch(...)" --> M_O + M_O -- "postDispatch(message)" --> Hook + Hook -- "sendMessage(messageId)" --> Eth + end + + M_O -. "中继" .-> M_D + Eth -. "验证者节点" .-> Polygon + + subgraph Destination Polygon PoS[目标 Polygon PoS] + Recipient[接收者] + M_D[(Mailbox)] + ISM{PolygonPosISM} + Polygon[(FxChild)] + + M_D -- "verify(..., message)" --> ISM + M_D -- "handle(...)" --> Recipient + ISM -. "interchainSecurityModule()" .- Recipient + + Polygon -- "verifyMessageId(messageId)" --> ISM + end + + style Eth fill:#ff0402 + style Polygon fill:#ff0402 +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/latencies.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/latencies.mdx new file mode 100644 index 00000000..eb0f3c4f --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/latencies.mdx @@ -0,0 +1,18 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import ReorgPeriodTable from "@site/src/components/ReorgPeriodTable"; + +# 延迟 + +验证者必须等待一定数量的区块被挖出后,才能被认为是有效的和[重组安全](https://www.alchemy.com/overviews/what-is-a-reorg)的。如果没有这个等待期,验证者可能会被惩罚,因为他们可能签署了一个不再有效的检查点。 + +请参考以下部分了解 Hyperlane 验证者使用的区块最终确定性配置。 + + + + + + + + + diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/libraries/mailboxclient.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/libraries/mailboxclient.mdx new file mode 100644 index 00000000..c7c79b6d --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/libraries/mailboxclient.mdx @@ -0,0 +1,14 @@ +# `MailboxClient` 库 + +继承 [`MailboxClient`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/v3/solidity/contracts/MailboxClient.sol) 是确保您的合约知道在哪里发送或接收跨链消息的简单方法。 + +这个混入合约维护了 Hyperlane 开发者可能需要与之交互的三个合约的指针: + +1. [`Mailbox`](../messaging/messaging-interface.mdx)(必需) +2. [`IPostDispatchHook`](../hooks/interchain-gas.mdx)(可选) +3. [`IInterchainSecurityModule`](../ISM/specify-your-ISM.mdx)(可选) + +`MailboxClient` 提供了一些函数,允许子类通过 `mailbox` 存储变量轻松地向 `Mailbox` 发送消息,并通过 `onlyMailbox` 修饰符控制消息传递权限。 + +```solidity file=/node_modules/@hyperlane-xyz/core/contracts/client/MailboxClient.sol +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/libraries/router.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/libraries/router.mdx new file mode 100644 index 00000000..e483f0fb --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/libraries/router.mdx @@ -0,0 +1,14 @@ +import RouterDiagram from '@site/src/diagrams/router.md' + +# `Router` 库 + +希望编写一次合约并在多个链上部署的应用程序开发者应该考虑使用 [`Router`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/Router.sol) 模式进行构建。 + +在这种模式中,应用程序的合约实例部署在每个应用程序支持的链上。每个实例都知道其他链上实例的地址。这些实例使用 Hyperlane 与远程链上的实例进行信息和状态的双向通信。 + + + +使用这种模式的开发者可以继承 `Router` 混入合约。`Router` 是一个 [`MailboxClient`](./mailboxclient.mdx),它跟踪远程链上其他 `Router` 合约地址。这允许 `Router` 直接向其他 Router 发送消息,而无需指定地址。它还允许 `Router` 拒绝来自其他不受信任发送者的消息。 + +```solidity file=/node_modules/@hyperlane-xyz/core/contracts/client/Router.sol +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/libraries/typecasts.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/libraries/typecasts.mdx new file mode 100644 index 00000000..0d91dbf6 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/libraries/typecasts.mdx @@ -0,0 +1,4 @@ +# `TypeCasts` 库 + +```solidity file=/node_modules/@hyperlane-xyz/core/contracts/libs/TypeCasts.sol +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/messaging/receive.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/messaging/receive.mdx new file mode 100644 index 00000000..21daf627 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/messaging/receive.mdx @@ -0,0 +1,137 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +import MessagingIsmDiagram from "@site/src/diagrams/messaging-isms.md"; + +import SimpleMessagingDiagram from "@site/src/diagrams/messaging-simple.md"; + +# 接收消息 + +为了传递跨链消息,[中继器](/docs/operate/relayer/run-relayer.mdx)会调用 `Mailbox.process()`。 + +该函数的参数包括要传递的消息,以及可以由中继器指定的任意元数据。 + +`Mailbox` 会将消息和元数据传递给接收者的跨链安全模块(ISM)进行验证。如果 ISM 成功验证了消息,`Mailbox` 就会通过调用 `recipient.handle()` 将消息传递给接收者。 + + + +:::info + +有关 Hyperlane 消息编码的更多详细信息,请参阅 [`Message.sol`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) + +::: + +## Handle + +当收到消息时,`Mailbox` 合约会调用此函数。 + +:::danger +为了确保只接受有效的跨链消息,限制对 Mailbox 地址的[访问控制](#访问控制)非常重要。 +::: + + + + +```solidity +interface IMessageRecipient { + function handle( + uint32 origin, + bytes32 sender, + bytes calldata messageBody + ) external; +} +``` + +**参数** + +- `origin`:源链的域 +- `sender`:源链上发送者的地址(以 bytes32 格式) +- `messageBody`:消息体的原始字节内容 + +:::info +发送者地址会被左填充为 `bytes32` 以兼容不同寻址方式的虚拟机。为了方便起见,[`TypeCasts` 库](../libraries/typecasts.mdx)提供了以下实用工具。 + +```solidity +// alignment preserving cast +function bytes32ToAddress(bytes32 _buf) internal pure returns (address) { + require( + uint256(_buf) <= uint256(type(uint160).max), + "TypeCasts: overflow" + ); + return address(uint160(uint256(_buf))); +} +``` + +::: + + + + + +### 访问控制 + +如果合约只应接受来自跨链消息的调用,那么 `handle` 函数应该被限制为只能由 Mailbox 地址调用。 + +为了方便起见,[`MailboxClient` 库](../libraries/mailboxclient.mdx)提供了以下实用工具。 + + + + +```solidity +modifier onlyMailbox() virtual { + require( + msg.sender == address(_mailbox), + "MailboxClient: sender not mailbox" + ); + _; +} +``` + + + + + +### 示例 + + + + +```solidity +function handle( + uint32 _origin, + bytes32 _sender, + bytes calldata _message +) external onlyMailbox { + // 处理消息 + latestMessage = string(_message); + emit ReceivedMessage(_origin, _sender, _message); +} +``` + + + + + +## 验证 + +当收到消息时,Mailbox 会在调用消息接收者的 `handle` 之前,使用[跨链安全模块](../ISM/specify-your-ISM.mdx)进行安全验证。 + +### 默认安全 + +要查询默认 ISM 地址,您可以调用 `defaultIsm` 函数。 + + + + +```solidity +function defaultIsm() external view returns (IInterchainSecurityModule); +``` + + + + +### 模块化安全 + +为了利用 Hyperlane 的模块化安全特性,消息接收者可以指定一个自定义的跨链安全模块来**验证**传入消息的**任何内容**。当指定了自定义 ISM 时,Mailbox 将使用该模块进行验证。 + + diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/messaging/send.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/messaging/send.mdx new file mode 100644 index 00000000..6adb286c --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/messaging/send.mdx @@ -0,0 +1,180 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +import { MultiLanguageExample } from "@site/src/components/InteractiveExample"; + +import SimpleMessagingDiagram from "@site/src/diagrams/messaging-simple.md"; + +# 发送消息 + +要发送跨链消息,开发者需要调用 `Mailbox.dispatch()`。 + +该函数的参数包括消息内容、目标链 ID 和接收者地址。每条消息都会作为叶子节点插入到 `Mailbox` 存储的[增量默克尔树](https://medium.com/@josephdelong/ethereum-2-0-deposit-merkle-tree-13ec8404ca4f)中。Hyperlane 的权益证明协议使用这个默克尔树来验证欺诈证明。 + + + +## 发送 + +调用此函数将消息发送到目标域和接收者。 + +:::warning +Hyperlane 只能将消息传递给实现了 `handle` 函数的智能合约。有关更多信息,请参阅[接收消息](./receive.mdx)文档。 +::: + +根据[发送后 hook 配置](##post-dispatch-hook-config),可能需要支付一些费用。有关更多信息,请参阅 [`quoteDispatch`](#quote-dispatch) 部分。 + + + + +```solidity +function dispatch( + uint32 destination, + bytes32 recipient, + bytes calldata body +) external payable returns (bytes32); +``` + +:::info +接收者地址会被左填充为 `bytes32` 以兼容不同寻址方式的虚拟机。为了方便起见,[`TypeCasts` 库](../libraries/typecasts.mdx)提供了以下实用工具。 + +```solidity +library TypeCasts { + function addressToBytes32(address addr) internal pure returns (bytes32) { + return bytes32(uint256(uint160(addr))); + } +} +``` + +::: + + + + + +### 示例 + + `\ +// 从 ${originChain} 发送消息到 ${destinationChain} TestRecipient +IMailbox mailbox = IMailbox("${mailbox}"); +bytes32 messageId = mailbox.dispatch{value: msg.value}( + ${destinationDomain}, + "${paddedRecipient}", + bytes(\"${body}\") +);`} +/> + +## 查询发送费用 + +费用通常被配置为覆盖 IGP 支付以及协议成本。这包括目标链上的交易提交、安全保障和维护费用。要获取相应 `dispatch` 调用的费用报价,您可以查询 `quoteDispatch` 函数。 + +```mermaid +flowchart TB + subgraph Origin Chain[源链] + Sender[发送者] + M_O[(Mailbox)] + Sender <-- "fee = quoteDispatch(...)" --> M_O + Sender -- "dispatch(...){fee}" --> M_O + end +``` + + + + +```solidity +function quoteDispatch( + uint32 destination, + bytes32 recipient, + bytes calldata body +) external view returns (uint256); +``` + +必须将报价的 `fee` 作为 value 传递给 `dispatch` 调用,以确保它不会回滚。 + + + + + +### 示例 + + `\ +// 查询从 ${originChain} 发送消息到 ${destinationChain} TestRecipient 的费用 +IMailbox mailbox = IMailbox("${mailbox}"); +uint32 destination = ${destinationDomain}; +bytes32 recipient = "${paddedRecipient}"; +bytes memory body = bytes("${body}"); +uint256 fee = mailbox.quoteDispatch(destination, recipient, body); +mailbox.dispatch{value: fee}(destination, recipient, body); +`} +/> + +:::danger +向 `dispatch` 支付的费用不足将导致回滚。如果您正在组合多个 hook,多支付的费用**可能不会**退还给消息发送者。 +::: + +## 发送后 Hook 配置 + +Mailbox 上配置了两个 hook: + +- `required`:对所有支付了所需费用的 `dispatch` 调用都会调用此 hook +- `default`:在支付 `required` hook 费用后,使用剩余 value 调用此 hook(除非被覆盖) + +```mermaid +flowchart LR + subgraph Origin Chain[源链] + Sender[发送者] + M_O[(Mailbox)] + R_H[必需Hook] + D_H[默认Hook] + Sender -- "dispatch(...){value}" --> M_O + + M_O -. "fee = quoteDispatch(...)" .- R_H + M_O -- "postDispatch(...)\n{fee}" --> R_H + M_O -- "postDispatch(...)\n{value - fee}" --> D_H + end +``` + +### 必需 Hook + +要查询必需 hook 配置,您可以调用 `requiredHook` 函数。 + + + + +```solidity +function requiredHook() external view returns (IPostDispatchHook); +``` + + + + +### 默认 Hook + +要查询默认 hook 配置,您可以调用 `defaultHook` 函数。 + + + + +```solidity +function defaultHook() external view returns (IPostDispatchHook); +``` + + + + +要在 `dispatch` 调用中用自定义 hook 覆盖默认 hook,请参阅 [Hooks 参考](../hooks/overview.mdx)。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/registries.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/registries.mdx new file mode 100644 index 00000000..d6486c2e --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/registries.mdx @@ -0,0 +1,64 @@ +# Hyperlane 注册表 + +## 概述 + +任何人都可以在任何地方部署 Hyperlane。但要使这些部署有用,它们的详细信息必须是众所周知的。注册表是链元数据、合约地址和其他与 Hyperlane 合约和工具交互所需的有用信息的集合。Hyperlane 核心团队维护着一个[规范注册表](https://github.com/hyperlane-xyz/hyperlane-registry)。[CLI](/docs/reference/cli.mdx)、[Explorer](https://explorer.hyperlane.xyz) 和其他工具都可以使用注册表数据。 + +## 规范注册表 + +Hyperlane 核心团队完成的部署的元数据和工件将在此处提供: +https://github.com/hyperlane-xyz/hyperlane-registry + +然而,我们鼓励社区成员将他们自己的部署添加到这个规范注册表中。贡献步骤如下: + +1. Fork 并克隆注册表仓库 +2. 使用 CLI 并将 `--registry` 标志设置为克隆仓库的本地路径 +3. 根据需要执行您的命令 +4. 将更改推送到您的 fork 并创建拉取请求 + +## 自定义注册表 + +只要注册表符合与规范注册表相同的布局和文件模式,就可以使用任何 Github 仓库 URL 或本地文件路径。 + +CLI 有两个命令行参数用于配置它使用的注册表: + +- `--registry` 标志设置主要注册表,如果未设置则使用默认的 Github 注册表 +- `--overrides` 标志设置一个可选的附加路径,这对于强制覆盖默认数据很有用,例如在链的元数据中使用不同的 RPC URL。 + +一旦您的自定义注册表添加/更新完成并经过测试,请考虑向规范注册表提交拉取请求,以便其他人也能从您的部署中受益。 + +更多信息请参见 [CLI 参考页面](/docs/reference/cli.mdx)。 + +## 使用方法(Javascript 和 Typescript) + +### 安装 + +```bash +# 使用 npm +npm install @hyperlane-xyz/registry +# 或使用 yarn +yarn add @hyperlane-xyz/registry +``` + +### 获取内容 + +#### 通过包(静态) + +访问注册表数据的最简单方法是直接从包中导入所需的部分: + +```ts +// 通过基础包 +import { ethereum, ethereumAddresses } from "@hyperlane-xyz/registry"; +// 或通过子导出获得更优的包大小(如果您的打包工具支持) +import { metadata, addresses } from "@hyperlane-xyz/registry/chains/ethereum"; +``` + +#### 通过工具(动态) + +如果您需要确保获取最新数据,可以使用 `GithubRegistry` 类动态获取注册表内容。 + +```ts +import { GithubRegistry } from "@hyperlane-xyz/registry"; +const registry = new GithubRegistry(); +const chainMetadata = await registry.getMetadata(); +``` diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/warp-production.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/warp-production.mdx new file mode 100644 index 00000000..5858ef95 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/warp-production.mdx @@ -0,0 +1,5 @@ +# 如何将 Hyperlane Warp Route 部署投入生产 + +为了将你的 Hyperlane warp route 部署投入生产,你必须从你的 warp route 中[移除受信任的中继器 ISM](/guides/remove-trusted-relayer.mdx)。此外,你还需要[转移你的 warp route 的所有权](/guides/transfer-warp-route-ownership.mdx)。完成后,将你的 warp route 添加到[注册表](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/deployments/warp_routes)中,以供审查并纳入网络及其集成。 + +请继续阅读以下指南,将你的 warp route 投入生产。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/your-first-message.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/your-first-message.mdx new file mode 100644 index 00000000..1f750854 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/your-first-message.mdx @@ -0,0 +1,47 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +import SimpleMessagingDiagram from "@site/src/diagrams/messaging-simple.md"; +import AddressTable from "@site/src/components/AddressTable"; +import MessageQuickstart from "@site/src/components/MessageQuickstart"; + +# 发送你的第一个跨链消息 + +本教程演示如何[发送](./reference/messaging/send.mdx)跨链消息到预部署的 `TestRecipient` 合约。 + + + +发送消息只需调用 `Mailbox.dispatch`。确保你在源链上有一个带有资金的账户。 + + + +:::tip +你可以在 [explorer.hyperlane.xyz](https://explorer.hyperlane.xyz/) 上通过搜索你的 `Mailbox.dispatch` 调用的**交易哈希**来查看消息的进度。 +::: + +## 检查结果 + +`TestRecipient` 有以下[处理](./reference/messaging/receive.mdx)实现: + + + + +```solidity file=/node_modules/@hyperlane-xyz/core/contracts/test/TestRecipient.sol#L30-L38 + +``` + + + + + +查看日志以查看你的消息传递! + +
+ 测试网 `TestRecipient` 地址 + +
+ +
+ 测试网 `Mailbox` 地址 + +
diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/partials/core/_prerequisites-config-artifacts.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/partials/core/_prerequisites-config-artifacts.mdx new file mode 100644 index 00000000..b7b39418 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/partials/core/_prerequisites-config-artifacts.mdx @@ -0,0 +1,6 @@ +## 前置条件 + +- 由 `hyperlane core init` 生成的核心配置。 + - 此配置用于部署包括 mailbox 在内的核心合约。默认情况下,它使用 `CURRENT_DIR/configs/core-config.yaml` 作为文件路径。 +- 部署 mailbox 的目标链。 +- 对当前拥有 mailbox 的私钥的访问权限。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-pages/HomepageFeatures.js b/i18n/zh-Hans/docusaurus-plugin-content-pages/HomepageFeatures.js new file mode 100644 index 00000000..b6770717 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-pages/HomepageFeatures.js @@ -0,0 +1,55 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './index.module.css'; + +const FeatureList = [ + { + title: '易于使用', + description: ( + <> + Hyperlane 的设计注重开发者体验,让你能够快速开始构建跨链应用。 + + ), + }, + { + title: '无需许可', + description: ( + <> + 任何人都可以部署 Hyperlane 到任何区块链环境,无需审批,无需中介。 + + ), + }, + { + title: '模块化安全', + description: ( + <> + 通过跨链安全模块(ISM),根据你的应用需求自定义安全模型。 + + ), + }, +]; + +function Feature({title, description}) { + return ( +
+
+

{title}

+

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/i18n/zh-Hans/docusaurus-plugin-content-pages/index.js b/i18n/zh-Hans/docusaurus-plugin-content-pages/index.js new file mode 100644 index 00000000..dd71d306 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-pages/index.js @@ -0,0 +1,40 @@ +import React from 'react'; +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import HomepageFeatures from './HomepageFeatures'; +import styles from './index.module.css'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
+
+

{siteConfig.title}

+

开放的跨链互操作框架

+
+ + 开始使用 Hyperlane + +
+
+
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ +
+
+ ); +} diff --git a/i18n/zh-Hans/docusaurus-plugin-content-pages/index.module.css b/i18n/zh-Hans/docusaurus-plugin-content-pages/index.module.css new file mode 100644 index 00000000..a86d1ab5 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-pages/index.module.css @@ -0,0 +1,31 @@ +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; + gap: 1rem; +} + +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureImage { + height: 200px; + width: 200px; +} diff --git a/i18n/zh-Hans/docusaurus-theme-classic/footer.json b/i18n/zh-Hans/docusaurus-theme-classic/footer.json new file mode 100644 index 00000000..c1e2100a --- /dev/null +++ b/i18n/zh-Hans/docusaurus-theme-classic/footer.json @@ -0,0 +1,34 @@ +{ + "link.title.Docs": { + "message": "文档", + "description": "The title of the footer docs section" + }, + "link.title.Community": { + "message": "社区", + "description": "The title of the footer community section" + }, + "link.title.More": { + "message": "更多", + "description": "The title of the footer more section" + }, + "link.item.label.Tutorial": { + "message": "教程", + "description": "The label of footer link with label=Tutorial linking to /docs/intro" + }, + "link.item.label.Discord": { + "message": "Discord", + "description": "The label of footer link with label=Discord linking to https://discord.gg/hyperlane" + }, + "link.item.label.Twitter": { + "message": "Twitter", + "description": "The label of footer link with label=Twitter linking to https://twitter.com/hyperlane_xyz" + }, + "link.item.label.GitHub": { + "message": "GitHub", + "description": "The label of footer link with label=GitHub linking to https://github.com/hyperlane-xyz" + }, + "copyright": { + "message": "Copyright © 2024 Hyperlane. Built with Docusaurus.", + "description": "The footer copyright" + } +} diff --git a/i18n/zh-Hans/docusaurus-theme-classic/navbar.json b/i18n/zh-Hans/docusaurus-theme-classic/navbar.json new file mode 100644 index 00000000..34f202cd --- /dev/null +++ b/i18n/zh-Hans/docusaurus-theme-classic/navbar.json @@ -0,0 +1,18 @@ +{ + "title": { + "message": "Hyperlane 文档", + "description": "The title in the navbar" + }, + "item.label.Docs": { + "message": "文档", + "description": "Navbar item with label Docs" + }, + "item.label.GitHub": { + "message": "GitHub", + "description": "Navbar item with label GitHub" + }, + "item.label.Discord": { + "message": "Discord", + "description": "Navbar item with label Discord" + } +} diff --git a/i18n/zh-Hans/technical-glossary.md b/i18n/zh-Hans/technical-glossary.md new file mode 100644 index 00000000..163b5380 --- /dev/null +++ b/i18n/zh-Hans/technical-glossary.md @@ -0,0 +1,74 @@ +# Hyperlane V3 技术术语对照表 + +本文档用于维护 Hyperlane V3 文档翻译中使用的技术术语的标准中文翻译,以确保整个文档的翻译保持一致性。 + +## 核心概念 + +| 英文 | 中文 | 说明 | +|------|------|------| +| Agent | 代理 | Hyperlane 系统中的核心组件 | +| Validator | 验证者 | 验证跨链消息的代理 | +| Relayer | 中继者 | 在链间传递消息的代理 | +| Mailbox | 邮箱 | 处理跨链消息的智能合约 | +| Message | 消息 | 跨链传递的数据包 | +| Checkpoint | 检查点 | 验证者签名的消息状态 | +| Domain | 域 | 区块链网络的标识符 | + +## 配置相关 + +| 英文 | 中文 | 说明 | +|------|------|------| +| Configuration | 配置 | | +| Environment Variable | 环境变量 | | +| Argument | 参数 | 命令行参数 | +| Chain | 链 | 区块链网络 | +| Gas | 气体 | 交易费用单位 | +| Signer | 签名者 | 进行交易签名的实体 | +| Whitelist | 白名单 | 允许列表 | +| Blacklist | 黑名单 | 禁止列表 | + +## 技术术语 + +| 英文 | 中文 | 说明 | +|------|------|------| +| Smart Contract | 智能合约 | | +| Transaction | 交易 | | +| Block | 区块 | | +| Hash | 哈希 | | +| Key | 密钥 | | +| RPC | RPC | 远程过程调用(保留英文缩写) | +| API | API | 应用程序接口(保留英文缩写) | +| URL | URL | 统一资源定位符(保留英文缩写) | + +## 开发相关 + +| 英文 | 中文 | 说明 | +|------|------|------| +| Deploy | 部署 | | +| Debug | 调试 | | +| Test | 测试 | | +| Build | 构建 | | +| Compile | 编译 | | +| Interface | 接口 | | +| Implementation | 实现 | | + +## 工具和服务 + +| 英文 | 中文 | 说明 | +|------|------|------| +| Docker | Docker | 保留英文 | +| AWS | AWS | 保留英文 | +| S3 | S3 | 保留英文 | +| CLI | CLI | 命令行界面(保留英文缩写) | + +## 注意事项 + +1. 专有名词和品牌名称保持英文原文 +2. 常用技术缩写保持英文 +3. 中文术语选择尽量符合业内通用翻译 +4. 在文档中首次出现专业术语时可以附注英文原文 +5. 代码相关的命令、参数、配置项保持英文原文 + +## 更新记录 + +- 2024-01-17: 初始版本创建,包含核心概念和基础术语 diff --git a/package.json b/package.json index f7c64d5a..aa01243a 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,9 @@ "clear": "docusaurus clear", "serve": "docusaurus serve", "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids" + "write-heading-ids": "docusaurus write-heading-ids", + "start:zh": "docusaurus start --locale zh-Hans", + "build:zh": "docusaurus build --locale zh-Hans" }, "dependencies": { "@docusaurus/core": "3.0.1", From 0a216f1f559da25550afc1bf098f44d1911eb37f Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 10:12:09 +0800 Subject: [PATCH 02/20] feat: add Vercel deployment configuration - Add vercel.json for deployment settings - Update docusaurus.config.js for Vercel compatibility - Add .npmrc for dependency management --- .npmrc | 3 + docusaurus.config.js | 18 +- package.json | 14 +- vercel.json | 21 + yarn.lock | 5390 ++++++++++++++++++++++++++++++++++++------ 5 files changed, 4642 insertions(+), 804 deletions(-) create mode 100644 .npmrc create mode 100644 vercel.json diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..1759ff91 --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +legacy-peer-deps=true +node-linker=hoisted +public-hoist-pattern[]=* diff --git a/docusaurus.config.js b/docusaurus.config.js index f6699920..6695f27e 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -16,17 +16,15 @@ const config = { favicon: "img/favicon.ico", // Set the production url of your site here - url: "https://docs.hyperlane.xyz", + url: "https://hyp-v3-docs.vercel.app", // Set the // pathname under which your site is served - // For GitHub pages deployment, it is often '//' baseUrl: "/", // GitHub pages deployment config. - // If you aren't using GitHub pages, you don't need these. - organizationName: "hyperlane-xyz", // Usually your GitHub org/user name. - projectName: "hyperlane-monorepo", // Usually your repo name. + organizationName: "polibee", // Usually your GitHub org/user name. + projectName: "v3-docs", // Usually your repo name. - onBrokenLinks: "throw", + onBrokenLinks: "warn", onBrokenMarkdownLinks: "warn", // Even if you don't use internalization, you can use this field to set useful @@ -381,7 +379,7 @@ const config = { ], rehypePlugins: [[rehypeKatex, { strict: false }]], sidebarPath: require.resolve("./sidebars.js"), - editUrl: "https://github.com/hyperlane-xyz/v3-docs/tree/main/", + editUrl: "https://github.com/polibee/v3-docs/tree/main/", }, theme: { customCss: require.resolve("./src/css/custom.css"), @@ -449,7 +447,7 @@ const config = { label: "⚙️ Agent Operators", }, { - href: "https://github.com/hyperlane-xyz", + href: "https://github.com/polibee", label: "GitHub", position: "right", }, @@ -479,7 +477,7 @@ const config = { }, { label: "GitHub", - href: "https://github.com/hyperlane-xyz", + href: "https://github.com/polibee", }, ], }, @@ -501,7 +499,7 @@ const config = { items: [ { label: "Bounties", - to: "https://github.com/search?q=org%3Ahyperlane-xyz+label%3Abounty+is%3Aopen+is%3Aissue&type=issues&s=&o=desc", + to: "https://github.com/search?q=org%3Apolibee+label%3Abounty+is%3Aopen+is%3Aissue&type=issues&s=&o=desc", }, { label: "Careers", diff --git a/package.json b/package.json index aa01243a..7d492a55 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,10 @@ "build:zh": "docusaurus build --locale zh-Hans" }, "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/plugin-client-redirects": "3.0.1", - "@docusaurus/preset-classic": "3.0.1", - "@docusaurus/theme-mermaid": "3.0.1", + "@docusaurus/core": "^3.6.3", + "@docusaurus/plugin-client-redirects": "^3.6.3", + "@docusaurus/preset-classic": "^3.6.3", + "@docusaurus/theme-mermaid": "^3.6.3", "@easyops-cn/docusaurus-search-local": "^0.37.4", "@hyperlane-xyz/core": "5.8.1", "@hyperlane-xyz/registry": "6.1.0", @@ -35,9 +35,9 @@ "remark-math": "6" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.0.1", - "@docusaurus/tsconfig": "3.0.1", - "@docusaurus/types": "3.0.1", + "@docusaurus/module-type-aliases": "^3.6.3", + "@docusaurus/tsconfig": "^3.6.3", + "@docusaurus/types": "^3.6.3", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", "remark-code-import": "^1.2.0", diff --git a/vercel.json b/vercel.json new file mode 100644 index 00000000..87e1e2af --- /dev/null +++ b/vercel.json @@ -0,0 +1,21 @@ +{ + "buildCommand": "yarn build", + "outputDirectory": "build", + "framework": "docusaurus-2", + "installCommand": "yarn install", + "builds": [ + { + "src": "package.json", + "use": "@vercel/node" + } + ], + "routes": [ + { + "src": "/(.*)", + "dest": "/" + } + ], + "env": { + "NODE_OPTIONS": "--max_old_space_size=4096" + } +} diff --git a/yarn.lock b/yarn.lock index 34671019..c01a2ffc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -204,6 +204,23 @@ __metadata: languageName: node linkType: hard +"@antfu/install-pkg@npm:^0.4.0": + version: 0.4.1 + resolution: "@antfu/install-pkg@npm:0.4.1" + dependencies: + package-manager-detector: "npm:^0.2.0" + tinyexec: "npm:^0.3.0" + checksum: af47a84e77f3f69077ec464e0a9e82791666693380fc8ed9867f388f5c0cd8421e2642b9deefc7d4adb7b8cfb9dd1a715b25f9a974d023b10779cad0885439ef + languageName: node + linkType: hard + +"@antfu/utils@npm:^0.7.10": + version: 0.7.10 + resolution: "@antfu/utils@npm:0.7.10" + checksum: 98991f66a4752ef097280b4235b27d961a13a2c67ef8e5b716a120eb9823958e20566516711204e2bfb08f0b935814b715f49ecd79c3b9b93ce32747ac297752 + languageName: node + linkType: hard + "@arbitrum/nitro-contracts@npm:^1.2.1": version: 1.3.0 resolution: "@arbitrum/nitro-contracts@npm:1.3.0" @@ -926,13 +943,14 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/code-frame@npm:7.23.5" +"@babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" dependencies: - "@babel/highlight": "npm:^7.23.4" - chalk: "npm:^2.4.2" - checksum: a10e843595ddd9f97faa99917414813c06214f4d9205294013e20c70fbdf4f943760da37dec1d998bf3e6fc20fa2918a47c0e987a7e458663feb7698063ad7c6 + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 languageName: node linkType: hard @@ -943,10 +961,10 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/compat-data@npm:7.23.5" - checksum: 081278ed46131a890ad566a59c61600a5f9557bd8ee5e535890c8548192532ea92590742fd74bd9db83d74c669ef8a04a7e1c85cdea27f960233e3b83c3a957c +"@babel/compat-data@npm:^7.25.9, @babel/compat-data@npm:^7.26.0": + version: 7.26.2 + resolution: "@babel/compat-data@npm:7.26.2" + checksum: c9b5f3724828d17f728a778f9d66c19b55c018d0d76de6d731178cca64f182c22b71400a73bf2b65dcc4fcfe52b630088a94d5902911b54206aa90e3ffe07d12 languageName: node linkType: hard @@ -973,26 +991,26 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.23.3": - version: 7.23.7 - resolution: "@babel/core@npm:7.23.7" +"@babel/core@npm:^7.21.3, @babel/core@npm:^7.25.9": + version: 7.26.0 + resolution: "@babel/core@npm:7.26.0" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.23.5" - "@babel/generator": "npm:^7.23.6" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.23.7" - "@babel/parser": "npm:^7.23.6" - "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.7" - "@babel/types": "npm:^7.23.6" + "@babel/code-frame": "npm:^7.26.0" + "@babel/generator": "npm:^7.26.0" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.0" + "@babel/parser": "npm:^7.26.0" + "@babel/template": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 38c9934973d384ed83369712978453eac91dc3f22167404dbdb272b64f602e74728a6f37012c53ee57e521b8ae2da60097f050497d9b6a212d28b59cdfb2cd1d + checksum: 91de73a7ff5c4049fbc747930aa039300e4d2670c2a91f5aa622f1b4868600fc89b01b6278385fbcd46f9574186fa3d9b376a9e7538e50f8d118ec13cfbcb63e languageName: node linkType: hard @@ -1019,15 +1037,16 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/generator@npm:7.23.6" +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0": + version: 7.26.2 + resolution: "@babel/generator@npm:7.26.2" dependencies: - "@babel/types": "npm:^7.23.6" - "@jridgewell/gen-mapping": "npm:^0.3.2" - "@jridgewell/trace-mapping": "npm:^0.3.17" - jsesc: "npm:^2.5.1" - checksum: 53540e905cd10db05d9aee0a5304e36927f455ce66f95d1253bb8a179f286b88fa7062ea0db354c566fe27f8bb96567566084ffd259f8feaae1de5eccc8afbda + "@babel/parser": "npm:^7.26.2" + "@babel/types": "npm:^7.26.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 167ebce8977142f5012fad6bd91da51ac52bcd752f2261a54b7ab605d928aebe57e21636cdd2a9c7757e552652c68d9fcb5d40b06fcb66e02d9ee7526e118a5c languageName: node linkType: hard @@ -1049,6 +1068,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" + dependencies: + "@babel/types": "npm:^7.25.9" + checksum: 095b6ba50489d797733abebc4596a81918316a99e3632755c9f02508882912b00c2ae5e468532a25a5c2108d109ddbe9b7da78333ee7cc13817fc50c00cf06fe + languageName: node + linkType: hard + "@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" @@ -1058,6 +1086,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: a6068bb813e7f72d12b72edeecb99167f60cd7964cacedfb60e01fff5e7bed4a5a7f4f7414de7cf352a1b71487df5f8dab8c2b5230de4ad5aea16adf32e14219 + languageName: node + linkType: hard + "@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6": version: 7.22.15 resolution: "@babel/helper-compilation-targets@npm:7.22.15" @@ -1071,16 +1109,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" +"@babel/helper-compilation-targets@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-compilation-targets@npm:7.25.9" dependencies: - "@babel/compat-data": "npm:^7.23.5" - "@babel/helper-validator-option": "npm:^7.23.5" - browserslist: "npm:^4.22.2" + "@babel/compat-data": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: ba38506d11185f48b79abf439462ece271d3eead1673dd8814519c8c903c708523428806f05f2ec5efd0c56e4e278698fac967e5a4b5ee842c32415da54bc6fa + checksum: a6b26a1e4222e69ef8e62ee19374308f060b007828bc11c65025ecc9e814aba21ff2175d6d3f8bf53c863edd728ee8f94ba7870f8f90a37d39552ad9933a8aaa languageName: node linkType: hard @@ -1120,6 +1158,23 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-create-class-features-plugin@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-member-expression-to-functions": "npm:^7.25.9" + "@babel/helper-optimise-call-expression": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: b2bdd39f38056a76b9ba00ec5b209dd84f5c5ebd998d0f4033cf0e73d5f2c357fbb49d1ce52db77a2709fb29ee22321f84a5734dc9914849bdfee9ad12ce8caf + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.18.6" @@ -1145,6 +1200,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-regexp-features-plugin@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + regexpu-core: "npm:^6.1.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 3adc60a758febbf07d65a15eaccab1f7b9fcc55e7141e59122f13c9f81fc0d1cce4525b7f4af50285d27c93b34c859fd2c39c39820c5fb92211898c3bbdc77ef + languageName: node + linkType: hard + "@babel/helper-define-polyfill-provider@npm:^0.4.3": version: 0.4.3 resolution: "@babel/helper-define-polyfill-provider@npm:0.4.3" @@ -1160,6 +1228,21 @@ __metadata: languageName: node linkType: hard +"@babel/helper-define-polyfill-provider@npm:^0.6.2, @babel/helper-define-polyfill-provider@npm:^0.6.3": + version: 0.6.3 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.3" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.22.6" + "@babel/helper-plugin-utils": "npm:^7.22.5" + debug: "npm:^4.1.1" + lodash.debounce: "npm:^4.0.8" + resolve: "npm:^1.14.2" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 4320e3527645e98b6a0d5626fef815680e3b2b03ec36045de5e909b0f01546ab3674e96f50bf3bc8413f8c9037e5ee1a5f560ebdf8210426dad1c2c03c96184a + languageName: node + linkType: hard + "@babel/helper-environment-visitor@npm:^7.18.9": version: 7.18.9 resolution: "@babel/helper-environment-visitor@npm:7.18.9" @@ -1230,6 +1313,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-member-expression-to-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: e08c7616f111e1fb56f398365e78858e26e466d4ac46dff25921adc5ccae9b232f66e952a2f4162bbe336627ba336c7fd9eca4835b6548935973d3380d77eaff + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-module-imports@npm:7.18.6" @@ -1248,6 +1341,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.23.3": version: 7.23.3 resolution: "@babel/helper-module-transforms@npm:7.23.3" @@ -1263,6 +1366,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-optimise-call-expression@npm:7.18.6" @@ -1281,6 +1397,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-optimise-call-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" + dependencies: + "@babel/types": "npm:^7.25.9" + checksum: 90203e6607edeadd2a154940803fd616c0ed92c1013d6774c4b8eb491f1a5a3448b68faae6268141caa5c456e55e3ee49a4ed2bd7ddaf2365daea321c435914c + languageName: node + linkType: hard + "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.18.9 resolution: "@babel/helper-plugin-utils@npm:7.18.9" @@ -1295,6 +1420,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-plugin-utils@npm:7.25.9" + checksum: 483066a1ba36ff16c0116cd24f93de05de746a603a777cd695ac7a1b034928a65a4ecb35f255761ca56626435d7abdb73219eba196f9aa83b6c3c3169325599d + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" @@ -1308,6 +1440,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-remap-async-to-generator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-wrap-function": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 6798b562f2788210980f29c5ee96056d90dc73458c88af5bd32f9c82e28e01975588aa2a57bb866c35556bd9b76bac937e824ee63ba472b6430224b91b4879e9 + languageName: node + linkType: hard + "@babel/helper-replace-supers@npm:^7.18.9": version: 7.18.9 resolution: "@babel/helper-replace-supers@npm:7.18.9" @@ -1334,6 +1479,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-replace-supers@npm:7.25.9" + dependencies: + "@babel/helper-member-expression-to-functions": "npm:^7.25.9" + "@babel/helper-optimise-call-expression": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 0b40d7d2925bd3ba4223b3519e2e4d2456d471ad69aa458f1c1d1783c80b522c61f8237d3a52afc9e47c7174129bbba650df06393a6787d5722f2ec7f223c3f4 + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-simple-access@npm:7.22.5" @@ -1343,6 +1501,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-simple-access@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-simple-access@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 3f1bcdb88ee3883ccf86959869a867f6bbf8c4737cd44fb9f799c38e54f67474590bc66802500ae9fe18161792875b2cfb7ec15673f48ed6c8663f6d09686ca8 + languageName: node + linkType: hard + "@babel/helper-skip-transparent-expression-wrappers@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.22.5" @@ -1352,6 +1520,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 09ace0c6156961624ac9524329ce7f45350bab94bbe24335cbe0da7dfaa1448e658771831983cb83fe91cf6635b15d0a3cab57c03b92657480bfb49fb56dd184 + languageName: node + linkType: hard + "@babel/helper-split-export-declaration@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-split-export-declaration@npm:7.18.6" @@ -1377,10 +1555,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: f348d5637ad70b6b54b026d6544bd9040f78d24e7ec245a0fc42293968181f6ae9879c22d89744730d246ce8ec53588f716f102addd4df8bbc79b73ea10004ac +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 languageName: node linkType: hard @@ -1398,6 +1576,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-validator-option@npm:7.18.6" @@ -1412,10 +1597,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e languageName: node linkType: hard @@ -1430,6 +1615,17 @@ __metadata: languageName: node linkType: hard +"@babel/helper-wrap-function@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-wrap-function@npm:7.25.9" + dependencies: + "@babel/template": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: b6627d83291e7b80df020f8ee2890c52b8d49272962cac0114ef90f189889c90f1027985873d1b5261a4e986e109b2754292dc112392f0b1fcbfc91cc08bd003 + languageName: node + linkType: hard + "@babel/helpers@npm:^7.23.2": version: 7.23.2 resolution: "@babel/helpers@npm:7.23.2" @@ -1441,14 +1637,13 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.7": - version: 7.23.8 - resolution: "@babel/helpers@npm:7.23.8" +"@babel/helpers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helpers@npm:7.26.0" dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.7" - "@babel/types": "npm:^7.23.6" - checksum: d9fce49278a31aaa017a40c1fcdaa450999c49e33582cce8138058c58b1acbe3a2d2488f010f28e91dedf0d35795ea32f0ee18745bbb6c7f54052ae0fd7e6a3f + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" + checksum: 343333cced6946fe46617690a1d0789346960910225ce359021a88a60a65bc0d791f0c5d240c0ed46cf8cc63b5fd7df52734ff14e43b9c32feae2b61b1647097 languageName: node linkType: hard @@ -1474,17 +1669,6 @@ __metadata: languageName: node linkType: hard -"@babel/highlight@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/highlight@npm:7.23.4" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.22.20" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - checksum: fbff9fcb2f5539289c3c097d130e852afd10d89a3a08ac0b5ebebbc055cc84a4bcc3dcfed463d488cde12dd0902ef1858279e31d7349b2e8cee43913744bda33 - languageName: node - linkType: hard - "@babel/parser@npm:^7.18.6, @babel/parser@npm:^7.18.9": version: 7.18.9 resolution: "@babel/parser@npm:7.18.9" @@ -1503,12 +1687,37 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/parser@npm:7.23.6" +"@babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" + dependencies: + "@babel/types": "npm:^7.26.0" bin: parser: ./bin/babel-parser.js - checksum: 6f76cd5ccae1fa9bcab3525b0865c6222e9c1d22f87abc69f28c5c7b2c8816a13361f5bd06bddbd5faf903f7320a8feba02545c981468acec45d12a03db7755e + checksum: 751a743087b3a9172a7599f1421830d44c38f065ef781588d2bfb1c98f9b461719a226feb13c868d7a284783eee120c88ea522593118f2668f46ebfb1105c4d7 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 7aab47fcbb8c1ddc195a3cd66609edcad54c5022f018db7de40185f0182950389690e953e952f117a1737b72f665ff02ad30de6c02b49b97f1d8f4ccdffedc34 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 3a652b3574ca62775c5f101f8457950edc540c3581226579125da535d67765f41ad7f0e6327f8efeb2540a5dad5bb0c60a89fb934af3f67472e73fb63612d004 languageName: node linkType: hard @@ -1523,6 +1732,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 18fc9004104a150f9f5da9f3307f361bc3104d16778bb593b7523d5110f04a8df19a2587e6bdd5e726fb1d397191add45223f4f731bb556c33f14f2779d596e8 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" @@ -1536,6 +1756,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 3f6c8781a2f7aa1791a31d2242399ca884df2ab944f90c020b6f112fb19f05fa6dad5be143d274dad1377e40415b63d24d5489faf5060b9c4a99e55d8f0c317c + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.3" @@ -1548,6 +1781,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 02b365f0cc4df8b8b811c68697c93476da387841e5f153fe42766f34241b685503ea51110d5ed6df7132759820b93e48d9fa3743cffc091eed97c19f7e5fe272 + languageName: node + linkType: hard + "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": version: 7.21.0-placeholder-for-preset-env.2 resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" @@ -1623,6 +1868,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-assertions@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 525b174e60b210d96c1744c1575fc2ddedcc43a479cba64a5344cf77bd0541754fc58120b5a11ff832ba098437bb05aa80900d1f49bb3d888c5e349a4a3a356e + languageName: node + linkType: hard + "@babel/plugin-syntax-import-attributes@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" @@ -1634,6 +1890,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-attributes@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e594c185b12bfe0bbe7ca78dfeebe870e6d569a12128cac86f3164a075fe0ff70e25ddbd97fd0782906b91f65560c9dc6957716b7b4a68aba2516c9b7455e352 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-meta@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" @@ -1678,6 +1945,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-jsx@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c + languageName: node + linkType: hard + "@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" @@ -1788,6 +2066,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-typescript@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 5192ebe11bd46aea68b7a60fd9555465c59af7e279e71126788e59121b86e00b505816685ab4782abe159232b0f73854e804b54449820b0d950b397ee158caa2 + languageName: node + linkType: hard + "@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" @@ -1811,6 +2100,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-arrow-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 851fef9f58be60a80f46cc0ce1e46a6f7346a6f9d50fa9e0fa79d46ec205320069d0cc157db213e2bea88ef5b7d9bd7618bb83f0b1996a836e2426c3a3a1f622 + languageName: node + linkType: hard + "@babel/plugin-transform-async-generator-functions@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.3" @@ -1825,6 +2125,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-generator-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-remap-async-to-generator": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e3fcb9fc3d6ab6cbd4fcd956b48c17b5e92fe177553df266ffcd2b2c1f2f758b893e51b638e77ed867941e0436487d2b8b505908d615c41799241699b520dec6 + languageName: node + linkType: hard + "@babel/plugin-transform-async-to-generator@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" @@ -1838,6 +2151,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-to-generator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-remap-async-to-generator": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c443d9e462ddef733ae56360064f32fc800105803d892e4ff32d7d6a6922b3765fa97b9ddc9f7f1d3f9d8c2d95721d85bef9dbf507804214c6cf6466b105c168 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" @@ -1849,6 +2175,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoped-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e92ba0e3d72c038513844d8fca1cc8437dcb35cd42778e97fd03cb8303380b201468611e7ecfdcae3de33473b2679fe2de1552c5f925d112c5693425cf851f10 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoping@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-block-scoping@npm:7.23.3" @@ -1860,6 +2197,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoping@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-block-scoping@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a76e30becb6c75b4d87a2cd53556fddb7c88ddd56bfadb965287fd944810ac159aa8eb5705366fc37336041f63154ed9fab3862fb10482a45bf5ede63fd55fda + languageName: node + linkType: hard + "@babel/plugin-transform-class-properties@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" @@ -1872,6 +2220,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f0603b6bd34d8ba62c03fc0572cb8bbc75874d097ac20cc7c5379e001081210a84dba1749e7123fca43b978382f605bb9973c99caf2c5b4c492d5c0a4a441150 + languageName: node + linkType: hard + "@babel/plugin-transform-class-static-block@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-class-static-block@npm:7.23.3" @@ -1885,6 +2245,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-static-block@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.12.0 + checksum: cdcf5545ae6514ed75fbd73cccfa209c6a5dfdf0c2bb7bb62c0fb4ec334a32281bcf1bc16ace494d9dbe93feb8bdc0bd3cf9d9ccb6316e634a67056fa13b741b + languageName: node + linkType: hard + "@babel/plugin-transform-classes@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-classes@npm:7.23.3" @@ -1904,6 +2276,22 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-classes@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-classes@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + globals: "npm:^11.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 02742ea7cd25be286c982e672619effca528d7a931626a6f3d6cea11852951b7ee973276127eaf6418ac0e18c4d749a16b520709c707e86a67012bd23ff2927d + languageName: node + linkType: hard + "@babel/plugin-transform-computed-properties@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" @@ -1916,6 +2304,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-computed-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 948c0ae3ce0ba2375241d122a9bc7cda4a7ac8110bd8a62cd804bc46a5fdb7a7a42c7799c4cd972e14e0a579d2bd0999b92e53177b73f240bb0d4b09972c758b + languageName: node + linkType: hard + "@babel/plugin-transform-destructuring@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" @@ -1927,6 +2327,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-destructuring@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7beec5fda665d108f69d5023aa7c298a1e566b973dd41290faa18aeea70f6f571295c1ece0a058f3ceb6c6c96de76de7cd34f5a227fbf09a1b8d8a735d28ca49 + languageName: node + linkType: hard + "@babel/plugin-transform-dotall-regex@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" @@ -1939,6 +2350,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dotall-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7c3471ae5cf7521fd8da5b03e137e8d3733fc5ee4524ce01fb0c812f0bb77cb2c9657bc8a6253186be3a15bb4caa8974993c7ddc067f554ecc6a026f0a3b5e12 + languageName: node + linkType: hard + "@babel/plugin-transform-duplicate-keys@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" @@ -1950,6 +2373,29 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-keys@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d0c74894b9bf6ff2a04189afffb9cd43d87ebd7b7943e51a827c92d2aaa40fa89ac81565a2fd6fbeabf9e38413a9264c45862eee2b017f1d49046cc3c8ff06b4 + languageName: node + linkType: hard + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: a8039a6d2b90e011c7b30975edee47b5b1097cf3c2f95ec1f5ddd029898d783a995f55f7d6eb8d6bb8873c060fb64f9f1ccba938dfe22d118d09cf68e0cd3bf6 + languageName: node + linkType: hard + "@babel/plugin-transform-dynamic-import@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.3" @@ -1962,6 +2408,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dynamic-import@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 5e643a8209072b668350f5788f23c64e9124f81f958b595c80fecca6561086d8ef346c04391b9e5e4cad8b8cbe22c258f0cd5f4ea89b97e74438e7d1abfd98cf + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" @@ -1974,6 +2431,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-exponentiation-operator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.25.9" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3b42f65bab3fee28c385115ce6bcb6ba544dff187012df408a432c9fb44c980afd898911020c723dc1c9257aaf3d7d0131ad83ba15102bf30ad9a86fc2a8a912 + languageName: node + linkType: hard + "@babel/plugin-transform-export-namespace-from@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.3" @@ -1986,17 +2455,40 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-for-of@npm:7.23.3" +"@babel/plugin-transform-export-namespace-from@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f291ea2ec5f36de9028a00cbd5b32f08af281b8183bf047200ff001f4cb260be56f156b2449f42149448a4a033bd6e86a3a7f06d0c2825532eb0ae6b03058dfb + languageName: node + linkType: hard + +"@babel/plugin-transform-for-of@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-for-of@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 checksum: 8a36202cfee312ba80e509c7c2131e6773524e572b4dc64a8ee95bd912634fdeb5ea91c6c7747ee30e03562d0f0d333f88ed7dbb929b36b60b8d74189189e12f languageName: node linkType: hard +"@babel/plugin-transform-for-of@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-for-of@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bf11abc71934a1f369f39cd7a33cf3d4dc5673026a53f70b7c1238c4fcc44e68b3ca1bdbe3db2076f60defb6ffe117cbe10b90f3e1a613b551d88f7c4e693bbe + languageName: node + linkType: hard + "@babel/plugin-transform-function-name@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-function-name@npm:7.23.3" @@ -2010,6 +2502,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-function-name@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-function-name@npm:7.25.9" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8e67fbd1dd367927b8b6afdf0a6e7cb3a3fd70766c52f700ca77428b6d536f6c9d7ec643e7762d64b23093233765c66bffa40e31aabe6492682879bcb45423e1 + languageName: node + linkType: hard + "@babel/plugin-transform-json-strings@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-json-strings@npm:7.23.3" @@ -2022,6 +2527,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-json-strings@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 00bc2d4751dfc9d44ab725be16ee534de13cfd7e77dfb386e5dac9e48101ce8fcbc5971df919dc25b3f8a0fa85d6dc5f2a0c3cf7ec9d61c163d9823c091844f0 + languageName: node + linkType: hard + "@babel/plugin-transform-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-literals@npm:7.23.3" @@ -2033,6 +2549,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 00b14e9c14cf1e871c1f3781bf6334cac339c360404afd6aba63d2f6aca9270854d59a2b40abff1c4c90d4ffdca614440842d3043316c2f0ceb155fdf7726b3b + languageName: node + linkType: hard + "@babel/plugin-transform-logical-assignment-operators@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.3" @@ -2045,6 +2572,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6e2051e10b2d6452980fc4bdef9da17c0d6ca48f81b8529e8804b031950e4fff7c74a7eb3de4a2b6ad22ffb631d0b67005425d232cce6e2b29ce861c78ed04f5 + languageName: node + linkType: hard + "@babel/plugin-transform-member-expression-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" @@ -2056,6 +2594,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-member-expression-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 91d17b451bcc5ea9f1c6f8264144057ade3338d4b92c0b248366e4db3a7790a28fd59cc56ac433a9627a9087a17a5684e53f4995dd6ae92831cb72f1bd540b54 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-amd@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" @@ -2068,6 +2617,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-amd@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 849957d9484d0a2d93331226ed6cf840cee7d57454549534c447c93f8b839ef8553eae9877f8f550e3c39f14d60992f91244b2e8e7502a46064b56c5d68ba855 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-commonjs@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" @@ -2081,6 +2642,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-commonjs@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-simple-access": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6ce771fb04d4810257fc8900374fece877dacaed74b05eaa16ad9224b390f43795c4d046cbe9ae304e1eb5aad035d37383895e3c64496d647c2128d183916e74 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-systemjs@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.3" @@ -2095,6 +2669,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-systemjs@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8299e3437542129c2684b86f98408c690df27db4122a79edded4782cf04e755d6ecb05b1e812c81a34224a81e664303392d5f3c36f3d2d51fdc99bb91c881e9a + languageName: node + linkType: hard + "@babel/plugin-transform-modules-umd@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" @@ -2107,6 +2695,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-umd@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fa11a621f023e2ac437b71d5582f819e667c94306f022583d77da9a8f772c4128861a32bbb63bef5cba581a70cd7dbe87a37238edaafcfacf889470c395e7076 + languageName: node + linkType: hard + "@babel/plugin-transform-named-capturing-groups-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.22.5" @@ -2119,6 +2719,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 32b14fda5c885d1706863f8af2ee6c703d39264355b57482d3a24fce7f6afbd4c7a0896e501c0806ed2b0759beb621bf7f3f7de1fbbc82026039a98d961e78ef + languageName: node + linkType: hard + "@babel/plugin-transform-new-target@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-new-target@npm:7.23.3" @@ -2130,6 +2742,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-new-target@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-new-target@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7b5f1b7998f1cf183a7fa646346e2f3742e5805b609f28ad5fee22d666a15010f3e398b7e1ab78cddb7901841a3d3f47135929af23d54e8bf4ce69b72051f71e + languageName: node + linkType: hard + "@babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.3" @@ -2142,6 +2765,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: eb623db5be078a1c974afe7c7797b0309ba2ea9e9237c0b6831ade0f56d8248bb4ab3432ab34495ff8c877ec2fe412ff779d1e9b3c2b8139da18e1753d950bc3 + languageName: node + linkType: hard + "@babel/plugin-transform-numeric-separator@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.3" @@ -2154,6 +2788,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-numeric-separator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ad63ad341977844b6f9535fcca15ca0d6d6ad112ed9cc509d4f6b75e9bf4b1b1a96a0bcb1986421a601505d34025373608b5f76d420d924b4e21f86b1a1f2749 + languageName: node + linkType: hard + "@babel/plugin-transform-object-rest-spread@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-object-rest-spread@npm:7.23.3" @@ -2169,6 +2814,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-rest-spread@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/plugin-transform-parameters": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 02077d8abd83bf6a48ff0b59e98d7561407cf75b591cffd3fdc5dc5e9a13dec1c847a7a690983762a3afecddb244831e897e0515c293e7c653b262c30cd614af + languageName: node + linkType: hard + "@babel/plugin-transform-object-super@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-object-super@npm:7.23.3" @@ -2181,6 +2839,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-super@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-object-super@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0348d00e76f1f15ada44481a76e8c923d24cba91f6e49ee9b30d6861eb75344e7f84d62a18df8a6f9e9a7eacf992f388174b7f9cc4ce48287bcefca268c07600 + languageName: node + linkType: hard + "@babel/plugin-transform-optional-catch-binding@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.3" @@ -2193,6 +2863,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-catch-binding@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 722fd5ee12ab905309d4e84421584fce4b6d9e6b639b06afb20b23fa809e6ab251e908a8d5e8b14d066a28186b8ef8f58d69fd6eca9ce1b9ef7af08333378f6c + languageName: node + linkType: hard + "@babel/plugin-transform-optional-chaining@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.3" @@ -2206,6 +2887,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-chaining@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 041ad2beae5affb8e68a0bcb6882a2dadb758db3c629a0e012f57488ab43a822ac1ea17a29db8ef36560a28262a5dfa4dbbbf06ed6e431db55abe024b7cd3961 + languageName: node + linkType: hard + "@babel/plugin-transform-parameters@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-parameters@npm:7.23.3" @@ -2217,6 +2910,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-parameters@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-parameters@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: aecb446754b9e09d6b6fa95fd09e7cf682f8aaeed1d972874ba24c0a30a7e803ad5f014bb1fffc7bfeed22f93c0d200947407894ea59bf7687816f2f464f8df3 + languageName: node + linkType: hard + "@babel/plugin-transform-private-methods@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" @@ -2229,6 +2933,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-methods@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 64bd71de93d39daefa3e6c878d6f2fd238ed7d4ecfb13b0e771ddbbc131487def3ceb405b62b534a5cbb5043046b504e1b189b0a45229cc75af979a9fbcaa7bd + languageName: node + linkType: hard + "@babel/plugin-transform-private-property-in-object@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.3" @@ -2243,6 +2959,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-property-in-object@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d4965de19d9f204e692cc74dbc39f0bb469e5f29df96dd4457ea23c5e5596fba9d5af76eaa96f9d48a9fc20ec5f12a94c679285e36b8373406868ea228109e27 + languageName: node + linkType: hard + "@babel/plugin-transform-property-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" @@ -2254,6 +2983,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-property-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1639e35b2438ccf3107af760d34e6a8e4f9acdd3ae6186ae771a6e3029bd59dfe778e502d67090f1185ecda5c16addfed77561e39c518a3f51ff10d41790e106 + languageName: node + linkType: hard + "@babel/plugin-transform-react-constant-elements@npm:^7.18.12": version: 7.23.3 resolution: "@babel/plugin-transform-react-constant-elements@npm:7.23.3" @@ -2265,6 +3005,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-constant-elements@npm:^7.21.3": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-constant-elements@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 50aca3df122cf801abd251cc2507ef3011ead8f047d31d8f35b10627dd722f6a165245b09e81b3c6876515fd266a97aed0052f6b409aa1fe961fb36dd7cc0822 + languageName: node + linkType: hard + "@babel/plugin-transform-react-display-name@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-react-display-name@npm:7.18.6" @@ -2287,6 +3038,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-display-name@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-display-name@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 63a0f962d64e71baf87c212755419e25c637d2d95ea6fdc067df26b91e606ae186442ae815b99a577eca9bf5404d9577ecad218a3cf42d0e9e286ca7b003a992 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-development@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-react-jsx-development@npm:7.18.6" @@ -2309,6 +3071,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx-development@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.25.9" + dependencies: + "@babel/plugin-transform-react-jsx": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c0b92ff9eb029620abf320ff74aae182cea87524723d740fb48a4373d0d16bddf5edbe1116e7ba341332a5337e55c2ceaee8b8cad5549e78af7f4b3cfe77debb + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-react-jsx@npm:7.18.6" @@ -2339,6 +3112,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/plugin-syntax-jsx": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 5c9947e8ed141f7606f54da3e05eea1074950c5b8354c39df69cb7f43cb5a83c6c9d7973b24bc3d89341c8611f8ad50830a98ab10d117d850e6bdd8febdce221 + languageName: node + linkType: hard + "@babel/plugin-transform-react-pure-annotations@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.18.6" @@ -2363,6 +3151,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-pure-annotations@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7c8eac04644ad19dcd71bb8e949b0ae22b9e548fa4a58e545d3d0342f647fb89db7f8789a7c5b8074d478ce6d3d581eaf47dd4b36027e16fd68211c383839abc + languageName: node + linkType: hard + "@babel/plugin-transform-regenerator@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" @@ -2375,6 +3175,30 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regenerator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-regenerator@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + regenerator-transform: "npm:^0.15.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: eef3ffc19f7d291b863635f32b896ad7f87806d9219a0d3404a470219abcfc5b43aabecd691026c48e875b965760d9c16abee25e6447272233f30cd07f453ec7 + languageName: node + linkType: hard + +"@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 4abc1db6c964efafc7a927cda814c7275275afa4b530483e0936fd614de23cb5802f7ca43edaa402008a723d4e7eac282b6f5283aa2eeb3b27da6d6c1dd7f8ed + languageName: node + linkType: hard + "@babel/plugin-transform-reserved-words@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" @@ -2386,6 +3210,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-reserved-words@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8b028b80d1983e3e02f74e21924323cc66ba930e5c5758909a122aa7d80e341b8b0f42e1698e42b50d47a6ba911332f584200b28e1a4e2104b7514d9dc011e96 + languageName: node + linkType: hard + "@babel/plugin-transform-runtime@npm:^7.22.9": version: 7.23.3 resolution: "@babel/plugin-transform-runtime@npm:7.23.3" @@ -2402,6 +3237,22 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-runtime@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-runtime@npm:7.25.9" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.6" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 888a4998ba0a2313de347954c9a8dfeccbff0633c69d33aee385b8878eba2b429dbfb00c3cc04f6bca454b9be8afa01ebbd73defb7fbbb6e2d3086205c07758b + languageName: node + linkType: hard + "@babel/plugin-transform-shorthand-properties@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" @@ -2413,6 +3264,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-shorthand-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 05a20d45f0fb62567644c507ccd4e379c1a74dacf887d2b2cac70247415e3f6d7d3bf4850c8b336053144715fedb6200fc38f7130c4b76c94eec9b9c0c2a8e9b + languageName: node + linkType: hard + "@babel/plugin-transform-spread@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-spread@npm:7.23.3" @@ -2425,6 +3287,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-spread@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-spread@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 996c8fed238efc30e0664f9f58bd7ec8c148f4659f84425f68923a094fe891245711d26eb10d1f815f50c124434e076e860dbe9662240844d1b77cd09907dcdf + languageName: node + linkType: hard + "@babel/plugin-transform-sticky-regex@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" @@ -2436,6 +3310,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-sticky-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e9612b0615dab4c4fba1c560769616a9bd7b9226c73191ef84b6c3ee185c8b719b4f887cdd8336a0a13400ce606ab4a0d33bc8fa6b4fcdb53e2896d07f2568f6 + languageName: node + linkType: hard + "@babel/plugin-transform-template-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" @@ -2447,6 +3332,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-template-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-template-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 5144da6036807bbd4e9d2a8b92ae67a759543929f34f4db9b463448a77298f4a40bf1e92e582db208fe08ee116224806a3bd0bed75d9da404fc2c0af9e6da540 + languageName: node + linkType: hard + "@babel/plugin-transform-typeof-symbol@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" @@ -2458,6 +3354,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typeof-symbol@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 2b19fd88608589d9bc6b607ff17b06791d35c67ef3249f4659283454e6a9984241e3bd4c4eb72bb8b3d860a73223f3874558b861adb7314aa317c1c6a2f0cafb + languageName: node + linkType: hard + "@babel/plugin-transform-typescript@npm:^7.18.6": version: 7.18.8 resolution: "@babel/plugin-transform-typescript@npm:7.18.8" @@ -2485,6 +3392,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typescript@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-typescript@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/plugin-syntax-typescript": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c607ddb45f7e33cfcb928aad05cb1b18b1ecb564d2329d8f8e427f75192511aa821dee42d26871f1bdffbd883853e150ba81436664646c6e6b13063e65ce1475 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-escapes@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" @@ -2496,6 +3418,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-escapes@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 615c84d7c53e1575d54ba9257e753e0b98c5de1e3225237d92f55226eaab8eb5bceb74df43f50f4aa162b0bbcc934ed11feafe2b60b8ec4934ce340fad4b8828 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-property-regex@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" @@ -2508,6 +3441,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-property-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1685836fc38af4344c3d2a9edbd46f7c7b28d369b63967d5b83f2f6849ec45b97223461cea3d14cc3f0be6ebb284938e637a5ca3955c0e79c873d62f593d615c + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-regex@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" @@ -2520,6 +3465,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 448004f978279e726af26acd54f63f9002c9e2582ecd70d1c5c4436f6de490fcd817afb60016d11c52f5ef17dbaac2590e8cc7bfaf4e91b58c452cf188c7920f + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" @@ -2532,11 +3489,23 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.19.4, @babel/preset-env@npm:^7.22.9": - version: 7.23.3 - resolution: "@babel/preset-env@npm:7.23.3" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" dependencies: - "@babel/compat-data": "npm:^7.23.3" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 56ee04fbe236b77cbcd6035cbf0be7566d1386b8349154ac33244c25f61170c47153a9423cd1d92855f7d6447b53a4a653d9e8fd1eaeeee14feb4b2baf59bd9f + languageName: node + linkType: hard + +"@babel/preset-env@npm:^7.19.4, @babel/preset-env@npm:^7.22.9": + version: 7.23.3 + resolution: "@babel/preset-env@npm:7.23.3" + dependencies: + "@babel/compat-data": "npm:^7.23.3" "@babel/helper-compilation-targets": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-validator-option": "npm:^7.22.15" @@ -2622,6 +3591,85 @@ __metadata: languageName: node linkType: hard +"@babel/preset-env@npm:^7.20.2, @babel/preset-env@npm:^7.25.9": + version: 7.26.0 + resolution: "@babel/preset-env@npm:7.26.0" + dependencies: + "@babel/compat-data": "npm:^7.26.0" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.9" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions": "npm:^7.26.0" + "@babel/plugin-syntax-import-attributes": "npm:^7.26.0" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.25.9" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.9" + "@babel/plugin-transform-async-to-generator": "npm:^7.25.9" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.25.9" + "@babel/plugin-transform-block-scoping": "npm:^7.25.9" + "@babel/plugin-transform-class-properties": "npm:^7.25.9" + "@babel/plugin-transform-class-static-block": "npm:^7.26.0" + "@babel/plugin-transform-classes": "npm:^7.25.9" + "@babel/plugin-transform-computed-properties": "npm:^7.25.9" + "@babel/plugin-transform-destructuring": "npm:^7.25.9" + "@babel/plugin-transform-dotall-regex": "npm:^7.25.9" + "@babel/plugin-transform-duplicate-keys": "npm:^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.9" + "@babel/plugin-transform-dynamic-import": "npm:^7.25.9" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.25.9" + "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" + "@babel/plugin-transform-for-of": "npm:^7.25.9" + "@babel/plugin-transform-function-name": "npm:^7.25.9" + "@babel/plugin-transform-json-strings": "npm:^7.25.9" + "@babel/plugin-transform-literals": "npm:^7.25.9" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.25.9" + "@babel/plugin-transform-member-expression-literals": "npm:^7.25.9" + "@babel/plugin-transform-modules-amd": "npm:^7.25.9" + "@babel/plugin-transform-modules-commonjs": "npm:^7.25.9" + "@babel/plugin-transform-modules-systemjs": "npm:^7.25.9" + "@babel/plugin-transform-modules-umd": "npm:^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.25.9" + "@babel/plugin-transform-new-target": "npm:^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.25.9" + "@babel/plugin-transform-numeric-separator": "npm:^7.25.9" + "@babel/plugin-transform-object-rest-spread": "npm:^7.25.9" + "@babel/plugin-transform-object-super": "npm:^7.25.9" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.25.9" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" + "@babel/plugin-transform-parameters": "npm:^7.25.9" + "@babel/plugin-transform-private-methods": "npm:^7.25.9" + "@babel/plugin-transform-private-property-in-object": "npm:^7.25.9" + "@babel/plugin-transform-property-literals": "npm:^7.25.9" + "@babel/plugin-transform-regenerator": "npm:^7.25.9" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.26.0" + "@babel/plugin-transform-reserved-words": "npm:^7.25.9" + "@babel/plugin-transform-shorthand-properties": "npm:^7.25.9" + "@babel/plugin-transform-spread": "npm:^7.25.9" + "@babel/plugin-transform-sticky-regex": "npm:^7.25.9" + "@babel/plugin-transform-template-literals": "npm:^7.25.9" + "@babel/plugin-transform-typeof-symbol": "npm:^7.25.9" + "@babel/plugin-transform-unicode-escapes": "npm:^7.25.9" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.25.9" + "@babel/plugin-transform-unicode-regex": "npm:^7.25.9" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.9" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.6" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + core-js-compat: "npm:^3.38.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 26e19dc407cfa1c5166be638b4c54239d084fe15d8d7e6306d8c6dc7bc1decc51070a8dcf28352c1a2feeefbe52a06d193a12e302327ad5f529583df75fb7a26 + languageName: node + linkType: hard + "@babel/preset-modules@npm:0.1.6-no-external-plugins": version: 0.1.6-no-external-plugins resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" @@ -2667,6 +3715,22 @@ __metadata: languageName: node linkType: hard +"@babel/preset-react@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/preset-react@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-transform-react-display-name": "npm:^7.25.9" + "@babel/plugin-transform-react-jsx": "npm:^7.25.9" + "@babel/plugin-transform-react-jsx-development": "npm:^7.25.9" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c294b475ee741f01f63ea0d828862811c453fabc6023f01814ce983bc316388e9d73290164d2b1384c2684db9c330803a3d4d2170285b105dcbacd483329eb93 + languageName: node + linkType: hard + "@babel/preset-typescript@npm:^7.18.6": version: 7.18.6 resolution: "@babel/preset-typescript@npm:7.18.6" @@ -2680,6 +3744,21 @@ __metadata: languageName: node linkType: hard +"@babel/preset-typescript@npm:^7.21.0, @babel/preset-typescript@npm:^7.25.9": + version: 7.26.0 + resolution: "@babel/preset-typescript@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-syntax-jsx": "npm:^7.25.9" + "@babel/plugin-transform-modules-commonjs": "npm:^7.25.9" + "@babel/plugin-transform-typescript": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 20d86bc45d2bbfde2f84fc7d7b38746fa6481d4bde6643039ad4b1ff0b804c6d210ee43e6830effd8571f2ff43fa7ffd27369f42f2b3a2518bb92dc86c780c61 + languageName: node + linkType: hard + "@babel/preset-typescript@npm:^7.22.5": version: 7.23.3 resolution: "@babel/preset-typescript@npm:7.23.3" @@ -2712,6 +3791,16 @@ __metadata: languageName: node linkType: hard +"@babel/runtime-corejs3@npm:^7.25.9": + version: 7.26.0 + resolution: "@babel/runtime-corejs3@npm:7.26.0" + dependencies: + core-js-pure: "npm:^3.30.2" + regenerator-runtime: "npm:^0.14.0" + checksum: 921fa27c004cf2b92f0d49efc2006cfc1a72d2a35c7374da8ec88d8b63543963e6ef29d4820e068a7892a7d553dc2bac7208aef8fef30642bc843b63255b650b + languageName: node + linkType: hard + "@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.8.4": version: 7.18.9 resolution: "@babel/runtime@npm:7.18.9" @@ -2739,6 +3828,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.25.9": + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 12c01357e0345f89f4f7e8c0e81921f2a3e3e101f06e8eaa18a382b517376520cd2fa8c237726eb094dab25532855df28a7baaf1c26342b52782f6936b07c287 + languageName: node + linkType: hard + "@babel/template@npm:^7.18.6": version: 7.18.6 resolution: "@babel/template@npm:7.18.6" @@ -2761,6 +3859,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" + dependencies: + "@babel/code-frame": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: ebe677273f96a36c92cc15b7aa7b11cc8bc8a3bb7a01d55b2125baca8f19cae94ff3ce15f1b1880fb8437f3a690d9f89d4e91f16fc1dc4d3eb66226d128983ab + languageName: node + linkType: hard + "@babel/traverse@npm:^7.18.9": version: 7.18.9 resolution: "@babel/traverse@npm:7.18.9" @@ -2797,21 +3906,18 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/traverse@npm:7.23.7" +"@babel/traverse@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" dependencies: - "@babel/code-frame": "npm:^7.23.5" - "@babel/generator": "npm:^7.23.6" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.23.6" - "@babel/types": "npm:^7.23.6" + "@babel/code-frame": "npm:^7.25.9" + "@babel/generator": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: e32fceb4249beec2bde83968ddffe17444221c1ee5cd18c543a2feaf94e3ca83f2a4dfbc2dcca87cf226e0105973e0fe3717063a21e982a9de9945615ab3f3f5 + checksum: e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1 languageName: node linkType: hard @@ -2836,21 +3942,20 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/types@npm:7.23.6" +"@babel/types@npm:^7.21.3, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/types@npm:7.26.0" dependencies: - "@babel/helper-string-parser": "npm:^7.23.4" - "@babel/helper-validator-identifier": "npm:^7.22.20" - to-fast-properties: "npm:^2.0.0" - checksum: 42cefce8a68bd09bb5828b4764aa5586c53c60128ac2ac012e23858e1c179347a4aac9c66fc577994fbf57595227611c5ec8270bf0cfc94ff033bbfac0550b70 + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: b694f41ad1597127e16024d766c33a641508aad037abd08d0d1f73af753e1119fa03b4a107d04b5f92cc19c095a594660547ae9bead1db2299212d644b0a5cb8 languageName: node linkType: hard -"@braintree/sanitize-url@npm:^6.0.1": - version: 6.0.4 - resolution: "@braintree/sanitize-url@npm:6.0.4" - checksum: 5d7bac57f3e49931db83f65aaa4fd22f96caa323bf0c7fcf6851fdbed179a8cf29eaa5dd372d340fc51ca5f44345ea5bc0196b36c8b16179888a7c9044313420 +"@braintree/sanitize-url@npm:^7.0.1": + version: 7.1.0 + resolution: "@braintree/sanitize-url@npm:7.1.0" + checksum: ff30c09ae38cf9812dd118c5af663180a2b766abd485432327ba4fef3c49ed4c42309524438a8d67961ae9dbcc220a0d350cbb5ec0512fc8791c599451686a2a languageName: node linkType: hard @@ -2861,6 +3966,48 @@ __metadata: languageName: node linkType: hard +"@chevrotain/cst-dts-gen@npm:11.0.3": + version: 11.0.3 + resolution: "@chevrotain/cst-dts-gen@npm:11.0.3" + dependencies: + "@chevrotain/gast": "npm:11.0.3" + "@chevrotain/types": "npm:11.0.3" + lodash-es: "npm:4.17.21" + checksum: 9e945a0611386e4e08af34c2d0b3af36c1af08f726b58145f11310f2aeafcb2d65264c06ec65a32df6b6a65771e6a55be70580c853afe3ceb51487e506967104 + languageName: node + linkType: hard + +"@chevrotain/gast@npm:11.0.3": + version: 11.0.3 + resolution: "@chevrotain/gast@npm:11.0.3" + dependencies: + "@chevrotain/types": "npm:11.0.3" + lodash-es: "npm:4.17.21" + checksum: 54fc44d7b4a7b0323f49d957dd88ad44504922d30cb226d93b430b0e09925efe44e0726068581d777f423fabfb878a2238ed2c87b690c0c0014ebd12b6968354 + languageName: node + linkType: hard + +"@chevrotain/regexp-to-ast@npm:11.0.3": + version: 11.0.3 + resolution: "@chevrotain/regexp-to-ast@npm:11.0.3" + checksum: 6939c5c94fbfb8c559a4a37a283af5ded8e6147b184a7d7bcf5ad1404d9d663c78d81602bd8ea8458ec497358a9e1671541099c511835d0be2cad46f00c62b3f + languageName: node + linkType: hard + +"@chevrotain/types@npm:11.0.3": + version: 11.0.3 + resolution: "@chevrotain/types@npm:11.0.3" + checksum: 72fe8f0010ebef848e47faea14a88c6fdc3cdbafaef6b13df4a18c7d33249b1b675e37b05cb90a421700c7016dae7cd4187ab6b549e176a81cea434f69cd2503 + languageName: node + linkType: hard + +"@chevrotain/utils@npm:11.0.3": + version: 11.0.3 + resolution: "@chevrotain/utils@npm:11.0.3" + checksum: b31972d1b2d444eef1499cf9b7576fc1793e8544910de33a3c18e07c270cfad88067f175d0ee63e7bc604713ebed647f8190db45cc8311852cd2d4fe2ef14068 + languageName: node + linkType: hard + "@colors/colors@npm:1.5.0": version: 1.5.0 resolution: "@colors/colors@npm:1.5.0" @@ -3031,6 +4178,496 @@ __metadata: languageName: node linkType: hard +"@csstools/cascade-layer-name-parser@npm:^2.0.4": + version: 2.0.4 + resolution: "@csstools/cascade-layer-name-parser@npm:2.0.4" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 774f2bcc96a576183853191bdfd31df15e22c51901ee01678ee47f1d1afcb4ab0e6d9a78e08f7383ac089c7e0b390013633f45ff1f1d577c9aefd252589bcced + languageName: node + linkType: hard + +"@csstools/color-helpers@npm:^5.0.1": + version: 5.0.1 + resolution: "@csstools/color-helpers@npm:5.0.1" + checksum: 77fa3b7236eaa3f36dea24708ac0d5e53168903624ac5aed54615752a0730cd20773fda50e742ce868012eca8c000cc39688e05869e79f34714230ab6968d1e6 + languageName: node + linkType: hard + +"@csstools/css-calc@npm:^2.1.0": + version: 2.1.0 + resolution: "@csstools/css-calc@npm:2.1.0" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: c707bb533a6ea63ed5bb4b8f1ffcbf3cd2daf970a6d76d42b684243426f5aa7513179a8f34d2e3c5a85df3870f44d3bc2850ca40b085c5fe00b41a291a2ecae2 + languageName: node + linkType: hard + +"@csstools/css-color-parser@npm:^3.0.6": + version: 3.0.6 + resolution: "@csstools/css-color-parser@npm:3.0.6" + dependencies: + "@csstools/color-helpers": "npm:^5.0.1" + "@csstools/css-calc": "npm:^2.1.0" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 7c4f42a704c8c44cece75f5dcd647a83634dec0f44d398ae1fbdc6e8527d4fbdc3a809eaaba3b739edf8e3c09d62c28234636f250f9b0b0d52a599e824c22047 + languageName: node + linkType: hard + +"@csstools/css-parser-algorithms@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/css-parser-algorithms@npm:3.0.4" + peerDependencies: + "@csstools/css-tokenizer": ^3.0.3 + checksum: d411f07765e14eede17bccc6bd4f90ff303694df09aabfede3fd104b2dfacfd4fe3697cd25ddad14684c850328f3f9420ebfa9f78380892492974db24ae47dbd + languageName: node + linkType: hard + +"@csstools/css-tokenizer@npm:^3.0.3": + version: 3.0.3 + resolution: "@csstools/css-tokenizer@npm:3.0.3" + checksum: c31bf410e1244b942e71798e37c54639d040cb59e0121b21712b40015fced2b0fb1ffe588434c5f8923c9cd0017cfc1c1c8f3921abc94c96edf471aac2eba5e5 + languageName: node + linkType: hard + +"@csstools/media-query-list-parser@npm:^4.0.2": + version: 4.0.2 + resolution: "@csstools/media-query-list-parser@npm:4.0.2" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 5d008a70f5d4fd96224066a433f5cdefa76cfd78a74416a20d6d5b2bb1bc8282b140e8373015d807d4dadb91daf3deb73eb13f853ec4e0479d0cb92e80c6f20d + languageName: node + linkType: hard + +"@csstools/postcss-cascade-layers@npm:^5.0.1": + version: 5.0.1 + resolution: "@csstools/postcss-cascade-layers@npm:5.0.1" + dependencies: + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 5cc3c6f220d9216f7ab16e716a20d6db845f127c917521e6236342bfa871accd63eb662a04c1e24a28e396412dcb47b1c4abccc490b88e4010cd704d14a702f1 + languageName: node + linkType: hard + +"@csstools/postcss-color-function@npm:^4.0.6": + version: 4.0.6 + resolution: "@csstools/postcss-color-function@npm:4.0.6" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.6" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: facbae01fd58898a176219cfcffee9ffb06fb466a2c439fd28403819e48778b682621b86a69682c0f758c659f8ec5f14eca1a9612b12b8777a2198173f386b49 + languageName: node + linkType: hard + +"@csstools/postcss-color-mix-function@npm:^3.0.6": + version: 3.0.6 + resolution: "@csstools/postcss-color-mix-function@npm:3.0.6" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.6" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 66b906b2425ed137b1c2ef3d166036719ae69039668385dccce4e02bd91e41733b37dd3c884b74a2999067bfe8a8d8d1afa4082ef21a0bf044ba7e7fffb77e01 + languageName: node + linkType: hard + +"@csstools/postcss-content-alt-text@npm:^2.0.4": + version: 2.0.4 + resolution: "@csstools/postcss-content-alt-text@npm:2.0.4" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 84caccedd8a519df434babd58b14104c5a92cd326057ce509bdbaa2a4bb3130afb1c1456caf30235ba14da52d1628a5411ea4f5d2fb558d603d234f795538017 + languageName: node + linkType: hard + +"@csstools/postcss-exponential-functions@npm:^2.0.5": + version: 2.0.5 + resolution: "@csstools/postcss-exponential-functions@npm:2.0.5" + dependencies: + "@csstools/css-calc": "npm:^2.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 8935cb69f70d7448aa5a3dcdfd188bdcfbc34e9a99131306947df8847126272773212011dcff85e10bcee4c9d01f94f7f8557ef93933122a0b82743185684ab1 + languageName: node + linkType: hard + +"@csstools/postcss-font-format-keywords@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-font-format-keywords@npm:4.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: eb794fb95fefcac75e606d185255e601636af177866a317b0c6b6c375055e7240be53918229fd8d4bba00df01bedd2256bdac2b0ad4a4c2ec64f9d27cd6ff639 + languageName: node + linkType: hard + +"@csstools/postcss-gamut-mapping@npm:^2.0.6": + version: 2.0.6 + resolution: "@csstools/postcss-gamut-mapping@npm:2.0.6" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.6" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 8a3f012774ab261924cc9f3519caa87a25a6abcd70d78f622144d8e7126a687bddbdaa92995fc30f53355759cd5971e71ac099b6b8cb85c89d8ca86455588e3b + languageName: node + linkType: hard + +"@csstools/postcss-gradients-interpolation-method@npm:^5.0.6": + version: 5.0.6 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.6" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.6" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 0d97be76837f972ea323b58189ded2310b618ad94b40777464d0d8ac050b557ca9fd1f20af5ada105d61574cc9d8c119ae0daf294a3aacaaa89926f864d9d674 + languageName: node + linkType: hard + +"@csstools/postcss-hwb-function@npm:^4.0.6": + version: 4.0.6 + resolution: "@csstools/postcss-hwb-function@npm:4.0.6" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.6" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: e7bcc98095ef2873a7b1a7326f1618bbeecc1c78660b23805bbefd8ec067bf2f35f2a2d4675be51a02d2280046f36f74d55f6af78e3ce107b82624d1a421ffcf + languageName: node + linkType: hard + +"@csstools/postcss-ic-unit@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-ic-unit@npm:4.0.0" + dependencies: + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 6f94ec31002a245768a30d240c432b8712af4d9ea76a62403e16d4e0afb5be7636348a2d4619046ed29aa7726f88a0c191ca41c96d7ab0f3da940025c91b056e + languageName: node + linkType: hard + +"@csstools/postcss-initial@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-initial@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 44c443cba84cc66367f2082bf20db06c8437338c02c244c38798c5bf5342932d89fed0dd13e4409f084ecf7fce47ae6394e9a7a006fd98a973decfa24ab1eb04 + languageName: node + linkType: hard + +"@csstools/postcss-is-pseudo-class@npm:^5.0.1": + version: 5.0.1 + resolution: "@csstools/postcss-is-pseudo-class@npm:5.0.1" + dependencies: + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 3aaab18ebb2dcf5565efa79813eaa987d40de1e086765358524392a09631c68ad1ee952e6aff8f42513b2c18ab84891787e065fe287f696128498fc641520b6c + languageName: node + linkType: hard + +"@csstools/postcss-light-dark-function@npm:^2.0.7": + version: 2.0.7 + resolution: "@csstools/postcss-light-dark-function@npm:2.0.7" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: c116bfd2d3f4d0caabdedf8954c2a25908ffb29f9bbe2c57d44a2974277c7e46ee79862eea848385dc040275d343f2330350394a2095ec30f0aa17f72e2f4e39 + languageName: node + linkType: hard + +"@csstools/postcss-logical-float-and-clear@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-float-and-clear@npm:3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 71a20e8c37877bf68ae615d7bb93fc11b4f8da8be8b1dc1a6e0fc69e27f189712ed71436b8ed51fa69fdb98b8e6718df2b5f42f246c4d39badaf0e43020fcfd4 + languageName: node + linkType: hard + +"@csstools/postcss-logical-overflow@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-logical-overflow@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 0e103343d3ff8b34eef01b02355c5e010d272fd12d149a242026bb13ab1577b7f3a11fd4514be9342d96f73d61dac1f093a9bd36ece591753ed09a84eb7fca0a + languageName: node + linkType: hard + +"@csstools/postcss-logical-overscroll-behavior@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-logical-overscroll-behavior@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 1649601bb26f04d760fb5ebc42cdf414fa2a380b8ec22fe1c117f664c286665a786bd7bbda01b7e7567eaf3cc018a4f36a5c9805f6751cc497da223e0ffe9524 + languageName: node + linkType: hard + +"@csstools/postcss-logical-resize@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-resize@npm:3.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 4f12efcaf5468ff359bb3f32f0f66034b9acc9b3ac21fcd2f30a1c8998fc653ebac0091f35c8b7e8dbfe6ccf595aee67f9b06a67adf45a8844e49a82d98b4386 + languageName: node + linkType: hard + +"@csstools/postcss-logical-viewport-units@npm:^3.0.3": + version: 3.0.3 + resolution: "@csstools/postcss-logical-viewport-units@npm:3.0.3" + dependencies: + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 8ec746598d7ce8697c3dafd83cb3a319a90079ad755dd78e3ec92f4ba9ad849c4cdaba33b16e9dcbac1e9489b3d7c48262030110c20ce1d88cdacbe9f5987cec + languageName: node + linkType: hard + +"@csstools/postcss-media-minmax@npm:^2.0.5": + version: 2.0.5 + resolution: "@csstools/postcss-media-minmax@npm:2.0.5" + dependencies: + "@csstools/css-calc": "npm:^2.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/media-query-list-parser": "npm:^4.0.2" + peerDependencies: + postcss: ^8.4 + checksum: 0d17782076fcaba2c3c85bd769fc102d95809e9ee6141ad9de706ee116466cada62424fd68623c58cc2456771725291c356e550377ba73a102ab6fe628931e30 + languageName: node + linkType: hard + +"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:3.0.4" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/media-query-list-parser": "npm:^4.0.2" + peerDependencies: + postcss: ^8.4 + checksum: 27dc9419b0f4315774647588f599348e7cc593984f59b414c51c910066501fd087cbe232deb762907c18bd21dd4184e7b6e0e0b730e5c72341ab9cc696c75739 + languageName: node + linkType: hard + +"@csstools/postcss-nested-calc@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-nested-calc@npm:4.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: fb61512fa4909bdf0ee32a23e771145086c445f2208a737b52093c8adfab7362c56d3aeaf2a6e33ffcec067e99a07219775465d2fbb1a3ac30cdcfb278b218b7 + languageName: node + linkType: hard + +"@csstools/postcss-normalize-display-values@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-normalize-display-values@npm:4.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: d3a3a362b532163bd791f97348ef28b7a43baf01987c7702b06285e751cdc5ea3e3a2553f088260515b4d28263d5c475923d4d4780ecb4078ec66dff50c9e638 + languageName: node + linkType: hard + +"@csstools/postcss-oklab-function@npm:^4.0.6": + version: 4.0.6 + resolution: "@csstools/postcss-oklab-function@npm:4.0.6" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.6" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 74ec74eb7171881deeff7a79e0dc696097fb53dcdcd9627d9559cd7be63f41adecec06c1e88ddd5d8a37f4705715d1c0c135ca2b001fb70fdc0b76ab1e491b66 + languageName: node + linkType: hard + +"@csstools/postcss-progressive-custom-properties@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-progressive-custom-properties@npm:4.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 517e5e0b1525667ea1c4469bb2af52995934b9ab3165bba33e3bfdfac63b20bb51c878da582d805957dc0291e396e5a540cac18d1220a08190d98d5463d26ce2 + languageName: node + linkType: hard + +"@csstools/postcss-random-function@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-random-function@npm:1.0.1" + dependencies: + "@csstools/css-calc": "npm:^2.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 5e8f29c024aa6ed1f89ee8b9c8ece39c8e72602d63faa82d9684e3183828f01971cf2f760b7d5b773605d44a4ea661d6d4389ec03f7e21002f9aa9e8db613a61 + languageName: node + linkType: hard + +"@csstools/postcss-relative-color-syntax@npm:^3.0.6": + version: 3.0.6 + resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.6" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.6" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 207ae711831f8ae9170093dbea3727cd6f32ca31d22c1231b5b678592679eb49e329e87ea403714b8e10feb5b9137780364cc7e1e7d8cc4c90d47483a42132dc + languageName: node + linkType: hard + +"@csstools/postcss-scope-pseudo-class@npm:^4.0.1": + version: 4.0.1 + resolution: "@csstools/postcss-scope-pseudo-class@npm:4.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 6a0ca50fae655f4498200d1ce298ca794c85fbe2e3fd5d6419843254f055df5007a973e09b5f1e78e376c02b54278e411516c8d824300c68b265d3e5b311d7ee + languageName: node + linkType: hard + +"@csstools/postcss-sign-functions@npm:^1.1.0": + version: 1.1.0 + resolution: "@csstools/postcss-sign-functions@npm:1.1.0" + dependencies: + "@csstools/css-calc": "npm:^2.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 503bbaa8fe1d1a619880d5d6b838f07f1898a5820889e5db3c4e02bb8b340dab18b88f439f9f1da44c6669bab2d4ba3f9543643ccc459d8a21191c5d22109c9b + languageName: node + linkType: hard + +"@csstools/postcss-stepped-value-functions@npm:^4.0.5": + version: 4.0.5 + resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.5" + dependencies: + "@csstools/css-calc": "npm:^2.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 76f1f60c24b9e6a80b044eb19f37c1816788a2335fbf7c25f3fbea1cd7104857f424a451dcff60e4f8841618c6b6ffa6091f8b840d6d5930c1c7100c2f8ae74b + languageName: node + linkType: hard + +"@csstools/postcss-text-decoration-shorthand@npm:^4.0.1": + version: 4.0.1 + resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.1" + dependencies: + "@csstools/color-helpers": "npm:^5.0.1" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 81950e248d6019c0066353895e0fa2a5c684b754c9af349218cb919534f5ebf79e5e9c7a10b3af1e9c56de2f246968de3b87a00d8c4102e5f88e0f05c04f9889 + languageName: node + linkType: hard + +"@csstools/postcss-trigonometric-functions@npm:^4.0.5": + version: 4.0.5 + resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.5" + dependencies: + "@csstools/css-calc": "npm:^2.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + peerDependencies: + postcss: ^8.4 + checksum: b8518c8b81da047448dcee12a5f3716dbc19671333387a4a673991a16f1a120441d2768de8a30ce1e2ef8d0d76509b9509f506ef1e8630da84834451414b23a3 + languageName: node + linkType: hard + +"@csstools/postcss-unset-value@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-unset-value@npm:4.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 8424ac700ded5bf59d49310335896f10c069e2c3fc6a676b5d13ca5a6fb78689b948f50494df875da284c4c76651deb005eafba70d87e693274628c5a685abfa + languageName: node + linkType: hard + +"@csstools/selector-resolve-nested@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/selector-resolve-nested@npm:3.0.0" + peerDependencies: + postcss-selector-parser: ^7.0.0 + checksum: 2b01c36b3fa81388d5bddd8db962766465d76b021a815c8bb5a48c3a42c530154cc155fc496707ade627dbba6745eb8ecd9fa840c1972133c0f7d8811e0a959d + languageName: node + linkType: hard + +"@csstools/selector-specificity@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/selector-specificity@npm:5.0.0" + peerDependencies: + postcss-selector-parser: ^7.0.0 + checksum: 186b444cabcdcdeb553bfe021f80c58bfe9ef38dcc444f2b1f34a5aab9be063ab4e753022b2d5792049c041c28cfbb78e4b707ec398459300e402030d35c07eb + languageName: node + linkType: hard + +"@csstools/utilities@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/utilities@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: be5c31437b726928f64cd4bb3e47f5b90bfd2e2a69a8eaabd8e89cc6c0977e4f0f7ee48de50c8ed8b07e04e3956a02293247e0da3236d521fb2e836f88f65822 + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:0.5.7": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -3071,6 +4708,67 @@ __metadata: languageName: node linkType: hard +"@docusaurus/babel@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/babel@npm:3.6.3" + dependencies: + "@babel/core": "npm:^7.25.9" + "@babel/generator": "npm:^7.25.9" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/plugin-transform-runtime": "npm:^7.25.9" + "@babel/preset-env": "npm:^7.25.9" + "@babel/preset-react": "npm:^7.25.9" + "@babel/preset-typescript": "npm:^7.25.9" + "@babel/runtime": "npm:^7.25.9" + "@babel/runtime-corejs3": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@docusaurus/logger": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + babel-plugin-dynamic-import-node: "npm:^2.3.3" + fs-extra: "npm:^11.1.1" + tslib: "npm:^2.6.0" + checksum: b4436423a95afa60709ec285e56f93c7825274bcacbf6ede1fb9aea1ee02095ab8179456c0a7ba7070fa216f3a6a46db7493b3abb5cd54f4d76cf154bd978b8f + languageName: node + linkType: hard + +"@docusaurus/bundler@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/bundler@npm:3.6.3" + dependencies: + "@babel/core": "npm:^7.25.9" + "@docusaurus/babel": "npm:3.6.3" + "@docusaurus/cssnano-preset": "npm:3.6.3" + "@docusaurus/logger": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + babel-loader: "npm:^9.2.1" + clean-css: "npm:^5.3.2" + copy-webpack-plugin: "npm:^11.0.0" + css-loader: "npm:^6.8.1" + css-minimizer-webpack-plugin: "npm:^5.0.1" + cssnano: "npm:^6.1.2" + file-loader: "npm:^6.2.0" + html-minifier-terser: "npm:^7.2.0" + mini-css-extract-plugin: "npm:^2.9.1" + null-loader: "npm:^4.0.1" + postcss: "npm:^8.4.26" + postcss-loader: "npm:^7.3.3" + postcss-preset-env: "npm:^10.1.0" + react-dev-utils: "npm:^12.0.1" + terser-webpack-plugin: "npm:^5.3.9" + tslib: "npm:^2.6.0" + url-loader: "npm:^4.1.1" + webpack: "npm:^5.95.0" + webpackbar: "npm:^6.0.1" + peerDependencies: + "@docusaurus/faster": "*" + peerDependenciesMeta: + "@docusaurus/faster": + optional: true + checksum: abe5fc932fe2c884f2d554b61e8e56ec21c629a4dc28c6b9d199639b10beb83c37e0e47bab1ed8bee40b171ce4afa1dbdce5494fcac8b3089b44a6e170b6d499 + languageName: node + linkType: hard + "@docusaurus/core@npm:3.0.0": version: 3.0.0 resolution: "@docusaurus/core@npm:3.0.0" @@ -3154,85 +4852,60 @@ __metadata: languageName: node linkType: hard -"@docusaurus/core@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/core@npm:3.0.1" +"@docusaurus/core@npm:3.6.3, @docusaurus/core@npm:^3.6.3": + version: 3.6.3 + resolution: "@docusaurus/core@npm:3.6.3" dependencies: - "@babel/core": "npm:^7.23.3" - "@babel/generator": "npm:^7.23.3" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-transform-runtime": "npm:^7.22.9" - "@babel/preset-env": "npm:^7.22.9" - "@babel/preset-react": "npm:^7.22.5" - "@babel/preset-typescript": "npm:^7.22.5" - "@babel/runtime": "npm:^7.22.6" - "@babel/runtime-corejs3": "npm:^7.22.6" - "@babel/traverse": "npm:^7.22.8" - "@docusaurus/cssnano-preset": "npm:3.0.1" - "@docusaurus/logger": "npm:3.0.1" - "@docusaurus/mdx-loader": "npm:3.0.1" - "@docusaurus/react-loadable": "npm:5.5.2" - "@docusaurus/utils": "npm:3.0.1" - "@docusaurus/utils-common": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" - "@slorber/static-site-generator-webpack-plugin": "npm:^4.0.7" - "@svgr/webpack": "npm:^6.5.1" - autoprefixer: "npm:^10.4.14" - babel-loader: "npm:^9.1.3" - babel-plugin-dynamic-import-node: "npm:^2.3.3" + "@docusaurus/babel": "npm:3.6.3" + "@docusaurus/bundler": "npm:3.6.3" + "@docusaurus/logger": "npm:3.6.3" + "@docusaurus/mdx-loader": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + "@docusaurus/utils-common": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" boxen: "npm:^6.2.1" chalk: "npm:^4.1.2" chokidar: "npm:^3.5.3" - clean-css: "npm:^5.3.2" cli-table3: "npm:^0.6.3" combine-promises: "npm:^1.1.0" commander: "npm:^5.1.0" - copy-webpack-plugin: "npm:^11.0.0" core-js: "npm:^3.31.1" - css-loader: "npm:^6.8.1" - css-minimizer-webpack-plugin: "npm:^4.2.2" - cssnano: "npm:^5.1.15" del: "npm:^6.1.1" detect-port: "npm:^1.5.1" escape-html: "npm:^1.0.3" eta: "npm:^2.2.0" - file-loader: "npm:^6.2.0" + eval: "npm:^0.1.8" fs-extra: "npm:^11.1.1" - html-minifier-terser: "npm:^7.2.0" html-tags: "npm:^3.3.1" - html-webpack-plugin: "npm:^5.5.3" + html-webpack-plugin: "npm:^5.6.0" leven: "npm:^3.1.0" lodash: "npm:^4.17.21" - mini-css-extract-plugin: "npm:^2.7.6" - postcss: "npm:^8.4.26" - postcss-loader: "npm:^7.3.3" + p-map: "npm:^4.0.0" prompts: "npm:^2.4.2" react-dev-utils: "npm:^12.0.1" react-helmet-async: "npm:^1.3.0" - react-loadable: "npm:@docusaurus/react-loadable@5.5.2" + react-loadable: "npm:@docusaurus/react-loadable@6.0.0" react-loadable-ssr-addon-v5-slorber: "npm:^1.0.1" react-router: "npm:^5.3.4" react-router-config: "npm:^5.1.1" react-router-dom: "npm:^5.3.4" rtl-detect: "npm:^1.0.4" semver: "npm:^7.5.4" - serve-handler: "npm:^6.1.5" + serve-handler: "npm:^6.1.6" shelljs: "npm:^0.8.5" - terser-webpack-plugin: "npm:^5.3.9" tslib: "npm:^2.6.0" update-notifier: "npm:^6.0.2" - url-loader: "npm:^4.1.1" - webpack: "npm:^5.88.1" - webpack-bundle-analyzer: "npm:^4.9.0" - webpack-dev-server: "npm:^4.15.1" - webpack-merge: "npm:^5.9.0" - webpackbar: "npm:^5.0.2" + webpack: "npm:^5.95.0" + webpack-bundle-analyzer: "npm:^4.10.2" + webpack-dev-server: "npm:^4.15.2" + webpack-merge: "npm:^6.0.1" peerDependencies: + "@mdx-js/react": ^3.0.0 react: ^18.0.0 react-dom: ^18.0.0 bin: docusaurus: bin/docusaurus.mjs - checksum: 3897f4cf1f71bd1dea58525548a9547a699e0514d29ed7637aba5eb36f584361dc81ec8f916eafe450402b4850bee0bea1e6dd25c9dc3d7244ac519029818296 + checksum: 551e7af994bb41ccbe9866bb380def55ed03316b4de5ae2b5ad98721f3cc0a209ed86becb70dac80c360c36767b4d1375115de190ac1c11b28e813ee8c38ebd6 languageName: node linkType: hard @@ -3248,15 +4921,15 @@ __metadata: languageName: node linkType: hard -"@docusaurus/cssnano-preset@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/cssnano-preset@npm:3.0.1" +"@docusaurus/cssnano-preset@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/cssnano-preset@npm:3.6.3" dependencies: - cssnano-preset-advanced: "npm:^5.3.10" - postcss: "npm:^8.4.26" - postcss-sort-media-queries: "npm:^4.4.1" + cssnano-preset-advanced: "npm:^6.1.2" + postcss: "npm:^8.4.38" + postcss-sort-media-queries: "npm:^5.2.0" tslib: "npm:^2.6.0" - checksum: 21f1d87a6f42450e70c379c3795a4e2951ccbdae480bf4c1f7de53e83747cdf11f1031511eaa7cd0fecc52bb425dc66f4fe6c624f33c13d1f0d84235663ab360 + checksum: 0289e37587d05dd3fd197d1014c083192e391f28e33baf465941e54086f182bf65938e56f8e346cec6c4323fbb359139564b48ee236f3b45ae6f28f44d1e79c1 languageName: node linkType: hard @@ -3270,13 +4943,13 @@ __metadata: languageName: node linkType: hard -"@docusaurus/logger@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/logger@npm:3.0.1" +"@docusaurus/logger@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/logger@npm:3.6.3" dependencies: chalk: "npm:^4.1.2" tslib: "npm:^2.6.0" - checksum: 803c6db9646c111ac8e45d38a9b79b96503042838447e6fa250165fabff88ed94f5964d5be08d7c448ad2b8035255fd34c26a4ccf2082548b33a753e2f0a23fb + checksum: 3119c8c586d6c5dba5595d8b795903c808ffa5011cb0e945b32cb011457f18f79909aca2f9864a5122ccfe32ecba9fd9c7fa1477d534febbcc5d3855a0daab91 languageName: node linkType: hard @@ -3317,15 +4990,13 @@ __metadata: languageName: node linkType: hard -"@docusaurus/mdx-loader@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/mdx-loader@npm:3.0.1" +"@docusaurus/mdx-loader@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/mdx-loader@npm:3.6.3" dependencies: - "@babel/parser": "npm:^7.22.7" - "@babel/traverse": "npm:^7.22.8" - "@docusaurus/logger": "npm:3.0.1" - "@docusaurus/utils": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" + "@docusaurus/logger": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" "@mdx-js/mdx": "npm:^3.0.0" "@slorber/remark-comment": "npm:^1.0.0" escape-html: "npm:^1.0.3" @@ -3350,7 +5021,7 @@ __metadata: peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 2892440de8a0606e893236eaf4f9c873091199481815139fe5f120ba2e5bd7fef062b63db7431027a73ee4d240bc785095374cddfd55313de35b8a5c62c53e9f + checksum: c8d358c665176bb185284c38d7465fcefce4f0da4ac7cc83f25b5258c4489cdaa2916b183d83f47e0af33158a22cd06af1ffd383f8aac04549393f4c544c56bc languageName: node linkType: hard @@ -3373,34 +5044,33 @@ __metadata: languageName: node linkType: hard -"@docusaurus/module-type-aliases@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/module-type-aliases@npm:3.0.1" +"@docusaurus/module-type-aliases@npm:3.6.3, @docusaurus/module-type-aliases@npm:^3.6.3": + version: 3.6.3 + resolution: "@docusaurus/module-type-aliases@npm:3.6.3" dependencies: - "@docusaurus/react-loadable": "npm:5.5.2" - "@docusaurus/types": "npm:3.0.1" + "@docusaurus/types": "npm:3.6.3" "@types/history": "npm:^4.7.11" "@types/react": "npm:*" "@types/react-router-config": "npm:*" "@types/react-router-dom": "npm:*" react-helmet-async: "npm:*" - react-loadable: "npm:@docusaurus/react-loadable@5.5.2" + react-loadable: "npm:@docusaurus/react-loadable@6.0.0" peerDependencies: react: "*" react-dom: "*" - checksum: 6a01235908bd17d94188f6ff749c3358eaf0e1edd4224d0e2f43c234fa68f17cd098fd26389c40457ab69b420869381ee46706c355b704d4a8f80892c23d8a74 + checksum: e142ba7af9059611751159b844bb0ba37c70e29f15b122d1c7ca869a5200a0d3b62fa84dc71a7da04f6d27efffc19c45181d9e6ad46506aaacfe463ffac9e62d languageName: node linkType: hard -"@docusaurus/plugin-client-redirects@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/plugin-client-redirects@npm:3.0.1" +"@docusaurus/plugin-client-redirects@npm:^3.6.3": + version: 3.6.3 + resolution: "@docusaurus/plugin-client-redirects@npm:3.6.3" dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/logger": "npm:3.0.1" - "@docusaurus/utils": "npm:3.0.1" - "@docusaurus/utils-common": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/logger": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + "@docusaurus/utils-common": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" eta: "npm:^2.2.0" fs-extra: "npm:^11.1.1" lodash: "npm:^4.17.21" @@ -3408,22 +5078,23 @@ __metadata: peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 0e8259cd06c29cebd2bf8058bea616e84c48b787e2bffe883db042edf87b0a1b9c04c6bfc2c1d101deedb5e24ef5809c9c24c3d8d1fcafe5c94d5565df51bc34 + checksum: 3bc4a215471c9bd4d080fc5f9294ae67fdcfed2c97d181ed6b8d6b39fc44f0b29b9349a026b14feb94a5cd8cb172e23f4109c61e285d10ed2aed4c2f5a44bd3c languageName: node linkType: hard -"@docusaurus/plugin-content-blog@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/plugin-content-blog@npm:3.0.1" - dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/logger": "npm:3.0.1" - "@docusaurus/mdx-loader": "npm:3.0.1" - "@docusaurus/types": "npm:3.0.1" - "@docusaurus/utils": "npm:3.0.1" - "@docusaurus/utils-common": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" - cheerio: "npm:^1.0.0-rc.12" +"@docusaurus/plugin-content-blog@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/plugin-content-blog@npm:3.6.3" + dependencies: + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/logger": "npm:3.6.3" + "@docusaurus/mdx-loader": "npm:3.6.3" + "@docusaurus/theme-common": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + "@docusaurus/utils-common": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" + cheerio: "npm:1.0.0-rc.12" feed: "npm:^4.2.2" fs-extra: "npm:^11.1.1" lodash: "npm:^4.17.21" @@ -3434,23 +5105,26 @@ __metadata: utility-types: "npm:^3.10.0" webpack: "npm:^5.88.1" peerDependencies: + "@docusaurus/plugin-content-docs": "*" react: ^18.0.0 react-dom: ^18.0.0 - checksum: 39e44ce1af5cf411e0b7d9ac4069df75a79f4ee1faaa980c22667896bb6925c87aaec0e7e0198575ba329df4652b8fd674bba9162bbd71247599358cb5ea5495 + checksum: 6f8b229c66fd7c155e120732a3a2cca614c610f1458a016f15b6a30f100f1b1679f41b0defcc6a7d95fb55b9ba798722101b54171965c0068a843b4d8de3ff8f languageName: node linkType: hard -"@docusaurus/plugin-content-docs@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/plugin-content-docs@npm:3.0.1" - dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/logger": "npm:3.0.1" - "@docusaurus/mdx-loader": "npm:3.0.1" - "@docusaurus/module-type-aliases": "npm:3.0.1" - "@docusaurus/types": "npm:3.0.1" - "@docusaurus/utils": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" +"@docusaurus/plugin-content-docs@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/plugin-content-docs@npm:3.6.3" + dependencies: + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/logger": "npm:3.6.3" + "@docusaurus/mdx-loader": "npm:3.6.3" + "@docusaurus/module-type-aliases": "npm:3.6.3" + "@docusaurus/theme-common": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + "@docusaurus/utils-common": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" "@types/react-router-config": "npm:^5.0.7" combine-promises: "npm:^1.1.0" fs-extra: "npm:^11.1.1" @@ -3462,7 +5136,7 @@ __metadata: peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 97ab50410e38beb7db7e2e110d35dab63e51621a116587ea7d8e334135e7df0b7173590daca9f97bcc8238ba51b495cab6eb88e90be5390560e7d9172a011238 + checksum: 53c1e35e2d4b03b1f1d7990c1eccd0dfbccb244ed5250370add44349e0976fade1b9afca9d2b45c4013bbab5624bb432aa5c6e0e913fdb69df814ccb51212887 languageName: node linkType: hard @@ -3492,129 +5166,129 @@ __metadata: languageName: node linkType: hard -"@docusaurus/plugin-content-pages@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/plugin-content-pages@npm:3.0.1" +"@docusaurus/plugin-content-pages@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/plugin-content-pages@npm:3.6.3" dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/mdx-loader": "npm:3.0.1" - "@docusaurus/types": "npm:3.0.1" - "@docusaurus/utils": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/mdx-loader": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" fs-extra: "npm:^11.1.1" tslib: "npm:^2.6.0" webpack: "npm:^5.88.1" peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 3752f6acd85b1799cfa0f4306dfc2eb198101dfbc5f2d238702839b02197f1623ac60e231f5b8c80e0bac92ce5ac02461a9a4fa2161551c40606451a5986f0d6 + checksum: f40dba85fb122c5f2a60ba634176c5817c1766751ff887c4f8056f4ccb32c332e1e92d77baf73c2c8178b77bae764f018ec7b3889927f2c4bbdb0ab442078a8c languageName: node linkType: hard -"@docusaurus/plugin-debug@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/plugin-debug@npm:3.0.1" +"@docusaurus/plugin-debug@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/plugin-debug@npm:3.6.3" dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/types": "npm:3.0.1" - "@docusaurus/utils": "npm:3.0.1" + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" fs-extra: "npm:^11.1.1" react-json-view-lite: "npm:^1.2.0" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 09e99640390b87b155befa7be5cdd3f0c638acbe8d2a44d947410be3b61e7d74adb923eff88cb4cd8abf00ad4212a651641ebf240155cf3714ecf40d09fd0e1c + checksum: 1f3f4b9d52aa24ee144476959290c17db04b891f0f39b8dece703167df555f7a5577fc93e6c851122361d25f8654f1dd975e41848333848e5eabb788dedd83a5 languageName: node linkType: hard -"@docusaurus/plugin-google-analytics@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/plugin-google-analytics@npm:3.0.1" +"@docusaurus/plugin-google-analytics@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/plugin-google-analytics@npm:3.6.3" dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/types": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 6afdbec2e8b3a6fe991dc54f2eb957200a5db1acd04f35ffd15fe2f72125786ad4e2961687f4182cab486aab2d6845db040634545455089496f1cfd630313d03 + checksum: 762dc9e93cb8728cc71be927521c1a24b10d48100145a7f4e83d912513b2048389bd4604aff72520d56ef6899dc44852067ad153b85d7bf5a7cb391f40b3289c languageName: node linkType: hard -"@docusaurus/plugin-google-gtag@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/plugin-google-gtag@npm:3.0.1" +"@docusaurus/plugin-google-gtag@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/plugin-google-gtag@npm:3.6.3" dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/types": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" "@types/gtag.js": "npm:^0.0.12" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 21e9a775c05ebc1654718a1e5e2e095201bb70946fa6e3419b4f668ec9f37fa56d1675de7011ecd91cfc5204dd48c6764e4419fd92c67aa0e55448014594af9d + checksum: 671b0d9be8603b6baa63701b28d9f14080f057a0d69c61eef8ad954844ba8f832c9a83f8f14eeeb3dd84baa4861ccc8b50f5b62afe51ba70474ab15cdd77af94 languageName: node linkType: hard -"@docusaurus/plugin-google-tag-manager@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/plugin-google-tag-manager@npm:3.0.1" +"@docusaurus/plugin-google-tag-manager@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/plugin-google-tag-manager@npm:3.6.3" dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/types": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 8ec2c46adbf8b67b5cc7736741486320608ae89c7e6f706e3df54afb6d8097b28f9dc0eb43edd92d9aab7e5fd823ceebe8aa4debd80c95ad98517a3a43015693 + checksum: e3f9f3564d7092f0d2a443a66e1822cde7ef437b4385e41c1ad2fb048f8cba9c97bee462c57a1ed93b5f86ce596e065f114375559979ce586b6403aa139a92cf languageName: node linkType: hard -"@docusaurus/plugin-sitemap@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/plugin-sitemap@npm:3.0.1" - dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/logger": "npm:3.0.1" - "@docusaurus/types": "npm:3.0.1" - "@docusaurus/utils": "npm:3.0.1" - "@docusaurus/utils-common": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" +"@docusaurus/plugin-sitemap@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/plugin-sitemap@npm:3.6.3" + dependencies: + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/logger": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + "@docusaurus/utils-common": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" fs-extra: "npm:^11.1.1" sitemap: "npm:^7.1.1" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: e6f63826f22139f9bf87fe9aec1229dffef115f4f5880ad77653f5ca826dc7bb01bd1f8a90741105a0524465dff8afde95f2c8b443de5cc50d3bbd1f0a16247a + checksum: 52d39a8b9f6db21343f363703b15b1257c60479d0fa9846db39e953fa88143e8e3a5bbeed5be94fcccc7bc87736fe7842f19f71021f819933177aa3a44da7916 languageName: node linkType: hard -"@docusaurus/preset-classic@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/preset-classic@npm:3.0.1" - dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/plugin-content-blog": "npm:3.0.1" - "@docusaurus/plugin-content-docs": "npm:3.0.1" - "@docusaurus/plugin-content-pages": "npm:3.0.1" - "@docusaurus/plugin-debug": "npm:3.0.1" - "@docusaurus/plugin-google-analytics": "npm:3.0.1" - "@docusaurus/plugin-google-gtag": "npm:3.0.1" - "@docusaurus/plugin-google-tag-manager": "npm:3.0.1" - "@docusaurus/plugin-sitemap": "npm:3.0.1" - "@docusaurus/theme-classic": "npm:3.0.1" - "@docusaurus/theme-common": "npm:3.0.1" - "@docusaurus/theme-search-algolia": "npm:3.0.1" - "@docusaurus/types": "npm:3.0.1" +"@docusaurus/preset-classic@npm:^3.6.3": + version: 3.6.3 + resolution: "@docusaurus/preset-classic@npm:3.6.3" + dependencies: + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/plugin-content-blog": "npm:3.6.3" + "@docusaurus/plugin-content-docs": "npm:3.6.3" + "@docusaurus/plugin-content-pages": "npm:3.6.3" + "@docusaurus/plugin-debug": "npm:3.6.3" + "@docusaurus/plugin-google-analytics": "npm:3.6.3" + "@docusaurus/plugin-google-gtag": "npm:3.6.3" + "@docusaurus/plugin-google-tag-manager": "npm:3.6.3" + "@docusaurus/plugin-sitemap": "npm:3.6.3" + "@docusaurus/theme-classic": "npm:3.6.3" + "@docusaurus/theme-common": "npm:3.6.3" + "@docusaurus/theme-search-algolia": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 31ebcdb4f319c556d51b54618137da82789ae0bcea9ada80c0e13bc515fb0d0ee118ffdb0740fe615199d1cc2f80399004c320477aa8dcdf7ec8b56382dd29f8 + checksum: bb94646f5e5d552787d2b2f2104071ef6ae178593445c08d8669e9150792706065e51df94d13e3907ee08d742d72bdffb48233f758b7864c0e0fbd238e22799b languageName: node linkType: hard @@ -3630,26 +5304,27 @@ __metadata: languageName: node linkType: hard -"@docusaurus/theme-classic@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/theme-classic@npm:3.0.1" - dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/mdx-loader": "npm:3.0.1" - "@docusaurus/module-type-aliases": "npm:3.0.1" - "@docusaurus/plugin-content-blog": "npm:3.0.1" - "@docusaurus/plugin-content-docs": "npm:3.0.1" - "@docusaurus/plugin-content-pages": "npm:3.0.1" - "@docusaurus/theme-common": "npm:3.0.1" - "@docusaurus/theme-translations": "npm:3.0.1" - "@docusaurus/types": "npm:3.0.1" - "@docusaurus/utils": "npm:3.0.1" - "@docusaurus/utils-common": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" +"@docusaurus/theme-classic@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/theme-classic@npm:3.6.3" + dependencies: + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/logger": "npm:3.6.3" + "@docusaurus/mdx-loader": "npm:3.6.3" + "@docusaurus/module-type-aliases": "npm:3.6.3" + "@docusaurus/plugin-content-blog": "npm:3.6.3" + "@docusaurus/plugin-content-docs": "npm:3.6.3" + "@docusaurus/plugin-content-pages": "npm:3.6.3" + "@docusaurus/theme-common": "npm:3.6.3" + "@docusaurus/theme-translations": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + "@docusaurus/utils-common": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" "@mdx-js/react": "npm:^3.0.0" clsx: "npm:^2.0.0" copy-text-to-clipboard: "npm:^3.2.0" - infima: "npm:0.2.0-alpha.43" + infima: "npm:0.2.0-alpha.45" lodash: "npm:^4.17.21" nprogress: "npm:^0.2.0" postcss: "npm:^8.4.26" @@ -3662,21 +5337,18 @@ __metadata: peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 24292dea657579523f458b4b61d5e52391e2ec9539b291b97aff62c4529cba1672e4a01d8328aac7362841e4299444e631c8feb452556ef76802a1810cc81e43 + checksum: cfc891ecb967ca39d2726df426bcb5ed1033153f276dc63e1d7f8b2a3587c6ed035630de92817464de8ad9392217d56698c4584559475fd19df0a3199cf42153 languageName: node linkType: hard -"@docusaurus/theme-common@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/theme-common@npm:3.0.1" - dependencies: - "@docusaurus/mdx-loader": "npm:3.0.1" - "@docusaurus/module-type-aliases": "npm:3.0.1" - "@docusaurus/plugin-content-blog": "npm:3.0.1" - "@docusaurus/plugin-content-docs": "npm:3.0.1" - "@docusaurus/plugin-content-pages": "npm:3.0.1" - "@docusaurus/utils": "npm:3.0.1" - "@docusaurus/utils-common": "npm:3.0.1" +"@docusaurus/theme-common@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/theme-common@npm:3.6.3" + dependencies: + "@docusaurus/mdx-loader": "npm:3.6.3" + "@docusaurus/module-type-aliases": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + "@docusaurus/utils-common": "npm:3.6.3" "@types/history": "npm:^4.7.11" "@types/react": "npm:*" "@types/react-router-config": "npm:*" @@ -3686,42 +5358,43 @@ __metadata: tslib: "npm:^2.6.0" utility-types: "npm:^3.10.0" peerDependencies: + "@docusaurus/plugin-content-docs": "*" react: ^18.0.0 react-dom: ^18.0.0 - checksum: 9d67dfc9ba4241414a94762a4f5ad62fa57db2be335ade0d44f9a27843b863c9be576052e70ba599b3d7439b98d19dac43c9788d0962d15d7517a739bd39eaaa + checksum: fdbab9ba549a10924f21cdfc53ebea43a514fef260981145e5b922a250959a042e29eaf3afeb633c703236902325bcd302b87ff92c587985c65eba5a3d111ddb languageName: node linkType: hard -"@docusaurus/theme-mermaid@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/theme-mermaid@npm:3.0.1" - dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/module-type-aliases": "npm:3.0.1" - "@docusaurus/theme-common": "npm:3.0.1" - "@docusaurus/types": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" - mermaid: "npm:^10.4.0" +"@docusaurus/theme-mermaid@npm:^3.6.3": + version: 3.6.3 + resolution: "@docusaurus/theme-mermaid@npm:3.6.3" + dependencies: + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/module-type-aliases": "npm:3.6.3" + "@docusaurus/theme-common": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" + mermaid: "npm:>=10.4" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 760446efa155fdb10777a61250db719c4b0d05eaa4b8fe45fed12101a51f8f46240029d979fc43b83dfc2280524489fe59ff2acdfaa231ce16f6caf87a63fcc6 + checksum: de5f068852e2231efe081aceb9f4830beeb559bde3c765e6c47db1c4a1907eb1dd557c4a0275b5babe97a5f61a8ba14b68ffb64b715b2e3ee282771ea2d7f760 languageName: node linkType: hard -"@docusaurus/theme-search-algolia@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/theme-search-algolia@npm:3.0.1" +"@docusaurus/theme-search-algolia@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/theme-search-algolia@npm:3.6.3" dependencies: "@docsearch/react": "npm:^3.5.2" - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/logger": "npm:3.0.1" - "@docusaurus/plugin-content-docs": "npm:3.0.1" - "@docusaurus/theme-common": "npm:3.0.1" - "@docusaurus/theme-translations": "npm:3.0.1" - "@docusaurus/utils": "npm:3.0.1" - "@docusaurus/utils-validation": "npm:3.0.1" + "@docusaurus/core": "npm:3.6.3" + "@docusaurus/logger": "npm:3.6.3" + "@docusaurus/plugin-content-docs": "npm:3.6.3" + "@docusaurus/theme-common": "npm:3.6.3" + "@docusaurus/theme-translations": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + "@docusaurus/utils-validation": "npm:3.6.3" algoliasearch: "npm:^4.18.0" algoliasearch-helper: "npm:^3.13.3" clsx: "npm:^2.0.0" @@ -3733,17 +5406,17 @@ __metadata: peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: c5b5dc54a010cef66a6a6e616a5f0c65b443c0f87156c1fea4ee58bc834e1eb2eacc0a00e1e3c15ca030567055071a9d4ee882681093c8c37d478cfc13fc26df + checksum: e26dccca3d215f19930279254a619f9c02d30aac192a9cfa99e25f750f9100f811e3b81db9d149bac10a5c467dafb92d8d15a28f865a8dd910c12335e2bad397 languageName: node linkType: hard -"@docusaurus/theme-translations@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/theme-translations@npm:3.0.1" +"@docusaurus/theme-translations@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/theme-translations@npm:3.6.3" dependencies: fs-extra: "npm:^11.1.1" tslib: "npm:^2.6.0" - checksum: 1f75dbff7c7835870d857f4f0a9c159d84678f13f31ed76cdade451aa08ab2db53bed983ee1e441e3c308387c63d56fb65ae32ef328cdae04f790e0166d72c2c + checksum: 90cf563d747b3b82eb549f4ab319e7f3a929baaeb3898531e5155847eeb5f4b09518a0e9b9a2bfdc25df770ca4afd73b4f029fcb14b6d5e3cb39b25f4b944959 languageName: node linkType: hard @@ -3757,10 +5430,10 @@ __metadata: languageName: node linkType: hard -"@docusaurus/tsconfig@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/tsconfig@npm:3.0.1" - checksum: d28f253f8d678c7650934ed3ee0390995a22ffb1b10fd8e15e4482517352b097a9a29bcd4a617d8722490ef299fe37d3162e542822bbbe53d5f1e1d5f8a921ce +"@docusaurus/tsconfig@npm:^3.6.3": + version: 3.6.3 + resolution: "@docusaurus/tsconfig@npm:3.6.3" + checksum: 0ff7af6e0fe267d22c2e1c439d887aef1668b626731b07b4053c6fb5377f0faeec74d69f30d139522f6de74ba73d4462242400564024faa7ab0076c3af83d5d9 languageName: node linkType: hard @@ -3783,22 +5456,23 @@ __metadata: languageName: node linkType: hard -"@docusaurus/types@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/types@npm:3.0.1" +"@docusaurus/types@npm:3.6.3, @docusaurus/types@npm:^3.6.3": + version: 3.6.3 + resolution: "@docusaurus/types@npm:3.6.3" dependencies: + "@mdx-js/mdx": "npm:^3.0.0" "@types/history": "npm:^4.7.11" "@types/react": "npm:*" commander: "npm:^5.1.0" joi: "npm:^17.9.2" react-helmet-async: "npm:^1.3.0" utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" + webpack: "npm:^5.95.0" webpack-merge: "npm:^5.9.0" peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 6ec48cb08f9b40a675816ceafc3a53c6dfdb61b8eea2cc289963c9dc5a5b57fa2e5b9e34e7c7d40c8c198260fe2c175c97ccd7bf1addd4adecea83a8becd303e + checksum: fb4fca87c7e25482ee08d0e70da28cd795cd29a54bae3e95868e7e670a37154e4751712663674d03ff0a060c8b84787f296f397eb36027caf91c1633ac22789d languageName: node linkType: hard @@ -3816,17 +5490,13 @@ __metadata: languageName: node linkType: hard -"@docusaurus/utils-common@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/utils-common@npm:3.0.1" +"@docusaurus/utils-common@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/utils-common@npm:3.6.3" dependencies: + "@docusaurus/types": "npm:3.6.3" tslib: "npm:^2.6.0" - peerDependencies: - "@docusaurus/types": "*" - peerDependenciesMeta: - "@docusaurus/types": - optional: true - checksum: 3c446655ddbda2052c08c46e6c06e68dab9d4203704aa5c81f29b38a57a636852a8e794dc4cbe4d11bf176e99d50a4db91ec8b650fc8ff55673d63066d246d97 + checksum: cf484b62541412a5706cbf8f8e7cc2f9bc1f0b4db33657b74fe2f02d1a3b4ba0349e99022d4aec6e1fecf76651316fce5a210172153b67a9ab16847c6ec00e6e languageName: node linkType: hard @@ -3843,16 +5513,19 @@ __metadata: languageName: node linkType: hard -"@docusaurus/utils-validation@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/utils-validation@npm:3.0.1" +"@docusaurus/utils-validation@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/utils-validation@npm:3.6.3" dependencies: - "@docusaurus/logger": "npm:3.0.1" - "@docusaurus/utils": "npm:3.0.1" + "@docusaurus/logger": "npm:3.6.3" + "@docusaurus/utils": "npm:3.6.3" + "@docusaurus/utils-common": "npm:3.6.3" + fs-extra: "npm:^11.2.0" joi: "npm:^17.9.2" js-yaml: "npm:^4.1.0" + lodash: "npm:^4.17.21" tslib: "npm:^2.6.0" - checksum: 874b761f4f59cbcc64f3b33a9e0cecdf0221686263237add53ac6cbf73db03b28252af86154f5546b3a2db1718a4287f2ed5eb9b4390da0a410778cadbf445ae + checksum: 8cfc1d223e71612180d09ad3027ea10c4447fc70ed4bf680b66f72f1bce7c74556a6029073fa6a6bc64ddbc03a9a1c9d708607e62ef0b86a033f35ab6a63ddf9 languageName: node linkType: hard @@ -3886,12 +5559,14 @@ __metadata: languageName: node linkType: hard -"@docusaurus/utils@npm:3.0.1": - version: 3.0.1 - resolution: "@docusaurus/utils@npm:3.0.1" +"@docusaurus/utils@npm:3.6.3": + version: 3.6.3 + resolution: "@docusaurus/utils@npm:3.6.3" dependencies: - "@docusaurus/logger": "npm:3.0.1" - "@svgr/webpack": "npm:^6.5.1" + "@docusaurus/logger": "npm:3.6.3" + "@docusaurus/types": "npm:3.6.3" + "@docusaurus/utils-common": "npm:3.6.3" + "@svgr/webpack": "npm:^8.1.0" escape-string-regexp: "npm:^4.0.0" file-loader: "npm:^6.2.0" fs-extra: "npm:^11.1.1" @@ -3902,17 +5577,14 @@ __metadata: js-yaml: "npm:^4.1.0" lodash: "npm:^4.17.21" micromatch: "npm:^4.0.5" + prompts: "npm:^2.4.2" resolve-pathname: "npm:^3.0.0" shelljs: "npm:^0.8.5" tslib: "npm:^2.6.0" url-loader: "npm:^4.1.1" + utility-types: "npm:^3.10.0" webpack: "npm:^5.88.1" - peerDependencies: - "@docusaurus/types": "*" - peerDependenciesMeta: - "@docusaurus/types": - optional: true - checksum: b15ff773b41a27dadd68a8d10476e77270de1133da0d102b536aa4a8ba758379aa77686002f283d7126365a39487bedafdc11f2c5cbfa088bb9061f4b0c05d99 + checksum: e665e067be8a440a93bec66e79f94735f8cfb21940df8f57c89f923d2a5c08fb29b35e0309370baec644281b0764034fe75642a976d1ae04392fe21b905df8bf languageName: node linkType: hard @@ -4523,6 +6195,28 @@ __metadata: languageName: node linkType: hard +"@iconify/types@npm:^2.0.0": + version: 2.0.0 + resolution: "@iconify/types@npm:2.0.0" + checksum: 65a3be43500c7ccacf360e136d00e1717f050b7b91da644e94370256ac66f582d59212bdb30d00788aab4fc078262e91c95b805d1808d654b72f6d2072a7e4b2 + languageName: node + linkType: hard + +"@iconify/utils@npm:^2.1.32": + version: 2.1.33 + resolution: "@iconify/utils@npm:2.1.33" + dependencies: + "@antfu/install-pkg": "npm:^0.4.0" + "@antfu/utils": "npm:^0.7.10" + "@iconify/types": "npm:^2.0.0" + debug: "npm:^4.3.6" + kolorist: "npm:^1.8.0" + local-pkg: "npm:^0.5.0" + mlly: "npm:^1.7.1" + checksum: 86faf1abee78ba75cbb7d8cdd454f7a8da11d46913a8108c4c1f49243870ef787a2ef00e574e1cfff0f70e1f7bbe4ced2ffc7436baf95bfd66e52802e187bc13 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -4571,6 +6265,17 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb + languageName: node + linkType: hard + "@jridgewell/resolve-uri@npm:^3.0.3": version: 3.1.0 resolution: "@jridgewell/resolve-uri@npm:3.1.0" @@ -4592,6 +6297,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + "@jridgewell/source-map@npm:^0.3.2": version: 0.3.2 resolution: "@jridgewell/source-map@npm:0.3.2" @@ -4636,6 +6348,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.14 resolution: "@jridgewell/trace-mapping@npm:0.3.14" @@ -4753,6 +6475,15 @@ __metadata: languageName: node linkType: hard +"@mermaid-js/parser@npm:^0.3.0": + version: 0.3.0 + resolution: "@mermaid-js/parser@npm:0.3.0" + dependencies: + langium: "npm:3.0.0" + checksum: 88c08fb20256ce779fea2151500c017bffd8a970b8d2c6ead81b5ff14787877b16c75b43f503dd5365e4eb33d0b7d5a7d9fff852cff56eb67b3b6508f44576b7 + languageName: node + linkType: hard + "@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0": version: 1.4.2 resolution: "@noble/curves@npm:1.4.2" @@ -6131,6 +7862,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a50bd0baa34faf16bcba712091f94c7f0e230431fe99a9dfc3401fa92823ad3f68495b86ab9bf9044b53839e8c416cfbb37eb3f246ff33f261e0fa9ee1779c5b + languageName: node + linkType: hard + "@svgr/babel-plugin-add-jsx-attribute@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:6.5.1" @@ -6140,7 +7880,7 @@ __metadata: languageName: node linkType: hard -"@svgr/babel-plugin-remove-jsx-attribute@npm:*": +"@svgr/babel-plugin-remove-jsx-attribute@npm:*, @svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0": version: 8.0.0 resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0" peerDependencies: @@ -6149,7 +7889,7 @@ __metadata: languageName: node linkType: hard -"@svgr/babel-plugin-remove-jsx-empty-expression@npm:*": +"@svgr/babel-plugin-remove-jsx-empty-expression@npm:*, @svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0": version: 8.0.0 resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0" peerDependencies: @@ -6158,6 +7898,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 004bd1892053b7e9c1b0bb14acc44e77634ec393722b87b1e4fae53e2c35122a2dd0d5c15e9070dbeec274e22e7693a2b8b48506733a8009ee92b12946fcb10a + languageName: node + linkType: hard + "@svgr/babel-plugin-replace-jsx-attribute-value@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:6.5.1" @@ -6167,6 +7916,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 80e0a7fcf902f984c705051ca5c82ea6050ccbb70b651a8fea6d0eb5809e4dac274b49ea6be2d87f1eb9dfc0e2d6cdfffe1669ec2117f44b67a60a07d4c0b8b8 + languageName: node + linkType: hard + "@svgr/babel-plugin-svg-dynamic-title@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:6.5.1" @@ -6176,6 +7934,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 73e92c8277a89279745c0c500f59f083279a8dc30cd552b22981fade2a77628fb2bd2819ee505725fcd2e93f923e3790b52efcff409a159e657b46604a0b9a21 + languageName: node + linkType: hard + "@svgr/babel-plugin-svg-em-dimensions@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:6.5.1" @@ -6185,6 +7952,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 655ed6bc7a208ceaa4ecff0a54ccc36008c3cb31efa90d11e171cab325ebbb21aa78f09c7b65f9b3ddeda3a85f348c0c862902c48be13c14b4de165c847974e3 + languageName: node + linkType: hard + "@svgr/babel-plugin-transform-react-native-svg@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:6.5.1" @@ -6194,6 +7970,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-transform-svg-component@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-transform-svg-component@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 4ac00bb99a3db4ef05e4362f116a3c608ee365a2d26cf7318d8d41a4a5b30a02c80455cce0e62c65b60ed815b5d632bedabac2ccd4b56f998fadef5286e3ded4 + languageName: node + linkType: hard + "@svgr/babel-plugin-transform-svg-component@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/babel-plugin-transform-svg-component@npm:6.5.1" @@ -6203,6 +7988,24 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-preset@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/babel-preset@npm:8.1.0" + dependencies: + "@svgr/babel-plugin-add-jsx-attribute": "npm:8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute": "npm:8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression": "npm:8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value": "npm:8.0.0" + "@svgr/babel-plugin-svg-dynamic-title": "npm:8.0.0" + "@svgr/babel-plugin-svg-em-dimensions": "npm:8.0.0" + "@svgr/babel-plugin-transform-react-native-svg": "npm:8.1.0" + "@svgr/babel-plugin-transform-svg-component": "npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 49367d3ad0831f79b1056871b91766246f449d4d1168623af5e283fbaefce4a01d77ab00de6b045b55e956f9aae27895823198493cd232d88d3435ea4517ffc5 + languageName: node + linkType: hard + "@svgr/babel-preset@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/babel-preset@npm:6.5.1" @@ -6221,6 +8024,19 @@ __metadata: languageName: node linkType: hard +"@svgr/core@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/core@npm:8.1.0" + dependencies: + "@babel/core": "npm:^7.21.3" + "@svgr/babel-preset": "npm:8.1.0" + camelcase: "npm:^6.2.0" + cosmiconfig: "npm:^8.1.3" + snake-case: "npm:^3.0.4" + checksum: 6a2f6b1bc79bce39f66f088d468985d518005fc5147ebf4f108570a933818b5951c2cb7da230ddff4b7c8028b5a672b2d33aa2acce012b8b9770073aa5a2d041 + languageName: node + linkType: hard + "@svgr/core@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/core@npm:6.5.1" @@ -6234,6 +8050,16 @@ __metadata: languageName: node linkType: hard +"@svgr/hast-util-to-babel-ast@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/hast-util-to-babel-ast@npm:8.0.0" + dependencies: + "@babel/types": "npm:^7.21.3" + entities: "npm:^4.4.0" + checksum: f4165b583ba9eaf6719e598977a7b3ed182f177983e55f9eb55a6a73982d81277510e9eb7ab41f255151fb9ed4edd11ac4bef95dd872f04ed64966d8c85e0f79 + languageName: node + linkType: hard + "@svgr/hast-util-to-babel-ast@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/hast-util-to-babel-ast@npm:6.5.1" @@ -6244,6 +8070,20 @@ __metadata: languageName: node linkType: hard +"@svgr/plugin-jsx@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/plugin-jsx@npm:8.1.0" + dependencies: + "@babel/core": "npm:^7.21.3" + "@svgr/babel-preset": "npm:8.1.0" + "@svgr/hast-util-to-babel-ast": "npm:8.0.0" + svg-parser: "npm:^2.0.4" + peerDependencies: + "@svgr/core": "*" + checksum: 07b4d9e00de795540bf70556fa2cc258774d01e97a12a26234c6fdf42b309beb7c10f31ee24d1a71137239347b1547b8bb5587d3a6de10669f95dcfe99cddc56 + languageName: node + linkType: hard + "@svgr/plugin-jsx@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/plugin-jsx@npm:6.5.1" @@ -6258,6 +8098,19 @@ __metadata: languageName: node linkType: hard +"@svgr/plugin-svgo@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/plugin-svgo@npm:8.1.0" + dependencies: + cosmiconfig: "npm:^8.1.3" + deepmerge: "npm:^4.3.1" + svgo: "npm:^3.0.2" + peerDependencies: + "@svgr/core": "*" + checksum: bfd25460f23f1548bfb8f6f3bedd6d6972c1a4f8881bd35a4f8c115218da6e999e8f9ac0ef0ed88c4e0b93fcec37f382b94c0322f4ec2b26752a89e5cc8b9d7a + languageName: node + linkType: hard + "@svgr/plugin-svgo@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/plugin-svgo@npm:6.5.1" @@ -6287,6 +8140,22 @@ __metadata: languageName: node linkType: hard +"@svgr/webpack@npm:^8.1.0": + version: 8.1.0 + resolution: "@svgr/webpack@npm:8.1.0" + dependencies: + "@babel/core": "npm:^7.21.3" + "@babel/plugin-transform-react-constant-elements": "npm:^7.21.3" + "@babel/preset-env": "npm:^7.20.2" + "@babel/preset-react": "npm:^7.18.6" + "@babel/preset-typescript": "npm:^7.21.0" + "@svgr/core": "npm:8.1.0" + "@svgr/plugin-jsx": "npm:8.1.0" + "@svgr/plugin-svgo": "npm:8.1.0" + checksum: 4c1cac45bd5890de8643e5a7bfb71f3bcd8b85ae5bbacf10b8ad9f939b7a98e8d601c3ada204ffb95223abf4a24beeac5a2a0d6928a52a1ab72a29da3c015c22 + languageName: node + linkType: hard + "@swc/helpers@npm:^0.5.11": version: 0.5.12 resolution: "@swc/helpers@npm:0.5.12" @@ -6398,14 +8267,176 @@ __metadata: languageName: node linkType: hard -"@types/d3-scale-chromatic@npm:^3.0.0": +"@types/d3-array@npm:*": + version: 3.2.1 + resolution: "@types/d3-array@npm:3.2.1" + checksum: 38bf2c778451f4b79ec81a2288cb4312fe3d6449ecdf562970cc339b60f280f31c93a024c7ff512607795e79d3beb0cbda123bb07010167bce32927f71364bca + languageName: node + linkType: hard + +"@types/d3-axis@npm:*": + version: 3.0.6 + resolution: "@types/d3-axis@npm:3.0.6" + dependencies: + "@types/d3-selection": "npm:*" + checksum: d756d42360261f44d8eefd0950c5bb0a4f67a46dd92069da3f723ac36a1e8cb2b9ce6347d836ef19d5b8aef725dbcf8fdbbd6cfbff676ca4b0642df2f78b599a + languageName: node + linkType: hard + +"@types/d3-brush@npm:*": + version: 3.0.6 + resolution: "@types/d3-brush@npm:3.0.6" + dependencies: + "@types/d3-selection": "npm:*" + checksum: fd6e2ac7657a354f269f6b9c58451ffae9d01b89ccb1eb6367fd36d635d2f1990967215ab498e0c0679ff269429c57fad6a2958b68f4d45bc9f81d81672edc01 + languageName: node + linkType: hard + +"@types/d3-chord@npm:*": + version: 3.0.6 + resolution: "@types/d3-chord@npm:3.0.6" + checksum: c5a25eb5389db01e63faec0c5c2ec7cc41c494e9b3201630b494c4e862a60f1aa83fabbc33a829e7e1403941e3c30d206c741559b14406ac2a4239cfdf4b4c17 + languageName: node + linkType: hard + +"@types/d3-color@npm:*": + version: 3.1.3 + resolution: "@types/d3-color@npm:3.1.3" + checksum: 65eb0487de606eb5ad81735a9a5b3142d30bc5ea801ed9b14b77cb14c9b909f718c059f13af341264ee189acf171508053342142bdf99338667cea26a2d8d6ae + languageName: node + linkType: hard + +"@types/d3-contour@npm:*": + version: 3.0.6 + resolution: "@types/d3-contour@npm:3.0.6" + dependencies: + "@types/d3-array": "npm:*" + "@types/geojson": "npm:*" + checksum: e7d83e94719af4576ceb5ac7f277c5806f83ba6c3631744ae391cffc3641f09dfa279470b83053cd0b2acd6784e8749c71141d05bdffa63ca58ffb5b31a0f27c + languageName: node + linkType: hard + +"@types/d3-delaunay@npm:*": + version: 6.0.4 + resolution: "@types/d3-delaunay@npm:6.0.4" + checksum: d154a8864f08c4ea23ecb9bdabcef1c406a25baa8895f0cb08a0ed2799de0d360e597552532ce7086ff0cdffa8f3563f9109d18f0191459d32bb620a36939123 + languageName: node + linkType: hard + +"@types/d3-dispatch@npm:*": + version: 3.0.6 + resolution: "@types/d3-dispatch@npm:3.0.6" + checksum: 405eb7d0ec139fbf72fa6a43b0f3ca8a1f913bb2cb38f607827e63fca8d4393f021f32f3b96b33c93ddbd37789453a0b3624f14f504add5308fd9aec8a46dda0 + languageName: node + linkType: hard + +"@types/d3-drag@npm:*": + version: 3.0.7 + resolution: "@types/d3-drag@npm:3.0.7" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 65e29fa32a87c72d26c44b5e2df3bf15af21cd128386bcc05bcacca255927c0397d0cd7e6062aed5f0abd623490544a9d061c195f5ed9f018fe0b698d99c079d + languageName: node + linkType: hard + +"@types/d3-dsv@npm:*": + version: 3.0.7 + resolution: "@types/d3-dsv@npm:3.0.7" + checksum: c0f01da862465594c8a28278b51c850af3b4239cc22b14fd1a19d7a98f93d94efa477bf59d8071beb285dca45bf614630811451e18e7c52add3a0abfee0a1871 + languageName: node + linkType: hard + +"@types/d3-ease@npm:*": + version: 3.0.2 + resolution: "@types/d3-ease@npm:3.0.2" + checksum: aff5a1e572a937ee9bff6465225d7ba27d5e0c976bd9eacdac2e6f10700a7cb0c9ea2597aff6b43a6ed850a3210030870238894a77ec73e309b4a9d0333f099c + languageName: node + linkType: hard + +"@types/d3-fetch@npm:*": + version: 3.0.7 + resolution: "@types/d3-fetch@npm:3.0.7" + dependencies: + "@types/d3-dsv": "npm:*" + checksum: 3d147efa52a26da1a5d40d4d73e6cebaaa964463c378068062999b93ea3731b27cc429104c21ecbba98c6090e58ef13429db6399238c5e3500162fb3015697a0 + languageName: node + linkType: hard + +"@types/d3-force@npm:*": + version: 3.0.10 + resolution: "@types/d3-force@npm:3.0.10" + checksum: c82b459079a106b50e346c9b79b141f599f2fc4f598985a5211e72c7a2e20d35bd5dc6e91f306b323c8bfa325c02c629b1645f5243f1c6a55bd51bc85cccfa92 + languageName: node + linkType: hard + +"@types/d3-format@npm:*": + version: 3.0.4 + resolution: "@types/d3-format@npm:3.0.4" + checksum: 3ac1600bf9061a59a228998f7cd3f29e85cbf522997671ba18d4d84d10a2a1aff4f95aceb143fa9960501c3ec351e113fc75884e6a504ace44dc1744083035ee + languageName: node + linkType: hard + +"@types/d3-geo@npm:*": + version: 3.1.0 + resolution: "@types/d3-geo@npm:3.1.0" + dependencies: + "@types/geojson": "npm:*" + checksum: 3745a93439038bb5b0b38facf435f7079812921d46406f5d38deaee59e90084ff742443c7ea0a8446df81a0d81eaf622fe7068cf4117a544bd4aa3b2dc182f88 + languageName: node + linkType: hard + +"@types/d3-hierarchy@npm:*": + version: 3.1.7 + resolution: "@types/d3-hierarchy@npm:3.1.7" + checksum: 873711737d6b8e7b6f1dda0bcd21294a48f75024909ae510c5d2c21fad2e72032e0958def4d9f68319d3aaac298ad09c49807f8bfc87a145a82693b5208613c7 + languageName: node + linkType: hard + +"@types/d3-interpolate@npm:*": + version: 3.0.4 + resolution: "@types/d3-interpolate@npm:3.0.4" + dependencies: + "@types/d3-color": "npm:*" + checksum: 066ebb8da570b518dd332df6b12ae3b1eaa0a7f4f0c702e3c57f812cf529cc3500ec2aac8dc094f31897790346c6b1ebd8cd7a077176727f4860c2b181a65ca4 + languageName: node + linkType: hard + +"@types/d3-path@npm:*": + version: 3.1.0 + resolution: "@types/d3-path@npm:3.1.0" + checksum: 85e8b3aa968a60a5b33198ade06ae7ffedcf9a22d86f24859ff58e014b053ccb7141ec163b78d547bc8215bb12bb54171c666057ab6156912814005b686afb31 + languageName: node + linkType: hard + +"@types/d3-polygon@npm:*": version: 3.0.2 - resolution: "@types/d3-scale-chromatic@npm:3.0.2" - checksum: 70ae293f98d043028debd817a5145ce2cb8507ab6b125985978d6c36b1a78bdae6cec3e471181a8b2f80c225669769d1b691ebfa28f04b26f7ccbf5dd83cdca3 + resolution: "@types/d3-polygon@npm:3.0.2" + checksum: f46307bb32b6c2aef8c7624500e0f9b518de8f227ccc10170b869dc43e4c542560f6c8d62e9f087fac45e198d6e4b623e579c0422e34c85baf56717456d3f439 + languageName: node + linkType: hard + +"@types/d3-quadtree@npm:*": + version: 3.0.6 + resolution: "@types/d3-quadtree@npm:3.0.6" + checksum: 7eaa0a4d404adc856971c9285e1c4ab17e9135ea669d847d6db7e0066126a28ac751864e7ce99c65d526e130f56754a2e437a1617877098b3bdcc3ef23a23616 + languageName: node + linkType: hard + +"@types/d3-random@npm:*": + version: 3.0.3 + resolution: "@types/d3-random@npm:3.0.3" + checksum: 5f4fea40080cd6d4adfee05183d00374e73a10c530276a6455348983dda341003a251def28565a27c25d9cf5296a33e870e397c9d91ff83fb7495a21c96b6882 + languageName: node + linkType: hard + +"@types/d3-scale-chromatic@npm:*": + version: 3.1.0 + resolution: "@types/d3-scale-chromatic@npm:3.1.0" + checksum: 93c564e02d2e97a048e18fe8054e4a935335da6ab75a56c3df197beaa87e69122eef0dfbeb7794d4a444a00e52e3123514ee27cec084bd21f6425b7037828cc2 languageName: node linkType: hard -"@types/d3-scale@npm:^4.0.3": +"@types/d3-scale@npm:*": version: 4.0.8 resolution: "@types/d3-scale@npm:4.0.8" dependencies: @@ -6414,6 +8445,29 @@ __metadata: languageName: node linkType: hard +"@types/d3-selection@npm:*": + version: 3.0.11 + resolution: "@types/d3-selection@npm:3.0.11" + checksum: 0c512956c7503ff5def4bb32e0c568cc757b9a2cc400a104fc0f4cfe5e56d83ebde2a97821b6f2cb26a7148079d3b86a2f28e11d68324ed311cf35c2ed980d1d + languageName: node + linkType: hard + +"@types/d3-shape@npm:*": + version: 3.1.6 + resolution: "@types/d3-shape@npm:3.1.6" + dependencies: + "@types/d3-path": "npm:*" + checksum: 0625715925d3c7ed3d44ce998b42c993f063c31605b6e4a8046c4be0fe724e2d214fc83e86d04f429a30a6e1f439053e92b0d9e59e1180c3a5327b4a6e79fa0a + languageName: node + linkType: hard + +"@types/d3-time-format@npm:*": + version: 4.0.3 + resolution: "@types/d3-time-format@npm:4.0.3" + checksum: 9ef5e8e2b96b94799b821eed5d61a3d432c7903247966d8ad951b8ce5797fe46554b425cb7888fa5bf604b4663c369d7628c0328ffe80892156671c58d1a7f90 + languageName: node + linkType: hard + "@types/d3-time@npm:*": version: 3.0.3 resolution: "@types/d3-time@npm:3.0.3" @@ -6421,6 +8475,70 @@ __metadata: languageName: node linkType: hard +"@types/d3-timer@npm:*": + version: 3.0.2 + resolution: "@types/d3-timer@npm:3.0.2" + checksum: c644dd9571fcc62b1aa12c03bcad40571553020feeb5811f1d8a937ac1e65b8a04b759b4873aef610e28b8714ac71c9885a4d6c127a048d95118f7e5b506d9e1 + languageName: node + linkType: hard + +"@types/d3-transition@npm:*": + version: 3.0.9 + resolution: "@types/d3-transition@npm:3.0.9" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 4f68b9df7ac745b3491216c54203cbbfa0f117ae4c60e2609cdef2db963582152035407fdff995b10ee383bae2f05b7743493f48e1b8e46df54faa836a8fb7b5 + languageName: node + linkType: hard + +"@types/d3-zoom@npm:*": + version: 3.0.8 + resolution: "@types/d3-zoom@npm:3.0.8" + dependencies: + "@types/d3-interpolate": "npm:*" + "@types/d3-selection": "npm:*" + checksum: 1dbdbcafddcae12efb5beb6948546963f29599e18bc7f2a91fb69cc617c2299a65354f2d47e282dfb86fec0968406cd4fb7f76ba2d2fb67baa8e8d146eb4a547 + languageName: node + linkType: hard + +"@types/d3@npm:^7.4.3": + version: 7.4.3 + resolution: "@types/d3@npm:7.4.3" + dependencies: + "@types/d3-array": "npm:*" + "@types/d3-axis": "npm:*" + "@types/d3-brush": "npm:*" + "@types/d3-chord": "npm:*" + "@types/d3-color": "npm:*" + "@types/d3-contour": "npm:*" + "@types/d3-delaunay": "npm:*" + "@types/d3-dispatch": "npm:*" + "@types/d3-drag": "npm:*" + "@types/d3-dsv": "npm:*" + "@types/d3-ease": "npm:*" + "@types/d3-fetch": "npm:*" + "@types/d3-force": "npm:*" + "@types/d3-format": "npm:*" + "@types/d3-geo": "npm:*" + "@types/d3-hierarchy": "npm:*" + "@types/d3-interpolate": "npm:*" + "@types/d3-path": "npm:*" + "@types/d3-polygon": "npm:*" + "@types/d3-quadtree": "npm:*" + "@types/d3-random": "npm:*" + "@types/d3-scale": "npm:*" + "@types/d3-scale-chromatic": "npm:*" + "@types/d3-selection": "npm:*" + "@types/d3-shape": "npm:*" + "@types/d3-time": "npm:*" + "@types/d3-time-format": "npm:*" + "@types/d3-timer": "npm:*" + "@types/d3-transition": "npm:*" + "@types/d3-zoom": "npm:*" + checksum: a9c6d65b13ef3b42c87f2a89ea63a6d5640221869f97d0657b0cb2f1dac96a0f164bf5605643c0794e0de3aa2bf05df198519aaf15d24ca135eb0e8bd8a9d879 + languageName: node + linkType: hard + "@types/debug@npm:^4.0.0": version: 4.1.12 resolution: "@types/debug@npm:4.1.12" @@ -6440,6 +8558,16 @@ __metadata: languageName: node linkType: hard +"@types/eslint-scope@npm:^3.7.7": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "npm:*" + "@types/estree": "npm:*" + checksum: a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc + languageName: node + linkType: hard + "@types/eslint@npm:*": version: 8.4.5 resolution: "@types/eslint@npm:8.4.5" @@ -6473,6 +8601,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.18": version: 4.17.30 resolution: "@types/express-serve-static-core@npm:4.17.30" @@ -6496,6 +8631,13 @@ __metadata: languageName: node linkType: hard +"@types/geojson@npm:*": + version: 7946.0.14 + resolution: "@types/geojson@npm:7946.0.14" + checksum: 54f3997708fa2970c03eeb31f7e4540a0eb6387b15e9f8a60513a1409c23cafec8d618525404573468b59c6fecbfd053724b3327f7fca416729c26271d799f55 + languageName: node + linkType: hard + "@types/gtag.js@npm:^0.0.12": version: 0.0.12 resolution: "@types/gtag.js@npm:0.0.12" @@ -6597,15 +8739,6 @@ __metadata: languageName: node linkType: hard -"@types/mdast@npm:^3.0.0": - version: 3.0.10 - resolution: "@types/mdast@npm:3.0.10" - dependencies: - "@types/unist": "npm:*" - checksum: 375f08b3910505291b2815d9edf55dca63c6c4ec58dd33c866521e68905fd4e8fe83b397e167af2cdd3799b851a7e02817d58610cfb814aee20bf3c52d87be9b - languageName: node - linkType: hard - "@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.2": version: 4.0.3 resolution: "@types/mdast@npm:4.0.3" @@ -6872,6 +9005,13 @@ __metadata: languageName: node linkType: hard +"@types/trusted-types@npm:^2.0.7": + version: 2.0.7 + resolution: "@types/trusted-types@npm:2.0.7" + checksum: 4c4855f10de7c6c135e0d32ce462419d8abbbc33713b31d294596c0cc34ae1fa6112a2f9da729c8f7a20707782b0d69da3b1f8df6645b0366d08825ca1522e0c + languageName: node + linkType: hard + "@types/unist@npm:*, @types/unist@npm:^2.0.0": version: 2.0.6 resolution: "@types/unist@npm:2.0.6" @@ -6960,6 +9100,16 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.12.1": + version: 1.14.1 + resolution: "@webassemblyjs/ast@npm:1.14.1" + dependencies: + "@webassemblyjs/helper-numbers": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + checksum: 67a59be8ed50ddd33fbb2e09daa5193ac215bf7f40a9371be9a0d9797a114d0d1196316d2f3943efdb923a3d809175e1563a3cb80c814fb8edccd1e77494972b + languageName: node + linkType: hard + "@webassemblyjs/floating-point-hex-parser@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" @@ -6967,6 +9117,13 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" + checksum: 0e88bdb8b50507d9938be64df0867f00396b55eba9df7d3546eb5dc0ca64d62e06f8d881ec4a6153f2127d0f4c11d102b6e7d17aec2f26bb5ff95a5e60652412 + languageName: node + linkType: hard + "@webassemblyjs/helper-api-error@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" @@ -6974,6 +9131,13 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/helper-api-error@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" + checksum: 31be497f996ed30aae4c08cac3cce50c8dcd5b29660383c0155fce1753804fc55d47fcba74e10141c7dd2899033164e117b3bcfcda23a6b043e4ded4f1003dfb + languageName: node + linkType: hard + "@webassemblyjs/helper-buffer@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/helper-buffer@npm:1.11.6" @@ -6981,6 +9145,13 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/helper-buffer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" + checksum: 0d54105dc373c0fe6287f1091e41e3a02e36cdc05e8cf8533cdc16c59ff05a646355415893449d3768cda588af451c274f13263300a251dc11a575bc4c9bd210 + languageName: node + linkType: hard + "@webassemblyjs/helper-numbers@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" @@ -6992,6 +9163,17 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/helper-numbers@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" + dependencies: + "@webassemblyjs/floating-point-hex-parser": "npm:1.13.2" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@xtuc/long": "npm:4.2.2" + checksum: 9c46852f31b234a8fb5a5a9d3f027bc542392a0d4de32f1a9c0075d5e8684aa073cb5929b56df565500b3f9cc0a2ab983b650314295b9bf208d1a1651bfc825a + languageName: node + linkType: hard + "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" @@ -6999,6 +9181,13 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" + checksum: c4355d14f369b30cf3cbdd3acfafc7d0488e086be6d578e3c9780bd1b512932352246be96e034e2a7fcfba4f540ec813352f312bfcbbfe5bcfbf694f82ccc682 + languageName: node + linkType: hard + "@webassemblyjs/helper-wasm-section@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.6" @@ -7011,6 +9200,18 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/helper-wasm-section@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + checksum: 1f9b33731c3c6dbac3a9c483269562fa00d1b6a4e7133217f40e83e975e636fd0f8736e53abd9a47b06b66082ecc976c7384391ab0a68e12d509ea4e4b948d64 + languageName: node + linkType: hard + "@webassemblyjs/ieee754@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/ieee754@npm:1.11.6" @@ -7020,6 +9221,15 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/ieee754@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/ieee754@npm:1.13.2" + dependencies: + "@xtuc/ieee754": "npm:^1.2.0" + checksum: 2e732ca78c6fbae3c9b112f4915d85caecdab285c0b337954b180460290ccd0fb00d2b1dc4bb69df3504abead5191e0d28d0d17dfd6c9d2f30acac8c4961c8a7 + languageName: node + linkType: hard + "@webassemblyjs/leb128@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/leb128@npm:1.11.6" @@ -7029,6 +9239,15 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/leb128@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/leb128@npm:1.13.2" + dependencies: + "@xtuc/long": "npm:4.2.2" + checksum: dad5ef9e383c8ab523ce432dfd80098384bf01c45f70eb179d594f85ce5db2f80fa8c9cba03adafd85684e6d6310f0d3969a882538975989919329ac4c984659 + languageName: node + linkType: hard + "@webassemblyjs/utf8@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/utf8@npm:1.11.6" @@ -7036,6 +9255,13 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/utf8@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/utf8@npm:1.13.2" + checksum: d3fac9130b0e3e5a1a7f2886124a278e9323827c87a2b971e6d0da22a2ba1278ac9f66a4f2e363ecd9fac8da42e6941b22df061a119e5c0335f81006de9ee799 + languageName: node + linkType: hard + "@webassemblyjs/wasm-edit@npm:^1.11.5": version: 1.11.6 resolution: "@webassemblyjs/wasm-edit@npm:1.11.6" @@ -7052,6 +9278,22 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wasm-edit@npm:^1.12.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/helper-wasm-section": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-opt": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + "@webassemblyjs/wast-printer": "npm:1.14.1" + checksum: 5ac4781086a2ca4b320bdbfd965a209655fe8a208ca38d89197148f8597e587c9a2c94fb6bd6f1a7dbd4527c49c6844fcdc2af981f8d793a97bf63a016aa86d2 + languageName: node + linkType: hard + "@webassemblyjs/wasm-gen@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/wasm-gen@npm:1.11.6" @@ -7065,6 +9307,19 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wasm-gen@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: d678810d7f3f8fecb2e2bdadfb9afad2ec1d2bc79f59e4711ab49c81cec578371e22732d4966f59067abe5fba8e9c54923b57060a729d28d408e608beef67b10 + languageName: node + linkType: hard + "@webassemblyjs/wasm-opt@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/wasm-opt@npm:1.11.6" @@ -7077,6 +9332,18 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wasm-opt@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + checksum: 515bfb15277ee99ba6b11d2232ddbf22aed32aad6d0956fe8a0a0a004a1b5a3a277a71d9a3a38365d0538ac40d1b7b7243b1a244ad6cd6dece1c1bb2eb5de7ee + languageName: node + linkType: hard + "@webassemblyjs/wasm-parser@npm:1.11.6, @webassemblyjs/wasm-parser@npm:^1.11.5": version: 1.11.6 resolution: "@webassemblyjs/wasm-parser@npm:1.11.6" @@ -7091,6 +9358,20 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.12.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 95427b9e5addbd0f647939bd28e3e06b8deefdbdadcf892385b5edc70091bf9b92fa5faac3fce8333554437c5d85835afef8c8a7d9d27ab6ba01ffab954db8c6 + languageName: node + linkType: hard + "@webassemblyjs/wast-printer@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/wast-printer@npm:1.11.6" @@ -7101,6 +9382,16 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wast-printer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wast-printer@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@xtuc/long": "npm:4.2.2" + checksum: 8d7768608996a052545251e896eac079c98e0401842af8dd4de78fba8d90bd505efb6c537e909cd6dae96e09db3fa2e765a6f26492553a675da56e2db51f9d24 + languageName: node + linkType: hard + "@xtuc/ieee754@npm:^1.2.0": version: 1.2.0 resolution: "@xtuc/ieee754@npm:1.2.0" @@ -7225,6 +9516,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.14.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 + languageName: node + linkType: hard + "address@npm:^1.0.1, address@npm:^1.1.2": version: 1.2.0 resolution: "address@npm:1.2.0" @@ -7290,7 +9590,7 @@ __metadata: languageName: node linkType: hard -"ajv-keywords@npm:^5.0.0": +"ajv-keywords@npm:^5.0.0, ajv-keywords@npm:^5.1.0": version: 5.1.0 resolution: "ajv-keywords@npm:5.1.0" dependencies: @@ -7325,6 +9625,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^8.9.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 + languageName: node + linkType: hard + "algoliasearch-helper@npm:^3.13.3": version: 3.15.0 resolution: "algoliasearch-helper@npm:3.15.0" @@ -7367,6 +9679,15 @@ __metadata: languageName: node linkType: hard +"ansi-escapes@npm:^4.3.2": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + "ansi-html-community@npm:^0.0.8": version: 0.0.8 resolution: "ansi-html-community@npm:0.0.8" @@ -7556,6 +9877,24 @@ __metadata: languageName: node linkType: hard +"autoprefixer@npm:^10.4.19": + version: 10.4.20 + resolution: "autoprefixer@npm:10.4.20" + dependencies: + browserslist: "npm:^4.23.3" + caniuse-lite: "npm:^1.0.30001646" + fraction.js: "npm:^4.3.7" + normalize-range: "npm:^0.1.2" + picocolors: "npm:^1.0.1" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.1.0 + bin: + autoprefixer: bin/autoprefixer + checksum: e1f00978a26e7c5b54ab12036d8c13833fad7222828fc90914771b1263f51b28c7ddb5803049de4e77696cbd02bb25cfc3634e80533025bb26c26aacdf938940 + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" @@ -7613,6 +9952,19 @@ __metadata: languageName: node linkType: hard +"babel-loader@npm:^9.2.1": + version: 9.2.1 + resolution: "babel-loader@npm:9.2.1" + dependencies: + find-cache-dir: "npm:^4.0.0" + schema-utils: "npm:^4.0.0" + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: efb82faff4c7c27e9c15bb28bf11c73200e61cf365118a9514e8d74dd489d0afc2a0d5aaa62cb4254eefc2ab631579224d95a03fd245410f28ea75e24de54ba4 + languageName: node + linkType: hard + "babel-plugin-dynamic-import-node@npm:^2.3.3": version: 2.3.3 resolution: "babel-plugin-dynamic-import-node@npm:2.3.3" @@ -7622,6 +9974,19 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.12 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.12" + dependencies: + "@babel/compat-data": "npm:^7.22.6" + "@babel/helper-define-polyfill-provider": "npm:^0.6.3" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 49150c310de2d472ecb95bd892bca1aa833cf5e84bbb76e3e95cf9ff2c6c8c3b3783dd19d70ba50ff6235eb8ce1fa1c0affe491273c95a1ef6a2923f4d5a3819 + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs2@npm:^0.4.6": version: 0.4.6 resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6" @@ -7635,6 +10000,18 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs3@npm:^0.10.6": + version: 0.10.6 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + core-js-compat: "npm:^3.38.0" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 3a69220471b07722c2ae6537310bf26b772514e12b601398082965459c838be70a0ca70b0662f0737070654ff6207673391221d48599abb4a2b27765206d9f79 + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs3@npm:^0.8.5": version: 0.8.6 resolution: "babel-plugin-polyfill-corejs3@npm:0.8.6" @@ -7658,6 +10035,17 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.3 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.3" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.3" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 40164432e058e4b5c6d56feecacdad22692ae0534bd80c92d5399ed9e1a6a2b6797c8fda837995daddd4ca391f9aa2d58c74ad465164922e0f73631eaf9c4f76 + languageName: node + linkType: hard + "bail@npm:^2.0.0": version: 2.0.2 resolution: "bail@npm:2.0.2" @@ -7981,17 +10369,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.22.2": - version: 4.22.2 - resolution: "browserslist@npm:4.22.2" +"browserslist@npm:^4.23.0, browserslist@npm:^4.23.1, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0, browserslist@npm:^4.24.2": + version: 4.24.2 + resolution: "browserslist@npm:4.24.2" dependencies: - caniuse-lite: "npm:^1.0.30001565" - electron-to-chromium: "npm:^1.4.601" - node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.13" + caniuse-lite: "npm:^1.0.30001669" + electron-to-chromium: "npm:^1.5.41" + node-releases: "npm:^2.0.18" + update-browserslist-db: "npm:^1.1.1" bin: browserslist: cli.js - checksum: 2a331aab90503130043ca41dd5d281fa1e89d5e076d07a2d75e76bf4d693bd56e73d5abcd8c4f39119da6328d450578c216cf1cd5c99b82d8a90a2ae6271b465 + checksum: d747c9fb65ed7b4f1abcae4959405707ed9a7b835639f8a9ba0da2911995a6ab9b0648fd05baf2a4d4e3cf7f9fdbad56d3753f91881e365992c1d49c8d88ff7a languageName: node linkType: hard @@ -8231,10 +10619,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001565": - version: 1.0.30001576 - resolution: "caniuse-lite@npm:1.0.30001576" - checksum: 79cf666f9139c542bdf75eab76171534dc638d2f8efacd325649c8ec6be59de400f0e9d6dc02504f12125626b306c0a848fe86904c01722218b2a479be82a9c1 +"caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001669": + version: 1.0.30001684 + resolution: "caniuse-lite@npm:1.0.30001684" + checksum: 446485ca3d9caf408a339a44636a86a2b119ec247492393ae661cd93dccd6668401dd2dfec1e149be4e44563cd1e23351b44453a52fa2c2f19e2bf3287c865f6 languageName: node linkType: hard @@ -8353,7 +10741,7 @@ __metadata: languageName: node linkType: hard -"cheerio@npm:^1.0.0-rc.12, cheerio@npm:^1.0.0-rc.3": +"cheerio@npm:1.0.0-rc.12, cheerio@npm:^1.0.0-rc.3": version: 1.0.0-rc.12 resolution: "cheerio@npm:1.0.0-rc.12" dependencies: @@ -8368,6 +10756,31 @@ __metadata: languageName: node linkType: hard +"chevrotain-allstar@npm:~0.3.0": + version: 0.3.1 + resolution: "chevrotain-allstar@npm:0.3.1" + dependencies: + lodash-es: "npm:^4.17.21" + peerDependencies: + chevrotain: ^11.0.0 + checksum: 5cadedffd3114eb06b15fd3939bb1aa6c75412dbd737fe302b52c5c24334f9cb01cee8edc1d1067d98ba80dddf971f1d0e94b387de51423fc6cf3c5d8b7ef27a + languageName: node + linkType: hard + +"chevrotain@npm:~11.0.3": + version: 11.0.3 + resolution: "chevrotain@npm:11.0.3" + dependencies: + "@chevrotain/cst-dts-gen": "npm:11.0.3" + "@chevrotain/gast": "npm:11.0.3" + "@chevrotain/regexp-to-ast": "npm:11.0.3" + "@chevrotain/types": "npm:11.0.3" + "@chevrotain/utils": "npm:11.0.3" + lodash-es: "npm:4.17.21" + checksum: ffd425fa321e3f17e9833d7f44cd39f2743f066e92ca74b226176080ca5d455f853fe9091cdfd86354bd899d85c08b3bdc3f55b267e7d07124b048a88349765f + languageName: node + linkType: hard + "chokidar@npm:^3.4.2, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" @@ -8577,6 +10990,13 @@ __metadata: languageName: node linkType: hard +"colord@npm:^2.9.3": + version: 2.9.3 + resolution: "colord@npm:2.9.3" + checksum: 9699e956894d8996b28c686afe8988720785f476f59335c80ce852ded76ab3ebe252703aec53d9bef54f6219aea6b960fb3d9a8300058a1d0c0d4026460cd110 + languageName: node + linkType: hard + "colorette@npm:^2.0.10": version: 2.0.19 resolution: "colorette@npm:2.0.19" @@ -8687,6 +11107,13 @@ __metadata: languageName: node linkType: hard +"confbox@npm:^0.1.8": + version: 0.1.8 + resolution: "confbox@npm:0.1.8" + checksum: fc2c68d97cb54d885b10b63e45bd8da83a8a71459d3ecf1825143dd4c7f9f1b696b3283e07d9d12a144c1301c2ebc7842380bdf0014e55acc4ae1c9550102418 + languageName: node + linkType: hard + "config-chain@npm:^1.1.11": version: 1.1.13 resolution: "config-chain@npm:1.1.13" @@ -8724,6 +11151,13 @@ __metadata: languageName: node linkType: hard +"consola@npm:^3.2.3": + version: 3.2.3 + resolution: "consola@npm:3.2.3" + checksum: c606220524ec88a05bb1baf557e9e0e04a0c08a9c35d7a08652d99de195c4ddcb6572040a7df57a18ff38bbc13ce9880ad032d56630cef27bef72768ef0ac078 + languageName: node + linkType: hard + "content-disposition@npm:0.5.2": version: 0.5.2 resolution: "content-disposition@npm:0.5.2" @@ -8825,6 +11259,15 @@ __metadata: languageName: node linkType: hard +"core-js-compat@npm:^3.38.0, core-js-compat@npm:^3.38.1": + version: 3.39.0 + resolution: "core-js-compat@npm:3.39.0" + dependencies: + browserslist: "npm:^4.24.2" + checksum: 880579a3dab235e3b6350f1e324269c600753b48e891ea859331618d5051e68b7a95db6a03ad2f3cc7df4397318c25a5bc7740562ad39e94f56568638d09d414 + languageName: node + linkType: hard + "core-js-pure@npm:^3.30.2": version: 3.33.2 resolution: "core-js-pure@npm:3.33.2" @@ -8907,7 +11350,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^8.2.0": +"cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.2.0": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" dependencies: @@ -9018,6 +11461,17 @@ __metadata: languageName: node linkType: hard +"css-blank-pseudo@npm:^7.0.1": + version: 7.0.1 + resolution: "css-blank-pseudo@npm:7.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 46c3d3a611972fdb0c264db7c0b34fe437bc4300961d11945145cf04962f52a545a6ef55bc8ff4afd82b605bd692b4970f2b54582616dea00441105e725d4618 + languageName: node + linkType: hard + "css-declaration-sorter@npm:^6.3.0": version: 6.3.0 resolution: "css-declaration-sorter@npm:6.3.0" @@ -9036,6 +11490,28 @@ __metadata: languageName: node linkType: hard +"css-declaration-sorter@npm:^7.2.0": + version: 7.2.0 + resolution: "css-declaration-sorter@npm:7.2.0" + peerDependencies: + postcss: ^8.0.9 + checksum: d8516be94f8f2daa233ef021688b965c08161624cbf830a4d7ee1099429437c0ee124d35c91b1c659cfd891a68e8888aa941726dab12279bc114aaed60a94606 + languageName: node + linkType: hard + +"css-has-pseudo@npm:^7.0.1": + version: 7.0.1 + resolution: "css-has-pseudo@npm:7.0.1" + dependencies: + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 13789b08b70169204be786d652190356ace9313099d3656bd2fc38afbdd28f3d9620f0e0b07425480961b7a1ec789794961d0472f205b959d3f64c9a78ce511c + languageName: node + linkType: hard + "css-loader@npm:^6.8.1": version: 6.8.1 resolution: "css-loader@npm:6.8.1" @@ -9083,6 +11559,44 @@ __metadata: languageName: node linkType: hard +"css-minimizer-webpack-plugin@npm:^5.0.1": + version: 5.0.1 + resolution: "css-minimizer-webpack-plugin@npm:5.0.1" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.18" + cssnano: "npm:^6.0.1" + jest-worker: "npm:^29.4.3" + postcss: "npm:^8.4.24" + schema-utils: "npm:^4.0.1" + serialize-javascript: "npm:^6.0.1" + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + "@parcel/css": + optional: true + "@swc/css": + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + checksum: 1792259e18f7c5ee25b6bbf60b38b64201747add83d1f751c8c654159b46ebacd0d1103d35f17d97197033e21e02d2ba4a4e9aa14c9c0d067b7c7653c721814e + languageName: node + linkType: hard + +"css-prefers-color-scheme@npm:^10.0.0": + version: 10.0.0 + resolution: "css-prefers-color-scheme@npm:10.0.0" + peerDependencies: + postcss: ^8.4 + checksum: a66c727bb2455328b18862f720819fc98ff5c1486b69f758bdb5c66f46cc6d484f9fc0bfa4f00f2693c5da6707ad136ca789496982f713ade693f08af624930e + languageName: node + linkType: hard + "css-select@npm:^4.1.3": version: 4.3.0 resolution: "css-select@npm:4.3.0" @@ -9119,6 +11633,26 @@ __metadata: languageName: node linkType: hard +"css-tree@npm:^2.3.1": + version: 2.3.1 + resolution: "css-tree@npm:2.3.1" + dependencies: + mdn-data: "npm:2.0.30" + source-map-js: "npm:^1.0.1" + checksum: 6f8c1a11d5e9b14bf02d10717fc0351b66ba12594166f65abfbd8eb8b5b490dd367f5c7721db241a3c792d935fc6751fbc09f7e1598d421477ad9fadc30f4f24 + languageName: node + linkType: hard + +"css-tree@npm:~2.2.0": + version: 2.2.1 + resolution: "css-tree@npm:2.2.1" + dependencies: + mdn-data: "npm:2.0.28" + source-map-js: "npm:^1.0.1" + checksum: 47e87b0f02f8ac22f57eceb65c58011dd142d2158128882a0bf963cf2eabb81a4ebbc2e3790c8289be7919fa8b83750c7b69272bd66772c708143b772ba3c186 + languageName: node + linkType: hard + "css-what@npm:^6.0.1, css-what@npm:^6.1.0": version: 6.1.0 resolution: "css-what@npm:6.1.0" @@ -9126,6 +11660,13 @@ __metadata: languageName: node linkType: hard +"cssdb@npm:^8.2.1": + version: 8.2.1 + resolution: "cssdb@npm:8.2.1" + checksum: d27d7db0a39e1105181aac119a98d6c92cd5ceba2e8bd349cdf2ba4a8d9ead149b685a1dba9542ca24f094cc70eca4a3e02973fe1f74c11a373b508606e5e1c0 + languageName: node + linkType: hard + "cssesc@npm:^3.0.0": version: 3.0.0 resolution: "cssesc@npm:3.0.0" @@ -9151,6 +11692,23 @@ __metadata: languageName: node linkType: hard +"cssnano-preset-advanced@npm:^6.1.2": + version: 6.1.2 + resolution: "cssnano-preset-advanced@npm:6.1.2" + dependencies: + autoprefixer: "npm:^10.4.19" + browserslist: "npm:^4.23.0" + cssnano-preset-default: "npm:^6.1.2" + postcss-discard-unused: "npm:^6.0.5" + postcss-merge-idents: "npm:^6.0.3" + postcss-reduce-idents: "npm:^6.0.3" + postcss-zindex: "npm:^6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 22d3ddab258e6b31e7e2e7c48712f023b60fadb2813929752dace0326e28cd250830b5420a33f81b01df52d2460cb5f999fff5907f58508809efe1a8a739a707 + languageName: node + linkType: hard + "cssnano-preset-default@npm:^5.2.12": version: 5.2.12 resolution: "cssnano-preset-default@npm:5.2.12" @@ -9229,6 +11787,46 @@ __metadata: languageName: node linkType: hard +"cssnano-preset-default@npm:^6.1.2": + version: 6.1.2 + resolution: "cssnano-preset-default@npm:6.1.2" + dependencies: + browserslist: "npm:^4.23.0" + css-declaration-sorter: "npm:^7.2.0" + cssnano-utils: "npm:^4.0.2" + postcss-calc: "npm:^9.0.1" + postcss-colormin: "npm:^6.1.0" + postcss-convert-values: "npm:^6.1.0" + postcss-discard-comments: "npm:^6.0.2" + postcss-discard-duplicates: "npm:^6.0.3" + postcss-discard-empty: "npm:^6.0.3" + postcss-discard-overridden: "npm:^6.0.2" + postcss-merge-longhand: "npm:^6.0.5" + postcss-merge-rules: "npm:^6.1.1" + postcss-minify-font-values: "npm:^6.1.0" + postcss-minify-gradients: "npm:^6.0.3" + postcss-minify-params: "npm:^6.1.0" + postcss-minify-selectors: "npm:^6.0.4" + postcss-normalize-charset: "npm:^6.0.2" + postcss-normalize-display-values: "npm:^6.0.2" + postcss-normalize-positions: "npm:^6.0.2" + postcss-normalize-repeat-style: "npm:^6.0.2" + postcss-normalize-string: "npm:^6.0.2" + postcss-normalize-timing-functions: "npm:^6.0.2" + postcss-normalize-unicode: "npm:^6.1.0" + postcss-normalize-url: "npm:^6.0.2" + postcss-normalize-whitespace: "npm:^6.0.2" + postcss-ordered-values: "npm:^6.0.2" + postcss-reduce-initial: "npm:^6.1.0" + postcss-reduce-transforms: "npm:^6.0.2" + postcss-svgo: "npm:^6.0.3" + postcss-unique-selectors: "npm:^6.0.4" + peerDependencies: + postcss: ^8.4.31 + checksum: af99021f936763850f5f35dc9e6a9dfb0da30856dea36e0420b011da2a447099471db2a5f3d1f5f52c0489da186caf9a439d8f048a80f82617077efb018333fa + languageName: node + linkType: hard + "cssnano-utils@npm:^3.1.0": version: 3.1.0 resolution: "cssnano-utils@npm:3.1.0" @@ -9238,6 +11836,15 @@ __metadata: languageName: node linkType: hard +"cssnano-utils@npm:^4.0.2": + version: 4.0.2 + resolution: "cssnano-utils@npm:4.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 260b8c8ffa48b908aa77ef129f9b8648ecd92aed405b20e7fe6b8370779dd603530344fc9d96683d53533246e48b36ac9d2aa5a476b4f81c547bbad86d187f35 + languageName: node + linkType: hard + "cssnano@npm:^5.1.15": version: 5.1.15 resolution: "cssnano@npm:5.1.15" @@ -9264,6 +11871,18 @@ __metadata: languageName: node linkType: hard +"cssnano@npm:^6.0.1, cssnano@npm:^6.1.2": + version: 6.1.2 + resolution: "cssnano@npm:6.1.2" + dependencies: + cssnano-preset-default: "npm:^6.1.2" + lilconfig: "npm:^3.1.1" + peerDependencies: + postcss: ^8.4.31 + checksum: 4df0dc0389b34b38acb09b7cfb07267b0eda95349c6d5e9b7666acc7200bb33359650869a60168e9d878298b05f4ad2c7f070815c90551720a3f4e1037f79691 + languageName: node + linkType: hard + "csso@npm:^4.2.0": version: 4.2.0 resolution: "csso@npm:4.2.0" @@ -9273,6 +11892,15 @@ __metadata: languageName: node linkType: hard +"csso@npm:^5.0.5": + version: 5.0.5 + resolution: "csso@npm:5.0.5" + dependencies: + css-tree: "npm:~2.2.0" + checksum: ab4beb1e97dd7e207c10e9925405b45f15a6cd1b4880a8686ad573aa6d476aed28b4121a666cffd26c37a26179f7b54741f7c257543003bfb244d06a62ad569b + languageName: node + linkType: hard + "csstype@npm:^3.0.2": version: 3.1.0 resolution: "csstype@npm:3.1.0" @@ -9291,7 +11919,7 @@ __metadata: languageName: node linkType: hard -"cytoscape-fcose@npm:^2.1.0": +"cytoscape-fcose@npm:^2.2.0": version: 2.2.0 resolution: "cytoscape-fcose@npm:2.2.0" dependencies: @@ -9302,13 +11930,10 @@ __metadata: languageName: node linkType: hard -"cytoscape@npm:^3.23.0": - version: 3.26.0 - resolution: "cytoscape@npm:3.26.0" - dependencies: - heap: "npm:^0.2.6" - lodash: "npm:^4.17.21" - checksum: d63ec3674396bc3f4444e4fc9692277577c4407ac3d4e6f3cea08149b88d4d692667b0273f1789bb007fae8cda2e9079c106d0595ba48f7c9fb9a3703fbb776b +"cytoscape@npm:^3.29.2": + version: 3.30.4 + resolution: "cytoscape@npm:3.30.4" + checksum: 5973a7d4a079f65984fe48bce1f6e4377d31407b7054ba11297f9ba2a485f3fc06f26ab9d97a09fded84f0bfdbb9a2f1749884145c17618a0a4cec32b6c8bfce languageName: node linkType: hard @@ -9627,9 +12252,9 @@ __metadata: languageName: node linkType: hard -"d3@npm:^7.4.0, d3@npm:^7.8.2": - version: 7.8.5 - resolution: "d3@npm:7.8.5" +"d3@npm:^7.9.0": + version: 7.9.0 + resolution: "d3@npm:7.9.0" dependencies: d3-array: "npm:3" d3-axis: "npm:3" @@ -9661,7 +12286,7 @@ __metadata: d3-timer: "npm:3" d3-transition: "npm:3" d3-zoom: "npm:3" - checksum: 408758dcc2437cbff8cd207b9d82760030b5c53c1df6a2ce5b1a76633388a6892fd65c0632cfa83da963e239722d49805062e5fb05d99e0fb078bda14cb22222 + checksum: 3dd9c08c73cfaa69c70c49e603c85e049c3904664d9c79a1a52a0f52795828a1ff23592dc9a7b2257e711d68a615472a13103c212032f38e016d609796e087e8 languageName: node linkType: hard @@ -9675,13 +12300,13 @@ __metadata: languageName: node linkType: hard -"dagre-d3-es@npm:7.0.10": - version: 7.0.10 - resolution: "dagre-d3-es@npm:7.0.10" +"dagre-d3-es@npm:7.0.11": + version: 7.0.11 + resolution: "dagre-d3-es@npm:7.0.11" dependencies: - d3: "npm:^7.8.2" + d3: "npm:^7.9.0" lodash-es: "npm:^4.17.21" - checksum: 3e1bb6efe9a78cea3fe6ff265eb330692f057bf84c99d6a1d67db379231c37a1a1ca2e1ccc25a732ddf924cd5566062c033d88defd230debec324dc9256c6775 + checksum: 52f88bdfeca0d8554bee0c1419377585355b4ef179e5fedd3bac75f772745ecb789f6d7ea377a17566506bc8f151bc0dfe02a5175207a547975f335cd88c726c languageName: node linkType: hard @@ -9694,10 +12319,17 @@ __metadata: languageName: node linkType: hard -"dayjs@npm:^1.11.7": - version: 1.11.10 - resolution: "dayjs@npm:1.11.10" - checksum: 4de9af50639d47df87f2e15fa36bb07e0f9ed1e9c52c6caa1482788ee9a384d668f1dbd00c54f82aaab163db07d61d2899384b8254da3a9184fc6deca080e2fe +"dayjs@npm:^1.11.10": + version: 1.11.13 + resolution: "dayjs@npm:1.11.13" + checksum: a3caf6ac8363c7dade9d1ee797848ddcf25c1ace68d9fe8678ecf8ba0675825430de5d793672ec87b24a69bf04a1544b176547b2539982275d5542a7955f35b7 + languageName: node + linkType: hard + +"debounce@npm:^1.2.1": + version: 1.2.1 + resolution: "debounce@npm:1.2.1" + checksum: 6c9320aa0973fc42050814621a7a8a78146c1975799b5b3cc1becf1f77ba9a5aa583987884230da0842a03f385def452fad5d60db97c3d1c8b824e38a8edf500 languageName: node linkType: hard @@ -9722,6 +12354,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.3.6": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b + languageName: node + linkType: hard + "decode-named-character-reference@npm:^1.0.0": version: 1.0.2 resolution: "decode-named-character-reference@npm:1.0.2" @@ -9779,6 +12423,13 @@ __metadata: languageName: node linkType: hard +"deepmerge@npm:^4.3.1": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + "default-gateway@npm:^6.0.3": version: 6.0.3 resolution: "default-gateway@npm:6.0.3" @@ -9943,13 +12594,6 @@ __metadata: languageName: node linkType: hard -"diff@npm:^5.0.0": - version: 5.1.0 - resolution: "diff@npm:5.1.0" - checksum: 77a0d9beb9ed54796154ac2511872288432124ac90a1cabb1878783c9b4d81f1847f3b746a0630b1e836181461d2c76e1e6b95559bef86ed16294d114862e364 - languageName: node - linkType: hard - "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -10038,10 +12682,15 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:^3.0.5": - version: 3.0.6 - resolution: "dompurify@npm:3.0.6" - checksum: defc5126e1724bbe5dd5835f0de838c6dc9726a73fc74893e4c661a3c1bd5c65189295013afee74ae7097b3be93499539ff9ec66118d3aa46e788266b1f7514c +"dompurify@npm:^3.2.1": + version: 3.2.1 + resolution: "dompurify@npm:3.2.1" + dependencies: + "@types/trusted-types": "npm:^2.0.7" + dependenciesMeta: + "@types/trusted-types": + optional: true + checksum: c40c441813071ebdc06f843dce6f22109d30f14525e710c8b117ef54430358617d4e7910a26fc09b387aa5890d1f510b242b605b0282ed1fb7a4d5104c75e223 languageName: node linkType: hard @@ -10131,17 +12780,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.601": - version: 1.4.630 - resolution: "electron-to-chromium@npm:1.4.630" - checksum: dbe3b3437b00f978aa261e1ee9c80eebaba70dea601866b0d64e36f7146328c79bce8416652e4713cfeb0e22428cc7ec1751881860ec892fa32ec8de015d1a9e - languageName: node - linkType: hard - -"elkjs@npm:^0.8.2": - version: 0.8.2 - resolution: "elkjs@npm:0.8.2" - checksum: 550b48a44143f6d1ac12482b301670a92ac6a685b2f6a0089ee0b66a4037b800890c507b60afd572851d3208e92ff2ed7cc30785e78acb196b422c3abfd20d6f +"electron-to-chromium@npm:^1.5.41": + version: 1.5.66 + resolution: "electron-to-chromium@npm:1.5.66" + checksum: 127a1140f3ad47c6992d6fb8ea84b3962efb52bc8e60a6ca3b722d417bf7741c92b8995fc4bd7a41943aa009ef951443361a7949e02a693461ed3ebabc053873 languageName: node linkType: hard @@ -10245,6 +12887,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.17.1": + version: 5.17.1 + resolution: "enhanced-resolve@npm:5.17.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370 + languageName: node + linkType: hard + "entities@npm:^2.0.0": version: 2.2.0 resolution: "entities@npm:2.2.0" @@ -10368,6 +13020,13 @@ __metadata: languageName: node linkType: hard +"escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + "escape-goat@npm:^4.0.0": version: 4.0.0 resolution: "escape-goat@npm:4.0.0" @@ -10942,6 +13601,13 @@ __metadata: languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.0.3 + resolution: "fast-uri@npm:3.0.3" + checksum: 4b2c5ce681a062425eae4f15cdc8fc151fd310b2f69b1f96680677820a8b49c3cd6e80661a406e19d50f0c40a3f8bffdd458791baf66f4a879d80be28e10a320 + languageName: node + linkType: hard + "fast-url-parser@npm:1.1.3": version: 1.1.3 resolution: "fast-url-parser@npm:1.1.3" @@ -10998,6 +13664,15 @@ __metadata: languageName: node linkType: hard +"figures@npm:^3.2.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 + languageName: node + linkType: hard + "file-loader@npm:^6.2.0": version: 6.2.0 resolution: "file-loader@npm:6.2.0" @@ -11242,7 +13917,7 @@ __metadata: languageName: node linkType: hard -"fraction.js@npm:^4.3.6": +"fraction.js@npm:^4.3.6, fraction.js@npm:^4.3.7": version: 4.3.7 resolution: "fraction.js@npm:4.3.7" checksum: df291391beea9ab4c263487ffd9d17fed162dbb736982dee1379b2a8cc94e4e24e46ed508c6d278aded9080ba51872f1bc5f3a5fd8d7c74e5f105b508ac28711 @@ -11278,6 +13953,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.2.0": + version: 11.2.0 + resolution: "fs-extra@npm:11.2.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: d77a9a9efe60532d2e790e938c81a02c1b24904ef7a3efb3990b835514465ba720e99a6ea56fd5e2db53b4695319b644d76d5a0e9988a2beef80aa7b1da63398 + languageName: node + linkType: hard + "fs-extra@npm:^4.0.2": version: 4.0.3 resolution: "fs-extra@npm:4.0.3" @@ -11673,7 +14359,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.11": +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.2.11": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -11701,6 +14387,13 @@ __metadata: languageName: node linkType: hard +"hachure-fill@npm:^0.5.2": + version: 0.5.2 + resolution: "hachure-fill@npm:0.5.2" + checksum: 307e3b6f9f2d3c11a82099c3f71eecbb9c440c00c1f896ac1732c23e6dbff16a92bb893d222b8b721b89cf11e58649ca60b4c24e5663f705f877cefd40153429 + languageName: node + linkType: hard + "handle-thing@npm:^2.0.0": version: 2.0.1 resolution: "handle-thing@npm:2.0.1" @@ -12017,13 +14710,6 @@ __metadata: languageName: node linkType: hard -"heap@npm:^0.2.6": - version: 0.2.7 - resolution: "heap@npm:0.2.7" - checksum: 341c5d51ae13dc8346c371a8a69c57c972fcb9a3233090d3dd5ba29d483d6b5b4e75492443cbfeacd46608bb30e6680f646ffb7a6205900221735587d07a79b6 - languageName: node - linkType: hard - "history@npm:^4.9.0": version: 4.10.1 resolution: "history@npm:4.10.1" @@ -12077,6 +14763,13 @@ __metadata: languageName: node linkType: hard +"html-escaper@npm:^2.0.2": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 + languageName: node + linkType: hard + "html-minifier-terser@npm:^6.0.2": version: 6.1.0 resolution: "html-minifier-terser@npm:6.1.0" @@ -12140,6 +14833,27 @@ __metadata: languageName: node linkType: hard +"html-webpack-plugin@npm:^5.6.0": + version: 5.6.3 + resolution: "html-webpack-plugin@npm:5.6.3" + dependencies: + "@types/html-minifier-terser": "npm:^6.0.0" + html-minifier-terser: "npm:^6.0.2" + lodash: "npm:^4.17.21" + pretty-error: "npm:^4.0.0" + tapable: "npm:^2.0.0" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 25a21f83a8823d3711396dd8050bc0080c0ae55537352d432903eff58a7d9838fc811e3c26462419036190720357e67c7977efd106fb9a252770632824f0cc25 + languageName: node + linkType: hard + "htmlparser2@npm:^6.1.0": version: 6.1.0 resolution: "htmlparser2@npm:6.1.0" @@ -12317,13 +15031,13 @@ __metadata: version: 0.0.0-use.local resolution: "hyperlane-v3-docs@workspace:." dependencies: - "@docusaurus/core": "npm:3.0.1" - "@docusaurus/module-type-aliases": "npm:3.0.1" - "@docusaurus/plugin-client-redirects": "npm:3.0.1" - "@docusaurus/preset-classic": "npm:3.0.1" - "@docusaurus/theme-mermaid": "npm:3.0.1" - "@docusaurus/tsconfig": "npm:3.0.1" - "@docusaurus/types": "npm:3.0.1" + "@docusaurus/core": "npm:^3.6.3" + "@docusaurus/module-type-aliases": "npm:^3.6.3" + "@docusaurus/plugin-client-redirects": "npm:^3.6.3" + "@docusaurus/preset-classic": "npm:^3.6.3" + "@docusaurus/theme-mermaid": "npm:^3.6.3" + "@docusaurus/tsconfig": "npm:^3.6.3" + "@docusaurus/types": "npm:^3.6.3" "@easyops-cn/docusaurus-search-local": "npm:^0.37.4" "@hyperlane-xyz/core": "npm:5.8.1" "@hyperlane-xyz/registry": "npm:6.1.0" @@ -12450,10 +15164,10 @@ __metadata: languageName: node linkType: hard -"infima@npm:0.2.0-alpha.43": - version: 0.2.0-alpha.43 - resolution: "infima@npm:0.2.0-alpha.43" - checksum: d248958713a97e1c9f73ace27ceff726ba86a9b534efb0ebdec3e72b785d8edb36db922e38ce09bbeb98a17b657e61357f22edc3a58f02ad51b7ae2ebd96e4e4 +"infima@npm:0.2.0-alpha.45": + version: 0.2.0-alpha.45 + resolution: "infima@npm:0.2.0-alpha.45" + checksum: b50d103f6864687742067414d09392ccf3be363cf27503925a943ff56bb2392118e2bfdb6b2f89933417015e1770e58f81b2b0caf823f2adfb67f32b1702d469 languageName: node linkType: hard @@ -12988,7 +15702,7 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^29.1.2": +"jest-worker@npm:^29.1.2, jest-worker@npm:^29.4.3": version: 29.7.0 resolution: "jest-worker@npm:29.7.0" dependencies: @@ -13082,6 +15796,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2, jsesc@npm:~3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 + languageName: node + linkType: hard + "jsesc@npm:~0.5.0": version: 0.5.0 resolution: "jsesc@npm:0.5.0" @@ -13206,6 +15929,17 @@ __metadata: languageName: node linkType: hard +"katex@npm:^0.16.9": + version: 0.16.11 + resolution: "katex@npm:0.16.11" + dependencies: + commander: "npm:^8.3.0" + bin: + katex: cli.js + checksum: be405d45d7228bbfeecd491e0f74d9da0066b5e7b457e3f1dc833de5b63f9e98e40d2ef6b46e1cbe577490a43338c043851da032c45aeec0cc03ad431ef6fd83 + languageName: node + linkType: hard + "keccak@npm:^3.0.0": version: 3.0.4 resolution: "keccak@npm:3.0.4" @@ -13227,7 +15961,7 @@ __metadata: languageName: node linkType: hard -"khroma@npm:^2.0.0": +"khroma@npm:^2.1.0": version: 2.1.0 resolution: "khroma@npm:2.1.0" checksum: 634d98753ff5d2540491cafeb708fc98de0d43f4e6795256d5c8f6e3ad77de93049ea41433928fda3697adf7bbe6fe27351858f6d23b78f8b5775ef314c59891 @@ -13257,10 +15991,23 @@ __metadata: languageName: node linkType: hard -"kleur@npm:^4.0.3": - version: 4.1.5 - resolution: "kleur@npm:4.1.5" - checksum: e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a +"kolorist@npm:^1.8.0": + version: 1.8.0 + resolution: "kolorist@npm:1.8.0" + checksum: 73075db44a692bf6c34a649f3b4b3aea4993b84f6b754cbf7a8577e7c7db44c0bad87752bd23b0ce533f49de2244ce2ce03b7b1b667a85ae170a94782cc50f9b + languageName: node + linkType: hard + +"langium@npm:3.0.0": + version: 3.0.0 + resolution: "langium@npm:3.0.0" + dependencies: + chevrotain: "npm:~11.0.3" + chevrotain-allstar: "npm:~0.3.0" + vscode-languageserver: "npm:~9.0.1" + vscode-languageserver-textdocument: "npm:~1.0.11" + vscode-uri: "npm:~3.0.8" + checksum: d1cb87de67024aae6a49f4762164461d678ccdda908b48e017556ff73f4838ff5cb74fda61b42e72d9795fbc1639927a2205add358752708d5f600dcbb3f512c languageName: node linkType: hard @@ -13327,6 +16074,13 @@ __metadata: languageName: node linkType: hard +"lilconfig@npm:^3.1.1": + version: 3.1.2 + resolution: "lilconfig@npm:3.1.2" + checksum: f059630b1a9bddaeba83059db00c672b64dc14074e9f232adce32b38ca1b5686ab737eb665c5ba3c32f147f0002b4bee7311ad0386a9b98547b5623e87071fbe + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -13359,6 +16113,16 @@ __metadata: languageName: node linkType: hard +"local-pkg@npm:^0.5.0": + version: 0.5.1 + resolution: "local-pkg@npm:0.5.1" + dependencies: + mlly: "npm:^1.7.3" + pkg-types: "npm:^1.2.1" + checksum: ade8346f1dc04875921461adee3c40774b00d4b74095261222ebd4d5fd0a444676e36e325f76760f21af6a60bc82480e154909b54d2d9f7173671e36dacf1808 + languageName: node + linkType: hard + "locate-path@npm:^3.0.0": version: 3.0.0 resolution: "locate-path@npm:3.0.0" @@ -13387,7 +16151,7 @@ __metadata: languageName: node linkType: hard -"lodash-es@npm:^4.17.21": +"lodash-es@npm:4.17.21, lodash-es@npm:^4.17.21": version: 4.17.21 resolution: "lodash-es@npm:4.17.21" checksum: fb407355f7e6cd523a9383e76e6b455321f0f153a6c9625e21a8827d10c54c2a2341bd2ae8d034358b60e07325e1330c14c224ff582d04612a46a4f0479ff2f2 @@ -13588,6 +16352,15 @@ __metadata: languageName: node linkType: hard +"markdown-table@npm:^2.0.0": + version: 2.0.0 + resolution: "markdown-table@npm:2.0.0" + dependencies: + repeat-string: "npm:^1.0.0" + checksum: f257e0781ea50eb946919df84bdee4ba61f983971b277a369ca7276f89740fd0e2749b9b187163a42df4c48682b71962d4007215ce3523480028f06c11ddc2e6 + languageName: node + linkType: hard + "markdown-table@npm:^3.0.0": version: 3.0.3 resolution: "markdown-table@npm:3.0.3" @@ -13595,6 +16368,15 @@ __metadata: languageName: node linkType: hard +"marked@npm:^13.0.2": + version: 13.0.3 + resolution: "marked@npm:13.0.3" + bin: + marked: bin/marked.js + checksum: b1121f420f815206ae5ae109b9b0eb6c21f84d8d459cbe38ffa00543652e091f36a55c2c96ff1414821d8752682af8c0de3f44f0a2a5bd9c8612a4ef520e9b3d + languageName: node + linkType: hard + "md5.js@npm:^1.3.4": version: 1.3.5 resolution: "md5.js@npm:1.3.5" @@ -13634,26 +16416,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-from-markdown@npm:^1.3.0": - version: 1.3.1 - resolution: "mdast-util-from-markdown@npm:1.3.1" - dependencies: - "@types/mdast": "npm:^3.0.0" - "@types/unist": "npm:^2.0.0" - decode-named-character-reference: "npm:^1.0.0" - mdast-util-to-string: "npm:^3.1.0" - micromark: "npm:^3.0.0" - micromark-util-decode-numeric-character-reference: "npm:^1.0.0" - micromark-util-decode-string: "npm:^1.0.0" - micromark-util-normalize-identifier: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - unist-util-stringify-position: "npm:^3.0.0" - uvu: "npm:^0.5.0" - checksum: f4e901bf2a2e93fe35a339e0cff581efacce2f7117cd5652e9a270847bd7e2508b3e717b7b4156af54d4f896d63033e06ff9fafbf59a1d46fe17dd5e2a3f7846 - languageName: node - linkType: hard - "mdast-util-from-markdown@npm:^2.0.0": version: 2.0.0 resolution: "mdast-util-from-markdown@npm:2.0.0" @@ -13884,15 +16646,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-to-string@npm:^3.1.0": - version: 3.2.0 - resolution: "mdast-util-to-string@npm:3.2.0" - dependencies: - "@types/mdast": "npm:^3.0.0" - checksum: 112f4bf0f6758dcb95deffdcf37afba7eaecdfe2ee13252de031723094d4d55220e147326690a8b91244758e2d678e7aeb1fdd0fa6ef3317c979bc42effd9a21 - languageName: node - linkType: hard - "mdast-util-to-string@npm:^4.0.0": version: 4.0.0 resolution: "mdast-util-to-string@npm:4.0.0" @@ -13909,6 +16662,20 @@ __metadata: languageName: node linkType: hard +"mdn-data@npm:2.0.28": + version: 2.0.28 + resolution: "mdn-data@npm:2.0.28" + checksum: 20000932bc4cd1cde9cba4e23f08cc4f816398af4c15ec81040ed25421d6bf07b5cf6b17095972577fb498988f40f4cb589e3169b9357bb436a12d8e07e5ea7b + languageName: node + linkType: hard + +"mdn-data@npm:2.0.30": + version: 2.0.30 + resolution: "mdn-data@npm:2.0.30" + checksum: a2c472ea16cee3911ae742593715aa4c634eb3d4b9f1e6ada0902aa90df13dcbb7285d19435f3ff213ebaa3b2e0c0265c1eb0e3fb278fda7f8919f046a410cd9 + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -13946,31 +16713,31 @@ __metadata: languageName: node linkType: hard -"mermaid@npm:^10.4.0": - version: 10.6.1 - resolution: "mermaid@npm:10.6.1" +"mermaid@npm:>=10.4": + version: 11.4.1 + resolution: "mermaid@npm:11.4.1" dependencies: - "@braintree/sanitize-url": "npm:^6.0.1" - "@types/d3-scale": "npm:^4.0.3" - "@types/d3-scale-chromatic": "npm:^3.0.0" - cytoscape: "npm:^3.23.0" + "@braintree/sanitize-url": "npm:^7.0.1" + "@iconify/utils": "npm:^2.1.32" + "@mermaid-js/parser": "npm:^0.3.0" + "@types/d3": "npm:^7.4.3" + cytoscape: "npm:^3.29.2" cytoscape-cose-bilkent: "npm:^4.1.0" - cytoscape-fcose: "npm:^2.1.0" - d3: "npm:^7.4.0" + cytoscape-fcose: "npm:^2.2.0" + d3: "npm:^7.9.0" d3-sankey: "npm:^0.12.3" - dagre-d3-es: "npm:7.0.10" - dayjs: "npm:^1.11.7" - dompurify: "npm:^3.0.5" - elkjs: "npm:^0.8.2" - khroma: "npm:^2.0.0" + dagre-d3-es: "npm:7.0.11" + dayjs: "npm:^1.11.10" + dompurify: "npm:^3.2.1" + katex: "npm:^0.16.9" + khroma: "npm:^2.1.0" lodash-es: "npm:^4.17.21" - mdast-util-from-markdown: "npm:^1.3.0" - non-layered-tidy-tree-layout: "npm:^2.0.2" - stylis: "npm:^4.1.3" + marked: "npm:^13.0.2" + roughjs: "npm:^4.6.6" + stylis: "npm:^4.3.1" ts-dedent: "npm:^2.2.0" - uuid: "npm:^9.0.0" - web-worker: "npm:^1.2.0" - checksum: d8e4e4d7a0244da8f19d40b758ed39abdfd426c31a96196b4de991758954561da6056f038e0b4781f94c51bbc6a2a115370238f62250a3e6ba52d067174d7417 + uuid: "npm:^9.0.1" + checksum: eb787a1ddcb02c496b5b38f43a43f35f6a358c5474517a7ba54bfba0022f90beeeb5174716ac53501ae05bb3c9667dc656822828786cc42ba1f507c9ff324cc9 languageName: node linkType: hard @@ -13988,30 +16755,6 @@ __metadata: languageName: node linkType: hard -"micromark-core-commonmark@npm:^1.0.1": - version: 1.1.0 - resolution: "micromark-core-commonmark@npm:1.1.0" - dependencies: - decode-named-character-reference: "npm:^1.0.0" - micromark-factory-destination: "npm:^1.0.0" - micromark-factory-label: "npm:^1.0.0" - micromark-factory-space: "npm:^1.0.0" - micromark-factory-title: "npm:^1.0.0" - micromark-factory-whitespace: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-chunked: "npm:^1.0.0" - micromark-util-classify-character: "npm:^1.0.0" - micromark-util-html-tag-name: "npm:^1.0.0" - micromark-util-normalize-identifier: "npm:^1.0.0" - micromark-util-resolve-all: "npm:^1.0.0" - micromark-util-subtokenize: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.1" - uvu: "npm:^0.5.0" - checksum: b3bf7b7004ce7dbb3ae151dcca4db1d12546f1b943affb2418da4b90b9ce59357373c433ee2eea4c868aee0791dafa355aeed19f5ef2b0acaf271f32f1ecbe6a - languageName: node - linkType: hard - "micromark-core-commonmark@npm:^2.0.0": version: 2.0.0 resolution: "micromark-core-commonmark@npm:2.0.0" @@ -14247,17 +16990,6 @@ __metadata: languageName: node linkType: hard -"micromark-factory-destination@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-destination@npm:1.1.0" - dependencies: - micromark-util-character: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 71ebd9089bf0c9689b98ef42215c04032ae2701ae08c3546b663628553255dca18e5310dbdacddad3acd8de4f12a789835fff30dadc4da3c4e30387a75e6b488 - languageName: node - linkType: hard - "micromark-factory-destination@npm:^2.0.0": version: 2.0.0 resolution: "micromark-factory-destination@npm:2.0.0" @@ -14269,18 +17001,6 @@ __metadata: languageName: node linkType: hard -"micromark-factory-label@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-label@npm:1.1.0" - dependencies: - micromark-util-character: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - uvu: "npm:^0.5.0" - checksum: 5e2cd2d8214bb92a34dfcedf9c7aecf565e3648650a3a6a0495ededf15f2318dd214dc069e3026402792cd5839d395313f8ef9c2e86ca34a8facaa0f75a77753 - languageName: node - linkType: hard - "micromark-factory-label@npm:^2.0.0": version: 2.0.0 resolution: "micromark-factory-label@npm:2.0.0" @@ -14329,18 +17049,6 @@ __metadata: languageName: node linkType: hard -"micromark-factory-title@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-title@npm:1.1.0" - dependencies: - micromark-factory-space: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: cf8c687d1d5c3928846a4791d4a7e2f1d7bdd2397051e20d60f06b7565a48bf85198ab6f85735e997ab3f0cbb80b8b6391f4f7ebc0aae2f2f8c3a08541257bf6 - languageName: node - linkType: hard - "micromark-factory-title@npm:^2.0.0": version: 2.0.0 resolution: "micromark-factory-title@npm:2.0.0" @@ -14353,18 +17061,6 @@ __metadata: languageName: node linkType: hard -"micromark-factory-whitespace@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-whitespace@npm:1.1.0" - dependencies: - micromark-factory-space: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 7248cc4534f9befb38c6f398b6e38efd3199f1428fc214c9cb7ed5b6e9fa7a82c0d8cdfa9bcacde62887c9a7c8c46baf5c318b2ae8f701afbccc8ad702e92dce - languageName: node - linkType: hard - "micromark-factory-whitespace@npm:^2.0.0": version: 2.0.0 resolution: "micromark-factory-whitespace@npm:2.0.0" @@ -14397,15 +17093,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-chunked@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-chunked@npm:1.1.0" - dependencies: - micromark-util-symbol: "npm:^1.0.0" - checksum: 59534cf4aaf481ed58d65478d00eae0080df9b5816673f79b5ddb0cea263e5a9ee9cbb6cc565daf1eb3c8c4ff86fc4e25d38a0577539655cda823a4249efd358 - languageName: node - linkType: hard - "micromark-util-chunked@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-chunked@npm:2.0.0" @@ -14415,17 +17102,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-classify-character@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-classify-character@npm:1.1.0" - dependencies: - micromark-util-character: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 3266453dc0fdaf584e24c9b3c91d1ed180f76b5856699c51fd2549305814fcab7ec52afb4d3e83d002a9115cd2d2b2ffdc9c0b38ed85120822bf515cc00636ec - languageName: node - linkType: hard - "micromark-util-classify-character@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-classify-character@npm:2.0.0" @@ -14437,16 +17113,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-combine-extensions@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-combine-extensions@npm:1.1.0" - dependencies: - micromark-util-chunked: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 0bc572fab3fe77f533c29aa1b75cb847b9fc9455f67a98623ef9740b925c0b0426ad9f09bbb56f1e844ea9ebada7873d1f06d27f7c979a917692b273c4b69e31 - languageName: node - linkType: hard - "micromark-util-combine-extensions@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-combine-extensions@npm:2.0.0" @@ -14457,15 +17123,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-decode-numeric-character-reference@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-decode-numeric-character-reference@npm:1.1.0" - dependencies: - micromark-util-symbol: "npm:^1.0.0" - checksum: 64ef2575e3fc2426976c19e16973348f20b59ddd5543f1467ac2e251f29e0a91f12089703d29ae985b0b9a408ee0d72f06d04ed3920811aa2402aabca3bdf9e4 - languageName: node - linkType: hard - "micromark-util-decode-numeric-character-reference@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.1" @@ -14475,18 +17132,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-decode-string@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-decode-string@npm:1.1.0" - dependencies: - decode-named-character-reference: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-decode-numeric-character-reference: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - checksum: 757a0aaa5ad6c50c7480bd75371d407ac75f5022cd4404aba07adadf1448189502aea9bb7b2d09d25e18745e0abf72b95506b6beb184bcccabe919e48e3a5df7 - languageName: node - linkType: hard - "micromark-util-decode-string@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-decode-string@npm:2.0.0" @@ -14499,13 +17144,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-encode@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-encode@npm:1.1.0" - checksum: 9878c9bc96999d45626a7597fffac85348ea842dce75d2417345cbf070a9941c62477bd0963bef37d4f0fd29f2982be6ddf416d62806f00ccb334af9d6ee87e7 - languageName: node - linkType: hard - "micromark-util-encode@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-encode@npm:2.0.0" @@ -14529,13 +17167,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-html-tag-name@npm:^1.0.0": - version: 1.2.0 - resolution: "micromark-util-html-tag-name@npm:1.2.0" - checksum: 15421869678d36b4fe51df453921e8186bff514a14e9f79f32b7e1cdd67874e22a66ad34a7f048dd132cbbbfc7c382ae2f777a2bfd1f245a47705dc1c6d4f199 - languageName: node - linkType: hard - "micromark-util-html-tag-name@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-html-tag-name@npm:2.0.0" @@ -14543,15 +17174,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-normalize-identifier@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-normalize-identifier@npm:1.1.0" - dependencies: - micromark-util-symbol: "npm:^1.0.0" - checksum: a9657321a2392584e4d978061882117a84db7d2c2c1c052c0f5d25da089d463edb9f956d5beaf7f5768984b6f72d046d59b5972951ec7bf25397687a62b8278a - languageName: node - linkType: hard - "micromark-util-normalize-identifier@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-normalize-identifier@npm:2.0.0" @@ -14561,15 +17183,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-resolve-all@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-resolve-all@npm:1.1.0" - dependencies: - micromark-util-types: "npm:^1.0.0" - checksum: b5c95484c06e87bbbb60d8430eb030a458733a5270409f4c67892d1274737087ca6a7ca888987430e57cf1dcd44bb16390d3b3936a2bf07f7534ec8f52ce43c9 - languageName: node - linkType: hard - "micromark-util-resolve-all@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-resolve-all@npm:2.0.0" @@ -14579,37 +17192,14 @@ __metadata: languageName: node linkType: hard -"micromark-util-sanitize-uri@npm:^1.0.0": - version: 1.2.0 - resolution: "micromark-util-sanitize-uri@npm:1.2.0" - dependencies: - micromark-util-character: "npm:^1.0.0" - micromark-util-encode: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - checksum: dbdb98248e9f0408c7a00f1c1cd805775b41d213defd659533835f34b38da38e8f990bf7b3f782e96bffbc549aec9c3ecdab197d4ad5adbfe08f814a70327b6e - languageName: node - linkType: hard - "micromark-util-sanitize-uri@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-sanitize-uri@npm:2.0.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-encode: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - checksum: 74763ca1c927dd520d3ab8fd9856a19740acf76fc091f0a1f5d4e99c8cd5f1b81c5a0be3efb564941a071fb6d85fd951103f2760eb6cff77b5ab3abe08341309 - languageName: node - linkType: hard - -"micromark-util-subtokenize@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-subtokenize@npm:1.1.0" - dependencies: - micromark-util-chunked: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - uvu: "npm:^0.5.0" - checksum: f292b1b162845db50d36255c9d4c4c6d47931fbca3ac98a80c7e536d2163233fd662f8ca0479ee2b80f145c66a1394c7ed17dfce801439741211015e77e3901e + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-encode: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + checksum: 74763ca1c927dd520d3ab8fd9856a19740acf76fc091f0a1f5d4e99c8cd5f1b81c5a0be3efb564941a071fb6d85fd951103f2760eb6cff77b5ab3abe08341309 languageName: node linkType: hard @@ -14639,7 +17229,7 @@ __metadata: languageName: node linkType: hard -"micromark-util-types@npm:^1.0.0, micromark-util-types@npm:^1.0.1": +"micromark-util-types@npm:^1.0.0": version: 1.1.0 resolution: "micromark-util-types@npm:1.1.0" checksum: a9749cb0a12a252ff536baabcb7012421b6fad4d91a5fdd80d7b33dc7b4c22e2d0c4637dfe5b902d00247fe6c9b01f4a24fce6b572b16ccaa4da90e6ce2a11e4 @@ -14653,31 +17243,6 @@ __metadata: languageName: node linkType: hard -"micromark@npm:^3.0.0": - version: 3.2.0 - resolution: "micromark@npm:3.2.0" - dependencies: - "@types/debug": "npm:^4.0.0" - debug: "npm:^4.0.0" - decode-named-character-reference: "npm:^1.0.0" - micromark-core-commonmark: "npm:^1.0.1" - micromark-factory-space: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-chunked: "npm:^1.0.0" - micromark-util-combine-extensions: "npm:^1.0.0" - micromark-util-decode-numeric-character-reference: "npm:^1.0.0" - micromark-util-encode: "npm:^1.0.0" - micromark-util-normalize-identifier: "npm:^1.0.0" - micromark-util-resolve-all: "npm:^1.0.0" - micromark-util-sanitize-uri: "npm:^1.0.0" - micromark-util-subtokenize: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.1" - uvu: "npm:^0.5.0" - checksum: f243e805d1b3cc699fddae2de0b1492bc82462f1a709d7ae5c82039f88b1e009c959100184717e748be057b5f88603289d5681679a4e6fbabcd037beb34bc744 - languageName: node - linkType: hard - "micromark@npm:^4.0.0": version: 4.0.0 resolution: "micromark@npm:4.0.0" @@ -14809,6 +17374,18 @@ __metadata: languageName: node linkType: hard +"mini-css-extract-plugin@npm:^2.9.1": + version: 2.9.2 + resolution: "mini-css-extract-plugin@npm:2.9.2" + dependencies: + schema-utils: "npm:^4.0.0" + tapable: "npm:^2.2.1" + peerDependencies: + webpack: ^5.0.0 + checksum: 5d3218dbd7db48b572925ddac05162a7415bf81b321f1a0c07016ec643cb5720c8a836ae68d45f5de826097a3013b601706c9c5aacb7f610dc2041b271de2ce0 + languageName: node + linkType: hard + "minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" @@ -15005,6 +17582,18 @@ __metadata: languageName: node linkType: hard +"mlly@npm:^1.7.1, mlly@npm:^1.7.2, mlly@npm:^1.7.3": + version: 1.7.3 + resolution: "mlly@npm:1.7.3" + dependencies: + acorn: "npm:^8.14.0" + pathe: "npm:^1.1.2" + pkg-types: "npm:^1.2.1" + ufo: "npm:^1.5.4" + checksum: b530887fe95a6e3458c1b24e9775dc61c167d402126f2f5f13a13845a3fb77c3db8d79cb32077c98679a392d8ecfdc4e5df3d6925bf650d807dc2dfe8cc35b53 + languageName: node + linkType: hard + "mock-fs@npm:^4.1.0": version: 4.14.0 resolution: "mock-fs@npm:4.14.0" @@ -15012,13 +17601,6 @@ __metadata: languageName: node linkType: hard -"mri@npm:^1.1.0": - version: 1.2.0 - resolution: "mri@npm:1.2.0" - checksum: a3d32379c2554cf7351db6237ddc18dc9e54e4214953f3da105b97dc3babe0deb3ffe99cf409b38ea47cc29f9430561ba6b53b24ab8f9ce97a4b50409e4a50e7 - languageName: node - linkType: hard - "mrmime@npm:^1.0.0": version: 1.0.1 resolution: "mrmime@npm:1.0.1" @@ -15040,7 +17622,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 @@ -15125,6 +17707,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.7": + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" + bin: + nanoid: bin/nanoid.cjs + checksum: 4b1bb29f6cfebf3be3bc4ad1f1296fb0a10a3043a79f34fbffe75d1621b4318319211cd420549459018ea3592f0d2f159247a6f874911d6d26eaaadda2478120 + languageName: node + linkType: hard + "negotiator@npm:0.6.3, negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" @@ -15263,10 +17854,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9 +"node-releases@npm:^2.0.18": + version: 2.0.18 + resolution: "node-releases@npm:2.0.18" + checksum: 786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27 languageName: node linkType: hard @@ -15277,13 +17868,6 @@ __metadata: languageName: node linkType: hard -"non-layered-tidy-tree-layout@npm:^2.0.2": - version: 2.0.2 - resolution: "non-layered-tidy-tree-layout@npm:2.0.2" - checksum: 73856e9959667193e733a7ef2b06a69421f4d9d7428a3982ce39763cd979a04eed0007f2afb3414afa3f6dc4dc6b5c850c2af9aa71a974475236a465093ec9c7 - languageName: node - linkType: hard - "nopt@npm:^7.0.0": version: 7.2.0 resolution: "nopt@npm:7.2.0" @@ -15348,6 +17932,18 @@ __metadata: languageName: node linkType: hard +"null-loader@npm:^4.0.1": + version: 4.0.1 + resolution: "null-loader@npm:4.0.1" + dependencies: + loader-utils: "npm:^2.0.0" + schema-utils: "npm:^3.0.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: fe9a74a928c9ddc1eab7be0e4322516439562d6efd6feeb0f7c61777d4b79a6a8e5a6bc8133deb59408f3f423bdf84c154a88168154a583154e9e33d544b4d42 + languageName: node + linkType: hard + "number-to-bn@npm:1.7.0": version: 1.7.0 resolution: "number-to-bn@npm:1.7.0" @@ -15618,6 +18214,13 @@ __metadata: languageName: node linkType: hard +"package-manager-detector@npm:^0.2.0": + version: 0.2.5 + resolution: "package-manager-detector@npm:0.2.5" + checksum: 73e6d2fc18d3f93f0eb677d3233fc700159d717e2531a59bdec65e5daab7ea0c0e0480416e738ace958378801bfa45351ce1d39ca46106913852ea71ff5b0a81 + languageName: node + linkType: hard + "pako@npm:^2.0.2": version: 2.1.0 resolution: "pako@npm:2.1.0" @@ -15746,6 +18349,13 @@ __metadata: languageName: node linkType: hard +"path-data-parser@npm:0.1.0, path-data-parser@npm:^0.1.0": + version: 0.1.0 + resolution: "path-data-parser@npm:0.1.0" + checksum: ba22d54669a8bc4a3df27431fe667900685585d1196085b803d0aa4066b83e709bbf2be7c1d2b56e706b49cc698231d55947c22abbfc4843ca424bbf8c985745 + languageName: node + linkType: hard + "path-exists@npm:^3.0.0": version: 3.0.0 resolution: "path-exists@npm:3.0.0" @@ -15826,6 +18436,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:3.3.0": + version: 3.3.0 + resolution: "path-to-regexp@npm:3.3.0" + checksum: ffa0ebe7088d38d435a8d08b0fe6e8c93ceb2a81a65d4dd1d9a538f52e09d5e3474ed5f553cb3b180d894b0caa10698a68737ab599fd1e56b4663d1a64c9f77b + languageName: node + linkType: hard + "path-to-regexp@npm:^1.7.0": version: 1.8.0 resolution: "path-to-regexp@npm:1.8.0" @@ -15842,6 +18459,13 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^1.1.2": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: 64ee0a4e587fb0f208d9777a6c56e4f9050039268faaaaecd50e959ef01bf847b7872785c36483fa5cdcdbdfdb31fef2ff222684d4fc21c330ab60395c681897 + languageName: node + linkType: hard + "pathval@npm:^1.1.1": version: 1.1.1 resolution: "pathval@npm:1.1.1" @@ -15887,6 +18511,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.0.1, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -15941,6 +18572,17 @@ __metadata: languageName: node linkType: hard +"pkg-types@npm:^1.2.1": + version: 1.2.1 + resolution: "pkg-types@npm:1.2.1" + dependencies: + confbox: "npm:^0.1.8" + mlly: "npm:^1.7.2" + pathe: "npm:^1.1.2" + checksum: 4aef765c039e3ec3ca55171bb8ad776cf060d894c45ddf92b9d680b3fdb1817c8d1c428f74ea6aae144493fa1d6a97df6b8caec6dc31e418f1ce1f728d38014e + languageName: node + linkType: hard + "pkg-up@npm:^3.1.0": version: 3.1.0 resolution: "pkg-up@npm:3.1.0" @@ -15950,6 +18592,23 @@ __metadata: languageName: node linkType: hard +"points-on-curve@npm:0.2.0, points-on-curve@npm:^0.2.0": + version: 0.2.0 + resolution: "points-on-curve@npm:0.2.0" + checksum: f0d92343fcc2ad1f48334633e580574c1e0e28038a756133e171e537f270d6d64203feada5ee556e36f448a1b46e0306dee07b30f589f4e3ad720f6ee38ef48c + languageName: node + linkType: hard + +"points-on-path@npm:^0.2.1": + version: 0.2.1 + resolution: "points-on-path@npm:0.2.1" + dependencies: + path-data-parser: "npm:0.1.0" + points-on-curve: "npm:0.2.0" + checksum: a7010340f9f196976f61838e767bb7b0b7f6273ab4fb9eb37c61001fe26fbfc3fcd63c96d5e85b9a4ab579213ab366f2ddaaf60e2a9253e2b91a62db33f395ba + languageName: node + linkType: hard + "possible-typed-array-names@npm:^1.0.0": version: 1.0.0 resolution: "possible-typed-array-names@npm:1.0.0" @@ -15957,6 +18616,17 @@ __metadata: languageName: node linkType: hard +"postcss-attribute-case-insensitive@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-attribute-case-insensitive@npm:7.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 48945abe2024e2d2e4c37d30b8c1aaf37af720f24f6a996f7ea7e7ed33621f5c22cf247ed22028c0c922de040c58c0802729bc39b903cb1693f4b63c0b49da34 + languageName: node + linkType: hard + "postcss-calc@npm:^8.2.3": version: 8.2.4 resolution: "postcss-calc@npm:8.2.4" @@ -15969,6 +18639,68 @@ __metadata: languageName: node linkType: hard +"postcss-calc@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-calc@npm:9.0.1" + dependencies: + postcss-selector-parser: "npm:^6.0.11" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.2 + checksum: e0df07337162dbcaac5d6e030c7fd289e21da8766a9daca5d6b2b3c8094bb524ae5d74c70048ea7fe5fe4960ce048c60ac97922d917c3bbff34f58e9d2b0eb0e + languageName: node + linkType: hard + +"postcss-clamp@npm:^4.1.0": + version: 4.1.0 + resolution: "postcss-clamp@npm:4.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.6 + checksum: 701261026b38a4c27b3c3711635fac96005f36d3270adb76dbdb1eebc950fc841db45283ee66068a7121565592e9d7967d5534e15b6e4dd266afcabf9eafa905 + languageName: node + linkType: hard + +"postcss-color-functional-notation@npm:^7.0.6": + version: 7.0.6 + resolution: "postcss-color-functional-notation@npm:7.0.6" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.6" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 15f6dfc9a24d6f5186fb054623a92bcf9e804f4eaa35b339551a8048cdb0c7bd2e4655fdbb09a0c9a89f854e9fb1d71e298e8749597660ac034e79bd0d38d7dd + languageName: node + linkType: hard + +"postcss-color-hex-alpha@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-color-hex-alpha@npm:10.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 8a6dcb27403d04b55d6de88bf3074622bcea537fc4436bbcb346e92289c4d17059444e2e6c3554c325e7a777bb4cdc711e764a83123b4000aec211052e957d5b + languageName: node + linkType: hard + +"postcss-color-rebeccapurple@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-color-rebeccapurple@npm:10.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 308e33f76f2b48c1c2121d4502fc053e869f3415898de7d30314353df680e79b37497e7b628e3447edc1049091da3672f7d891e45604f238598e846e06b893ed + languageName: node + linkType: hard + "postcss-colormin@npm:^5.3.0": version: 5.3.0 resolution: "postcss-colormin@npm:5.3.0" @@ -15997,6 +18729,20 @@ __metadata: languageName: node linkType: hard +"postcss-colormin@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-colormin@npm:6.1.0" + dependencies: + browserslist: "npm:^4.23.0" + caniuse-api: "npm:^3.0.0" + colord: "npm:^2.9.3" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 0802963fa0d8f2fe408b2e088117670f5303c69a58c135f0ecf0e5ceff69e95e87111b22c4e29c9adb2f69aa8d3bc175f4e8e8708eeb99c9ffc36c17064de427 + languageName: node + linkType: hard + "postcss-convert-values@npm:^5.1.2": version: 5.1.2 resolution: "postcss-convert-values@npm:5.1.2" @@ -16021,6 +18767,72 @@ __metadata: languageName: node linkType: hard +"postcss-convert-values@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-convert-values@npm:6.1.0" + dependencies: + browserslist: "npm:^4.23.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: a80066965cb58fe8fcaf79f306b32c83fc678e1f0678e43f4db3e9fee06eed6db92cf30631ad348a17492769d44757400493c91a33ee865ee8dedea9234a11f5 + languageName: node + linkType: hard + +"postcss-custom-media@npm:^11.0.5": + version: 11.0.5 + resolution: "postcss-custom-media@npm:11.0.5" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^2.0.4" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/media-query-list-parser": "npm:^4.0.2" + peerDependencies: + postcss: ^8.4 + checksum: 5ba1ca0383818e83d5f6f398a2b0c12cfda066b5d552adfc0e030a2c5f8690c2cc6224f9a1832a9c780dae3fd8d00d78c4a5c88eb36b731da1752f0c3917d488 + languageName: node + linkType: hard + +"postcss-custom-properties@npm:^14.0.4": + version: 14.0.4 + resolution: "postcss-custom-properties@npm:14.0.4" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^2.0.4" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 5b101ee71289657cc2e5a16f4912009c10441052e2c54bd9e4f3d4d72b652bab56adb662ddaa96881413e375cf9852e2159b3c778d953442ce86efb781c3b2bf + languageName: node + linkType: hard + +"postcss-custom-selectors@npm:^8.0.4": + version: 8.0.4 + resolution: "postcss-custom-selectors@npm:8.0.4" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^2.0.4" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 09d494d2580d0a99f57684f79793d03358286c32460b61a84063c33bdde24865771cb1205efe9a8e26a508be24eba4fb93fc7f1e96ba21ca96a5d17fadb24863 + languageName: node + linkType: hard + +"postcss-dir-pseudo-class@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-dir-pseudo-class@npm:9.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: da9d3387648c5c3161a653d354c8f3e70a299108df3977e8aa65cf10793e4dd58a2711b3426cd63716245b13584ca8d95adcd6e10e3c9adbc61d08743e2d8690 + languageName: node + linkType: hard + "postcss-discard-comments@npm:^5.1.2": version: 5.1.2 resolution: "postcss-discard-comments@npm:5.1.2" @@ -16030,6 +18842,15 @@ __metadata: languageName: node linkType: hard +"postcss-discard-comments@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-discard-comments@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 338a1fcba7e2314d956e5e5b9bd1e12e6541991bf85ac72aed6e229a029bf60edb31f11576b677623576169aa7d9c75e1be259ac7b50d0b735b841b5518f9da9 + languageName: node + linkType: hard + "postcss-discard-duplicates@npm:^5.1.0": version: 5.1.0 resolution: "postcss-discard-duplicates@npm:5.1.0" @@ -16039,6 +18860,15 @@ __metadata: languageName: node linkType: hard +"postcss-discard-duplicates@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-discard-duplicates@npm:6.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: 24d2f00e54668f2837eb38a64b1751d7a4a73b2752f9749e61eb728f1fae837984bc2b339f7f5207aff5f66f72551253489114b59b9ba21782072677a81d7d1b + languageName: node + linkType: hard + "postcss-discard-empty@npm:^5.1.1": version: 5.1.1 resolution: "postcss-discard-empty@npm:5.1.1" @@ -16048,6 +18878,15 @@ __metadata: languageName: node linkType: hard +"postcss-discard-empty@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-discard-empty@npm:6.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: 1af08bb29f18eda41edf3602b257d89a4cf0a16f79fc773cfebd4a37251f8dbd9b77ac18efe55d0677d000b43a8adf2ef9328d31961c810e9433a38494a1fa65 + languageName: node + linkType: hard + "postcss-discard-overridden@npm:^5.1.0": version: 5.1.0 resolution: "postcss-discard-overridden@npm:5.1.0" @@ -16057,6 +18896,15 @@ __metadata: languageName: node linkType: hard +"postcss-discard-overridden@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-discard-overridden@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: fda70ef3cd4cb508369c5bbbae44d7760c40ec9f2e65df1cd1b6e0314317fb1d25ae7f64987ca84e66889c1e9d1862487a6ce391c159dfe04d536597bfc5030d + languageName: node + linkType: hard + "postcss-discard-unused@npm:^5.1.0": version: 5.1.0 resolution: "postcss-discard-unused@npm:5.1.0" @@ -16068,6 +18916,97 @@ __metadata: languageName: node linkType: hard +"postcss-discard-unused@npm:^6.0.5": + version: 6.0.5 + resolution: "postcss-discard-unused@npm:6.0.5" + dependencies: + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: fca82f17395a7fcc78eab4e03dfb05958beb240c10cacb3836b832c6ea99f5259980c70890a9b7d8b67adf8071b61f3fcf1b432c7a116397aaf67909366da5cc + languageName: node + linkType: hard + +"postcss-double-position-gradients@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-double-position-gradients@npm:6.0.0" + dependencies: + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 7a0e119df1b4af59d169b1a9dfc563275ce29b4ae5e6a6c90be29a7a59272ebc55bf3b2ed05a962f73b03194f7a88f6fe738e65c1659d43351fbdc705cc951ad + languageName: node + linkType: hard + +"postcss-focus-visible@npm:^10.0.1": + version: 10.0.1 + resolution: "postcss-focus-visible@npm:10.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: c5ecc8536a708a49a99d0abd68a88a160664e6c832c808db8edd9f0221e7017a258daa87e49daf2cb098cb037005d46cf492403c8c9c92ad8835d30adaccf665 + languageName: node + linkType: hard + +"postcss-focus-within@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-focus-within@npm:9.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: d6ab49d2a7f33485a9e137dc77ec92c5619a3ec92e1e672734fc604853ff1f3c0c189085c12461614be4fcb03ea0347d91791a45986a18d50b5228d161eda57a + languageName: node + linkType: hard + +"postcss-font-variant@npm:^5.0.0": + version: 5.0.0 + resolution: "postcss-font-variant@npm:5.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: ccc96460cf6a52b5439c26c9a5ea0589882e46161e3c2331d4353de7574448f5feef667d1a68f7f39b9fe3ee75d85957383ae82bbfcf87c3162c7345df4a444e + languageName: node + linkType: hard + +"postcss-gap-properties@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-gap-properties@npm:6.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 4e07e0d3927d0e65d67eaf047ac39e08d39cb1bf74e16e10c7df7f0d01b184a77ea59f63fd5691b5ed6df159970b972db28cb784d883e26e981137696460897d + languageName: node + linkType: hard + +"postcss-image-set-function@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-image-set-function@npm:7.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 913fd9492f00122aa0c2550fb0d72130428cbe1e6465bc65e8fe71e9deb10ac0c01d7caceb68b560da759139e8cbc6c90ed22dfe6cf34949af49bb86bcbf4d3a + languageName: node + linkType: hard + +"postcss-lab-function@npm:^7.0.6": + version: 7.0.6 + resolution: "postcss-lab-function@npm:7.0.6" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.6" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 8b8d498dbc939ee79737b29232b39d09cbda26cc92e8926fb74fe56a1bb05af1198e85a67a822f39cc69109ac6757a6ff7b20842ba5ffafce891abc9bc1c3c68 + languageName: node + linkType: hard + "postcss-loader@npm:^7.3.3": version: 7.3.3 resolution: "postcss-loader@npm:7.3.3" @@ -16082,6 +19021,17 @@ __metadata: languageName: node linkType: hard +"postcss-logical@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-logical@npm:8.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 2caa04e45227ab9dec728416ccde47514e1c347ee72aac58e13ecee3bc7fbc8b53e3fe4f1e2e4396432feb1d54e70a1f06ec5a74d60e84bafff05ab82f196475 + languageName: node + linkType: hard + "postcss-merge-idents@npm:^5.1.1": version: 5.1.1 resolution: "postcss-merge-idents@npm:5.1.1" @@ -16094,6 +19044,18 @@ __metadata: languageName: node linkType: hard +"postcss-merge-idents@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-merge-idents@npm:6.0.3" + dependencies: + cssnano-utils: "npm:^4.0.2" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: fdb51d971df33218bd5fdd9619e5a4d854e23affcea51f96bf4391260cb8d0bec937854582fa9a19bde1fa1b2a43fa5a2f179da23a3adeb8e8d292a4749a8ed7 + languageName: node + linkType: hard + "postcss-merge-longhand@npm:^5.1.6": version: 5.1.6 resolution: "postcss-merge-longhand@npm:5.1.6" @@ -16118,6 +19080,18 @@ __metadata: languageName: node linkType: hard +"postcss-merge-longhand@npm:^6.0.5": + version: 6.0.5 + resolution: "postcss-merge-longhand@npm:6.0.5" + dependencies: + postcss-value-parser: "npm:^4.2.0" + stylehacks: "npm:^6.1.1" + peerDependencies: + postcss: ^8.4.31 + checksum: 5a223a7f698c05ab42e9997108a7ff27ea1e0c33a11a353d65a04fc89c3b5b750b9e749550d76b6406329117a055adfc79dde7fee48dca5c8e167a2854ae3fea + languageName: node + linkType: hard + "postcss-merge-rules@npm:^5.1.2": version: 5.1.2 resolution: "postcss-merge-rules@npm:5.1.2" @@ -16146,6 +19120,20 @@ __metadata: languageName: node linkType: hard +"postcss-merge-rules@npm:^6.1.1": + version: 6.1.1 + resolution: "postcss-merge-rules@npm:6.1.1" + dependencies: + browserslist: "npm:^4.23.0" + caniuse-api: "npm:^3.0.0" + cssnano-utils: "npm:^4.0.2" + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: 6d8952dbb19b1e59bf5affe0871fa1be6515103466857cff5af879d6cf619659f8642ec7a931cabb7cdbd393d8c1e91748bf70bee70fa3edea010d4e25786d04 + languageName: node + linkType: hard + "postcss-minify-font-values@npm:^5.1.0": version: 5.1.0 resolution: "postcss-minify-font-values@npm:5.1.0" @@ -16157,6 +19145,17 @@ __metadata: languageName: node linkType: hard +"postcss-minify-font-values@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-minify-font-values@npm:6.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 0d6567170c22a7db42096b5eac298f041614890fbe01759a9fa5ccda432f2bb09efd399d92c11bf6675ae13ccd259db4602fad3c358317dee421df5f7ab0a003 + languageName: node + linkType: hard + "postcss-minify-gradients@npm:^5.1.1": version: 5.1.1 resolution: "postcss-minify-gradients@npm:5.1.1" @@ -16170,6 +19169,19 @@ __metadata: languageName: node linkType: hard +"postcss-minify-gradients@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-minify-gradients@npm:6.0.3" + dependencies: + colord: "npm:^2.9.3" + cssnano-utils: "npm:^4.0.2" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 7fcbcec94fe5455b89fe1b424a451198e60e0407c894bbacdc062d9fdef2f8571b483b5c3bb17f22d2f1249431251b2de22e1e4e8b0614d10624f8ee6e71afd2 + languageName: node + linkType: hard + "postcss-minify-params@npm:^5.1.3": version: 5.1.3 resolution: "postcss-minify-params@npm:5.1.3" @@ -16196,6 +19208,19 @@ __metadata: languageName: node linkType: hard +"postcss-minify-params@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-minify-params@npm:6.1.0" + dependencies: + browserslist: "npm:^4.23.0" + cssnano-utils: "npm:^4.0.2" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: e5c38c3e5fb42e2ca165764f983716e57d854a63a477f7389ccc94cd2ab8123707006613bd7f29acc6eafd296fff513aa6d869c98ac52590f886d641cb21a59e + languageName: node + linkType: hard + "postcss-minify-selectors@npm:^5.2.1": version: 5.2.1 resolution: "postcss-minify-selectors@npm:5.2.1" @@ -16207,6 +19232,17 @@ __metadata: languageName: node linkType: hard +"postcss-minify-selectors@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-minify-selectors@npm:6.0.4" + dependencies: + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: 695ec2e1e3a7812b0cabe1105d0ed491760be3d8e9433914fb5af1fc30a84e6dc24089cd31b7e300de620b8e7adf806526c1acf8dd14077a7d1d2820c60a327c + languageName: node + linkType: hard + "postcss-modules-extract-imports@npm:^3.0.0": version: 3.0.0 resolution: "postcss-modules-extract-imports@npm:3.0.0" @@ -16251,6 +19287,19 @@ __metadata: languageName: node linkType: hard +"postcss-nesting@npm:^13.0.1": + version: 13.0.1 + resolution: "postcss-nesting@npm:13.0.1" + dependencies: + "@csstools/selector-resolve-nested": "npm:^3.0.0" + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 549307c272cdd4cb5105d8fbcd582f15a1cb74e5bba240b05b27f77fe0422730be966699a49a9ad15fd9d1bc551c1edbaefb21a69686a9b131b585dbc9d90ebf + languageName: node + linkType: hard + "postcss-normalize-charset@npm:^5.1.0": version: 5.1.0 resolution: "postcss-normalize-charset@npm:5.1.0" @@ -16260,6 +19309,15 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-charset@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-charset@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: af32a3b4cf94163d728b8aa935b2494c9f69fbc96a33b35f67ae15dbdef7fcc8732569df97cbaaf20ca6c0103c39adad0cfce2ba07ffed283796787f6c36f410 + languageName: node + linkType: hard + "postcss-normalize-display-values@npm:^5.1.0": version: 5.1.0 resolution: "postcss-normalize-display-values@npm:5.1.0" @@ -16271,6 +19329,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-display-values@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-display-values@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 782761850c7e697fdb6c3ff53076de716a71b60f9e835efb2f7ef238de347c88b5d55f0d43cf5c608e1ee58de65360e3d9fccd5f20774bba08ded7c87d8a5651 + languageName: node + linkType: hard + "postcss-normalize-positions@npm:^5.1.1": version: 5.1.1 resolution: "postcss-normalize-positions@npm:5.1.1" @@ -16282,6 +19351,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-positions@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-positions@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 9fdd42a47226bbda5f68774f3c4c3a90eb4fa708aef5a997c6a52fe6cac06585c9774038fe3bc1aa86a203c29223b8d8db6ebe7580c1aa293154f2b48db0b038 + languageName: node + linkType: hard + "postcss-normalize-repeat-style@npm:^5.1.1": version: 5.1.1 resolution: "postcss-normalize-repeat-style@npm:5.1.1" @@ -16293,6 +19373,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-repeat-style@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-repeat-style@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 9133ccbdf1286920c1cd0d01c1c5fa0bd3251b717f2f3e47d691dcc44978ac1dc419d20d9ae5428bd48ee542059e66b823ba699356f5968ccced5606c7c7ca34 + languageName: node + linkType: hard + "postcss-normalize-string@npm:^5.1.0": version: 5.1.0 resolution: "postcss-normalize-string@npm:5.1.0" @@ -16304,6 +19395,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-string@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-string@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: fecc2d52c4029b24fecf2ca2fb45df5dbdf9f35012194ad4ea80bc7be3252cdcb21a0976400902320595aa6178f2cc625cc804c6b6740aef6efa42105973a205 + languageName: node + linkType: hard + "postcss-normalize-timing-functions@npm:^5.1.0": version: 5.1.0 resolution: "postcss-normalize-timing-functions@npm:5.1.0" @@ -16315,6 +19417,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-timing-functions@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-timing-functions@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: a22af0b3374704e59ae70bbbcc66b7029137e284f04e30a2ad548818d1540d6c1ed748dd8f689b9b6df5c1064085a00ad07b6f7e25ffaad49d4e661b616cdeae + languageName: node + linkType: hard + "postcss-normalize-unicode@npm:^5.1.0": version: 5.1.0 resolution: "postcss-normalize-unicode@npm:5.1.0" @@ -16339,6 +19452,18 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-unicode@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-normalize-unicode@npm:6.1.0" + dependencies: + browserslist: "npm:^4.23.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: ff5746670d94dd97b49a0955c3c71ff516fb4f54bbae257f877d179bacc44a62e50a0fd6e7ddf959f2ca35c335de4266b0c275d880bb57ad7827189339ab1582 + languageName: node + linkType: hard + "postcss-normalize-url@npm:^5.1.0": version: 5.1.0 resolution: "postcss-normalize-url@npm:5.1.0" @@ -16351,6 +19476,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-url@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-url@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 4718f1c0657788d2c560b340ee8e0a4eb3eb053eba6fbbf489e9a6e739b4c5f9ce1957f54bd03497c50a1f39962bf6ab9ff6ba4976b69dd160f6afd1670d69b7 + languageName: node + linkType: hard + "postcss-normalize-whitespace@npm:^5.1.1": version: 5.1.1 resolution: "postcss-normalize-whitespace@npm:5.1.1" @@ -16362,6 +19498,26 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-whitespace@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-whitespace@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: d5275a88e29a894aeb83a2a833e816d2456dbf3f39961628df596ce205dcc4895186a023812ff691945e0804241ccc53e520d16591b5812288474b474bbaf652 + languageName: node + linkType: hard + +"postcss-opacity-percentage@npm:^3.0.0": + version: 3.0.0 + resolution: "postcss-opacity-percentage@npm:3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 15c7d66036fa966d265c8737196646b3f93deb83d4eea0b17ed5033460599afc31d3a989345e4d7c472963b2a2bb75c83d06979d5d30d6a60fcc7f74cb6d8d40 + languageName: node + linkType: hard + "postcss-ordered-values@npm:^5.1.3": version: 5.1.3 resolution: "postcss-ordered-values@npm:5.1.3" @@ -16374,6 +19530,133 @@ __metadata: languageName: node linkType: hard +"postcss-ordered-values@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-ordered-values@npm:6.0.2" + dependencies: + cssnano-utils: "npm:^4.0.2" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: aece23a289228aa804217a85f8da198d22b9123f02ca1310b81834af380d6fbe115e4300683599b4a2ab7f1c6a1dbd6789724c47c38e2b0a3774f2ea4b4f0963 + languageName: node + linkType: hard + +"postcss-overflow-shorthand@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-overflow-shorthand@npm:6.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 6598321b2ed0b68461135395bba9c7f76a4672617770df1e8487f459bc975f4ded6c3d37b6f72a44f4f77f7b6789e0c6f927e66dbbf1bcde1537167dbea39968 + languageName: node + linkType: hard + +"postcss-page-break@npm:^3.0.4": + version: 3.0.4 + resolution: "postcss-page-break@npm:3.0.4" + peerDependencies: + postcss: ^8 + checksum: eaaf4d8922b35f2acd637eb059f7e2510b24d65eb8f31424799dd5a98447b6ef010b41880c26e78f818e00f842295638ec75f89d5d489067f53e3dd3db74a00f + languageName: node + linkType: hard + +"postcss-place@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-place@npm:10.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: ebb13deaac7648ba6042622375a31f78fbcc5209b7d196e478debbdf94525963fe621c932f4737a5b6b3d487af3b5ed6d059ed6193fdcbff6d3d5b150886ccc1 + languageName: node + linkType: hard + +"postcss-preset-env@npm:^10.1.0": + version: 10.1.1 + resolution: "postcss-preset-env@npm:10.1.1" + dependencies: + "@csstools/postcss-cascade-layers": "npm:^5.0.1" + "@csstools/postcss-color-function": "npm:^4.0.6" + "@csstools/postcss-color-mix-function": "npm:^3.0.6" + "@csstools/postcss-content-alt-text": "npm:^2.0.4" + "@csstools/postcss-exponential-functions": "npm:^2.0.5" + "@csstools/postcss-font-format-keywords": "npm:^4.0.0" + "@csstools/postcss-gamut-mapping": "npm:^2.0.6" + "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.6" + "@csstools/postcss-hwb-function": "npm:^4.0.6" + "@csstools/postcss-ic-unit": "npm:^4.0.0" + "@csstools/postcss-initial": "npm:^2.0.0" + "@csstools/postcss-is-pseudo-class": "npm:^5.0.1" + "@csstools/postcss-light-dark-function": "npm:^2.0.7" + "@csstools/postcss-logical-float-and-clear": "npm:^3.0.0" + "@csstools/postcss-logical-overflow": "npm:^2.0.0" + "@csstools/postcss-logical-overscroll-behavior": "npm:^2.0.0" + "@csstools/postcss-logical-resize": "npm:^3.0.0" + "@csstools/postcss-logical-viewport-units": "npm:^3.0.3" + "@csstools/postcss-media-minmax": "npm:^2.0.5" + "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.4" + "@csstools/postcss-nested-calc": "npm:^4.0.0" + "@csstools/postcss-normalize-display-values": "npm:^4.0.0" + "@csstools/postcss-oklab-function": "npm:^4.0.6" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/postcss-random-function": "npm:^1.0.1" + "@csstools/postcss-relative-color-syntax": "npm:^3.0.6" + "@csstools/postcss-scope-pseudo-class": "npm:^4.0.1" + "@csstools/postcss-sign-functions": "npm:^1.1.0" + "@csstools/postcss-stepped-value-functions": "npm:^4.0.5" + "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.1" + "@csstools/postcss-trigonometric-functions": "npm:^4.0.5" + "@csstools/postcss-unset-value": "npm:^4.0.0" + autoprefixer: "npm:^10.4.19" + browserslist: "npm:^4.23.1" + css-blank-pseudo: "npm:^7.0.1" + css-has-pseudo: "npm:^7.0.1" + css-prefers-color-scheme: "npm:^10.0.0" + cssdb: "npm:^8.2.1" + postcss-attribute-case-insensitive: "npm:^7.0.1" + postcss-clamp: "npm:^4.1.0" + postcss-color-functional-notation: "npm:^7.0.6" + postcss-color-hex-alpha: "npm:^10.0.0" + postcss-color-rebeccapurple: "npm:^10.0.0" + postcss-custom-media: "npm:^11.0.5" + postcss-custom-properties: "npm:^14.0.4" + postcss-custom-selectors: "npm:^8.0.4" + postcss-dir-pseudo-class: "npm:^9.0.1" + postcss-double-position-gradients: "npm:^6.0.0" + postcss-focus-visible: "npm:^10.0.1" + postcss-focus-within: "npm:^9.0.1" + postcss-font-variant: "npm:^5.0.0" + postcss-gap-properties: "npm:^6.0.0" + postcss-image-set-function: "npm:^7.0.0" + postcss-lab-function: "npm:^7.0.6" + postcss-logical: "npm:^8.0.0" + postcss-nesting: "npm:^13.0.1" + postcss-opacity-percentage: "npm:^3.0.0" + postcss-overflow-shorthand: "npm:^6.0.0" + postcss-page-break: "npm:^3.0.4" + postcss-place: "npm:^10.0.0" + postcss-pseudo-class-any-link: "npm:^10.0.1" + postcss-replace-overflow-wrap: "npm:^4.0.0" + postcss-selector-not: "npm:^8.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 99931117735a66827c7318be023ddb614990457617ccbe7fd2fdc1f10345554652df180d4842768d68d57e14fc0be4d86d0b413c65e77e02db5511e57ed07c4f + languageName: node + linkType: hard + +"postcss-pseudo-class-any-link@npm:^10.0.1": + version: 10.0.1 + resolution: "postcss-pseudo-class-any-link@npm:10.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 95e883996e87baf14fc09d25f9a763a2e9d599eb3b9c6b736e83a8c3d0b55841bcb886bccdf51b5b7fefc128cbd0187ad8841f59878f85bd1613642e592d7673 + languageName: node + linkType: hard + "postcss-reduce-idents@npm:^5.2.0": version: 5.2.0 resolution: "postcss-reduce-idents@npm:5.2.0" @@ -16385,6 +19668,17 @@ __metadata: languageName: node linkType: hard +"postcss-reduce-idents@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-reduce-idents@npm:6.0.3" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: d9f9209e52ebb3d1d7feefc0be24fc74792e064e0fdec99554f050c6b882c61073d5d40986c545061b30e5ead881615e92c965dc765d8d83b2dec10d6a664e1f + languageName: node + linkType: hard + "postcss-reduce-initial@npm:^5.1.0": version: 5.1.0 resolution: "postcss-reduce-initial@npm:5.1.0" @@ -16409,6 +19703,18 @@ __metadata: languageName: node linkType: hard +"postcss-reduce-initial@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-reduce-initial@npm:6.1.0" + dependencies: + browserslist: "npm:^4.23.0" + caniuse-api: "npm:^3.0.0" + peerDependencies: + postcss: ^8.4.31 + checksum: a8f28cf51ce9a1b9423cce1a01c1d7cbee90125930ec36435a0073e73aef402d90affe2fd3600c964b679cf738869fda447b95a9acce74414e9d67d5c6ba8646 + languageName: node + linkType: hard + "postcss-reduce-transforms@npm:^5.1.0": version: 5.1.0 resolution: "postcss-reduce-transforms@npm:5.1.0" @@ -16420,6 +19726,47 @@ __metadata: languageName: node linkType: hard +"postcss-reduce-transforms@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-reduce-transforms@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 755ef27b3d083f586ac831f0c611a66e76f504d27e2100dc7674f6b86afad597901b4520cb889fe58ca70e852aa7fd0c0acb69a63d39dfe6a95860b472394e7c + languageName: node + linkType: hard + +"postcss-replace-overflow-wrap@npm:^4.0.0": + version: 4.0.0 + resolution: "postcss-replace-overflow-wrap@npm:4.0.0" + peerDependencies: + postcss: ^8.0.3 + checksum: 451361b714528cd3632951256ef073769cde725a46cda642a6864f666fb144921fa55e614aec1bcf5946f37d6ffdcca3b932b76f3d997c07b076e8db152b128d + languageName: node + linkType: hard + +"postcss-selector-not@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-selector-not@npm:8.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 491ea3dcc421cd90135be786078521605e2062fb93624ea8813cfd5ba0d35143f931e2e608d5f20effd5ea7d3f4786d2afea2afa42d117779a0288e135f132b6 + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e + languageName: node + linkType: hard + "postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.9": version: 6.0.10 resolution: "postcss-selector-parser@npm:6.0.10" @@ -16430,6 +19777,16 @@ __metadata: languageName: node linkType: hard +"postcss-selector-parser@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-selector-parser@npm:7.0.0" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: e96e096afcce70bf5c97789f5ea09d7415ae5eb701d82b05b5e8532885d31363b484fcb1ca9488c9a331f30508d9e5bb6c3109eb2eb5067ef3d3919f9928cd9d + languageName: node + linkType: hard + "postcss-sort-media-queries@npm:^4.4.1": version: 4.4.1 resolution: "postcss-sort-media-queries@npm:4.4.1" @@ -16441,6 +19798,17 @@ __metadata: languageName: node linkType: hard +"postcss-sort-media-queries@npm:^5.2.0": + version: 5.2.0 + resolution: "postcss-sort-media-queries@npm:5.2.0" + dependencies: + sort-css-media-queries: "npm:2.2.0" + peerDependencies: + postcss: ^8.4.23 + checksum: 5e7f265a21999bdbf6592f7e15b3e889dd93bc9b15fe048958e8f85603ac276e69ef50305e8b41b10f4eea68917c9c25c7956fa9c3ba7f8577c1149416d35c4e + languageName: node + linkType: hard + "postcss-svgo@npm:^5.1.0": version: 5.1.0 resolution: "postcss-svgo@npm:5.1.0" @@ -16453,6 +19821,18 @@ __metadata: languageName: node linkType: hard +"postcss-svgo@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-svgo@npm:6.0.3" + dependencies: + postcss-value-parser: "npm:^4.2.0" + svgo: "npm:^3.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 994b15a88cbb411f32cfa98957faa5623c76f2d75fede51f5f47238f06b367ebe59c204fecbdaf21ccb9e727239a4b290087e04c502392658a0c881ddfbd61f2 + languageName: node + linkType: hard + "postcss-unique-selectors@npm:^5.1.1": version: 5.1.1 resolution: "postcss-unique-selectors@npm:5.1.1" @@ -16464,6 +19844,17 @@ __metadata: languageName: node linkType: hard +"postcss-unique-selectors@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-unique-selectors@npm:6.0.4" + dependencies: + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: bfb99d8a7c675c93f2e65c9d9d563477bfd46fdce9e2727d42d57982b31ccbaaf944e8034bfbefe48b3119e77fba7eb1b181c19b91cb3a5448058fa66a7c9ae9 + languageName: node + linkType: hard + "postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": version: 4.2.0 resolution: "postcss-value-parser@npm:4.2.0" @@ -16480,6 +19871,15 @@ __metadata: languageName: node linkType: hard +"postcss-zindex@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-zindex@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 346291703e1f2dd954144d2bb251713dad6ae10e8aa05c3873dee2fc7a30d72da7866bec060abd932b9b839bc1495f73d813dde5312750a69d7ad33c435ce7ea + languageName: node + linkType: hard + "postcss@npm:^8.4.17, postcss@npm:^8.4.21, postcss@npm:^8.4.26": version: 8.4.31 resolution: "postcss@npm:8.4.31" @@ -16491,6 +19891,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.24, postcss@npm:^8.4.38": + version: 8.4.49 + resolution: "postcss@npm:8.4.49" + dependencies: + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: f1b3f17aaf36d136f59ec373459f18129908235e65dbdc3aee5eef8eba0756106f52de5ec4682e29a2eab53eb25170e7e871b3e4b52a8f1de3d344a514306be3 + languageName: node + linkType: hard + "pretty-error@npm:^4.0.0": version: 4.0.0 resolution: "pretty-error@npm:4.0.0" @@ -16948,6 +20359,17 @@ __metadata: languageName: node linkType: hard +"react-loadable@npm:@docusaurus/react-loadable@6.0.0": + version: 6.0.0 + resolution: "@docusaurus/react-loadable@npm:6.0.0" + dependencies: + "@types/react": "npm:*" + peerDependencies: + react: "*" + checksum: 6b145d1a8d2e7342ceef58dd154aa990322f72a6cb98955ab8ce8e3f0dc7f0c5d00f9c2e4efa8d356c5effed72a130b5588857332b11faba0398f5429b484b04 + languageName: node + linkType: hard + "react-router-config@npm:^5.1.1": version: 5.1.1 resolution: "react-router-config@npm:5.1.1" @@ -17121,6 +20543,15 @@ __metadata: languageName: node linkType: hard +"regenerate-unicode-properties@npm:^10.2.0": + version: 10.2.0 + resolution: "regenerate-unicode-properties@npm:10.2.0" + dependencies: + regenerate: "npm:^1.4.2" + checksum: 5510785eeaf56bbfdf4e663d6753f125c08d2a372d4107bc1b756b7bf142e2ed80c2733a8b54e68fb309ba37690e66a0362699b0e21d5c1f0255dea1b00e6460 + languageName: node + linkType: hard + "regenerate@npm:^1.4.2": version: 1.4.2 resolution: "regenerate@npm:1.4.2" @@ -17179,6 +20610,20 @@ __metadata: languageName: node linkType: hard +"regexpu-core@npm:^6.1.1": + version: 6.2.0 + resolution: "regexpu-core@npm:6.2.0" + dependencies: + regenerate: "npm:^1.4.2" + regenerate-unicode-properties: "npm:^10.2.0" + regjsgen: "npm:^0.8.0" + regjsparser: "npm:^0.12.0" + unicode-match-property-ecmascript: "npm:^2.0.0" + unicode-match-property-value-ecmascript: "npm:^2.1.0" + checksum: bbcb83a854bf96ce4005ee4e4618b71c889cda72674ce6092432f0039b47890c2d0dfeb9057d08d440999d9ea03879ebbb7f26ca005ccf94390e55c348859b98 + languageName: node + linkType: hard + "registry-auth-token@npm:^5.0.1": version: 5.0.2 resolution: "registry-auth-token@npm:5.0.2" @@ -17204,6 +20649,24 @@ __metadata: languageName: node linkType: hard +"regjsgen@npm:^0.8.0": + version: 0.8.0 + resolution: "regjsgen@npm:0.8.0" + checksum: 44f526c4fdbf0b29286101a282189e4dbb303f4013cf3fea058668d96d113b9180d3d03d1e13f6d4cbde38b7728bf951aecd9dc199938c080093a9a6f0d7a6bd + languageName: node + linkType: hard + +"regjsparser@npm:^0.12.0": + version: 0.12.0 + resolution: "regjsparser@npm:0.12.0" + dependencies: + jsesc: "npm:~3.0.2" + bin: + regjsparser: bin/parser + checksum: 99d3e4e10c8c7732eb7aa843b8da2fd8b647fe144d3711b480e4647dc3bff4b1e96691ccf17f3ace24aa866a50b064236177cb25e6e4fbbb18285d99edaed83b + languageName: node + linkType: hard + "regjsparser@npm:^0.8.2": version: 0.8.4 resolution: "regjsparser@npm:0.8.4" @@ -17392,6 +20855,13 @@ __metadata: languageName: node linkType: hard +"repeat-string@npm:^1.0.0": + version: 1.6.1 + resolution: "repeat-string@npm:1.6.1" + checksum: 87fa21bfdb2fbdedc44b9a5b118b7c1239bdd2c2c1e42742ef9119b7d412a5137a1d23f1a83dc6bb686f4f27429ac6f542e3d923090b44181bafa41e8ac0174d + languageName: node + linkType: hard + "request@npm:^2.79.0": version: 2.88.2 resolution: "request@npm:2.88.2" @@ -17577,6 +21047,18 @@ __metadata: languageName: node linkType: hard +"roughjs@npm:^4.6.6": + version: 4.6.6 + resolution: "roughjs@npm:4.6.6" + dependencies: + hachure-fill: "npm:^0.5.2" + path-data-parser: "npm:^0.1.0" + points-on-curve: "npm:^0.2.0" + points-on-path: "npm:^0.2.1" + checksum: 68c11bf4516aa014cef2fe52426a9bab237c2f500d13e1a4f13b523cb5723667bf2d92b9619325efdc5bc2a193588ff5af8d51683df17cfb8720e96fe2b92b0c + languageName: node + linkType: hard + "rpc-websockets@npm:^9.0.2": version: 9.0.2 resolution: "rpc-websockets@npm:9.0.2" @@ -17645,15 +21127,6 @@ __metadata: languageName: node linkType: hard -"sade@npm:^1.7.3": - version: 1.8.1 - resolution: "sade@npm:1.8.1" - dependencies: - mri: "npm:^1.1.0" - checksum: da8a3a5d667ad5ce3bf6d4f054bbb9f711103e5df21003c5a5c1a8a77ce12b640ed4017dd423b13c2307ea7e645adee7c2ae3afe8051b9db16a6f6d3da3f90b1 - languageName: node - linkType: hard - "safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" @@ -17736,10 +21209,22 @@ __metadata: resolution: "schema-utils@npm:4.0.0" dependencies: "@types/json-schema": "npm:^7.0.9" - ajv: "npm:^8.8.0" + ajv: "npm:^8.8.0" + ajv-formats: "npm:^2.1.1" + ajv-keywords: "npm:^5.0.0" + checksum: d76f1b0724fb74fa9da19d4f98ebe89c2703d8d28df9dc44d66ab9a9cbca869b434181a36a2bc00ec53980f27e8fabe143759bdc8754692bbf7ef614fc6e9da4 + languageName: node + linkType: hard + +"schema-utils@npm:^4.0.1": + version: 4.2.0 + resolution: "schema-utils@npm:4.2.0" + dependencies: + "@types/json-schema": "npm:^7.0.9" + ajv: "npm:^8.9.0" ajv-formats: "npm:^2.1.1" - ajv-keywords: "npm:^5.0.0" - checksum: d76f1b0724fb74fa9da19d4f98ebe89c2703d8d28df9dc44d66ab9a9cbca869b434181a36a2bc00ec53980f27e8fabe143759bdc8754692bbf7ef614fc6e9da4 + ajv-keywords: "npm:^5.1.0" + checksum: 8dab7e7800316387fd8569870b4b668cfcecf95ac551e369ea799bbcbfb63fb0365366d4b59f64822c9f7904d8c5afcfaf5a6124a4b08783e558cd25f299a6b4 languageName: node linkType: hard @@ -17902,6 +21387,21 @@ __metadata: languageName: node linkType: hard +"serve-handler@npm:^6.1.6": + version: 6.1.6 + resolution: "serve-handler@npm:6.1.6" + dependencies: + bytes: "npm:3.0.0" + content-disposition: "npm:0.5.2" + mime-types: "npm:2.1.18" + minimatch: "npm:3.1.2" + path-is-inside: "npm:1.0.2" + path-to-regexp: "npm:3.3.0" + range-parser: "npm:1.2.0" + checksum: 1e1cb6bbc51ee32bc1505f2e0605bdc2e96605c522277c977b67f83be9d66bd1eec8604388714a4d728e036d86b629bc9aec02120ea030d3d2c3899d44696503 + languageName: node + linkType: hard + "serve-index@npm:^1.9.1": version: 1.9.1 resolution: "serve-index@npm:1.9.1" @@ -18176,6 +21676,16 @@ __metadata: languageName: node linkType: hard +"snake-case@npm:^3.0.4": + version: 3.0.4 + resolution: "snake-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: ab19a913969f58f4474fe9f6e8a026c8a2142a01f40b52b79368068343177f818cdfef0b0c6b9558f298782441d5ca8ed5932eb57822439fad791d866e62cecd + languageName: node + linkType: hard + "sockjs@npm:^0.3.24": version: 0.3.24 resolution: "sockjs@npm:0.3.24" @@ -18224,6 +21734,20 @@ __metadata: languageName: node linkType: hard +"sort-css-media-queries@npm:2.2.0": + version: 2.2.0 + resolution: "sort-css-media-queries@npm:2.2.0" + checksum: 7478308c7ca93409f959ab993d41de2f0515ed5f51b671908ecb777aae0d63be97b454d59d80e14ee4874884618a2e825d4ae7ccb225779276904dd175f4e766 + languageName: node + linkType: hard + +"source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + "source-map-js@npm:^1.0.2": version: 1.0.2 resolution: "source-map-js@npm:1.0.2" @@ -18368,6 +21892,13 @@ __metadata: languageName: node linkType: hard +"std-env@npm:^3.7.0": + version: 3.8.0 + resolution: "std-env@npm:3.8.0" + checksum: f560a2902fd0fa3d648d7d0acecbd19d664006f7372c1fba197ed4c216b4c9e48db6e2769b5fe1616d42a9333c9f066c5011935035e85c59f45dc4f796272040 + languageName: node + linkType: hard + "strict-uri-encode@npm:^1.0.0": version: 1.1.0 resolution: "strict-uri-encode@npm:1.1.0" @@ -18540,10 +22071,22 @@ __metadata: languageName: node linkType: hard -"stylis@npm:^4.1.3": - version: 4.3.0 - resolution: "stylis@npm:4.3.0" - checksum: 5a9f7e0cf2a15591efaacc1c6416a8785d2b57522cd38bb8e0a81a03c23d3bea2363659fa5f9d486a73d1b6ebaf1d32826ce1c1974c95afdb5b495d98acb25c0 +"stylehacks@npm:^6.1.1": + version: 6.1.1 + resolution: "stylehacks@npm:6.1.1" + dependencies: + browserslist: "npm:^4.23.0" + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: 2dd2bccfd8311ff71492e63a7b8b86c3d7b1fff55d4ba5a2357aff97743e633d351cdc2f5ae3c0057637d00dab4ef5fc5b218a1b370e4585a41df22b5a5128be + languageName: node + linkType: hard + +"stylis@npm:^4.3.1": + version: 4.3.4 + resolution: "stylis@npm:4.3.4" + checksum: 4899c2674cd2538e314257abd1ba7ea3c2176439659ddac6593c78192cfd4a06f814a0a4fc69bc7f8fcc6b997e13d383dd9b578b71074746a0fb86045a83e42d languageName: node linkType: hard @@ -18612,6 +22155,23 @@ __metadata: languageName: node linkType: hard +"svgo@npm:^3.0.2, svgo@npm:^3.2.0": + version: 3.3.2 + resolution: "svgo@npm:3.3.2" + dependencies: + "@trysound/sax": "npm:0.2.0" + commander: "npm:^7.2.0" + css-select: "npm:^5.1.0" + css-tree: "npm:^2.3.1" + css-what: "npm:^6.1.0" + csso: "npm:^5.0.5" + picocolors: "npm:^1.0.0" + bin: + svgo: ./bin/svgo + checksum: a6badbd3d1d6dbb177f872787699ab34320b990d12e20798ecae915f0008796a0f3c69164f1485c9def399e0ce0a5683eb4a8045e51a5e1c364bb13a0d9f79e1 + languageName: node + linkType: hard + "swarm-js@npm:^0.1.40": version: 0.1.42 resolution: "swarm-js@npm:0.1.42" @@ -18645,7 +22205,7 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0": +"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": version: 2.2.1 resolution: "tapable@npm:2.2.1" checksum: bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 @@ -18681,6 +22241,28 @@ __metadata: languageName: node linkType: hard +"terser-webpack-plugin@npm:^5.3.10": + version: 5.3.10 + resolution: "terser-webpack-plugin@npm:5.3.10" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.20" + jest-worker: "npm:^27.4.5" + schema-utils: "npm:^3.1.1" + serialize-javascript: "npm:^6.0.1" + terser: "npm:^5.26.0" + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 66d1ed3174542560911cf96f4716aeea8d60e7caab212291705d50072b6ba844c7391442541b13c848684044042bea9ec87512b8506528c12854943da05faf91 + languageName: node + linkType: hard + "terser-webpack-plugin@npm:^5.3.7, terser-webpack-plugin@npm:^5.3.9": version: 5.3.9 resolution: "terser-webpack-plugin@npm:5.3.9" @@ -18731,6 +22313,20 @@ __metadata: languageName: node linkType: hard +"terser@npm:^5.26.0": + version: 5.36.0 + resolution: "terser@npm:5.36.0" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: f4ed2bead19f64789ddcfb85b7cef78f3942f967b8890c54f57d1e35bc7d547d551c6a4c32210bce6ba45b1c738314bbfac6acbc6c762a45cd171777d0c120d9 + languageName: node + linkType: hard + "text-encoding-utf-8@npm:^1.0.2": version: 1.0.2 resolution: "text-encoding-utf-8@npm:1.0.2" @@ -18789,6 +22385,13 @@ __metadata: languageName: node linkType: hard +"tinyexec@npm:^0.3.0": + version: 0.3.1 + resolution: "tinyexec@npm:0.3.1" + checksum: 11e7a7c5d8b3bddf8b5cbe82a9290d70a6fad84d528421d5d18297f165723cb53d2e737d8f58dcce5ca56f2e4aa2d060f02510b1f8971784f97eb3e9aec28f09 + languageName: node + linkType: hard + "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -18929,6 +22532,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + "type-fest@npm:^1.0.1": version: 1.4.0 resolution: "type-fest@npm:1.4.0" @@ -18996,6 +22606,13 @@ __metadata: languageName: node linkType: hard +"ufo@npm:^1.5.4": + version: 1.5.4 + resolution: "ufo@npm:1.5.4" + checksum: b5dc4dc435c49c9ef8890f1b280a19ee4d0954d1d6f9ab66ce62ce64dd04c7be476781531f952a07c678d51638d02ad4b98e16237be29149295b0f7c09cda765 + languageName: node + linkType: hard + "ultron@npm:~1.1.0": version: 1.1.1 resolution: "ultron@npm:1.1.1" @@ -19162,15 +22779,6 @@ __metadata: languageName: node linkType: hard -"unist-util-stringify-position@npm:^3.0.0": - version: 3.0.3 - resolution: "unist-util-stringify-position@npm:3.0.3" - dependencies: - "@types/unist": "npm:^2.0.0" - checksum: 14550027825230528f6437dad7f2579a841780318569851291be6c8a970bae6f65a7feb24dabbcfce0e5e68cacae85bf12cbda3f360f7c873b4db602bdf7bb21 - languageName: node - linkType: hard - "unist-util-stringify-position@npm:^4.0.0": version: 4.0.0 resolution: "unist-util-stringify-position@npm:4.0.0" @@ -19271,6 +22879,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.1.1": + version: 1.1.1 + resolution: "update-browserslist-db@npm:1.1.1" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.0" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 536a2979adda2b4be81b07e311bd2f3ad5e978690987956bc5f514130ad50cac87cd22c710b686d79731e00fbee8ef43efe5fcd72baa241045209195d43dcc80 + languageName: node + linkType: hard + "update-notifier@npm:^6.0.2": version: 6.0.2 resolution: "update-notifier@npm:6.0.2" @@ -19411,20 +23033,6 @@ __metadata: languageName: node linkType: hard -"uvu@npm:^0.5.0": - version: 0.5.6 - resolution: "uvu@npm:0.5.6" - dependencies: - dequal: "npm:^2.0.0" - diff: "npm:^5.0.0" - kleur: "npm:^4.0.3" - sade: "npm:^1.7.3" - bin: - uvu: bin.js - checksum: ad32eb5f7d94bdeb71f80d073003f0138e24f61ed68cecc8e15d2f30838f44c9670577bb1775c8fac894bf93d1bc1583d470a9195e49bfa6efa14cc6f4942bff - languageName: node - linkType: hard - "value-equal@npm:^1.0.1": version: 1.0.1 resolution: "value-equal@npm:1.0.1" @@ -19532,6 +23140,55 @@ __metadata: languageName: node linkType: hard +"vscode-jsonrpc@npm:8.2.0": + version: 8.2.0 + resolution: "vscode-jsonrpc@npm:8.2.0" + checksum: 0789c227057a844f5ead55c84679206227a639b9fb76e881185053abc4e9848aa487245966cc2393fcb342c4541241b015a1a2559fddd20ac1e68945c95344e6 + languageName: node + linkType: hard + +"vscode-languageserver-protocol@npm:3.17.5": + version: 3.17.5 + resolution: "vscode-languageserver-protocol@npm:3.17.5" + dependencies: + vscode-jsonrpc: "npm:8.2.0" + vscode-languageserver-types: "npm:3.17.5" + checksum: 5f38fd80da9868d706eaa4a025f4aff9c3faad34646bcde1426f915cbd8d7e8b6c3755ce3fef6eebd256ba3145426af1085305f8a76e34276d2e95aaf339a90b + languageName: node + linkType: hard + +"vscode-languageserver-textdocument@npm:~1.0.11": + version: 1.0.12 + resolution: "vscode-languageserver-textdocument@npm:1.0.12" + checksum: 534349894b059602c4d97615a1147b6c4c031141c2093e59657f54e38570f5989c21b376836f13b9375419869242e9efb4066643208b21ab1e1dee111a0f00fb + languageName: node + linkType: hard + +"vscode-languageserver-types@npm:3.17.5": + version: 3.17.5 + resolution: "vscode-languageserver-types@npm:3.17.5" + checksum: 1e1260de79a2cc8de3e46f2e0182cdc94a7eddab487db5a3bd4ee716f67728e685852707d72c059721ce500447be9a46764a04f0611e94e4321ffa088eef36f8 + languageName: node + linkType: hard + +"vscode-languageserver@npm:~9.0.1": + version: 9.0.1 + resolution: "vscode-languageserver@npm:9.0.1" + dependencies: + vscode-languageserver-protocol: "npm:3.17.5" + bin: + installServerIntoExtension: bin/installServerIntoExtension + checksum: 8a0838d77c98a211c76e54bd3a6249fc877e4e1a73322673fb0e921168d8e91de4f170f1d4ff7e8b6289d0698207afc6aba6662d4c1cd8e4bd7cae96afd6b0c2 + languageName: node + linkType: hard + +"vscode-uri@npm:~3.0.8": + version: 3.0.8 + resolution: "vscode-uri@npm:3.0.8" + checksum: f7f217f526bf109589969fe6e66b71e70b937de1385a1d7bb577ca3ee7c5e820d3856a86e9ff2fa9b7a0bc56a3dd8c3a9a557d3fedd7df414bc618d5e6b567f9 + languageName: node + linkType: hard + "wait-on@npm:^7.0.1": version: 7.1.0 resolution: "wait-on@npm:7.1.0" @@ -19557,6 +23214,16 @@ __metadata: languageName: node linkType: hard +"watchpack@npm:^2.4.1": + version: 2.4.2 + resolution: "watchpack@npm:2.4.2" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: ec60a5f0e9efaeca0102fd9126346b3b2d523e01c34030d3fddf5813a7125765121ebdc2552981136dcd2c852deb1af0b39340f2fcc235f292db5399d0283577 + languageName: node + linkType: hard + "wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": version: 1.7.3 resolution: "wbuf@npm:1.7.3" @@ -19573,13 +23240,6 @@ __metadata: languageName: node linkType: hard -"web-worker@npm:^1.2.0": - version: 1.2.0 - resolution: "web-worker@npm:1.2.0" - checksum: 2bec036cd4784148e2f135207c62facf4457a0f2b205d6728013b9f0d7c62404dced95fcd849478387e10c8ae636d665600bd0d99d80b18c3bb2a7f045aa20d8 - languageName: node - linkType: hard - "web3-bzz@npm:1.10.4": version: 1.10.4 resolution: "web3-bzz@npm:1.10.4" @@ -19869,6 +23529,28 @@ __metadata: languageName: node linkType: hard +"webpack-bundle-analyzer@npm:^4.10.2": + version: 4.10.2 + resolution: "webpack-bundle-analyzer@npm:4.10.2" + dependencies: + "@discoveryjs/json-ext": "npm:0.5.7" + acorn: "npm:^8.0.4" + acorn-walk: "npm:^8.0.0" + commander: "npm:^7.2.0" + debounce: "npm:^1.2.1" + escape-string-regexp: "npm:^4.0.0" + gzip-size: "npm:^6.0.0" + html-escaper: "npm:^2.0.2" + opener: "npm:^1.5.2" + picocolors: "npm:^1.0.0" + sirv: "npm:^2.0.3" + ws: "npm:^7.3.1" + bin: + webpack-bundle-analyzer: lib/bin/analyzer.js + checksum: 00603040e244ead15b2d92981f0559fa14216381349412a30070a7358eb3994cd61a8221d34a3b3fb8202dc3d1c5ee1fbbe94c5c52da536e5b410aa1cf279a48 + languageName: node + linkType: hard + "webpack-bundle-analyzer@npm:^4.9.0": version: 4.9.1 resolution: "webpack-bundle-analyzer@npm:4.9.1" @@ -19911,6 +23593,21 @@ __metadata: languageName: node linkType: hard +"webpack-dev-middleware@npm:^5.3.4": + version: 5.3.4 + resolution: "webpack-dev-middleware@npm:5.3.4" + dependencies: + colorette: "npm:^2.0.10" + memfs: "npm:^3.4.3" + mime-types: "npm:^2.1.31" + range-parser: "npm:^1.2.1" + schema-utils: "npm:^4.0.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 257df7d6bc5494d1d3cb66bba70fbdf5a6e0423e39b6420f7631aeb52435afbfbff8410a62146dcdf3d2f945c62e03193aae2ac1194a2f7d5a2523b9d194e9e1 + languageName: node + linkType: hard + "webpack-dev-server@npm:^4.15.1": version: 4.15.1 resolution: "webpack-dev-server@npm:4.15.1" @@ -19958,6 +23655,53 @@ __metadata: languageName: node linkType: hard +"webpack-dev-server@npm:^4.15.2": + version: 4.15.2 + resolution: "webpack-dev-server@npm:4.15.2" + dependencies: + "@types/bonjour": "npm:^3.5.9" + "@types/connect-history-api-fallback": "npm:^1.3.5" + "@types/express": "npm:^4.17.13" + "@types/serve-index": "npm:^1.9.1" + "@types/serve-static": "npm:^1.13.10" + "@types/sockjs": "npm:^0.3.33" + "@types/ws": "npm:^8.5.5" + ansi-html-community: "npm:^0.0.8" + bonjour-service: "npm:^1.0.11" + chokidar: "npm:^3.5.3" + colorette: "npm:^2.0.10" + compression: "npm:^1.7.4" + connect-history-api-fallback: "npm:^2.0.0" + default-gateway: "npm:^6.0.3" + express: "npm:^4.17.3" + graceful-fs: "npm:^4.2.6" + html-entities: "npm:^2.3.2" + http-proxy-middleware: "npm:^2.0.3" + ipaddr.js: "npm:^2.0.1" + launch-editor: "npm:^2.6.0" + open: "npm:^8.0.9" + p-retry: "npm:^4.5.0" + rimraf: "npm:^3.0.2" + schema-utils: "npm:^4.0.0" + selfsigned: "npm:^2.1.1" + serve-index: "npm:^1.9.1" + sockjs: "npm:^0.3.24" + spdy: "npm:^4.0.2" + webpack-dev-middleware: "npm:^5.3.4" + ws: "npm:^8.13.0" + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + bin: + webpack-dev-server: bin/webpack-dev-server.js + checksum: 625bd5b79360afcf98782c8b1fd710b180bb0e96d96b989defff550c546890010ceea82ffbecb2a0a23f7f018bc72f2dee7b3070f7b448fb0110df6657fb2904 + languageName: node + linkType: hard + "webpack-merge@npm:^5.9.0": version: 5.10.0 resolution: "webpack-merge@npm:5.10.0" @@ -19969,6 +23713,17 @@ __metadata: languageName: node linkType: hard +"webpack-merge@npm:^6.0.1": + version: 6.0.1 + resolution: "webpack-merge@npm:6.0.1" + dependencies: + clone-deep: "npm:^4.0.1" + flat: "npm:^5.0.2" + wildcard: "npm:^2.0.1" + checksum: bf1429567858b353641801b8a2696ca0aac270fc8c55d4de8a7b586fe07d27fdcfc83099a98ab47e6162383db8dd63bb8cc25b1beb2ec82150422eec843b0dc0 + languageName: node + linkType: hard + "webpack-sources@npm:^3.2.2, webpack-sources@npm:^3.2.3": version: 3.2.3 resolution: "webpack-sources@npm:3.2.3" @@ -20013,6 +23768,42 @@ __metadata: languageName: node linkType: hard +"webpack@npm:^5.95.0": + version: 5.96.1 + resolution: "webpack@npm:5.96.1" + dependencies: + "@types/eslint-scope": "npm:^3.7.7" + "@types/estree": "npm:^1.0.6" + "@webassemblyjs/ast": "npm:^1.12.1" + "@webassemblyjs/wasm-edit": "npm:^1.12.1" + "@webassemblyjs/wasm-parser": "npm:^1.12.1" + acorn: "npm:^8.14.0" + browserslist: "npm:^4.24.0" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.17.1" + es-module-lexer: "npm:^1.2.1" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.11" + json-parse-even-better-errors: "npm:^2.3.1" + loader-runner: "npm:^4.2.0" + mime-types: "npm:^2.1.27" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^3.2.0" + tapable: "npm:^2.1.1" + terser-webpack-plugin: "npm:^5.3.10" + watchpack: "npm:^2.4.1" + webpack-sources: "npm:^3.2.3" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: ae6052fde9a546f79f14987b65823ba4024c6642a8489339ecfee7a351dff93325842aad453295bbdc6b65fb1690e4ef07529db63aa84ece55c7869e991a0039 + languageName: node + linkType: hard + "webpackbar@npm:^5.0.2": version: 5.0.2 resolution: "webpackbar@npm:5.0.2" @@ -20027,6 +23818,24 @@ __metadata: languageName: node linkType: hard +"webpackbar@npm:^6.0.1": + version: 6.0.1 + resolution: "webpackbar@npm:6.0.1" + dependencies: + ansi-escapes: "npm:^4.3.2" + chalk: "npm:^4.1.2" + consola: "npm:^3.2.3" + figures: "npm:^3.2.0" + markdown-table: "npm:^2.0.0" + pretty-time: "npm:^1.1.0" + std-env: "npm:^3.7.0" + wrap-ansi: "npm:^7.0.0" + peerDependencies: + webpack: 3 || 4 || 5 + checksum: 8dfa2c55f8122f729c7efd515a2b50fb752c0d0cb27ec2ecdbc70d90a86d5f69f466c9c5d01004f71b500dafba957ecd4413fca196a98cf99a39b705f98cae97 + languageName: node + linkType: hard + "websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": version: 0.7.4 resolution: "websocket-driver@npm:0.7.4" @@ -20131,7 +23940,14 @@ __metadata: languageName: node linkType: hard -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wildcard@npm:^2.0.1": + version: 2.0.1 + resolution: "wildcard@npm:2.0.1" + checksum: 08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" dependencies: From 5187f801b8f95bf5a15f9c491335fbcfabf81b1b Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 10:15:31 +0800 Subject: [PATCH 03/20] fix: update Vercel deployment configuration - Update vercel.json to use static-build - Add vercel-build script with cache clearing - Improve routing configuration --- package.json | 1 + vercel.json | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 7d492a55..8c3049db 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "start": "docusaurus start", "dev": "docusaurus start --no-open", "build": "docusaurus build", + "vercel-build": "yarn clear && yarn build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", diff --git a/vercel.json b/vercel.json index 87e1e2af..7e394cf1 100644 --- a/vercel.json +++ b/vercel.json @@ -1,21 +1,22 @@ { - "buildCommand": "yarn build", + "buildCommand": "yarn install && yarn build", "outputDirectory": "build", "framework": "docusaurus-2", "installCommand": "yarn install", "builds": [ { "src": "package.json", - "use": "@vercel/node" + "use": "@vercel/static-build" } ], "routes": [ { "src": "/(.*)", - "dest": "/" + "dest": "/$1" } ], "env": { - "NODE_OPTIONS": "--max_old_space_size=4096" + "NODE_OPTIONS": "--max_old_space_size=4096", + "NODE_ENV": "production" } } From 2191b97a961593703b7c7c7973eb4cf083b910e4 Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 10:17:22 +0800 Subject: [PATCH 04/20] fix: update Vercel configuration for personal deployment - Remove team deployment settings - Add GitHub integration settings - Add .vercelignore --- .vercelignore | 4 ++++ vercel.json | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .vercelignore diff --git a/.vercelignore b/.vercelignore new file mode 100644 index 00000000..346a5bca --- /dev/null +++ b/.vercelignore @@ -0,0 +1,4 @@ +.git +node_modules +.env +.env.* diff --git a/vercel.json b/vercel.json index 7e394cf1..637008ea 100644 --- a/vercel.json +++ b/vercel.json @@ -2,7 +2,6 @@ "buildCommand": "yarn install && yarn build", "outputDirectory": "build", "framework": "docusaurus-2", - "installCommand": "yarn install", "builds": [ { "src": "package.json", @@ -18,5 +17,9 @@ "env": { "NODE_OPTIONS": "--max_old_space_size=4096", "NODE_ENV": "production" + }, + "github": { + "enabled": true, + "silent": true } } From a018ebdfc488b3a03300dfcd42c28ae2c2ea6bfa Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 10:19:58 +0800 Subject: [PATCH 05/20] revert: remove Vercel specific configurations - Remove vercel.json and .vercelignore - Restore original docusaurus.config.js settings - Remove vercel-build script --- .vercelignore | 4 ---- docusaurus.config.js | 18 +++++++++--------- package.json | 1 - vercel.json | 25 ------------------------- 4 files changed, 9 insertions(+), 39 deletions(-) delete mode 100644 .vercelignore delete mode 100644 vercel.json diff --git a/.vercelignore b/.vercelignore deleted file mode 100644 index 346a5bca..00000000 --- a/.vercelignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -node_modules -.env -.env.* diff --git a/docusaurus.config.js b/docusaurus.config.js index 6695f27e..b51e5b4f 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -16,15 +16,15 @@ const config = { favicon: "img/favicon.ico", // Set the production url of your site here - url: "https://hyp-v3-docs.vercel.app", + url: "https://docs.hyperlane.xyz", // Set the // pathname under which your site is served baseUrl: "/", // GitHub pages deployment config. - organizationName: "polibee", // Usually your GitHub org/user name. - projectName: "v3-docs", // Usually your repo name. + organizationName: "hyperlane-xyz", // Usually your GitHub org/user name. + projectName: "hyperlane-monorepo", // Usually your repo name. - onBrokenLinks: "warn", + onBrokenLinks: "throw", onBrokenMarkdownLinks: "warn", // Even if you don't use internalization, you can use this field to set useful @@ -379,7 +379,7 @@ const config = { ], rehypePlugins: [[rehypeKatex, { strict: false }]], sidebarPath: require.resolve("./sidebars.js"), - editUrl: "https://github.com/polibee/v3-docs/tree/main/", + editUrl: "https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/", }, theme: { customCss: require.resolve("./src/css/custom.css"), @@ -447,7 +447,7 @@ const config = { label: "⚙️ Agent Operators", }, { - href: "https://github.com/polibee", + href: "https://github.com/hyperlane-xyz", label: "GitHub", position: "right", }, @@ -477,7 +477,7 @@ const config = { }, { label: "GitHub", - href: "https://github.com/polibee", + href: "https://github.com/hyperlane-xyz", }, ], }, @@ -499,7 +499,7 @@ const config = { items: [ { label: "Bounties", - to: "https://github.com/search?q=org%3Apolibee+label%3Abounty+is%3Aopen+is%3Aissue&type=issues&s=&o=desc", + to: "https://github.com/search?q=org%3Ahyperlane-xyz+label%3Abounty+is%3Aopen+is%3Aissue&type=issues&s=&o=desc", }, { label: "Careers", @@ -508,7 +508,7 @@ const config = { ], }, ], - copyright: `Copyright Š ${new Date().getFullYear()} Abacus Works, core developer for Hyperlane + copyright: `Copyright Š ${new Date().getFullYear()} Hyperlane
Built IRL in New York ✨ and London ðŸ§â€â‚️`, }, diff --git a/package.json b/package.json index 8c3049db..7d492a55 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,6 @@ "start": "docusaurus start", "dev": "docusaurus start --no-open", "build": "docusaurus build", - "vercel-build": "yarn clear && yarn build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", diff --git a/vercel.json b/vercel.json deleted file mode 100644 index 637008ea..00000000 --- a/vercel.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "buildCommand": "yarn install && yarn build", - "outputDirectory": "build", - "framework": "docusaurus-2", - "builds": [ - { - "src": "package.json", - "use": "@vercel/static-build" - } - ], - "routes": [ - { - "src": "/(.*)", - "dest": "/$1" - } - ], - "env": { - "NODE_OPTIONS": "--max_old_space_size=4096", - "NODE_ENV": "production" - }, - "github": { - "enabled": true, - "silent": true - } -} From acc773ebc23424556897b97f84b28cb1486fddf0 Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 10:26:03 +0800 Subject: [PATCH 06/20] fix: update build configurations - Add minimal vercel.json - Update Node.js version requirement - Add dependency management settings --- .npmrc | 2 ++ package.json | 2 +- vercel.json | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 vercel.json diff --git a/.npmrc b/.npmrc index 1759ff91..a4ea8856 100644 --- a/.npmrc +++ b/.npmrc @@ -1,3 +1,5 @@ legacy-peer-deps=true node-linker=hoisted public-hoist-pattern[]=* +auto-install-peers=true +strict-peer-dependencies=false diff --git a/package.json b/package.json index 7d492a55..aab902c6 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ ] }, "engines": { - "node": ">=16.14" + "node": ">=18.0.0" }, "packageManager": "yarn@4.0.1" } diff --git a/vercel.json b/vercel.json new file mode 100644 index 00000000..6ba2074b --- /dev/null +++ b/vercel.json @@ -0,0 +1,6 @@ +{ + "framework": "docusaurus-2", + "buildCommand": "yarn install && yarn build", + "installCommand": "yarn install", + "outputDirectory": "build" +} From 472cd65a5f8a8e7e5890f27c09deb5caae4484d8 Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 10:28:14 +0800 Subject: [PATCH 07/20] revert: remove all Vercel-specific configurations - Remove vercel.json - Restore original Node.js version requirement - Restore original .npmrc settings --- .npmrc | 2 -- package.json | 2 +- vercel.json | 6 ------ 3 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 vercel.json diff --git a/.npmrc b/.npmrc index a4ea8856..1759ff91 100644 --- a/.npmrc +++ b/.npmrc @@ -1,5 +1,3 @@ legacy-peer-deps=true node-linker=hoisted public-hoist-pattern[]=* -auto-install-peers=true -strict-peer-dependencies=false diff --git a/package.json b/package.json index aab902c6..7d492a55 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ ] }, "engines": { - "node": ">=18.0.0" + "node": ">=16.14" }, "packageManager": "yarn@4.0.1" } diff --git a/vercel.json b/vercel.json deleted file mode 100644 index 6ba2074b..00000000 --- a/vercel.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "framework": "docusaurus-2", - "buildCommand": "yarn install && yarn build", - "installCommand": "yarn install", - "outputDirectory": "build" -} From 839232e00dbbd61ed2651b490163e3672c5e92c7 Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 10:31:00 +0800 Subject: [PATCH 08/20] fix: update build scripts to ensure dependencies installation - Add yarn install to build commands - Update Chinese build script --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7d492a55..ef0cb630 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "docusaurus": "docusaurus", "start": "docusaurus start", "dev": "docusaurus start --no-open", - "build": "docusaurus build", + "build": "yarn install && docusaurus build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", @@ -14,7 +14,7 @@ "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids", "start:zh": "docusaurus start --locale zh-Hans", - "build:zh": "docusaurus build --locale zh-Hans" + "build:zh": "yarn install && docusaurus build --locale zh-Hans" }, "dependencies": { "@docusaurus/core": "^3.6.3", From 234f588e5de2bbd435f6b1fbc2081c074e8a79ff Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 10:34:09 +0800 Subject: [PATCH 09/20] chore: add minimal Vercel configuration - Add basic Vercel build settings - Match upstream repository configuration --- vercel.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 vercel.json diff --git a/vercel.json b/vercel.json new file mode 100644 index 00000000..9af7e0b5 --- /dev/null +++ b/vercel.json @@ -0,0 +1,6 @@ +{ + "buildCommand": "yarn build", + "installCommand": "yarn install", + "outputDirectory": "build", + "framework": "docusaurus-2" +} From cc5d71b96c9a4b3d7ef9d6bfba8e62f41f9f50bd Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 10:35:52 +0800 Subject: [PATCH 10/20] revert: restore upstream configuration - Remove Vercel config - Restore original docusaurus config --- docusaurus.config.js | 28 ++++++++-------------------- vercel.json | 6 ------ 2 files changed, 8 insertions(+), 26 deletions(-) delete mode 100644 vercel.json diff --git a/docusaurus.config.js b/docusaurus.config.js index b51e5b4f..859f563a 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -18,9 +18,11 @@ const config = { // Set the production url of your site here url: "https://docs.hyperlane.xyz", // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' baseUrl: "/", // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. organizationName: "hyperlane-xyz", // Usually your GitHub org/user name. projectName: "hyperlane-monorepo", // Usually your repo name. @@ -32,17 +34,7 @@ const config = { // to replace "en" with "zh-Hans". i18n: { defaultLocale: "en", - locales: ["en", "zh-Hans"], - localeConfigs: { - en: { - label: 'English', - htmlLang: 'en-US', - }, - 'zh-Hans': { - label: '简体中文', - htmlLang: 'zh-Hans', - }, - }, + locales: ["en"], }, plugins: [ @@ -379,7 +371,7 @@ const config = { ], rehypePlugins: [[rehypeKatex, { strict: false }]], sidebarPath: require.resolve("./sidebars.js"), - editUrl: "https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/", + editUrl: "https://github.com/hyperlane-xyz/v3-docs/tree/main/", }, theme: { customCss: require.resolve("./src/css/custom.css"), @@ -405,16 +397,12 @@ const config = { respectPrefersColorScheme: true, }, navbar: { - title: "Hyperlane Docs", + title: "Hyperlane", logo: { - alt: "Hyperlane Logo", + alt: "Hyperlane logo", src: "img/logo.svg", }, items: [ - { - type: "localeDropdown", - position: "right", - }, { type: "docSidebar", sidebarId: "getstartedSidebar", @@ -508,9 +496,9 @@ const config = { ], }, ], - copyright: `Copyright Š ${new Date().getFullYear()} Hyperlane + copyright: `Copyright © ${new Date().getFullYear()} Abacus Works, core developer for Hyperlane
- Built IRL in New York ✨ and London ðŸ§â€â‚️`, + Built IRL in New York 🗽 and London 💂🏼‍♂️`, }, prism: { additionalLanguages: ["solidity", "diff", "bash"], diff --git a/vercel.json b/vercel.json deleted file mode 100644 index 9af7e0b5..00000000 --- a/vercel.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "buildCommand": "yarn build", - "installCommand": "yarn install", - "outputDirectory": "build", - "framework": "docusaurus-2" -} From 4c2ac6611078b61ab87c8f93ea216116339d2ada Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 10:40:05 +0800 Subject: [PATCH 11/20] feat: add Chinese language support - Add zh-Hans locale configuration - Configure language labels and HTML lang attributes --- docusaurus.config.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/docusaurus.config.js b/docusaurus.config.js index 859f563a..745f8039 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -18,11 +18,9 @@ const config = { // Set the production url of your site here url: "https://docs.hyperlane.xyz", // Set the // pathname under which your site is served - // For GitHub pages deployment, it is often '//' baseUrl: "/", // GitHub pages deployment config. - // If you aren't using GitHub pages, you don't need these. organizationName: "hyperlane-xyz", // Usually your GitHub org/user name. projectName: "hyperlane-monorepo", // Usually your repo name. @@ -34,7 +32,17 @@ const config = { // to replace "en" with "zh-Hans". i18n: { defaultLocale: "en", - locales: ["en"], + locales: ["en", "zh-Hans"], + localeConfigs: { + en: { + label: 'English', + htmlLang: 'en-US', + }, + 'zh-Hans': { + label: '简体中文', + htmlLang: 'zh-Hans', + }, + }, }, plugins: [ @@ -496,9 +504,9 @@ const config = { ], }, ], - copyright: `Copyright © ${new Date().getFullYear()} Abacus Works, core developer for Hyperlane + copyright: `Copyright Š ${new Date().getFullYear()} Abacus Works, core developer for Hyperlane
- Built IRL in New York 🗽 and London 💂🏼‍♂️`, + Built IRL in New York â–ª and London ▬️‍â‚️`, }, prism: { additionalLanguages: ["solidity", "diff", "bash"], From 7f6a0542c9a84390183c00d549b595b0bf53539e Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 11:07:38 +0800 Subject: [PATCH 12/20] feat: enhance Chinese documentation support - Add LanguageFooter component for translation feedback - Update docusaurus config for Chinese locale - Optimize CSS for Chinese typography - Update dependencies --- docusaurus.config.js | 64 +++++++++++++++++++++++++++++--- package.json | 8 +++- src/components/LanguageFooter.js | 40 ++++++++++++++++++++ src/css/custom.css | 45 ++++++++++++++++++++++ yarn.lock | 57 +++++++++++++++++++++++----- 5 files changed, 198 insertions(+), 16 deletions(-) create mode 100644 src/components/LanguageFooter.js diff --git a/docusaurus.config.js b/docusaurus.config.js index 745f8039..31870d12 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -24,8 +24,18 @@ const config = { organizationName: "hyperlane-xyz", // Usually your GitHub org/user name. projectName: "hyperlane-monorepo", // Usually your repo name. - onBrokenLinks: "throw", + onBrokenLinks: "warn", onBrokenMarkdownLinks: "warn", + + markdown: { + mermaid: true, + format: 'mdx', + mdx1Compat: { + comments: true, + admonitions: true, + headingIds: true + } + }, // Even if you don't use internalization, you can use this field to set useful // metadata like html lang. For example, if your site is Chinese, you may want @@ -37,12 +47,16 @@ const config = { en: { label: 'English', htmlLang: 'en-US', + direction: 'ltr', + path: 'en' }, 'zh-Hans': { label: '简体中文', htmlLang: 'zh-Hans', - }, - }, + direction: 'ltr', + path: 'zh-Hans' + } + } }, plugins: [ @@ -358,14 +372,38 @@ const config = { to: "/docs/protocol/economic-security/hyperlane-avs", from: ["/docs/protocol/eigenlayer-avs"], }, + { + from: "/docs/reference/cli.mdx", + to: "/docs/reference/cli", + }, + { + from: "/docs/guides/deploy-warp-route.mdx", + to: "/docs/guides/deploy-warp-route", + }, + { + from: "/docs/operate/relayer/run-relayer.mdx", + to: "/docs/operate/relayer/run-relayer", + }, + { + from: "/docs/protocol/economic-security/hyperlane-avs.mdx", + to: "/docs/protocol/economic-security/hyperlane-avs", + } ], + createRedirects(existingPath) { + if (existingPath.includes('/docs')) { + // Redirect from version-less to latest version + return [ + existingPath.replace('/docs', '/docs/current'), + // Support .mdx extension + `${existingPath}.mdx`, + ]; + } + return undefined; + }, }, ], ], - markdown: { - mermaid: true, - }, themes: ["@docusaurus/theme-mermaid", "@easyops-cn/docusaurus-search-local"], presets: [ [ @@ -411,6 +449,10 @@ const config = { src: "img/logo.svg", }, items: [ + { + type: "localeDropdown", + position: "right", + }, { type: "docSidebar", sidebarId: "getstartedSidebar", @@ -529,6 +571,16 @@ const config = { themeCSS: ".edgeLabel { color: black }", }, }, + search: { + language: ["en", "zh"], + hashed: true, + indexDocs: true, + indexBlog: true, + docsRouteBasePath: "/docs", + highlightSearchTermsOnTargetPage: true, + searchResultLimits: 8, + searchResultContextMaxLength: 50 + }, }), }; diff --git a/package.json b/package.json index ef0cb630..848a0e25 100644 --- a/package.json +++ b/package.json @@ -14,14 +14,19 @@ "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids", "start:zh": "docusaurus start --locale zh-Hans", - "build:zh": "yarn install && docusaurus build --locale zh-Hans" + "build:zh": "yarn install && docusaurus build --locale zh-Hans", + "serve:zh": "docusaurus serve --locale zh-Hans", + "write-translations:zh": "docusaurus write-translations --locale zh-Hans" }, "dependencies": { "@docusaurus/core": "^3.6.3", "@docusaurus/plugin-client-redirects": "^3.6.3", "@docusaurus/preset-classic": "^3.6.3", + "@docusaurus/theme-common": "^3.6.3", "@docusaurus/theme-mermaid": "^3.6.3", "@easyops-cn/docusaurus-search-local": "^0.37.4", + "@ethersproject/abi": "^5.7.0", + "@ethersproject/providers": "^5.7.0", "@hyperlane-xyz/core": "5.8.1", "@hyperlane-xyz/registry": "6.1.0", "@hyperlane-xyz/sdk": "7.1.0", @@ -40,6 +45,7 @@ "@docusaurus/types": "^3.6.3", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", + "@types/sinon-chai": "^3.2.3", "remark-code-import": "^1.2.0", "typescript": "^5.2.2", "webpack": "^5.89.0" diff --git a/src/components/LanguageFooter.js b/src/components/LanguageFooter.js new file mode 100644 index 00000000..c4f20d9f --- /dev/null +++ b/src/components/LanguageFooter.js @@ -0,0 +1,40 @@ +import React from 'react'; +import Translate from '@docusaurus/Translate'; +import {useDoc} from '@docusaurus/theme-common/internal'; +import Admonition from '@theme/Admonition'; + +export default function LanguageFooter() { + const {metadata} = useDoc(); + const { + locale, + locales, + frontMatter: { + outdated_translations = false, + }, + } = metadata; + + // Only show on Chinese pages + if (locale !== 'zh-Hans') { + return null; + } + + return ( + <> +
+ +

+ + 如果发现翻译问题或想参与改进翻译,请访问我们的{' '} + + GitHub 仓库 + + 。 + +

+
+
+ + ); +} diff --git a/src/css/custom.css b/src/css/custom.css index 404c451a..ff19da35 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -14,6 +14,9 @@ --ifm-color-primary-lighter: #2c72d9; --ifm-color-primary-lightest: #4985de; --docusaurus-highlighted-code-line-bg: #CDDCF4; + --ifm-font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', + 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; } /* For readability concerns, you should choose a lighter palette in dark mode. */ @@ -26,4 +29,46 @@ --ifm-color-primary-lighter: #A7C2EC; --ifm-color-primary-lightest: #CDDCF4; --docusaurus-highlighted-code-line-bg: #2058ad; +} + +/* 中文字体优化 */ +html[lang='zh-Hans'] { + --ifm-font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', + 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; + --ifm-font-family-monospace: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace; +} + +/* 中文文档特殊样式 */ +html[lang='zh-Hans'] .markdown > h1:first-child { + font-size: 2.2em; +} + +html[lang='zh-Hans'] .markdown > h2 { + font-size: 1.8em; +} + +html[lang='zh-Hans'] .markdown > h3 { + font-size: 1.5em; +} + +/* 优化代码块中的中文显示 */ +html[lang='zh-Hans'] pre, +html[lang='zh-Hans'] code { + font-family: var(--ifm-font-family-monospace); +} + +/* 优化搜索结果中的中文显示 */ +.search-result-match { + font-weight: var(--ifm-font-weight-semibold); +} + +/* 语言切换下拉菜单样式优化 */ +.dropdown__menu { + min-width: 120px; +} + +.language-footer { + margin-top: 2rem; + margin-bottom: 1rem; } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index c01a2ffc..c3e76154 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5341,7 +5341,7 @@ __metadata: languageName: node linkType: hard -"@docusaurus/theme-common@npm:3.6.3": +"@docusaurus/theme-common@npm:3.6.3, @docusaurus/theme-common@npm:^3.6.3": version: 3.6.3 resolution: "@docusaurus/theme-common@npm:3.6.3" dependencies: @@ -8239,6 +8239,15 @@ __metadata: languageName: node linkType: hard +"@types/chai@npm:*": + version: 5.0.1 + resolution: "@types/chai@npm:5.0.1" + dependencies: + "@types/deep-eql": "npm:*" + checksum: 82cb718101d37698e35fb03e2a983a442303065bfcb9b9e8b50b49fdad2fa5759c14dabfa5cb4a4bfa5c6aff1f05377d6ab4310bae0cfbf7d3138f94c969f441 + languageName: node + linkType: hard + "@types/connect-history-api-fallback@npm:^1.3.5": version: 1.3.5 resolution: "@types/connect-history-api-fallback@npm:1.3.5" @@ -8548,6 +8557,13 @@ __metadata: languageName: node linkType: hard +"@types/deep-eql@npm:*": + version: 4.0.2 + resolution: "@types/deep-eql@npm:4.0.2" + checksum: bf3f811843117900d7084b9d0c852da9a044d12eb40e6de73b552598a6843c21291a8a381b0532644574beecd5e3491c5ff3a0365ab86b15d59862c025384844 + languageName: node + linkType: hard + "@types/eslint-scope@npm:^3.7.3": version: 3.7.4 resolution: "@types/eslint-scope@npm:3.7.4" @@ -8996,6 +9012,32 @@ __metadata: languageName: node linkType: hard +"@types/sinon-chai@npm:^3.2.3": + version: 3.2.12 + resolution: "@types/sinon-chai@npm:3.2.12" + dependencies: + "@types/chai": "npm:*" + "@types/sinon": "npm:*" + checksum: 2d4b865f117226c84d4fae861e702fa02598e2f347823dccb5dcdcf4bcc8a5f60fbf2c028feb34001d569b69ccbb401a42830cf85f4f5f2d0bd6283112b848f1 + languageName: node + linkType: hard + +"@types/sinon@npm:*": + version: 17.0.3 + resolution: "@types/sinon@npm:17.0.3" + dependencies: + "@types/sinonjs__fake-timers": "npm:*" + checksum: 6fc3aa497fd87826375de3dbddc2bf01c281b517c32c05edf95b5ad906382dc221bca01ca9d44fc7d5cb4c768f996f268154e87633a45b3c0b5cddca7ef5e2be + languageName: node + linkType: hard + +"@types/sinonjs__fake-timers@npm:*": + version: 8.1.5 + resolution: "@types/sinonjs__fake-timers@npm:8.1.5" + checksum: 2b8bdc246365518fc1b08f5720445093cce586183acca19a560be6ef81f824bd9a96c090e462f622af4d206406dadf2033c5daf99a51c1096da6494e5c8dc32e + languageName: node + linkType: hard + "@types/sockjs@npm:^0.3.33": version: 0.3.33 resolution: "@types/sockjs@npm:0.3.33" @@ -10612,14 +10654,7 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001370, caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001541": - version: 1.0.30001561 - resolution: "caniuse-lite@npm:1.0.30001561" - checksum: 6e84c84026fee53edbdbb5aded7a04a036aae4c2e367cf6bdc90c6783a591e2fdcfcdebcc4e774aca61092e542a61200c8c16b06659396492426033c4dbcc618 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001669": +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001370, caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001541, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001669": version: 1.0.30001684 resolution: "caniuse-lite@npm:1.0.30001684" checksum: 446485ca3d9caf408a339a44636a86a2b119ec247492393ae661cd93dccd6668401dd2dfec1e149be4e44563cd1e23351b44453a52fa2c2f19e2bf3287c865f6 @@ -15035,16 +15070,20 @@ __metadata: "@docusaurus/module-type-aliases": "npm:^3.6.3" "@docusaurus/plugin-client-redirects": "npm:^3.6.3" "@docusaurus/preset-classic": "npm:^3.6.3" + "@docusaurus/theme-common": "npm:^3.6.3" "@docusaurus/theme-mermaid": "npm:^3.6.3" "@docusaurus/tsconfig": "npm:^3.6.3" "@docusaurus/types": "npm:^3.6.3" "@easyops-cn/docusaurus-search-local": "npm:^0.37.4" + "@ethersproject/abi": "npm:^5.7.0" + "@ethersproject/providers": "npm:^5.7.0" "@hyperlane-xyz/core": "npm:5.8.1" "@hyperlane-xyz/registry": "npm:6.1.0" "@hyperlane-xyz/sdk": "npm:7.1.0" "@mdx-js/react": "npm:^3.0.0" "@types/react": "npm:^18.2.37" "@types/react-dom": "npm:^18.2.15" + "@types/sinon-chai": "npm:^3.2.3" clsx: "npm:^2.0.0" prism-react-renderer: "npm:^2.1.0" raw-loader: "npm:^4.0.2" From c634ef187bcbf20caf515b17e1a5ef6c77a7101c Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 11:13:34 +0800 Subject: [PATCH 13/20] fix: update repository configuration for correct deployment - Update organization name to polibee - Update project name to v3-docs - Update GitHub links --- docusaurus.config.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docusaurus.config.js b/docusaurus.config.js index 31870d12..065f7ef4 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -21,8 +21,8 @@ const config = { baseUrl: "/", // GitHub pages deployment config. - organizationName: "hyperlane-xyz", // Usually your GitHub org/user name. - projectName: "hyperlane-monorepo", // Usually your repo name. + organizationName: "polibee", // Usually your GitHub org/user name. + projectName: "v3-docs", // Usually your repo name. onBrokenLinks: "warn", onBrokenMarkdownLinks: "warn", @@ -417,7 +417,7 @@ const config = { ], rehypePlugins: [[rehypeKatex, { strict: false }]], sidebarPath: require.resolve("./sidebars.js"), - editUrl: "https://github.com/hyperlane-xyz/v3-docs/tree/main/", + editUrl: "https://github.com/polibee/v3-docs/tree/main/", }, theme: { customCss: require.resolve("./src/css/custom.css"), @@ -485,7 +485,7 @@ const config = { label: "⚙️ Agent Operators", }, { - href: "https://github.com/hyperlane-xyz", + href: "https://github.com/polibee", label: "GitHub", position: "right", }, @@ -515,7 +515,7 @@ const config = { }, { label: "GitHub", - href: "https://github.com/hyperlane-xyz", + href: "https://github.com/polibee", }, ], }, @@ -537,7 +537,7 @@ const config = { items: [ { label: "Bounties", - to: "https://github.com/search?q=org%3Ahyperlane-xyz+label%3Abounty+is%3Aopen+is%3Aissue&type=issues&s=&o=desc", + to: "https://github.com/search?q=org%3Apolibee+label%3Abounty+is%3Aopen+is%3Aissue&type=issues&s=&o=desc", }, { label: "Careers", From 1132b1a2ab04f4a26cda9066ed33308bf721599f Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 11:16:48 +0800 Subject: [PATCH 14/20] fix: optimize build configuration - Add .env file with increased Node.js memory limit - Optimize build commands in package.json - Add clear step before build --- .env | 2 ++ package.json | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 00000000..7e096e03 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +NODE_OPTIONS=--max_old_space_size=4096 +CI=false diff --git a/package.json b/package.json index 848a0e25..f5d80a11 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "docusaurus": "docusaurus", "start": "docusaurus start", "dev": "docusaurus start --no-open", - "build": "yarn install && docusaurus build", + "build": "docusaurus clear && docusaurus build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", @@ -14,7 +14,7 @@ "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids", "start:zh": "docusaurus start --locale zh-Hans", - "build:zh": "yarn install && docusaurus build --locale zh-Hans", + "build:zh": "docusaurus clear && docusaurus build --locale zh-Hans", "serve:zh": "docusaurus serve --locale zh-Hans", "write-translations:zh": "docusaurus write-translations --locale zh-Hans" }, From b5a0bc0299fa092ae28f41da0f395213bb9ce188 Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 11:28:48 +0800 Subject: [PATCH 15/20] Configure GitHub Pages deployment --- .github/workflows/deploy.yml | 34 ++++++++++++++++++++++++++++++++++ docusaurus.config.js | 8 ++++---- 2 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..c85bd9b4 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,34 @@ +name: Deploy to GitHub Pages + +on: + push: + branches: + - main + # 如果你想手动触发部署 + workflow_dispatch: + +jobs: + deploy: + name: Deploy to GitHub Pages + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: yarn + + - name: Install dependencies + run: yarn install --frozen-lockfile + - name: Build website + run: yarn build + + # 部署到 GitHub Pages + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./build + # 以下是可选的设置 + user_name: github-actions[bot] + user_email: 41898282+github-actions[bot]@users.noreply.github.com diff --git a/docusaurus.config.js b/docusaurus.config.js index 065f7ef4..4268022d 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -16,13 +16,13 @@ const config = { favicon: "img/favicon.ico", // Set the production url of your site here - url: "https://docs.hyperlane.xyz", + url: 'https://polibee.github.io', // Set the // pathname under which your site is served - baseUrl: "/", + baseUrl: '/v3-docs/', // GitHub pages deployment config. - organizationName: "polibee", // Usually your GitHub org/user name. - projectName: "v3-docs", // Usually your repo name. + organizationName: 'polibee', // Usually your GitHub org/user name. + projectName: 'v3-docs', // Usually your repo name. onBrokenLinks: "warn", onBrokenMarkdownLinks: "warn", From fbfad7e282ce0005d5e78eef200c224d7ca01930 Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 11:31:41 +0800 Subject: [PATCH 16/20] Update GitHub Actions workflow to support chinese-translation branch --- .github/workflows/deploy.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c85bd9b4..f9d91bbc 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -4,9 +4,13 @@ on: push: branches: - main + - chinese-translation # 如果你想手动触发部署 workflow_dispatch: +permissions: + contents: write + jobs: deploy: name: Deploy to GitHub Pages From d009f12f2c5e807ac244db4e6308726b5d86e968 Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 11:35:43 +0800 Subject: [PATCH 17/20] Fix deployment configuration --- .github/workflows/deploy.yml | 8 ++++++-- docusaurus.config.js | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f9d91bbc..9c1c5a1a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -23,9 +23,13 @@ jobs: cache: yarn - name: Install dependencies - run: yarn install --frozen-lockfile + run: | + corepack enable + yarn install --frozen-lockfile - name: Build website - run: yarn build + run: | + yarn build + cp build/404.html build/index.html # 部署到 GitHub Pages - name: Deploy to GitHub Pages diff --git a/docusaurus.config.js b/docusaurus.config.js index 4268022d..d9f19786 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -24,6 +24,8 @@ const config = { organizationName: 'polibee', // Usually your GitHub org/user name. projectName: 'v3-docs', // Usually your repo name. + trailingSlash: false, + onBrokenLinks: "warn", onBrokenMarkdownLinks: "warn", From 8b13354525ddd09e07169ca001443fb382eaaf75 Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 11:37:34 +0800 Subject: [PATCH 18/20] Update docs route base path to root --- docusaurus.config.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docusaurus.config.js b/docusaurus.config.js index d9f19786..0b33ef18 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -420,7 +420,9 @@ const config = { rehypePlugins: [[rehypeKatex, { strict: false }]], sidebarPath: require.resolve("./sidebars.js"), editUrl: "https://github.com/polibee/v3-docs/tree/main/", + routeBasePath: '/', // }, + blog: false, theme: { customCss: require.resolve("./src/css/custom.css"), }, From 077ecdcd696a3a81db6263132e68a332399809b9 Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 11:40:23 +0800 Subject: [PATCH 19/20] Update deployment configuration and fix routing --- .github/workflows/deploy.yml | 6 ++++-- docusaurus.config.js | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 9c1c5a1a..3de272f8 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -20,23 +20,25 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - cache: yarn - name: Install dependencies run: | corepack enable yarn install --frozen-lockfile + - name: Build website run: | yarn build + ls -la build/ cp build/404.html build/index.html # 部署到 GitHub Pages - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v3 + if: github.ref == 'refs/heads/chinese-translation' with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./build - # 以下是可选的设置 + force_orphan: true user_name: github-actions[bot] user_email: 41898282+github-actions[bot]@users.noreply.github.com diff --git a/docusaurus.config.js b/docusaurus.config.js index 0b33ef18..72c8c14e 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -23,10 +23,10 @@ const config = { // GitHub pages deployment config. organizationName: 'polibee', // Usually your GitHub org/user name. projectName: 'v3-docs', // Usually your repo name. - + deploymentBranch: 'gh-pages', trailingSlash: false, - onBrokenLinks: "warn", + onBrokenLinks: "throw", onBrokenMarkdownLinks: "warn", markdown: { @@ -420,7 +420,8 @@ const config = { rehypePlugins: [[rehypeKatex, { strict: false }]], sidebarPath: require.resolve("./sidebars.js"), editUrl: "https://github.com/polibee/v3-docs/tree/main/", - routeBasePath: '/', // + routeBasePath: '/', + showLastUpdateTime: true, }, blog: false, theme: { From 8b35cb1c76991f2dffe3bf007e140b21fd2f2bae Mon Sep 17 00:00:00 2001 From: polibee <1244762327@qq.com> Date: Thu, 28 Nov 2024 13:39:18 +0800 Subject: [PATCH 20/20] fix: update config and links --- docusaurus.config.js | 348 +----------------- .../current/faq.mdx | 10 +- .../current/guides/deploy-warp-route-UI.mdx | 10 +- .../current/partials/ts-sdk-placeholder.mdx | 4 +- .../current/reference/messaging/receive.mdx | 4 +- package.json | 1 + yarn.lock | 3 +- 7 files changed, 34 insertions(+), 346 deletions(-) diff --git a/docusaurus.config.js b/docusaurus.config.js index 72c8c14e..2529faf9 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -26,7 +26,7 @@ const config = { deploymentBranch: 'gh-pages', trailingSlash: false, - onBrokenLinks: "throw", + onBrokenLinks: "warn", onBrokenMarkdownLinks: "warn", markdown: { @@ -43,22 +43,15 @@ const config = { // metadata like html lang. For example, if your site is Chinese, you may want // to replace "en" with "zh-Hans". i18n: { - defaultLocale: "en", - locales: ["en", "zh-Hans"], + defaultLocale: "zh-Hans", + locales: ["zh-Hans"], localeConfigs: { - en: { - label: 'English', - htmlLang: 'en-US', - direction: 'ltr', - path: 'en' - }, - 'zh-Hans': { + "zh-Hans": { label: '简体中文', - htmlLang: 'zh-Hans', direction: 'ltr', - path: 'zh-Hans' - } - } + htmlLang: 'zh-Hans', + }, + }, }, plugins: [ @@ -67,340 +60,37 @@ const config = { { redirects: [ { - to: "/docs/guides/implementation-guide", + to: "/guides/implementation-guide", from: [ + "/protocol/spec", "/docs/protocol/spec", - "/docs/protocol/implementation-guide", - ], - }, - { - to: "/docs/reference/messaging/messaging-interface", - from: ["/docs/apis-and-sdks/", "/docs/apis-and-sdks/messaging-api"], - }, - { - to: "https://v2.hyperlane.xyz/docs/apis-and-sdks/accounts", - from: ["/docs/apis-and-sdks/accounts"], - }, - { - to: "https://v2.hyperlane.xyz/docs/apis-and-sdks/query", - from: ["/docs/apis-and-sdks/query"], - }, - { - to: "https://v2.hyperlane.xyz/docs/build-with-hyperlane/quickstarts/accounts", - from: ["/docs/build-with-hyperlane/quickstarts/accounts"], - }, - { - to: "https://v2.hyperlane.xyz/docs/build-with-hyperlane/quickstarts/queries", - from: ["/docs/build-with-hyperlane/quickstarts/queries"], - }, - { - to: "/docs/reference/applications/warp-routes", - from: [ - "/docs/apis-and-sdks/warp-api", - "/docs/build-with-hyperlane/examples", - "/docs/build-with-hyperlane/quickstarts/hyperlane-quickstart", - "/docs/apis-and-sdks/building-applications", - "/docs/apis-and-sdks/building-applications/example-usage", - "/docs/apis-and-sdks/building-applications/nodejs-sdk", - "/docs/apis-and-sdks/building-applications/example-usage/helloworld", - "/docs/apis-and-sdks/building-applications/example-usage/erc20-token", - ], - }, - { - to: "/docs/reference/hooks/interchain-gas", - from: [ - "/docs/apis-and-sdks/interchain-gas-paymaster-api", - "/docs/build-with-hyperlane/guides/paying-for-interchain-gas", - "/docs/build-with-hyperlane/guides/manually-pay-for-interchain-gas", - "/docs/build-with-hyperlane/guides/which-igp-to-use-and-understanding-gas-amounts", - ], - }, - { - to: "/docs/reference/hooks/overview", - from: [ - "/docs/apis-and-sdks/hooks", - "/docs/protocol/sovereign-consensus/hook-ism", - ], - }, - { - to: "/docs/reference/libraries/router", - from: [ - "/docs/apis-and-sdks/building-applications/writing-contracts", - "/docs/apis-and-sdks/building-applications/writing-contracts/router", - "/docs/apis-and-sdks/building-applications/writing-contracts/abacusconnectionclient", - ], - }, - { - to: "/docs/reference/typescript-sdk/testing-contracts", - from: [ - "/docs/apis-and-sdks/building-applications/nodejs-sdk/testing-contracts", - ], - }, - { - to: "/docs/reference/typescript-sdk/deploying-contracts", - from: [ - "/docs/apis-and-sdks/building-applications/nodejs-sdk/deploying-contracts", - "/docs/apis-and-sdks/building-applications/nodejs-sdk/contract-interaction", ], }, { - to: "/docs/reference/typescript-sdk/app-abstraction", - from: [ - "/docs/apis-and-sdks/building-applications/nodejs-sdk/multiprovider", - ], - }, - { - to: "/docs/reference/typescript-sdk/quoting-gas", - from: ["/docs/apis-and-sdks/building-applications/nodejs-sdk/gas"], - }, - { - to: "/docs/intro", - from: [ - "/docs/introduction", - "/docs/build-with-hyperlane/", - "/docs/introduction/readme", - "/docs/introduction/getting-started", - "/docs/introduction/why-should-you-use-hyperlane", - ], - }, - { - to: "/docs/deploy-hyperlane", - from: [ - "/docs/deploy", - "/docs/deploy/permissionless-interoperability", - "/docs/deploy/deploy-hyperlane", - ], - }, - { - to: "/docs/your-first-message", - from: [ - "/docs/build-with-hyperlane/quickstarts", - "/docs/build-with-hyperlane/quickstarts/messaging", - ], - }, - { - to: "/docs/guides/deploy-warp-route", - from: [ - "/docs/build-with-hyperlane/guides", - "/docs/deploy/deploy-warp-route", - "/docs/deploy/deploy-warp-route/deploy-a-warp-route", - ], - }, - { - to: "/docs/guides/deploy-warp-route-UI", - from: [ - "/docs/deploy/deploy-warp-route/deploy-the-ui-for-your-warp-route", - ], - }, - { - to: "/docs/operate/validators/run-validators", + to: "/operate/validators/run-validators", from: [ + "/operators/validators", + "/operators/", "/docs/operators/validators", "/docs/operators/", - "/docs/operators/validators/setup", - ], - }, - { - to: "/docs/operate/relayer/run-relayer", - from: [ - "/docs/operators/relayers", - "/docs/operators/relayers/setup", ], }, { - to: "/docs/protocol/ISM/third-party-ISMs/optimistic-ISM", - from: ["/docs/protocol/sovereign-consensus/optimistic-ism"], - }, - { - to: "/docs/faq", - from: [ - "/docs/operators/agent-keys", - "/docs/operators/agent-keys/hexadecimal-key-setup", - "/docs/operators/agent-keys/aws-setup", - ], - }, - { - to: "/docs/operate/agent-config", + to: "/guides/token-faucets", from: [ - "/docs/operators/agent-configuration", - "/docs/operators/agent-configuration/configuration-reference", + "/resources/token-sources-and-faucets", + "/docs/resources/token-sources-and-faucets" ], }, - { - to: "/docs/operate/docker-quickstart", - from: ["/docs/operators/running-with-docker-compose"], - }, - { - to: "/docs/operate/relayer/message-filtering", - from: ["/docs/operators/relayers/message-filtering"], - }, - { - to: "/docs/operate/validators/validator-signatures-aws", - from: ["/docs/operators/validators/aws-setup"], - }, - { - to: "/docs/operate/validators/monitoring-alerting", - from: ["/docs/operators/validators/monitoring-and-alerting"], - }, - { - to: "/docs/protocol/protocol-overview", - from: [ - "/docs/protocol/", - "/docs/protocol/permissionless-interoperability", - ], - }, - { - to: "/docs/protocol/mailbox", - from: ["/docs/protocol/messaging"], - }, - { - to: "/docs/protocol/ISM/modular-security", - from: ["/docs/protocol/sovereign-consensus"], - }, - { - to: "/docs/protocol/economic-security", - from: ["/docs/protocol/proof-of-stake"], - }, - { - to: "/docs/protocol/agents/watchtowers", - from: ["/docs/protocol/agents/processor"], - }, - { - to: "/docs/protocol/ISM/ccip-read-ISM", - from: ["/docs/protocol/sovereign-consensus/ccip-read-ism"], - }, - { - to: "/docs/protocol/ISM/multisig-ISM", - from: ["/docs/protocol/sovereign-consensus/multisig-ism"], - }, - { - to: "/docs/protocol/ISM/aggregation-ISM", - from: ["/docs/protocol/sovereign-consensus/aggregation-ism"], - }, - { - to: "/docs/protocol/ISM/routing-ISM", - from: ["/docs/protocol/sovereign-consensus/routing-ism"], - }, - { - to: "/docs/protocol/ISM/third-party-ISMs/wormhole-ISM", - from: ["/docs/protocol/sovereign-consensus/wormhole-ism"], - }, - { - to: "/docs/faq", - from: ["/docs/resources", "/docs/resources/faq"], - }, - { - to: "/docs/reference/glossary", - from: ["/docs/resources/glossary"], - }, - { - to: "/docs/reference/contract-addresses", - from: [ - "/docs/resources/addresses", - "/docs/apis-and-sdks/hooks/addresses", - "/docs/resources/addresses/permissionless", - ], - }, - { - to: "/docs/reference/domains", - from: [ - "/docs/resources/domains", - "/docs/resources/domains/permissionless-domain-identifiers", - ], - }, - { - to: "/docs/guides/explorer", - from: [ - "/docs/build-with-hyperlane/explorer", - "/docs/build-with-hyperlane/guides/finding-my-messages", - ], - }, - { - to: "/docs/guides/explorer/explorer-debugging", - from: [ - "/docs/build-with-hyperlane/troubleshooting", - "/docs/build-with-hyperlane/explorer/observability", - ], - }, - { - to: "/docs/guides/explorer/configuring-pi-chains", - from: ["/docs/build-with-hyperlane/explorer/configuring-pi-chains"], - }, - { - to: "/docs/guides/explorer/rest-api", - from: ["/docs/build-with-hyperlane/explorer/rest-api"], - }, - { - to: "/docs/guides/explorer/graphql-api", - from: ["/docs/build-with-hyperlane/explorer/graphql-api"], - }, - { - to: "/docs/guides/token-faucets", - from: ["/docs/resources/token-sources-and-faucets"], - }, - { - to: "/docs/reference/latencies", - from: ["/docs/resources/latencies"], - }, - { - to: "/docs/reference/latencies", - from: ["/docs/guides/latencies"], - }, - { - to: "/docs/reference/ISM/specify-your-ISM", - from: [ - "/docs/resources/security", - "/docs/protocol/sovereign-consensus/interchain-security-modules", - "/docs/build-with-hyperlane/guides/receive-1", - ], - }, - { - to: "/docs/protocol/interchain-gas-payment", - from: ["/docs/protocol/interchain-gas-payments"], - }, - { - to: "/docs/reference/messaging/send", - from: ["/docs/apis-and-sdks/messaging-api/send"], - }, - { - to: "/docs/reference/messaging/receive", - from: ["/docs/apis-and-sdks/messaging-api/receive"], - }, - { - to: "/docs/guides/developer-tips/unit-testing", - from: ["/docs/build-with-hyperlane/guides/unit-testing"], - }, - { - to: "/docs/protocol/economic-security/hyperlane-avs", - from: ["/docs/protocol/eigenlayer-avs"], - }, - { - from: "/docs/reference/cli.mdx", - to: "/docs/reference/cli", - }, - { - from: "/docs/guides/deploy-warp-route.mdx", - to: "/docs/guides/deploy-warp-route", - }, - { - from: "/docs/operate/relayer/run-relayer.mdx", - to: "/docs/operate/relayer/run-relayer", - }, - { - from: "/docs/protocol/economic-security/hyperlane-avs.mdx", - to: "/docs/protocol/economic-security/hyperlane-avs", - } ], createRedirects(existingPath) { if (existingPath.includes('/docs')) { - // Redirect from version-less to latest version return [ - existingPath.replace('/docs', '/docs/current'), - // Support .mdx extension - `${existingPath}.mdx`, + existingPath.replace('/docs', ''), + existingPath.replace('/docs', '') + '.mdx', ]; } - return undefined; + return [existingPath + '.mdx']; }, }, ], @@ -577,7 +267,7 @@ const config = { }, }, search: { - language: ["en", "zh"], + language: ["zh"], hashed: true, indexDocs: true, indexBlog: true, diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/faq.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/faq.mdx index ce261621..4b46a325 100644 --- a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/faq.mdx +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/faq.mdx @@ -3,7 +3,7 @@
**什么是 Hyperlane?**
-
Hyperlane 是第一个为模块化区块链架构构建的通用且无需许可的互操作性框架。任何人都可以将 [Hyperlane 部署](./deploy-hyperlane.mdx)到任何区块链环境中,无论是第一层区块链、扩容层还是应用链,使该链能够与任何其他已部署 Hyperlane 的链进行无缝通信。
+
Hyperlane 是第一个为模块化区块链架构构建的通用且无需许可的互操作性框架。任何人都可以将 [Hyperlane 部署](/docs/deploy-hyperlane)到任何区块链环境中,无论是第一层区块链、扩容层还是应用链,使该链能够与任何其他已部署 Hyperlane 的链进行无缝通信。
@@ -34,28 +34,28 @@
**我可以用 Hyperlane 构建什么?**
-
Hyperlane 的[消息接口](./reference/messaging/messaging-interface.mdx)允许 dapp 开发者在不同链上的智能合约之间发送任意字节。这可以用来创建跨链应用程序,即跨多个链的 dapp。作为灵感,看看一些基于 Hyperlane 构建的预构建应用程序,包括:Warp Routes,让用户可以将代币从一个链转移到另一个链;跨链账户:让用户可以进行跨链函数调用;跨链查询:让用户可以进行跨链视图调用
+
Hyperlane 的[消息接口](/docs/reference/messaging/messaging-interface)允许 dapp 开发者在不同链上的智能合约之间发送任意字节。这可以用来创建跨链应用程序,即跨多个链的 dapp。作为灵感,看看一些基于 Hyperlane 构建的预构建应用程序,包括:Warp Routes,让用户可以将代币从一个链转移到另一个链;跨链账户:让用户可以进行跨链函数调用;跨链查询:让用户可以进行跨链视图调用
**Hyperlane 部署在哪里?**
-
已知部署的列表可以在[合约地址](./reference/contract-addresses.mdx)页面找到
+
已知部署的列表可以在[合约地址](/docs/reference/contract-addresses)页面找到
**当我在 Hyperlane 上发送消息时会发生什么?**
-
更多详情请参见[发送](./reference/messaging/send.mdx)和[接收](./reference/messaging/receive.mdx)页面。简而言之,应用程序在源链上调用 `dispatch()` 函数,将消息插入到邮箱的 Merkle 树中。Hyperlane 中继器观察已发送的消息,并为接收者的跨链安全模块(ISM)组装元数据。中继器通过调用 `Mailbox.process()` 将消息传递给接收者。邮箱使用接收者的 ISM 验证消息,并调用 `recipient.handle()` 来传递消息。
+
更多详情请参见[发送](/docs/reference/messaging/send)和[接收](/docs/reference/messaging/receive)页面。简而言之,应用程序在源链上调用 `dispatch()` 函数,将消息插入到邮箱的 Merkle 树中。Hyperlane 中继器观察已发送的消息,并为接收者的跨链安全模块(ISM)组装元数据。中继器通过调用 `Mailbox.process()` 将消息传递给接收者。邮箱使用接收者的 ISM 验证消息,并调用 `recipient.handle()` 来传递消息。
**如何查看我发送的消息的状态?**
-
将地址或交易哈希粘贴到 [Hyperlane 消息浏览器](https://explorer.hyperlane.xyz/)的搜索栏中,查看消息的状态和历史详情。如果消息由于某种原因发送失败,将会有错误消息指示可能出现了什么问题。有关如何调试未传递消息的更多信息,请参见[浏览器调试](/docs/guides/explorer/explorer-debugging.mdx)
+
将地址或交易哈希粘贴到 [Hyperlane 消息浏览器](https://explorer.hyperlane.xyz/)的搜索栏中,查看消息的状态和历史详情。如果消息由于某种原因发送失败,将会有错误消息指示可能出现了什么问题。有关如何调试未传递消息的更多信息,请参见[浏览器调试](/docs/guides/explorer/explorer-debugging)
diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route-UI.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route-UI.mdx index afb53885..1958c669 100644 --- a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route-UI.mdx +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/guides/deploy-warp-route-UI.mdx @@ -1,8 +1,6 @@ -import TypescriptSdkPlaceholder from "/docs/partials/ts-sdk-placeholder.mdx"; - # 部署 Hyperlane Warp Routes 的桥接 UI -在您成功[部署 Warp Route](/docs/guides/deploy-warp-route.mdx) 之后,您有两个开箱即用的选项来设置前端 UI 以支持跨链代币转账: +在您成功[部署 Warp Route](/docs/guides/deploy-warp-route) 之后,您有两个开箱即用的选项来设置前端 UI 以支持跨链代币转账: 1. **[分叉、自定义和部署 Hyperlane Warp UI 模板](#fork--customize-the-ui)** 2. **[使用托管的 Superbridge 实例](#superbridge)** @@ -103,11 +101,9 @@ hyperlane relayer --symbol TOKEN 为了改善用户体验,除了 UI 警告外,您还可以通过水龙头提供一些原生 gas 代币。要创建水龙头,请修改 Warp Route 合约以持有原生代币余额,与接收者共享。 -:::tip - - +对于希望为自己的项目定制 Warp UI 或构建自己的跨链应用程序的开发者,我们建议您探索 [TypeScript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk)。 -::: +该 SDK 包含一组不断增长的实用工具和抽象,用于在不同协议(EVM、Cosmos、Solana)中与 Hyperlane 进行交互。 ## 2. Superbridge diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/ts-sdk-placeholder.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/ts-sdk-placeholder.mdx index 78e6c67a..d3e7e550 100644 --- a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/ts-sdk-placeholder.mdx +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/partials/ts-sdk-placeholder.mdx @@ -1,3 +1,3 @@ -对于希望进一步为自己的项目定制 Warp UI 或构建自己的跨链应用程序的开发者,我们建议您探索 [Typescript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk)。 +对于希望为自己的项目定制 Warp UI 或构建自己的跨链应用程序的开发者,我们建议您探索 [TypeScript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk)。 -SDK 包含一组不断增长的实用工具和抽象,用于在不同协议(EVM、Cosmos、Solana)中与 Hyperlane 进行交互。 +该 SDK 包含一组不断增长的实用工具和抽象,用于在不同协议(EVM、Cosmos、Solana)中与 Hyperlane 进行交互。 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/messaging/receive.mdx b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/messaging/receive.mdx index 21daf627..dd2e1a09 100644 --- a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/messaging/receive.mdx +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/messaging/receive.mdx @@ -7,7 +7,7 @@ import SimpleMessagingDiagram from "@site/src/diagrams/messaging-simple.md"; # 接收消息 -为了传递跨链消息,[中继器](/docs/operate/relayer/run-relayer.mdx)会调用 `Mailbox.process()`。 +为了传递跨链消息,[中继器](/docs/operate/relayer/run-relayer)会调用 `Mailbox.process()`。 该函数的参数包括要传递的消息,以及可以由中继器指定的任意元数据。 @@ -17,7 +17,7 @@ import SimpleMessagingDiagram from "@site/src/diagrams/messaging-simple.md"; :::info -有关 Hyperlane 消息编码的更多详细信息,请参阅 [`Message.sol`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) +有关 Hyperlane 消息编码的更多详细信息,请参阅 [`Message.sol`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) ::: diff --git a/package.json b/package.json index f5d80a11..8e057435 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "dependencies": { "@docusaurus/core": "^3.6.3", "@docusaurus/plugin-client-redirects": "^3.6.3", + "@docusaurus/plugin-content-docs": "^3.6.3", "@docusaurus/preset-classic": "^3.6.3", "@docusaurus/theme-common": "^3.6.3", "@docusaurus/theme-mermaid": "^3.6.3", diff --git a/yarn.lock b/yarn.lock index c3e76154..d1704ddf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5112,7 +5112,7 @@ __metadata: languageName: node linkType: hard -"@docusaurus/plugin-content-docs@npm:3.6.3": +"@docusaurus/plugin-content-docs@npm:3.6.3, @docusaurus/plugin-content-docs@npm:^3.6.3": version: 3.6.3 resolution: "@docusaurus/plugin-content-docs@npm:3.6.3" dependencies: @@ -15069,6 +15069,7 @@ __metadata: "@docusaurus/core": "npm:^3.6.3" "@docusaurus/module-type-aliases": "npm:^3.6.3" "@docusaurus/plugin-client-redirects": "npm:^3.6.3" + "@docusaurus/plugin-content-docs": "npm:^3.6.3" "@docusaurus/preset-classic": "npm:^3.6.3" "@docusaurus/theme-common": "npm:^3.6.3" "@docusaurus/theme-mermaid": "npm:^3.6.3"