From 163ebe54e742176ea5475f6f63dcc3d500a61dca Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Mon, 18 Nov 2024 15:31:51 +0100 Subject: [PATCH 01/17] Refurbish EVM docs --- Cargo.lock | 16 +- docs/package.json | 2 +- .../developers/evm/contract-addresses.mdx | 6 - docs/pages/developers/evm/dispatching.mdx | 205 + docs/pages/developers/evm/fees.mdx | 129 +- docs/pages/developers/evm/getting-started.mdx | 344 +- docs/pages/developers/evm/networks.mdx | 12 - docs/pages/developers/evm/receiving.mdx | 132 + docs/pages/developers/index.mdx | 2 +- docs/pages/index.mdx | 4 +- docs/public/logo_black.svg | 87 + docs/public/logo_white.svg | 87 + docs/styles.css | 8 +- docs/vocs.config.tsx | 20 +- docs/yarn.lock | 4715 +++++++++++++++++ 15 files changed, 5367 insertions(+), 402 deletions(-) delete mode 100644 docs/pages/developers/evm/contract-addresses.mdx create mode 100644 docs/pages/developers/evm/dispatching.mdx delete mode 100644 docs/pages/developers/evm/networks.mdx create mode 100644 docs/pages/developers/evm/receiving.mdx create mode 100644 docs/public/logo_black.svg create mode 100644 docs/public/logo_white.svg create mode 100644 docs/yarn.lock diff --git a/Cargo.lock b/Cargo.lock index 06a07782a..c1ad4c127 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -308,9 +308,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "anymap2" @@ -7705,7 +7705,7 @@ dependencies = [ "serde", "serde-hex-utils", "serde_json", - "thiserror 2.0.0", + "thiserror 2.0.3", ] [[package]] @@ -23980,11 +23980,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.0" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15291287e9bff1bc6f9ff3409ed9af665bec7a5fc8ac079ea96be07bca0e2668" +checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" dependencies = [ - "thiserror-impl 2.0.0", + "thiserror-impl 2.0.3", ] [[package]] @@ -24020,9 +24020,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.0" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22efd00f33f93fa62848a7cab956c3d38c8d43095efda1decfc2b3a5dc0b8972" +checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" dependencies = [ "proc-macro2", "quote", diff --git a/docs/package.json b/docs/package.json index c8d7ef322..c62385419 100644 --- a/docs/package.json +++ b/docs/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vocs dev --host", + "dev": "while true; do vocs dev --host && break; done", "build": "vocs build && node ./fixTrailingSlash.js", "preview": "vocs preview" }, diff --git a/docs/pages/developers/evm/contract-addresses.mdx b/docs/pages/developers/evm/contract-addresses.mdx deleted file mode 100644 index 36327c59e..000000000 --- a/docs/pages/developers/evm/contract-addresses.mdx +++ /dev/null @@ -1,6 +0,0 @@ -# Deployed Contracts - -Hyperbridge is deployed to both Testnet and Mainnet environments - -* [Mainnet](/developers/evm/contracts/mainnet) -* [Testnet](/developers/evm/contracts/testnet) diff --git a/docs/pages/developers/evm/dispatching.mdx b/docs/pages/developers/evm/dispatching.mdx new file mode 100644 index 000000000..c79612884 --- /dev/null +++ b/docs/pages/developers/evm/dispatching.mdx @@ -0,0 +1,205 @@ +# Dispatching Requests & Responses + +This section explores the means by which applications may leverage Hyperbridge to dispatch cross-chain message. It's important to understand that in Hyperbridge paralance, there are 3 different kinds of cross-chain messages. We'll explore each of them Below. + +## POST Request + +A POST request is simply a cross-chain message to executed by some `IIsmpModule` on a destination. It's important to understand that **EOAs should not dispatch** POST requests directly, instead an application must be responsible for the dispatch. This way if the request delivery or execution fails on the destination, modules can "catch" this failure similar to the try/catch pattern and handle the failure case in the `onPostRequestTimeout` callback. + +A post request is created using the `DispatchPost` struct + +```solidity showLineNumbers +// An object for dispatching post requests to the IsmpDispatcher +struct DispatchPost { + // Use the StateMachine library to create this + bytes dest; + // The destination module + bytes to; + // The request body + bytes body; + // timeout for this request in seconds + uint64 timeout; + // The amount put up to be paid to the relayer, this is in $DAI and charged to tx.origin + uint256 fee; + // who pays for this request? + address payer; +} +``` + +### Dispatch Parameters: + +- `dest`: Destination chain, for this you'll use the `StateMachine` library eg `StateMachine.evm(1)` for Ethereum Mainnet. + +
+ +- `to`: Receiving module/contract address on the destination chain. + +
+ +- `body`: Serialized byte representation of the message (to be decoded by the receiving contract). +
+- `timeout`: Relative time in seconds for message validity. Messages exceeding this timeout cannot be processed on the destination and require user action (timeout message) to revert changes. +
+- `fee`: Optional relayer fees, this can also be set to zero if the application developers prefer to self-relay. +
+- `payer`: The account that should receive a refund of the relayer fees if the request times out. + +```solidity showLineNumbers +function send_message( + bytes memory message, + uint64 timeout, + address to, + uint256 relayerFee +) public payable returns (bytes32) { + DispatchPost memory post = DispatchPost({ + body: message, + dest: StateMachine.evm(1), + timeout: timeout, + to: abi.encodePacked(to), + fee: relayerFee, + payer: tx.origin + }); + + return IDispatcher(_host).dispatch{value: msg.value}(post); +} +``` + +## POST Responses + +Dispatching a POST response, going by it's name is, well, a response to a previously received POST request. Dispatching a POST response requires that the contract has indeed received a post request from a counterparty chain in a previous transaction. + +A post response dispatch has the following fields: + +```solidity showLineNumbers +// An object for dispatching post responses to the IsmpDispatcher +struct DispatchPostResponse { + // The request that initiated this response + PostRequest request; + // bytes for post response + bytes response; + // timeout for this response in seconds + uint64 timeout; + // the amount put up to be paid to the relayer, this is in $DAI and charged to tx.origin + uint256 fee; + // who pays for this request? + address payer; +} +``` + +### Dispatch Parameters: + +- `request`: The request object that was previously received. + +
+ +- `response`: Opaque byte representation of the response message (to be decoded by the receiving contract). + +
+ +- `timeout`: Relative time in seconds for message validity. Messages exceeding this timeout cannot be processed on the destination and require user action + (timeout message) to revert changes. + +
+ +- `fee`: Optional relayer incentive (zero for self-relay). + +
+ +- `payer`: The account that should receive a refund of the relayer fees if the request times out. +
+ +```solidity showLineNumbers +// _host is variable that contains the EvmHost contract address +function sendResponse( + PostRequest memory request, + bytes memory response, + uint64 timeout, + uint256 relayerFee +) public payable returns (bytes32) { + DispatchPostResponse memory postResponse = DispatchPostResponse({ + request: request, + response: response, + timeout: timeout, + fee: relayerFee, + payer: msg.sender + }); + + return IDispatcher(_host).dispatch{value: msg.value}(postResponse); +} +``` + +## GET Requests + +GET requests allow contracts to perform asynchronous reads of a counterparty blockchain's state. This can be used to read either the [`Account`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/util#module-account) object, which is stored in the world state, or even storage slots in a contract storage. Eg reading the price of a Uniswap pair on a remote chain. + +When dispatching get requests, +you specify the storage keys you need to read and the block height at which you need to read these storage entries. + +```solidity +// An object for dispatching get requests to the IsmpDispatcher +struct DispatchGet { + // bytes representation of the destination state machine + bytes dest; + // height at which to read the state machine + uint64 height; + // Storage keys to read + bytes[] keys; + // timeout for this request in seconds + uint64 timeout; + // The initiator of this request + address sender; + // Hyperbridge protocol fees for processing this request. + uint256 fee; +} +``` + +### Dispatch Parameters: + +- `dest`: The chain whose database should be read (e.g., `StateMachine.evm(1)` for Ethereum Mainnet). + +
+ +- `height`: Block height at which the values should be fetched. + +
+ +- `keys`: Storage keys whose values need to be fetched. + +
+ +- `timeout`: Relative time in seconds for message validity. Responses exceeding this timeout cannot be processed on the source and require user action (timeout + message) to revert changes. + +
+ +- `fee`: Hyperbridge protocol fees for processing the request. + +
+ +- `sender`: The account initiating this request. +
+ +```solidity +// _host is variable that contains the EvmHost contract address +function readState( + bytes memory dest, + bytes[] memory keys, + uint64 timeout, + uint256 fee, + uint256 height +) public payable returns (bytes32) { + + DispatchGet memory getRequest = DispatchGet({ + dest: dest, + keys: keys + height: height + timeout: timeout, + fee: fee, + sender: tx.origin + }); + + return IDispatcher(_host).dispatch{value: msg.value}(getRequest); +} +``` + +In the next section we'll look at how Hyperbridge collects it's fees. diff --git a/docs/pages/developers/evm/fees.mdx b/docs/pages/developers/evm/fees.mdx index 0879029f1..b2046769c 100644 --- a/docs/pages/developers/evm/fees.mdx +++ b/docs/pages/developers/evm/fees.mdx @@ -1,71 +1,104 @@ --- -title: Protocol Fees +title: Fees description: Hyperbridge charges a non-refundable protocol fee per byte of the request/response body. This fee is withdrawn from the contract account calling the `IsmpDispatcher`. --- -# Protocol Fees +# Fees -Hyperbridge charges a non-refundable protocol fee per byte of the request/response body. This fee is withdrawn from the contract account calling the `IsmpDispatcher`. Importantly, the contract must first approve the `EvmHost` to withdraw the exact amount before calling the dispatch function. +Hyperbridge charges a non-refundable protocol fee per byte of the request/response body. This fee is withdrawn from the contract account calling the `IDispatcher`. Fees can be paid in either the native token, or the `IDispatcher`'s configured `feeToken`. Modules may also opt to pay a delivery fee for their messages to incentivize 3rd party relayers to deliver and execute their requests on the destination chain. -### Expected Workflow: -Contracts initiating a dispatch should: -* Withdraw the protocol fee from the user's account. -* Grant the `EvmHost` approval to withdraw the same amount. -* Call the dispatch function on the host. -### Finding the Fee Token: -The token accepted for protocol fee payments is readily available through `IIsmpHost(_host).feeToken()`. +## Native Token Payments + + +The `IDispatcher` contract can be called with some `msg.value` to be used to pay for both the Hyperbridge protocol fees and relayer fees. Lets understand how this value is calculated. First we must understand that Hyperbridge ultimately collects it's fees in stablecoins. The configured stablecoin for fees is accessible by: -The following snippet shows how to calculate the protocol fee for a post request. ```solidity showLineNumbers - import {IIsmpHost} from "ismp/IIsmpHost.sol"; - // _host is variable that contains the EvmHost contract address - abstract contract Example { - function hyperbridgeFee(bytes memory body) external view returns (uint256) { - memory perByteFee = IIsmpHost(_host).perByteFee(); - uint256 protocolFee = perByteFee * body.length; - return protocolFee; - } - - function feeToken() external view returns (address) { - return IIsmpHost(_host).feeToken() - } - } +address feeToken = IDispatcher(host()).feeToken(); ``` -In the case of Post responses the protocol fee is calculated from the size of the response. -## Hyperbridge Relayer Fees +So when you use the native token to pay for fees, The `IDispatcher` actually swaps this native token for the `feeToken` using UniswapV2 underneath. +So to quote the amount that's required for fees, you will need to call the following methods **offchain**: -The relayer fee is an optional incentive provided by users initiating cross-chain transactions. It compensates Hyperbridge's decentralized relayers for delivering messages to the destination chain. +```solidity showLineNumbers +uint256 perByteFee = IDispatcher(host()).perByteFee(); +uint256 protocolFees = request.body.length * perByteFee; +uint256 fees = protocolFees + request.fee; +address[] memory path = new address[](2); +path[0] = IUniswapV2Router02(_uniswap).WETH(); +path[1] = address(IDispatcher(host()).feeToken()); +uint256 nativeCost = IUniswapV2Router02(_uniswap).getAmountsIn(fees, path)[0]; +``` -### Components +Alternatively If your module extends the `BaseIsmpModule`, then you already have access to a convenient method `quoteNative` for this. -The fee consists of two parts: - - **Gas fee**: - This covers the cost of executing the message on the destination chain. - - **Relayer service fee**: - This additional amount rewards relayers for their services. Relayers are profit-Driven mediators and they will prioritize messages with fees that ensure profitability. +```solidity showLineNumbers +uint256 nativeCost = YourModule(moduleAddress).quoteNative(request); +``` + +:::danger[Please Note] +It would be prudent to add at least 0.5% slippage to this quoted amount to prevent failed transactions. +::: -#### Setting the Fee +## Stable Coin Payments -To account for potential gas price fluctuations during message delivery, consider the following: +Alternatively, you might want to make payments directly in the configured `feeToken`. This would save on a considerable amount of gas, and as a result save your application users some money. To do this, ensure that your application has approved the host contract to spend infinitely, not to worry here. The host contract is immutable, ie not upgradeable, so you don't have to worry about getting drained. + +In your contract constructor you should execute the following: + +```solidity showLineNumbers +constructor() { + // approve the host infintely + address feeToken = IDispatcher(host()).feeToken(); + IERC20(feeToken).approve(host(), type(uint256).max); +} +``` + +Now that your contract has approved the `host`. You can now call dispatch without the `msg.value`. The host will withdraw the exact amount for it's protocol fees and any relayer fees from your contract's balance in the `feeToken`. + +You can estimate the cost of a request through + +```solidity showLineNumbers +uint256 perByteFee = IDispatcher(host()).perByteFee(); +uint256 protocolFees = request.body.length * perByteFee; +uint256 fees = protocolFees + request.fee; +``` + +Alternatively If your module extends the `BaseIsmpModule`, then a convenient method `quote` is provided for this. + +```solidity showLineNumbers +uint256 feeTokenCost = YourModule(moduleAddress).quote(request); +``` + +:::danger[Please Note] +It might be prudent to withdraw this fee from your user's account before dispatching messages. +::: + + +## Relayer Fees + +The relayer fee is an optional incentive provided by applications initiating cross-chain transactions. It compensates Hyperbridge's decentralized relayers for delivering messages to the destination chain. + +### Components + +The fee consists of three parts: + + - **Proof verification cost**: For a cross-chain message to be delivered and executed, it must first be authenticated through state proofs. The expected cost for state proof verification is 150k gas. Contracts should account for this cost when setting the relayer fee. - - **Proof verification cost**: For a cross-chain message to be delivered and executed, it must first be authenticated through state proofs. The expected cost for state proof verification is 120k gas. Contracts should account for the stablecoin equivalent cost when setting the relayer fee. - **Message execution gas cost**: - The usd equivalent for the gas cost of executing the message - - **Gas price buffer**: - Include a buffer to accommodate gas price spikes. - - **Relayer service charge**: - Factor in a reasonable amount to compensate relayers. - - **Self-Relay Option**: - Users can choose to self-relay messages by omitting the relayer fee. + After proof verification, the receiving module is handed the request to be executed. This will consume some gas which should also be accounted for -### Collecting Relayer Fees -If a user provides a non-zero relayer fee, then the contract should withdraw the fee from the user's account. -When the contract calls `dispatch`, the `EvmHost` will attempt to withdraw the relayer fee from the contract's account. Ensure the contract approves the EvmHost for the amount specified as the relayer fee before calling `dispatch`. + - **Relayer service fee**: + This additional amount rewards relayers for their services. Relayers are profit-Driven mediators and they will prioritize messages with fees that ensure profitability. + +Calculating the relayer fee can be expressed as follows: + +``` +relayer_fee = gas_to_usd(destination_gas_price * (150_000 + receiving_module_gas_cost)) + relayer_tip +``` -## Mitigating Gas Cost Spikes +### Mitigating Gas Cost Spikes During periods of high gas prices on the destination chain, you can increase the relayer fee for in-flight requests and responses to incentivize their delivery. -The `EvmHost` contract provides the `fundRequest` and `fundResponse` functions for this purpose. Simply call the appropriate function with the request/response commitment and the desired fee increase amount. +The `IDispatcher` interface provides the `fundRequest` and `fundResponse` methods for this purpose. Simply call the appropriate function with the request/response commitment and the desired fee increase amount. diff --git a/docs/pages/developers/evm/getting-started.mdx b/docs/pages/developers/evm/getting-started.mdx index 6f14725f8..a29248704 100644 --- a/docs/pages/developers/evm/getting-started.mdx +++ b/docs/pages/developers/evm/getting-started.mdx @@ -1,346 +1,64 @@ --- title: Getting Started -description: ISMP Solidity is the implementation of the Interoperable State Machine Protocol for EVM execution environments. It provides EVM smart contracts with the necessary interfaces to send and receive messages securely through the Hyperbridge Nexus. +description: Hyperbridge is built on a cross-chain interoperability protocol referred to as the [Interoperable State Machine Protocol](/protocol/ismp). This protocol implementation lives in the [Hyperbridge Monorepo](https://github.com/polytope-labs/hyperbridge/tree/main/evm). But it's interfaces are outlined in the [ismp-solidity](https://github.com/polytope-labs/ismp-solidity) repository. --- # ISMP Solidity -ISMP Solidity is the implementation of the [Interoperable State Machine Protocol](/protocol/ismp) for EVM execution environments. It provides EVM smart contracts with the necessary interfaces to send and receive messages securely through the Hyperbridge Nexus. Let's dive into it's different components: +Hyperbridge is built on a cross-chain interoperability protocol referred to as the [Interoperable State Machine Protocol](/protocol/ismp). This protocol implementation lives in the [Hyperbridge Monorepo](https://github.com/polytope-labs/hyperbridge/tree/main/evm). But it's interfaces are outlined in the [ismp-solidity](https://github.com/polytope-labs/ismp-solidity) repository. -## `EvmHost` +Developers will mostly interact with these interfaces so it's a good idea to become more familiar witrh them. These interfaces provide EVM smart contracts with the necessary APIs to send and receive messages securely through the Hyperbridge. Let's dive into it's different components: -The `EvmHost` contract, implementing the [`IsmpHost`](/protocol/ismp/host) interface, is a stateful module responsible for all protocol storage needs. It functions as a store for consensus states, state machine commitments, request/response commitments and receipts. -Additionally, it implements the [`IsmpDispatcher`](/protocol/ismp/dispatcher) interface, providing methods for contracts to dispatch requests and responses to the Hyperbridge Nexus. +## `IIsmpHost` -## `EvmHandler` +The [`IIsmpHost`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/IIsmpHost.sol#L60) interface, which implements a subset of the [`IsmpHost`](/protocol/ismp/host), is the central core of the ISMP protocol. It is a stateful contract responsible for all protocol storage needs. It functions as a store for -The Handler contract, which implements `IHandler` interface, is stateless contract responsible for handling consensus and state proof verifications for all ISMP messages. Upon successful verification, it delegates state persistence and dispatch to the EvmHost contract. +- Consensus states +- State Commitments +- Request Commitments and Receipts +- Response Commitments and Receipts -This decoupled design of the Handler from the Host allows independent upgrades to verification mechanisms without impacting the core protocol, enabling future adoption of more efficient consensus and state verification methods with no changes to the protocol or dependent contracts. - -In the next section we'll look into hands-on examples of how to send and receive messages using ISMP. - - -## Going cross-chain with ISMP - -This guide explores the two fundamental functionalities of ISMP for cross-chain applications: dispatching messages and receiving messages. We'll look into each aspect in the following sections. -Sending cross chain messages is a single step process that involves calling the dispatch function on the `EvmHost`. - -### Post Requests - -A post request dispatch has the following fields: - -```solidity showLineNumbers -// An object for dispatching post requests to the IsmpDispatcher -struct DispatchPost { - // bytes representation of the destination state machine - bytes dest; - // the destination module - bytes to; - // the request body - bytes body; - // timeout for this request in seconds - uint64 timeout; - // the amount put up to be paid to the relayer, this is in $DAI and charged to tx.origin - uint256 fee; - // who pays for this request? - address payer; -} -``` - -#### Dispatch Parameters: - - - `dest`: Destination chain (e.g., `StateMachine.arbitrum()`). - - `to`: Receiving contract address on the destination chain. - - `body`: Opaque byte representation of the message (decoded by the receiving contract). - - `timeout`: Relative time in seconds for message validity. Messages exceeding this timeout cannot be processed on the destination and require user action (timeout message) to revert changes. - - `fee`: Optional relayer incentive (zero for self-relay). - - `payer`: The account that should receive a refund of the relayer fees if the request times out. - -```solidity showLineNumbers -// _host is variable that contains the EvmHost contract address -function send_message(bytes memory message, uint64 timeout, address to, uint256 relayerFee) public returns (bytes32) { - uint256 perByteFee = IIsmpHost(_host).perByteFee(); - address feeToken = IIsmpHost(_host).feeToken(); - uint256 fee = (perByteFee * message.length) + relayerFee; - - // Withdraw protocol and relayer fee from sender - IERC20(feeToken).transferFrom(msg.sender, address(this), fee); - // Approve the host to withdraw the fee from the contract - IERC20(feeToken).approve(_host, fee); - - DispatchPost memory post = DispatchPost({ - body: message, - dest: StateMachine.arbitrum(), - timeout: timeout, - to: abi.encodePacked(to), - fee: relayerFee, - payer: tx.origin - }); - - return IDispatcher(_host).dispatch(post); -} -``` - -### Post Responses - -Dispatching a post response requires that the contract has received a post request from a counterparty chain in a previous transaction. -A post response dispatch has the following fields: - -```solidity showLineNumbers -// An object for dispatching post responses to the IsmpDispatcher -struct DispatchPostResponse { - // The request that initiated this response - PostRequest request; - // bytes for post response - bytes response; - // timeout for this response in seconds - uint64 timeout; - // the amount put up to be paid to the relayer, this is in $DAI and charged to tx.origin - uint256 fee; - // who pays for this request? - address payer; -} -``` - - -#### Dispatch Parameters: - - - `request`: The request that was previously received. - - `response`: Opaque byte representation of the response message (decoded by the receiving contract). - - `timeout`: Relative time in seconds for message validity. Messages exceeding this timeout cannot be processed on the destination and require user action (timeout message) to revert changes. - - `fee`: Optional relayer incentive (zero for self-relay). - - `payer`: The account that should receive a refund of the relayer fees if the request times out. - -```solidity showLineNumbers -// _host is variable that contains the EvmHost contract address -function send_message(PostRequest memory request, bytes memory response, uint64 timeout, uint256 relayerFee) public returns (bytes32) { - uint256 perByteFee = IIsmpHost(_host).perByteFee(); - address feeToken = IIsmpHost(_host).feeToken(); - uint256 fee = (perByteFee * response.length) + relayerFee; - - // Withdraw protocol and relayer fee from sender - IERC20(feeToken).transferFrom(msg.sender, address(this), fee); - // Approve the host to withdraw the fee from the contract - IERC20(feeToken).approve(_host, fee); - - DispatchPostResponse memory postResponse = DispatchPostResponse({ - request: request, - response: response, - timeout: timeout, - fee: relayerFee, - payer: tx.origin - }); - - return IDispatcher(_host).dispatch(postResponse); -} -``` +Additionally, it implements the [`IsmpDispatcher`](/protocol/ismp/dispatcher) interface, providing methods for contracts to dispatch requests and responses to the Hyperbridge. -### Dispatching Get Requests +## `IHandler` -Get requests allow contracts to perform asynchronous reads of a counterparty blockchain's state. When dispatching get requests, -you specify the storage keys you need to read and the block height at which you need to read these storage entries. +The [`IHandler`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/IHandler.sol#L25) serves as the entry point for all ISMP datagrams. It is a stateless contract responsible for handling consensus and state proof verifications for all ISMP messages. Upon successful verification, it delegates storage and dispatching to relevant `IIsmpModules` to the `IIsmpHost` contract. -```solidity -// An object for dispatching get requests to the IsmpDispatcher -struct DispatchGet { - // bytes representation of the destination state machine - bytes dest; - // height at which to read the state machine - uint64 height; - // Storage keys to read - bytes[] keys; - // timeout for this request in seconds - uint64 timeout; - // The initiator of this request - address sender; - // Hyperbridge protocol fees for processing this request. - uint256 fee; -} -``` - -#### Dispatch Parameters: - - - `dest`: The chain whose database should be read (e.g., `StateMachine.arbitrum()`). - - `height`: Block height at which the values should be fetched. - - `keys`: Storage keys whose values need to be fetched. - - `timeout`: Relative time in seconds for message validity. Responses exceeding this timeout cannot be processed on the source and require user action (timeout message) to revert changes. - - `fee`: Hyperbridge protocol fees for processing the request. - - `sender`: The account initiating this request. - -```solidity -// _host is variable that contains the EvmHost contract address -function get_storage_values(bytes memory dest, bytes[] memory keys, uint64 timeout, uint256 fee, uint256 height) public returns (bytes32) { - // Withdraw protocol fee from sender - IERC20(feeToken).transferFrom(msg.sender, address(this), fee); - // Approve the host to withdraw the fee from the contract - IERC20(feeToken).approve(_host, fee); - - DispatchGet memory getRequest = DispatchGet({ - dest: dest, - keys: keys - height: height - timeout: timeout, - fee: fee, - sender: tx.origin - }); - - return IDispatcher(_host).dispatch(getRequest); -} -``` - - -### Receiving cross chain messages - -To receive ISMP messages a contract needs to implement the `IIsmpModule` interface, this interface allows the `EvmHost` to dispatch verified cross chain messages to the contract for execution. - -The interface for the `IIsmpModule` is described below: -```solidity showLineNumbers -interface IIsmpModule { - /** - * @dev Called by the IsmpHost to notify a module of a new request the module may choose to respond immediately, or in a later block - * @param incoming post request - */ - function onAccept(IncomingPostRequest memory incoming) external; - - /** - * @dev Called by the IsmpHost to notify a module of a post response to a previously sent out request - * @param incoming post response - */ - function onPostResponse(IncomingPostResponse memory incoming) external; - - /** - * @dev Called by the IsmpHost to notify a module of a get response to a previously sent out request - * @param incoming get response - */ - function onGetResponse(IncomingGetResponse memory incoming) external; - - /** - * @dev Called by the IsmpHost to notify a module of post requests that were previously sent but have now timed-out - * @param request post request - */ - function onPostRequestTimeout(PostRequest memory request) external; - - /** - * @dev Called by the IsmpHost to notify a module of post requests that were previously sent but have now timed-out - * @param request post request - */ - function onPostResponseTimeout(PostResponse memory request) external; - - /** - * @dev Called by the IsmpHost to notify a module of get requests that were previously sent but have now timed-out - * @param request get request - */ - function onGetTimeout(GetRequest memory request) external; -} -``` - - -#### A simple crosschain contract - -```solidity showLineNumbers -pragma solidity 0.8.17; - -import "ismp/IIsmpModule.sol"; -import "ismp/IIsmpHost.sol"; -import "ismp/Message.sol"; -import "ismp/IDispatcher.sol"; - -contract Example is BaseIsmpModule { - event PostReceived(); - event PostResponseReceived(); - event PostTimeoutReceived(); - event PostResponseTimeoutReceived(); - event GetResponseReceived(); - event GetTimeoutReceived(); - error NotAuthorized(); - - // EvmHost Address - address private host; - - constructor(address host) { - host = host; - } - - // restricts call to the `IIsmpHost` - modifier onlyIsmpHost() { - if (msg.sender != host) { - revert NotAuthorized(); - } - _; - } +This decoupled design of the Handler from the Host allows independent upgrades to verification mechanisms without impacting the core protocol, enabling future adoption of more efficient consensus and state verification methods with no changes to the protocol or dependent contracts. - function send_message(bytes memory message, uint64 timeout, address to, uint256 relayerFee) public returns (bytes32) { - uint256 perByteFee = IIsmpHost(host).perByteFee(); - address feeToken = IIsmpHost(host).feeToken(); - uint256 fee = (perByteFee * message.length) + relayerFee; - // Withdraw protocol and relayer fee from sender - IERC20(feeToken).transferFrom(msg.sender, address(this), fee); - // Approve the host to withdraw the fee from the contract - IERC20(feeToken).approve(host, fee); +## `IConsensusClient` - DispatchPost memory post = DispatchPost({ - body: message, - dest: StateMachine.arbitrum(), - timeout: timeout, - to: abi.encodePacked(to), - fee: relayerFee, - payer: tx.origin - }); +The [`IConsensusClient`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/IConsensusClient.sol#L46) is a library for verifying Hyperbridge's consensus on EVM chains. This is only used by the `IHandler` contract and is likely of no use to 3rd party developers. - return IDispatcher(host).dispatch(post); - } - function onAccept(IncomingPostRequest memory incoming) external onlyIsmpHost { - // decode request body - // Check that decoded value can be executed successfully - // Make state changes - emit PostReceived(); - } +## `IDispatcher` - function onPostRequestTimeout(PostRequest memory request) external onlyIsmpHost { - // revert any state changes made when post request was dispatched - emit PostTimeoutReceived(); - } +The [`IDispatcher`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/IDispatcher.sol#L71) +is the interface that will concern EVM developers the most. It is the interface through which cross-chain messages and state reads are dispatched. +It provides methods for dispatching POST requests, POST responses, and GET requests. - function onPostResponse(IncomingPostResponse memory) external onlyIsmpHost { - // decode response - // Check that decoded value can be executed successfully - // Make state changes - emit PostResponseReceived(); - } - function onPostResponseTimeout(PostResponse memory) external onlyIsmpHost { - // revert any state changes made when post response was dispatched - emit PostResponseTimeoutReceived(); - } +## `IIsmpModule` - function onGetResponse(IncomingGetResponse memory) external onlyIsmpHost { - emit GetResponseReceived(); - } +The [`IIsmpModule`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/IIsmpModule.sol#L42) interface defines the required APIs that contracts should provide in order to receive incoming messages. An abstract class [`BaseIsmpModule`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/IIsmpModule.sol#L83) is provided for convenience allowing developers only override methods that they care about. - function onGetTimeout(GetRequest memory) external onlyIsmpHost { - // revert any state changes made when get request was dispatched - emit GetTimeoutReceived(); - } -} -``` +## `StateMachine` -### Security Considerations +The [`StateMachine`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/StateMachine.sol#L18) is a convenience library for identifying state machines that messages are addressed to or from. Hyperbridge supports all kinds of state machines including but not limited to -* Restricted Access: +- EVM state machines +- Polkadot-SDK state machines +- Cosmos SDK state machines -Limit the callability of these functions to the `EvmHost` contract only. This prevents unauthorized messages from being executed. -* Irreversible Changes: +In the next section we'll look into hands-on examples of how to send and receive messages using ISMP. -Since the `EvmHost` doesn't store receipts for failed messages, ensure irreversible state changes occur only after a message effectively meets all success criteria. -## Implementation +## Implementations - - [EvmHost](https://github.com/polytope-labs/hyperbridge/blob/main/evm/src/hosts/EvmHost.sol) - - [Handler](https://github.com/polytope-labs/hyperbridge/blob/main/evm/src/modules/HandlerV1.sol) - - [ismp-solidity](https://github.com/polytope-labs/ismp-solidity) + - [IIsmpHost](https://github.com/polytope-labs/hyperbridge/blob/main/evm/src/hosts/EvmHost.sol#L126) + - [IHandler](https://github.com/polytope-labs/hyperbridge/blob/main/evm/src/modules/HandlerV1.sol#L57) + - [IConsensusClient](https://github.com/polytope-labs/hyperbridge/blob/main/evm/src/consensus/SP1Beefy.sol#L31) diff --git a/docs/pages/developers/evm/networks.mdx b/docs/pages/developers/evm/networks.mdx deleted file mode 100644 index 8975fc6f9..000000000 --- a/docs/pages/developers/evm/networks.mdx +++ /dev/null @@ -1,12 +0,0 @@ -# Supported Networks - -Hyperbridge Supports the following EVM based chains - -* Arbitrum -* Base -* Optimism -* Ethereum -* Bsc -* Gnosis - -Support for more chains coming soon. diff --git a/docs/pages/developers/evm/receiving.mdx b/docs/pages/developers/evm/receiving.mdx new file mode 100644 index 000000000..3dea5071f --- /dev/null +++ b/docs/pages/developers/evm/receiving.mdx @@ -0,0 +1,132 @@ +# Receiving cross chain messages + +To receive ISMP messages a contract must implement the [`IIsmpModule`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/IIsmpModule.sol#L42) interface, this interface allows the `IIsmpHost` to dispatch verified cross chain messages to the contract for execution. + +The required methods for the [`IIsmpModule`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/IIsmpModule.sol#L42) is described in detail below: + + +## `onAccept` + +This is the callback method for new POST requests that have been verified by Hyperbridge. After the `IHandler` verifies the neccessary proofs of this request, they are passed on to the host, which in turn calls the `onAccept` method for the intended modules. The arguments provided `IncomingPostRequest` holds both the request object itself and the account that initally called the Handler contract, this may be either a 3rd party relayer or a user who is self-relaying. + +`IIsmpModule`'s should ensure that is method is only callable by the `host` or risk critical vulnerabilies from unauthorized calls to this method by malicious actors. A modifier `onlyHost` is provided as part of the `BaseIsmpModule` for this. + +## `onPostRequestTimeout` + +In the event that some initially dispatched request was unable to be delivered. Whether as a result of insufficient fees provided to the relayers, Or a revert during request execution on the destination chain. Then Hyperbridge allows this request to gracefully timeout, and this timeout can be reported back to the sending module on the source chain. + +This callback is provided as a way to execute some logic in the event that some request times out. This can be seen as a *catch* block in a try/catch for cross-chain messages. Typically you'll want to revert any state changes that were made prior to dispatching the request. + +## `onPostResponse` + +This is the callback method for new POST responses that have been verified by Hyperbridge. After the `IHandler` verifies the neccessary proofs of this response, they are passed on to the host, which in turn calls the `onPostResponse` method for the intended modules. The arguments provided `IncomingPostResponse` holds both the resopnse object itself and the account that initally called the Handler contract, this may be either a 3rd party relayer or a user who is self-relaying. + +`IIsmpModule`'s should ensure that is method is only callable by the `host` or risk critical vulnerabilies from unauthorized calls to this method by malicious actors. A modifier `onlyHost` is provided as part of the `BaseIsmpModule` for this. + +## `onPostResponseTimeout` + +In the event that some initially dispatched response was unable to be delivered. Whether as a result of insufficient fees provided to the relayers, Or a revert during response execution on the destination chain. Then Hyperbridge allows this response to gracefully timeout, and this timeout can be reported back to the sending module on the source chain. + +This callback is provided as a way to execute some logic in the event that some response times out. This can be seen as a *catch* block in a try/catch for cross-chain messages. Typically you'll want to revert any state changes that were made prior to dispatching the response. + +## `onGetResponse` + +This is the callback method for new GET responses that have been verified by Hyperbridge. After the `IHandler` verifies the neccessary proofs of this response, they are passed on to the host, which in turn calls the `onGetResponse` method for the intended modules. The arguments provided `IncomingGetResponse` holds both the resopnse object itself and the account that initally called the Handler contract, this may be either a 3rd party relayer or a user who is self-relaying. + +`IIsmpModule`'s should ensure that is method is only callable by the `host` or risk critical vulnerabilies from unauthorized calls to this method by malicious actors. A modifier `onlyHost` is provided as part of the `BaseIsmpModule` for this. + +## `onGetTimeout` + +In the event that some GET request is unable to be processed. Likely as a result of insufficient fees provided. Then Hyperbridge allows this request to gracefully timeout, and this timeout can be reported back to the sending module on the source chain. + +This callback is provided as a way to execute some logic in the event that some request times out. This can be seen as a *catch* block in a try/catch for cross-chain messages. Typically you'll want to revert any state changes that were made prior to dispatching the request. + + +## Example `IIsmpModule` + +```solidity showLineNumbers +pragma solidity 0.8.17; + +import "@polytope-labs/ismp-solidity/interfaces/IIsmpModule.sol"; +import "@polytope-labs/ismp-solidity/interfaces/IDispatcher.sol"; +import "@polytope-labs/ismp-solidity/interfaces/Message.sol"; +import "@polytope-labs/ismp-solidity/interfaces/IDispatcher.sol"; + +contract Example is BaseIsmpModule { + event PostReceived(); + event PostResponseReceived(); + event PostTimeoutReceived(); + event PostResponseTimeoutReceived(); + event GetResponseReceived(); + event GetTimeoutReceived(); + error NotAuthorized(); + + // EvmHost Address + address private _host; + + constructor(address ismpHost) { + _host = ismpHost; + } + + function host() public view override returns (address) { + return _host + } + + function sendMessage( + bytes memory message, + uint64 timeout, + address to, + uint256 relayerFee + ) public payable returns (bytes32) { + DispatchPost memory post = DispatchPost({ + body: message, + dest: StateMachine.arbitrum(), + timeout: timeout, + to: abi.encodePacked(to), + fee: relayerFee, + payer: tx.origin + }); + + return IDispatcher(host).dispatch{value: msg.value}(post); + } + + function onAccept(IncomingPostRequest memory incoming) external override onlyHost { + // decode request body + // Check that decoded value can be executed successfully + // Make state changes + emit PostReceived(); + } + + function onPostRequestTimeout(PostRequest memory request) external override onlyHost { + // revert any state changes made when post request was dispatched + emit PostTimeoutReceived(); + } + + function onPostResponse(IncomingPostResponse memory) external override onlyHost { + // decode response + // Check that decoded value can be executed successfully + // Make state changes + emit PostResponseReceived(); + } + + function onPostResponseTimeout(PostResponse memory) external override onlyHost { + // revert any state changes made when post response was dispatched + emit PostResponseTimeoutReceived(); + } + + function onGetResponse(IncomingGetResponse memory) external override onlyHost { + emit GetResponseReceived(); + } + + function onGetTimeout(GetRequest memory) external override onlyHost { + // revert any state changes made when get request was dispatched + emit GetTimeoutReceived(); + } +} +``` + + +## Security Considerations + +* Limit the caller of these functions to the `IIsmpHost` contract only. This prevents unauthorized messages from being executed. + diff --git a/docs/pages/developers/index.mdx b/docs/pages/developers/index.mdx index a66d54486..ee204a600 100644 --- a/docs/pages/developers/index.mdx +++ b/docs/pages/developers/index.mdx @@ -3,7 +3,7 @@ title: Hyperbridge for Developers description: Hyperbridge is a fully chain-agnostic interoperability protocol that enables developers to build applications that can securely interoperate with any blockchain. For the first time, developers can build mission-critical cross-chain applications secured by interoperability proofs. --- -# Hyperbridge +# Hyperbridge For Developers Hyperbridge is a fully chain-agnostic interoperability protocol that enables developers to build applications that can securely interoperate with any blockchain. The Hyperbridge protocol presents developers with a unified interface for the multi-chain that allows for the secure and trust-free transfer of assets and data between different blockchains. It is designed to be modular and extensible, allowing for the integration of new chains and protocols as the multi-chain ecosystem grows. For the first time, developers can build mission-critical cross-chain applications secured by interoperability proofs. diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx index d97d02773..0d3a384bc 100644 --- a/docs/pages/index.mdx +++ b/docs/pages/index.mdx @@ -34,6 +34,6 @@ Hyperbridge is the first cross-chain protocol of its kind that leverages cryptog ## Useful Links - - [Polytope Labs, "Introducing Hyperbridge: An Interoperability Coprocessor"](https://blog.polytope.technology/introducing-hyperbridge-interoperability-coprocessor) - - [Polytope Labs, "Cryptoeconomic Coprocessors and their applications"](https://blog.polytope.technology/cryptoeconomic-coprocessors) + - [Polytope Labs, "Introducing Hyperbridge: An Interoperability Coprocessor"](https://blog.hyperbridge.network/introducing-hyperbridge-interoperability-coprocessor) + - [Polytope Labs, "Cryptoeconomic Coprocessors and their applications"](https://blog.hyperbridge.network/cryptoeconomic-coprocessors) - [Rob Habermeier, "Coprocessor Market Structure: Cryptoeconomic vs ZK"](https://www.rob.tech/blog/coprocessor-competition/) diff --git a/docs/public/logo_black.svg b/docs/public/logo_black.svg new file mode 100644 index 000000000..29e9a3749 --- /dev/null +++ b/docs/public/logo_black.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/public/logo_white.svg b/docs/public/logo_white.svg new file mode 100644 index 000000000..4510bd79c --- /dev/null +++ b/docs/public/logo_white.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/styles.css b/docs/styles.css index f1090be0d..921dd050a 100644 --- a/docs/styles.css +++ b/docs/styles.css @@ -12,6 +12,12 @@ body, font-size: var(--vocs-fontSize_root); } +.vocs_NavLogo_logoImage { + height: 70px !important; + position: relative; + left: -20px; +} + code { font-family: "Berkeley Mono", monospace; } @@ -89,4 +95,4 @@ code { font-style: normal; font-weight: normal; font-display: swap; -} +} \ No newline at end of file diff --git a/docs/vocs.config.tsx b/docs/vocs.config.tsx index 58342f3f8..e2e96b111 100644 --- a/docs/vocs.config.tsx +++ b/docs/vocs.config.tsx @@ -49,7 +49,10 @@ export default defineConfig({ // todo: add logo ogImageUrl: "https://vocs.dev/api/og?logo=%logo&title=%title&description=%description", - logoUrl: "/logo.svg", + logoUrl: { + light: "/logo_black.svg", + dark: "/logo_white.svg", + }, head() { return ( <> @@ -334,20 +337,17 @@ export default defineConfig({ link: "/developers/evm/getting-started", }, { - text: "Fees", - link: "/developers/evm/fees", + text: "Dispatching", + link: "/developers/evm/dispatching", }, - { - text: "Message Delivery", - link: "/developers/evm/delivery", + text: "Fees", + link: "/developers/evm/fees", }, - { - text: "Supported Networks", - link: "/developers/evm/networks", + text: "Receiving", + link: "/developers/evm/receiving", }, - { text: "Contract Addresses", collapsed: false, diff --git a/docs/yarn.lock b/docs/yarn.lock new file mode 100644 index 000000000..2599c65fd --- /dev/null +++ b/docs/yarn.lock @@ -0,0 +1,4715 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@antfu/utils@^0.7.8": + version "0.7.10" + resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.7.10.tgz#ae829f170158e297a9b6a28f161a8e487d00814d" + integrity sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww== + +"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/compat-data@^7.25.9": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" + integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== + +"@babel/core@^7.20.7", "@babel/core@^7.23.9", "@babel/core@^7.24.5": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.25.9", "@babel/generator@^7.26.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" + integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== + dependencies: + "@babel/parser" "^7.26.2" + "@babel/types" "^7.26.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== + dependencies: + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-plugin-utils@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" + integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== + dependencies: + "@babel/types" "^7.26.0" + +"@babel/plugin-syntax-typescript@^7.20.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-react-jsx-self@^7.24.5": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858" + integrity sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-react-jsx-source@^7.24.1": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503" + integrity sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/runtime@^7.12.5": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@clack/core@^0.3.3": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@clack/core/-/core-0.3.4.tgz#375e82fc8fe46650b37cab2f2ea8752c6b7f0450" + integrity sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw== + dependencies: + picocolors "^1.0.0" + sisteransi "^1.0.5" + +"@clack/prompts@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@clack/prompts/-/prompts-0.7.0.tgz#6aaef48ea803d91cce12bc80811cfcb8de2e75ea" + integrity sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA== + dependencies: + "@clack/core" "^0.3.3" + picocolors "^1.0.0" + sisteransi "^1.0.5" + +"@emotion/hash@^0.9.0": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" + integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== + +"@esbuild/aix-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== + +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + +"@floating-ui/core@^1.6.0": + version "1.6.8" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" + integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== + dependencies: + "@floating-ui/utils" "^0.2.8" + +"@floating-ui/dom@^1.0.0": + version "1.6.12" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.12.tgz#6333dcb5a8ead3b2bf82f33d6bc410e95f54e556" + integrity sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w== + dependencies: + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.8" + +"@floating-ui/react-dom@^2.0.0", "@floating-ui/react-dom@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" + integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/react@^0.26.24": + version "0.26.28" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7" + integrity sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw== + dependencies: + "@floating-ui/react-dom" "^2.1.2" + "@floating-ui/utils" "^0.2.8" + tabbable "^6.0.0" + +"@floating-ui/utils@^0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" + integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== + +"@hono/node-server@^1.13.1": + version "1.13.7" + resolved "https://registry.yarnpkg.com/@hono/node-server/-/node-server-1.13.7.tgz#af95cf97bd24ddffc97e72851738cbde0a98c791" + integrity sha512-kTfUMsoloVKtRA2fLiGSd9qBddmru9KadNyhJCwgKBxTiNkaAJEwkVN9KV/rS4HtmmNRtUh6P+YpmjRMl0d9vQ== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@mdx-js/mdx@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.1.0.tgz#10235cab8ad7d356c262e8c21c68df5850a97dc3" + integrity sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdx" "^2.0.0" + collapse-white-space "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-util-scope "^1.0.0" + estree-walker "^3.0.0" + hast-util-to-jsx-runtime "^2.0.0" + markdown-extensions "^2.0.0" + recma-build-jsx "^1.0.0" + recma-jsx "^1.0.0" + recma-stringify "^1.0.0" + rehype-recma "^1.0.0" + remark-mdx "^3.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + source-map "^0.7.0" + unified "^11.0.0" + unist-util-position-from-estree "^2.0.0" + unist-util-stringify-position "^4.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +"@mdx-js/react@^3.0.1": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-3.1.0.tgz#c4522e335b3897b9a845db1dbdd2f966ae8fb0ed" + integrity sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ== + dependencies: + "@types/mdx" "^2.0.0" + +"@mdx-js/rollup@^3.0.1": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mdx-js/rollup/-/rollup-3.1.0.tgz#55df5cf4db52ac95be26d0cfa039ebf4e945e6e4" + integrity sha512-q4xOtUXpCzeouE8GaJ8StT4rDxm/U5j6lkMHL2srb2Q3Y7cobE0aXyPzXVVlbeIMBi+5R5MpbiaVE5/vJUdnHg== + dependencies: + "@mdx-js/mdx" "^3.0.0" + "@rollup/pluginutils" "^5.0.0" + source-map "^0.7.0" + vfile "^6.0.0" + +"@noble/hashes@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" + integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@radix-ui/colors@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/colors/-/colors-3.0.0.tgz#e8a591a303c44e503bd1212cacf40a09511165e0" + integrity sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg== + +"@radix-ui/primitive@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" + integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== + +"@radix-ui/react-accordion@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-accordion/-/react-accordion-1.2.1.tgz#5c942c42c24267376b26204ec6847b17d15659b3" + integrity sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collapsible" "1.1.1" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-arrow@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz#744f388182d360b86285217e43b6c63633f39e7a" + integrity sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/react-collapsible@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz#1382cc9ec48f8b473c14f3779d317f0cdf6da5e9" + integrity sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-collection@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.0.tgz#f18af78e46454a2360d103c2251773028b7724ed" + integrity sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + +"@radix-ui/react-compose-refs@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz#656432461fc8283d7b591dcf0d79152fae9ecc74" + integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== + +"@radix-ui/react-context@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" + integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== + +"@radix-ui/react-context@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.1.tgz#82074aa83a472353bb22e86f11bcbd1c61c4c71a" + integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q== + +"@radix-ui/react-dialog@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz#d9345575211d6f2d13e209e84aec9a8584b54d6c" + integrity sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.6.0" + +"@radix-ui/react-direction@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz#a7d39855f4d077adc2a1922f9c353c5977a09cdc" + integrity sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg== + +"@radix-ui/react-dismissable-layer@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz#cbdcb739c5403382bdde5f9243042ba643883396" + integrity sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-escape-keydown" "1.1.0" + +"@radix-ui/react-focus-guards@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz#8635edd346304f8b42cae86b05912b61aef27afe" + integrity sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg== + +"@radix-ui/react-focus-scope@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz#ebe2891a298e0a33ad34daab2aad8dea31caf0b2" + integrity sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + +"@radix-ui/react-icons@^1.3.0": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-icons/-/react-icons-1.3.2.tgz#09be63d178262181aeca5fb7f7bc944b10a7f441" + integrity sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g== + +"@radix-ui/react-id@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.1.0.tgz#de47339656594ad722eb87f94a6b25f9cffae0ed" + integrity sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-label@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-label/-/react-label-2.1.0.tgz#3aa2418d70bb242be37c51ff5e51a2adcbc372e3" + integrity sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/react-navigation-menu@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.1.tgz#31989e026adecfbb2f7bd1108ee6fffb830b2ec1" + integrity sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-previous" "1.1.0" + "@radix-ui/react-visually-hidden" "1.1.0" + +"@radix-ui/react-popover@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.1.2.tgz#a0cab25f69aa49ad0077d91e9e9dcd323758020c" + integrity sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.6.0" + +"@radix-ui/react-popper@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.0.tgz#a3e500193d144fe2d8f5d5e60e393d64111f2a7a" + integrity sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg== + dependencies: + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-rect" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/rect" "1.1.0" + +"@radix-ui/react-portal@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.2.tgz#51eb46dae7505074b306ebcb985bf65cc547d74e" + integrity sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-presence@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.1.tgz#98aba423dba5e0c687a782c0669dcd99de17f9b1" + integrity sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-primitive@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz#fe05715faa9203a223ccc0be15dc44b9f9822884" + integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw== + dependencies: + "@radix-ui/react-slot" "1.1.0" + +"@radix-ui/react-roving-focus@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz#b30c59daf7e714c748805bfe11c76f96caaac35e" + integrity sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-slot@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.0.tgz#7c5e48c36ef5496d97b08f1357bb26ed7c714b84" + integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + +"@radix-ui/react-tabs@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.1.1.tgz#698bd97923f6bcd629738198a73beebcc4c88b30" + integrity sha512-3GBUDmP2DvzmtYLMsHmpA1GtR46ZDZ+OreXM/N+kkQJOPIgytFWWTfDQmBQKBvaFS0Vno0FktdbVzN28KGrMdw== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-roving-focus" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-use-callback-ref@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz#bce938ca413675bc937944b0d01ef6f4a6dc5bf1" + integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw== + +"@radix-ui/react-use-controllable-state@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz#1321446857bb786917df54c0d4d084877aab04b0" + integrity sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.0" + +"@radix-ui/react-use-escape-keydown@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz#31a5b87c3b726504b74e05dac1edce7437b98754" + integrity sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.0" + +"@radix-ui/react-use-layout-effect@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz#3c2c8ce04827b26a39e442ff4888d9212268bd27" + integrity sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w== + +"@radix-ui/react-use-previous@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz#d4dd37b05520f1d996a384eb469320c2ada8377c" + integrity sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og== + +"@radix-ui/react-use-rect@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz#13b25b913bd3e3987cc9b073a1a164bb1cf47b88" + integrity sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ== + dependencies: + "@radix-ui/rect" "1.1.0" + +"@radix-ui/react-use-size@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz#b4dba7fbd3882ee09e8d2a44a3eed3a7e555246b" + integrity sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-visually-hidden@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz#ad47a8572580f7034b3807c8e6740cd41038a5a2" + integrity sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/rect@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.1.0.tgz#f817d1d3265ac5415dadc67edab30ae196696438" + integrity sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg== + +"@remix-run/router@1.21.0": + version "1.21.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.21.0.tgz#c65ae4262bdcfe415dbd4f64ec87676e4a56e2b5" + integrity sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA== + +"@rollup/pluginutils@^5.0.0": + version "5.1.3" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.3.tgz#3001bf1a03f3ad24457591f2c259c8e514e0dbdf" + integrity sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^4.0.2" + +"@rollup/rollup-android-arm-eabi@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.2.tgz#9fa3640a1f435bc3800b8d703d3f18823962b045" + integrity sha512-Tj+j7Pyzd15wAdSJswvs5CJzJNV+qqSUcr/aCD+jpQSBtXvGnV0pnrjoc8zFTe9fcKCatkpFpOO7yAzpO998HA== + +"@rollup/rollup-android-arm64@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.2.tgz#272fcb6416c60b2225192379fa2c5e63b48f19dc" + integrity sha512-xsPeJgh2ThBpUqlLgRfiVYBEf/P1nWlWvReG+aBWfNv3XEBpa6ZCmxSVnxJgLgkNz4IbxpLy64h2gCmAAQLneQ== + +"@rollup/rollup-darwin-arm64@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.2.tgz#03c63fd652bd4d522f366b1550526fd8c09c9dd8" + integrity sha512-KnXU4m9MywuZFedL35Z3PuwiTSn/yqRIhrEA9j+7OSkji39NzVkgxuxTYg5F8ryGysq4iFADaU5osSizMXhU2A== + +"@rollup/rollup-darwin-x64@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.2.tgz#268f23bc2beb3be98135ab499e4e6cdaf7c8993f" + integrity sha512-Hj77A3yTvUeCIx/Vi+4d4IbYhyTwtHj07lVzUgpUq9YpJSEiGJj4vXMKwzJ3w5zp5v3PFvpJNgc/J31smZey6g== + +"@rollup/rollup-freebsd-arm64@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.2.tgz#ee5421bd8b3b9e1e9402c0328c3b02cde7869404" + integrity sha512-RjgKf5C3xbn8gxvCm5VgKZ4nn0pRAIe90J0/fdHUsgztd3+Zesb2lm2+r6uX4prV2eUByuxJNdt647/1KPRq5g== + +"@rollup/rollup-freebsd-x64@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.2.tgz#2886b9ef04bca8e8334eaf378717eff87bf3be13" + integrity sha512-duq21FoXwQtuws+V9H6UZ+eCBc7fxSpMK1GQINKn3fAyd9DFYKPJNcUhdIKOrMFjLEJgQskoMoiuizMt+dl20g== + +"@rollup/rollup-linux-arm-gnueabihf@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.2.tgz#0c17a3c31bab9e8519038e7bf15a81e0ac35dcd3" + integrity sha512-6npqOKEPRZkLrMcvyC/32OzJ2srdPzCylJjiTJT2c0bwwSGm7nz2F9mNQ1WrAqCBZROcQn91Fno+khFhVijmFA== + +"@rollup/rollup-linux-arm-musleabihf@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.2.tgz#6893bfa6d87a4e8d7f79612803ef0a69787bef3c" + integrity sha512-V9Xg6eXtgBtHq2jnuQwM/jr2mwe2EycnopO8cbOvpzFuySCGtKlPCI3Hj9xup/pJK5Q0388qfZZy2DqV2J8ftw== + +"@rollup/rollup-linux-arm64-gnu@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.2.tgz#560ecf7f12dbb33a93fe19d9791211283fe4b0e0" + integrity sha512-uCFX9gtZJoQl2xDTpRdseYuNqyKkuMDtH6zSrBTA28yTfKyjN9hQ2B04N5ynR8ILCoSDOrG/Eg+J2TtJ1e/CSA== + +"@rollup/rollup-linux-arm64-musl@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.2.tgz#fd555c67a9a99927ef5e904ea4b3143915d1e44f" + integrity sha512-/PU9P+7Rkz8JFYDHIi+xzHabOu9qEWR07L5nWLIUsvserrxegZExKCi2jhMZRd0ATdboKylu/K5yAXbp7fYFvA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.2.tgz#c588dbaacc1809a95a49dc2e954b76044eb368f5" + integrity sha512-eCHmol/dT5odMYi/N0R0HC8V8QE40rEpkyje/ZAXJYNNoSfrObOvG/Mn+s1F/FJyB7co7UQZZf6FuWnN6a7f4g== + +"@rollup/rollup-linux-riscv64-gnu@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.2.tgz#9ebdec626efffe3a8676958ae7e5992cfdd2ec55" + integrity sha512-DEP3Njr9/ADDln3kNi76PXonLMSSMiCir0VHXxmGSHxCxDfQ70oWjHcJGfiBugzaqmYdTC7Y+8Int6qbnxPBIQ== + +"@rollup/rollup-linux-s390x-gnu@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.2.tgz#4941df3416caeecd265e718aa9e0a20efcb187bf" + integrity sha512-NHGo5i6IE/PtEPh5m0yw5OmPMpesFnzMIS/lzvN5vknnC1sXM5Z/id5VgcNPgpD+wHmIcuYYgW+Q53v+9s96lQ== + +"@rollup/rollup-linux-x64-gnu@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.2.tgz#8c2df25367b4814727d32d74d7028f901c6288b1" + integrity sha512-PaW2DY5Tan+IFvNJGHDmUrORadbe/Ceh8tQxi8cmdQVCCYsLoQo2cuaSj+AU+YRX8M4ivS2vJ9UGaxfuNN7gmg== + +"@rollup/rollup-linux-x64-musl@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.2.tgz#b93cf65c2beb3d6a7139247ba6a948014502dcfb" + integrity sha512-dOlWEMg2gI91Qx5I/HYqOD6iqlJspxLcS4Zlg3vjk1srE67z5T2Uz91yg/qA8sY0XcwQrFzWWiZhMNERylLrpQ== + +"@rollup/rollup-win32-arm64-msvc@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.2.tgz#3ccf1f8a7e74ca22ad9cf258d31077320cfac19e" + integrity sha512-euMIv/4x5Y2/ImlbGl88mwKNXDsvzbWUlT7DFky76z2keajCtcbAsN9LUdmk31hAoVmJJYSThgdA0EsPeTr1+w== + +"@rollup/rollup-win32-ia32-msvc@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.2.tgz#9294246ee7ab3021026fdb434f16d9f7d02a9c91" + integrity sha512-RsnE6LQkUHlkC10RKngtHNLxb7scFykEbEwOFDjr3CeCMG+Rr+cKqlkKc2/wJ1u4u990urRHCbjz31x84PBrSQ== + +"@rollup/rollup-win32-x64-msvc@4.27.2": + version "4.27.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.2.tgz#dd46f94fb22ea3be0b79193f721b3510fb428a1d" + integrity sha512-foJM5vv+z2KQmn7emYdDLyTbkoO5bkHZE1oth2tWbQNGW7mX32d46Hz6T0MqXdWS2vBZhaEtHqdy9WYwGfiliA== + +"@shikijs/core@1.23.1": + version "1.23.1" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.23.1.tgz#911473e672e4f2d15ca36b28b28179c0959aa7af" + integrity sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA== + dependencies: + "@shikijs/engine-javascript" "1.23.1" + "@shikijs/engine-oniguruma" "1.23.1" + "@shikijs/types" "1.23.1" + "@shikijs/vscode-textmate" "^9.3.0" + "@types/hast" "^3.0.4" + hast-util-to-html "^9.0.3" + +"@shikijs/engine-javascript@1.23.1": + version "1.23.1" + resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.23.1.tgz#0f634bea22cb14f471835b7b5f1da66bc34bd359" + integrity sha512-i/LdEwT5k3FVu07SiApRFwRcSJs5QM9+tod5vYCPig1Ywi8GR30zcujbxGQFJHwYD7A5BUqagi8o5KS+LEVgBg== + dependencies: + "@shikijs/types" "1.23.1" + "@shikijs/vscode-textmate" "^9.3.0" + oniguruma-to-es "0.4.1" + +"@shikijs/engine-oniguruma@1.23.1": + version "1.23.1" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.23.1.tgz#c6c34c9152cf90c1ee75fcdbd124253c8ad0635f" + integrity sha512-KQ+lgeJJ5m2ISbUZudLR1qHeH3MnSs2mjFg7bnencgs5jDVPeJ2NVDJ3N5ZHbcTsOIh0qIueyAJnwg7lg7kwXQ== + dependencies: + "@shikijs/types" "1.23.1" + "@shikijs/vscode-textmate" "^9.3.0" + +"@shikijs/rehype@^1.21.0": + version "1.23.1" + resolved "https://registry.yarnpkg.com/@shikijs/rehype/-/rehype-1.23.1.tgz#c05273c699c09771f234cf67d9d9244ef8ab8ad9" + integrity sha512-PH5bpMDEc4nBP62Ci3lUqkxBWRTm8cdE+eY9er5QD50jAWQxhXcc1Aeax1AlyrASrtjTwCkI22M6N9iSn5p+bQ== + dependencies: + "@shikijs/types" "1.23.1" + "@types/hast" "^3.0.4" + hast-util-to-string "^3.0.1" + shiki "1.23.1" + unified "^11.0.5" + unist-util-visit "^5.0.0" + +"@shikijs/transformers@^1.21.0": + version "1.23.1" + resolved "https://registry.yarnpkg.com/@shikijs/transformers/-/transformers-1.23.1.tgz#44fe7bef7064da9e5d79df73c6a1d48cc6d75072" + integrity sha512-yQ2Cn0M9i46p30KwbyIzLvKDk+dQNU+lj88RGO0XEj54Hn4Cof1bZoDb9xBRWxFE4R8nmK63w7oHnJwvOtt0NQ== + dependencies: + shiki "1.23.1" + +"@shikijs/twoslash@^1.21.0": + version "1.23.1" + resolved "https://registry.yarnpkg.com/@shikijs/twoslash/-/twoslash-1.23.1.tgz#8b4a9e83d3e53a591c74b5621f33c84e185e6fb5" + integrity sha512-Qj/+CGAF6TdcRjPDQn1bxyKD8ejnV7VJLqCHzob1uCbwQlJTI5z0gUVAgpqS55z4vdV1Mrx2IpCTl9glhC0l3A== + dependencies: + "@shikijs/core" "1.23.1" + "@shikijs/types" "1.23.1" + twoslash "^0.2.12" + +"@shikijs/types@1.23.1": + version "1.23.1" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.23.1.tgz#2386d49258be03e7b40fea1f28fda952739ad93d" + integrity sha512-98A5hGyEhzzAgQh2dAeHKrWW4HfCMeoFER2z16p5eJ+vmPeF6lZ/elEne6/UCU551F/WqkopqRsr1l2Yu6+A0g== + dependencies: + "@shikijs/vscode-textmate" "^9.3.0" + "@types/hast" "^3.0.4" + +"@shikijs/vscode-textmate@^9.3.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz#b2f1776e488c1d6c2b6cd129bab62f71bbc9c7ab" + integrity sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA== + +"@types/acorn@^4.0.0": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" + integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== + dependencies: + "@types/estree" "*" + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/estree-jsx@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@1.0.6", "@types/estree@^1.0.0": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@types/hast@^3.0.0", "@types/hast@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + +"@types/katex@^0.16.0": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.7.tgz#03ab680ab4fa4fbc6cb46ecf987ecad5d8019868" + integrity sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ== + +"@types/mdast@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== + dependencies: + "@types/unist" "*" + +"@types/mdx@^2.0.0": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.13.tgz#68f6877043d377092890ff5b298152b0a21671bd" + integrity sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node@*": + version "22.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.0.tgz#b7f16e5c3384788542c72dc3d561a7ceae2c0365" + integrity sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ== + dependencies: + undici-types "~6.19.8" + +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + +"@types/prop-types@*": + version "15.7.13" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" + integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== + +"@types/react@latest": + version "18.3.12" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" + integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/sax@^1.2.1": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.7.tgz#ba5fe7df9aa9c89b6dff7688a19023dd2963091d" + integrity sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A== + dependencies: + "@types/node" "*" + +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@types/unist@^2.0.0": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== + +"@typescript/vfs@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@typescript/vfs/-/vfs-1.6.0.tgz#9c90d8c43f7ac53cc77d5959e5c4c9b639f0959e" + integrity sha512-hvJUjNVeBMp77qPINuUvYXj4FyWeeMMKZkxEATEU3hqBAQ7qdTBCUFT7Sp0Zu0faeEtFf+ldXxMEDr/bk73ISg== + dependencies: + debug "^4.1.1" + +"@ungap/structured-clone@^1.0.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@vanilla-extract/babel-plugin-debug-ids@^1.0.4": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@vanilla-extract/babel-plugin-debug-ids/-/babel-plugin-debug-ids-1.1.0.tgz#783b33d55c4c4cdad0b2ddcd681ecbbe2dfc0a7b" + integrity sha512-Zy9bKjaL2P5zsrFYQJ8IjWGlFODmZrpvFmjFE0Zv8om55Pz1JtpJtL6DvlxlWUxbVaP1HKCqsmEfFOZN8fX/ZQ== + dependencies: + "@babel/core" "^7.23.9" + +"@vanilla-extract/css@^1.14.0", "@vanilla-extract/css@^1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@vanilla-extract/css/-/css-1.16.0.tgz#d88276a7beae8953024b9b8dc4ae127dd6f9ab3a" + integrity sha512-05JTbvG1E0IrSZKZ5el2EM9CmAX0XSdsNY+d4aRZxDvYf3/hwxomvFFEz2b/awjgg9yTVHW83Wq19wE4OoTEMg== + dependencies: + "@emotion/hash" "^0.9.0" + "@vanilla-extract/private" "^1.0.6" + css-what "^6.1.0" + cssesc "^3.0.0" + csstype "^3.0.7" + dedent "^1.5.3" + deep-object-diff "^1.1.9" + deepmerge "^4.2.2" + lru-cache "^10.4.3" + media-query-parser "^2.0.2" + modern-ahocorasick "^1.0.0" + picocolors "^1.0.0" + +"@vanilla-extract/dynamic@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@vanilla-extract/dynamic/-/dynamic-2.1.2.tgz#b1d1c1e0e392934c5a3bbb53f99069a7721311ac" + integrity sha512-9BGMciD8rO1hdSPIAh1ntsG4LPD3IYKhywR7VOmmz9OO4Lx1hlwkSg3E6X07ujFx7YuBfx0GDQnApG9ESHvB2A== + dependencies: + "@vanilla-extract/private" "^1.0.6" + +"@vanilla-extract/integration@^6.3.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@vanilla-extract/integration/-/integration-6.5.0.tgz#613407565b07dc60b123ca9080ea3f47cd2ce7bb" + integrity sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ== + dependencies: + "@babel/core" "^7.20.7" + "@babel/plugin-syntax-typescript" "^7.20.0" + "@vanilla-extract/babel-plugin-debug-ids" "^1.0.4" + "@vanilla-extract/css" "^1.14.0" + esbuild "npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0" + eval "0.1.8" + find-up "^5.0.0" + javascript-stringify "^2.0.1" + lodash "^4.17.21" + mlly "^1.4.2" + outdent "^0.8.0" + vite "^5.0.11" + vite-node "^1.2.0" + +"@vanilla-extract/private@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@vanilla-extract/private/-/private-1.0.6.tgz#f10bbf3189f7b827d0bd7f804a6219dd03ddbdd4" + integrity sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw== + +"@vanilla-extract/vite-plugin@^3.9.5": + version "3.9.5" + resolved "https://registry.yarnpkg.com/@vanilla-extract/vite-plugin/-/vite-plugin-3.9.5.tgz#d9986111001778f52a36d1f9710a11f3aa6d2c4d" + integrity sha512-CWI/CtrVW6i3HKccI6T7uGQkTJ8bd8Xl2UMBg3Pkr7dwWMmavXTeucV0I9KSbmXaYXSbEj+Q8c9y0xAZwtmTig== + dependencies: + "@vanilla-extract/integration" "^6.3.0" + outdent "^0.8.0" + postcss "^8.3.6" + postcss-load-config "^4.0.1" + +"@vitejs/plugin-react@4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz#d0be6594051ded8957df555ff07a991fb618b48e" + integrity sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg== + dependencies: + "@babel/core" "^7.24.5" + "@babel/plugin-transform-react-jsx-self" "^7.24.5" + "@babel/plugin-transform-react-jsx-source" "^7.24.1" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.2" + +acorn-jsx@^5.0.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.0.0, acorn@^8.14.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.0, arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +aria-hidden@^1.1.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522" + integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A== + dependencies: + tslib "^2.0.0" + +astring@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.9.0.tgz#cc73e6062a7eb03e7d19c22d8b0b3451fd9bfeef" + integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== + +autoprefixer@^10.4.20: + version "10.4.20" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" + integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== + dependencies: + browserslist "^4.23.3" + caniuse-lite "^1.0.30001646" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.0.1" + postcss-value-parser "^4.2.0" + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcp-47-match@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/bcp-47-match/-/bcp-47-match-2.0.3.tgz#603226f6e5d3914a581408be33b28a53144b09d0" + integrity sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bl@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273" + integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== + dependencies: + buffer "^6.0.3" + inherits "^2.0.4" + readable-stream "^3.4.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.23.3, browserslist@^4.24.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== + dependencies: + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" + node-releases "^2.0.18" + update-browserslist-db "^1.1.1" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001669: + version "1.0.30001680" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz#5380ede637a33b9f9f1fc6045ea99bd142f3da5e" + integrity sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@^5.0.0, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + +chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chroma-js@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.6.0.tgz#578743dd359698a75067a19fa5571dec54d0b70b" + integrity sha512-BLHvCB9s8Z1EV4ethr6xnkl/P2YRFOGqfgvuMG/MyCbZPrTA+NeiByY6XvgF0zP4/2deU2CXnWyMa3zu1LqQ3A== + +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + +cli-spinners@^2.9.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +collapse-white-space@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" + integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +compressible@~2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" + integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== + dependencies: + bytes "3.1.2" + compressible "~2.0.18" + debug "2.6.9" + negotiator "~0.6.4" + on-headers "~1.0.2" + safe-buffer "5.2.1" + vary "~1.1.2" + +confbox@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" + integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +create-vocs@^1.0.0-alpha.4: + version "1.0.0-alpha.5" + resolved "https://registry.yarnpkg.com/create-vocs/-/create-vocs-1.0.0-alpha.5.tgz#fd1c1767ac4c6a0660fcf969e748ad876c13e02b" + integrity sha512-/Nr9taHX1SxL5t72DLFPYujqD8d5PDk0T8bJ9Fb/m7ck1lP20PBxHzF5IYnHI0BeTpIuGk/MQoLfT6JKpY6xnw== + dependencies: + "@clack/prompts" "^0.7.0" + cac "^6.7.14" + detect-package-manager "^3.0.1" + fs-extra "^11.1.1" + picocolors "^1.0.0" + +cross-spawn@^7.0.0, cross-spawn@^7.0.3: + version "7.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.5.tgz#910aac880ff5243da96b728bc6521a5f6c2f2f82" + integrity sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-selector-parser@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-3.0.5.tgz#9b636ebccf7c4bcce5c1ac21ae27de9f01180ae9" + integrity sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g== + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.2, csstype@^3.0.7: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +dedent@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + +deep-object-diff@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.9.tgz#6df7ef035ad6a0caa44479c536ed7b02570f4595" + integrity sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + +detect-package-manager@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/detect-package-manager/-/detect-package-manager-3.0.2.tgz#ca34261ab84198072580e93ae86582c575428da9" + integrity sha512-8JFjJHutStYrfWwzfretQoyNGoZVW1Fsrp4JO9spa7h/fBfwgTMEIy4/LBzRDGsxwVPHU0q+T9YvwLDJoOApLQ== + dependencies: + execa "^5.1.1" + +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +direction@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/direction/-/direction-2.0.1.tgz#71800dd3c4fa102406502905d3866e65bdebb985" + integrity sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA== + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.5.41: + version "1.5.62" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.62.tgz#8289468414b0b0b3e9180ef619a763555debe612" + integrity sha512-t8c+zLmJHa9dJy96yBZRXGQYoiCEnHYgFwn1asvSPZSUdVxnB62A4RASd7k41ytG3ErFBA0TpHlKg9D9SQBmLg== + +emoji-regex-xs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz#e8af22e5d9dbd7f7f22d280af3d19d2aab5b0724" + integrity sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg== + +emoji-regex@^10.2.1: + version "10.4.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +entities@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +esast-util-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz#8d1cfb51ad534d2f159dc250e604f3478a79f1ad" + integrity sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + unist-util-position-from-estree "^2.0.0" + +esast-util-from-js@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz#5147bec34cc9da44accf52f87f239a40ac3e8225" + integrity sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw== + dependencies: + "@types/estree-jsx" "^1.0.0" + acorn "^8.0.0" + esast-util-from-estree "^2.0.0" + vfile-message "^4.0.0" + +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +"esbuild@npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0": + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" + +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +estree-util-attach-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" + integrity sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz#b6d0bced1dcc4f06f25cf0ceda2b2dcaf98168f1" + integrity sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-walker "^3.0.0" + +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + +estree-util-scope@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/estree-util-scope/-/estree-util-scope-1.0.0.tgz#9cbdfc77f5cb51e3d9ed4ad9c4adbff22d43e585" + integrity sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + +estree-util-to-js@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz#10a6fb924814e6abb62becf0d2bc4dea51d04f17" + integrity sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-value-to-estree@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-3.2.1.tgz#f8083e56f51efb4889794490730c036ba6167ee6" + integrity sha512-Vt2UOjyPbNQQgT5eJh+K5aATti0OjCIAGc9SgMdOFYbohuifsWclR74l0iZTJwePMgWYdX1hlVS+dedH9XV8kw== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-visit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz#13a9a9f40ff50ed0c022f831ddf4b58d05446feb" + integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^3.0.0" + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eval@0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" + integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== + dependencies: + "@types/node" "*" + require-like ">= 0.1.1" + +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-glob@^3.3.0, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fault@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" + integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== + dependencies: + format "^0.2.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^11.1.1, fs-extra@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-slugger@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-2.0.0.tgz#52cf2f9279a21eb6c59dd385b410f0c0adda8f1a" + integrity sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^10.3.10, glob@^10.4.1: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^13.2.2: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hast-util-classnames@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-classnames/-/hast-util-classnames-3.0.0.tgz#79d1e2c49fd0b2f4213f12048cb7a0439c351c8b" + integrity sha512-tI3JjoGDEBVorMAWK4jNRsfLMYmih1BUOG3VV36pH36njs1IEl7xkNrVTD2mD2yYHmQCa5R/fj61a8IAF4bRaQ== + dependencies: + "@types/hast" "^3.0.0" + space-separated-tokens "^2.0.0" + +hast-util-from-dom@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/hast-util-from-dom/-/hast-util-from-dom-5.0.0.tgz#d32edd25bf28f4b178b5ae318f8d05762e67bd16" + integrity sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg== + dependencies: + "@types/hast" "^3.0.0" + hastscript "^8.0.0" + web-namespaces "^2.0.0" + +hast-util-from-html-isomorphic@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz#b31baee386a899a2472326a3c5692f29f86d1d3c" + integrity sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw== + dependencies: + "@types/hast" "^3.0.0" + hast-util-from-dom "^5.0.0" + hast-util-from-html "^2.0.0" + unist-util-remove-position "^5.0.0" + +hast-util-from-html@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz#485c74785358beb80c4ba6346299311ac4c49c82" + integrity sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw== + dependencies: + "@types/hast" "^3.0.0" + devlop "^1.1.0" + hast-util-from-parse5 "^8.0.0" + parse5 "^7.0.0" + vfile "^6.0.0" + vfile-message "^4.0.0" + +hast-util-from-parse5@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" + integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^8.0.0" + property-information "^6.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" + +hast-util-has-property@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz#4e595e3cddb8ce530ea92f6fc4111a818d8e7f93" + integrity sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-heading-rank@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz#2d5c6f2807a7af5c45f74e623498dd6054d2aba8" + integrity sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-is-element@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz#6e31a6532c217e5b533848c7e52c9d9369ca0932" + integrity sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-select@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/hast-util-select/-/hast-util-select-6.0.3.tgz#d30471b26efc88ae8a126ec36cd8ee6420fe3839" + integrity sha512-OVRQlQ1XuuLP8aFVLYmC2atrfWHS5UD3shonxpnyrjcCkwtvmt/+N6kYJdcY4mkMJhxp4kj2EFIxQ9kvkkt/eQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + bcp-47-match "^2.0.0" + comma-separated-tokens "^2.0.0" + css-selector-parser "^3.0.0" + devlop "^1.0.0" + direction "^2.0.0" + hast-util-has-property "^3.0.0" + hast-util-to-string "^3.0.0" + hast-util-whitespace "^3.0.0" + nth-check "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +hast-util-to-estree@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz#f2afe5e869ddf0cf690c75f9fc699f3180b51b19" + integrity sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-attach-comments "^3.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.0" + unist-util-position "^5.0.0" + zwitch "^2.0.0" + +hast-util-to-html@^9.0.0, hast-util-to-html@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz#a9999a0ba6b4919576a9105129fead85d37f302b" + integrity sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-whitespace "^3.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz#6d11b027473e69adeaa00ca4cfb5bb68e3d282fa" + integrity sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-to-string@^3.0.0, hast-util-to-string@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz#a4f15e682849326dd211c97129c94b0c3e76527c" + integrity sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-to-text@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz#57b676931e71bf9cb852453678495b3080bfae3e" + integrity sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + hast-util-is-element "^3.0.0" + unist-util-find-after "^5.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" + integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + +hono@^3.12.12: + version "3.12.12" + resolved "https://registry.yarnpkg.com/hono/-/hono-3.12.12.tgz#1b725feb2604d1b2d50c3a8c11594cca1db462f8" + integrity sha512-5IAMJOXfpA5nT+K0MNjClchzz0IhBHs2Szl7WFAhrFOsbtQsYmNynFyJRg/a3IPsmCfxcrf8txUGiNShXpK5Rg== + +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +i@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/i/-/i-0.3.7.tgz#2a7437a923d59c14b17243dc63a549af24d85799" + integrity sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q== + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.4: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +inline-style-parser@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.4.tgz#f4af5fe72e612839fcd453d989a586566d695f22" + integrity sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-core-module@^2.13.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" + +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + +is-interactive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" + integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-unicode-supported@^1.1.0, is-unicode-supported@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" + integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +javascript-stringify@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" + integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== + +jiti@^1.21.6: + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +katex@^0.16.0: + version "0.16.11" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.11.tgz#4bc84d5584f996abece5f01c6ad11304276a33f5" + integrity sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ== + dependencies: + commander "^8.3.0" + +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lilconfig@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" + integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== + dependencies: + chalk "^5.0.0" + is-unicode-supported "^1.1.0" + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^10.2.0, lru-cache@^10.4.3: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +mark.js@^8.11.1: + version "8.11.1" + resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" + integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== + +markdown-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" + integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== + +markdown-table@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" + integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== + +mdast-util-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz#3fb1764e705bbdf0afb0d3f889e4404c3e82561f" + integrity sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-find-and-replace@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" + integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== + dependencies: + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-from-markdown@^2.0.0, mdast-util-from-markdown@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz#4850390ca7cf17413a9b9a0fbefcd1bc0eb4160a" + integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-frontmatter@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz#f5f929eb1eb36c8a7737475c7eb438261f964ee8" + integrity sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + escape-string-regexp "^5.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz#abd557630337bd30a6d5a4bd8252e1c2dc0875d5" + integrity sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" + +mdast-util-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" + integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-math@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-math/-/mdast-util-math-3.0.0.tgz#8d79dd3baf8ab8ac781f62b8853768190b9a00b0" + integrity sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + longest-streak "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.1.0" + unist-util-remove-position "^5.0.0" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz#43f0abac9adc756e2086f63822a38c8d3c3a5096" + integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-jsx@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz#76b957b3da18ebcfd0de3a9b4451dcd6fdec2320" + integrity sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz#792f9cf0361b46bee1fdf1ef36beac424a099c41" + integrity sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdxjs-esm@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" + integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0, mdast-util-to-hast@^13.2.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" + integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +mdast-util-to-markdown@^2.0.0, mdast-util-to-markdown@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz#f910ffe60897f04bb4b7e7ee434486f76288361b" + integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +media-query-parser@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/media-query-parser/-/media-query-parser-2.0.2.tgz#ff79e56cee92615a304a1c2fa4f2bd056c0a1d29" + integrity sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w== + dependencies: + "@babel/runtime" "^7.12.5" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromark-core-commonmark@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz#6a45bbb139e126b3f8b361a10711ccc7c6e15e93" + integrity sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-directive@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz#2eb61985d1995a7c1ff7621676a4f32af29409e8" + integrity sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + parse-entities "^4.0.0" + +micromark-extension-frontmatter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz#651c52ffa5d7a8eeed687c513cd869885882d67a" + integrity sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg== + dependencies: + fault "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz#6286aee9686c4462c1e3552a9d505feddceeb935" + integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz#4dab56d4e398b9853f6fe4efac4fc9361f3e0750" + integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz#86106df8b3a692b5f6a92280d3879be6be46d923" + integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz#5cadedfbb29fca7abf752447967003dc3b6583c9" + integrity sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz#bcc34d805639829990ec175c3eea12bb5b781f2c" + integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-math@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz#c42ee3b1dd5a9a03584e83dd8f08e3de510212c1" + integrity sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg== + dependencies: + "@types/katex" "^0.16.0" + devlop "^1.0.0" + katex "^0.16.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-expression@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz#1407b9ce69916cf5e03a196ad9586889df25302a" + integrity sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz#5abb83da5ddc8e473a374453e6ea56fbd66b59ad" + integrity sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdx-md@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz#1d252881ea35d74698423ab44917e1f5b197b92d" + integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-mdxjs-esm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz#de21b2b045fd2059bd00d36746081de38390d54a" + integrity sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdxjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz#b5a2e0ed449288f3f6f6c544358159557549de18" + integrity sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^3.0.0" + micromark-extension-mdx-jsx "^3.0.0" + micromark-extension-mdx-md "^2.0.0" + micromark-extension-mdxjs-esm "^3.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-mdx-expression@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz#2afaa8ba6d5f63e0cead3e4dee643cad184ca260" + integrity sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz#6cb99582e5d271e84efca8e61a807994d7161eb2" + integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== + +micromark-util-events-to-acorn@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz#4275834f5453c088bd29cd72dfbf80e3327cec07" + integrity sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-util-html-tag-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.2.tgz#ea5e3984b96b13cda7b1329763e15f3b4a4e063b" + integrity sha512-xKxhkB62vwHUuuxHe9Xqty3UaAsizV2YKq5OV344u3hFBbf8zIYrhYOWhAQb94MtMPkjTOzzjJ/hid9/dR5vFA== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== + +micromark-util-types@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.1.tgz#a3edfda3022c6c6b55bfb049ef5b75d70af50709" + integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== + +micromark@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.1.tgz#294c2f12364759e5f9e925a767ae3dfde72223ff" + integrity sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromatch@^4.0.4, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +"mime-db@>= 1.43.0 < 2": + version "1.53.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^9.0.4, minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +minisearch@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-6.3.0.tgz#985a2f1ca3c73c2d65af94f0616bfe57164b0b6b" + integrity sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ== + +mlly@^1.4.2, mlly@^1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.3.tgz#d86c0fcd8ad8e16395eb764a5f4b831590cee48c" + integrity sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A== + dependencies: + acorn "^8.14.0" + pathe "^1.1.2" + pkg-types "^1.2.1" + ufo "^1.5.4" + +modern-ahocorasick@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz#dec373444f51b5458ac05216a8ec376e126dd283" + integrity sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +oniguruma-to-es@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-0.4.1.tgz#112fbcd5fafe4f635983425a6db88f3e2de37107" + integrity sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ== + dependencies: + emoji-regex-xs "^1.0.0" + regex "^5.0.0" + regex-recursion "^4.2.1" + +ora@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-7.0.1.tgz#cdd530ecd865fe39e451a0e7697865669cb11930" + integrity sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw== + dependencies: + chalk "^5.3.0" + cli-cursor "^4.0.0" + cli-spinners "^2.9.0" + is-interactive "^2.0.0" + is-unicode-supported "^1.3.0" + log-symbols "^5.1.0" + stdin-discarder "^0.1.0" + string-width "^6.1.0" + strip-ansi "^7.1.0" + +outdent@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.8.0.tgz#2ebc3e77bf49912543f1008100ff8e7f44428eb0" + integrity sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" + integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +parse-entities@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" + integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== + dependencies: + "@types/unist" "^2.0.0" + character-entities "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + +parse5@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" + integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== + dependencies: + entities "^4.5.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathe@^1.1.1, pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + +picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-types@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.2.1.tgz#6ac4e455a5bb4b9a6185c1c79abd544c901db2e5" + integrity sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw== + dependencies: + confbox "^0.1.8" + mlly "^1.7.2" + pathe "^1.1.2" + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1, postcss-load-config@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-nested@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== + dependencies: + postcss-selector-parser "^6.1.1" + +postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.3.6, postcss@^8.4.43, postcss@^8.4.47: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prettier@^3.2.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + +prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^6.0.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +react-dom@latest: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-fast-compare@^3.1.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== + +react-helmet@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" + integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== + dependencies: + object-assign "^4.1.1" + prop-types "^15.7.2" + react-fast-compare "^3.1.1" + react-side-effect "^2.1.0" + +react-intersection-observer@^9.13.1: + version "9.13.1" + resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.13.1.tgz#6c61a75801162491c6348bad09967f2caf445584" + integrity sha512-tSzDaTy0qwNPLJHg8XZhlyHTgGW6drFKTtvjdL+p6um12rcnp8Z5XstE+QNBJ7c64n5o0Lj4ilUleA41bmDoMw== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-refresh@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== + +react-remove-scroll-bar@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" + integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz#fb03a0845d7768a4f1519a99fdb84983b793dc07" + integrity sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ== + dependencies: + react-remove-scroll-bar "^2.3.6" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-router-dom@^6.20.0: + version "6.28.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.28.0.tgz#f73ebb3490e59ac9f299377062ad1d10a9f579e6" + integrity sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg== + dependencies: + "@remix-run/router" "1.21.0" + react-router "6.28.0" + +react-router@6.28.0: + version "6.28.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.28.0.tgz#29247c86d7ba901d7e5a13aa79a96723c3e59d0d" + integrity sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg== + dependencies: + "@remix-run/router" "1.21.0" + +react-side-effect@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.2.tgz#dc6345b9e8f9906dc2eeb68700b615e0b4fe752a" + integrity sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw== + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + +react@latest: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recma-build-jsx@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz#c02f29e047e103d2fab2054954e1761b8ea253c4" + integrity sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew== + dependencies: + "@types/estree" "^1.0.0" + estree-util-build-jsx "^3.0.0" + vfile "^6.0.0" + +recma-jsx@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-jsx/-/recma-jsx-1.0.0.tgz#f7bef02e571a49d6ba3efdfda8e2efab48dbe3aa" + integrity sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q== + dependencies: + acorn-jsx "^5.0.0" + estree-util-to-js "^2.0.0" + recma-parse "^1.0.0" + recma-stringify "^1.0.0" + unified "^11.0.0" + +recma-parse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-parse/-/recma-parse-1.0.0.tgz#c351e161bb0ab47d86b92a98a9d891f9b6814b52" + integrity sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ== + dependencies: + "@types/estree" "^1.0.0" + esast-util-from-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +recma-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-stringify/-/recma-stringify-1.0.0.tgz#54632030631e0c7546136ff9ef8fde8e7b44f130" + integrity sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g== + dependencies: + "@types/estree" "^1.0.0" + estree-util-to-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regex-recursion@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-4.2.1.tgz#024ee28593b8158e568307b99bf1b7a3d5ea31e9" + integrity sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA== + dependencies: + regex-utilities "^2.3.0" + +regex-utilities@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/regex-utilities/-/regex-utilities-2.3.0.tgz#87163512a15dce2908cf079c8960d5158ff43280" + integrity sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== + +regex@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/regex/-/regex-5.0.1.tgz#f556f6a83aee652b9074371bc43bda56ce63ff8c" + integrity sha512-gIS00E8eHNWONxofNKOhtlkwBQj/K39ZJamnvMEFH3pNKc06Zz2jtFXF/4ldAaJTzQNhMJU7b5+C7tTq2ukV7Q== + +rehype-autolink-headings@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/rehype-autolink-headings/-/rehype-autolink-headings-7.1.0.tgz#531087e155d9df053944923efd47d99728f3b196" + integrity sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw== + dependencies: + "@types/hast" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-heading-rank "^3.0.0" + hast-util-is-element "^3.0.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + +rehype-class-names@^1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/rehype-class-names/-/rehype-class-names-1.0.14.tgz#30db83b300d5f7512ddf8146be6646c66efcb068" + integrity sha512-eFBt6Qxb7K77y6P82tUtN9rKpU7guWlaK4XA4RrrSFHkUTCvr2D3cgb9OR5d4t1AaGOvR59FH9nRwUnbpn9AEg== + dependencies: + "@types/hast" "^3.0.0" + hast-util-classnames "^3.0.0" + hast-util-select "^6.0.0" + unified "^10.1.2" + +rehype-katex@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-7.0.1.tgz#832e6d7af2744a228981d1b0fe89483a9e7c93a1" + integrity sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA== + dependencies: + "@types/hast" "^3.0.0" + "@types/katex" "^0.16.0" + hast-util-from-html-isomorphic "^2.0.0" + hast-util-to-text "^4.0.0" + katex "^0.16.0" + unist-util-visit-parents "^6.0.0" + vfile "^6.0.0" + +rehype-recma@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rehype-recma/-/rehype-recma-1.0.0.tgz#d68ef6344d05916bd96e25400c6261775411aa76" + integrity sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + hast-util-to-estree "^3.0.0" + +rehype-slug@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/rehype-slug/-/rehype-slug-6.0.0.tgz#1d21cf7fc8a83ef874d873c15e6adaee6344eaf1" + integrity sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A== + dependencies: + "@types/hast" "^3.0.0" + github-slugger "^2.0.0" + hast-util-heading-rank "^3.0.0" + hast-util-to-string "^3.0.0" + unist-util-visit "^5.0.0" + +rehype-stringify@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-10.0.1.tgz#2ec1ebc56c6aba07905d3b4470bdf0f684f30b75" + integrity sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-to-html "^9.0.0" + unified "^11.0.0" + +remark-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remark-directive/-/remark-directive-3.0.0.tgz#34452d951b37e6207d2e2a4f830dc33442923268" + integrity sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-directive "^3.0.0" + micromark-extension-directive "^3.0.0" + unified "^11.0.0" + +remark-frontmatter@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz#b68d61552a421ec412c76f4f66c344627dc187a2" + integrity sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-frontmatter "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + unified "^11.0.0" + +remark-gfm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-math@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-6.0.0.tgz#0acdf74675f1c195fea6efffa78582f7ed7fc0d7" + integrity sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-math "^3.0.0" + micromark-extension-math "^3.0.0" + unified "^11.0.0" + +remark-mdx-frontmatter@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-mdx-frontmatter/-/remark-mdx-frontmatter-4.0.0.tgz#1d0287103ac73c5d493d2fad19dd805e69db55ca" + integrity sha512-PZzAiDGOEfv1Ua7exQ8S5kKxkD8CDaSb4nM+1Mprs6u8dyvQifakh+kCj6NovfGXW+bTvrhjaR3srzjS2qJHKg== + dependencies: + "@types/mdast" "^4.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-util-value-to-estree "^3.0.0" + toml "^3.0.0" + unified "^11.0.0" + yaml "^2.0.0" + +remark-mdx@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.1.0.tgz#f979be729ecb35318fa48e2135c1169607a78343" + integrity sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0, remark-rehype@^11.1.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.1.tgz#f864dd2947889a11997c0a2667cd6b38f685bca7" + integrity sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== + +resolve@^1.1.7, resolve@^1.22.8: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rollup@^4.20.0: + version "4.27.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.27.2.tgz#3ee2aaa85ac8dfa4aa43ff48ccc54234dda5721e" + integrity sha512-KreA+PzWmk2yaFmZVwe6GB2uBD86nXl86OsDkt1bJS9p3vqWuEQ6HnJJ+j/mZi/q0920P99/MVRlB4L3crpF5w== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.27.2" + "@rollup/rollup-android-arm64" "4.27.2" + "@rollup/rollup-darwin-arm64" "4.27.2" + "@rollup/rollup-darwin-x64" "4.27.2" + "@rollup/rollup-freebsd-arm64" "4.27.2" + "@rollup/rollup-freebsd-x64" "4.27.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.27.2" + "@rollup/rollup-linux-arm-musleabihf" "4.27.2" + "@rollup/rollup-linux-arm64-gnu" "4.27.2" + "@rollup/rollup-linux-arm64-musl" "4.27.2" + "@rollup/rollup-linux-powerpc64le-gnu" "4.27.2" + "@rollup/rollup-linux-riscv64-gnu" "4.27.2" + "@rollup/rollup-linux-s390x-gnu" "4.27.2" + "@rollup/rollup-linux-x64-gnu" "4.27.2" + "@rollup/rollup-linux-x64-musl" "4.27.2" + "@rollup/rollup-win32-arm64-msvc" "4.27.2" + "@rollup/rollup-win32-ia32-msvc" "4.27.2" + "@rollup/rollup-win32-x64-msvc" "4.27.2" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +sax@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@^1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shiki@1.23.1, shiki@^1.21.0: + version "1.23.1" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.23.1.tgz#02f149e8f2592509e701f3a806fd4f3dd64d17e9" + integrity sha512-8kxV9TH4pXgdKGxNOkrSMydn1Xf6It8lsle0fiqxf7a1149K1WGtdOu3Zb91T5r1JpvRPxqxU3C2XdZZXQnrig== + dependencies: + "@shikijs/core" "1.23.1" + "@shikijs/engine-javascript" "1.23.1" + "@shikijs/engine-oniguruma" "1.23.1" + "@shikijs/types" "1.23.1" + "@shikijs/vscode-textmate" "^9.3.0" + "@types/hast" "^3.0.4" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap-ts@^1.7.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/sitemap-ts/-/sitemap-ts-1.8.0.tgz#b98d07100ce48cca18c2bbf3d7dc34de8ce001ad" + integrity sha512-QjsUjYRAyxYaVZuJ0E3u3sTaUzkmXf+QterxUVRas/7dfl+oLIOug2haQR6yLGc/+G2oQEHOj1CaT1b97Xon2Q== + dependencies: + "@antfu/utils" "^0.7.8" + fast-glob "^3.3.2" + sitemap "^8.0.0" + xml-formatter "^3.6.2" + +sitemap@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-8.0.0.tgz#eb6ea48f95787cd680b83683c555d6f6b5a903fd" + integrity sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map@^0.7.0: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stdin-discarder@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" + integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== + dependencies: + bl "^5.0.0" + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string-width@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-6.1.0.tgz#96488d6ed23f9ad5d82d13522af9e4c4c3fd7518" + integrity sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^10.2.1" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1, strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +style-to-object@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== + dependencies: + inline-style-parser "0.1.1" + +style-to-object@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.8.tgz#67a29bca47eaa587db18118d68f9d95955e81292" + integrity sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g== + dependencies: + inline-style-parser "0.2.4" + +sucrase@^3.35.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tabbable@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + +tailwindcss@^3.4.13: + version "3.4.15" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.15.tgz#04808bf4bf1424b105047d19e7d4bfab368044a9" + integrity sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.6.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.2" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.6" + lilconfig "^2.1.0" + micromatch "^4.0.8" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.1.1" + postcss "^8.4.47" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.2" + postcss-nested "^6.2.0" + postcss-selector-parser "^6.1.2" + resolve "^1.22.8" + sucrase "^3.35.0" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^2.0.0, tslib@^2.1.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +twoslash-protocol@0.2.12: + version "0.2.12" + resolved "https://registry.yarnpkg.com/twoslash-protocol/-/twoslash-protocol-0.2.12.tgz#4c22fc287bc0fc32eec8e7faa6092b0dc5cc4ecb" + integrity sha512-5qZLXVYfZ9ABdjqbvPc4RWMr7PrpPaaDSeaYY55vl/w1j6H6kzsWK/urAEIXlzYlyrFmyz1UbwIt+AA0ck+wbg== + +twoslash@^0.2.12, twoslash@~0.2.12: + version "0.2.12" + resolved "https://registry.yarnpkg.com/twoslash/-/twoslash-0.2.12.tgz#46b11fb23ff3d950264ca32877576e2c2b4e997e" + integrity sha512-tEHPASMqi7kqwfJbkk7hc/4EhlrKCSLcur+TcvYki3vhIfaRMXnXjaYFgXpoZRbT6GdprD4tGuVBEmTpUgLBsw== + dependencies: + "@typescript/vfs" "^1.6.0" + twoslash-protocol "0.2.12" + +typescript@latest: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + +ua-parser-js@^1.0.39: + version "1.0.39" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018" + integrity sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw== + +ufo@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" + integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== + +undici-types@~6.19.8: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +unified@^10.1.2: + version "10.1.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== + dependencies: + "@types/unist" "^2.0.0" + bail "^2.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" + +unified@^11.0.0, unified@^11.0.5: + version "11.0.5" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + +unist-util-find-after@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz#3fccc1b086b56f34c8b798e1ff90b5c54468e896" + integrity sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz#d94da4df596529d1faa3de506202f0c9a23f2200" + integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-remove-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" + integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== + dependencies: + "@types/unist" "^3.0.0" + unist-util-visit "^5.0.0" + +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.0" + +use-callback-ref@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693" + integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== + dependencies: + tslib "^2.0.0" + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-location@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.3.tgz#cb9eacd20f2b6426d19451e0eafa3d0a846225c3" + integrity sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== + dependencies: + "@types/unist" "^3.0.0" + vfile "^6.0.0" + +vfile-message@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^3.0.0" + +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^5.0.0: + version "5.3.7" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +vfile@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" + integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== + dependencies: + "@types/unist" "^3.0.0" + vfile-message "^4.0.0" + +vite-node@^1.2.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.0.tgz#2c7e61129bfecc759478fa592754fd9704aaba7f" + integrity sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw== + dependencies: + cac "^6.7.14" + debug "^4.3.4" + pathe "^1.1.1" + picocolors "^1.0.0" + vite "^5.0.0" + +vite-plugin-radar@^0.9.2: + version "0.9.6" + resolved "https://registry.yarnpkg.com/vite-plugin-radar/-/vite-plugin-radar-0.9.6.tgz#59ae700d478e495cad0c46f7b968550690dbd234" + integrity sha512-tLvUt7+iZznxYa8GmCrZBV3Q0fLQApsyg9EIJgaen8DjGky3vFIq9KoDWAoVMs9FZ5qbsSBb3YfSvoqwVV+5xw== + +vite@^5.0.0, vite@^5.0.11, vite@^5.4.8: + version "5.4.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.11.tgz#3b415cd4aed781a356c1de5a9ebafb837715f6e5" + integrity sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" + optionalDependencies: + fsevents "~2.3.3" + +vocs@latest: + version "1.0.0-alpha.62" + resolved "https://registry.yarnpkg.com/vocs/-/vocs-1.0.0-alpha.62.tgz#4090600f073f512425dfdddd2f330723d37f15d0" + integrity sha512-WidbX8M33lPlDjOvvjQyZaYGtn3hRZ3iViFuwvlmgAqCX1yGXaQs1tLdS1Cy5ki+q0BIUqXvvy8jo9rBQ+fM6w== + dependencies: + "@floating-ui/react" "^0.26.24" + "@hono/node-server" "^1.13.1" + "@mdx-js/react" "^3.0.1" + "@mdx-js/rollup" "^3.0.1" + "@noble/hashes" "^1.5.0" + "@radix-ui/colors" "^3.0.0" + "@radix-ui/react-accordion" "^1.2.1" + "@radix-ui/react-dialog" "^1.1.2" + "@radix-ui/react-icons" "^1.3.0" + "@radix-ui/react-label" "^2.1.0" + "@radix-ui/react-navigation-menu" "^1.2.1" + "@radix-ui/react-popover" "^1.1.2" + "@radix-ui/react-tabs" "^1.1.1" + "@shikijs/rehype" "^1.21.0" + "@shikijs/transformers" "^1.21.0" + "@shikijs/twoslash" "^1.21.0" + "@vanilla-extract/css" "^1.16.0" + "@vanilla-extract/dynamic" "^2.1.2" + "@vanilla-extract/vite-plugin" "^3.9.5" + "@vitejs/plugin-react" "4.3.1" + autoprefixer "^10.4.20" + cac "^6.7.14" + chroma-js "^2.6.0" + clsx "^2.1.1" + compression "^1.7.4" + create-vocs "^1.0.0-alpha.4" + cross-spawn "^7.0.3" + fs-extra "^11.2.0" + globby "^13.2.2" + hastscript "^8.0.0" + hono "^3.12.12" + mark.js "^8.11.1" + mdast-util-directive "^3.0.0" + mdast-util-from-markdown "^2.0.1" + mdast-util-gfm "^3.0.0" + mdast-util-to-hast "^13.2.0" + minimatch "^9.0.5" + minisearch "^6.3.0" + ora "^7.0.1" + p-limit "^5.0.0" + postcss "^8.4.47" + react-helmet "^6.1.0" + react-intersection-observer "^9.13.1" + react-router-dom "^6.20.0" + rehype-autolink-headings "^7.1.0" + rehype-class-names "^1.0.14" + rehype-slug "^6.0.0" + remark-directive "^3.0.0" + remark-frontmatter "^5.0.0" + remark-gfm "^4.0.0" + remark-mdx-frontmatter "^4.0.0" + remark-parse "^11.0.0" + serve-static "^1.16.2" + shiki "^1.21.0" + tailwindcss "^3.4.13" + toml "^3.0.0" + twoslash "~0.2.12" + ua-parser-js "^1.0.39" + unified "^11.0.5" + unist-util-visit "^5.0.0" + vite "^5.4.8" + +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +xml-formatter@^3.6.2: + version "3.6.3" + resolved "https://registry.yarnpkg.com/xml-formatter/-/xml-formatter-3.6.3.tgz#7f0a023744567ffc196151403c4a02fce19de0d8" + integrity sha512-++x1TlRO1FRlQ82AZ4WnoCSufaI/PT/sycn4K8nRl4gnrNC1uYY2VV/67aALZ2m0Q4Q/BLj/L69K360Itw9NNg== + dependencies: + xml-parser-xo "^4.1.2" + +xml-parser-xo@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/xml-parser-xo/-/xml-parser-xo-4.1.2.tgz#076936f2a395901bf5120a79f2006978cb3746be" + integrity sha512-Z/DRB0ZAKj5vAQg++XsfQQKfT73Vfj5n5lKIVXobBDQEva6NHWUTxOA6OohJmEcpoy8AEqBmSGkXXAnFwt5qAA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yaml@^2.0.0, yaml@^2.3.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.0.tgz#14059ad9d0b1680d0f04d3a60fe00f3a857303c3" + integrity sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" + integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== + +zwitch@^2.0.0, zwitch@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From bb4416ec30a9c7e00639f4fec514e725a31716c0 Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Mon, 18 Nov 2024 14:54:57 +0000 Subject: [PATCH 02/17] pin anyhow --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1ad4c127..36b79ab3c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -308,9 +308,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "anymap2" diff --git a/Cargo.toml b/Cargo.toml index 0653b8f8b..1f65fe1b1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -238,7 +238,7 @@ hash-db = { version = "0.16.0", default-features = false } memory-db = { version = "0.32.0", default-features = false } codec = { version = "3.1.3", package = "parity-scale-codec", default-features = false } log = { version = "0.4.21", default-features = false } -anyhow = { version = "1.0", default-features = false } +anyhow = { version = "1.0.93", default-features = false } derive_more = { version = "1.0", default-features = false } thiserror = { version = "2", default-features = false } alloy-rlp = { version = "0.3.7", default-features = false } From 22a261181e032c89f133254912c0575ba1976f64 Mon Sep 17 00:00:00 2001 From: David Salami Date: Mon, 18 Nov 2024 17:00:39 +0000 Subject: [PATCH 03/17] add notes on signed extensions --- docs/pages/developers/evm/dispatching.mdx | 2 +- docs/pages/developers/polkadot/integration.mdx | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/docs/pages/developers/evm/dispatching.mdx b/docs/pages/developers/evm/dispatching.mdx index c79612884..447f31de6 100644 --- a/docs/pages/developers/evm/dispatching.mdx +++ b/docs/pages/developers/evm/dispatching.mdx @@ -4,7 +4,7 @@ This section explores the means by which applications may leverage Hyperbridge t ## POST Request -A POST request is simply a cross-chain message to executed by some `IIsmpModule` on a destination. It's important to understand that **EOAs should not dispatch** POST requests directly, instead an application must be responsible for the dispatch. This way if the request delivery or execution fails on the destination, modules can "catch" this failure similar to the try/catch pattern and handle the failure case in the `onPostRequestTimeout` callback. +A POST request is simply a cross-chain message to be executed by some `IIsmpModule` on a destination. It's important to understand that **EOAs should not dispatch** POST requests directly, instead an application must be responsible for the dispatch. This way if the request delivery or execution fails on the destination, modules can "catch" this failure similar to the try/catch pattern and handle the failure case in the `onPostRequestTimeout` callback. A post request is created using the `DispatchPost` struct diff --git a/docs/pages/developers/polkadot/integration.mdx b/docs/pages/developers/polkadot/integration.mdx index 87d05d881..d8bee0d88 100644 --- a/docs/pages/developers/polkadot/integration.mdx +++ b/docs/pages/developers/polkadot/integration.mdx @@ -340,6 +340,24 @@ impl pallet_ismp_runtime_api::IsmpRuntimeApi::Hash> for While ISMP can be used independently, connecting to hyperbridge provides access to all its connected chains. In the next sections we'll look into how you can integrate with hyperbridge as a parachain or solochain. +### Signed Extensions + +The teseract messaging relayer expects the following signed extensions to be present in the runtime in the same order listed below + +```rust +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckNonZeroSender, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, + frame_metadata_hash_extension::CheckMetadataHash, +); +``` ## Implementation From 8f6e8e88db7167245ee354163ad53c40acec244f Mon Sep 17 00:00:00 2001 From: Curu Date: Wed, 20 Nov 2024 16:24:59 +0100 Subject: [PATCH 04/17] Adding list of relayer errors (#340) --- docs/pages/developers/network/relayer.mdx | 81 +++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/docs/pages/developers/network/relayer.mdx b/docs/pages/developers/network/relayer.mdx index 4774213b5..17cda3e94 100644 --- a/docs/pages/developers/network/relayer.mdx +++ b/docs/pages/developers/network/relayer.mdx @@ -321,3 +321,84 @@ hyperbridge is greater than or equal to the configured `minimum_withdrawal_amoun Any failed withdrawal attempts will be retried each time the withdrawal task is triggered. The manual processes described in the previous sections can be used as fallbacks when errors are encountered by their automated conterparts. + +## Relayer Errors + +List of commonly seen errors with their explanation and tips on how to fix them. + +```manpage +ERROR tesseract_messaging: Failed to submit transaction to Evm(42161): Middleware error: (code: -32000, message: insufficient funds for gas * price + value: address have 0 want 323200000000000, data: None +``` + +```manpage +ERROR tesseract_evm::provider: Debug trace frame not found! +``` + +```manpage +ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(8453): Invalid name: please ensure the contract and method you're calling exist! failed to decode empty bytes. if you're using jsonrpc this is likely due to jsonrpc returning `0x` in case contract or method don't exist +``` + +```manpage +ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error encountered while querying state_machine_update_time Middleware error: (code: -32000, message: header not found, data: None)") +``` + +```manpage +ERROR tesseract_messaging: Failed to submit transaction to Polkadot(3367): Failed to submit unsigned extrinsic +``` + +```manpage +ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(56): Middleware error: (code: -32601, message: The method debug_traceCall does not exist/is not available, data: None) +``` + +```manpage +ERROR tesseract: Error waiting for challenge period in Evm(56) - Polkadot(3367) update stream +``` + +```manpage +ERROR tesseract_messaging: Failed to submit transaction to Evm(10): Transaction reverted +``` + +```manpage +ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(100): Middleware error: (code: -32053, message: API key is not allowed to access method, data: None) +``` + +```manpage +ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error fetching latest block height on Evm(56) JsonRpcClientError(MiddlewareError(Middleware((code: -32603, message: request failed or timed out, data: None))))") +``` + +```manpage +ERROR tesseract_evm::provider: Error while querying events in range 43812202..43812204 from Evm(56): Middleware error: (code: -32603, message: request failed or timed out, data: None) +``` + +```manpage +ERROR tesseract_evm::provider: Error while querying events in range 43816145..43816147 from Evm(56): Middleware error: (code: -32603, message: internal server error, data: None) +``` + +```manpage +ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error encountered while querying state_machine_update_time Invalid name: please ensure the contract and method you're calling exist! failed to decode empty bytes. if you're using jsonrpc this is likely due to jsonrpc returning `0x` in case contract or method don't exist") +``` + +```manpage +ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(1): Middleware error: Deserialization Error: response must be either a success/error or notification object at line 1 column 237. Response: {"jsonrpc":"2.0","id":31327,"result":null,"error":{"code":-32000,"message":"tracing failed: insufficient funds for gas * price + value: address
have 411893340457544628 want 525945389500000000"}} +``` + +```manpage +ERROR tesseract_messaging: Error accummulating some fees, receipts have been stored in the db, you can try again manually +``` + +```manpage +ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error fetching latest block height on Evm(56) JsonRpcClientError(MiddlewareError(Middleware(Deserialization Error: expected value at line 1 column 1. Response: \r\n504 Gateway Time-out\r\n\r\n

504 Gateway Time-out

\r\n\r\n\r\n)))") +``` + +```manpage +ERROR tesseract_evm::provider: Error while querying events in range 43876757..43876796 from Evm(56): Middleware error: Deserialization Error: expected value at line 1 column 1. Response: +``` + +```manpage +ERROR tesseract_messaging: Error while handling EVM-56 on Polkadot(3367): Middleware error: (code: -32000, message: missing trie node baf71a6410ba54b32b02056415efe6b22060c20aff9c399d9b6308d0a88c3d09 (path ) state 0xbaf71a6410ba54b32b02056415efe6b22060c20aff9c399d9b6308d0a88c3d09 is not available, data: None) +``` + +```manpage +ERROR tesseract::cli: Disconnected from telemetry with: Text( +``` + From a87770127ab849000baaf088600f7ba33466d593 Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Thu, 21 Nov 2024 09:50:36 +0000 Subject: [PATCH 05/17] slim down grandpa prover --- Cargo.lock | 1 + modules/consensus/grandpa/prover/Cargo.toml | 1 + modules/consensus/grandpa/prover/src/lib.rs | 84 ++++++------------- modules/consensus/grandpa/verifier/src/lib.rs | 1 - .../consensus/grandpa/verifier/src/tests.rs | 39 +++++---- modules/ismp/pallets/pallet/src/lib.rs | 14 ++-- parachain/runtimes/gargantua/src/ismp.rs | 30 +++---- parachain/runtimes/nexus/src/ismp.rs | 15 ++-- parachain/runtimes/nexus/src/lib.rs | 17 ++-- 9 files changed, 84 insertions(+), 118 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 36b79ab3c..593b9df1d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6598,6 +6598,7 @@ dependencies = [ "finality-grandpa", "grandpa-verifier-primitives", "hex", + "hex-literal 0.4.1", "ismp", "jsonrpsee 0.23.2", "jsonrpsee-ws-client 0.23.2", diff --git a/modules/consensus/grandpa/prover/Cargo.toml b/modules/consensus/grandpa/prover/Cargo.toml index 6593355de..317708b8c 100644 --- a/modules/consensus/grandpa/prover/Cargo.toml +++ b/modules/consensus/grandpa/prover/Cargo.toml @@ -9,6 +9,7 @@ publish = false [dependencies] hex = "0.4.3" +hex-literal = "0.4.1" anyhow.workspace = true serde = { workspace = true, default-features = true} subxt = { workspace = true, default-features = true } diff --git a/modules/consensus/grandpa/prover/src/lib.rs b/modules/consensus/grandpa/prover/src/lib.rs index 58b44249b..058ba30b7 100644 --- a/modules/consensus/grandpa/prover/src/lib.rs +++ b/modules/consensus/grandpa/prover/src/lib.rs @@ -15,7 +15,7 @@ #![allow(clippy::all)] #![deny(missing_docs)] -//! GRANDPA prover utilities +//! GRANDPA consensus prover utilities use anyhow::anyhow; use codec::{Decode, Encode}; @@ -44,17 +44,17 @@ pub struct GrandpaProver { pub para_ids: Vec, /// State machine identifier for the chain pub state_machine: StateMachine, - /// Storage for babe epoch start - pub babe_epoch_start: Vec, - /// Storage key for current set id - pub current_set_id: Vec, } -// We redefine these here because we want the header to be bounded by subxt::config::Header in the -// prover -/// Commit +/// We redefine these here because we want the header to be bounded by subxt::config::Header in the +/// prover pub type Commit = finality_grandpa::Commit; +/// This is the storage key for the grandpa.currentSetId storage item in the runtime. Ideally the +/// grandpa pallet is always referred to as "grandpa" in the construct runtime macro. +pub const GRANDPA_CURRENT_SET_ID: [u8; 32] = + hex_literal::hex!("5f9cc45b7a00c5899361e1c6099678dc8a2d09463effcc78a22d75b9cb87dffc"); + /// Justification #[cfg_attr(test, derive(Debug))] #[derive(Clone, Encode, Decode)] @@ -67,6 +67,19 @@ pub struct GrandpaJustification { pub votes_ancestries: Vec, } +/// Options for initializing the GRANDPA consensus prover. +#[derive(Clone, Serialize, Deserialize)] +pub struct ProverOptions<'a> { + /// The ws url to the node + pub ws_url: &'a str, + /// Parachain Ids if this GRANDPA consensus hosts parachains + pub para_ids: Vec, + /// State machine identifier for the chain + pub state_machine: StateMachine, + /// Max rpc payload for websocket connections + pub max_rpc_payload_size: u32, +} + /// An encoded justification proving that the given header has been finalized #[derive(Clone, Serialize, Deserialize)] pub struct JustificationNotification(pub sp_core::Bytes); @@ -79,18 +92,13 @@ where sp_core::H256: From, T::Header: codec::Decode, { - /// Initializes the parachain and relay chain clients given the ws urls. - pub async fn new( - ws_url: &str, - para_ids: Vec, - state_machine: StateMachine, - babe_epoch_start: Vec, - current_set_id: Vec, - ) -> Result { - let max_rpc_payload_size = 15 * 1024 * 1024; + /// Initializes the GRANDPA prover given the parameters. Internally connects over WS to the + /// provided RPC + pub async fn new(options: ProverOptions<'_>) -> Result { + let ProverOptions { max_rpc_payload_size, ws_url, state_machine, para_ids } = options; let client = subxt_utils::client::ws_client(ws_url, max_rpc_payload_size).await?; - Ok(Self { client, para_ids, state_machine, babe_epoch_start, current_set_id }) + Ok(Self { client, para_ids, state_machine }) } /// Construct the initial consensus state. @@ -112,7 +120,7 @@ where .client .storage() .at(hash) - .fetch_raw(&self.current_set_id[..]) + .fetch_raw(&GRANDPA_CURRENT_SET_ID[..]) .await .ok() .flatten() @@ -220,7 +228,6 @@ where /// Returns the proof for parachain headers finalized by the provided finality proof pub async fn query_finalized_parachain_headers_with_proof( &self, - _previous_finalized_height: u32, latest_finalized_height: u32, finality_proof: FinalityProof, ) -> Result, anyhow::Error> @@ -265,41 +272,4 @@ where parachain_headers: parachain_headers_with_proof, }) } - - /// Queries the block at which the epoch for the given block belongs to ends. - pub async fn session_start_and_end_for_block( - &self, - block: u32, - ) -> Result<(u32, u32), anyhow::Error> { - let block_hash = self - .client - .rpc() - .block_hash(Some(block.into())) - .await? - .ok_or(anyhow!("Failed to fetch block hash"))?; - let bytes = self - .client - .storage() - .at(block_hash) - .fetch_raw(&self.babe_epoch_start[..]) - .await? - .ok_or_else(|| anyhow!("Failed to fetch epoch information"))?; - - let (previous_epoch_start, current_epoch_start): (u32, u32) = - codec::Decode::decode(&mut &*bytes)?; - Ok(( - current_epoch_start, - current_epoch_start + (current_epoch_start - previous_epoch_start), - )) - } - - /// Returns the session length in blocks - pub async fn session_length(&self) -> Result { - let metadata = self.client.rpc().metadata().await?; - let metadata = metadata - .pallet_by_name_err("Babe")? - .constant_by_name("EpochDuration") - .ok_or(anyhow!("Failed to fetch constant"))?; - Ok(Decode::decode(&mut metadata.value())?) - } } diff --git a/modules/consensus/grandpa/verifier/src/lib.rs b/modules/consensus/grandpa/verifier/src/lib.rs index c471f776e..ddb966507 100644 --- a/modules/consensus/grandpa/verifier/src/lib.rs +++ b/modules/consensus/grandpa/verifier/src/lib.rs @@ -19,7 +19,6 @@ #![allow(clippy::all)] #![deny(missing_docs)] -#[cfg(test)] mod tests; extern crate alloc; diff --git a/modules/consensus/grandpa/verifier/src/tests.rs b/modules/consensus/grandpa/verifier/src/tests.rs index b560ffb44..dcebb4745 100644 --- a/modules/consensus/grandpa/verifier/src/tests.rs +++ b/modules/consensus/grandpa/verifier/src/tests.rs @@ -1,7 +1,10 @@ +#![cfg(test)] + use crate::verify_parachain_headers_with_grandpa_finality_proof; +use anyhow::anyhow; use codec::{Decode, Encode}; use futures::StreamExt; -use grandpa_prover::GrandpaProver; +use grandpa_prover::{GrandpaProver, ProverOptions}; use grandpa_verifier_primitives::{ justification::GrandpaJustification, ParachainHeadersWithFinalityProof, }; @@ -10,7 +13,7 @@ use polkadot_core_primitives::Header; use serde::{Deserialize, Serialize}; use subxt::{ config::substrate::{BlakeTwo256, SubstrateHeader}, - rpc_params, + rpc_params, OnlineClient, }; pub type Justification = GrandpaJustification
; @@ -18,6 +21,18 @@ pub type Justification = GrandpaJustification
; #[derive(Clone, Serialize, Deserialize)] pub struct JustificationNotification(sp_core::Bytes); +/// Returns the session length in blocks +pub async fn session_length( + client: &OnlineClient, +) -> Result { + let metadata = client.rpc().metadata().await?; + let metadata = metadata + .pallet_by_name_err("Babe")? + .constant_by_name("EpochDuration") + .ok_or(anyhow!("Failed to fetch constant"))?; + Ok(Decode::decode(&mut metadata.value())?) +} + #[ignore] #[tokio::test] async fn follow_grandpa_justifications() { @@ -29,29 +44,22 @@ async fn follow_grandpa_justifications() { let relay_ws_url = std::env::var("RELAY_HOST") .unwrap_or_else(|_| "wss://hyperbridge-paseo-relay.blockops.network:443".to_string()); - // let relay_ws_url = format!("ws://{relay}:9944"); - let para_ids = vec![2000]; - let babe_epoch_start_key = - hex::decode("1cb6f36e027abb2091cfb5110ab5087fe90e2fbf2d792cb324bffa9427fe1f0e").unwrap(); - let current_set_id_key = - hex::decode("5f9cc45b7a00c5899361e1c6099678dc8a2d09463effcc78a22d75b9cb87dffc").unwrap(); println!("Connecting to relay chain {relay_ws_url}"); - let prover = GrandpaProver::::new( - &relay_ws_url, + let prover = GrandpaProver::::new(ProverOptions { + ws_url: &relay_ws_url, para_ids, - StateMachine::Polkadot(0), - babe_epoch_start_key, - current_set_id_key, - ) + state_machine: StateMachine::Polkadot(0), + max_rpc_payload_size: u32::MAX, + }) .await .unwrap(); println!("Connected to relay chain"); println!("Waiting for grandpa proofs to become available"); - let session_length = prover.session_length().await.unwrap(); + let session_length = session_length(&prover.client).await.unwrap(); prover .client .blocks() @@ -104,7 +112,6 @@ async fn follow_grandpa_justifications() { let proof = prover .query_finalized_parachain_headers_with_proof::>( - consensus_state.latest_height, justification.commit.target_number, finality_proof.clone(), ) diff --git a/modules/ismp/pallets/pallet/src/lib.rs b/modules/ismp/pallets/pallet/src/lib.rs index 0de9048b2..7413245c8 100644 --- a/modules/ismp/pallets/pallet/src/lib.rs +++ b/modules/ismp/pallets/pallet/src/lib.rs @@ -536,9 +536,8 @@ pub mod pallet { let metadata = match message.commitment { MessageCommitment::Request(commitment) => RequestCommitments::::get(commitment), - MessageCommitment::Response(commitment) => { - ResponseCommitments::::get(commitment) - }, + MessageCommitment::Response(commitment) => + ResponseCommitments::::get(commitment), }; let Some(mut metadata) = metadata else { @@ -688,11 +687,10 @@ pub mod pallet { // check that requests will be successfully dispatched // so we can not be spammed with failing txs .map(|result| match result { - MessageResult::Request(results) - | MessageResult::Response(results) - | MessageResult::Timeout(results) => { - results.into_iter().map(|result| result.map(|_| ())).collect::>() - }, + MessageResult::Request(results) | + MessageResult::Response(results) | + MessageResult::Timeout(results) => + results.into_iter().map(|result| result.map(|_| ())).collect::>(), MessageResult::ConsensusMessage(_) | MessageResult::FrozenClient(_) => { vec![Ok(())] }, diff --git a/parachain/runtimes/gargantua/src/ismp.rs b/parachain/runtimes/gargantua/src/ismp.rs index 2bf189a70..589cb19d2 100644 --- a/parachain/runtimes/gargantua/src/ismp.rs +++ b/parachain/runtimes/gargantua/src/ismp.rs @@ -226,12 +226,10 @@ impl IsmpModule for ProxyModule { let token_governor = ModuleId::Pallet(PalletId(pallet_token_governor::PALLET_ID)); match pallet_id { - pallet_ismp_demo::PALLET_ID => { - pallet_ismp_demo::IsmpModuleCallback::::default().on_accept(request) - }, - id if id == xcm_gateway => { - pallet_xcm_gateway::Module::::default().on_accept(request) - }, + pallet_ismp_demo::PALLET_ID => + pallet_ismp_demo::IsmpModuleCallback::::default().on_accept(request), + id if id == xcm_gateway => + pallet_xcm_gateway::Module::::default().on_accept(request), id if id == token_governor => TokenGovernor::default().on_accept(request), _ => Err(anyhow!("Destination module not found")), } @@ -254,9 +252,8 @@ impl IsmpModule for ProxyModule { let pallet_id = ModuleId::from_bytes(dest).map_err(|err| Error::Custom(err.to_string()))?; match pallet_id { - pallet_ismp_demo::PALLET_ID => { - pallet_ismp_demo::IsmpModuleCallback::::default().on_response(response) - }, + pallet_ismp_demo::PALLET_ID => + pallet_ismp_demo::IsmpModuleCallback::::default().on_response(response), _ => Err(anyhow!("Destination module not found")), } } @@ -269,9 +266,8 @@ impl IsmpModule for ProxyModule { } (&post.from, post.source.clone(), post.dest.clone()) }, - Timeout::Request(Request::Get(get)) => { - (&get.from, get.source.clone(), get.dest.clone()) - }, + Timeout::Request(Request::Get(get)) => + (&get.from, get.source.clone(), get.dest.clone()), Timeout::Response(res) => (&res.source_module(), res.source_chain(), res.dest_chain()), }; @@ -282,12 +278,10 @@ impl IsmpModule for ProxyModule { let pallet_id = ModuleId::from_bytes(from).map_err(|err| Error::Custom(err.to_string()))?; let xcm_gateway = ModuleId::Evm(XcmGateway::token_gateway_address(&dest)); match pallet_id { - pallet_ismp_demo::PALLET_ID => { - pallet_ismp_demo::IsmpModuleCallback::::default().on_timeout(timeout) - }, - id if id == xcm_gateway => { - pallet_xcm_gateway::Module::::default().on_timeout(timeout) - }, + pallet_ismp_demo::PALLET_ID => + pallet_ismp_demo::IsmpModuleCallback::::default().on_timeout(timeout), + id if id == xcm_gateway => + pallet_xcm_gateway::Module::::default().on_timeout(timeout), // instead of returning an error, do nothing. The timeout is for a connected chain. _ => Ok(()), } diff --git a/parachain/runtimes/nexus/src/ismp.rs b/parachain/runtimes/nexus/src/ismp.rs index c5c590b00..88f0389a8 100644 --- a/parachain/runtimes/nexus/src/ismp.rs +++ b/parachain/runtimes/nexus/src/ismp.rs @@ -220,9 +220,8 @@ impl IsmpModule for ProxyModule { let token_governor = ModuleId::Pallet(PalletId(pallet_token_governor::PALLET_ID)); match pallet_id { - id if id == xcm_gateway => { - pallet_xcm_gateway::Module::::default().on_accept(request) - }, + id if id == xcm_gateway => + pallet_xcm_gateway::Module::::default().on_accept(request), id if id == token_governor => TokenGovernor::default().on_accept(request), _ => Err(anyhow!("Destination module not found")), } @@ -249,9 +248,8 @@ impl IsmpModule for ProxyModule { (&post.from, &post.source, &post.dest) }, Timeout::Request(Request::Get(get)) => (&get.from, &get.source, &get.dest), - Timeout::Response(res) => { - (&res.source_module(), &res.source_chain(), &res.dest_chain()) - }, + Timeout::Response(res) => + (&res.source_module(), &res.source_chain(), &res.dest_chain()), }; if *source != HostStateMachine::get() { @@ -261,9 +259,8 @@ impl IsmpModule for ProxyModule { let pallet_id = ModuleId::from_bytes(from).map_err(|err| Error::Custom(err.to_string()))?; let xcm_gateway = ModuleId::Evm(XcmGateway::token_gateway_address(dest)); match pallet_id { - id if id == xcm_gateway => { - pallet_xcm_gateway::Module::::default().on_timeout(timeout) - }, + id if id == xcm_gateway => + pallet_xcm_gateway::Module::::default().on_timeout(timeout), // instead of returning an error, do nothing. The timeout is for a connected chain. _ => Ok(()), } diff --git a/parachain/runtimes/nexus/src/lib.rs b/parachain/runtimes/nexus/src/lib.rs index bfae11b68..fb871dc3a 100644 --- a/parachain/runtimes/nexus/src/lib.rs +++ b/parachain/runtimes/nexus/src/lib.rs @@ -748,20 +748,19 @@ impl InstanceFilter for ProxyType { fn filter(&self, c: &RuntimeCall) -> bool { match self { ProxyType::Any => true, - ProxyType::NonTransfer => { - !matches!(c, RuntimeCall::Balances { .. } | RuntimeCall::Assets { .. }) - }, + ProxyType::NonTransfer => + !matches!(c, RuntimeCall::Balances { .. } | RuntimeCall::Assets { .. }), ProxyType::CancelProxy => matches!( c, - RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) - | RuntimeCall::Utility { .. } - | RuntimeCall::Multisig { .. } + RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) | + RuntimeCall::Utility { .. } | + RuntimeCall::Multisig { .. } ), ProxyType::Collator => matches!( c, - RuntimeCall::CollatorSelection { .. } - | RuntimeCall::Utility { .. } - | RuntimeCall::Multisig { .. } + RuntimeCall::CollatorSelection { .. } | + RuntimeCall::Utility { .. } | + RuntimeCall::Multisig { .. } ), } } From acbe906fa5a45da0b47f284aeca14cfb9f8ee73c Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Thu, 21 Nov 2024 15:33:52 +0100 Subject: [PATCH 06/17] improve polkadot-sdk documentation --- docs/pages/developers/evm/dispatching.mdx | 27 +- docs/pages/developers/evm/receiving.mdx | 69 ++-- docs/pages/developers/explore/index.mdx | 4 +- docs/pages/developers/network/node.mdx | 25 +- docs/pages/developers/network/relayer.mdx | 73 ++-- .../developers/polkadot/getting-started.mdx | 83 +++++ .../polkadot/ismp-parachain-inherent.mdx | 59 ++++ .../polkadot/ismp-parachain-runtime-api.mdx | 25 ++ .../polkadot/{rpc.mdx => pallet-ismp-rpc.mdx} | 2 +- .../polkadot/pallet-ismp-runtime-api.mdx | 65 ++++ .../{integration.mdx => pallet-ismp.mdx} | 312 ++++++------------ docs/pages/developers/polkadot/parachains.mdx | 150 ++------- docs/pages/developers/polkadot/solochains.mdx | 209 +++++++++--- docs/pages/protocol/consensus/casper-ffg.mdx | 2 +- .../protocol/consensus/sync-committee.mdx | 2 +- docs/public/add_parachain.png | Bin 0 -> 130774 bytes docs/public/add_state_machine.png | Bin 0 -> 145108 bytes docs/public/grnp_init.png | Bin 0 -> 170463 bytes docs/vocs.config.tsx | 55 ++- 19 files changed, 665 insertions(+), 497 deletions(-) create mode 100644 docs/pages/developers/polkadot/getting-started.mdx create mode 100644 docs/pages/developers/polkadot/ismp-parachain-inherent.mdx create mode 100644 docs/pages/developers/polkadot/ismp-parachain-runtime-api.mdx rename docs/pages/developers/polkadot/{rpc.mdx => pallet-ismp-rpc.mdx} (99%) create mode 100644 docs/pages/developers/polkadot/pallet-ismp-runtime-api.mdx rename docs/pages/developers/polkadot/{integration.mdx => pallet-ismp.mdx} (53%) create mode 100644 docs/public/add_parachain.png create mode 100644 docs/public/add_state_machine.png create mode 100644 docs/public/grnp_init.png diff --git a/docs/pages/developers/evm/dispatching.mdx b/docs/pages/developers/evm/dispatching.mdx index 447f31de6..8c3960fa6 100644 --- a/docs/pages/developers/evm/dispatching.mdx +++ b/docs/pages/developers/evm/dispatching.mdx @@ -9,7 +9,7 @@ A POST request is simply a cross-chain message to be executed by some `IIsmpModu A post request is created using the `DispatchPost` struct ```solidity showLineNumbers -// An object for dispatching post requests to the IsmpDispatcher +// An object for dispatching post requests struct DispatchPost { // Use the StateMachine library to create this bytes dest; @@ -19,14 +19,15 @@ struct DispatchPost { bytes body; // timeout for this request in seconds uint64 timeout; - // The amount put up to be paid to the relayer, this is in $DAI and charged to tx.origin + // The amount put up to be paid to the relayer, + // this is in DAI and charged to msg.sender uint256 fee; // who pays for this request? address payer; } ``` -### Dispatch Parameters: +### Dispatch Parameters - `dest`: Destination chain, for this you'll use the `StateMachine` library eg `StateMachine.evm(1)` for Ethereum Mainnet. @@ -38,7 +39,8 @@ struct DispatchPost { - `body`: Serialized byte representation of the message (to be decoded by the receiving contract).
-- `timeout`: Relative time in seconds for message validity. Messages exceeding this timeout cannot be processed on the destination and require user action (timeout message) to revert changes. +- `timeout`: Time in seconds for message validity eg 3600 for a timeout of 1 hour, or 0 for no timeout. ie Messages will never expire. If the timeout is set to a non-zero value, messages that have exceeded this timeout will be rejected on the destination and require user action + (timeout message) to revert changes.
- `fee`: Optional relayer fees, this can also be set to zero if the application developers prefer to self-relay.
@@ -71,7 +73,7 @@ Dispatching a POST response, going by it's name is, well, a response to a previo A post response dispatch has the following fields: ```solidity showLineNumbers -// An object for dispatching post responses to the IsmpDispatcher +// An object for dispatching post responses struct DispatchPostResponse { // The request that initiated this response PostRequest request; @@ -79,14 +81,15 @@ struct DispatchPostResponse { bytes response; // timeout for this response in seconds uint64 timeout; - // the amount put up to be paid to the relayer, this is in $DAI and charged to tx.origin + // The amount put up to be paid to the relayer, + // this is in DAI and charged to msg.sender uint256 fee; // who pays for this request? address payer; } ``` -### Dispatch Parameters: +### Dispatch Parameters - `request`: The request object that was previously received. @@ -96,7 +99,7 @@ struct DispatchPostResponse {
-- `timeout`: Relative time in seconds for message validity. Messages exceeding this timeout cannot be processed on the destination and require user action +- `timeout`: Time in seconds for message validity eg 3600 for a timeout of 1 hour, or 0 for no timeout. ie Messages will never expire. If the timeout is set to a non-zero value, messages that have exceeded this timeout will be rejected on the destination and require user action (timeout message) to revert changes.
@@ -136,7 +139,7 @@ When dispatching get requests, you specify the storage keys you need to read and the block height at which you need to read these storage entries. ```solidity -// An object for dispatching get requests to the IsmpDispatcher +// An object for dispatching get requests struct DispatchGet { // bytes representation of the destination state machine bytes dest; @@ -153,7 +156,7 @@ struct DispatchGet { } ``` -### Dispatch Parameters: +### Dispatch Parameters - `dest`: The chain whose database should be read (e.g., `StateMachine.evm(1)` for Ethereum Mainnet). @@ -167,8 +170,8 @@ struct DispatchGet {
-- `timeout`: Relative time in seconds for message validity. Responses exceeding this timeout cannot be processed on the source and require user action (timeout - message) to revert changes. +- `timeout`: Time in seconds for message validity eg 3600 for a timeout of 1 hour, or 0 for no timeout. ie Messages will never expire. If the timeout is set to a non-zero value, messages that have exceeded this timeout will be rejected on the destination and require user action + (timeout message) to revert changes.
diff --git a/docs/pages/developers/evm/receiving.mdx b/docs/pages/developers/evm/receiving.mdx index 3dea5071f..83379d8d7 100644 --- a/docs/pages/developers/evm/receiving.mdx +++ b/docs/pages/developers/evm/receiving.mdx @@ -4,10 +4,9 @@ To receive ISMP messages a contract must implement the [`IIsmpModule`](https://g The required methods for the [`IIsmpModule`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/IIsmpModule.sol#L42) is described in detail below: - ## `onAccept` -This is the callback method for new POST requests that have been verified by Hyperbridge. After the `IHandler` verifies the neccessary proofs of this request, they are passed on to the host, which in turn calls the `onAccept` method for the intended modules. The arguments provided `IncomingPostRequest` holds both the request object itself and the account that initally called the Handler contract, this may be either a 3rd party relayer or a user who is self-relaying. +This is the callback method for new POST requests that have been verified by Hyperbridge. After the `IHandler` verifies the necessary proofs of this request, they are passed on to the host, which in turn calls the `onAccept` method for the intended modules. The arguments provided `IncomingPostRequest` holds both the request object itself and the account that initally called the Handler contract, this may be either a 3rd party relayer or a user who is self-relaying. `IIsmpModule`'s should ensure that is method is only callable by the `host` or risk critical vulnerabilies from unauthorized calls to this method by malicious actors. A modifier `onlyHost` is provided as part of the `BaseIsmpModule` for this. @@ -15,11 +14,11 @@ This is the callback method for new POST requests that have been verified by Hyp In the event that some initially dispatched request was unable to be delivered. Whether as a result of insufficient fees provided to the relayers, Or a revert during request execution on the destination chain. Then Hyperbridge allows this request to gracefully timeout, and this timeout can be reported back to the sending module on the source chain. -This callback is provided as a way to execute some logic in the event that some request times out. This can be seen as a *catch* block in a try/catch for cross-chain messages. Typically you'll want to revert any state changes that were made prior to dispatching the request. +This callback is provided as a way to execute some logic in the event that some request times out. This can be seen as a _catch_ block in a try/catch for cross-chain messages. Typically you'll want to revert any state changes that were made prior to dispatching the request. ## `onPostResponse` -This is the callback method for new POST responses that have been verified by Hyperbridge. After the `IHandler` verifies the neccessary proofs of this response, they are passed on to the host, which in turn calls the `onPostResponse` method for the intended modules. The arguments provided `IncomingPostResponse` holds both the resopnse object itself and the account that initally called the Handler contract, this may be either a 3rd party relayer or a user who is self-relaying. +This is the callback method for new POST responses that have been verified by Hyperbridge. After the `IHandler` verifies the necessary proofs of this response, they are passed on to the host, which in turn calls the `onPostResponse` method for the intended modules. The arguments provided `IncomingPostResponse` holds both the resopnse object itself and the account that initally called the Handler contract, this may be either a 3rd party relayer or a user who is self-relaying. `IIsmpModule`'s should ensure that is method is only callable by the `host` or risk critical vulnerabilies from unauthorized calls to this method by malicious actors. A modifier `onlyHost` is provided as part of the `BaseIsmpModule` for this. @@ -27,11 +26,11 @@ This is the callback method for new POST responses that have been verified by Hy In the event that some initially dispatched response was unable to be delivered. Whether as a result of insufficient fees provided to the relayers, Or a revert during response execution on the destination chain. Then Hyperbridge allows this response to gracefully timeout, and this timeout can be reported back to the sending module on the source chain. -This callback is provided as a way to execute some logic in the event that some response times out. This can be seen as a *catch* block in a try/catch for cross-chain messages. Typically you'll want to revert any state changes that were made prior to dispatching the response. +This callback is provided as a way to execute some logic in the event that some response times out. This can be seen as a _catch_ block in a try/catch for cross-chain messages. Typically you'll want to revert any state changes that were made prior to dispatching the response. ## `onGetResponse` -This is the callback method for new GET responses that have been verified by Hyperbridge. After the `IHandler` verifies the neccessary proofs of this response, they are passed on to the host, which in turn calls the `onGetResponse` method for the intended modules. The arguments provided `IncomingGetResponse` holds both the resopnse object itself and the account that initally called the Handler contract, this may be either a 3rd party relayer or a user who is self-relaying. +This is the callback method for new GET responses that have been verified by Hyperbridge. After the `IHandler` verifies the necessary proofs of this response, they are passed on to the host, which in turn calls the `onGetResponse` method for the intended modules. The arguments provided `IncomingGetResponse` holds both the resopnse object itself and the account that initally called the Handler contract, this may be either a 3rd party relayer or a user who is self-relaying. `IIsmpModule`'s should ensure that is method is only callable by the `host` or risk critical vulnerabilies from unauthorized calls to this method by malicious actors. A modifier `onlyHost` is provided as part of the `BaseIsmpModule` for this. @@ -39,8 +38,7 @@ This is the callback method for new GET responses that have been verified by Hyp In the event that some GET request is unable to be processed. Likely as a result of insufficient fees provided. Then Hyperbridge allows this request to gracefully timeout, and this timeout can be reported back to the sending module on the source chain. -This callback is provided as a way to execute some logic in the event that some request times out. This can be seen as a *catch* block in a try/catch for cross-chain messages. Typically you'll want to revert any state changes that were made prior to dispatching the request. - +This callback is provided as a way to execute some logic in the event that some request times out. This can be seen as a _catch_ block in a try/catch for cross-chain messages. Typically you'll want to revert any state changes that were made prior to dispatching the request. ## Example `IIsmpModule` @@ -90,43 +88,66 @@ contract Example is BaseIsmpModule { return IDispatcher(host).dispatch{value: msg.value}(post); } - function onAccept(IncomingPostRequest memory incoming) external override onlyHost { + function onAccept(IncomingPostRequest memory incoming) + external + override + onlyHost + { // decode request body - // Check that decoded value can be executed successfully - // Make state changes + // make any necessary state changes emit PostReceived(); } - function onPostRequestTimeout(PostRequest memory request) external override onlyHost { - // revert any state changes made when post request was dispatched + function onPostRequestTimeout(PostRequest memory request) + external + override + onlyHost + { + // revert any state changes made + // when post request was dispatched emit PostTimeoutReceived(); } - function onPostResponse(IncomingPostResponse memory) external override onlyHost { + function onPostResponse(IncomingPostResponse memory) + external + override + onlyHost + { // decode response - // Check that decoded value can be executed successfully - // Make state changes + // make any necessary state changes emit PostResponseReceived(); } - function onPostResponseTimeout(PostResponse memory) external override onlyHost { - // revert any state changes made when post response was dispatched + function onPostResponseTimeout(PostResponse memory) + external + override + onlyHost + { + // revert any state changes made + // when post response was dispatched emit PostResponseTimeoutReceived(); } - function onGetResponse(IncomingGetResponse memory) external override onlyHost { + function onGetResponse(IncomingGetResponse memory) + external + override + onlyHost + { emit GetResponseReceived(); } - function onGetTimeout(GetRequest memory) external override onlyHost { - // revert any state changes made when get request was dispatched + function onGetTimeout(GetRequest memory) + external + override + onlyHost + { + // revert any state changes + // made when get request was dispatched emit GetTimeoutReceived(); } } ``` - ## Security Considerations -* Limit the caller of these functions to the `IIsmpHost` contract only. This prevents unauthorized messages from being executed. - +- Limit the caller of these functions to the `IIsmpHost` contract only. This prevents unauthorized messages from being executed. diff --git a/docs/pages/developers/explore/index.mdx b/docs/pages/developers/explore/index.mdx index fc7b68bc6..2bc44ce19 100644 --- a/docs/pages/developers/explore/index.mdx +++ b/docs/pages/developers/explore/index.mdx @@ -9,5 +9,5 @@ Hyperbridge brings together advanced cryptographic and mechanistic protocols to The protocol is facilitated by: - - A permissionless set of relayers who transmit cross-chain messages authenticated by cryptographic proofs. - - Hyperbridge Nexus, a blockchain that serves a crypto-economic coprocessor for aggregating interoperability proofs. + - A permissionless set of relayers that transmit cross-chain messages authenticated by cryptographic proofs. + - Hyperbridge Nexus, a blockchain that serves as a crypto-economic coprocessor for aggregating interoperability proofs. diff --git a/docs/pages/developers/network/node.mdx b/docs/pages/developers/network/node.mdx index 260a42cd4..2732b9f41 100644 --- a/docs/pages/developers/network/node.mdx +++ b/docs/pages/developers/network/node.mdx @@ -102,7 +102,8 @@ rustup component add rust-src Download a local copy of the repo and checkout the latest release tag ```bash -export LATEST_TAG=hyperbridge-v0.5.0 +# fetch the latest tag from docker hub +LATEST_TAG=$(curl -s https://hub.docker.com/v2/repositories/polytopelabs/hyperbridge/tags\?page_size\=1\&page\=2 | jq -r '.results[0].name') git clone https://github.com/polytope-labs/hyperbridge.git cd ./hyperbridge git checkout ${LATEST_TAG} @@ -162,28 +163,6 @@ hyperbridge \ --sync=fast-unsafe ``` -### Kusama - -Hyperbridge is live on Kusama with a chainId of `messier` and ParaId of `3340`. We do not recommend joining the kusama network at this time. - -```bash -export PUBLIC_IP_ADDRESS= -hyperbridge \ - --base-path=$HOME/.hyperbridge \ - --pruning=archive \ - --name="Your node name here" \ - --rpc-cors=all \ - --rpc-port=9944 \ - --unsafe-rpc-external \ - --rpc-methods=unsafe \ - --chain=messier \ - --no-mdns \ - --listen-addr=/ip4/0.0.0.0/tcp/30333 \ - --listen-addr=/ip6/::/tcp/30333 \ - --public-addr=/ip4/$PUBLIC_IP_ADDRESS/tcp/30333 \ - --out-peers=32 -``` - ### Polkadot Hyperbridge is also live on Polkadot with a chainId of `nexus` and ParaId of `3367`. diff --git a/docs/pages/developers/network/relayer.mdx b/docs/pages/developers/network/relayer.mdx index 17cda3e94..54922645f 100644 --- a/docs/pages/developers/network/relayer.mdx +++ b/docs/pages/developers/network/relayer.mdx @@ -5,7 +5,7 @@ description: Running the Hyperbridge relayer # Running a Relayer -The Hyperbridge relayer (tesseract) can be obtained through a variety of ways. For now only release artifacts for x86 linux environments are officially distributed. You can also build the relayer from source if you prefer. +The Hyperbridge relayer (tesseract) can be obtained through a variety of ways. For now only release artifacts for x86 linux environments are officially distributed. You can also build the relayer from source if you prefer. ## Prebuilt binaries @@ -84,13 +84,14 @@ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ### Clone the repo -Download a local copy of the repo and checkout the latest release tag +Download a local copy of the repo and checkout the latest release version. ```bash -export LATEST_TAG=tesseract-v0.3.3 +# fetch the latest tag from docker hub +LATEST_TAG=$(curl -s https://hub.docker.com/v2/repositories/polytopelabs/tesseract/tags\?page_size\=1\&page\=2 | jq -r '.results[0].name') git clone https://github.com/polytope-labs/hyperbridge.git cd ./hyperbridge -git checkout ${LATEST_TAG} +git checkout tesseract-${LATEST_TAG} ``` ### Build the tesseract relayer @@ -102,7 +103,9 @@ cargo build --release -p tesseract The Tesseract relayer will now be available at `target/release/tesseract`, You can move the binary to your `$PATH` so you can run it directly.
-Update your path to include `${HOME}/.local/bin`. If you are using Bash, run the following. Alternatively, replace `${HOME}/.bashrc` with `${HOME}/.zshrc` if using Zsh. Replace `source` with `.` if necessary. +Update your path to include `${HOME}/.local/bin`. If you are using Bash, run the +following. Alternatively, replace `${HOME}/.bashrc` with `${HOME}/.zshrc` if +using Zsh. Replace `source` with `.` if necessary. ```bash # add .local/bin to path if it doesn't exist @@ -146,7 +149,7 @@ At the minimum, the hyperbridge relayer should be run on a machine with at least A community member has graciously provided their ansible playbook for running the hyperbridge relayer. You can find it here: - - [schmiatz/hyperbridge-relayer](https://github.com/schmiatz/hyperbridge-relayer) +- [schmiatz/hyperbridge-relayer](https://github.com/schmiatz/hyperbridge-relayer) ## Configuration @@ -188,7 +191,7 @@ delivery_endpoints = [ [ethereum] # configuration type can be either "evm" or "substrate" type = "evm" -# State machine identifier for the this evm chain. +# State machine identifier for this evm chain. # Must be specified as: # - "EVM-{chainId}" @@ -314,91 +317,91 @@ tesseract --config=$HOME/config.toml --db=$HOME/tesseract.db accumulate-fees --w The relayer also runs background tasks for automatic fee accumulation and withdrawals. Whenever a batch of messages is successfully delivered, the fee accumulation task receives the delivery receipts and starts the process of accumulating the fees on hyperbridge. This process happens concurrently for all successfully delivered message batches. For redundancy, the delivery receipts are stored in the database prior to accumulation so they can be retried manually if any error is encountered.
-Withdrawing fees from hyperbridge is triggered at fixed intervals based on the configured -`withdrawal_frequency` and `minimum_withdrawal_amount`. Feel free to the adjust these -values as desired. The task will only make a withdrawal attempt if your balance on -hyperbridge is greater than or equal to the configured `minimum_withdrawal_amount`. -Any failed withdrawal attempts will be retried each time the withdrawal task is triggered. -The manual processes described in the previous sections can be used as fallbacks -when errors are encountered by their automated conterparts. +Withdrawing fees from hyperbridge is triggered at fixed intervals based on the +configured `withdrawal_frequency` and `minimum_withdrawal_amount`. Feel free to +the adjust these values as desired. The task will only make a withdrawal attempt +if your balance on hyperbridge is greater than or equal to the configured +`minimum_withdrawal_amount`. Any failed withdrawal attempts will be retried each +time the withdrawal task is triggered. The manual processes described in the +previous sections can be used as fallbacks when errors are encountered by their +automated conterparts. ## Relayer Errors -List of commonly seen errors with their explanation and tips on how to fix them. +List of commonly seen errors with their explanation and tips on how to fix them. -```manpage +``` ERROR tesseract_messaging: Failed to submit transaction to Evm(42161): Middleware error: (code: -32000, message: insufficient funds for gas * price + value: address have 0 want 323200000000000, data: None ``` -```manpage +``` ERROR tesseract_evm::provider: Debug trace frame not found! ``` -```manpage +``` ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(8453): Invalid name: please ensure the contract and method you're calling exist! failed to decode empty bytes. if you're using jsonrpc this is likely due to jsonrpc returning `0x` in case contract or method don't exist ``` -```manpage +``` ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error encountered while querying state_machine_update_time Middleware error: (code: -32000, message: header not found, data: None)") ``` -```manpage +``` ERROR tesseract_messaging: Failed to submit transaction to Polkadot(3367): Failed to submit unsigned extrinsic ``` -```manpage +``` ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(56): Middleware error: (code: -32601, message: The method debug_traceCall does not exist/is not available, data: None) ``` -```manpage +``` ERROR tesseract: Error waiting for challenge period in Evm(56) - Polkadot(3367) update stream ``` -```manpage +``` ERROR tesseract_messaging: Failed to submit transaction to Evm(10): Transaction reverted ``` -```manpage +``` ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(100): Middleware error: (code: -32053, message: API key is not allowed to access method, data: None) ``` -```manpage +``` ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error fetching latest block height on Evm(56) JsonRpcClientError(MiddlewareError(Middleware((code: -32603, message: request failed or timed out, data: None))))") ``` -```manpage +``` ERROR tesseract_evm::provider: Error while querying events in range 43812202..43812204 from Evm(56): Middleware error: (code: -32603, message: request failed or timed out, data: None) ``` -```manpage +``` ERROR tesseract_evm::provider: Error while querying events in range 43816145..43816147 from Evm(56): Middleware error: (code: -32603, message: internal server error, data: None) ``` -```manpage +``` ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error encountered while querying state_machine_update_time Invalid name: please ensure the contract and method you're calling exist! failed to decode empty bytes. if you're using jsonrpc this is likely due to jsonrpc returning `0x` in case contract or method don't exist") ``` -```manpage +``` ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(1): Middleware error: Deserialization Error: response must be either a success/error or notification object at line 1 column 237. Response: {"jsonrpc":"2.0","id":31327,"result":null,"error":{"code":-32000,"message":"tracing failed: insufficient funds for gas * price + value: address
have 411893340457544628 want 525945389500000000"}} ``` -```manpage +``` ERROR tesseract_messaging: Error accummulating some fees, receipts have been stored in the db, you can try again manually ``` -```manpage +``` ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error fetching latest block height on Evm(56) JsonRpcClientError(MiddlewareError(Middleware(Deserialization Error: expected value at line 1 column 1. Response: \r\n504 Gateway Time-out\r\n\r\n

504 Gateway Time-out

\r\n\r\n\r\n)))") ``` -```manpage +``` ERROR tesseract_evm::provider: Error while querying events in range 43876757..43876796 from Evm(56): Middleware error: Deserialization Error: expected value at line 1 column 1. Response: ``` -```manpage +``` ERROR tesseract_messaging: Error while handling EVM-56 on Polkadot(3367): Middleware error: (code: -32000, message: missing trie node baf71a6410ba54b32b02056415efe6b22060c20aff9c399d9b6308d0a88c3d09 (path ) state 0xbaf71a6410ba54b32b02056415efe6b22060c20aff9c399d9b6308d0a88c3d09 is not available, data: None) ``` -```manpage +``` ERROR tesseract::cli: Disconnected from telemetry with: Text( ``` - diff --git a/docs/pages/developers/polkadot/getting-started.mdx b/docs/pages/developers/polkadot/getting-started.mdx new file mode 100644 index 000000000..3d62375c2 --- /dev/null +++ b/docs/pages/developers/polkadot/getting-started.mdx @@ -0,0 +1,83 @@ +--- +title: Getting Started +description: Hyperbridge is built on a cross-chain interoperability protocol referred to as the [Interoperable State Machine Protocol](/protocol/ismp). This protocol implementation lives in the [Hyperbridge Monorepo](https://github.com/polytope-labs/hyperbridge/tree/main/modules/ismp). +--- + +# ISMP SDK + +Hyperbridge is built on a cross-chain interoperability protocol referred to as the [Interoperable State Machine Protocol](/protocol/ismp). This protocol implementation lives in the [Hyperbridge Monorepo](https://github.com/polytope-labs/hyperbridge/tree/main/modules/ismp). Polkadot-SDK based chains whether parachains or solochains can be connected to Hyperbridge and consequently all of Hyperbridge's connected networks through the ISMP protocol. + +The connection between Hyperbridge and Polkadot-SDK chains is mediated by a few modules that we will introduce below. + +## Pallet ISMP + +This is the core module of the Interoperable state machine protocol for Polkadot-SDK chains. It exposes APIs and calls that allow the runtime to send and receive ISMP messages respectively. You can add it to your runtime like so + +``` +cargo add pallet-ismp +``` + +### Pallet ISMP Runtime API + +This ISMP runtime API exposes necessary storage items to the client subsystems, specifically in this case the RPC subsystem. But you can also build custom client subsytems that leverage this runtime API. You can add it to your runtime like so + +``` +cargo add pallet-ismp-runtime-api +``` + +### Pallet ISMP RPC + +The Pallet ISMP RPC module exposes the necessary RPC APIs that are required by the [tesseract relayer](/developers/network/relayer) and other alternative relayer implementations. This is required for any kind of offchain relayer process. You can add it to your runtime like so + +``` +cargo add pallet-ismp-rpc +``` + +## Parachain Consensus Client + +For parachain runtimes that want to connect to Hyperbridge, They will do so by means of the parachain consensus client. Which is leverages the relay chain as the source of truth for finalized sibling parachain state commitments. You can add it to your runtime like so + +``` +cargo add pallet-ismp-rpc +``` + + +### Parachain Inherent + +The parachain inherent greatly simplifies the infrastructure required for parachains to exchange messages with Hyperbridge by turning collators into consensus relayers. Specifically this inherent will automatically include sibling parachain headers and their proofs into every block keeping the parachain up to date with the latest finalized state of Hyperbridge and any other sibling parachain that is configured. Without this, a seperate consensus relayer will need to be run offchain. You can add it to your runtime like so + +``` +cargo add ismp-parachain-inherent +``` + +### Parachain Runtime API + +The Parachain inherent provider requires some runtime APIs to access which parachains are configured by the runtime to be included in the inherent.ou can add it to your runtime like so + +``` +cargo add ismp-parachain-runtime-api +``` + +## GRANDPA Consensus Client + +Solochains that want to connect to Hyperbridge will do so by means of the GRANDPA consensus client. This consensus client is capable of verifying GRANDPA consensus proofs of standalone chains as well as relay chains. You can add it to your runtime like so + +``` +cargo add ismp-grandpa +``` + +## Pallet Hyperbridge + +The Pallet Hyperbridge provides an implementation of the `IsmpDispatcher` which collects the Hyperbridge protocol fees, as well as an `IsmpModule` for processing cross-chain messages from Hyperbridge. These cross-chain messages may either be withdrawal requests may be for either relayer fees, or protocol fees. The IsmpModule may also receive cross-chain messages from Hyperbridge to adjust it's protocol fees as decided by governance. This module is optional and is only needed if Polkadot-SDK chains opt to pay Hyperbridge protocol fees onchain, they may also do so offchain by running their own relayers and paying Hyperbridge it's native token when they relay messages to Hyperbridge. You can add it to your runtime like so + +``` +cargo add pallet-hyperbridge +``` + +## Pallet Token Gateway + +The Pallet Token Gateway is an application-layer module that leverages Hyperbridge for token bridging. It works with any implementation of the `fungibles::*` traits so `pallet-assets` or `orml-tokens`. Allowing runtimes to send and receive assets from any of Hyperbridge's connected chains even EVM ones. You can add it to your runtime like so + +``` +cargo add pallet-token-gateway +``` diff --git a/docs/pages/developers/polkadot/ismp-parachain-inherent.mdx b/docs/pages/developers/polkadot/ismp-parachain-inherent.mdx new file mode 100644 index 000000000..af0d8ad5f --- /dev/null +++ b/docs/pages/developers/polkadot/ismp-parachain-inherent.mdx @@ -0,0 +1,59 @@ + +# ISMP Parachain Inherent Provider + + +This module leverages the [`ProvideInherent`](https://docs.rs/frame-support/latest/frame_support/inherent/trait.ProvideInherent.html) functionality to submit consensus update messages. This approach offers a significant advantage: + + - **Eliminating Off-chain Consensus Relayer** : By utilizing inherent messages for receiving consensus messages about finalized parachain block headers, the need for a separate off-chain consensus relayer is eliminated. + - **Simplified Architecture** : This reduces the overall system complexity by removing an external component (the off-chain consensus relayer). + - **Improved Efficiency** : Inherents are a built-in mechanism within the polkadot-sdk, allowing the collator to act as the consensus relayer. + +The inherent provider module needs to be added to the collator's client subsystems as shown in the code below + +```rust showLineNumbers +fn start_consensus( + client: Arc, + backend: Arc, + block_import: ParachainBlockImport, + prometheus_registry: Option<&Registry>, + telemetry: Option, + task_manager: &TaskManager, + relay_chain_interface: Arc, + transaction_pool: Arc>, + sync_oracle: Arc>, + keystore: KeystorePtr, + relay_chain_slot_duration: Duration, + para_id: ParaId, + collator_key: CollatorPair, + overseer_handle: OverseerHandle, + announce_block: Arc>) + Send + Sync>, +) { + // .. omitted calls + + let (client_clone, relay_chain_interface_clone) = + (client.clone(), relay_chain_interface.clone()); + let params = lookahead::Params { + create_inherent_data_providers: move |parent, ()| { + let client = client_clone.clone(); + let relay_chain_interface = relay_chain_interface_clone.clone(); + async move { + let inherent = ismp_parachain_inherent::ConsensusInherentProvider::create( + parent, + client, + relay_chain_interface, + ).await?; + + Ok(inherent) + } + }, + ..Default::default() + // omitted fields + }; + + // ..omitted calls +} +``` + +## Implementation + + - [ismp-parachain-inherent](https://github.com/polytope-labs/hyperbridge/blob/main/modules/ismp/clients/parachain/inherent/src/lib.rs) diff --git a/docs/pages/developers/polkadot/ismp-parachain-runtime-api.mdx b/docs/pages/developers/polkadot/ismp-parachain-runtime-api.mdx new file mode 100644 index 000000000..08420df2a --- /dev/null +++ b/docs/pages/developers/polkadot/ismp-parachain-runtime-api.mdx @@ -0,0 +1,25 @@ +# ISMP Parachain Runtime API + +This is required by the `ismp-parachain-inherent`. It is used to access the whitelist of sibling parachains to produce consensus proofs for. + +To use this, Include the `ismp-parachain-runtime-api` implementation in your `impl_runtime_apis` section. + +```rust showLineNumbers [runtime.rs] +use ismp_parachain_runtime_api::IsmpParachainApi; + +impl_runtime_apis! { + impl IsmpParachainApi for Runtime { + fn para_ids() -> Vec { + ismp_parachain::Pallet::::para_ids() + } + + fn current_relay_chain_state() -> RelayChainState { + ismp_parachain::Pallet::::current_relay_chain_state() + } + } +} +``` + +## Implementation + + - [ismp-parachain-runtime-api](https://github.com/polytope-labs/hyperbridge/blob/main/modules/ismp/clients/parachain/runtime-api/src/lib.rs) \ No newline at end of file diff --git a/docs/pages/developers/polkadot/rpc.mdx b/docs/pages/developers/polkadot/pallet-ismp-rpc.mdx similarity index 99% rename from docs/pages/developers/polkadot/rpc.mdx rename to docs/pages/developers/polkadot/pallet-ismp-rpc.mdx index e795f7e68..762f4ffb7 100644 --- a/docs/pages/developers/polkadot/rpc.mdx +++ b/docs/pages/developers/polkadot/pallet-ismp-rpc.mdx @@ -18,7 +18,7 @@ Query results obtained through this interface are formatted in JSON (JavaScript For offchain components that need to read the state of pallet-ismp, an rpc client is provided, this should be added to the rpc server in the substrate node. -```rust showLineNumbers +```rust showLineNumbers [rpc.rs] // RPC API Implementation for pallet-ismp /// Full client dependencies pub struct FullDeps { diff --git a/docs/pages/developers/polkadot/pallet-ismp-runtime-api.mdx b/docs/pages/developers/polkadot/pallet-ismp-runtime-api.mdx new file mode 100644 index 000000000..d6eb47693 --- /dev/null +++ b/docs/pages/developers/polkadot/pallet-ismp-runtime-api.mdx @@ -0,0 +1,65 @@ +# Pallet ISMP Runtime API + + +The `pallet-ismp-runtime-api` provides methods that allow the rpc client read the runtime state, this methods include querying requests and responses, generating proofs, among others. The runtime api can be easily added to the runtime as follows: + +```rust showLineNumbers [runtime.rs] +impl pallet_ismp_runtime_api::IsmpRuntimeApi::Hash> for Runtime { + fn host_state_machine() -> StateMachine { + ::HostStateMachine::get() + } + + fn challenge_period(state_machine_id: StateMachineId) -> Option { + pallet_ismp::Pallet::::challenge_period(state_machine_id) + } + + /// Generate a proof for the provided leaf indices + fn generate_proof( + keys: ProofKeys + ) -> Result<(Vec, Proof<::Hash>), sp_mmr_primitives::Error> { + pallet_ismp::Pallet::::generate_proof(keys) + } + + /// Fetch all ISMP events in the block, should only be called from runtime-api. + fn block_events() -> Vec<::ismp::events::Event> { + pallet_ismp::Pallet::::block_events() + } + + /// Fetch all ISMP events and their extrinsic metadata, should only be called from runtime-api. + fn block_events_with_metadata() -> Vec<(::ismp::events::Event, Option)> { + pallet_ismp::Pallet::::block_events_with_metadata() + } + + /// Return the scale encoded consensus state + fn consensus_state(id: ConsensusClientId) -> Option> { + pallet_ismp::Pallet::::consensus_states(id) + } + + /// Return the timestamp this client was last updated in seconds + fn state_machine_update_time(height: StateMachineHeight) -> Option { + pallet_ismp::Pallet::::state_machine_update_time(height) + } + + /// Return the latest height of the state machine + fn latest_state_machine_height(id: StateMachineId) -> Option { + pallet_ismp::Pallet::::latest_state_machine_height(id) + } + + + /// Get actual requests + fn requests(commitments: Vec) -> Vec { + pallet_ismp::Pallet::::requests(commitments) + } + + /// Get actual requests + fn responses(commitments: Vec) -> Vec { + pallet_ismp::Pallet::::responses(commitments) + } + } +``` + + + +## Implementation + + - [pallet-ismp-runtime-api](https://github.com/polytope-labs/hyperbridge/blob/main/modules/ismp/pallets/runtime-api/src/lib.rs) \ No newline at end of file diff --git a/docs/pages/developers/polkadot/integration.mdx b/docs/pages/developers/polkadot/pallet-ismp.mdx similarity index 53% rename from docs/pages/developers/polkadot/integration.mdx rename to docs/pages/developers/polkadot/pallet-ismp.mdx index d8bee0d88..52b4d8136 100644 --- a/docs/pages/developers/polkadot/integration.mdx +++ b/docs/pages/developers/polkadot/pallet-ismp.mdx @@ -2,151 +2,22 @@ This is the implementation of ISMP for substrate chains. It is the foundational component that allows communication over ISMP. It correctly composes the various ISMP components in the runtime. -## Pallet Config - -The Pallet has the following Config trait - -```rust showLineNumbers -#[pallet::config] -pub trait Config: frame_system::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - /// Admin origin for privileged actions such as adding new consensus clients as well as - /// modifying existing consensus clients (eg. challenge period, unbonding period) - type AdminOrigin: EnsureOrigin; - - /// Timestamp interface [`UnixTime`] for querying the current timestamp. This is used within - /// the various ISMP sub-protocols. - type TimestampProvider: UnixTime; - - /// The balance of an account. - type Balance: Parameter - + Member - + AtLeast32BitUnsigned - + Codec - + Default - + Copy - + MaybeSerializeDeserialize - + Debug - + MaxEncodedLen - + TypeInfo - + FixedPointOperand; - - /// The currency that is offered to relayers as payment for request delivery - /// and execution. This should ideally be a stablecoin of some kind to guarantee - /// predictable and stable revenue for relayers. - /// - /// This can also be used with pallet-assets through the - /// [ItemOf](frame_support::traits::tokens::fungible::ItemOf) implementation - type Currency: Mutate; - - /// The state machine identifier for the host chain. This is the identifier that will be - /// used to accept requests that are addressed to this state machine. Remote chains - /// will also use this identifier to accept requests originating from this state - /// machine. - type HostStateMachine: Get; - - /// The coprocessor is a state machine which proxies requests on our behalf. The coprocessor - /// does this by performing the costly consensus and state proof verification needed to - /// verify requests/responses that are addressed to this host state machine. - /// - /// The ISMP framework permits the coprocessor to aggregate messages from potentially - /// multiple state machines. Finally producing much cheaper proofs of consensus and state - /// needed to verify the legitimacy of the messages. - type Coprocessor: Get>; - - /// [`IsmpRouter`] implementation for routing requests & responses to their appropriate - /// modules. - type Router: IsmpRouter + Default; - - /// This should provide a list of [`ConsenusClient`](ismp::consensus::ConsensusClient)s - /// which should be used to validate incoming requests or responses. There should be - /// at least one consensus client present to allow messages be processed by the ISMP - /// subsystems. - type ConsensusClients: ConsensusClientProvider; - - /// This implementation should provide the weight consumed by `IsmpModule` callbacks from - /// their benchmarks. - type WeightProvider: WeightProvider; - - /// Merkle mountain range overlay tree implementation. Outgoing requests and responses are - /// inserted in this "overlay tree" to enable cheap proofs for messages. - /// - /// State machines that do not need this can simply use the `NoOpMmrTree` - type Mmr: MerkleMountainRangeTree; -} -``` - -## Interfaces - -The `pallet-ismp` implements the neccessary interfaces for the ISMP framework. These are: - - - [`IsmpHost`](/protocol/ismp/host): Pallet ISMP implements `IsmpHost` interface providing all the storage and cryptographic requirements for the ISMP handlers. Modules that need to interact with the low-level ISMP framework can use this interface to access the necessary storage items they wish to read. - - :::danger[IMPORTANT] - It is **not recommended** for modules to alter the storage items directly, unless you absolutely know what you are doing. - ::: - - - [`IsmpDispatcher`](/protocol/ismp/dispatcher): It implements `IsmpDispatcher` allowing it to dispatch requests and responses. This is the low-level ISMP framework dispatcher. It can be used to dispatch requests that are not addressed to Hyperbridge and perhaps meant for other state machines. Dispatching requests to be Hyperbridge should be done throught the [`pallet-hyperbridge`](/developers/polkadot/fees#pallet-hyperbridge) module. Which also implements the `IsmpDispatcher` interface but collects the necessary fees. - - :::danger[IMPORTANT] - Requests/Responses that are not dispatched by `pallet-hyperbridge` will not be processed by Hyperbridge. They will fail transaction pool validation and will not be included in blocks. - ::: - - -## Calls - -* `create_consensus_client` -This is a priviledged call used to initialize the consensus state of a consensus client. Consensus clients must to be initialized with a trusted state, so this call must only be called by a trusted party. - -* `update_consensus_state` -This is a priviledged call used to update the unbonding period or challenge_period for a consensus client. It must only be called by a trusted parties to prevent consensus exploits. - -* `handle_unsigned` -Execute the provided batch of ISMP messages, this will short-circuit and revert if any of the provided messages are invalid. This is an unsigned extrinsic that permits anyone -execute ISMP messages for free, provided they have valid proofs and the messages havenot been previously processed. -The dispatch origin for this call must be an unsigned one. -Emits different message events based on the Message received if successful. -Only available when the pallet is built with the `unsigned` feature flag. - -* `handle` -Execute the provided batch of ISMP messages. This call will short-circuit and revert if any of the provided messages are invalid. -The dispatch origin for this call must be a signed one. -Emits different message events based on the Message received if successful. -Only available when the `unsigned` feature flag is disabled. - -* `fund_message` -During periods of high transaction fees on the destination chain, you can increase the relayer fee for in-flight requests and responses to incentivize their delivery. -Simply call this function with the request/response commitment and the desired fee increase amount. -Should not be called on a message that has been completed (delivered or timed-out) as those funds will be lost forever. - -## Transaction fees - -Hyperbridge offers a cost-effective approach to delivering ISMP messages: - - - `No Fees for Valid Messages`: Hyperbridge itself doesn't charge any transaction fees for delivering valid ISMP messages to the chain. This reduces the overall cost burden for users. - - - `Fees Paid on Source Chain`: Protocol fees are collected on the source chain (where the message originates) before it's submitted. This upfront payment system ensures that every delivered message has been "paid for" before valid proofs can be generated. - -Malformed messages or those with invalid proofs are filtered out by the transaction pool validation logic preventing unnecessary processing and potential network congestion. - -On parachains and solochains integrating ISMP transaction fees will be collected as the `handle_unsigned` extrinsic is disabled by default. - ## Runtime Integration Including `pallet-ismp` in a substrate runtime requires implementing the pallet config. -```rust showLineNumbers +```rust showLineNumbers [runtime.rs] parameter_types! { - // The hyperbridge parachain on Polkadot + // For example, the hyperbridge parachain on Polkadot pub const Coprocessor: Option = Some(StateMachine::Polkadot(3367)); - // The host state machine of this pallet - pub const HostStateMachine: StateMachine = StateMachine::Polkadot(1000); // your paraId here + // The host state machine of this pallet, your state machine id goes here + pub const HostStateMachine: StateMachine = StateMachine::Polkadot(1000); // polkadot + // pub const HostStateMachine: StateMachine = StateMachine::Kusama(1000); // kusama + // pub const HostStateMachine: StateMachine = StateMachine::Substrate(*b"MYID"); // solochain } impl pallet_ismp::Config for Runtime { - // configure the runtime event + // Configure the runtime event type RuntimeEvent = RuntimeEvent; // Permissioned origin who can create or update consensus clients type AdminOrigin = EnsureRoot; @@ -155,6 +26,7 @@ impl pallet_ismp::Config for Runtime { // The pallet_timestamp pallet type TimestampProvider = Timestamp; // The currency implementation that is offered to relayers + // this could also be `frame_support::traits::tokens::fungible::ItemOf` type Currency = Balances; // The balance type for the currency implementation type Balance = Balance; @@ -169,7 +41,7 @@ impl pallet_ismp::Config for Runtime { ); // Optional merkle mountain range overlay tree, for cheaper outgoing request proofs. // You most likely don't need it, just use the `NoOpMmrTree` - type Mmr = NoOpMmrTree; + type Mmr = pallet_ismp::NoOpMmrTree; // Weight provider for local modules type WeightProvider = (); } @@ -184,23 +56,31 @@ construct_runtime! { Let's go through some of the ISMP specific components of the configuration. -* `HostStateMachine` +* `HostStateMachine`: This is the state machine identifier for your chain, it will be used as the **source value for all requests that are dispatched from this chain** For parachains, this should be your parachain id e.g `StateMachine::Polkadot(1000)`. +
-* `Coprocessor` +* `Coprocessor`: ISMP is built around the idea of a coprocessor that aggregates consensus and state proofs from multiple state machines into a more succinct proof that is cheaply verifiable. This component defines the state machine identifier of the supported coprocessor, Hyperbridge is a coprocessor for ISMP. +
-* `ConsensusClients` +* `ConsensusClients`: This is a tuple of types that implement the `ConsensusClient` interface, it defines all the consensus algorithms supported by this deployment of the protocol. +
-* `Mmr` +* `Mmr`: This type allows us to use mmr tree as an overlay for cheaper proofs for requests and responses instead of the merkle patricia trie proofs. +
-* `Router` +* `Router`: The router is a type that provides an `IsmpModule` implementation for a module id. -```rust showLineNumbers +### Router + +The `IsmpRouter` is a module which produces an `IsmpModule` implementation for a given module identifier. + +```rust showLineNumbers [runtime.rs] #[derive(Default)] struct Router; @@ -244,9 +124,11 @@ impl IsmpModule for YourModule { } ``` -`WeightProvider`: This type allows providing the static benchmarks for all ismp modules, it should identify modules by their id and return the weights for each `IsmpModule` callback +### WeightProvider -```rust showLineNumbers +This type allows providing the static benchmarks for all ismp modules, it should identify modules by their id and return the weights for each `IsmpModule` callback + +```rust showLineNumbers [runtime.rs] struct YourModuleBenchmarks; impl pallet_ismp::weights::IsmpModuleWeight for YourModuleBenchmarks { @@ -279,72 +161,91 @@ impl pallet_ismp::WeightProvider for ModuleWeightProvider { } ``` -### Runtime API - -`pallet-ismp-runtime-api` provides methods that allow the rpc client read the runtime state, this methods include querying requests and responses, generating proofs, among others. The runtime api can be easily added to the runtime as follows: - -```rust showLineNumbers -impl pallet_ismp_runtime_api::IsmpRuntimeApi::Hash> for Runtime { - fn host_state_machine() -> StateMachine { - ::HostStateMachine::get() - } - - fn challenge_period(state_machine_id: StateMachineId) -> Option { - Ismp::challenge_period(state_machine_id) - } - - /// Generate a proof for the provided leaf indices - fn generate_proof( - keys: ProofKeys - ) -> Result<(Vec, Proof<::Hash>), sp_mmr_primitives::Error> { - Ismp::generate_proof(keys) - } - - /// Fetch all ISMP events in the block, should only be called from runtime-api. - fn block_events() -> Vec<::ismp::events::Event> { - Ismp::block_events() - } - - /// Fetch all ISMP events and their extrinsic metadata, should only be called from runtime-api. - fn block_events_with_metadata() -> Vec<(::ismp::events::Event, Option)> { - Ismp::block_events_with_metadata() - } - - /// Return the scale encoded consensus state - fn consensus_state(id: ConsensusClientId) -> Option> { - Ismp::consensus_states(id) - } - - /// Return the timestamp this client was last updated in seconds - fn state_machine_update_time(height: StateMachineHeight) -> Option { - Ismp::state_machine_update_time(height) - } - - /// Return the latest height of the state machine - fn latest_state_machine_height(id: StateMachineId) -> Option { - Ismp::latest_state_machine_height(id) - } - - - /// Get actual requests - fn requests(commitments: Vec) -> Vec { - Ismp::requests(commitments) - } - - /// Get actual requests - fn responses(commitments: Vec) -> Vec { - Ismp::responses(commitments) - } - } -``` -While ISMP can be used independently, connecting to hyperbridge provides access to all its connected chains. In the next sections we'll look into how you can integrate with hyperbridge as a parachain or solochain. +## Interfaces + +The `pallet_ismp::Pallet` implements the neccessary interfaces for the ISMP framework. These are: + + - [`IsmpHost`](/protocol/ismp/host): Pallet ISMP implements `IsmpHost` interface providing all the storage and cryptographic requirements for the ISMP handlers. Modules that need to interact with the low-level ISMP framework can use this interface to access the necessary storage items they wish to read. + + :::danger[IMPORTANT] + It is **not recommended** for 3rd-party modules to alter the storage items directly, unless you absolutely know what you are doing. + ::: + + - [`IsmpDispatcher`](/protocol/ismp/dispatcher): It implements `IsmpDispatcher` allowing it to dispatch requests and responses. This is the low-level ISMP framework dispatcher. It can be used to dispatch requests that are not addressed to Hyperbridge and perhaps meant for other state machines. Dispatching requests to be Hyperbridge should be done throught the [`pallet-hyperbridge`](/developers/polkadot/fees#pallet-hyperbridge) module. Which also implements the `IsmpDispatcher` interface but collects the necessary fees. + + :::danger[IMPORTANT] + Once the Hyperbridge token goes live, requests or responses that are not dispatched by `pallet-hyperbridge` will not be processed by Hyperbridge. They will fail transaction pool validation and will not be included in blocks. + ::: + + +## Calls + +* ### `create_consensus_client` +This is a priviledged call used to initialize the consensus state of a consensus client. Consensus clients must to be initialized with a trusted state, so this call must only be called by a trusted party. +
+ + +* ### `update_consensus_state` +This is a priviledged call used to update the unbonding period or challenge_period for a consensus client. It must only be called by a trusted parties to prevent consensus exploits. +
+ +* ### `handle_unsigned` +Execute the provided batch of ISMP messages, this will short-circuit and revert if any of the provided messages are invalid. This is an unsigned extrinsic that permits anyone +execute ISMP messages for free, provided they have valid proofs and the messages havenot been previously processed. +The dispatch origin for this call must be an unsigned one. +Emits different message events based on the Message received if successful. +Only available when the pallet is built with the `unsigned` feature flag. +
+ +* ### `handle` +Execute the provided batch of ISMP messages. This call will short-circuit and revert if any of the provided messages are invalid. +The dispatch origin for this call must be a signed one. +Emits different message events based on the Message received if successful. +Only available when the `unsigned` feature flag is disabled. +
+ +* ### `fund_message` +During periods of high transaction fees on the destination chain, you can increase the relayer fee for in-flight requests and responses to incentivize their delivery. +Simply call this function with the request/response commitment and the desired fee increase amount. +Should not be called on a message that has been completed (delivered or timed-out) as those funds will be lost forever. + +## Transaction fees + +Pallet ISMP offers a two different approaches to transaction fees. + +### Unsigned + +This essentially means all cross-chain messages received are executed for free as unsigned transactions. The upside to this is that it cannot be exploited as a spam vector, since the transaction pool will check if the submitted extrinsics are valid before they are included in the pool. This validity check ensures that the transaction can be successfully executed and contains valid proofs. Malformed messages or those with invalid proofs are filtered out by the transaction pool validation logic preventing unnecessary processing and potential network congestion. + +### Signed + +In this method, relayers and users will need to pay the native token for executing cross-chain messages. This is likely more preferrable but requires that the token be widely available. + + +## Miscellaneous + +### Offchain Indexing + +The `pallet-ismp` only stores "commitments" of hashes of requests onchain for storage proofs, while the full requests are stored offchain and using the [offchain indexing api](https://docs.rs/sp-io/38.0.0/sp_io/offchain/index.html). It would be prudent to enable offchain indexing by default in the node, so all nodes on the network store all requests offchain. You can do this in your `run` function in `command.rs`. [Here's an example](https://github.com/polytope-labs/hyperbridge/blob/main/parachain/node/src/command.rs#L168-L170) + +```rust showLineNumbers [command.rs] +/// Parse command line arguments into service configuration. +pub fn run() -> Result<()> { + let mut cli = Cli::from_args(); + + // all full nodes should store request/responses, otherwise they'd basically be useless without + // it. + cli.run.base.offchain_worker_params.indexing_enabled = true; // [!code hl] + // .. other stuff +} +``` ### Signed Extensions The teseract messaging relayer expects the following signed extensions to be present in the runtime in the same order listed below -```rust +```rust showLineNumbers [runtime.rs] /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( frame_system::CheckNonZeroSender, @@ -362,4 +263,3 @@ pub type SignedExtra = ( ## Implementation - [pallet-ismp](https://github.com/polytope-labs/hyperbridge/blob/main/modules/ismp/pallets/pallet/src/lib.rs) - - [pallet-ismp-runtime-api](https://github.com/polytope-labs/hyperbridge/blob/main/modules/ismp/pallets/runtime-api/src/lib.rs) diff --git a/docs/pages/developers/polkadot/parachains.mdx b/docs/pages/developers/polkadot/parachains.mdx index 01a160180..a2f27267d 100644 --- a/docs/pages/developers/polkadot/parachains.mdx +++ b/docs/pages/developers/polkadot/parachains.mdx @@ -1,69 +1,10 @@ # Parachain Integration -Parachains that want to leverage the Hyperbridge protocol for secure cross-chain interoperability can do so by integrating the `ismp-parachain` pallet. This pallet empowers parachains to interoperate with whitelisted sibling parachains through the ISMP framework. Here's how it works: +Parachains that want to leverage the Hyperbridge protocol for secure cross-chain interoperability can do so by integrating the `ismp-parachain` pallet. This pallet empowers parachains to interoperate with whitelisted sibling parachains through the ISMP framework. - - **Registration** : A parachain can register the IDs of sibling parachains whose state commitments it wants to learn. - - **Inherent Mechanism** : The functionality relies on an inherent provider and inherent extrinsics: - * **Whitelisted Parachains** : This inherent provider reads the `ismp-parachain` pallet for a list of currently whitelisted parachain IDs. - * **State Proof Fetching** : The provider then retrieves the latest headers from the relay chain for each supported parachain. Additionally, it fetches state proofs for these headers, which act as cryptographic evidence of the header's validity. - * **Consensus Message Submission** : Finally, the provider submits a consensus message as an inherent extrinsic. This message includes the retrieved state proofs. - * **Verification** : The `ParachainConsensusClient`, integrated with `pallet-ismp`, verifies the submitted consensus message and its proofs. +## Runtime Integration -## Pallet Config - -The pallet has the following configuration - -```rust showLineNumbers -#[pallet::config] -pub trait Config: - frame_system::Config - + pallet_ismp::Config - + cumulus_pallet_parachain_system::Config -{ - /// The overarching event type - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - /// The underlying [`IsmpHost`] implementation - type IsmpHost: IsmpHost + Default; -} -``` -## Consensus Updates via Inherents - -This pallet leverages the `ProvideInherent` functionality to submit consensus update messages. This approach offers a significant advantage: - -**Eliminating Off-chain Consensus Relayer** : By utilizing inherent messages for receiving consensus messages about finalized parachain block headers, the need for a separate off-chain consensus relayer is eliminated. - -**Benefits** : - - **Simplified Architecture** : This reduces the overall system complexity by removing an external component (the off-chain consensus relayer). - - **Improved Efficiency** : Inherents are a built-in mechanism within the polkadot-sdk, allowing the collator to act as the consensus relayer. - -## Calls - -* `update_parachain_consensus` -This is an inherent call that is used by the collator to include the consensus update message for the parachain consensus client. - -* `add_parachain` -This call allows a priviledged origin to add a new parachain to the list of supported parachains. whenever a new parachain is added, the inherent provider will add state proofs of the parachain's latest header in subsequent consensus messages. - -* `remove_parachain` -This priviledged call removes a parachain from the list of supported parachains, thereby preventing any future state updates from such parachain. - -## LifeCycle - -### OnInitialize - -In the OnInitialize hook, the consensus state for the parachain consensus client will be initialized if it does not exist. - -### OnFinalize - -This hook is used to read the current relay chain state in order to get the state root of the finalized relay chain block, so it can be used to verify subsequent parachain consensus update messages. - -## Integration - -For a parachain to establish a connection with Hyperbridge and leverage its message-passing capabilities, two key steps are required: - -**Include pallet-ismp** : The first step involves integrating the pallet-ismp module into the parachain's runtime environment as described in a previous section. This module provides the foundational functionalities for ISMP message handling. -**Include ismp-parachain** : Subsequently, the parachain needs to include the ismp-parachain pallet. This additional module grants the parachain access to the state commitments of whitelisted parachains. Access to these commitments is essential for verifying the validity of messages that the parachain intends to send or receive to/from Hyperbridge. +To establish a connection with Hyperbridge and utilize its message-passing capabilities, a parachain must complete three essential steps. First, it must integrate the `pallet-ismp` module into its runtime environment, providing the core functionalities for ISMP message handling. Next, the parachain must include the `ismp-parachain` pallet, which provides a parachain consensus client for verifying proofs of finalized parachain headers. Finally, the parachain must whitelist the Hyperbridge parachain on the `ismp-parachain` pallet. ### Parachain Consensus Client @@ -100,81 +41,36 @@ construct_runtime! { } ``` -Include the `ismp-parachain-runtime-api` implementation in your `impl_runtime_apis` section. +### Whitelisting Parachains -```rust showLineNumbers -impl_runtime_apis! { - impl ismp_parachain_runtime_api::IsmpParachainApi for Runtime { - fn para_ids() -> Vec { - IsmpParachain::para_ids() - } - - fn current_relay_chain_state() -> RelayChainState { - IsmpParachain::current_relay_chain_state() - } - } -} -``` +To use the parachain consensus client to communicate with sibling parachains, Hyperbridge included. You will need to first whitelist these parachains using the `ismp_parachain::Call::::add_parachain` extrinsic. Once added consenus relayers like the ismp parachain inherent will begin including finality proofs of these parachains in your runtime. Opening the doors of secure cross-chain communication. -### Inherent Provider + -The inherent provider needs to be added to the collator params as shown in the code below -```rust showLineNumbers -fn start_consensus( - client: Arc, - backend: Arc, - block_import: ParachainBlockImport, - prometheus_registry: Option<&Registry>, - telemetry: Option, - task_manager: &TaskManager, - relay_chain_interface: Arc, - transaction_pool: Arc>, - sync_oracle: Arc>, - keystore: KeystorePtr, - relay_chain_slot_duration: Duration, - para_id: ParaId, - collator_key: CollatorPair, - overseer_handle: OverseerHandle, - announce_block: Arc>) + Send + Sync>, -) { - // .. omitted calls - - let (client_clone, relay_chain_interface_clone) = - (client.clone(), relay_chain_interface.clone()); - let params = lookahead::Params { - create_inherent_data_providers: move |parent, ()| { - let client = client_clone.clone(); - let relay_chain_interface = relay_chain_interface_clone.clone(); - async move { - let inherent = ismp_parachain_inherent::ConsensusInherentProvider::create( - parent, - client, - relay_chain_interface, - ).await?; - - Ok(inherent) - } - }, - ..Default::default() - // omitted fields - }; - - // ..omitted calls -} -``` +## Calls + +* ### `update_parachain_consensus` +This is an inherent call that is used by the collator to include the consensus proofs for newly finalized parachain headers. + +* ### `add_parachain` + +This call allows a priviledged origin to add a new parachain to the list of supported parachains. whenever a new parachain is added, the inherent provider will add state proofs of the parachain's latest header in subsequent consensus messages. -### Configure the Coprocessor +* ### `remove_parachain` +This priviledged call removes a parachain from the list of supported parachains, thereby preventing any future state updates from such parachain. + +## Hooks -Integrating your parachain with Hyperbridge is a straightforward process. Here's what you need to do: +### on_initialize -**Add Hyperbridge's Parachain ID** : Include Hyperbridge's unique parachain identifier (ID), which is `3367`, in the list of supported parachain IDs within the `ismp-parachain` pallet. This grants your parachain the ability to communicate with Hyperbridge.You can do this by executing the `add_parachain` call with the admin origin setup in `palet-ismp`. This action officially adds Hyperbridge to your list of supported parachains. +In the OnInitialize hook, the consensus state for the parachain consensus client will be initialized if it does not exist. -Once these steps are completed, your parachain will be able to send and receive messages to and from Hyperbridge, enabling seamless cross-chain communication. +### on_finalize + +This hook is used to read the current relay chain state in order to get the state root of the finalized relay chain block, so it can be used to verify subsequent parachain consensus update messages. ## Implementation - [ismp-parachain](https://github.com/polytope-labs/hyperbridge/blob/main/modules/ismp/clients/parachain/client/src/lib.rs) - - [ismp-parachain-inherent](https://github.com/polytope-labs/hyperbridge/blob/main/modules/ismp/clients/parachain/inherent/src/lib.rs) - - [ismp-parachain-runtime-api](https://github.com/polytope-labs/hyperbridge/blob/main/modules/ismp/clients/parachain/runtime-api/src/lib.rs) diff --git a/docs/pages/developers/polkadot/solochains.mdx b/docs/pages/developers/polkadot/solochains.mdx index da5975f56..b9fc5b180 100644 --- a/docs/pages/developers/polkadot/solochains.mdx +++ b/docs/pages/developers/polkadot/solochains.mdx @@ -1,63 +1,170 @@ # Solochain Integration -For a solochain that wants to integrate with hyperbridge all that is required is to configure either the BEEFY consensus client or GRANDPA consensus client and set hyperbridge as the coprocessor. +For solochains that want to integrate with hyperbridge a GRANDPA consensus client is provided as a way to track the finality of the Hyperbridge parachain through Polkadot. A consensus relayer is also provided, which is responsible for exchanging finality proofs of cross-chain messages. + +## Runtime Integration + +In your runtime, you should configure Hyperbridge as the coprocessor and add a GRANDPA consensus client to the list of consensus clients. The host state machine should be assigned a unique value for each solochain connected to Hyperbridge. + +Every other configuration detail remains unchanged as described in the previous sections + +```rust showLineNumbers [runtime.rs] +parameter_types! { + // The hyperbridge parachain on Polkadot + pub const Coprocessor: Option = Some(StateMachine::Polkadot(3367)); + // The host state machine of this pallet, this must be unique to all every solochain + pub const HostStateMachine: StateMachine = StateMachine::Substrate(*b"solo"); // your unique chain id here +} + +impl pallet_ismp::Config for Runtime { + // ... + type Coprocessor = Coprocessor; + // Supported consensus clients + type ConsensusClients = ( + // Add the grandpa consensus client here + ismp_grandpa::GrandpaConsensusClient, + ); + // ... +} + +construct_runtime! { + // ... + Ismp: pallet_ismp + IsmpGrandpa: ismp_grandpa +} +``` + +### Whitelisting State Machines + +The `ismp-grandpa` pallet requires state machines to be whitelisted before any consensus proofs can be accepted, Hyperbridge included. This ensures that solochains are not spammed with consensus proofs of unwanted chains. + + + +## Calls + +* ### `add_state_machines` + +This adds new state machines which produce GRANDPA consensus proofs to the pallet whitelist, enabling trustless cross-chain communication with the state machines in question. + +* ### `remove_state_machines` + +This removes the provided state machines from the pallet whitelist, terminating the trustless connection with the state machines in question. They can always be re-added. + ## Consensus Relayer -A solochain requires a consensus relayer to send consensus updates between Hyperbridge and itself. Tesseract consensus relayer is built to handle this. +Solochains require an offchain consensus relayer to exchange consensus proofs with Hyperbridge. The Tesseract consensus relayer is built to handle this. This version of the relayer, is different from the publicly available messaging relayer and is closed-source at this time, but is available as a docker image. + +### Docker -## Beefy or Grandpa +You can pull in the tesseract consensus relayer like so -Choosing between Beefy and GRANDPA is just a matter of preference, BEEFY is a much leaner consensus client to maintain with a little finality lag since it piggy packs on top of GRANDPA. -A GRANDPA consensus client would offer reduced latency as GRANDPA finalizes before BEEFY. +```bash +docker pull polytopelabs/tesseract-consensus:latest +``` -## Connecting to Hyperbrige as a Solochain +### Configuring the relayer -In your runtime you should add Hyperbridge as a Coprocessor and add a GRANDPA or BEEFY Consensus client to the list of supported clients, whichever client is added would determine the mode the consensus -relayer would operate. +The tesseract consensus relayer must be configured to relay consensus messages between a solochain and Hyperbridge. The configuration file is a `toml` that should look like: -The host state machine should reflect the consensus protocol of the solochain either GRANDPA or BEEFY and it must be unique to every solochain connected to Hyperbridge. -Every other configuration detail remains unchanged as described in the previous sections +```toml [consensus.toml] +# Required +[hyperbridge] +type = "grandpa" + +[hyperbridge.grandpa] +# Hyperbridge's relay chain websocket RPC +rpc = "" +# Hyperbridge's slot duration +slot_duration = 6 +# How frequently to exchange consensus proofs +consensus_update_frequency = 60 +# Hyperbridge's paraId on the provided relay chain +# For Paseo Testnet: para_ids = [4009] +# For Polkadot Mainnet: para_ids = [3367] +para_ids = [] + +[hyperbridge.substrate] +# Hyperbridge's relay chain websocket RPC +rpc_ws = "" +# Hyperbridge's hashing algorithm +hashing = "Keccak" +# Hyperbridge's consensus state id +# For Paseo Testnet: PAS0 +# For Polkadot Mainnet: DOT0 +consensus_state_id = "" +# Hyperbridge's state machine ID +# For Paseo Testnet: KUSAMA-4009 +# For Polkadot Mainnet: POLKADOT-3367 +state_machine = "" + +# can use any key here +[YourSolochain] +type = "grandpa" + +[YourSolochain.substrate] +# Solochains's websocket RPC +rpc_ws = "" +# Hashing can be "Keccak" or "Blake2" +hashing = "Blake2" +# Solochains's consensus state id on Hyperbridge +# should be 4 utf-8 chars chosen by solochain +consensus_state_id = "" +# Solochains's state machine id. eg +state_machine = "SUBSTRATE-myid" -```rust showLineNumbers - parameter_types! { - // The hyperbridge parachain on Polkadot - pub const Coprocessor: Option = Some(StateMachine::Polkadot(3367)); - // The host state machine of this pallet, this must be unique to all every solochain - pub const HostStateMachine: StateMachine = StateMachine::Grandpa(*b"solo"); // your unique chain id here - } - - impl pallet_ismp::Config for Runtime { - // configure the runtime event - type RuntimeEvent = RuntimeEvent; - // Permissioned origin who can create or update consensus clients - type AdminOrigin = EnsureRoot; - // The state machine identifier for this state machine - type HostStateMachine = HostStateMachine; - // The pallet_timestamp pallet - type TimestampProvider = Timestamp; - // The currency implementation that is offered to relayers - type Currency = Balances; - // The balance type for the currency implementation - type Balance = Balance; - // Router implementation for routing requests/responses to their respective modules - type Router = Router; - // Optional coprocessor for incoming requests/responses - type Coprocessor = Coprocessor; - // Supported consensus clients - type ConsensusClients = ( - // Add the grandpa or beefy consensus client here - ismp_grandpa::GrandpaConsensusClient, - ); - // Optional merkle mountain range overlay tree, for cheaper outgoing request proofs. - // You most likely don't need it, just use the `NoOpMmrTree` - type Mmr = NoOpMmrTree; - // Weight provider for local modules - type WeightProvider = (); - } - - construct_runtime! { - // ... - Ismp: pallet_ismp - } +[YourSolochain.grandpa] +# Solochains's websocket RPC +rpc = "" +# Solochains's slot duration +slot_duration = 6 +# How frequently to exchange consensus proofs +consensus_update_frequency = 60 +# Any para ids to prove if solochain is actually a relay chain +para_ids = [] ``` + +### Consensus State Initialization + +Before running the relayer, you must first initialize Hyperbridge's consensus state on your solochain. The consensus relayer can query Hyperbridge to retrieve this initial state for you. For instance, here's how you can log the consensus state of the Hyperbridge testnet on Paseo: + +```bash +docker run -v /path/to/consensus.toml:/root/consensus.toml polyopelabs/tesseract-consensus:latest --config=/root/consensus.toml log-consensus-state=KUSAMA-4009 +``` + +This should print out a potentially long hex string. Next you'll use this hex string to initialize the Hyperbridge consensus state on your solochain through an extrinsic as shown below. + + + +- **`consensusState`**: This is the initial, trusted consensus state for the Hyperbridge consensus on your solochain. It contains the current and next validator set keys, as well as the latest finalized block. It is the value printed by the `log-consensus-state` subcommand on the tesseract consensus relayer. + +- **`consensusClientId`**: This is the consensus client identifier for the GRANDPA consensus client. It will always be `GRNP` + +- **`consensusStateId`**: This is the consensus state id for Hyperbridge on your solochain, refer to the configuration section on what this value should be. + +- **`unbondingPeriod`**: This is the unbonding period for the Hyperbridge relay chain and is used to [mitigate long fork attacks](/protocol/interoperability/consensus-proofs#long-range-attacks). + +- **`challengePeriod`**: This is period you want state commitments to stay pending for, even after they have been verified by the consensus client, allowing fishermen to check for byzantine behaviour and submit fraud proofs, if any. Polkadot has high economic security which disincentivizes this sort of behaviour so for Hyperbridge, you can leave set this to zero. + + +Once this is completed on your solochain, the same will need to also be executed on Hyperbridge. In similar fashion you can log the initial consensus of your solochain and [create an issue on our github](https://github.com/polytope-labs/hyperbridge/issues/new) to be added to the Hyperbridge testnet. On Hyperbridge mainnet, you'll instead submit a governance proposal for this. + +### Running the relayer + +Once all consensus states are set up, running the relayer is as easy as: + +```bash +docker run -v /path/to/consensus.toml:/root/consensus.toml polyopelabs/tesseract-consensus:latest --config=/root/consensus.toml log-consensus-state=KUSAMA-4009 +``` + +You will of course need to pair this with the [messaging relayer](/developers/network/relayer) which actually relays cross-chain messages. + +## Miscallenous + +Some random things to note + +### Slot Numbers + +The GRANDPA consensus client relies on digest items in the header to communicate the current slot number. These digest items must be identified as either `BABE` or `AURA`. Solochains using custom block production algorithms must include the `AURA` digest item to ensure compatibility with the GRANDPA consensus client for producing valid consensus proofs. + + diff --git a/docs/pages/protocol/consensus/casper-ffg.mdx b/docs/pages/protocol/consensus/casper-ffg.mdx index d60514ce0..34ac84951 100644 --- a/docs/pages/protocol/consensus/casper-ffg.mdx +++ b/docs/pages/protocol/consensus/casper-ffg.mdx @@ -115,7 +115,7 @@ $$ L(x) = \sum^{n-1}_{i = 0} \mathcal{L}_i(x) $$ -This allows us create a KZG commitment to this polynomial $\textmd{g}^{L(s)}$ as part of the KZG set up ceremony. Since we know that $L(x_i) - \mathcal{L}_i(x_i) = 0$, thus the prover can can compute a KZG proof for the $x_i$-th coordinate using the quotient. +This allows us create a KZG commitment to this polynomial $\textmd{g}^{L(s)}$ as part of the KZG set up ceremony. Since we know that $L(x_i) - \mathcal{L}_i(x_i) = 0$, thus the prover can compute a KZG proof for the $x_i$-th coordinate using the quotient. $$ \psi(x) = \frac{L(x) - \mathcal{L}_i(x_i)}{(x - x_i)} diff --git a/docs/pages/protocol/consensus/sync-committee.mdx b/docs/pages/protocol/consensus/sync-committee.mdx index 58a91b7bc..7b91fbf8c 100644 --- a/docs/pages/protocol/consensus/sync-committee.mdx +++ b/docs/pages/protocol/consensus/sync-committee.mdx @@ -10,7 +10,7 @@ import Algorithm from '../../../components/Algorithm'; This technical specification assumes that you’re already aware of [the sync committee protocol](https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/beacon-chain.md#introduction) introduced in altair, the first hard fork of the ethereum beacon chain. If not, tl;dr: The original attestation protocol unfortunately did not include succint BLS public key aggregation, which would’ve made it cheap to verify by light clients given that there are now almost [500k authorities](https://beaconscan.com/) actively validating blocks on the beacon chain. -This hypothetical succint BLS public key aggreation scheme, would’ve allowed us to verify the Casper FFG attestation protocol directly by aggregating all 500k validators’ public keys into a smaller set of BLS public keys. But unfortunately, it doesn’t exist. +This hypothetical succicnt BLS public key aggregation scheme, would’ve allowed us to verify the Casper FFG attestation protocol directly by aggregating all 500k validators’ public keys into a smaller set of BLS public keys. But unfortunately, it doesn’t exist. Some napkin math reveals: diff --git a/docs/public/add_parachain.png b/docs/public/add_parachain.png new file mode 100644 index 0000000000000000000000000000000000000000..8f2c5e0c379759b5206ff3ed8988889caee4123b GIT binary patch literal 130774 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 Sl6E-Y=ZUO}OtF-a|NjHA;OGGW literal 0 HcmV?d00001 diff --git a/docs/public/add_state_machine.png b/docs/public/add_state_machine.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4f26eac842bf2b68e9212f67c1f13430ec3516 GIT binary patch literal 145108 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≤P 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 z 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%0A=4&@9wD2#w2dpU7eOxlgGk~4 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 literal 0 HcmV?d00001 diff --git a/docs/public/grnp_init.png b/docs/public/grnp_init.png new file mode 100644 index 0000000000000000000000000000000000000000..e734cc6d871c3b476f32e415c4a0d872f21f03c7 GIT binary patch literal 170463 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 nCxU6u5+}mBr}Y0-;Z literal 0 HcmV?d00001 diff --git a/docs/vocs.config.tsx b/docs/vocs.config.tsx index e2e96b111..5ea7f7b14 100644 --- a/docs/vocs.config.tsx +++ b/docs/vocs.config.tsx @@ -337,7 +337,7 @@ export default defineConfig({ link: "/developers/evm/getting-started", }, { - text: "Dispatching", + text: "Dispatching Messages", link: "/developers/evm/dispatching", }, { @@ -345,7 +345,7 @@ export default defineConfig({ link: "/developers/evm/fees", }, { - text: "Receiving", + text: "Receiving Messages", link: "/developers/evm/receiving", }, { @@ -353,11 +353,11 @@ export default defineConfig({ collapsed: false, items: [ { - text: "Mainnet Addresses", + text: "Mainnet", link: "/developers/evm/contracts/mainnet", }, { - text: "Testnet Addresses", + text: "Testnet", link: "/developers/evm/contracts/testnet", }, ], @@ -368,14 +368,46 @@ export default defineConfig({ text: "Polkadot Sdk", collapsed: true, items: [ + { + text: "Getting Started", + link: "/developers/polkadot/getting-started", + }, + { text: "Pallet ISMP", - link: "/developers/polkadot/integration", + link: "/developers/polkadot/pallet-ismp", + items: [ + { + text: "Runtime API", + link: "/developers/polkadot/pallet-ismp-runtime-api", + }, + { + text: "RPC Interface", + link: "/developers/polkadot/pallet-ismp-rpc", + }, + ] }, + { text: "Parachains", link: "/developers/polkadot/parachains", + items: [ + { + text: "Runtime API", + link: "/developers/polkadot/ismp-parachain-runtime-api", + }, + { + text: "Inherent Provider", + link: "/developers/polkadot/ismp-parachain-inherent", + }, + ] + }, + + + { + text: "Solochains (GRANDPA)", + link: "/developers/polkadot/solochains", }, // { @@ -384,13 +416,8 @@ export default defineConfig({ // }, { - text: "ISMP Modules", - link: "/developers/polkadot/modules", - }, - - { - text: "RPC Interface", - link: "/developers/polkadot/rpc", + text: "Dispatching Messages", + link: "/developers/polkadot/delivery", }, { @@ -399,8 +426,8 @@ export default defineConfig({ }, { - text: "Message Delivery", - link: "/developers/polkadot/delivery", + text: "Receiving Messages", + link: "/developers/polkadot/modules", }, { From 31dbe4e6a60431903c0fba61642d72ea32edaf11 Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Thu, 21 Nov 2024 15:42:33 +0100 Subject: [PATCH 07/17] fix broken links --- docs/pages/developers/index.mdx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/pages/developers/index.mdx b/docs/pages/developers/index.mdx index ee204a600..ca0560931 100644 --- a/docs/pages/developers/index.mdx +++ b/docs/pages/developers/index.mdx @@ -11,18 +11,17 @@ Hyperbridge is a fully chain-agnostic interoperability protocol that enables dev If you're new to Hyperbridge and its workings, we suggest starting with the [Hyperbridge Protocol Specification](/protocol). After gaining a basic understanding, you can delve into the [explore section](/developers/explore/) to discover the protocol's main components. Once familiar, you can begin creating your own applications using the Hyperbridge SDK, which we offer for various onchain execution environments. - ## Solidity SDK We provide a Solidity SDK that allows your solidity smart contracts not only send and receive cross-chain messages through Hyperbridge, but make cross-chain storage queries. This SDK is designed to be easy to use and provides a simple interface for interacting with the Hyperbridge protocol. Jump into the [Solidity SDK section](/developers/evm/getting-started) to get started. ## Polkadot SDK -We provide the ISMP SDK that allows substrate-based chains to send and receive cross-chain messages through Hyperbridge. This SDK augments the existing substrate runtime with the ability to send and receive cross-chain messages, make cross-chain storage queries, and more. Jump into the [Polkadot SDK section](/developers/polkadot/integration) to get started. +We provide the ISMP SDK that allows substrate-based chains to send and receive cross-chain messages through Hyperbridge. This SDK augments the existing substrate runtime with the ability to send and receive cross-chain messages, make cross-chain storage queries, and more. Jump into the [Polkadot SDK section](/developers/polkadot/getting-started) to get started. ## Network Operators Network operators are responsible for running the Hyperbridge network. They are responsible for relaying messages and producing blocks. Network operators are incentivized to run the network by receiving fees from users who wish to perform cross-chain operations. - - [Node Operators](/developers/network/node) - - [Relayers](/developers/network/relayer) +- [Node Operators](/developers/network/node) +- [Relayers](/developers/network/relayer) From ff7d00996f184be8f5f6a4a3e6eeddc204970d19 Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Thu, 21 Nov 2024 15:49:20 +0100 Subject: [PATCH 08/17] fix broken links --- docs/pages/developers/network/relayer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/developers/network/relayer.mdx b/docs/pages/developers/network/relayer.mdx index 54922645f..f0c331aec 100644 --- a/docs/pages/developers/network/relayer.mdx +++ b/docs/pages/developers/network/relayer.mdx @@ -280,7 +280,7 @@ You can obtain the required etherscan API key by following [this guide](https:// ### Contract addresses -You can find the up-to-date contract addresses for the `Handler` & `IsmpHost` contracts [here](/developers/evm/contract-addresses#gargantua-v2-paseo) +You can find the up-to-date contract addresses for the `Handler` & `IsmpHost` contracts for [mainnet](developers/evm/contracts/mainnet) and [testnet](developers/evm/contracts/testnet) ## Withdrawing Fees From ac557059fd30d2aa40056ff575051008b71609ce Mon Sep 17 00:00:00 2001 From: David Salami Date: Thu, 21 Nov 2024 17:11:35 +0000 Subject: [PATCH 09/17] allow initializing clients with a height at which to start querying messages --- Cargo.lock | 2 +- docs/pages/developers/network/relayer.mdx | 63 ++++++++++++++++++++++- tesseract/evm/src/lib.rs | 15 ++++-- tesseract/integration-test/src/lib.rs | 6 +-- tesseract/messaging/src/lib.rs | 40 ++++++++------ tesseract/primitives/src/config.rs | 2 + tesseract/relayer/Cargo.toml | 2 +- tesseract/substrate/src/lib.rs | 25 ++++++--- tesseract/substrate/src/provider.rs | 19 ++++--- 9 files changed, 132 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 593b9df1d..b61bb213d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23735,7 +23735,7 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "tesseract" -version = "1.0.1" +version = "1.0.2" dependencies = [ "anyhow", "async-trait", diff --git a/docs/pages/developers/network/relayer.mdx b/docs/pages/developers/network/relayer.mdx index f0c331aec..135467fef 100644 --- a/docs/pages/developers/network/relayer.mdx +++ b/docs/pages/developers/network/relayer.mdx @@ -84,7 +84,7 @@ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ### Clone the repo -Download a local copy of the repo and checkout the latest release version. +Download a local copy of the repo and checkout the latest release version. ```bash # fetch the latest tag from docker hub @@ -163,6 +163,13 @@ state_machine = "KUSAMA-4009" rpc_ws = "ws://127.0.0.1:9944" # example endpoint # Sets the maximum size of an rpc request or response in bytes defaults to 150mb max_rpc_payload_size = 150000000 +# (Optional) initial height +# This sets the height at which to start querying messages, +# This exists for testing and development, wrong use can cause the rpc to be overloaded with queries +# initial_height = 1000 + +# (Optional) Frequency with which to query the chain for new state machine updates, +poll_interval = 10 # Relayer config, required [relayer] @@ -185,6 +192,10 @@ delivery_endpoints = [ "EVM-84532", "EVM-97" ] +# (Optional)Disable fee accumulation task +# If this value is true, fee accumulation will be disabled. +# This should only be enabled when running a private relayer +disable_fee_accumulation = false # Here you'll declare a new chain entry for every chain you want to support. # eg ethereum @@ -255,6 +266,13 @@ gas_price_buffer = 1 # client_type = Erigon # If this field is not set, the default is Geth client_type = "Geth" +# (Optional) initial height +# This sets the height at which to start querying messages, +# This exists for testing and development, wrong use can cause the rpc to be overloaded with queries +# initial_height = 1000 + +# (Optional) Frequency with which to query the chain for new state machine updates +poll_interval = 10 [substrate] type = "substrate" @@ -272,6 +290,12 @@ max_rpc_payload_size = 150000000 # 150MB consensus_state_id = "PARA" # hex-encoded private key for the relayer account on this chain signer = "" +# (Optional) Frequency with which to query the chain for new state machine updates, +poll_interval = 10 +# (Optional) initial height +# This sets the height at which to start querying messages, +# This exists for testing and development, wrong use can cause the rpc to be overloaded with queries +# initial_height = 1000 ``` It is optional to provide the configuration option for any of the connected chains, The only consequence is your relayer will not deliver requests from the ommitted chain as it has no way of querying the associated fees for requests originating from this chain. @@ -330,78 +354,115 @@ automated conterparts. List of commonly seen errors with their explanation and tips on how to fix them. +The error below means your relayer account balance on the destination chain is insufficient to submit a transaction
+**Fix**: Fund your relayer account with the native gas token ``` ERROR tesseract_messaging: Failed to submit transaction to Evm(42161): Middleware error: (code: -32000, message: insufficient funds for gas * price + value: address have 0 want 323200000000000, data: None ``` +The error below signifies that the `debugTraceCall` call for a message failed, this could be that the message execution failed or the rpc does not provide debug trace logs
+**Fix**: Check with your rpc and ensure they provide debug trace logs for the `debugTraceCall` RPC, in the case where message execution fails, the error can be safely ignored ``` ERROR tesseract_evm::provider: Debug trace frame not found! ``` +This error signifies misconfiured rpc endpoints or `ismp_host` addresses.
+**Fix**: Check your config file to ensure all `ismp_host` addresses and rpc endpoints are correctlt configured ``` ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(8453): Invalid name: please ensure the contract and method you're calling exist! failed to decode empty bytes. if you're using jsonrpc this is likely due to jsonrpc returning `0x` in case contract or method don't exist ``` +The error below means the rpc endpoint failed to return a valid response for a block header query
+**Fix**: Check that your rpc node is an archive node and full synced ``` ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error encountered while querying state_machine_update_time Middleware error: (code: -32000, message: header not found, data: None)") ``` +This error means the relayer is trying to submit a duplicate transaction to hyperbridge
+**Fix**: You can safely ignore ``` ERROR tesseract_messaging: Failed to submit transaction to Polkadot(3367): Failed to submit unsigned extrinsic ``` +This error means your rpc endpoint does not provide the `debug_traceCall` method
+**Fix**: If running a private rpc node ensure the `debug` namespace is enabled, else contact your rpc provider ``` ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(56): Middleware error: (code: -32601, message: The method debug_traceCall does not exist/is not available, data: None) ``` +This is usually caused by a network issue or invalid response from the rpc node
+**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available ``` ERROR tesseract: Error waiting for challenge period in Evm(56) - Polkadot(3367) update stream ``` +This error means the relayer is tried to submit a duplicate transaction
+**Fix**: You can safely ignore ``` ERROR tesseract_messaging: Failed to submit transaction to Evm(10): Transaction reverted ``` +This means the your rpc provider limits access to some endpoints
+**Fix**: Upgrade your rpc to a premium plan ``` ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(100): Middleware error: (code: -32053, message: API key is not allowed to access method, data: None) ``` +This is usually caused by a network issue or invalid response from the rpc node
+**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available ``` ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error fetching latest block height on Evm(56) JsonRpcClientError(MiddlewareError(Middleware((code: -32603, message: request failed or timed out, data: None))))") ``` +This is usually caused by a network issue or invalid response from the rpc node
+**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available ``` ERROR tesseract_evm::provider: Error while querying events in range 43812202..43812204 from Evm(56): Middleware error: (code: -32603, message: request failed or timed out, data: None) ``` +This is usually caused by a network issue or invalid response from the rpc node
+**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available ``` ERROR tesseract_evm::provider: Error while querying events in range 43816145..43816147 from Evm(56): Middleware error: (code: -32603, message: internal server error, data: None) ``` +This error signifies misconfiured rpc endpoints or `ismp_host` addresses.
+**Fix**: Check your config file to ensure all `ismp_host` addresses and rpc endpoints are correctlt configured ``` ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error encountered while querying state_machine_update_time Invalid name: please ensure the contract and method you're calling exist! failed to decode empty bytes. if you're using jsonrpc this is likely due to jsonrpc returning `0x` in case contract or method don't exist") ``` +This is usually caused by a network issue or invalid response from the rpc node
+**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available ``` ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(1): Middleware error: Deserialization Error: response must be either a success/error or notification object at line 1 column 237. Response: {"jsonrpc":"2.0","id":31327,"result":null,"error":{"code":-32000,"message":"tracing failed: insufficient funds for gas * price + value: address

have 411893340457544628 want 525945389500000000"}} ``` +The error below means the relayer encountered some error while accumulating fees on hyperbridge
+**Fix**: Try using the fee accumulation CLI to complete the process ``` ERROR tesseract_messaging: Error accummulating some fees, receipts have been stored in the db, you can try again manually ``` +This is caused by an invalid response from the rpc node
+**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available ``` ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error fetching latest block height on Evm(56) JsonRpcClientError(MiddlewareError(Middleware(Deserialization Error: expected value at line 1 column 1. Response: \r\n504 Gateway Time-out\r\n\r\n

504 Gateway Time-out

\r\n\r\n\r\n)))") ``` +This is caused by an invalid response from the rpc node
+**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available ``` ERROR tesseract_evm::provider: Error while querying events in range 43876757..43876796 from Evm(56): Middleware error: Deserialization Error: expected value at line 1 column 1. Response: ``` +This error signifies that your rpc node is not archive
+**Fix**: Upgrade your rpc node to an archive node ``` ERROR tesseract_messaging: Error while handling EVM-56 on Polkadot(3367): Middleware error: (code: -32000, message: missing trie node baf71a6410ba54b32b02056415efe6b22060c20aff9c399d9b6308d0a88c3d09 (path ) state 0xbaf71a6410ba54b32b02056415efe6b22060c20aff9c399d9b6308d0a88c3d09 is not available, data: None) ``` +This error can be safely ignored ``` ERROR tesseract::cli: Disconnected from telemetry with: Text( ``` diff --git a/tesseract/evm/src/lib.rs b/tesseract/evm/src/lib.rs index c57d723d0..93f7bb14e 100644 --- a/tesseract/evm/src/lib.rs +++ b/tesseract/evm/src/lib.rs @@ -81,6 +81,8 @@ pub struct EvmConfig { pub gas_price_buffer: Option, /// The client type the rpc is running, defaults to Geth pub client_type: Option, + /// Initial height from which to start querying messages + pub initial_height: Option, } impl EvmConfig { @@ -110,6 +112,7 @@ impl Default for EvmConfig { poll_interval: Default::default(), gas_price_buffer: Default::default(), client_type: Default::default(), + initial_height: Default::default(), } } } @@ -174,7 +177,11 @@ impl EvmClient { consensus_state_id }; - let latest_height = client.get_block_number().await?.as_u64(); + let latest_height = if let Some(initial_height) = config.initial_height { + initial_height + } else { + client.get_block_number().await?.as_u64() + }; let mut partial_client = Self { client, signer, @@ -249,8 +256,10 @@ impl EvmClient { &mut self, counterparty: Arc, ) -> Result<(), anyhow::Error> { - self.initial_height = - counterparty.query_latest_height(self.state_machine_id()).await?.into(); + if self.config.initial_height.is_none() { + self.initial_height = + counterparty.query_latest_height(self.state_machine_id()).await?.into(); + } log::info!("Initialized height for {:?} at {}", self.state_machine, self.initial_height); diff --git a/tesseract/integration-test/src/lib.rs b/tesseract/integration-test/src/lib.rs index d9f9b684c..3e30adc60 100644 --- a/tesseract/integration-test/src/lib.rs +++ b/tesseract/integration-test/src/lib.rs @@ -97,7 +97,7 @@ async fn relay_get_response_message( .await { tx_res_hash = tx_hash; - break + break; } let get_resp_event = chain_a_client @@ -131,7 +131,7 @@ async fn create_clients( signer: Some( "0xe5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a".to_string(), ), - latest_height: None, + initial_height: None, max_concurent_queries: None, }; @@ -144,7 +144,7 @@ async fn create_clients( signer: Some( "0xe5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a".to_string(), ), - latest_height: None, + initial_height: None, max_concurent_queries: None, }; diff --git a/tesseract/messaging/src/lib.rs b/tesseract/messaging/src/lib.rs index 896102f8b..e84ca3231 100644 --- a/tesseract/messaging/src/lib.rs +++ b/tesseract/messaging/src/lib.rs @@ -102,10 +102,14 @@ where chain_b, hyperbridge, tx_payment, - config, + config.clone(), coprocessor, client_map, - Some(sender), + if !config.disable_fee_accumulation.unwrap_or_default() { + Some(sender) + } else { + None + }, None, ) .await; @@ -117,21 +121,23 @@ where // Fee accumulation background task { - let hyperbridge = hyperbridge.clone(); - let dest = chain_b.clone(); - let client_map = client_map.clone(); - let tx_payment = tx_payment.clone(); - let name = format!("fee-acc-{}-{}", dest.name(), hyperbridge.name()); - task_manager.spawn_essential_handle().spawn_blocking( - Box::leak(Box::new(name.clone())), - "fees", - async move { - let res = - fee_accumulation(receiver, dest, hyperbridge, client_map, tx_payment).await; - tracing::error!("{name} terminated with result {res:?}"); - } - .boxed(), - ); + if !config.disable_fee_accumulation.unwrap_or_default() { + let hyperbridge = hyperbridge.clone(); + let dest = chain_b.clone(); + let client_map = client_map.clone(); + let tx_payment = tx_payment.clone(); + let name = format!("fee-acc-{}-{}", dest.name(), hyperbridge.name()); + task_manager.spawn_essential_handle().spawn_blocking( + Box::leak(Box::new(name.clone())), + "fees", + async move { + let res = + fee_accumulation(receiver, dest, hyperbridge, client_map, tx_payment).await; + tracing::error!("{name} terminated with result {res:?}"); + } + .boxed(), + ); + } } { diff --git a/tesseract/primitives/src/config.rs b/tesseract/primitives/src/config.rs index b650f2a36..6c0db5880 100644 --- a/tesseract/primitives/src/config.rs +++ b/tesseract/primitives/src/config.rs @@ -37,4 +37,6 @@ pub struct RelayerConfig { pub deliver_failed: Option, /// Start fisherman task? pub fisherman: Option, + /// Should the relayer run the fee accumulation task? + pub disable_fee_accumulation: Option, } diff --git a/tesseract/relayer/Cargo.toml b/tesseract/relayer/Cargo.toml index a08a4bed9..f0be3e009 100644 --- a/tesseract/relayer/Cargo.toml +++ b/tesseract/relayer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tesseract" -version = "1.0.1" +version = "1.0.2" edition = "2021" description = "Chain agnostic relayer implementation for Hyperbridge" authors = ["Polytope Labs "] diff --git a/tesseract/substrate/src/lib.rs b/tesseract/substrate/src/lib.rs index 68d0c460e..ba9e0b4fd 100644 --- a/tesseract/substrate/src/lib.rs +++ b/tesseract/substrate/src/lib.rs @@ -61,10 +61,12 @@ pub struct SubstrateConfig { pub max_rpc_payload_size: Option, /// Relayer account seed pub signer: Option, - /// Latest state machine height - pub latest_height: Option, + /// Initial height from which to start querying messages + pub initial_height: Option, /// Max concurrent rpc requests allowed pub max_concurent_queries: Option, + /// Frequency at which state machine updates will be queried in seconds + pub poll_interval: Option, } /// Core substrate client. @@ -81,7 +83,7 @@ pub struct SubstrateClient { pub signer: sr25519::Pair, /// Public Address pub address: Vec, - /// Latest state machine height. + /// Initial height from which to start querying messages initial_height: u64, /// Max concurrent rpc requests allowed max_concurent_queries: Option, @@ -91,6 +93,8 @@ pub struct SubstrateClient { Option>>, >, >, + /// Substrate config + config: SubstrateConfig, } impl SubstrateClient @@ -108,8 +112,8 @@ where subxt_utils::client::ws_client::(&config.rpc_ws, max_rpc_payload_size).await?; // If latest height of the state machine on the counterparty is not provided in config // Set it to the latest parachain height - let latest_height = if let Some(latest_height) = config.latest_height { - latest_height + let initial_height = if let Some(initial_height) = config.initial_height { + initial_height } else { client .rpc() @@ -121,12 +125,13 @@ where }; let bytes = config .signer + .clone() .and_then(|seed| from_hex(&seed).ok()) .unwrap_or(H256::random().0.to_vec()); let signer = sr25519::Pair::from_seed_slice(&bytes)?; let mut consensus_state_id: ConsensusStateId = Default::default(); consensus_state_id - .copy_from_slice(config.consensus_state_id.unwrap_or("PARA".into()).as_bytes()); + .copy_from_slice(config.consensus_state_id.clone().unwrap_or("PARA".into()).as_bytes()); let address = signer.public().0.to_vec(); Ok(Self { client, @@ -135,9 +140,10 @@ where hashing: config.hashing.clone().unwrap_or(HashAlgorithm::Keccak), signer, address, - initial_height: latest_height, + initial_height, max_concurent_queries: config.max_concurent_queries, state_machine_update_sender: Arc::new(tokio::sync::Mutex::new(None)), + config, }) } @@ -154,7 +160,9 @@ where counterparty: Arc, ) -> Result<(), anyhow::Error> { let name = counterparty.name(); - self.initial_height = self.query_finalized_height().await?.into(); + if self.config.initial_height.is_none() { + self.initial_height = self.query_finalized_height().await?.into(); + } log::info!( "Initialized height for {:?}->{name} at {}", self.state_machine, @@ -192,6 +200,7 @@ impl Clone for SubstrateClient { initial_height: self.initial_height, max_concurent_queries: self.max_concurent_queries, state_machine_update_sender: self.state_machine_update_sender.clone(), + config: self.config.clone(), } } } diff --git a/tesseract/substrate/src/provider.rs b/tesseract/substrate/src/provider.rs index 7b53311a0..742f6f197 100644 --- a/tesseract/substrate/src/provider.rs +++ b/tesseract/substrate/src/provider.rs @@ -515,8 +515,9 @@ where tokio::task::spawn(async move { let mut latest_height = latest_height; let state_machine = client.state_machine; + let poll_interval = client.config.poll_interval.unwrap_or(10); loop { - tokio::time::sleep(Duration::from_secs(10)).await; + tokio::time::sleep(Duration::from_secs(poll_interval)).await; let header = match client.client.rpc().finalized_head().await { Ok(hash) => match client.client.rpc().header(Some(hash)).await { Ok(Some(header)) => header, @@ -665,8 +666,8 @@ where let compressed_call_len = zstd_safe::compress(&mut buffer[..], &encoded_call, 3) .map_err(|_| anyhow!("Call compression failed"))?; // If compression saving is less than 15% submit the uncompressed call - if (uncompressed_len.saturating_sub(compressed_call_len) * 100 / uncompressed_len) < - 20usize + if (uncompressed_len.saturating_sub(compressed_call_len) * 100 / uncompressed_len) + < 20usize { log::trace!(target: "tesseract", "Submitting uncompressed call: compressed:{}kb, uncompressed:{}kb", compressed_call_len / 1000, uncompressed_len / 1000); futs.push(send_unsigned_extrinsic(&self.client, extrinsic, false)) @@ -700,7 +701,7 @@ where }; for msg in messages { match msg { - Message::Request(req_msg) => + Message::Request(req_msg) => { for post in req_msg.requests { let req = Request::Post(post); let commitment = hash_request::(&req); @@ -717,11 +718,12 @@ where results.push(tx_receipt); } - }, + } + }, Message::Response(ResponseMessage { datagram: RequestResponse::Response(resp), .. - }) => + }) => { for res in resp { let commitment = hash_response::(&res); let request_commitment = hash_request::(&res.request()); @@ -739,7 +741,8 @@ where results.push(tx_receipt); } - }, + } + }, _ => {}, } } @@ -829,7 +832,7 @@ where let key = fisherman_storage_key(self.address()); let raw_params = self.client.storage().at_latest().await?.fetch_raw(&key).await?; if raw_params.is_none() { - return Ok(()) + return Ok(()); } let signer = InMemorySigner { From c42e0beee487490587cb53909dd444bbcee300a6 Mon Sep 17 00:00:00 2001 From: David Salami Date: Thu, 21 Nov 2024 17:29:54 +0000 Subject: [PATCH 10/17] fix adding new contract instances in token governor --- .../ismp/pallets/token-governor/src/impls.rs | 4 ++-- parachain/runtimes/gargantua/src/lib.rs | 2 +- parachain/runtimes/nexus/src/lib.rs | 19 ++++++++++--------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/modules/ismp/pallets/token-governor/src/impls.rs b/modules/ismp/pallets/token-governor/src/impls.rs index 70f4fc4c3..123ea8682 100644 --- a/modules/ismp/pallets/token-governor/src/impls.rs +++ b/modules/ismp/pallets/token-governor/src/impls.rs @@ -330,13 +330,13 @@ where ContractInstance { chain: state_machine, module_id: address }.into(); for (chain, GatewayParams { address, .. }) in TokenGatewayParams::::iter() { - if chain == state_machine { + if chain == state_machine || chain.is_substrate() { continue; } dispatcher .dispatch_request( DispatchRequest::Post(DispatchPost { - dest: state_machine.clone(), + dest: chain.clone(), from: PALLET_ID.to_vec(), to: address.as_bytes().to_vec(), timeout: 0, diff --git a/parachain/runtimes/gargantua/src/lib.rs b/parachain/runtimes/gargantua/src/lib.rs index e9bd1e9f1..1b315f89f 100644 --- a/parachain/runtimes/gargantua/src/lib.rs +++ b/parachain/runtimes/gargantua/src/lib.rs @@ -233,7 +233,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("gargantua"), impl_name: create_runtime_str!("gargantua"), authoring_version: 1, - spec_version: 1300, + spec_version: 1400, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/parachain/runtimes/nexus/src/lib.rs b/parachain/runtimes/nexus/src/lib.rs index fb871dc3a..97ea81001 100644 --- a/parachain/runtimes/nexus/src/lib.rs +++ b/parachain/runtimes/nexus/src/lib.rs @@ -217,7 +217,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("nexus"), impl_name: create_runtime_str!("nexus"), authoring_version: 1, - spec_version: 1800, + spec_version: 1900, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, @@ -748,19 +748,20 @@ impl InstanceFilter for ProxyType { fn filter(&self, c: &RuntimeCall) -> bool { match self { ProxyType::Any => true, - ProxyType::NonTransfer => - !matches!(c, RuntimeCall::Balances { .. } | RuntimeCall::Assets { .. }), + ProxyType::NonTransfer => { + !matches!(c, RuntimeCall::Balances { .. } | RuntimeCall::Assets { .. }) + }, ProxyType::CancelProxy => matches!( c, - RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } + RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) + | RuntimeCall::Utility { .. } + | RuntimeCall::Multisig { .. } ), ProxyType::Collator => matches!( c, - RuntimeCall::CollatorSelection { .. } | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } + RuntimeCall::CollatorSelection { .. } + | RuntimeCall::Utility { .. } + | RuntimeCall::Multisig { .. } ), } } From 12053282d5d9ed1075e43ea926ee49f6beea35f7 Mon Sep 17 00:00:00 2001 From: David Salami Date: Fri, 22 Nov 2024 08:15:46 +0000 Subject: [PATCH 11/17] fix tesseract tests --- tesseract/integration-test/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tesseract/integration-test/src/lib.rs b/tesseract/integration-test/src/lib.rs index 3e30adc60..3bb309849 100644 --- a/tesseract/integration-test/src/lib.rs +++ b/tesseract/integration-test/src/lib.rs @@ -133,6 +133,7 @@ async fn create_clients( ), initial_height: None, max_concurent_queries: None, + poll_interval: None, }; let chain_b_config = SubstrateConfig { @@ -146,6 +147,7 @@ async fn create_clients( ), initial_height: None, max_concurent_queries: None, + poll_interval: None, }; // setup state machines From 98a7255b5ada88476087af15b51f8b34fa9c50e4 Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Fri, 22 Nov 2024 14:38:31 +0100 Subject: [PATCH 12/17] continue to improve docs --- docs/pages/developers/evm/fees.mdx | 25 ++- docs/pages/developers/evm/getting-started.mdx | 4 +- docs/pages/developers/network/node.mdx | 6 +- docs/pages/developers/network/relayer.mdx | 188 ++++++++++++------ .../developers/polkadot/getting-started.mdx | 24 +-- .../pages/developers/polkadot/pallet-ismp.mdx | 4 - docs/pages/developers/polkadot/solochains.mdx | 22 +- 7 files changed, 175 insertions(+), 98 deletions(-) diff --git a/docs/pages/developers/evm/fees.mdx b/docs/pages/developers/evm/fees.mdx index b2046769c..540c65f4f 100644 --- a/docs/pages/developers/evm/fees.mdx +++ b/docs/pages/developers/evm/fees.mdx @@ -21,7 +21,7 @@ So when you use the native token to pay for fees, The `IDispatcher` actually swa So to quote the amount that's required for fees, you will need to call the following methods **offchain**: ```solidity showLineNumbers -uint256 perByteFee = IDispatcher(host()).perByteFee(); +uint256 perByteFee = IDispatcher(host()).perByteFee(request.dest); uint256 protocolFees = request.body.length * perByteFee; uint256 fees = protocolFees + request.fee; address[] memory path = new address[](2); @@ -36,6 +36,12 @@ Alternatively If your module extends the `BaseIsmpModule`, then you already have uint256 nativeCost = YourModule(moduleAddress).quoteNative(request); ``` +Now you can simply dispatch the request while paying with the native token + +```solidity showLineNumbers +IDispatcher(host()).dispatch{value: nativeCost}(request); +``` + :::danger[Please Note] It would be prudent to add at least 0.5% slippage to this quoted amount to prevent failed transactions. ::: @@ -59,7 +65,7 @@ Now that your contract has approved the `host`. You can now call dispatch withou You can estimate the cost of a request through ```solidity showLineNumbers -uint256 perByteFee = IDispatcher(host()).perByteFee(); +uint256 perByteFee = IDispatcher(host()).perByteFee(request.dest); uint256 protocolFees = request.body.length * perByteFee; uint256 fees = protocolFees + request.fee; ``` @@ -70,9 +76,15 @@ Alternatively If your module extends the `BaseIsmpModule`, then a convenient met uint256 feeTokenCost = YourModule(moduleAddress).quote(request); ``` -:::danger[Please Note] -It might be prudent to withdraw this fee from your user's account before dispatching messages. -::: +Now you can simply dispatch the request without the `msg.value`. If this request is the side-effect of a user transaction, then you should withdraw the `feeToken` from the user's account before dispatching. + +```solidity showLineNumbers +using SafeERC20 for IERC20; + +address feeToken = IDispatcher(host()).feeToken(); +IERC20(feeToken).safeTransferFrom(msg.sender, address(this), feeTokenCost); +IDispatcher(host()).dispatch(request); +``` ## Relayer Fees @@ -94,7 +106,8 @@ The fee consists of three parts: Calculating the relayer fee can be expressed as follows: ``` -relayer_fee = gas_to_usd(destination_gas_price * (150_000 + receiving_module_gas_cost)) + relayer_tip +destination_gas_cost = 150_000 + receiving_module_gas_cost +relayer_fee = gas_price_to_usd(destination_gas_price * destination_gas_cost) + relayer_tip_usd ``` diff --git a/docs/pages/developers/evm/getting-started.mdx b/docs/pages/developers/evm/getting-started.mdx index a29248704..e0ec9d339 100644 --- a/docs/pages/developers/evm/getting-started.mdx +++ b/docs/pages/developers/evm/getting-started.mdx @@ -1,10 +1,10 @@ --- -title: Getting Started +title: Solidity Sdk description: Hyperbridge is built on a cross-chain interoperability protocol referred to as the [Interoperable State Machine Protocol](/protocol/ismp). This protocol implementation lives in the [Hyperbridge Monorepo](https://github.com/polytope-labs/hyperbridge/tree/main/evm). But it's interfaces are outlined in the [ismp-solidity](https://github.com/polytope-labs/ismp-solidity) repository. --- -# ISMP Solidity +# Solidity SDK Hyperbridge is built on a cross-chain interoperability protocol referred to as the [Interoperable State Machine Protocol](/protocol/ismp). This protocol implementation lives in the [Hyperbridge Monorepo](https://github.com/polytope-labs/hyperbridge/tree/main/evm). But it's interfaces are outlined in the [ismp-solidity](https://github.com/polytope-labs/ismp-solidity) repository. diff --git a/docs/pages/developers/network/node.mdx b/docs/pages/developers/network/node.mdx index 2732b9f41..3f3772e8f 100644 --- a/docs/pages/developers/network/node.mdx +++ b/docs/pages/developers/network/node.mdx @@ -24,7 +24,8 @@ docker pull polytopelabs/hyperbridge:latest You can install a prebuilt binary for the hyperbridge node with the following bash script ```bash -wget -q --show-progress https://github.com/polytope-labs/hyperbridge/releases/download/hyperbridge-v0.5.0/hyperbridge-x86_64-unknown-linux-gnu.tar.gz +LATEST_TAG=$(curl -s https://hub.docker.com/v2/repositories/polytopelabs/hyperbridge/tags\?page_size\=1\&page\=2 | jq -r '.results[0].name') +wget -q --show-progress https://github.com/polytope-labs/hyperbridge/releases/download/hyperbridge-$LATEST_TAG/hyperbridge-x86_64-unknown-linux-gnu.tar.gz tar -xvzf hyperbridge-x86_64-unknown-linux-gnu.tar.gz # copy to $PATH cp hyperbridge-x86_64-unknown-linux-gnu/hyperbridge $HOME/.local/bin/ @@ -33,7 +34,8 @@ cp hyperbridge-x86_64-unknown-linux-gnu/hyperbridge $HOME/.local/bin/ or a 1-liner shell script ```bash -curl --proto '=https' --tlsv1.2 -LsSf https://github.com/polytope-labs/hyperbridge/releases/download/hyperbridge-v0.5.0/hyperbridge-installer.sh | sh +LATEST_TAG=$(curl -s https://hub.docker.com/v2/repositories/polytopelabs/hyperbridge/tags\?page_size\=1\&page\=2 | jq -r '.results[0].name') +curl --proto '=https' --tlsv1.2 -LsSf https://github.com/polytope-labs/hyperbridge/releases/download/hyperbridge-$LATEST_TAG/hyperbridge-installer.sh | sh ``` ## Building from source diff --git a/docs/pages/developers/network/relayer.mdx b/docs/pages/developers/network/relayer.mdx index 135467fef..05bf1b5ce 100644 --- a/docs/pages/developers/network/relayer.mdx +++ b/docs/pages/developers/network/relayer.mdx @@ -12,7 +12,8 @@ The Hyperbridge relayer (tesseract) can be obtained through a variety of ways. F You can install a prebuilt binary for the Tesseract relayer with the following bash script ```bash -wget -q --show-progress https://github.com/polytope-labs/hyperbridge/releases/download/tesseract-v0.3.3/tesseract-x86_64-unknown-linux-gnu.tar.gz +LATEST_TAG=$(curl -s https://hub.docker.com/v2/repositories/polytopelabs/tesseract/tags\?page_size\=1\&page\=2 | jq -r '.results[0].name') +wget -q --show-progress https://github.com/polytope-labs/hyperbridge/releases/download/tesseract-$LATEST_TAG/tesseract-x86_64-unknown-linux-gnu.tar.gz tar -xvzf tesseract-x86_64-unknown-linux-gnu.tar.gz # copy to $PATH cp tesseract-x86_64-unknown-linux-gnu/tesseract $HOME/.local/bin/ @@ -21,7 +22,8 @@ cp tesseract-x86_64-unknown-linux-gnu/tesseract $HOME/.local/bin/ or a 1-liner ```bash -curl --proto '=https' --tlsv1.2 -LsSf https://github.com/polytope-labs/hyperbridge/releases/download/tesseract-v0.3.3/tesseract-installer.sh | sh +LATEST_TAG=$(curl -s https://hub.docker.com/v2/repositories/polytopelabs/tesseract/tags\?page_size\=1\&page\=2 | jq -r '.results[0].name') +curl --proto '=https' --tlsv1.2 -LsSf https://github.com/polytope-labs/hyperbridge/releases/download/tesseract-$LATEST_TAG/tesseract-installer.sh | sh ``` ## Docker @@ -304,7 +306,7 @@ You can obtain the required etherscan API key by following [this guide](https:// ### Contract addresses -You can find the up-to-date contract addresses for the `Handler` & `IsmpHost` contracts for [mainnet](developers/evm/contracts/mainnet) and [testnet](developers/evm/contracts/testnet) +You can find the addresses for the `IsmpHost` contracts for [mainnet](developers/evm/contracts/mainnet) and [testnet](developers/evm/contracts/testnet) ## Withdrawing Fees @@ -354,115 +356,171 @@ automated conterparts. List of commonly seen errors with their explanation and tips on how to fix them. -The error below means your relayer account balance on the destination chain is insufficient to submit a transaction
-**Fix**: Fund your relayer account with the native gas token -``` + +### Insufficient funds for gas + +```bash ERROR tesseract_messaging: Failed to submit transaction to Evm(42161): Middleware error: (code: -32000, message: insufficient funds for gas * price + value: address have 0 want 323200000000000, data: None ``` -The error below signifies that the `debugTraceCall` call for a message failed, this could be that the message execution failed or the rpc does not provide debug trace logs
-**Fix**: Check with your rpc and ensure they provide debug trace logs for the `debugTraceCall` RPC, in the case where message execution fails, the error can be safely ignored -``` +This error means your relayer account balance on the destination chain is insufficient to submit a transaction
+ +:::success[How to Fix] +Fund your relayer account with the native gas token +::: + +### Debug trace frame not found! + +```bash ERROR tesseract_evm::provider: Debug trace frame not found! ``` +This error signifies that the `debug_TraceCall` call for a message failed, this could be that the message execution failed or the rpc does not provide debug trace logs
+:::success[How to Fix] +Check with your rpc and ensure they provide debug trace logs for the `debug_TraceCall` RPC, in the case where message +execution fails, the error can be safely ignored +::: -This error signifies misconfiured rpc endpoints or `ismp_host` addresses.
-**Fix**: Check your config file to ensure all `ismp_host` addresses and rpc endpoints are correctlt configured -``` + +### Please ensure the contract and method you're calling exist + +```bash ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(8453): Invalid name: please ensure the contract and method you're calling exist! failed to decode empty bytes. if you're using jsonrpc this is likely due to jsonrpc returning `0x` in case contract or method don't exist ``` -The error below means the rpc endpoint failed to return a valid response for a block header query
-**Fix**: Check that your rpc node is an archive node and full synced -``` +This error signifies misconfiured rpc endpoints or `ismp_host` addresses.
+:::success[How to Fix] +Check your config file to ensure all `ismp_host` addresses and rpc endpoints are correctly configured +::: + +### Error encountered while querying state_machine_update_time + +```bash ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error encountered while querying state_machine_update_time Middleware error: (code: -32000, message: header not found, data: None)") ``` -This error means the relayer is trying to submit a duplicate transaction to hyperbridge
-**Fix**: You can safely ignore -``` +This error means the rpc endpoint failed to return a valid response for a block header query
+:::success[How to Fix] +Check that your rpc node is an archive node and full synced +::: + +### Failed to submit unsigned extrinsic + +```bash ERROR tesseract_messaging: Failed to submit transaction to Polkadot(3367): Failed to submit unsigned extrinsic ``` -This error means your rpc endpoint does not provide the `debug_traceCall` method
-**Fix**: If running a private rpc node ensure the `debug` namespace is enabled, else contact your rpc provider -``` +This error means the relayer is trying to submit a duplicate transaction to hyperbridge
+:::success[How to Fix] +You can safely ignore +::: + +### The method debug_traceCall does not exist + +```bash ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(56): Middleware error: (code: -32601, message: The method debug_traceCall does not exist/is not available, data: None) ``` -This is usually caused by a network issue or invalid response from the rpc node
-**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available -``` +This error means your rpc endpoint does not provide the `debug_traceCall` method
+:::success[How to Fix] +If running a private rpc node ensure the `debug` namespace is enabled, otherwise contact your rpc provider +::: + +### Error waiting for challenge period + +```bash ERROR tesseract: Error waiting for challenge period in Evm(56) - Polkadot(3367) update stream ``` -This error means the relayer is tried to submit a duplicate transaction
-**Fix**: You can safely ignore -``` +This is usually caused by a network issue or invalid response from the rpc node
+:::success[How to Fix] +The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your +rpc nodes are highly available +::: + +### Failed to submit transaction to Evm(10): Transaction reverted + +```bash ERROR tesseract_messaging: Failed to submit transaction to Evm(10): Transaction reverted ``` -This means the your rpc provider limits access to some endpoints
-**Fix**: Upgrade your rpc to a premium plan -``` +This error means the relayer is tried to submit a duplicate transaction
+:::success[How to Fix] +You can safely ignore +::: + +### API key is not allowed to access method + +```bash ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(100): Middleware error: (code: -32053, message: API key is not allowed to access method, data: None) ``` -This is usually caused by a network issue or invalid response from the rpc node
-**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available -``` +This means the your rpc provider limits access to some endpoints
+:::success[How to Fix] +Upgrade your rpc to a premium plan +::: + +### Error fetching latest block height + +```bash ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error fetching latest block height on Evm(56) JsonRpcClientError(MiddlewareError(Middleware((code: -32603, message: request failed or timed out, data: None))))") ``` This is usually caused by a network issue or invalid response from the rpc node
-**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available -``` +:::success[How to Fix] +The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your +rpc nodes are highly available +::: + +### Request failed or timed out + +```bash ERROR tesseract_evm::provider: Error while querying events in range 43812202..43812204 from Evm(56): Middleware error: (code: -32603, message: request failed or timed out, data: None) ``` This is usually caused by a network issue or invalid response from the rpc node
-**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available -``` -ERROR tesseract_evm::provider: Error while querying events in range 43816145..43816147 from Evm(56): Middleware error: (code: -32603, message: internal server error, data: None) -``` +:::success[How to Fix] +The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your +rpc nodes are highly available +::: -This error signifies misconfiured rpc endpoints or `ismp_host` addresses.
-**Fix**: Check your config file to ensure all `ismp_host` addresses and rpc endpoints are correctlt configured -``` -ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error encountered while querying state_machine_update_time Invalid name: please ensure the contract and method you're calling exist! failed to decode empty bytes. if you're using jsonrpc this is likely due to jsonrpc returning `0x` in case contract or method don't exist") +### Internal server error +```bash +ERROR tesseract_evm::provider: Error while querying events in range 43816145..43816147 from Evm(56): Middleware error: (code: -32603, message: internal server error, data: None) ``` This is usually caused by a network issue or invalid response from the rpc node
-**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available -``` -ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(1): Middleware error: Deserialization Error: response must be either a success/error or notification object at line 1 column 237. Response: {"jsonrpc":"2.0","id":31327,"result":null,"error":{"code":-32000,"message":"tracing failed: insufficient funds for gas * price + value: address
have 411893340457544628 want 525945389500000000"}} -``` +:::success[How to Fix]The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your +rpc nodes are highly available +::: -The error below means the relayer encountered some error while accumulating fees on hyperbridge
-**Fix**: Try using the fee accumulation CLI to complete the process -``` + +### Error accummulating some fees + +```bash ERROR tesseract_messaging: Error accummulating some fees, receipts have been stored in the db, you can try again manually ``` -This is caused by an invalid response from the rpc node
-**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available -``` -ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error fetching latest block height on Evm(56) JsonRpcClientError(MiddlewareError(Middleware(Deserialization Error: expected value at line 1 column 1. Response: \r\n504 Gateway Time-out\r\n\r\n

504 Gateway Time-out

\r\n\r\n\r\n)))") -``` +This error means the relayer encountered some error while accumulating fees on hyperbridge
+:::success[How to Fix] +Try using the fee accumulation CLI to complete the process +::: -This is caused by an invalid response from the rpc node
-**Fix**: The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your rpc nodes are highly available -``` -ERROR tesseract_evm::provider: Error while querying events in range 43876757..43876796 from Evm(56): Middleware error: Deserialization Error: expected value at line 1 column 1. Response: -``` -This error signifies that your rpc node is not archive
-**Fix**: Upgrade your rpc node to an archive node -``` +### Missing trie node + +```bash ERROR tesseract_messaging: Error while handling EVM-56 on Polkadot(3367): Middleware error: (code: -32000, message: missing trie node baf71a6410ba54b32b02056415efe6b22060c20aff9c399d9b6308d0a88c3d09 (path ) state 0xbaf71a6410ba54b32b02056415efe6b22060c20aff9c399d9b6308d0a88c3d09 is not available, data: None) ``` -This error can be safely ignored -``` +This error signifies that your rpc node is not archive
+:::success[How to Fix] +Upgrade your rpc node to an archive node +::: + +### Disconnected from telemetry + +```bash ERROR tesseract::cli: Disconnected from telemetry with: Text( ``` + +This error can be safely ignored as telemetry is not a critical function of the relayer diff --git a/docs/pages/developers/polkadot/getting-started.mdx b/docs/pages/developers/polkadot/getting-started.mdx index 3d62375c2..0be0300f3 100644 --- a/docs/pages/developers/polkadot/getting-started.mdx +++ b/docs/pages/developers/polkadot/getting-started.mdx @@ -3,15 +3,15 @@ title: Getting Started description: Hyperbridge is built on a cross-chain interoperability protocol referred to as the [Interoperable State Machine Protocol](/protocol/ismp). This protocol implementation lives in the [Hyperbridge Monorepo](https://github.com/polytope-labs/hyperbridge/tree/main/modules/ismp). --- -# ISMP SDK +# Polkadot SDK -Hyperbridge is built on a cross-chain interoperability protocol referred to as the [Interoperable State Machine Protocol](/protocol/ismp). This protocol implementation lives in the [Hyperbridge Monorepo](https://github.com/polytope-labs/hyperbridge/tree/main/modules/ismp). Polkadot-SDK based chains whether parachains or solochains can be connected to Hyperbridge and consequently all of Hyperbridge's connected networks through the ISMP protocol. +Hyperbridge is built on a cross-chain interoperability protocol referred to as the [Interoperable State Machine Protocol](/protocol/ismp). This protocol implementation lives in the [Hyperbridge Monorepo](https://github.com/polytope-labs/hyperbridge/tree/main/modules/ismp). This protocol dictates the rules for Polkadot-SDK chains (parachains or solochains) to be connected to Hyperbridge and consequently all of Hyperbridge's connected networks. The connection between Hyperbridge and Polkadot-SDK chains is mediated by a few modules that we will introduce below. ## Pallet ISMP -This is the core module of the Interoperable state machine protocol for Polkadot-SDK chains. It exposes APIs and calls that allow the runtime to send and receive ISMP messages respectively. You can add it to your runtime like so +This is the core module of the Interoperable state machine protocol for Polkadot-SDK chains. It exposes APIs and calls that allow the runtime to send and receive ISMP messages respectively. You can add the [`pallet-ismp`](https://docs.rs/pallet-ismp) to your runtime like so ``` cargo add pallet-ismp @@ -19,7 +19,7 @@ cargo add pallet-ismp ### Pallet ISMP Runtime API -This ISMP runtime API exposes necessary storage items to the client subsystems, specifically in this case the RPC subsystem. But you can also build custom client subsytems that leverage this runtime API. You can add it to your runtime like so +This ISMP runtime API exposes necessary storage items to the client subsystems, specifically in this case the RPC subsystem. But you can also build custom client subsytems that leverage this runtime API. You can add the [`pallet-ismp-runtime-api`](https://docs.rs/pallet-ismp-runtime-api) to your runtime like so ``` cargo add pallet-ismp-runtime-api @@ -27,7 +27,7 @@ cargo add pallet-ismp-runtime-api ### Pallet ISMP RPC -The Pallet ISMP RPC module exposes the necessary RPC APIs that are required by the [tesseract relayer](/developers/network/relayer) and other alternative relayer implementations. This is required for any kind of offchain relayer process. You can add it to your runtime like so +The Pallet ISMP RPC module exposes the necessary RPC APIs that are required by the [tesseract relayer](/developers/network/relayer) and other alternative relayer implementations. This is required for any kind of offchain relayer process. You can add the [`pallet-ismp-rpc`](https://docs.rs/pallet-ismp-rpc) to your runtime like so ``` cargo add pallet-ismp-rpc @@ -35,16 +35,16 @@ cargo add pallet-ismp-rpc ## Parachain Consensus Client -For parachain runtimes that want to connect to Hyperbridge, They will do so by means of the parachain consensus client. Which is leverages the relay chain as the source of truth for finalized sibling parachain state commitments. You can add it to your runtime like so +For parachain runtimes that want to connect to Hyperbridge, They will do so by means of the parachain consensus client. Which is leverages the relay chain as the source of truth for finalized sibling parachain state commitments. You can add the [`ismp-parachain`](https://docs.rs/ismp-parachain) to your runtime like so ``` -cargo add pallet-ismp-rpc +cargo add ismp-parachain ``` ### Parachain Inherent -The parachain inherent greatly simplifies the infrastructure required for parachains to exchange messages with Hyperbridge by turning collators into consensus relayers. Specifically this inherent will automatically include sibling parachain headers and their proofs into every block keeping the parachain up to date with the latest finalized state of Hyperbridge and any other sibling parachain that is configured. Without this, a seperate consensus relayer will need to be run offchain. You can add it to your runtime like so +The parachain inherent greatly simplifies the infrastructure required for parachains to exchange messages with Hyperbridge by turning collators into consensus relayers. Specifically this inherent will automatically include sibling parachain headers and their proofs into every block keeping the parachain up to date with the latest finalized state of Hyperbridge and any other sibling parachain that is configured. Without this, a seperate consensus relayer will need to be run offchain. You can add the [`ismp-parachain-inherent`](https://docs.rs/ismp-parachain-inherent) to your runtime like so ``` cargo add ismp-parachain-inherent @@ -52,7 +52,7 @@ cargo add ismp-parachain-inherent ### Parachain Runtime API -The Parachain inherent provider requires some runtime APIs to access which parachains are configured by the runtime to be included in the inherent.ou can add it to your runtime like so +The Parachain inherent provider requires some runtime APIs to access which parachains are configured by the runtime to be included in the inherent. You can add the [`ismp-parachain-runtime-api`](https://docs.rs/ismp-parachain-runtime-api) to your runtime like so ``` cargo add ismp-parachain-runtime-api @@ -60,7 +60,7 @@ cargo add ismp-parachain-runtime-api ## GRANDPA Consensus Client -Solochains that want to connect to Hyperbridge will do so by means of the GRANDPA consensus client. This consensus client is capable of verifying GRANDPA consensus proofs of standalone chains as well as relay chains. You can add it to your runtime like so +Solochains that want to connect to Hyperbridge will do so by means of the GRANDPA consensus client. This consensus client is capable of verifying GRANDPA consensus proofs of standalone chains as well as relay chains. You can add the [`ismp-grandpa`](https://docs.rs/ismp-grandpa) to your runtime like so ``` cargo add ismp-grandpa @@ -68,7 +68,7 @@ cargo add ismp-grandpa ## Pallet Hyperbridge -The Pallet Hyperbridge provides an implementation of the `IsmpDispatcher` which collects the Hyperbridge protocol fees, as well as an `IsmpModule` for processing cross-chain messages from Hyperbridge. These cross-chain messages may either be withdrawal requests may be for either relayer fees, or protocol fees. The IsmpModule may also receive cross-chain messages from Hyperbridge to adjust it's protocol fees as decided by governance. This module is optional and is only needed if Polkadot-SDK chains opt to pay Hyperbridge protocol fees onchain, they may also do so offchain by running their own relayers and paying Hyperbridge it's native token when they relay messages to Hyperbridge. You can add it to your runtime like so +The Pallet Hyperbridge provides an implementation of the `IsmpDispatcher` which collects the Hyperbridge protocol fees, as well as an `IsmpModule` for processing cross-chain messages from Hyperbridge. These cross-chain messages may either be withdrawal requests may be for either relayer fees, or protocol fees. The IsmpModule may also receive cross-chain messages from Hyperbridge to adjust it's protocol fees as decided by governance. This module is optional and is only needed if Polkadot-SDK chains opt to pay Hyperbridge protocol fees onchain, they may also do so offchain by running their own relayers and paying Hyperbridge it's native token when they relay messages to Hyperbridge. You can add the [`pallet-hyperbridge`](https://docs.rs/pallet-hyperbridge) to your runtime like so ``` cargo add pallet-hyperbridge @@ -76,7 +76,7 @@ cargo add pallet-hyperbridge ## Pallet Token Gateway -The Pallet Token Gateway is an application-layer module that leverages Hyperbridge for token bridging. It works with any implementation of the `fungibles::*` traits so `pallet-assets` or `orml-tokens`. Allowing runtimes to send and receive assets from any of Hyperbridge's connected chains even EVM ones. You can add it to your runtime like so +The Pallet Token Gateway is an application-layer module that leverages Hyperbridge for token bridging. It works with any implementation of the `fungibles::*` traits eg. [`pallet-assets`](https://docs.rs/pallet-assets) and [`orml-tokens`](https://docs.rs/orml-tokens). Allowing runtimes to send and receive assets from any of Hyperbridge's connected chains even EVM ones. You can add the [`pallet-token-gateway`](https://docs.rs/pallet-token-gateway) to your runtime like so ``` cargo add pallet-token-gateway diff --git a/docs/pages/developers/polkadot/pallet-ismp.mdx b/docs/pages/developers/polkadot/pallet-ismp.mdx index 52b4d8136..36e1d514a 100644 --- a/docs/pages/developers/polkadot/pallet-ismp.mdx +++ b/docs/pages/developers/polkadot/pallet-ismp.mdx @@ -58,20 +58,16 @@ Let's go through some of the ISMP specific components of the configuration. * `HostStateMachine`: This is the state machine identifier for your chain, it will be used as the **source value for all requests that are dispatched from this chain** For parachains, this should be your parachain id e.g `StateMachine::Polkadot(1000)`. -
* `Coprocessor`: ISMP is built around the idea of a coprocessor that aggregates consensus and state proofs from multiple state machines into a more succinct proof that is cheaply verifiable. This component defines the state machine identifier of the supported coprocessor, Hyperbridge is a coprocessor for ISMP. -
* `ConsensusClients`: This is a tuple of types that implement the `ConsensusClient` interface, it defines all the consensus algorithms supported by this deployment of the protocol. -
* `Mmr`: This type allows us to use mmr tree as an overlay for cheaper proofs for requests and responses instead of the merkle patricia trie proofs. -
* `Router`: The router is a type that provides an `IsmpModule` implementation for a module id. diff --git a/docs/pages/developers/polkadot/solochains.mdx b/docs/pages/developers/polkadot/solochains.mdx index b9fc5b180..b7492f356 100644 --- a/docs/pages/developers/polkadot/solochains.mdx +++ b/docs/pages/developers/polkadot/solochains.mdx @@ -1,6 +1,6 @@ # Solochain Integration -For solochains that want to integrate with hyperbridge a GRANDPA consensus client is provided as a way to track the finality of the Hyperbridge parachain through Polkadot. A consensus relayer is also provided, which is responsible for exchanging finality proofs of cross-chain messages. +For solochains that want to integrate with hyperbridge, a GRANDPA consensus client is provided as a way to track the finality of the Hyperbridge parachain through Polkadot. A consensus relayer is also provided, which is responsible for exchanging finality proofs of cross-chain messages. ## Runtime Integration @@ -31,6 +31,7 @@ construct_runtime! { // ... Ismp: pallet_ismp IsmpGrandpa: ismp_grandpa + // ... } ``` @@ -53,11 +54,11 @@ This removes the provided state machines from the pallet whitelist, terminating ## Consensus Relayer -Solochains require an offchain consensus relayer to exchange consensus proofs with Hyperbridge. The Tesseract consensus relayer is built to handle this. This version of the relayer, is different from the publicly available messaging relayer and is closed-source at this time, but is available as a docker image. +Solochains require an offchain consensus relayer to exchange consensus proofs with Hyperbridge. The Tesseract consensus relayer is built to handle this. This version of the relayer, is different from the publicly available messaging relayer. ### Docker -You can pull in the tesseract consensus relayer like so +The tesseract consensus relayer is closed-source at this time, but is available as a docker image at the official docker repository [polytopelabs/tesseract-consensus](https://hub.docker.com/r/polytopelabs/tesseract-consensus) ```bash docker pull polytopelabs/tesseract-consensus:latest @@ -129,7 +130,12 @@ para_ids = [] Before running the relayer, you must first initialize Hyperbridge's consensus state on your solochain. The consensus relayer can query Hyperbridge to retrieve this initial state for you. For instance, here's how you can log the consensus state of the Hyperbridge testnet on Paseo: ```bash -docker run -v /path/to/consensus.toml:/root/consensus.toml polyopelabs/tesseract-consensus:latest --config=/root/consensus.toml log-consensus-state=KUSAMA-4009 +docker run \ +--network=host \ +-v /path/to/consensus.toml:/root/consensus.toml \ +polytopelabs/tesseract-consensus:latest \ +--config=/root/consensus.toml \ +log-consensus-state KUSAMA-4009 ``` This should print out a potentially long hex string. Next you'll use this hex string to initialize the Hyperbridge consensus state on your solochain through an extrinsic as shown below. @@ -154,15 +160,17 @@ Once this is completed on your solochain, the same will need to also be executed Once all consensus states are set up, running the relayer is as easy as: ```bash -docker run -v /path/to/consensus.toml:/root/consensus.toml polyopelabs/tesseract-consensus:latest --config=/root/consensus.toml log-consensus-state=KUSAMA-4009 +docker run \ +--network=host \ +-v /path/to/consensus.toml:/root/consensus.toml \ +polytopelabs/tesseract-consensus:latest \ +--config=/root/consensus.toml ``` You will of course need to pair this with the [messaging relayer](/developers/network/relayer) which actually relays cross-chain messages. ## Miscallenous -Some random things to note - ### Slot Numbers The GRANDPA consensus client relies on digest items in the header to communicate the current slot number. These digest items must be identified as either `BABE` or `AURA`. Solochains using custom block production algorithms must include the `AURA` digest item to ensure compatibility with the GRANDPA consensus client for producing valid consensus proofs. From 4413fd9ab5ae7be0db8de4942aed4709ec68a4fc Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Fri, 22 Nov 2024 16:49:14 +0100 Subject: [PATCH 13/17] add notes on versioning --- docs/pages/developers/evm/getting-started.mdx | 4 ++++ docs/pages/developers/explore/{modules => }/fishermen.mdx | 0 docs/pages/developers/explore/index.mdx | 1 + docs/pages/developers/explore/nexus.mdx | 2 +- docs/pages/developers/polkadot/getting-started.mdx | 4 ++++ docs/vocs.config.tsx | 8 ++++---- 6 files changed, 14 insertions(+), 5 deletions(-) rename docs/pages/developers/explore/{modules => }/fishermen.mdx (100%) diff --git a/docs/pages/developers/evm/getting-started.mdx b/docs/pages/developers/evm/getting-started.mdx index e0ec9d339..cc81eb8ef 100644 --- a/docs/pages/developers/evm/getting-started.mdx +++ b/docs/pages/developers/evm/getting-started.mdx @@ -56,6 +56,10 @@ The [`StateMachine`](https://github.com/polytope-labs/ismp-solidity/blob/main/in In the next section we'll look into hands-on examples of how to send and receive messages using ISMP. +## Versioning + +The minimum version of the `ismp-solidity` library is `v0.8.17`. But since this library is mostly just interfaces, it can be forked and modified to support an even lower version for your solidity project if needed. + ## Implementations diff --git a/docs/pages/developers/explore/modules/fishermen.mdx b/docs/pages/developers/explore/fishermen.mdx similarity index 100% rename from docs/pages/developers/explore/modules/fishermen.mdx rename to docs/pages/developers/explore/fishermen.mdx diff --git a/docs/pages/developers/explore/index.mdx b/docs/pages/developers/explore/index.mdx index 2bc44ce19..4cb5319eb 100644 --- a/docs/pages/developers/explore/index.mdx +++ b/docs/pages/developers/explore/index.mdx @@ -10,4 +10,5 @@ Hyperbridge brings together advanced cryptographic and mechanistic protocols to The protocol is facilitated by: - A permissionless set of relayers that transmit cross-chain messages authenticated by cryptographic proofs. + - Fishermen who challenge malicous consensus updates by vetoing misrepresentative state comitments. - Hyperbridge Nexus, a blockchain that serves as a crypto-economic coprocessor for aggregating interoperability proofs. diff --git a/docs/pages/developers/explore/nexus.mdx b/docs/pages/developers/explore/nexus.mdx index bf5581b96..54e69f74c 100644 --- a/docs/pages/developers/explore/nexus.mdx +++ b/docs/pages/developers/explore/nexus.mdx @@ -42,7 +42,7 @@ Polkadot introduces [BEEFY](/protocol/consensus/beefy), a secondary consensus pr These are the runtime modules that make up the Hyperbridge blockchain. These modules are responsible for implementing the various components of the protocol, such as the consensus and state proof verifiers, cross-chain governance, relayer incentivization, and other components. The runtime modules included in Hyperbridge are: - [ISMP](/developers/explore/modules/ismp) - - [Fishermen](/developers/explore/modules/fishermen) + - [Fishermen](/developers/explore/fishermen) - [Host Executive](/developers/explore/modules/host-executive) - [Relayer](/developers/explore/modules/relayer) diff --git a/docs/pages/developers/polkadot/getting-started.mdx b/docs/pages/developers/polkadot/getting-started.mdx index 0be0300f3..1109350e9 100644 --- a/docs/pages/developers/polkadot/getting-started.mdx +++ b/docs/pages/developers/polkadot/getting-started.mdx @@ -81,3 +81,7 @@ The Pallet Token Gateway is an application-layer module that leverages Hyperbrid ``` cargo add pallet-token-gateway ``` + +## Versioning + +The versioning of these crates track the LTS releases of Polkadot SDK and are only updated when new LTS versions are released. For instance the `stable2407` version is available for all crates as **v1.15.x**. Subsequent LTS releases will see a minor version bump. eg `stable2409` will be supportted by **v1.16.x** and so on. \ No newline at end of file diff --git a/docs/vocs.config.tsx b/docs/vocs.config.tsx index 5ea7f7b14..0bffbe3b7 100644 --- a/docs/vocs.config.tsx +++ b/docs/vocs.config.tsx @@ -304,6 +304,10 @@ export default defineConfig({ text: "Permissionless Relayers", link: "/developers/explore/relayers", }, + { + text: "Fishermen", + link: "/developers/explore/fishermen", + }, { text: "Hyperbridge Nexus", link: "/developers/explore/nexus", @@ -312,10 +316,6 @@ export default defineConfig({ text: "ISMP", link: "/developers/explore/modules/ismp", }, - { - text: "Fishermen", - link: "/developers/explore/modules/fishermen", - }, { text: "Host Executive", link: "/developers/explore/modules/host-executive", From cbe7e9ffa009eaffea5f4d7146c083056a2e7ae5 Mon Sep 17 00:00:00 2001 From: David Salami Date: Mon, 25 Nov 2024 12:36:07 +0000 Subject: [PATCH 14/17] filter out treasury spend calls --- parachain/runtimes/nexus/src/lib.rs | 40 +++++++++++++++++++---------- tesseract/substrate/src/provider.rs | 14 +++++----- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/parachain/runtimes/nexus/src/lib.rs b/parachain/runtimes/nexus/src/lib.rs index 97ea81001..c999c3100 100644 --- a/parachain/runtimes/nexus/src/lib.rs +++ b/parachain/runtimes/nexus/src/lib.rs @@ -30,7 +30,7 @@ pub mod xcm; use alloc::sync::Arc; use cumulus_primitives_core::AggregateMessageOrigin; -use frame_support::traits::TransformOrigin; +use frame_support::traits::{EverythingBut, TransformOrigin}; use parachains_common::message_queue::{NarrowOriginToSibling, ParaIdToSibling}; use codec::{Decode, Encode, MaxEncodedLen}; @@ -63,7 +63,7 @@ use frame_support::{ dispatch::DispatchClass, genesis_builder_helper::{build_state, get_preset}, parameter_types, - traits::{ConstU32, ConstU64, ConstU8, Everything, InstanceFilter}, + traits::{ConstU32, ConstU64, ConstU8, InstanceFilter}, weights::{ constants::WEIGHT_REF_TIME_PER_SECOND, ConstantMultiplier, Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial, @@ -311,7 +311,10 @@ parameter_types! { // Configure FRAME pallets to include in runtime. use ::ismp::host::StateMachine; -use frame_support::{derive_impl, traits::tokens::pay::PayAssetFromAccount}; +use frame_support::{ + derive_impl, + traits::{tokens::pay::PayAssetFromAccount, Contains}, +}; use pallet_collective::PrimeDefaultVote; use pallet_ismp::mmr::Leaf; #[cfg(feature = "runtime-benchmarks")] @@ -325,6 +328,18 @@ use staging_xcm::latest::Location; #[cfg(feature = "runtime-benchmarks")] use staging_xcm::latest::{Junction, Junctions::X1}; +/// A type to identify calls to the treasury pallet and filter all spend related calls. +pub struct IsTreasurySpend; +impl Contains for IsTreasurySpend { + fn contains(c: &RuntimeCall) -> bool { + matches!( + c, + RuntimeCall::Treasury(pallet_treasury::Call::spend { .. }) | + RuntimeCall::Treasury(pallet_treasury::Call::spend_local { .. }) + ) + } +} + #[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] impl frame_system::Config for Runtime { /// The identifier used to distinguish between accounts. @@ -360,7 +375,7 @@ impl frame_system::Config for Runtime { /// The weight of database operations that the runtime can invoke. type DbWeight = RocksDbWeight; /// The basic call filter to use in dispatchable. - type BaseCallFilter = Everything; + type BaseCallFilter = EverythingBut; /// Weight information for the extrinsics of this pallet. type SystemWeightInfo = weights::frame_system::WeightInfo; /// Block & extrinsics weights: base values and limits. @@ -748,20 +763,19 @@ impl InstanceFilter for ProxyType { fn filter(&self, c: &RuntimeCall) -> bool { match self { ProxyType::Any => true, - ProxyType::NonTransfer => { - !matches!(c, RuntimeCall::Balances { .. } | RuntimeCall::Assets { .. }) - }, + ProxyType::NonTransfer => + !matches!(c, RuntimeCall::Balances { .. } | RuntimeCall::Assets { .. }), ProxyType::CancelProxy => matches!( c, - RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) - | RuntimeCall::Utility { .. } - | RuntimeCall::Multisig { .. } + RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) | + RuntimeCall::Utility { .. } | + RuntimeCall::Multisig { .. } ), ProxyType::Collator => matches!( c, - RuntimeCall::CollatorSelection { .. } - | RuntimeCall::Utility { .. } - | RuntimeCall::Multisig { .. } + RuntimeCall::CollatorSelection { .. } | + RuntimeCall::Utility { .. } | + RuntimeCall::Multisig { .. } ), } } diff --git a/tesseract/substrate/src/provider.rs b/tesseract/substrate/src/provider.rs index 742f6f197..7da7878ea 100644 --- a/tesseract/substrate/src/provider.rs +++ b/tesseract/substrate/src/provider.rs @@ -666,8 +666,8 @@ where let compressed_call_len = zstd_safe::compress(&mut buffer[..], &encoded_call, 3) .map_err(|_| anyhow!("Call compression failed"))?; // If compression saving is less than 15% submit the uncompressed call - if (uncompressed_len.saturating_sub(compressed_call_len) * 100 / uncompressed_len) - < 20usize + if (uncompressed_len.saturating_sub(compressed_call_len) * 100 / uncompressed_len) < + 20usize { log::trace!(target: "tesseract", "Submitting uncompressed call: compressed:{}kb, uncompressed:{}kb", compressed_call_len / 1000, uncompressed_len / 1000); futs.push(send_unsigned_extrinsic(&self.client, extrinsic, false)) @@ -701,7 +701,7 @@ where }; for msg in messages { match msg { - Message::Request(req_msg) => { + Message::Request(req_msg) => for post in req_msg.requests { let req = Request::Post(post); let commitment = hash_request::(&req); @@ -718,12 +718,11 @@ where results.push(tx_receipt); } - } - }, + }, Message::Response(ResponseMessage { datagram: RequestResponse::Response(resp), .. - }) => { + }) => for res in resp { let commitment = hash_response::(&res); let request_commitment = hash_request::(&res.request()); @@ -741,8 +740,7 @@ where results.push(tx_receipt); } - } - }, + }, _ => {}, } } From b4fcb14cd840a3d8dbe21d42b9a13d861dbbdc2a Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Tue, 26 Nov 2024 12:46:44 +0100 Subject: [PATCH 15/17] add title and description to pages, replace og image --- docs/pages/developers/evm/dispatching.mdx | 42 +--- docs/pages/developers/evm/getting-started.mdx | 2 - docs/pages/developers/evm/receiving.mdx | 76 ++----- docs/pages/developers/network/relayer.mdx | 173 --------------- .../developers/network/relayer/errors.mdx | 174 +++++++++++++++ docs/pages/developers/polkadot/delivery.mdx | 32 --- .../pages/developers/polkadot/dispatching.mdx | 204 ++++++++++++++++++ docs/pages/developers/polkadot/fees.mdx | 84 +++++--- .../polkadot/ismp-parachain-inherent.mdx | 4 + .../polkadot/ismp-parachain-runtime-api.mdx | 5 + docs/pages/developers/polkadot/networks.mdx | 0 .../developers/polkadot/pallet-ismp-rpc.mdx | 5 + .../polkadot/pallet-ismp-runtime-api.mdx | 5 + .../pages/developers/polkadot/pallet-ismp.mdx | 7 +- docs/pages/developers/polkadot/parachains.mdx | 5 + .../polkadot/{modules.mdx => receiving.mdx} | 29 ++- docs/pages/developers/polkadot/solochains.mdx | 19 ++ .../developers/polkadot/token-gateway.mdx | 7 +- docs/public/og.png | Bin 0 -> 80134 bytes docs/vocs.config.tsx | 12 +- 20 files changed, 528 insertions(+), 357 deletions(-) create mode 100644 docs/pages/developers/network/relayer/errors.mdx delete mode 100644 docs/pages/developers/polkadot/delivery.mdx create mode 100644 docs/pages/developers/polkadot/dispatching.mdx delete mode 100644 docs/pages/developers/polkadot/networks.mdx rename docs/pages/developers/polkadot/{modules.mdx => receiving.mdx} (79%) create mode 100644 docs/public/og.png diff --git a/docs/pages/developers/evm/dispatching.mdx b/docs/pages/developers/evm/dispatching.mdx index 8c3960fa6..2c77870ca 100644 --- a/docs/pages/developers/evm/dispatching.mdx +++ b/docs/pages/developers/evm/dispatching.mdx @@ -1,8 +1,8 @@ # Dispatching Requests & Responses -This section explores the means by which applications may leverage Hyperbridge to dispatch cross-chain message. It's important to understand that in Hyperbridge paralance, there are 3 different kinds of cross-chain messages. We'll explore each of them Below. +This section explores the means by which applications may leverage Hyperbridge to dispatch cross-chain messages. It's important to understand that in Hyperbridge protocol, there are 3 different kinds of cross-chain messages. We'll explore each of them Below. -## POST Request +## POST Requests A POST request is simply a cross-chain message to be executed by some `IIsmpModule` on a destination. It's important to understand that **EOAs should not dispatch** POST requests directly, instead an application must be responsible for the dispatch. This way if the request delivery or execution fails on the destination, modules can "catch" this failure similar to the try/catch pattern and handle the failure case in the `onPostRequestTimeout` callback. @@ -30,20 +30,11 @@ struct DispatchPost { ### Dispatch Parameters - `dest`: Destination chain, for this you'll use the `StateMachine` library eg `StateMachine.evm(1)` for Ethereum Mainnet. - -
- - `to`: Receiving module/contract address on the destination chain. - -
- - `body`: Serialized byte representation of the message (to be decoded by the receiving contract). -
- `timeout`: Time in seconds for message validity eg 3600 for a timeout of 1 hour, or 0 for no timeout. ie Messages will never expire. If the timeout is set to a non-zero value, messages that have exceeded this timeout will be rejected on the destination and require user action (timeout message) to revert changes. -
- `fee`: Optional relayer fees, this can also be set to zero if the application developers prefer to self-relay. -
- `payer`: The account that should receive a refund of the relayer fees if the request times out. ```solidity showLineNumbers @@ -92,24 +83,11 @@ struct DispatchPostResponse { ### Dispatch Parameters - `request`: The request object that was previously received. - -
- - `response`: Opaque byte representation of the response message (to be decoded by the receiving contract). - -
- - `timeout`: Time in seconds for message validity eg 3600 for a timeout of 1 hour, or 0 for no timeout. ie Messages will never expire. If the timeout is set to a non-zero value, messages that have exceeded this timeout will be rejected on the destination and require user action (timeout message) to revert changes. - -
- - `fee`: Optional relayer incentive (zero for self-relay). - -
- - `payer`: The account that should receive a refund of the relayer fees if the request times out. -
```solidity showLineNumbers // _host is variable that contains the EvmHost contract address @@ -159,28 +137,12 @@ struct DispatchGet { ### Dispatch Parameters - `dest`: The chain whose database should be read (e.g., `StateMachine.evm(1)` for Ethereum Mainnet). - -
- - `height`: Block height at which the values should be fetched. - -
- - `keys`: Storage keys whose values need to be fetched. - -
- - `timeout`: Time in seconds for message validity eg 3600 for a timeout of 1 hour, or 0 for no timeout. ie Messages will never expire. If the timeout is set to a non-zero value, messages that have exceeded this timeout will be rejected on the destination and require user action (timeout message) to revert changes. - -
- - `fee`: Hyperbridge protocol fees for processing the request. - -
- - `sender`: The account initiating this request. -
```solidity // _host is variable that contains the EvmHost contract address diff --git a/docs/pages/developers/evm/getting-started.mdx b/docs/pages/developers/evm/getting-started.mdx index cc81eb8ef..2f0612990 100644 --- a/docs/pages/developers/evm/getting-started.mdx +++ b/docs/pages/developers/evm/getting-started.mdx @@ -2,8 +2,6 @@ title: Solidity Sdk description: Hyperbridge is built on a cross-chain interoperability protocol referred to as the [Interoperable State Machine Protocol](/protocol/ismp). This protocol implementation lives in the [Hyperbridge Monorepo](https://github.com/polytope-labs/hyperbridge/tree/main/evm). But it's interfaces are outlined in the [ismp-solidity](https://github.com/polytope-labs/ismp-solidity) repository. --- - - # Solidity SDK Hyperbridge is built on a cross-chain interoperability protocol referred to as the [Interoperable State Machine Protocol](/protocol/ismp). This protocol implementation lives in the [Hyperbridge Monorepo](https://github.com/polytope-labs/hyperbridge/tree/main/evm). But it's interfaces are outlined in the [ismp-solidity](https://github.com/polytope-labs/ismp-solidity) repository. diff --git a/docs/pages/developers/evm/receiving.mdx b/docs/pages/developers/evm/receiving.mdx index 83379d8d7..4e3633179 100644 --- a/docs/pages/developers/evm/receiving.mdx +++ b/docs/pages/developers/evm/receiving.mdx @@ -2,45 +2,49 @@ To receive ISMP messages a contract must implement the [`IIsmpModule`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/IIsmpModule.sol#L42) interface, this interface allows the `IIsmpHost` to dispatch verified cross chain messages to the contract for execution. +## `IIsmpModule` + The required methods for the [`IIsmpModule`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/IIsmpModule.sol#L42) is described in detail below: -## `onAccept` +### `onAccept` This is the callback method for new POST requests that have been verified by Hyperbridge. After the `IHandler` verifies the necessary proofs of this request, they are passed on to the host, which in turn calls the `onAccept` method for the intended modules. The arguments provided `IncomingPostRequest` holds both the request object itself and the account that initally called the Handler contract, this may be either a 3rd party relayer or a user who is self-relaying. `IIsmpModule`'s should ensure that is method is only callable by the `host` or risk critical vulnerabilies from unauthorized calls to this method by malicious actors. A modifier `onlyHost` is provided as part of the `BaseIsmpModule` for this. -## `onPostRequestTimeout` +### `onPostRequestTimeout` In the event that some initially dispatched request was unable to be delivered. Whether as a result of insufficient fees provided to the relayers, Or a revert during request execution on the destination chain. Then Hyperbridge allows this request to gracefully timeout, and this timeout can be reported back to the sending module on the source chain. This callback is provided as a way to execute some logic in the event that some request times out. This can be seen as a _catch_ block in a try/catch for cross-chain messages. Typically you'll want to revert any state changes that were made prior to dispatching the request. -## `onPostResponse` +### `onPostResponse` This is the callback method for new POST responses that have been verified by Hyperbridge. After the `IHandler` verifies the necessary proofs of this response, they are passed on to the host, which in turn calls the `onPostResponse` method for the intended modules. The arguments provided `IncomingPostResponse` holds both the resopnse object itself and the account that initally called the Handler contract, this may be either a 3rd party relayer or a user who is self-relaying. `IIsmpModule`'s should ensure that is method is only callable by the `host` or risk critical vulnerabilies from unauthorized calls to this method by malicious actors. A modifier `onlyHost` is provided as part of the `BaseIsmpModule` for this. -## `onPostResponseTimeout` +### `onPostResponseTimeout` In the event that some initially dispatched response was unable to be delivered. Whether as a result of insufficient fees provided to the relayers, Or a revert during response execution on the destination chain. Then Hyperbridge allows this response to gracefully timeout, and this timeout can be reported back to the sending module on the source chain. This callback is provided as a way to execute some logic in the event that some response times out. This can be seen as a _catch_ block in a try/catch for cross-chain messages. Typically you'll want to revert any state changes that were made prior to dispatching the response. -## `onGetResponse` +### `onGetResponse` This is the callback method for new GET responses that have been verified by Hyperbridge. After the `IHandler` verifies the necessary proofs of this response, they are passed on to the host, which in turn calls the `onGetResponse` method for the intended modules. The arguments provided `IncomingGetResponse` holds both the resopnse object itself and the account that initally called the Handler contract, this may be either a 3rd party relayer or a user who is self-relaying. `IIsmpModule`'s should ensure that is method is only callable by the `host` or risk critical vulnerabilies from unauthorized calls to this method by malicious actors. A modifier `onlyHost` is provided as part of the `BaseIsmpModule` for this. -## `onGetTimeout` +### `onGetTimeout` In the event that some GET request is unable to be processed. Likely as a result of insufficient fees provided. Then Hyperbridge allows this request to gracefully timeout, and this timeout can be reported back to the sending module on the source chain. This callback is provided as a way to execute some logic in the event that some request times out. This can be seen as a _catch_ block in a try/catch for cross-chain messages. Typically you'll want to revert any state changes that were made prior to dispatching the request. -## Example `IIsmpModule` +## `BaseIsmpModule` + +To make implementing the `IIsmpModule` easier, an abstract contract [`BaseIsmpModule`](https://github.com/polytope-labs/ismp-solidity/blob/main/interfaces/IIsmpModule.sol#L92) is provided. This allows developers to inherit this contract and only override methods that they intend to use. This module only has one required method implementation, and it is a method that returns the `IIsmpHost` address. ```solidity showLineNumbers pragma solidity 0.8.17; @@ -52,14 +56,8 @@ import "@polytope-labs/ismp-solidity/interfaces/IDispatcher.sol"; contract Example is BaseIsmpModule { event PostReceived(); - event PostResponseReceived(); - event PostTimeoutReceived(); - event PostResponseTimeoutReceived(); - event GetResponseReceived(); - event GetTimeoutReceived(); - error NotAuthorized(); - - // EvmHost Address + + // IIsmpHost Address address private _host; constructor(address ismpHost) { @@ -97,54 +95,6 @@ contract Example is BaseIsmpModule { // make any necessary state changes emit PostReceived(); } - - function onPostRequestTimeout(PostRequest memory request) - external - override - onlyHost - { - // revert any state changes made - // when post request was dispatched - emit PostTimeoutReceived(); - } - - function onPostResponse(IncomingPostResponse memory) - external - override - onlyHost - { - // decode response - // make any necessary state changes - emit PostResponseReceived(); - } - - function onPostResponseTimeout(PostResponse memory) - external - override - onlyHost - { - // revert any state changes made - // when post response was dispatched - emit PostResponseTimeoutReceived(); - } - - function onGetResponse(IncomingGetResponse memory) - external - override - onlyHost - { - emit GetResponseReceived(); - } - - function onGetTimeout(GetRequest memory) - external - override - onlyHost - { - // revert any state changes - // made when get request was dispatched - emit GetTimeoutReceived(); - } } ``` diff --git a/docs/pages/developers/network/relayer.mdx b/docs/pages/developers/network/relayer.mdx index 05bf1b5ce..9353eb023 100644 --- a/docs/pages/developers/network/relayer.mdx +++ b/docs/pages/developers/network/relayer.mdx @@ -351,176 +351,3 @@ if your balance on hyperbridge is greater than or equal to the configured time the withdrawal task is triggered. The manual processes described in the previous sections can be used as fallbacks when errors are encountered by their automated conterparts. - -## Relayer Errors - -List of commonly seen errors with their explanation and tips on how to fix them. - - -### Insufficient funds for gas - -```bash -ERROR tesseract_messaging: Failed to submit transaction to Evm(42161): Middleware error: (code: -32000, message: insufficient funds for gas * price + value: address have 0 want 323200000000000, data: None -``` - -This error means your relayer account balance on the destination chain is insufficient to submit a transaction
- -:::success[How to Fix] -Fund your relayer account with the native gas token -::: - -### Debug trace frame not found! - -```bash -ERROR tesseract_evm::provider: Debug trace frame not found! -``` -This error signifies that the `debug_TraceCall` call for a message failed, this could be that the message execution failed or the rpc does not provide debug trace logs
-:::success[How to Fix] -Check with your rpc and ensure they provide debug trace logs for the `debug_TraceCall` RPC, in the case where message -execution fails, the error can be safely ignored -::: - - -### Please ensure the contract and method you're calling exist - -```bash -ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(8453): Invalid name: please ensure the contract and method you're calling exist! failed to decode empty bytes. if you're using jsonrpc this is likely due to jsonrpc returning `0x` in case contract or method don't exist -``` - -This error signifies misconfiured rpc endpoints or `ismp_host` addresses.
-:::success[How to Fix] -Check your config file to ensure all `ismp_host` addresses and rpc endpoints are correctly configured -::: - -### Error encountered while querying state_machine_update_time - -```bash -ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error encountered while querying state_machine_update_time Middleware error: (code: -32000, message: header not found, data: None)") -``` - -This error means the rpc endpoint failed to return a valid response for a block header query
-:::success[How to Fix] -Check that your rpc node is an archive node and full synced -::: - -### Failed to submit unsigned extrinsic - -```bash -ERROR tesseract_messaging: Failed to submit transaction to Polkadot(3367): Failed to submit unsigned extrinsic -``` - -This error means the relayer is trying to submit a duplicate transaction to hyperbridge
-:::success[How to Fix] -You can safely ignore -::: - -### The method debug_traceCall does not exist - -```bash -ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(56): Middleware error: (code: -32601, message: The method debug_traceCall does not exist/is not available, data: None) -``` - -This error means your rpc endpoint does not provide the `debug_traceCall` method
-:::success[How to Fix] -If running a private rpc node ensure the `debug` namespace is enabled, otherwise contact your rpc provider -::: - -### Error waiting for challenge period - -```bash -ERROR tesseract: Error waiting for challenge period in Evm(56) - Polkadot(3367) update stream -``` - -This is usually caused by a network issue or invalid response from the rpc node
-:::success[How to Fix] -The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your -rpc nodes are highly available -::: - -### Failed to submit transaction to Evm(10): Transaction reverted - -```bash -ERROR tesseract_messaging: Failed to submit transaction to Evm(10): Transaction reverted -``` - -This error means the relayer is tried to submit a duplicate transaction
-:::success[How to Fix] -You can safely ignore -::: - -### API key is not allowed to access method - -```bash -ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(100): Middleware error: (code: -32053, message: API key is not allowed to access method, data: None) -``` - -This means the your rpc provider limits access to some endpoints
-:::success[How to Fix] -Upgrade your rpc to a premium plan -::: - -### Error fetching latest block height - -```bash -ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error fetching latest block height on Evm(56) JsonRpcClientError(MiddlewareError(Middleware((code: -32603, message: request failed or timed out, data: None))))") -``` - -This is usually caused by a network issue or invalid response from the rpc node
-:::success[How to Fix] -The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your -rpc nodes are highly available -::: - -### Request failed or timed out - -```bash -ERROR tesseract_evm::provider: Error while querying events in range 43812202..43812204 from Evm(56): Middleware error: (code: -32603, message: request failed or timed out, data: None) -``` - -This is usually caused by a network issue or invalid response from the rpc node
-:::success[How to Fix] -The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your -rpc nodes are highly available -::: - -### Internal server error -```bash -ERROR tesseract_evm::provider: Error while querying events in range 43816145..43816147 from Evm(56): Middleware error: (code: -32603, message: internal server error, data: None) -``` - -This is usually caused by a network issue or invalid response from the rpc node
-:::success[How to Fix]The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your -rpc nodes are highly available -::: - - -### Error accummulating some fees - -```bash -ERROR tesseract_messaging: Error accummulating some fees, receipts have been stored in the db, you can try again manually -``` - -This error means the relayer encountered some error while accumulating fees on hyperbridge
-:::success[How to Fix] -Try using the fee accumulation CLI to complete the process -::: - - -### Missing trie node - -```bash -ERROR tesseract_messaging: Error while handling EVM-56 on Polkadot(3367): Middleware error: (code: -32000, message: missing trie node baf71a6410ba54b32b02056415efe6b22060c20aff9c399d9b6308d0a88c3d09 (path ) state 0xbaf71a6410ba54b32b02056415efe6b22060c20aff9c399d9b6308d0a88c3d09 is not available, data: None) -``` - -This error signifies that your rpc node is not archive
-:::success[How to Fix] -Upgrade your rpc node to an archive node -::: - -### Disconnected from telemetry - -```bash -ERROR tesseract::cli: Disconnected from telemetry with: Text( -``` - -This error can be safely ignored as telemetry is not a critical function of the relayer diff --git a/docs/pages/developers/network/relayer/errors.mdx b/docs/pages/developers/network/relayer/errors.mdx new file mode 100644 index 000000000..d5d32f113 --- /dev/null +++ b/docs/pages/developers/network/relayer/errors.mdx @@ -0,0 +1,174 @@ +# Common Relayer Errors + +List of commonly seen errors with their explanation and tips on how to fix them. + + +## Insufficient funds for gas + +```bash +ERROR tesseract_messaging: Failed to submit transaction to Evm(42161): Middleware error: (code: -32000, message: insufficient funds for gas * price + value: address have 0 want 323200000000000, data: None +``` + +This error means your relayer account balance on the destination chain is insufficient to submit a transaction
+ +:::success[How to Fix] +Fund your relayer account with the native gas token +::: + +## Debug trace frame not found! + +```bash +ERROR tesseract_evm::provider: Debug trace frame not found! +``` +This error signifies that the `debug_TraceCall` call for a message failed, this could be that the message execution failed or the rpc does not provide debug trace logs
+:::success[How to Fix] +Check with your rpc and ensure they provide debug trace logs for the `debug_TraceCall` RPC, in the case where message +execution fails, the error can be safely ignored +::: + + +## Please ensure the contract and method you're calling exist + +```bash +ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(8453): Invalid name: please ensure the contract and method you're calling exist! failed to decode empty bytes. if you're using jsonrpc this is likely due to jsonrpc returning `0x` in case contract or method don't exist +``` + +This error signifies misconfiured rpc endpoints or `ismp_host` addresses.
+:::success[How to Fix] +Check your config file to ensure all `ismp_host` addresses and rpc endpoints are correctly configured +::: + +## Error encountered while querying state_machine_update_time + +```bash +ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error encountered while querying state_machine_update_time Middleware error: (code: -32000, message: header not found, data: None)") +``` + +This error means the rpc endpoint failed to return a valid response for a block header query
+:::success[How to Fix] +Check that your rpc node is an archive node and full synced +::: + +## Failed to submit unsigned extrinsic + +```bash +ERROR tesseract_messaging: Failed to submit transaction to Polkadot(3367): Failed to submit unsigned extrinsic +``` + +This error means the relayer is trying to submit a duplicate transaction to hyperbridge
+:::success[How to Fix] +You can safely ignore +::: + +## The method debug_traceCall does not exist + +```bash +ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(56): Middleware error: (code: -32601, message: The method debug_traceCall does not exist/is not available, data: None) +``` + +This error means your rpc endpoint does not provide the `debug_traceCall` method
+:::success[How to Fix] +If running a private rpc node ensure the `debug` namespace is enabled, otherwise contact your rpc provider +::: + +## Error waiting for challenge period + +```bash +ERROR tesseract: Error waiting for challenge period in Evm(56) - Polkadot(3367) update stream +``` + +This is usually caused by a network issue or invalid response from the rpc node
+:::success[How to Fix] +The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your +rpc nodes are highly available +::: + +## Failed to submit transaction to Evm(10): Transaction reverted + +```bash +ERROR tesseract_messaging: Failed to submit transaction to Evm(10): Transaction reverted +``` + +This error means the relayer is tried to submit a duplicate transaction
+:::success[How to Fix] +You can safely ignore +::: + +## API key is not allowed to access method + +```bash +ERROR tesseract_messaging: Error while handling POLKADOT-3367 on Evm(100): Middleware error: (code: -32053, message: API key is not allowed to access method, data: None) +``` + +This means the your rpc provider limits access to some endpoints
+:::success[How to Fix] +Upgrade your rpc to a premium plan +::: + +## Error fetching latest block height + +```bash +ERROR tesseract: Messaging task Evm(56)->Polkadot(3367) encountered an error: StreamError("Error fetching latest block height on Evm(56) JsonRpcClientError(MiddlewareError(Middleware((code: -32603, message: request failed or timed out, data: None))))") +``` + +This is usually caused by a network issue or invalid response from the rpc node
+:::success[How to Fix] +The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your +rpc nodes are highly available +::: + +## Request failed or timed out + +```bash +ERROR tesseract_evm::provider: Error while querying events in range 43812202..43812204 from Evm(56): Middleware error: (code: -32603, message: request failed or timed out, data: None) +``` + +This is usually caused by a network issue or invalid response from the rpc node
+:::success[How to Fix] +The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your +rpc nodes are highly available +::: + +## Internal server error +```bash +ERROR tesseract_evm::provider: Error while querying events in range 43816145..43816147 from Evm(56): Middleware error: (code: -32603, message: internal server error, data: None) +``` + +This is usually caused by a network issue or invalid response from the rpc node
+ +:::success[How to Fix] +The relayer automatically recovers from this, to reduce the frequency of this error ensure your network is stable and your +rpc nodes are highly available +::: + + +## Error accummulating some fees + +```bash +ERROR tesseract_messaging: Error accummulating some fees, receipts have been stored in the db, you can try again manually +``` + +This error means the relayer encountered some error while accumulating fees on hyperbridge
+:::success[How to Fix] +Try using the fee accumulation CLI to complete the process +::: + + +## Missing trie node + +```bash +ERROR tesseract_messaging: Error while handling EVM-56 on Polkadot(3367): Middleware error: (code: -32000, message: missing trie node baf71a6410ba54b32b02056415efe6b22060c20aff9c399d9b6308d0a88c3d09 (path ) state 0xbaf71a6410ba54b32b02056415efe6b22060c20aff9c399d9b6308d0a88c3d09 is not available, data: None) +``` + +This error signifies that your rpc node is not archive
+:::success[How to Fix] +Upgrade your rpc node to an archive node +::: + +## Disconnected from telemetry + +```bash +ERROR tesseract::cli: Disconnected from telemetry with: Text( +``` + +This error can be safely ignored as telemetry is not a critical function of the relayer diff --git a/docs/pages/developers/polkadot/delivery.mdx b/docs/pages/developers/polkadot/delivery.mdx deleted file mode 100644 index 26f34cb66..000000000 --- a/docs/pages/developers/polkadot/delivery.mdx +++ /dev/null @@ -1,32 +0,0 @@ -# Message Delivery - -ISMP leverages a proof-based design to enable permissionless message delivery. This means anyone can submit messages to the network, as long as they possess valid proofs and can cover transaction fees. - -## Submitting ISMP Messages -`Single Entry Point`: All ISMP messages are delivered through the `handle` extrinsic. This extrinsic is accessible to anyone who can pay the fees and holds the necessary proofs, regardless of their role in the network. - -`Proofs from Hyperbridge`: When using Hyperbridge as a coprocessor, messages require Merkle Patricia trie proofs generated from the child trie of the `pallet-ismp` module on Hyperbridge. These proofs guarantee the validity and origin of the messages. - -`Batch Delivery and Validation`: Messages can be submitted in batches for efficiency. However, each message within the batch is validated independently. If a single message fails verification, the entire batch will be rejected. - -`Message Routing and Execution`: Validated messages are routed to their designated modules within the network using the `IsmpRouter`. Upon successful execution, a receipt is stored for each message. - -## Events - -Upon successful execution of ISMP messages, specific events are generated and recorded in the runtime. These events serve as confirmation for the successful processing of different message types. - - - `PostRequestHandled`: - Emitted when a post request is successfully verified and the intended module successfully processes the request. - - `PostResponseHandled`: Emitted when a post response is successfully verified and the intended module successfully processes the response. - - `PostRequestTimeoutHandled`: - Emitted when a post request timeout is successfully verified and the intended module successfully processes the timeout. - - `PostResponseTimeoutHandled`: Emitted when a post response timeout is successfully verified and the intended module successfully processes the timeout. - - `GetResponseHandled`: Emitted when the response to a cross-chain storage query is successfully verified and the intended module successfully processes the response. - - `StateMachineUpdated`: Emitted when new consensus proofs are successfully verified and a new state commitment is available to authenticate new cross-chain messages. - - -## Handling Timeouts -If a message isn't delivered within a predefined timeframe on the receiving chain, a timeout message can be submitted. - -`Post Requests/Responses`: These timeouts require a proof of non-membership from Hyperbridge. This proof confirms that the message wasn't included in the destination chain's state. -`Get Requests`: Timeouts for Get requests don't require any additional state proofs, as they are designed to retrieve existing data. diff --git a/docs/pages/developers/polkadot/dispatching.mdx b/docs/pages/developers/polkadot/dispatching.mdx new file mode 100644 index 000000000..5d287cfe5 --- /dev/null +++ b/docs/pages/developers/polkadot/dispatching.mdx @@ -0,0 +1,204 @@ +--- +title: Dispatching Requests & Responses +description: This section explores the means by which pallets may leverage Hyperbridge to dispatch cross-chain messages. It's important to understand that in Hyperbridge protocol, there are 3 different kinds of cross-chain messages. +--- + +# Dispatching Requests & Responses + +This section explores the means by which pallets may leverage Hyperbridge to dispatch cross-chain messages. It's important to understand that in Hyperbridge protocol, there are 3 different kinds of cross-chain messages. We'll explore each of them Below. + +## POST Requests + +A POST request is simply a cross-chain message to be executed by some `IIsmpModule` on a destination. A POST request may also timeout, potentially as a result of liveness failures of the destination chain or failure to execute the message successfully. Through this mechanism, modules can "catch" this failure similar to the try/catch pattern and handle the failure case in the `on_timeout` callback. + + +```rust showLineNumbers +pub struct DispatchPost { + pub dest: StateMachine, + pub from: Vec, + pub to: Vec, + pub timeout: u64, + pub body: Vec, +} + +struct FeeMetadata { + pub payer: ::AccountId, + pub fee: ::Balance, +} + +pub enum DispatchRequest { + Post(DispatchPost), + Get(DispatchGet), +} + +trait IsmpDispatcher { + fn dispatch_request( + &self, + request: DispatchRequest, + fee: FeeMetadata, + ) -> Result; + + // ... +} +``` + +### Dispatch Parameters + +- `dest`: Destination chain, for this you'll use the `StateMachine` enum eg `StateMachine::Evm(1)` for Ethereum Mainnet. +- `from`: The initiaing module identifier on the source chain. +- `to`: Receiving module/contract address on the destination chain. +- `body`: Serialized byte representation of the message (to be decoded by the receiving contract). +- `timeout`: Time in seconds for message validity eg 3600 for a timeout of 1 hour, or 0 for no timeout. ie Messages will never expire. If the timeout is set to a non-zero value, messages that have exceeded this timeout will be rejected on the destination and require user action + (timeout message) to revert changes. +- `fee`: Optional relayer fees, should only be used if `pallet-hyperbridge` is the `IsmpDispatcher`. This can be set to zero if the application developers or users prefer to self-relay. If not this will withdraw the provided fee from the `Currency` implementation configured on `pallet-ismp`. +- `payer`: The account that should receive a refund of the relayer fees if the request times out. + +```rust showLineNumbers +#[pallet::weight(T::dispatch())] +#[pallet::call_index(0)] +pub fn send_message( + origin: OriginFor, + post: DispatchPost, + fee: T::Balance, +) -> DispatchResultWithPostInfo { + let signer = ensure_signed(origin)?; + let dispatcher = pallet_ismp::Pallet::::default(); + let commitment = dispatcher.dispatch_request( + DispatchRequest::Post(post), + FeeMetadata { + payer: signer, + fee, + } + )?; + + Ok(()) +} +``` + +## POST Responses + +Dispatching a POST response, going by it's name is, well, a response to a previously received POST request. Dispatching a POST response requires that the module has indeed received a post request from a counterparty chain in a previous transaction. + +```rust showLineNumbers +pub struct PostResponse { + pub post: PostRequest, + pub response: Vec, + pub timeout_timestamp: u64, +} + +trait IsmpDispatcher { + fn dispatch_response( + &self, + request: PostResponse, + fee: FeeMetadata, + ) -> Result; + + // ... +} +``` +### Dispatch Parameters + +- `post`: The previously received request object. The full object is required to authenticate if the response is eligible for dispatch. +- `response`: Serialized byte representation of the response message (to be decoded by the receiving contract). +- `timeout_timestamp`: Time in seconds for message validity eg 3600 for a timeout of 1 hour, or 0 for no timeout. ie Messages will never expire. If the timeout is set to a non-zero value, messages that have exceeded this timeout will be rejected on the destination and require user action + (timeout message) to revert changes. +- `fee`: Optional relayer fees, should only be used if `pallet-hyperbridge` is the `IsmpDispatcher`. This can be set to zero if the application developers or users prefer to self-relay. If not this will withdraw the provided fee from the `Currency` implementation configured on `pallet-ismp`. +- `payer`: The account that should receive a refund of the relayer fees if the request times out. + +```rust showLineNumbers +#[pallet::weight(T::dispatch())] +#[pallet::call_index(0)] +pub fn send_response( + origin: OriginFor, + request: PostRequest, + fee: T::Balance, +) -> DispatchResultWithPostInfo { + let signer = ensure_signed(origin)?; + let dispatcher = pallet_ismp::Pallet::::default(); + let commitment = dispatcher.dispatch_response( + PostResponse { + post: request, + response: *b"Hello there".to_vec(), + timeout_timestamp: 0, // no timeout + }, + FeeMetadata { + payer: signer, + fee, + } + )?; + + Ok(()) +} +``` + +## GET Requests + +GET requests allow modules to perform asynchronous reads of a counterparty blockchain's state. This can be used to read either the [`Account`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/util#module-account) object, which is stored in the world state, or even storage slots in a contract storage. Eg reading the price of a Uniswap pair on a remote chain. + +When dispatching get requests, you specify the storage keys you need to read and the block height at which you need to read these storage entries. + +```rust showLineNumbers +pub struct DispatchGet { + pub dest: StateMachine, + pub from: Vec, + pub keys: Vec>, + pub height: u64, + pub context: Vec, + pub timeout: u64, +} + +struct FeeMetadata { + pub payer: ::AccountId, + pub fee: ::Balance, +} + +pub enum DispatchRequest { + Post(DispatchPost), + Get(DispatchGet), +} + +trait IsmpDispatcher { + fn dispatch_request( + &self, + request: DispatchRequest, + fee: FeeMetadata, + ) -> Result; + // ... +} +``` + +### Dispatch Parameters + +- `dest`: The chain whose database should be read (e.g., `StateMachine::Evm(1)` for Ethereum Mainnet). +- `from`: The initiaing module identifier on the source chain. +- `height`: Block height at which the provided keys should be fetched. +- `keys`: Storage keys whose values should be fetched and verified. +- `timeout`: Time in seconds for message validity eg 3600 for a timeout of 1 hour, or 0 for no timeout. ie Messages will never expire. If the timeout is set to a non-zero value, messages that have exceeded this timeout will be rejected on the destination and require user action + (timeout message) to revert changes. +- `fee`: Hyperbridge protocol fees for processing the request. This should only be used if `pallet-hyperbridge` is the `IsmpDispatcher`. If non-zero this will withdraw the provided fee from the `Currency` implementation configured on `pallet-ismp`. +- `payer`: The account initiating this request. + + +```rust showLineNumbers +#[pallet::weight(T::dispatch())] +#[pallet::call_index(0)] +pub fn read_state( + origin: OriginFor, + get: DispatchGet, + fee: T::Balance, +) -> DispatchResultWithPostInfo { + let signer = ensure_signed(origin)?; + let dispatcher = pallet_ismp::Pallet::::default(); + let commitment = dispatcher.dispatch_request( + DispatchRequest::Get(get), + FeeMetadata { + payer: signer, + fee, + } + )?; + + Ok(()) +} +``` + +In the next section we'll look at how Hyperbridge collects it's fees. diff --git a/docs/pages/developers/polkadot/fees.mdx b/docs/pages/developers/polkadot/fees.mdx index 42d9af775..2d61e3702 100644 --- a/docs/pages/developers/polkadot/fees.mdx +++ b/docs/pages/developers/polkadot/fees.mdx @@ -1,24 +1,24 @@ +--- +title: Hyperbridge Fees +description: Hyperbridge charges a non-refundable protocol fee per byte of the request/response body. For parachains and solochains that intend to send messages through Hyperbridge there are a few ways to make the fee payments required by the Hyperbridge protocol. +--- # Hyperbridge Fees -For parachains and solochains that intend to send messages through Hyperbridge it is required that they make protocol fee payments for each request and response dispatched. -Hyperbridge will only accept messages with state proofs of protocol fee payments, we provide a pallet that handles this. +Hyperbridge charges a non-refundable protocol fee per byte of the request/response body. For parachains and solochains that intend to send messages through Hyperbridge there are a few ways to make the fee payments required by the Hyperbridge protocol. ## Pallet Hyperbridge -This pallet provides an Ismp dispatcher that handles protocol fee collection, it must be added to the runtime of any substrate chain that wishes to use Hyperbridge as a Coprocessor. -Protocol fees are charged per byte of data in the request or response body. +This pallet provides an `IsmpDispatcher` implementation that handles both protocol and relayer fee collection. These fees are collected using the `Currency` implementation provided to `pallet-ismp`. This `Currency` implementation is ideally a stablecoin, which can be gotten from asset-hub for parachains, or bridged in using `pallet-token-gateway` for solochains. -The pallet implements `IsmpModule` that must be integrated with your `IsmpRouter` implementation, this module allows this pallet receive parameter updates from hyperbridge and also process relayer fee withdrawals. +The pallet also implements the `IsmpModule` and must be integrated with your `IsmpRouter`. This enables the pallet receive parameter updates from hyperbridge and also process relayer fee withdrawals. ```rust showLineNumbers impl pallet_hyperbridge::Config for Runtime { type RuntimeEvent = RuntimeEvent; - // pallet-ismp implements the IsmpHost - type IsmpHost = Ismp; + type IsmpHost = pallet_ismp::Pallet; } // ... - construct_runtime! { // ... Ismp: pallet_ismp, @@ -37,37 +37,59 @@ impl IsmpRouter for ModuleRouter { }; } } + +// somewhere in your runtime +#[pallet::weight(T::dispatch())] +#[pallet::call_index(0)] +pub fn send_message( + origin: OriginFor, + post: DispatchPost, + fee: T::Balance, +) -> DispatchResultWithPostInfo { + let signer = ensure_signed(origin)?; + // use pallet_hyperbridge as the dispatcher + let dispatcher = pallet_hyperbridge::Pallet::::default(); + let commitment = dispatcher.dispatch_request( + DispatchRequest::Post(post), + FeeMetadata { + payer: signer, + fee, + } + )?; + + Ok(()) +} ``` -## Protocol Fees +### Relayer Fees + +The relayer fee is an optional incentive provided by applications initiating cross-chain transactions. It compensates Hyperbridge's decentralized relayers for delivering messages to the destination chain. + +#### Components + +The fee consists of three parts: -Hyperbridge charges a non-refundable protocol fee per byte of the request/response body. This fee is withdrawn from the user account that dispatched the request. + - **Proof verification cost**: For a cross-chain message to be delivered and executed, it must first be authenticated through state proofs. The expected cost for state proof verification on Evm chains is 150k gas. Modules should account for this cost when setting the relayer fee. + - **Message execution gas cost**: + After proof verification, the receiving module is handed the request to be executed. This will consume some gas which should also be accounted for + + - **Relayer service fee**: + This additional amount rewards relayers for their services. Relayers are profit-Driven mediators and they will prioritize messages with fees that ensure profitability. + +Calculating the relayer fee can be expressed as follows: + +``` +destination_gas_cost = 150_000 + receiving_module_gas_cost +relayer_fee = gas_price_to_usd(destination_gas_price * destination_gas_cost) + relayer_tip_usd +``` -## Relayer Fees -The relayer fee is an optional incentive provided by users initiating cross-chain transactions. It compensates Hyperbridge's decentralized relayers for delivering messages to the destination chain. +## Pay in BRIDGE tokens -### Components -The fee consists of two parts: -* Gas fee - This covers the cost of executing the message on the destination chain. -* Relayer service fee - This additional amount rewards relayers for their services. - Relayers are profit-Driven mediators and they will prioritize messages with fees that ensure profitability. +The easiest way to pay Hyperbridge, will be simply to set up your own [relayer](/developers/network/relayer) and pays Hyperbridge in it's native token: BRIDGE. In this manner, you don't have to pay for dispatching requests on your chain, and payments for request happen entirely offchain at the point of relaying requests to Hyperbridge. This has a few upsides such as fewer pallets in your runtime and less configuration overhead, at the cost of maintaining your own offchain relayer. -#### Setting the Fee -To account for potential gas price fluctuations during message delivery, consider the following: -* Proof verification gas cost - Base the fee on the typical gas required for state proof verification (around 120k gas in USD equivalent). -* Message execution gas cost - The usd equivalent for the gas cost of executing the message -* Gas price buffer - Include a buffer to accommodate gas price spikes. -* Relayer service charge - Factor in a reasonable amount to compensate relayers. -* Self-Relay Option - Users can choose to self-relay messages by omitting the relayer fee. +This is because without `pallet-hyperbridge`, your runtime has no way of incentivizing 3rd party relayers to relay messages on your behalf. ## Implementation diff --git a/docs/pages/developers/polkadot/ismp-parachain-inherent.mdx b/docs/pages/developers/polkadot/ismp-parachain-inherent.mdx index af0d8ad5f..2cf2c80ca 100644 --- a/docs/pages/developers/polkadot/ismp-parachain-inherent.mdx +++ b/docs/pages/developers/polkadot/ismp-parachain-inherent.mdx @@ -1,3 +1,7 @@ +--- +title: ISMP Parachain Inherent Provider +description: The parachain inherent provider turns collators into consensus relayers for parachains. +--- # ISMP Parachain Inherent Provider diff --git a/docs/pages/developers/polkadot/ismp-parachain-runtime-api.mdx b/docs/pages/developers/polkadot/ismp-parachain-runtime-api.mdx index 08420df2a..bb17544bf 100644 --- a/docs/pages/developers/polkadot/ismp-parachain-runtime-api.mdx +++ b/docs/pages/developers/polkadot/ismp-parachain-runtime-api.mdx @@ -1,3 +1,8 @@ +--- +title: ISMP Parachain Runtime API +description: This is required by the `ismp-parachain-inherent`. It is used to access the whitelist of sibling parachains to produce consensus proofs for. +--- + # ISMP Parachain Runtime API This is required by the `ismp-parachain-inherent`. It is used to access the whitelist of sibling parachains to produce consensus proofs for. diff --git a/docs/pages/developers/polkadot/networks.mdx b/docs/pages/developers/polkadot/networks.mdx deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/pages/developers/polkadot/pallet-ismp-rpc.mdx b/docs/pages/developers/polkadot/pallet-ismp-rpc.mdx index 762f4ffb7..7b2c0af71 100644 --- a/docs/pages/developers/polkadot/pallet-ismp-rpc.mdx +++ b/docs/pages/developers/polkadot/pallet-ismp-rpc.mdx @@ -1,3 +1,8 @@ +--- +title: Pallet ISMP RPC +description: This is the RPC interface of ISMP for offchain clients. +--- + # RPC Interface ISMP leverages a combination of on-chain and off-chain components to facilitate interoperability. Here's a breakdown of their roles: diff --git a/docs/pages/developers/polkadot/pallet-ismp-runtime-api.mdx b/docs/pages/developers/polkadot/pallet-ismp-runtime-api.mdx index d6eb47693..8fe9a7452 100644 --- a/docs/pages/developers/polkadot/pallet-ismp-runtime-api.mdx +++ b/docs/pages/developers/polkadot/pallet-ismp-runtime-api.mdx @@ -1,3 +1,8 @@ +--- +title: Pallet ISMP Runtime API +description: The `pallet-ismp-runtime-api` provides methods that allow the rpc client read the runtime state, this methods include querying requests and responses, generating proofs, among others. +--- + # Pallet ISMP Runtime API diff --git a/docs/pages/developers/polkadot/pallet-ismp.mdx b/docs/pages/developers/polkadot/pallet-ismp.mdx index 36e1d514a..2cf56fda7 100644 --- a/docs/pages/developers/polkadot/pallet-ismp.mdx +++ b/docs/pages/developers/polkadot/pallet-ismp.mdx @@ -1,3 +1,8 @@ +--- +title: Pallet ISMP +description: This is the implementation of ISMP for substrate chains. It is the foundational component that allows communication over ISMP. It correctly composes the various ISMP components in the runtime. +--- + # Pallet ISMP This is the implementation of ISMP for substrate chains. It is the foundational component that allows communication over ISMP. It correctly composes the various ISMP components in the runtime. @@ -223,7 +228,7 @@ In this method, relayers and users will need to pay the native token for executi ### Offchain Indexing -The `pallet-ismp` only stores "commitments" of hashes of requests onchain for storage proofs, while the full requests are stored offchain and using the [offchain indexing api](https://docs.rs/sp-io/38.0.0/sp_io/offchain/index.html). It would be prudent to enable offchain indexing by default in the node, so all nodes on the network store all requests offchain. You can do this in your `run` function in `command.rs`. [Here's an example](https://github.com/polytope-labs/hyperbridge/blob/main/parachain/node/src/command.rs#L168-L170) +The `pallet-ismp` only stores "commitments" (hashes) of requests onchain for storage proofs, while the full requests are stored offchain and using the [offchain indexing api](https://docs.rs/sp-io/38.0.0/sp_io/offchain/index.html). It would be prudent to enable offchain indexing by default in the node, so all nodes on the network store all requests offchain. You can do this in your `run` function in `command.rs`. [Here's an example](https://github.com/polytope-labs/hyperbridge/blob/main/parachain/node/src/command.rs#L168-L170) ```rust showLineNumbers [command.rs] /// Parse command line arguments into service configuration. diff --git a/docs/pages/developers/polkadot/parachains.mdx b/docs/pages/developers/polkadot/parachains.mdx index a2f27267d..8fbca68db 100644 --- a/docs/pages/developers/polkadot/parachains.mdx +++ b/docs/pages/developers/polkadot/parachains.mdx @@ -1,3 +1,8 @@ +--- +title: ISMP Parachain +description: This is the implementation of the ISMP consensus client for parachains. +--- + # Parachain Integration Parachains that want to leverage the Hyperbridge protocol for secure cross-chain interoperability can do so by integrating the `ismp-parachain` pallet. This pallet empowers parachains to interoperate with whitelisted sibling parachains through the ISMP framework. diff --git a/docs/pages/developers/polkadot/modules.mdx b/docs/pages/developers/polkadot/receiving.mdx similarity index 79% rename from docs/pages/developers/polkadot/modules.mdx rename to docs/pages/developers/polkadot/receiving.mdx index 9e1f3f341..8e9cbd015 100644 --- a/docs/pages/developers/polkadot/modules.mdx +++ b/docs/pages/developers/polkadot/receiving.mdx @@ -1,8 +1,13 @@ -# ISMP Modules +--- +title: Receiving cross chain messages +description: To receive ISMP messages, pallets must implement the [`IIsmpModule`](https://docs.rs/ismp/latest/ismp/module/trait.IsmpModule.html) interface, this interface allows the `IsmpRouter` to dispatch verified cross chain messages to the pallet for execution. +--- -This section will provide an in depth guide on how to build an ismp module. Usually in substrate an ismp module is going to be a pallet. +# Receiving cross chain messages -## Defining a Module Id +To receive ISMP messages, pallets must implement the [`IIsmpModule`](https://docs.rs/ismp/latest/ismp/module/trait.IsmpModule.html) interface, this interface allows the `IsmpRouter` to dispatch verified cross chain messages to the pallet for execution. + +## Define a Module Id Ismp uses a unique module id to identify ismp modules and route messages correctly, in contract environments this module id is the contract address. For a substrate pallet, you will need to define an 8 byte module id that is unique to the pallet @@ -69,7 +74,7 @@ pub mod pallet { pub module: sp_core::H160, /// Destination EVM host - pub destination: Ethereum, + pub destination: u32, /// Timeout timestamp on destination chain in seconds pub timeout: u64 @@ -86,7 +91,7 @@ pub mod pallet { pub fn dispatch_to_evm(origin: OriginFor, params: Params) -> DispatchResult { let origin = ensure_signed(origin)?; let post = DispatchPost { - dest: StateMachine::Ethereum(params.destination), + dest: StateMachine::Evm(params.destination), from: EXAMPLE_MODULE_ID.to_bytes(), to: params.module.0.to_vec(), timeout: params.timeout, @@ -141,14 +146,15 @@ Now the pallet needs to be added to the runtime and also the `IsmpRouter`. ```rust showLineNumbers impl pallet_hyperbridge::Config for Runtime { type RuntimeEvent = RuntimeEvent; - // pallet-ismp implements the IsmpHost type IsmpHost = Ismp; } impl pallet_example::Config for Runtime { type RuntimeEvent = RuntimeEvent; - // Set pallet hyperbridge as the dispatcher - type IsmpDispatcher = Hyperbridge; + // you can either use pallet_ismp or + // pallet_hyperbridge depending on your + // fee payment strategy + type IsmpDispatcher = pallet_hyperbridge::Pallet; } // ... omitted impl blocks @@ -176,11 +182,12 @@ impl IsmpRouter for ModuleRouter { ``` ## Security Considerations -* Irreversible Changes: -The `IsmpHost` doesn't store receipts for failed messages, ensure irreversible state changes occur only after a message effectively meets all success criteria. +:::danger[Replay Attack Warning] +The `IsmpHost` does not store receipts for failed messages. ie messages whose `IsmpModule` returns `Err`. This effectively allows messages to be re-executed until they time out. **Therefore you should ensure irreversible state changes occur only after a message effectively meets all success criteria**. +::: ## Sample Implementation - - [pallet-ismp-demo](https://github.com/polytope-labs/hyperbridge/blob/main/modules/ismp/pallets/demo/src/lib.rs) +- [pallet-ismp-demo](https://github.com/polytope-labs/hyperbridge/blob/main/modules/ismp/pallets/demo/src/lib.rs) diff --git a/docs/pages/developers/polkadot/solochains.mdx b/docs/pages/developers/polkadot/solochains.mdx index b7492f356..a9cb06b50 100644 --- a/docs/pages/developers/polkadot/solochains.mdx +++ b/docs/pages/developers/polkadot/solochains.mdx @@ -1,3 +1,8 @@ +--- +title: Solochain Integration +description: For solochains that want to integrate with hyperbridge, a GRANDPA consensus client is provided as a way to track the finality of the Hyperbridge parachain through Polkadot. A consensus relayer is also provided, which is responsible for exchanging finality proofs of cross-chain messages. +--- + # Solochain Integration For solochains that want to integrate with hyperbridge, a GRANDPA consensus client is provided as a way to track the finality of the Hyperbridge parachain through Polkadot. A consensus relayer is also provided, which is responsible for exchanging finality proofs of cross-chain messages. @@ -155,6 +160,15 @@ This should print out a potentially long hex string. Next you'll use this hex st Once this is completed on your solochain, the same will need to also be executed on Hyperbridge. In similar fashion you can log the initial consensus of your solochain and [create an issue on our github](https://github.com/polytope-labs/hyperbridge/issues/new) to be added to the Hyperbridge testnet. On Hyperbridge mainnet, you'll instead submit a governance proposal for this. +```bash +docker run \ +--network=host \ +-v /path/to/consensus.toml:/root/consensus.toml \ +polytopelabs/tesseract-consensus:latest \ +--config=/root/consensus.toml \ +log-consensus-state SUBSTRATE-myid +``` + ### Running the relayer Once all consensus states are set up, running the relayer is as easy as: @@ -175,4 +189,9 @@ You will of course need to pair this with the [messaging relayer](/developers/ne The GRANDPA consensus client relies on digest items in the header to communicate the current slot number. These digest items must be identified as either `BABE` or `AURA`. Solochains using custom block production algorithms must include the `AURA` digest item to ensure compatibility with the GRANDPA consensus client for producing valid consensus proofs. +## Implementations + +- [ismp-grandpa](https://github.com/polytope-labs/hyperbridge/tree/main/modules/ismp/clients/grandpa) +- [grandpa-verifier](https://github.com/polytope-labs/hyperbridge/tree/main/modules/consensus/grandpa/verifier) + diff --git a/docs/pages/developers/polkadot/token-gateway.mdx b/docs/pages/developers/polkadot/token-gateway.mdx index d9d4745ca..05e56a0e9 100644 --- a/docs/pages/developers/polkadot/token-gateway.mdx +++ b/docs/pages/developers/polkadot/token-gateway.mdx @@ -1,6 +1,11 @@ +--- +title: Pallet Token Gateway +description: This is an ISMP module that allows standalone chains or parachains send and receive cross chain asset transfers. +--- + # Pallet Token Gateway -This is an ISMP module that allows standalone chains or parachains make and receive cross chain asset transfers. +This is an ISMP module that allows standalone chains or parachains send and receive cross chain asset transfers. ## Config diff --git a/docs/public/og.png b/docs/public/og.png new file mode 100644 index 0000000000000000000000000000000000000000..82ffbdf2aab04c19e304bcb323a0b5332d3c6a41 GIT binary patch literal 80134 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 literal 0 HcmV?d00001 diff --git a/docs/vocs.config.tsx b/docs/vocs.config.tsx index 0bffbe3b7..8b47ef894 100644 --- a/docs/vocs.config.tsx +++ b/docs/vocs.config.tsx @@ -48,7 +48,7 @@ export default defineConfig({ "Hyperbridge is a coprocessor for cryptographically secure interoperability", // todo: add logo ogImageUrl: - "https://vocs.dev/api/og?logo=%logo&title=%title&description=%description", + "https://docs.hyperbridge.network/og.png", logoUrl: { light: "/logo_black.svg", dark: "/logo_white.svg", @@ -417,7 +417,7 @@ export default defineConfig({ { text: "Dispatching Messages", - link: "/developers/polkadot/delivery", + link: "/developers/polkadot/dispatching", }, { @@ -427,7 +427,7 @@ export default defineConfig({ { text: "Receiving Messages", - link: "/developers/polkadot/modules", + link: "/developers/polkadot/receiving", }, { @@ -453,6 +453,12 @@ export default defineConfig({ { text: "Running a Relayer", link: "/developers/network/relayer", + items: [ + { + text: "Common Errors", + link: "/developers/network/relayer/errors", + }, + ] }, ], }, From 7be486b501c3f9b483436b0b16af44b63b8d6533 Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Tue, 26 Nov 2024 12:55:31 +0100 Subject: [PATCH 16/17] fix solochain docs --- docs/pages/developers/polkadot/fees.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/pages/developers/polkadot/fees.mdx b/docs/pages/developers/polkadot/fees.mdx index 2d61e3702..3b8dd4957 100644 --- a/docs/pages/developers/polkadot/fees.mdx +++ b/docs/pages/developers/polkadot/fees.mdx @@ -87,9 +87,9 @@ relayer_fee = gas_price_to_usd(destination_gas_price * destination_gas_cost) + r ## Pay in BRIDGE tokens -The easiest way to pay Hyperbridge, will be simply to set up your own [relayer](/developers/network/relayer) and pays Hyperbridge in it's native token: BRIDGE. In this manner, you don't have to pay for dispatching requests on your chain, and payments for request happen entirely offchain at the point of relaying requests to Hyperbridge. This has a few upsides such as fewer pallets in your runtime and less configuration overhead, at the cost of maintaining your own offchain relayer. +The easiest way to pay Hyperbridge, will be simply to set up your own [relayer](/developers/network/relayer) and pay Hyperbridge in it's native token: BRIDGE. In this manner, you don't have to pay for dispatching requests on your chain, and payments for request happen entirely offchain at the point of relaying requests to Hyperbridge. This has a few upsides such as fewer pallets in your runtime and less configuration overhead. -This is because without `pallet-hyperbridge`, your runtime has no way of incentivizing 3rd party relayers to relay messages on your behalf. +But these upsides however come at the cost of maintaining your own offchain relayer, as you're unable to rely on Hyperbridge's permissionless relayers. This is because without `pallet-hyperbridge`, your runtime has no way of incentivizing 3rd party relayers to relay messages on your behalf. ## Implementation From 4da49c30e9b73368460d03fd397660e0771c6575 Mon Sep 17 00:00:00 2001 From: David Salami Date: Tue, 26 Nov 2024 11:56:01 +0000 Subject: [PATCH 17/17] change permissionless relayers image --- docs/pages/developers/explore/relayers.mdx | 2 +- docs/public/relayer.webp | Bin 44832 -> 0 bytes docs/public/relayers.png | Bin 0 -> 63177 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 docs/public/relayer.webp create mode 100644 docs/public/relayers.png diff --git a/docs/pages/developers/explore/relayers.mdx b/docs/pages/developers/explore/relayers.mdx index 18ddddc78..045b3d524 100644 --- a/docs/pages/developers/explore/relayers.mdx +++ b/docs/pages/developers/explore/relayers.mdx @@ -6,7 +6,7 @@ description: Critical to the function of Hyperbridge are the relayers who transm # Permissionless Relayers
- Hyperbridge relayers + Hyperbridge relayers
Hyperbridge relayers
diff --git a/docs/public/relayer.webp b/docs/public/relayer.webp deleted file mode 100644 index b77c68f1b9a5c053e74895e73613d1c8c65c9381..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44832 zcmY)VV_+j-w>1pcwr$(CZJSefYIkbewr#gl+nm~++GgI)eV=ol@5`?wf0AqOeXYHa zs7OmlVATNuX^M*|X((|K!F@lUqXx?Xrh$U|0u@lEN{}e3AfqB?J{c#1fwr7GR@U;pbV1QyMsm>_s}>*B>p1%oELFOxGRLQ+k?0e%>_i1;N;&<5l`VQo`{Rs2`^eFhCxE81E$NjGRh4>Now!Lg<;?4er z2?$$-yvbX6lKtBGDk~zK7P$SAe4o9ndx_iV?ejbI8vt;=`+X^{8~zb20l2>U-5|e8 z-d|rEZuQy;c7C1uK1oPc^Y1)DJqex~o(s19x&cJK^nD1v=dJnm`DHyfJ=fjroPM4D z>gz28r~_y}ub&a$>i~c^!4Sa4XZQpE$M=_c7rgia7R>T92Y7zDe==SwF2%hVzW6Qq zRe!cTuRZ+v+_}%Y5PSkOzQcW)emZ}aJ%7LPDmV@R0Ir{B0e~%wt7ibu>(W(TownMQ#1069G~!KKHX^xB?$u z)!!9D6PSZ7?14~tL07V|k#>aAx zlb};(!+F#>dcW~2cGU9CVfWTESF27LhnEuZoXed)^reaQEF=p}eqP6UFq$Q!Gu%`j zA}}=9TvE~z#+?Hxs^Sa`i^M+8q;uA!~5<7&^C|BY}%8oG#;dKANWzkQiv22n- ze80dz*0;Kw`CXkF;8tIH1kGH_jqs~k5CtuNi@hR-2IXg|gRN@gTtlw*UH0U7@wtrp z@|xF{9f0h1To$_@r!`YTgQDTI`aPbGuq48p%miAE3$ovdH1)*Ai-H#syLotG)KoHA z2zMM5qTX^nw*>}o=(p&|bVMW=?FnuI#X5v++p{1wg5?p*brn+TqFk8sK(ui|F@#qOZLIXfHfisY+I4a=)amX zdT}5)i1-O#vL!a&+Bi)0#vo*2=o3)I&VU}b^fyh{5t2Vv8pieZ!C-j3$G&A(A1tTb zp8HTlP6t(svS{dQPzxaYCXOs!l-1S9DS_YJWAJp^s-;q3k|TfVOcafEMKFx2Amch# zI{M$2UJ1(0Jb!2CI~dFNUVI(a?-`tT)*15yl%wF!C@C(=u6!n?7?-3A?7U9J&{L&sXt2%3|R?J8N?LITGIvSsYP}d_KR2i80LDeVGbdhD9V2jT)H$>Y$-!?H$1Mw(##AuJZ990`rY^~89R_N2v zuz)WD2m~E(r4}8MC`qL9Vd+*g{d9QI!`om7o+*(8ZFdyQaD}j@4|YYHr~P6)DI3=J z=SD>I{sztJZnGMNuw)4qU)|dOu{L1(+<|n-^7rzTk0T?Yn!O6kMhfd|_Z1bdO=4qf zT_LZQ-Na~}WKPq%UKWPRvTYp6e1=gWp`X4G&(L)oE;{qa4wr=D&w^yQ#I}A1JZAIA zU{!1HF2%I;lTDY+*CJwH4lSKhD=e;#b(zfP1 ziVdu>HZ~=@`t5^l8qJgfgimj`;hpuWNpD7H0h|J6i1J1ot41~$Q*$F9^mZ%Y^vneZ zc=W6Wd!7(@X){dZ!TQ05CaG8LvUckloscKH=$NZ-2&G(&+df8UH2UO0PX6--Z)-mV zJZv>z!oU&~_7a)HE9nSmw~AjL@nCn_AFRLBuab!YAYb(fLosMHyT=Y+tkGy%@96f? z?tc9ok1A?H)PbT~;Jn!g6dhpnNgMr2ilRKH75IPC64u>%_7BNMIkjt~WFuJv6)V`+ zm^pW)K+r2>-HgWMa&FZ*?DB+4lGBSm(op*yi)kE9|BNh1TLcuxv;C^i;lqG{QyI{h zBtk=~roS5B#@fXz+(bjSSEkRkeU&N9QL^UG(c?{CobFpoZt$m?-cHfjtX^TG<9M=0 z#H&Z6cVP^(pqzOF8JJMvUgG{mn~_xgKl3aQ5gYPfIH&z#fd#OUjNMNH#*T(xHya-TP(zZ` z1F%bY52J-?!hoUVa|Uj0Wc@*BYI6PJ2`zMaTh<*@^9_4= zf?uIS9uV5hipfpbDnoBTk+m3E3M75M6N3cpL*7+d5K&RxvwV< z(OeCqwB69IAK_dmLXfswl&GF^Sj$y;u(|7d2Z!rPqV5ABQ4_hb)oi_Pz;q?27EMUpA#6M#*?YZEP+ zXI|9`eDI>+X!UlEh&B9m2*q=^Nh6HvXLXURyDp!jB)=oG;2rwa0qD(5WO0|1n-K>C z=(a{mYaR-zX0lv4)e}~eZ81VF9tm9V>d55w=P+O{uP(I(TH&s>-U~_)hLWg|vxWUW zTk*!%0PB1fhzHM0-H*!EYm@Ln<}UxkJkuAv&G1Zl`3~~mJueZ;=B@jU<(v6qXD?r z%Sl1~{fWm_dMAdDn)E@5Ld@vMe`lJkD#7P&N^4Tya3m!pU5S!ZEpI ze5I2eEc75ba?Pg0vLzT~36N`Rr|l02EaNsDSPZQQ-~3|zZVKn~Xg6k~1W}4e!K8~d z1fT5-iBo*-@Ztz0?OaR%V<%8WdlF`2J6VgBirFSuznePFhrp%1Rtdq-~J9=X9sJRx0`&LQ?BAyk)^WG8szYh4y$Jl;GQ2YY+7+16= zKf>LfZ>8MfcvyP865A;bRcOzkn@;3ZGBUxFltt93!#f%@JNs+ViM0GdIn8ZQ5baM& zq2n zsg8EIbHb|uFt-_}4?UQyc|%SqZPxqqXd0viC8tbR%lSpJ>~<}S1w|9UHRIT{1l;B& zpubU%{g; zszs&}G=#vBi~<8LNIC*u;n7G_6%@2$kg`^$EVE>70Yn6h1zGr69kdy7_!DQc(uNPe z@Hw!mfKDOm2>5zg+-D80Q#;f4kiSlr`7B5H>@tO#Gwc64T#CIPh^Bpgm)SlzV=M5# zMW|R;wGLUfX5Lr7`>i?gYGi=b5$ibPj)fUxVx9Db)sZtIPnG`|&qnK`T!tA+gF2GS z9Mc=qs?7#DU|R-U!cq((zGl95Wzg}?vd2r>?=vhVPHmClXG&sBDuyxJvJ zBrH+?4)Y}Ef>%yCjs#%@TzaKv#XGLI+}u$sQM#7uv?c?A_$v~%lkWeqD1%)>g9DGd zL-!8|-nge+9=&6CBKoF?kD-Tk=2?QDJ(uIFYODBpCskqg#=f@6SSam?RRI=(_l+mL z9cZ5k^EHDJp66{SzBAzj4^BfK`wX4e6a|ZkIuA>@{aP1h+zZMq!~{WX6v~kcRCLp` zhj=Pqa%H71?nb^wR$wZX7(oJTn36s!0CTsVWtia_tzZ4_`TOiHWc{e$3cxzc{U4QQ z6^_H6KS|GeKiGz{Tl9;xY0iY}U0B(P3mRxN1YN#v)vaV98Bjsci5e_16~KR}Q9<0C zraMnAaK3m8c1rNq69a4JAv_`pohy9A)>u}WDaLO%*;B0k~shyg9W~&s1DWug^ zcHly=#vZi5_V|yQMCgopwxg5Qs5a{iMts>u-&JX9^#C&*CE$X=Da%YFE|qL8PP9QF z%&O(U)x{3Y(yTO`)(tnuLynbfUVqgWZK6&go*L6{C77u6|HoO=6cb>>I=l`OjIQxK z+!TZH?v6hOpeL{Is$oiBcI~rY3S>bW445YOZOI`58Cz%grf0VXHmZiJEhpLVh$DW6 ziqqzMr~DmhG7jrXbxF4{5{nu3TiTZ18iE(`uZm+Rp^`5# zDfcZ7l37d>Ww3=-qxq((`Nk1$tSSFT!x9Q4`Cd9h`XDf2nZpc+L({3&f{T4sFj0d2 zyI7VxlGoZeasgc1t1(+VO+V=bGVt5Om)fUmyXZB-|+ zjS$^@EDBvhe=An+fFnqpQ8#=9LKOkLn3G@-AEgAvzz?8=ukGELtl*JP^!ZNxUhEp* z;iYJ-AOZb-^vDgoj}NO}o)tG$>twj0{f^2pde#5cKFN$$oSpyB;msC1d?hu(E+2M_ zjzlx!Hh6S_ioIF(>k&ZbT$n=TJb8lnUHw^!y;rFV7vBf4wRTwA0HNZl zjn*n7t<$MpTv=LtcJ2PYvGl~`zjDsJ4z~yV)^n~X=T^49D7TIGhCrXMMc1XxUFFrv z@q`?6FyyJ>lnW`kfF$}0f9t4AK`468bmUu7Q+&NV2a-Qfhg9I3>yd!%(Jl!wqQZCK z{9QOm3qt1r2p{3>S3mVgth_yitF(O#_r)AYR)nQ?j?`|m>cb~1@9H5_81WV0#;-?6GGQ*&QGX?3 z<239&5g24%8mi5)(!KJ*B;l$Z24M+(%XjDUZHK&^-T;v`vNITG{0YJCdB;%^&;$tH zGvc}}0|!uwE`EeVQnjp?iyz zV#lEVNNj4HoJ@ccceO%sWuqmFbMBuBhe!!mbH}dL0O1f|>ifHXto;XW1b`e3f3S~b zqY)pi!@9_kcO44uD6#YYtkQ{dKzv<@WQOyP_Wj3es?{!g0Nss>S)W^y?7fEenlB@% z^y}n26p%G04bJZ;3)YaxMSivFoE!ML6z+IpoIfLE7IT(M|kyg
%lF~4$7dCbrpG7%`kFS#WQ0RJR#_tAga700 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 z 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 literal 0 HcmV?d00001